Originally created by: Akarsh-Hegde
The setup wizard moved off Instrument Serif onto the timeline's SF Pro display treatment in [#468], but the uninstall wizard was left behind - its hero heading still rendered in Instrument Serif. The two wizards share the same card chrome and the same atoms (uninstall/page.tsx imports Btn/Check/Kicker/Row/Spinner from ../setup/atoms), so they sat side by side in two different voices.
| File | Change |
|---|---|
ui/app/uninstall/page.tsx |
SERIF โ DISPLAY; the h1 is now 23px / 750 / -.03em in var(--font-sans) |
ui/app/layout.tsx |
dropped the now-unused Instrument_Serif next/font loader and its --font-instrument-serif variable |
ui/app/globals.css |
removed the dead --font-serif custom property; comment rewritten to say why there deliberately isn't one |
The heading values match the setup card header exactly rather than being eyeballed - the header block is structurally identical (Kicker + h1 + p, same padding, same atoms), so the same treatment is the correct one. This is not a bare font-family swap: at the old serif's 26px the sans would read under-weight and loose, so weight and tracking move with it.
With uninstall converted, nothing consumes the serif any more, hence the loader and variable removal. Side benefit: the built static export no longer ships the Instrument Serif woff2 files at all - one less Google webfont in the bundle.
Rebased onto the current pre-main tip to resolve a conflict with [#470], which landed a JetBrains_Mono loader on the same lines of layout.tsx that this removes the serif loader from. Resolution keeps [#470]'s font fully intact and removes only the serif - verified by build output below. The comment in layout.tsx was reworded so the "JetBrains Mono was retired" line no longer contradicts [#470]'s deliberate scoped exception for the hour rail.
font-serif|instrument|SERIF|Georgia across ui/app ui/components ui/lib returns only prose commentsnpm run build succeeds; static export contains JetBrains Mono (#470 intact) and no Instrument Serif/uninstall HTML carries font-family:var(--font-sans);font-weight:750;letter-spacing:-.03em;font-size:23pxRendered visually under next dev by the author. Note the wizard's invoke calls error there (no Tauri backend), which is expected and unrelated - typography renders regardless.
๐ค Generated with Claude Code
Originally posted by: coderabbitai[bot]
โจ Finishing Touches
๐งช Generate unit tests (beta)
- [ ] Create PR with unit tests - [ ] Commit unit tests in branch `fix/setup-font-consistency`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
- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)Comment
@coderabbitai helpto get the list of available commands.Originally posted by: Akarsh-Hegde
Overview
This PR ports the uninstall wizard's hero heading off Instrument Serif onto the same SF Pro "display" treatment the setup wizard adopted in [#468], and cleans up the now-dead serif plumbing (
layout.tsx's font loader +--font-instrument-serifvariable,globals.css's--font-seriftoken). Small, well-scoped diff (13 additions / 19 deletions across 3 files).Strengths
ui/app/setup/page.tsx's header block confirms theh1styling (23px / 750 / 1.1 / -.03em,var(--font-sans)) is byte-for-byte identical to the setup wizard's own header โ not just "close enough." Since both wizards share the exact sameKicker+h1+pstructure and atoms, this is the right way to guarantee visual parity.--font-instrument-serif/--font-serifas dead code once nothing consumes them, the PR removes thenext/fontloader, the CSS variable, and rewrites the now-stale comment explaining why there's deliberately no serif token. This matches the project's no-drift-no-dead-code preference.JetBrains_Monoloader on the same lines and explains how the resolution keeps both changes intact โ useful context for review, and confirmed correct:jetbrainsMonosurvives untouched in the diff.//ambient dev tool...) is present and untouched on both modified.tsxfiles. Noanytypes introduced. No em-dash/en-dash/double-hyphen introduced in any user-facing string added by this diff (I checked byte-for-byte for U+2013/U+2014 across the touched lines).Issues / Suggestions
DISPLAYconstant is now duplicated verbatim, not shared.ui/app/setup/page.tsxalready definesconst DISPLAY: CSSProperties = { fontFamily: 'var(--font-sans)', fontWeight: 700, letterSpacing: '-.02em' }, and this PR adds an identical second copy inui/app/uninstall/page.tsx.uninstall/page.tsxalready importsBtn/Check/Kicker/Row/Spinnerfrom../setup/atomsโ exportingDISPLAYfromatoms.tsxand importing it in both places would remove the duplication and prevent exactly the kind of drift this PR exists to fix (one wizard's header style diverging from the other's because it lives in two places). Low priority but fits the PR's own stated motivation unusually well.DISPLAYconstant itself (pre-existing, not introduced here, but now propagated). Every consumer (setup/page.tsxline 244 and the newuninstall/page.tsxline) overrides bothfontWeight(700 โ 750) andletterSpacing(-.02emโ-.03em) at the call site, soDISPLAYin practice only ever contributesfontFamily. Not a bug, but worth a comment or trimming next time this constant is touched โ this PR is a good opportunity if extracting it toatoms.tsxper [#1].ui/STYLESHEET.mdis now stale. Line 17 reads:(`Instrument_Serif` remains, unrelated โ it's a legacy face used only by the setup wizard, not part of this type scale.)โ this is the project's own style-sheet doc explicitly documenting the font this PR deletes as "remains" and "used only by the setup wizard." Since the PR's whole point is retiring that face, this note should be removed or updated in the same change to avoid leaving a contradictory doc behind (matches the "docs + cleanup in the same change" expectation for this kind of change).ui/app/uninstall/page.tsxstill has two rendered (non-comment) em-dashes in user-facing<p>text โ "these grants from System Settings โ remove them yourselfโฆ" and "drag Meridian.app to the Trash โ nothing will be left running." Neither line is touched by this diff, so it's not a regression from this PR, but since this PR is specifically about giving this file a consistent "voice," it'd be a natural companion fix (Hard Rule: plain hyphen only in user-facing text).Risks
var(--font-sans)) resolves to the same system font already used everywhere else in the app โ no new font file is bundled (in fact one is removed, per the PR's stated bundle-size side benefit).fontWeight: 750on a non-variable system font family may render identically to 700 in some engines (weight steps get clamped to the nearest available static weight), but that's inherited unchanged from the already-shipped setup wizard treatment, so any risk here predates this PR.Test coverage
No JS/TS tests added, consistent with the project having no JS/TS test suite yet (per
CLAUDE.md) and this being visual/typography polish. The PR body documents manual verification (grep for stray serif/instrument references,npm run buildoutput checked for the absence of Instrument Serif and presence of JetBrains Mono, and the rendered HTML's computed style checked directly) โ reasonable verification for this kind of change.Related
Tickets:
#1Tickets:
#468Tickets:
#470Originally posted by: Akarsh-Hegde
Review addressed - all four items fixed in b6bb08be
Thanks - every point checked out on inspection, including one I'd missed the scale of:
DISPLAYwas duplicated three times, not two (setup/page.tsx,setup/steps.tsx,uninstall/page.tsx).1.
DISPLAYduplicated โ extracted toatoms.tsxNow exported from
app/setup/atoms.tsxand imported by all three files. Both wizards already shared that module, and as the review notes, this duplication was the mechanism behind the bug this PR fixes - setup moved off the serif while uninstall's separate copy stayed behind.2. Dead weight in the constant โ folded in, rather than deferred
Verified the claim across every call site, and it's stronger than "worth a comment": all four override
700 โ 750and-.02em โ -.03em, so the declared defaults described no heading the app has ever rendered.So instead of trimming to
fontFamilyonly, the shared constant now carries the values actually in use (750 / -.03em) and call sites set only what genuinely varies -fontSize,lineHeight,color:Verified as a no-op visually, which is the important part for a refactor like this - the served HTML is byte-identical before and after:
Same for the 33px and 31px heroes in
steps.tsx. Structural change only.This also left the
CSSPropertiestype import unused in all three files, so those were dropped too.3. Stale
ui/STYLESHEET.mdโ updatedLine 17 documented
Instrument_Serifas a face that "remains ... used only by the setup wizard" - exactly what this PR deletes. Rewritten to state there is no serif face, and to point atDISPLAYinatoms.tsxas where the wizard hero treatment now lives.4. Em-dashes in user-facing copy โ fixed
Both replaced with plain hyphens per the Hard Rule. Pre-existing rather than a regression, but taken as the companion fix suggested, since this file is the one the PR is giving a consistent voice.
Verification
npm run buildpasses; static export still ships JetBrains Mono (#470 intact) and no Instrument Seriftsc --noEmitclean outside the pre-existing__tests__bun:testtyping errors/setupand/uninstallheading styles byte-identical to pre-refactorconst DISPLAYdefinitions remain outsideatoms.tsx; no rendered em-dashes remain inuninstall/page.tsxOne note on scope
Items 1 and 2 pulled
setup/page.tsxandsetup/steps.tsxinto the diff - they weren't touched before, but they held two of the three duplicate copies, so the extraction isn't possible without them. Diff is now 7 files (+47/-40). Flagging in case you'd rather keep this PR to the original 3 files and split the extraction out.๐ค Generated with Claude Code
Ticket changed by: Akarsh-Hegde