UI redesign: Graphite — flat surfaces, real contrast, no more neon - #5
Merged
Conversation
Replace the dark-neumorphism + neon-cyan theme with a flat graphite system: - Theme tokens routed through runtime --tt-* CSS vars in :root (enables runtime palette previews and a future follow-system light mode), then swapped to the new palette: page #121315, cards #1c1d1f, solid hairline borders, text tiers all WCAG AA (muted 1.88:1 -> 4.81:1, tertiary 3.02:1 -> 6.34:1), accent #00d4ff neon cyan -> #67a5d9 steel blue. - nm-* utilities redefined as flat inset-ring + subtle shadow (names kept so all call sites and hover:/active: variants work unchanged); raised tier now visibly distinct for hover; new nm-focus utility gives inputs a real focus ring (focus:nm-inset was a no-op). - Primary buttons are filled accent with dark text (previously identical to disabled buttons); glow shadows, pulse-glow drop-shadows and all colored halos removed (Card, StatCard, ProgressBar, RankProgress, DownloadClientStatusWidget, BackToTop's hand-copied neumorphic values). - TrackerStatusBanner signals attention via tinted bg + border instead of the removed glow; Card's dead glow/glowColor props removed. - Space Mono -> JetBrains Mono; dense text tier 10px -> 11px; radii 6/8/10/12; logo gradient stops de-neoned; DEFAULT_TRACKER_COLOR and client fallback updated to the new accent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- CHART_THEME hexes swapped to the graphite palette; surface repointed to the card color (it is used as seam/background inside cards and was only correct while page bg == card bg); fontSizeDense synced to 11px. - Tooltip dot glow removed; colored shadowBlur/shadowColor emphasis removed across ~20 chart files (neutral black depth shadows kept). - Downloaded series no longer uses getComplementaryColor hue rotation (which produced clashing neon, e.g. magenta against a green tracker): new downloadSeriesColor() helper uses the semantic download orange, falling back to sky for warm tracker accents within ~40deg of it. - Cross-seed donut secondary slice uses neutral gray; hover emphasis now raises salience (border/scale) instead of dimming via opacity. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rendered evidence for the graphite redesign PR: before/after captures of a demo-seeded local instance, plus the three palette directions rendered against the live app via the runtime token layer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Knip Code AnalysisFound 9 total issues
View details
Use |
|
🚫 Security audit failed Critical Failures
Warnings
Passed (36/38)
Summary: 36/38 checks passed See |
Merges current main first, so this carries the dependency CVE fixes (next 16.2.12, postcss, sharp, ip-address) and the schema-deps --prod Dockerfile change alongside the redesign. release.yml only publishes when package.json's version has no matching GitHub Release, so the redesign needs its own bump to reach the server. Verified after the merge: 2864/2865 tests pass, tsc clean. The single failure is the pre-existing timezone-brittle chart-transforms case, which fails outside UTC and passes in CI. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
UI redesign: "Graphite" — flat surfaces, real contrast, no more neon
The old UI was muddy, low-contrast, and dated. This PR replaces the dark-neumorphism + neon-cyan theme with a flat graphite system, concentrated almost entirely in theme/token primitives so the diff stays reviewable and upstream syncs stay cheap.
All screenshots below are real renders of a local instance seeded with 30 days of demo data (4 trackers, one in a warned/HnR state).
What was wrong (measured, not vibes)
#475569on#282a36= 1.88:1#858991on#1c1d1f= 4.81:1text-tertiary)#64748b= 3.02:1#9b9fa5= 6.34:1#94a3b8= 5.55:1#bec1c6= 9.34:1#282a36both); separation done only by neumorphism.io double shadows#121315, cards#1c1d1f+ solid 1px hairline borders#313337/ emphasis#4a4d53#00d4ff+ glow box-shadows + pulse-glow animations#67a5d9, glows removed everywheregetComplementaryColor()hue-rotation → clashing magenta against green trackersBefore
Directions considered
The token layer was first refactored so every color/radius/shadow flows through runtime
--tt-*CSS vars (zero visual change). That made it possible to render each candidate direction against the real running app — these are actual screenshots, not mocks:A was chosen because it matches the taste you've picked before (Graphite palette, exception-based status color, dense-data legibility first). Because of the token indirection, switching to B or C later is a ~40-line value swap in
globals.css:rootplus theCHART_THEMEhexes — say the word.After
What changed
globals.css—:root--tt-*token block (new palette),nm-*utilities redefined as flat hairline ring + subtle shadow (names kept, sohover:/active:variants and all ~140 call sites work unchanged),card-accentcorner-glow → 1px tracker-tinted ring,pulse-glowmade opacity-only,--text-2xs10→11px, newnm-focusutility.focus:nm-focus) — the oldfocus:nm-insetwas a no-op (WCAG 2.4.7 failure, pre-existing but masked by the recessed-well look).Card.tsx— removed drop-shadow glow hazes; deadglow/glowColorprops removed;TrackerStatusBannernow signals attention with tinted background + border (exception-based color doing its actual job).StatCard,ProgressBar,RankProgress,DownloadClientStatusWidget,BackToTop(which still hand-copied the old neumorphic shadow values), and ~20 chart files (coloredshadowBlur/shadowColor).CHART_THEME(charts/lib/theme.ts) — full palette swap;surfacerepointed to the card color (it's used as seam/background inside cards — it was the page color, which was fine only while page==card); tooltip dot glow removed; hover emphasis no longer dims bars/donut slices.--font-monounchanged).git checkout origin/main -- public/img/trackerTracker_logo*.svg).DEFAULT_TRACKER_COLORand the coordinator fallback:#00d4ff→#67a5d9(new trackers no longer default to neon cyan).Deliberately left alone
src/lib/adapters/**,.github/workflows/**,package.jsonoverrides,.trivyignore— other workstream.src/lib/db/schema.tstracker-color default (still#00d4ff) — changing a column default invites migration churn for a cosmetic default; the JS-side default covers the UI path.nm-*class names now describe an aesthetic that no longer exists — a mechanical rename is a good follow-up PR, kept out of this one to keep the diff reviewable.docs/ui-redesign/(the images embedded here).Decisions for you
:rootblock +prefers-color-scheme+ a chart-theme resolver). Want it?🤖 Generated with Claude Code