Frosty design system

Tokens and component rules for the Frosty Control Plane, a Deno-native LLM gateway console. Revision ds-r2: a dense, near-neutral monochrome developer console. Dark is the default theme; every value on this page is a token, and this page is styled by the system it documents.

Source of truth: docs/design/DESIGN.md and tokens.css. ds-r2 supersedes ds-r1 (glacier-blue). Contrast figures below are computed (WCAG 2.x); each shows dark, then light.

Color

Near-neutral monochrome (hue 265, chroma at or below 0.006). Primary is the shadcn-neutral inversion: near-white in dark, near-black in light. One accent blue (hue 252 to 255) is reserved for focus, links, and the active-nav indicator, never a fill. Four semantic status hues plus a five-color chart family.

Surfaces

--background dark oklch(0.15 0.004 265) #0a0b0d light oklch(0.99 0.002 265) #fbfcfd fg on it 18.84:1 AAA / 17.59:1 AAA
--card dark oklch(0.185 0.004 265) #121314 light oklch(1 0 0) #ffffff fg on it 17.85:1 AAA / 18.10:1 AAA
--popover dark oklch(0.205 0.004 265) #161719 light oklch(1 0 0) #ffffff fg on it 17.16:1 AAA / 18.10:1 AAA
--secondary dark oklch(0.255 0.004 265) #222325 light oklch(0.965 0.003 265) #f2f3f5 label on it 15.10:1 AAA / 16.36:1 AAA
--muted dark oklch(0.235 0.004 265) #1d1e20 light oklch(0.965 0.003 265) #f2f3f5 muted fg on it 6.52:1 AA / 6.04:1 AA
--accent dark oklch(0.255 0.006 265) #212326 light oklch(0.965 0.004 265) #f2f3f6 label on it 15.11:1 AAA / 14.86:1 AAA
--sidebar dark oklch(0.13 0.004 265) #070709 light oklch(0.975 0.003 265) #f6f7f9 nav label 10.77:1 AAA / 15.31:1 AAA
--sidebar-accent dark oklch(0.235 0.006 265) #1d1e21 light oklch(0.955 0.005 265) #eef0f4 active label 15.97:1 AAA / 14.43:1 AAA

Text

--foreground dark oklch(0.985 0.001 265) #fafafb light oklch(0.2 0.006 265) #151619 on canvas 18.84:1 AAA / 17.59:1 AAA
--muted-foreground dark oklch(0.712 0.008 265) #a0a2a7 light oklch(0.475 0.008 265) #5a5c61 on canvas 7.70:1 AAA / 6.49:1 AA
--sidebar-foreground dark oklch(0.8 0.006 265) #bcbec2 light oklch(0.24 0.006 265) #1e1f22 on sidebar 10.77:1 AAA / 15.31:1 AAA

Primary and accent

--primary dark oklch(0.92 0.004 265) #e3e4e7 light oklch(0.24 0.006 265) #1e1f22 label on it 14.14:1 AAA / 15.76:1 AAA
--primary-foreground dark oklch(0.205 0.006 265) #16171a light oklch(0.985 0.001 265) #fafafb ink label on primary fill
--ring (accent blue) dark oklch(0.62 0.13 252) #4589d2 light oklch(0.55 0.15 255) #2971c6 vs canvas 5.41:1 / 4.76:1 (link AA, UI 3:1)

Semantic status

--success dark oklch(0.72 0.15 155) #43c07a light oklch(0.48 0.13 155) #00723b as text on canvas 8.45:1 AAA / 5.89:1 AA
--success-foreground dark oklch(0.18 0.04 155) #021709 light oklch(0.985 0.005 155) #f8fbf9 on success 8.01:1 AAA / 5.82:1 AA
--warning dark oklch(0.8 0.13 82) #e7b551 light oklch(0.52 0.11 70) #8f5d14 as text on canvas 10.42:1 AAA / 5.49:1 AA
--warning-foreground dark oklch(0.24 0.04 82) #291d07 light oklch(0.985 0.005 80) #fcfaf6 on warning 8.74:1 AAA / 5.40:1 AA
--destructive dark oklch(0.665 0.19 25) #f25855 light oklch(0.52 0.2 25) #c21725 label on it 5.43:1 AA / 5.85:1 AA
--destructive-foreground dark oklch(0.205 0.04 25) #280e0c light oklch(0.985 0.005 25) #fdf9f8 ink label dark, paper label light
--info dark oklch(0.68 0.13 250) #549de5 light oklch(0.5 0.15 255) #1762b6 as text on canvas 6.86:1 AA / 5.89:1 AA
--info-foreground dark oklch(0.17 0.04 250) #021020 light oklch(0.985 0.005 250) #f8fafd on info 6.67:1 AA / 5.81:1 AA

