iamtoruk
015a1a069a
polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics
...
D1 one shared EmptyNote (7 copies removed); CliErrorPanel on canonical
tokens; dead code deleted (CapsuleChart, stale SERIES_HEX palette,
Stat tone API, unused rail/doc-chrome CSS)
D2 type ladder tokens (--fs-*/--fw-*); panel titles unified 13/600/ink;
high-visibility sizes/weights snapped to rungs
D3 contrast: --mut2 5.00:1 light / 5.74:1 dark (was 2.37/3.11); new
--accent-text 5.07:1 + persistent underline on text links; last
prose em-dash removed
D4 'See all' and 'Most expensive sessions' navigate to Sessions; 'add
alias' jumps to Settings/Aliases; chevrons only on clickable rows;
inline confirm replaces window.confirm; default-period setting
honored at boot; Sankey caption no longer promises a click; Optimize
'improving' trend badges; cursor + Space-key fixes
D5 aria-current on nav, SegTabs as real tablist, aria-pressed toggles,
ProviderPop rebuilt on Dropdown (one tab stop, arrow keys, focus ring)
191/191, typecheck + build green. Contrast ratios independently
recomputed. Net -93 lines.
2026-07-16 02:27:41 -07:00
iamtoruk
4186ad393a
feat(app): color Fable as its own series (aqua)
...
Fable was bucketing into grey "Other" despite being a large chunk of spend.
- add `fable` SeriesKey across modelSeries.ts (label, css-var, class, matcher)
- validated CVD-safe --s-fable token (aqua #1baf7a light / #199e70 dark) in all theme blocks
- StackedBars now uses a fixed CVD-safe series order [opus, fable, haiku, gpt, sonnet, other]
for both legend and stack, so aqua never sits adjacent to the magenta (Sonnet)
typecheck clean; 128/128 tests pass.
2026-07-12 12:52:12 -07:00
iamtoruk
b0299c57ac
feat(app): design reskin — token unification, a11y, and chart color + shading
...
Design-consistency pass (from the audit):
- unify the indigo→plain grey/border token families (alias --t1/2/3, --hair/2 onto --ink/mut/mut2, --line/2); fix a leftover hardcoded chevron color
- accent :focus-visible rings on SegTabs, chart bars, calendar, buttons, Settings toggles; ov-link hover
- theme-aware Spend legend swatches + Sankey (fixes a light-mode contrast failure)
- wire Models "Compare…" → Compare and Plans "Add plan…" → Settings pane; drop the fake-affordance Plans label; Settings loading captions
- Compare card radius/title, set-input, alias CTA color, outer-border tokens, session mono numbers, frame spacing to match the mockup
- scope a date-flaky Overview test assertion to its card
Reskin batch 1 — color + shade (current tone):
- validated CVD-safe model-series palette via dedicated --s-* tokens (light+dark), applied to the daily bars, Sankey, and series dots
- subtle soft card elevation via --card-shadow on the main card containers
typecheck clean; 128/128 tests pass.
2026-07-12 12:36:50 -07:00
iamtoruk
f362195946
fix(app): final-review nits — app menu (⌘R refresh), honest model labels, yield retain, hint cleanup
...
Install an app menu without the CmdOrCtrl+R reload accelerator so ⌘R reaches the renderer for
in-place refresh (keeps Edit/Window roles + dev DevTools). Model labels are now family-level
("Opus"/"Sonnet"/"Haiku"/"GPT / Codex") and the Sankey shows the real model id instead of the
wireframe's sample version names. Optimize retains last-good yield across 30s revalidation (no
flicker to "—"). Removed hints for unimplemented ⌘K/⌘E/esc; fixed stale TopBar comment.
Implemented by Codex gpt-5.5 (high); committed by Fable (git blocked in Codex sandbox).
2026-07-10 19:54:09 -07:00
iamtoruk
9e6ea306fe
feat(app): T8 integration + cleanup — single refresh, ⌘-nav, shared error/format/period/series, README
...
- One 30s refresh + manual ⌘R; footer shows real last-fetch time; getOverview fetched once (no double-poll).
- Keyboard nav: ⌘1–⌘5/⌘, switch sections, ⌘R refresh.
- Verified period/provider re-polls all sections.
- Shared CliErrorPanel: amber permission ("Full Disk Access") vs red error, used by every section.
- DRY: shared lib/format.ts (USD), lib/period.ts (Overview migrated to it), lib/modelSeries.ts (unified model→series).
- Settings review-minor tests (!paired filter, empty/not-found states) + App.test.tsx.
- app/README.md incl. the approved M2 delivery model (self-contained, bundles engine, Electron auto-updater).
- 76 tests, typecheck clean. Live GUI smoke (npm --prefix app run dev) still pending a display.
Implemented by Codex gpt-5.5 (high); committed by Fable (git blocked in Codex sandbox).
2026-07-10 19:35:41 -07:00