Skip to content
unseen.uiby Stack Unseen
Get started

Design tokens

Components read these CSS variables. Use them in your own styles so custom UI matches: color: var(--ai-muted), not a color of your own. Theme variables are set by AITheme or themeToCSS; set the rest on a wrapper element.

The same list, with every component's props, ships in the package as @stackunseen/ui/manifest.json for tools and coding agents.

Color

Set by the theme from three brand seeds; contrast is checked for both modes.

VariableForLightDark
--ai-canvasPage background behind panels.#fafafa#09090b
--ai-surfacePanels, cards, menus and dialogs.#ffffff#18181b
--ai-surface-subtleQuiet fills: hover rows, code, chips, user bubbles.#f4f4f5#27272a
--ai-textBody text.#18181b#fafafa
--ai-mutedSecondary text: meta lines, captions, placeholders.#52525b#a1a1aa
--ai-borderDividers and panel outlines.#e4e4e7#2e2e33
--ai-control-borderOutlines of inputs, selects and checkboxes; 3:1 against the surface.#71717a#7c7c85
--ai-primaryPrimary buttons and the strongest emphasis.#171717#fafafa
--ai-primary-hoverPrimary buttons on hover.#0f0f0f#ffffff
--ai-primary-foregroundText and icons on a primary fill.#ffffff#0b1220
--ai-primary-softSelected and active fills: chosen chips, current rows.#f2f2f2#242424
--ai-primary-textPrimary-coloured text, readable on the surface and on the soft fill.#171717#fafafa
--ai-secondarySecondary brand fill.#7c3aed#7c3aed
--ai-secondary-hoverSecondary fill on hover.#732be1#732be1
--ai-secondary-foregroundText on a secondary fill.#ffffff#ffffff
--ai-secondary-softSoft secondary fill.#f2ecff#251e3c
--ai-secondary-textSecondary-coloured text.#7c3aed#a76fff
--ai-accentAccent fill for highlights such as the Persona orb.#0f766e#0f766e
--ai-accent-foregroundText on an accent fill.#ffffff#ffffff
--ai-successSuccess text and icons: Complete, Passed, Connected.#166534#86efac
--ai-success-softSuccess badge fill.#dcfce7#052e16
--ai-warningWarning text: Needs review, Unconfirmed, Cannot be undone.#92400e#fcd34d
--ai-warning-softWarning badge fill.#fef3c7#451a03
--ai-dangerErrors and destructive actions.#991b1b#fca5a5
--ai-danger-softError badge fill and removed diff lines.#fee2e2#450a0a
--ai-focusKeyboard focus rings; 3:1 against the surfaces.#171717#fafafa
--ai-field-backgroundFill of text fields: the surface, or the subtle surface when fields are tinted.——
--ai-matrix-flipMatrix fill level at which cell text switches to the primary foreground; computed by the theme.——

Shape

Corners and border width, set by the theme.

VariableForDefault
--ai-radiusCorners of panels, menus and dialogs.12px
--ai-control-radiusCorners of inputs and selects.10px
--ai-button-radiusCorners of buttons; follows the control radius unless set.—
--ai-composer-radiusCorners of the message composer.16px
--ai-radius-cardCorners of Card and Stat surfaces.16px
--ai-radius-pillCorners of chips and segmented controls.999px
--ai-radius-tagCorners of tag labels.999px
--ai-border-widthWidth of borders and dividers.1px

Spacing

Gaps and padding; compact density tightens them.

VariableForDefault
--ai-control-heightthemeHeight of buttons, inputs and menu rows; 32px when compact.36px
--ai-gapthemeSpace between blocks inside a component.12px
--ai-field-gapthemeSpace between a label, its control and its help text.8px
--ai-panel-paddingthemeInner padding of panels and cards.16px
--ai-row-gapSpace between rows in page-level layouts.16px
--ai-activity-gapSpace between lines of an assistant's activity (tool calls, reasoning).10px

Elevation

Shadows under floating surfaces.