Chart family

Five data-mark colors (blue, green, amber, red, violet) derived from the accent blue and the semantic hues. Each verified at 3:1 or better as a non-text mark on the card surface, in both themes.

--chart-1 blue dark oklch(0.66 0.14 252) #4b95e5 light oklch(0.52 0.15 255) #1f68bc vs card 6.00:1 / 5.56:1 (3:1 pass)
--chart-2 green dark oklch(0.72 0.15 155) #43c07a light oklch(0.52 0.14 155) #007f43 vs card 8.00:1 / 5.09:1 (3:1 pass)
--chart-3 amber dark oklch(0.8 0.13 82) #e7b551 light oklch(0.6 0.12 70) #ad721c vs card 9.88:1 / 4.05:1 (3:1 pass)
--chart-4 red dark oklch(0.665 0.19 25) #f25855 light oklch(0.52 0.2 25) #c21725 vs card 5.59:1 / 6.12:1 (3:1 pass)
--chart-5 violet dark oklch(0.62 0.16 300) #966cd7 light oklch(0.5 0.18 300) #7541b8 vs card 4.80:1 / 6.55:1 (3:1 pass)

Lines

--border dark oklch(0.27 0.006 265) #252629 light oklch(0.92 0.004 265) #e3e4e7 decorative hairline, not a text pair
--input dark oklch(0.3 0.006 265) #2c2e31 light oklch(0.89 0.004 265) #d9dbdd field border; identity via fill, label, ring
--sidebar-border dark oklch(0.24 0.006 265) #1e1f22 light oklch(0.91 0.004 265) #e0e1e4 decorative hairline, not a text pair

Typography

System sans for UI, mono for telemetry. JetBrains Mono (OFL) is an optional local enhancement; no font files ship. Compact scale, px-snapped, 13.5px body. Small labels, large stat values.

3xl / 27px / 32px / 600 / tracking -0.01em / display, stat value Frosty Control Plane
2xl / 21px / 26px / 600 / tracking -0.01em / page title Configured providers
xl / 18px / 24px / 600 / section title Gateway health
lg / 16px / 22px / 500 / emphasized body Everything is a token; nothing is a guess.
base / 13.5px / 20px / 400 / body Frosty routes chat, embedding, image, and audio requests through one gateway, with budgets, virtual keys, and a live request log.
sm / 13px / 18px / 400 / secondary, nav Helper text and secondary explanations sit at thirteen pixels.
xs / 12px / 16px / 400 / caption Captions, badge labels, timestamps.
2xs / 11px / 16px / 500 / tracking 0.02em / micro label p50 latency

Mono telemetry specimens

142 ms latency   $0.0038 cost   1,204 tokens openai/gpt-4o   anthropic/claude-sonnet   ollama/llama3.3 gateway v0.9.0 on Deno 2.9.2   sk-frosty-...a91c   vk-team-42 07:41:23 POST /v1/chat/completions 200 (612 ms)

Spacing

Base unit 4px. Stay on the scale; when in doubt, round down.

--space-1 · 4px
--space-2 · 8px
--space-3 · 12px
--space-4 · 16px
--space-5 · 20px
--space-6 · 24px
--space-8 · 32px
--space-10 · 40px
--space-12 · 48px
--space-16 · 64px

Radius and shadow

One radius family from a 6px base. Three shadow steps, near-neutral; dark theme leans on borders first. No glassmorphism.

sm 4px
md 6px
lg 8px
xl 12px
full
--shadow-sm
--shadow-md
--shadow-lg

Motion

Motion is feedback, not decoration. Enter toward rest, exit away. Under reduced motion every duration and travel distance collapses to zero.

tokenvalueuse
--motion-fast100mshover, focus, pressed feedback
--motion-default150msmenus, popovers, switches, tabs
--motion-slow220msdialogs, sheets, command palette
--motion-spin800msloading spinner rotation
--motion-ease-outcubic-bezier(0.2, 0, 0, 1)enters and hovers
--motion-ease-in-outcubic-bezier(0.4, 0, 0.2, 1)exits, reversible toggles
--motion-rise-2pxhover lift distance
--motion-enter8pxenter-toward travel
Hover this card: state feedback at motion-fast with ease-out. With reduced motion it stays put.

Components

