Skip to content

feat: build recommendations and testimonials system - #73

Open
FindMalek wants to merge 2 commits into
mainfrom
feat/65-recommendations-testimonials
Open

feat: build recommendations and testimonials system#73
FindMalek wants to merge 2 commits into
mainfrom
feat/65-recommendations-testimonials

Conversation

@FindMalek

@FindMalek FindMalek commented Aug 20, 2026

Copy link
Copy Markdown
Owner

Summary

Scaffolding for the recommendations/testimonials system described in #65. This ships the content model, pages, and components -- no real testimonial content. There is exactly one entry, data/recommendations/1-jane-placeholder.mdx, explicitly flagged isPlaceholder: true with an obviously fake name ("Jane Placeholder") and TODO copy, so the system is demonstrably working end to end without fabricating any endorsement.

Stacked on #70 (#67) -- branched from the current tip of design/67-simplify-footer-marquee, which already includes the two-row opposite-direction marquee layout and the keyboard/screen-reader accessibility fix. Base is set to that branch rather than main.

Content model

  • actions/content-collections.ts: new recommendations collection (data/recommendations/*.mdx), matching this repo's existing work/projects convention -- frontmatter for identity/metadata, MDX body as the full recommendation text (same pattern as work/project case studies).
  • Frontmatter: recommenderName, role, company, companyLogo?, photo?, excerpt, date, relationship (manager/coworker/client/collaborator), source (linkedin/x/email/message/other), linkedinUrl?, otherLinks?, signatureImage?, relatedWorkHref?, isPlaceholder?.
  • One recommendation can render as both a short excerpt (TestimonialCard) and a full page -- same content, two views, per the acceptance criteria.

Pages / components

  • app/recommendations/[slug]/page.tsx: full recommendation page -- identity header, avatar (with initials fallback, no fake photo), company logo, relationship/source/date, LinkedIn + other links, optional signature, full MDX body, and a print/save-as-PDF button. generateMetadata for SEO.
  • components/app/recommendation-print-button.tsx: client window.print() trigger; header/footer/floating-chat/background chrome get print:hidden so print/PDF output is clean.
  • components/app/testimonial-card.tsx: shared excerpt card (avatar, name, role [+ company unless hideCompany], excerpt, link to the full page).
  • app/work/[slug]/page.tsx: renders a TestimonialCard at the bottom, but only when a recommendation's relatedWorkHref matches that work entry -- never forced onto pages with no linked recommendation. Company is hidden since the page already shows it.
  • components/app/testimonials-marquee.tsx + app/page.tsx: landing-page "What people say" panel using <Marquee pauseOnHover>, same primitive design: simplify footer and remove repeated companies section #67 introduced for the companies marquee. Placed right after the "Companies I've worked with" panel and before Projects -- keeps all work-credibility content (work history -> who I worked with -> what they said) together before moving on.
  • app/sitemap.ts: includes real (non-placeholder) recommendation URLs only; the placeholder is excluded from the sitemap so it's never indexed as if genuine.

Content integrity

  • Only one entry exists, and it's unmistakably fake: name "Jane Placeholder", isPlaceholder: true, TODO-only excerpt/body, and a visible on-page banner linking back to feat: build recommendations and testimonials system #65 when viewing it directly.
  • No fabricated names, quotes, roles, companies, or photos anywhere else in this PR.
  • Real recommendations still need to be collected (LinkedIn/X/email/message) and explicitly approved by each recommender before being added as new .mdx entries -- that's follow-up work, not part of this PR.

Test plan

  • pnpm build succeeds (env pulled locally for the check, not committed) -- /recommendations/jane-placeholder prerenders via generateStaticParams
  • tsc --noEmit clean after content-collections codegen
  • Placeholder work-page testimonial renders on /work/jobflow (its relatedWorkHref) and nowhere else
  • Landing page "What people say" panel renders the marquee with the one placeholder card
  • Manual visual/print check in a browser (not done in this environment)

Closes #65

Closes #77.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@vercel

vercel Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
findmalek Ready Ready Preview Aug 22, 2026 4:59pm

@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@FindMalek, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 8 minutes

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

Wait for the limit to reset, then comment @coderabbitai review or push new commits to the PR.

An organization admin can change what happens after included review limits in Billing.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 11ac9b97-92d9-4038-9454-ab2447398274

📥 Commits

Reviewing files that changed from the base of the PR and between 798843d and d2a9c42.

📒 Files selected for processing (16)
  • actions/content-collections.ts
  • app/page.tsx
  • app/recommendations/[slug]/page.tsx
  • app/sitemap.ts
  • app/work/[slug]/page.tsx
  • components/app/chat-floating-container.tsx
  • components/app/recommendation-print-button.tsx
  • components/app/testimonial-card.tsx
  • components/app/testimonials-marquee.tsx
  • components/layout/background.tsx
  • components/layout/footer.tsx
  • components/layout/header.tsx
  • config/converter.ts
  • data/recommendations/1-jane-placeholder.mdx
  • lib/utils.ts
  • types/enum.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@FindMalek

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@FindMalek

Copy link
Copy Markdown
Owner Author

make them 2 rows, and slightly faster

@FindMalek
FindMalek changed the base branch from design/67-simplify-footer-marquee to main August 21, 2026 13:27
Introduces a Recommendation content-collections type (data/recommendations/*.mdx)
so one piece of feedback can render both as a short excerpt and a full,
shareable, print/PDF-friendly page:

- app/recommendations/[slug]/page.tsx: identity header, company logo,
  full MDX body, relationship/source/date, LinkedIn + other links,
  optional signature, and a print/save-as-PDF button (print stylesheet
  hides header/footer/chat/background chrome via print:hidden)
- components/app/testimonial-card.tsx: shared excerpt card linking to
  the full page, with a company toggle so work pages don't repeat it
- components/app/testimonials-marquee.tsx: landing-page marquee of
  excerpts, reusing the Marquee primitive from #67/#70
- app/work/[slug]/page.tsx: renders a testimonial at the bottom only
  when a recommendation is actually linked to that work entry
- app/page.tsx: new "What people say" panel between the companies
  marquee and projects
- app/sitemap.ts: includes real (non-placeholder) recommendation URLs

The only entry right now is data/recommendations/1-jane-placeholder.mdx,
explicitly flagged isPlaceholder: true with an obviously fake name and
TODO copy -- it exists solely to prove the model/pages/components work
end to end and is excluded from the sitemap. Real recommendations still
need to be collected and approved before publishing.
@FindMalek
FindMalek force-pushed the feat/65-recommendations-testimonials branch from 1a4bc35 to 3cd4241 Compare August 21, 2026 16:39
@FindMalek

Copy link
Copy Markdown
Owner Author

Rebased onto main to resolve the conflict (was CONFLICTING/DIRTY, now MERGEABLE).

What happened: the branch carried an earlier draft of the footer/companies-marquee redesign (bee5a13) that later landed on main in a more polished form as 11ee7e0 (#70), via squash-merge — so git couldn't detect they were the same logical change. Git auto-dropped that commit plus two other now-redundant ones during the rebase ("patch contents already upstream"). The one genuine conflict was in actions/content-collections.ts — two independent additions at the same location (main's #66 TODO comment, this branch's new recommendationFrontmatterSchema) — resolved by keeping both.

Verified post-rebase: pnpm lint (0 errors), pnpm build (all routes generate, including /recommendations/jane-placeholder), and confirmed ClientsMarquee + testimonials both render in the built output.

Closes #77.

Per PR feedback ('make them 2 rows, and slightly faster') -- matches
the ClientsMarquee pattern (#67/#70): two opposite-direction rows,
25s duration (was single row at 35s). Second row only renders once
there are enough recommendations to fill it.
@FindMalek

Copy link
Copy Markdown
Owner Author

Addressed the two-rows/faster feedback — TestimonialsMarquee now matches ClientsMarquee's pattern (two opposite-direction rows, 25s duration, was a single row at 35s). Verified with pnpm lint (0 errors) and pnpm build.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: build recommendations and testimonials system fix: resolve merge conflicts on PR #73 (testimonials/recommendations)

1 participant