Menu โ–พ โ–ด

#476 fix(ui): give the uninstall wizard the same SF Pro voice as the dashboard

closed
nobody
None
2026-07-18
2026-07-18
Anonymous
No

Originally created by: Akarsh-Hegde

What

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.

Note for the reviewer

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.

Verification

  • Repo-wide grep for font-serif|instrument|SERIF|Georgia across ui/app ui/components ui/lib returns only prose comments
  • npm run build succeeds; static export contains JetBrains Mono (#470 intact) and no Instrument Serif
  • Served /uninstall HTML carries font-family:var(--font-sans);font-weight:750;letter-spacing:-.03em;font-size:23px
  • Full pre-push suite green: fmt, clippy, cargo test, UI build, UI tests, security audit

Rendered 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

https://claude.ai/code/session_01Amk5pH47wJj76HBm5oDu9X

Related

Tickets: #468
Tickets: #470

Discussion

  • Anonymous

    Anonymous - 2026-07-18

    Originally posted by: coderabbitai[bot]

    [!IMPORTANT]

    Review skipped

    Auto reviews are disabled on base/target branches other than the default branch.

    Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.


    โš™๏ธ Run configuration

    Configuration used: Organization UI

    Review profile: ASSERTIVE

    Plan: Pro Plus

    Run ID: 81d39f44-9b73-414c-859d-4d3f3ac62e52

    You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

    Use the checkbox below for a quick retry:
    - [ ] ๐Ÿ” Trigger review

    โœจ 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 help to get the list of available commands.

     
  • Anonymous

    Anonymous - 2026-07-18

    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-serif variable, globals.css's --font-serif token). Small, well-scoped diff (13 additions / 19 deletions across 3 files).

    Strengths

    • Values verified to match, not eyeballed. Diffing against ui/app/setup/page.tsx's header block confirms the h1 styling (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 same Kicker + h1 + p structure and atoms, this is the right way to guarantee visual parity.
    • Follow-through on the removal. Rather than leaving --font-instrument-serif/--font-serif as dead code once nothing consumes them, the PR removes the next/font loader, 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.
    • Rebase hygiene. The PR description calls out a conflict with [#470]'s JetBrains_Mono loader on the same lines and explains how the resolution keeps both changes intact โ€” useful context for review, and confirmed correct: jetbrainsMono survives untouched in the diff.
    • File header (//ambient dev tool...) is present and untouched on both modified .tsx files. No any types 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

    1. DISPLAY constant is now duplicated verbatim, not shared. ui/app/setup/page.tsx already defines const DISPLAY: CSSProperties = { fontFamily: 'var(--font-sans)', fontWeight: 700, letterSpacing: '-.02em' }, and this PR adds an identical second copy in ui/app/uninstall/page.tsx. uninstall/page.tsx already imports Btn/Check/Kicker/Row/Spinner from ../setup/atoms โ€” exporting DISPLAY from atoms.tsx and 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.
    2. Dead weight in the DISPLAY constant itself (pre-existing, not introduced here, but now propagated). Every consumer (setup/page.tsx line 244 and the new uninstall/page.tsx line) overrides both fontWeight (700 โ†’ 750) and letterSpacing (-.02em โ†’ -.03em) at the call site, so DISPLAY in practice only ever contributes fontFamily. Not a bug, but worth a comment or trimming next time this constant is touched โ€” this PR is a good opportunity if extracting it to atoms.tsx per [#1].
    3. ui/STYLESHEET.md is 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).
    4. Pre-existing, out of scope but adjacent: ui/app/uninstall/page.tsx still 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

    • Low risk. Typography-only change, no logic/behavior touched, and the new font stack (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: 750 on 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 build output 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: #1
    Tickets: #468
    Tickets: #470

  • Anonymous

    Anonymous - 2026-07-18

    Originally 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: DISPLAY was duplicated three times, not two (setup/page.tsx, setup/steps.tsx, uninstall/page.tsx).

    1. DISPLAY duplicated โ†’ extracted to atoms.tsx

    Now exported from app/setup/atoms.tsx and 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 โ†’ 750 and -.02em โ†’ -.03em, so the declared defaults described no heading the app has ever rendered.

    So instead of trimming to fontFamily only, the shared constant now carries the values actually in use (750 / -.03em) and call sites set only what genuinely varies - fontSize, lineHeight, color:

    // atoms.tsx
    export const DISPLAY: CSSProperties = {
      fontFamily: 'var(--font-sans)', fontWeight: 750, letterSpacing: '-.03em',
    }
    // call site
    <h1 style={{ ...DISPLAY, fontSize: 23, lineHeight: 1.1, color: 'var(--t-title)' }}>
    

    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:

    font-family:var(--font-sans);font-weight:750;letter-spacing:-.03em;font-size:23px;line-height:1.1;color:var(--t-title)
    

    Same for the 33px and 31px heroes in steps.tsx. Structural change only.

    This also left the CSSProperties type import unused in all three files, so those were dropped too.

    3. Stale ui/STYLESHEET.md โ†’ updated

    Line 17 documented Instrument_Serif as 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 at DISPLAY in atoms.tsx as 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 build passes; static export still ships JetBrains Mono (#470 intact) and no Instrument Serif
    • tsc --noEmit clean outside the pre-existing __tests__ bun:test typing errors
    • Rendered /setup and /uninstall heading styles byte-identical to pre-refactor
    • No const DISPLAY definitions remain outside atoms.tsx; no rendered em-dashes remain in uninstall/page.tsx
    • Full pre-push suite green: fmt, clippy, cargo test, UI build, UI tests, security audit

    One note on scope

    Items 1 and 2 pulled setup/page.tsx and setup/steps.tsx into 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

     
  • Anonymous

    Anonymous - 2026-07-18

    Ticket changed by: Akarsh-Hegde

    • status: open --> closed
     

Log in to post a comment.