feat(control-plane): refresh the UI design system - #3149
Merged
Conversation
Replaces the stock shadcn oklch greys with the Hindsight palette and moves the shared primitives onto the design system's density, so the whole app picks up the new look from tokens rather than per-component edits. Tokens (globals.css) - Blue-shifted neutral palette in both modes: page #F3F5F9/#080C17, card #FFFFFF/#0F1724, sidebar #FFFFFF/#0A1020, hairline borders. Light mode previously had --card equal to --background, so cards were invisible against the page. - Adds the --hs-* semantic layer (surface/fg/border/status/chart) and its @theme mappings. - --tracking-normal 0.025em -> 0; Inter reads wrong with positive tracking at body sizes. - Light --muted-foreground is #525866 (5.3:1 vs page, 7.1:1 vs card) so body copy clears WCAG AA in both modes. Fonts - Inter and JetBrains Mono move to next/font/google, replacing the Google Fonts @import that loaded weights lazily and left semibold headings in the system fallback until the weight arrived. Space Grotesk is dropped; it was only reachable via a `font-heading` utility no component used. Primitives - card, button (+ gradient variant), input, textarea, select, switch, checkbox, dialog, alert-dialog, popover, dropdown-menu, command move to 13px / h-9 / rounded-[10px], with rounded-[16px] cards and dialogs and blurred overlays. Layout - Bank page content is capped by a responsive staircase (1024 / xl:1280 / 2xl:1440, centered). It was uncapped, so on a 16" display body text and table rows spanned the full ~1700px window. - Active tab underlines use the brand gradient instead of flat --primary. - The sidebar toggles from anywhere on its chrome, not just the button. Preserved deliberately: the h1-h6 weight default (Tailwind preflight resets headings to inherit and not every heading here carries an explicit weight utility), plus the chip tokens, logo keyframes, themed scrollbars and .prose table rules that the tokens rewrite would otherwise have dropped. Note: page.tsx is mostly re-indentation from wrapping the views in the width container; `git diff -w` shows the real change.
6 tasks
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.
Refreshes the control plane's design system. The stock shadcn oklch greys are replaced with the Hindsight palette and the shared primitives move onto the design system's density, so the whole app picks up the new look from tokens rather than per-component edits.
Tokens (
globals.css)#F3F5F9/#080C17, card#FFFFFF/#0F1724, sidebar#FFFFFF/#0A1020, hairline borders (rgba(0,0,0,0.08)/rgba(100,160,255,0.10)).In light mode
--cardwas previously the same value as--background, so cards were indistinguishable from the page behind them.--hs-*semantic layer (surface / foreground / border / status / chart) plus its@theme inlinemappings, so pages can reach forbg-success,text-chart-worldetc. instead of raw hex.--tracking-normal0.025em→0. Inter reads wrong with positive tracking at body sizes.--muted-foregroundis#525866— 5.3:1 against the page and 7.1:1 against card white, so body copy clears WCAG AA in both modes.Fonts
Inter and JetBrains Mono move to
next/font/google. The Google Fonts@importthey replace loaded weights lazily, which left semibold headings rendering in the system fallback until the weight arrived. Space Grotesk is dropped — it was only reachable through afont-headingutility that no component used.Primitives
card,button(plus agradientvariant for the primary CTA),input,textarea,select,switch,checkbox,dialog,alert-dialog,popover,dropdown-menuandcommandmove to 13px /h-9/rounded-[10px], withrounded-[16px]cards and dialogs and blurred overlays.Layout
1024/xl:1280/2xl:1440, centered). It was previously uncapped, so on a 16" display body text and table rows spanned the full ~1700px window.--primary. The bank-config strategy tabs needed converting fromborder-b-2 border-primaryto an absolutely-positioned bar, since a border can't carry a gradient; the transparentborder-b-2stays so inactive tabs keep their hover underline.Deliberately preserved
h1–h6weight default. Tailwind preflight resets headings tofont-weight: inherit, and not every heading in this app carries an explicit weight utility, so dropping the rule would flatten them.facet-chip), logo keyframes, themed scrollbars and.prosetable rules, which a wholesale token rewrite would have dropped.bg-mutedboxes (code blocks, tool-call rows, chunk lists) stay atrounded-lg. The 16px radius is for card surfaces; promoting nested content boxes to it makes sub-content read as cards.Review notes
page.tsxis mostly re-indentation from wrapping the views in the width container —git diff -wshows the actual change.badge,skeleton,tooltip): nothing imports them yet and knip's orphaned-file check is blocking in CI.Verification
./scripts/hooks/lint.shpasses;check-unused.shreports no blocking findings.npm run buildcompiles clean (54/54 static pages).