VariableForDefault
--ai-shadow-popoverthemeShadow under menus, popovers and floating buttons.0 4px 16px rgb(0 0 0 / 0.1
--ai-shadow-dialogthemeShadow under dialogs and sheets.0 12px 40px rgb(0 0 0 / 0.16
--ai-shadow-panelOptional shadow on raised panels; none unless a host sets it.none

Type

Typeface and sizes. Unset, components inherit the page font.

VariableForDefault
--ai-font-familyInterface typeface; inherits the page font when unset.ui-sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI Variable Text', 'Segoe UI', system-ui, sans-serif
--ai-font-monoMonospace typeface for code, paths and identifiers.ui-monospace, SFMono-Regular, Consolas, monospace
--ai-font-numericTypeface for figures: Stat values, durations, counts and deltas; the monospace face when unset.—
--ai-font-sizeBody text size of the interface.14px
--ai-font-size-messageConversation text in the chat message variant, as in ChatGPT.16px
--ai-font-size-headingComponent titles.16px
--ai-font-size-metaMeta lines: times, sizes, counts.13px
--ai-font-size-captionCaptions, badges and small buttons.12px
--ai-disabled-opacityOpacity of disabled controls.0.5

Motion

Transition timing. Reduced motion in the theme turns transitions off.

VariableForDefault
--ai-easeEasing curve of transitions.cubic-bezier(0.2, 0, 0, 1
--ai-duration-fastShort transitions: hover, open and close.120ms
--ai-duration-baseLonger transitions such as progress.200ms

Component settings

Set these on a wrapper to adjust one component.

VariableForDefault
--ai-chat-heightHeight of Chat; set 100% to fill a parent.520px
--ai-message-paddingInner padding of the panel message variant.6px
--ai-launcher-zStacking level of the ChatLauncher bubble and panel.40
--ai-list-insetLeft inset of compact ThreadList rows and labels, to line up with a host's navigation.8px
--ai-navigation-heightMaximum height of the ThreadList scroll area; none lets it grow.360px
--ai-navigation-gutterScrollbar room of the ThreadList; auto when the list grows inside another scroller.stable
--ai-workspace-paddingWorkspaceShell outer padding.—
--ai-workspace-gapSpace between WorkspaceShell panes.—
--ai-workspace-navigation-widthWidth of the WorkspaceShell navigation pane.224px
--ai-workspace-inspector-widthWidth of the WorkspaceShell inspector pane.288px
--ai-workspace-pane-paddingInner padding of scrolling WorkspaceShell panes; 0 when their content scrolls itself.4px
--ai-workspace-pane-gutterScrollbar room of WorkspaceShell panes; auto when their content scrolls itself.stable
--ai-waterfall-figuresWidth of the figures column (duration, tokens, cost) in the ExecutionTimeline waterfall; 300px by default.300px
--ai-sidecar-widthWidth of the Sidecar panel.400px
--ai-sidecar-insetDistance of the Sidecar from the viewport edge.16px
--ai-sidecar-inset-topTop offset of the Sidecar, below a fixed header.—
--ai-sidecar-inset-bottomBottom offset of the Sidecar.—
--ai-sidecar-sheet-heightHeight of the Sidecar as a bottom sheet on small screens.46vh
--ai-chip-heightHeight of Chip.28px
--ai-chip-padding-inlineSide padding of Chip.10px
--ai-chip-font-sizeText size of Chip.13px
--ai-chip-active-backgroundFill of a selected Chip.—
--ai-chip-active-colorText of a selected Chip.—
--ai-stepper-segment-heightHeight of Stepper progress segments.8px
--ai-stepper-segment-gapSpace between Stepper segments.6px
--ai-persona-sizeDiameter of the Persona orb.64px
--ai-preview-heightHeight of WebPreview frames.360px
--ai-matrix-cell-widthWidth of Matrix cells.44px
--ai-matrix-cell-heightHeight of Matrix cells.36px
--ai-matrix-header-heightHeight of the Matrix column header row.96px
--ai-matrix-end-paddingSpace after the last Matrix column.—
--ai-matrix-max-levelHighest Matrix level, for the fill scale.1
--ai-dot-ring-sizeWidth and height of the DotRing figure.200px
--ai-dot-bars-heightHeight of the DotBars columns.72px
--ai-dot-sizeDiameter of each DotBars dot.5px
--ai-week-strip-heightHeight of the WeekStrip columns.56px
--ai-heat-key-sizeWidth and height of a HeatKeys cell.32px
--ai-sparkline-widthWidth of the Sparkline figure.100%
--ai-sparkline-heightHeight of the Sparkline figure.32px
--ai-tracker-heightHeight of the Tracker blocks.28px
--ai-donut-sizeWidth and height of the DonutChart ring.140px
--ai-tone-pad-widthWidth of the TonePad, including its axis labels.320px