PMFKit Typography Refactor — Implementation Summary
Completed per the plan in .cursor/plans/ (PMFKit Typography System Refactor).
1. Summary of changed files
| Area | Files |
|---|---|
| Font setup | app/layout.tsx, app/globals.css |
| Report / result | app/result/page.tsx, app/result/cdo/page.tsx |
| Components | app/components/OverviewStrip.tsx, app/components/ValuePropClarityCard.tsx, app/components/TractionDashboard.tsx, app/components/roles/CMOResults.tsx, app/components/roles/CDOResults.tsx, app/components/roles/CmoFirstReportView.tsx |
| Landing | app/page.tsx |
| OG & assets | app/og/route.tsx, app/icon.svg, public/og-image.svg, public/logo.svg, public/brand/pmfkit-lockup.svg, public/brand/pmfkit-wordmark.svg, public/brand/og-template.svg, public/brand/logo-lockup-light.svg, public/brand/banner-x.svg |
| Docs | docs/BRAND.md, README.md, TECHNICAL_OVERVIEW.md |
| Dependencies | package.json (removed geist) |
2. Components and pages updated
- app/layout.tsx — Switched from Geist to
next/font/google: Instrument Sans (--font-primary), JetBrains Mono (--font-system); variables applied on<html>. - app/globals.css —
@theme inline:--font-sansand--font-mononow usevar(--font-primary)andvar(--font-system). - app/result/page.tsx — Overall score and section scores use
font-mono; factor scores (e.g.factor.score/factor.weight) usefont-mono font-medium. - app/result/cdo/page.tsx — Overall score and section score labels use
font-monoand typography scale. - app/components/OverviewStrip.tsx — All value variants (default, indigo, green, amber, red) use
font-mono font-mediumfor metric-style values. - app/components/ValuePropClarityCard.tsx — Score badge uses
font-mono font-medium. - app/components/TractionDashboard.tsx — Engagement score uses
font-mono font-medium. - app/components/roles/CMOResults.tsx, CDOResults.tsx — Confidence scores and consistency score use
font-mono/opacity-80where appropriate. - app/components/roles/CmoFirstReportView.tsx — Score breakdown factor values use
font-mono font-medium. - app/page.tsx — Hero scale set to
text-4xl md:text-5xl; example DRL block usesfont-monofor 65/100 and level label. - app/og/route.tsx — OG text container uses
fontFamily: "'Instrument Sans', system-ui, sans-serif"(fallback to system at edge). - SVGs — All listed brand/OG SVGs now use
Instrument Sansin thefont-familystack (with system fallbacks).
3. Confirmation: no legacy fonts remain
- Geist: Grep for
Geist,font-geist,--font-geist,geist/fontacross.tsx,.ts,.css,.json,.mdreturns no matches. - Inter (font): No app or config code uses the Inter font; SVG
font-familyreferences to Inter were replaced with Instrument Sans. Remaining “Inter” matches are content (e.g. “Intercom”) or generated reports (e.g. playwright-report), not typography.
4. Verification notes
- Build:
npm run buildcompletes successfully. - Lint: No linter errors on modified app/components files.
- Font loading: Instrument Sans and JetBrains Mono are loaded via
next/font/googlewithdisplay: "swap"to avoid FOUT; variables are applied on<html>so--font-sansand--font-monoresolve globally. - Dark mode / mobile: No layout or structural changes; existing dark theme and responsive classes unchanged. Recommend manual check: landing, one report view, dashboard in light/dark and a narrow viewport.
- OG image: Edge route uses
'Instrument Sans', system-ui, sans-serif; if the font is not available at edge, fallback is system-ui.
Typography rules in effect
- Primary (Instrument Sans): All UI text, headlines, body, nav, buttons, forms, marketing, report copy. Weights 400, 500, 600.
- Secondary (JetBrains Mono): Metrics, scores, percentages, stage labels, evidence tags, confidence, system output, code, report metadata. Used via
font-monoand the updated OverviewStrip/role components. - Scale: Hero
text-4xl md:text-5xl font-semibold tracking-tight; section headerstext-2xl md:text-3xl font-medium; scorestext-xl md:text-2xl font-mono font-medium; metadatatext-sm font-mono opacity-80where applied.