Skip to content

fix(settings): wire the three Appearance settings that never reached the UI - #274

Merged
ANonABento merged 1 commit into
mainfrom
settings-wiring-appearance
Aug 21, 2026
Merged

fix(settings): wire the three Appearance settings that never reached the UI#274
ANonABento merged 1 commit into
mainfrom
settings-wiring-appearance

Conversation

@ANonABento

@ANonABento ANonABento commented Aug 21, 2026

Copy link
Copy Markdown
Owner

Roadmap Important #2. Theme and accent colour worked; the other three Appearance settings did not.

Font Size — was worse than unwired

--base-font-size does reach <html>, so rem utilities scale. But 247 arbitrary text-[Npx] values across 63 files are absolute and never move. At "small" that inverts the hierarchy: the root drops to 12px so text-sm renders 10.5px, while a caption pinned at 11px stays 11px and comes out larger than the body text it sits under.

Measured in a real browser, before:

setting html text-sm text-xs text-[11px]
small 12px 10.5px 9px 11px
medium 14px 12.25px 10.5px 11px
large 16px 14px 12px 11px

The scale in use was nine tiers inside 6px — 8, 9, 10, 10.5, 11, 12, 12.25, 13, 14. That is noise, not a hierarchy. It is now four rem steps:

token rem @ medium role
text-2xs 0.625 8.75px count bubbles, micro badges
text-xs 0.75 10.5px chips, dense labels
text-sm 0.875 12.25px body, metadata
text-base 1 14px headings in-panel

Tailwind stops at xs, so --text-2xs joins the @theme block. 8/9px collapse into it, 10/11px into text-xs, 12/13px into text-sm. At the default size nothing moves more than 0.75px, and every step now tracks the setting.

scripts/check-type-scale.js fails CI on the next absolute font size, so this can't silently accumulate again (wired into both ci.yml and release.yml).

Card Density and Animation Speed — fully inert

The chain ran store → data attribute → CSS var → .card-padding / .card-gap / .transition-appearance, and died at the last hop: those three helper classes were used by zero components.

  • Density now drives the task card's padding and the column's inter-card gap directly, at the call site where the dependency is visible rather than through a class a component has to remember. The defaults were already identical (p-3 = --card-padding comfortable), so nothing shifts at the default.
  • Animation Speed rides Tailwind's own --default-transition-duration, so every transition-* utility in the app honours it without opting in.
  • The three dead classes are deleted.

Verified in the browser, not inferred

small / compact / none medium / comfortable / reduced large / spacious / normal
root font 12px 14px 16px
text-smtext-2xs 10.5 → 7.5px 12.25 → 8.75px 14 → 10px
card padding / gap 7 / 3.5px 10.5 / 7px 14 / 10.5px
transition-colors 0s 0.075s 0.15s

Checked visually on the board at "small": the card title is now unambiguously the largest element, where before the meta row and branch rendered larger than the description above them.

Known gap

Framer Motion animations still ignore Animation Speed — they read no CSS variable, so "none" doesn't fully mean none. Noted on the roadmap rather than fixed here.

Checks

tsc --noEmit · eslint · test:ipc · test:type-scale · vitest 434 passed (+5 new appearance.test.ts) · vite build · pnpm audit. No Rust touched.

…the UI

Theme and accent worked. The other three did not, and Font Size was worse
than merely unwired.

Font Size. `--base-font-size` does land on <html>, so rem utilities scale
correctly. But 247 arbitrary `text-[Npx]` values across 63 files are
absolute and never move. At "small" that inverts the hierarchy: the root
drops to 12px so `text-sm` renders 10.5px, while a caption pinned at 11px
stays 11px and comes out larger than the body text it sits under.

The scale in use was nine tiers inside 6px (8, 9, 10, 10.5, 11, 12, 12.25,
13, 14) — noise, not a hierarchy. It is now four rem steps. Tailwind stops
at `xs`, so `--text-2xs` joins the `@theme` block for badges and count
bubbles; 8/9px collapse into it, 10/11px into `text-xs`, 12/13px into
`text-sm`. At the default size nothing moves more than 0.75px, and every
step now tracks the setting.

`scripts/check-type-scale.js` fails CI on the next absolute font size, so
this doesn't silently accumulate again.

Card Density and Animation Speed were fully inert. The chain ran
store → data attribute → CSS var → `.card-padding` / `.card-gap` /
`.transition-appearance` and died at the last hop: those three helper
classes were used by zero components. Density now drives the task card's
padding and the column's inter-card gap directly, at the call site where
the dependency is visible. Animation Speed rides Tailwind's own
`--default-transition-duration`, so every `transition-*` utility honours it
without each component remembering to opt in. The three dead classes are
deleted.

Measured in a real browser, not inferred — small/medium/large now give
12/14/16px root with the full scale tracking, density 7/10.5/14px padding,
and transitions 0/75/150ms.

Framer Motion still ignores Animation Speed; noted on the roadmap.

Adds appearance.test.ts, which pins the half jsdom can check: every value
has to land on <html>, since that is what index.css selects on.
@ANonABento
ANonABento merged commit 66e04df into main Aug 21, 2026
3 checks passed
@ANonABento
ANonABento deleted the settings-wiring-appearance branch August 21, 2026 21:45
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.

1 participant