Tokens
Every value below is a CSS custom property from @mishrashardendu22/observatory-tokens/tokens.css. The chips render with the token itself, so they show the theme this page is in; the values list both themes. Names, values and notes come from the package's tokens.json.
.card { background: var(--bg-100); border: 1px solid var(--border); border-radius: var(--radius-lg); }Colour
Themes: Dark, Light. The first is the default; the second applies under prefers-color-scheme: light or data-theme="light".
Grounds
Page ground. Warm near-black in dark, warm paper in light. Replaces the old --bg #111111.
Cards, the sidebar, table headers, the app frame. Replaces --surface and --bg-card.
Raised fills inside a card: inputs, segmented controls, icon tiles, hover rows, flat cards. Replaces --surface2.
Popovers, dropdowns, tooltips and the active segment of a segmented control.
Borders
Every hairline: card edges, table rules, list dividers, the sidebar edge. Decorative only, never the sole carrier of meaning.
Outline buttons, step connectors, empty-state dashes and any edge that must read on bg-200.
Border of a highlighted card (the active step, the primary call-to-action panel). Pair with shadow-glow.
Ink
Headings, body copy, stat values and button labels on bg-000 through bg-300 (16.5:1 dark, 15.8:1 light on bg-000).
Subtitles, descriptions, table cells, nav items at rest. Reads on bg-000 through bg-300 (8.9:1 dark, 6.9:1 light).
Kickers, captions, timestamps, placeholders and the Skipped status, on bg-000 through bg-200 (5.3:1 dark on bg-000, 4.7:1 on bg-200). Not for text on bg-300 in dark (4.2:1): use ink-secondary there.
Text and icons on accent-fill. 8.3:1 on the amber fill in both themes.
Accent
The brand amber as ink: kickers, active nav items, links, icon tiles, focus rings and the italic word in a title. 8.8:1 dark and 5.2:1 light on bg-000. Never as a large fill in light (use accent-fill).
Hover state of accent-coloured text and outlines.
Primary button and toggle fill in both themes, always with ink-inverse on it. Replaces the cream #f5e9d3 button and the violet --accent.
Hover state of accent-fill.
Tinted fill behind an active nav item, an icon tile, the input focus halo and the Running badge ground.
Info
The old violet accent, kept for the Running state, info notices and the debug log level. 7.6:1 dark, 6.1:1 light on bg-000. Never for calls to action.
Ground of the Running badge and info notices.
Success
Completed backups, healthy connections, positive deltas, the check mark on a recent-backup row. 7.2:1 dark, 4.8:1 light on bg-000. Always paired with a word or icon: success and danger are told apart by hue only (1.3:1), kept from the source.
Ground of the success badge and success notice.
Danger
Failed backups, error log lines, destructive buttons, negative deltas. 5.6:1 dark, 5.1:1 light on bg-000. Always with a word or icon (see success).
Ground of the error badge, error notice and destructive button.
Warning
Warn log lines, degraded connections, retry notices. Orange, not amber, so it never reads as the brand colour. 7.5:1 dark, 5.1:1 light on bg-000.
Ground of the warning badge and warning notice.
Charts
The main series in every chart: successful backups, storage over time. 8.8:1 dark, 3.0:1 light on bg-100 (a mark, not text).
Failed series beside chart-primary. Darker, not just redder, so the two bars differ in lightness (3.7:1 dark, 5.0:1 light on bg-100).
Skipped series and inactive bars. 3.1:1 dark, 3.7:1 light on bg-100.
Dashed grid lines (3 3) behind bars and areas.
Axis tick labels at 11px mono. Alias of ink-muted kept separate so charts can be tuned alone.
Focus ring
The 2px focus ring, offset 3px, on every interactive element. Solid, 8.8:1 dark and 5.2:1 light on bg-000.
Selection
Text selection highlight.
Overlay
Scrim behind the mobile sidebar drawer and modals, including the HITL confirmation dialog.
chart-primary against chart-failed differ in lightness.Type
Families: --font-serif = "Instrument Serif", --font-sans = Inter, --font-mono = "IBM Plex Mono". Each style is also a class in type.css.
Display · serif
Landing hero headline. Two to three lines, max 640px wide. Emphasise one phrase with an italic accent em.
Section headlines on the landing page and the dashboard page title (.page-title).
Card headlines and the mobile page title.
Nav-card titles, step titles, empty-state titles, dialog titles.
The number in a StatCard and StatStrip. Use tabular figures via font-variant-numeric so columns line up.
Text · sans
Hero and section subtitles in ink-secondary, max 560px.
Default body copy, descriptions and chat messages.
Table cells, list rows, nav items (weight 500), card descriptions.
Form labels, card titles, button labels (14px in .btn).
Timestamps, deltas, legend entries and helper text in ink-muted.
Uppercase eyebrow above a headline (accent) and stat labels or table headers (ink-muted).
Code · mono
Repository names, run ids, log lines, SQL and JSON in chat.
Chart axis labels, log timestamps and nav counts.
Spacing
A 4px base. Components use 8, 12, 16 and 24; page rhythm uses 32 and up. Matches Tailwind v4's numeric scale so utility classes and tokens agree.
Icon-to-label gap inside a badge, delta arrow gap.
Gap between buttons, between a label and its input, inside a badge.
List-row gap, notice padding, sidebar horizontal padding.
Grid gap between cards, flat-card padding, table cell horizontal padding (20px).
StatCard padding.
Card padding, page gutter on small screens.
Gap between page sections, hero card padding.
Top padding of the main column.
Page gutter on wide screens, empty-state padding.
Bottom padding of the main column.
Vertical rhythm between landing-page sections.
Radius
Tightened from the old 8/16/28 scale. The 28px card radius is retired: at 24px padding it wasted corner space and read as a toy.
Badges without pill shape, checkboxes, list-row icon tiles, skeletons, code chips.
Buttons, inputs, nav items, flat cards, icon tiles, notices.
Cards, stat cards, tables, popovers, the app-preview frame.
The hero panel and full-width feature panels.
Status badges and the segmented control's outer shell.
Shadow
Edges come from borders, not shadows. Shadows exist only for floating surfaces and the amber glow.
The active segment of a segmented control, dropdown triggers.
Popovers, dropdown menus, toasts and dialogs on bg-300.
The one highlighted card on a page (the call-to-action panel, the current step, a card on hover in the nav-card grid).
Layout
Fixed dimensions of the app shell.
Max width of the main column (.app-main) and the landing container.
Expanded sidebar, down from 280px.
Icon-only sidebar under html[data-sidebar=collapsed].
Landing nav bar and the mobile header.
Buttons and inputs at the default size; 32px small, 48px large.