Every state below is built purely from tokens. shadcn/ui is the one kit; these are its Frosty ds-r2 specimens.

Buttons

default hover focus-visible disabled loading primary secondary ghost destructive

Primary is the monochrome emphasis surface (near-white in dark, near-black in light). Visual height is 34px; a pseudo-element extends every button's hit area to the 44px minimum. Hover and focus columns are simulated for the doc.

Inputs

Lowercase identifier, unique per provider.
Focused state: 2px ring, 2px offset.
Write-only; keeps the sk- prefix; never rendered back.
Enter an absolute http or https URL.
Disabled while the provider is syncing.
Native select, styled by tokens.
Monospace textarea for PEM blocks; identity carried by fill, label, and focus ring.

Checkbox and switch

Badges

Soft is the default shape for tables and lists; solid is reserved for the single most important state in a region.

success warning error info default neutral

Application status vocabulary (locked D-CONTRACT strings). ds-r2: default is now a solid primary chip.

set missing default enabled disabled http-sse streamable-http auto read-only needs confirmation streaming disconnected healthy unhealthy ok error

The pulse dot appears only on streaming (a real live-connection state), at most once per view.

Chips and tags

Model chips (removable) and the CUSTOM provider tag.

gpt-4o claude-sonnet llama-3.3-70b CUSTOM

Stat tiles

Small xs label, large 3xl mono value, xs mono delta. Four-up on the dashboard.

Total requests12,847+312 last hour
Success rate98.4%31 errors
Avg latency142 msp95 611 ms
Total cost$3.824.2M tokens

Chart cards

Bar/line toggle, legend keyed to --chart-1..5, and a graceful empty state. Axes and gridlines use --muted-foreground and --border.

Requests per hour
00:0006:0012:0018:00
requests
Latency p50 vs p95
-6h-3hnow
p95 latency p50 latency
Cost by provider
No data available No requests recorded in this window.
cost

Data table (resources)

Sortable headers, inline secret reveal and copy, row edit and delete actions, status pills, pagination.

id type key status actions
openai openai sk-............... default enabled
anthropic anthropic sk-............... enabled
azure-eu CUSTOM azure not set missing disabled

Log table

timestatusrequestmodellatencytokenscost
07:41:23 200 POST /v1/chat/completions openai/gpt-4o 612 ms 1,204 $0.0038
07:41:19 200 POST /v1/messages anthropic/claude-sonnet 1,847 ms 2,388 $0.0121
07:41:12 500 POST /v1/embeddings openai/text-embedding-3 93 ms 0 $0.0000
07:41:08 processing POST /v1/chat/completions groq/llama-3.3-70b … … …

Sidebar navigation

Top search box carries a Ctrl K / Cmd K affordance and opens the command palette. Groups are nested-expandable (rotating chevron); an external-link glyph marks items that leave the app. Active item: sidebar-accent fill, sidebar-accent-foreground text, 2px sidebar-primary inset bar. Section labels are 2xs mono muted.

Command palette

Opened by Cmd K / Ctrl K. Popover surface, shadow-lg, radius-xl. Highlighted row uses the accent wash; each row may carry a trailing mono shortcut hint.

Tabs and configuration panel

Horizontal tabs over a dense field grid with toggles and a sticky Save/Remove footer on the card surface.

Filter and facet sidebar

Collapsible facet groups with a searchable list, checkbox groups, and mono counts. Group headers are 2xs mono muted with a rotating chevron. Selected facets echo as removable soft-neutral chips above the results.

Dialog

Custom-provider modal

Sheet (detail panel)

Request details
Request id
req_8f3ka92
Model
openai/gpt-4o
Latency
612 ms
Prompt tokens
1,204
Completion tokens
356
Cost
$0.0038

Toast

Provider added openai-eu is now serving requests.
Sync failed MCP server weather did not respond within 30s.

Error banner

Empty state

No providers configured Add your first provider to start routing requests through the gateway.

Loading skeleton

Focus ring

Every interactive element shows a 2px ring at 2px offset in the accent blue; the ring passes 3:1 against both canvases and 4.5:1 as link text.

Application frame

Component preview of the app shell built from tokens: sidebar with a search box and nested nav, content region with a page header, stat tiles, a chart card, and a paginated resource table.

Frosty gateway v0.9.0 on Deno 2.9.2
Configured providers
Providers41 disabled
Requests today12,84798.4% ok
Cost today$3.824.2M tokens
Requests per hour
idtypekeystatus
openaiopenai set default enabled
anthropicanthropic set enabled
azure-euazure missing disabled