UI Library

Visual reference for all components, patterns, and design tokens used in the Obelisk app.

.breadcrumb — page-level navigation trail. Use on a <div> (not <nav>, which picks up global padding). Built-in bottom margin — no manual mb* needed.

Content below the breadcrumb.

.section-label — uppercase monospace label for card/box section headers, stat labels, and panel headings. Add mb3 for card headers, mb1 for stat labels, fg1 in flex rows.

Card section heading

Form fields and content go here.

Stat label

42

Panel header (flex row)

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6

Body text — Inter sans-serif. The quick brown fox jumps over the lazy dog. Bold text. Italic text. Link text.

Muted body text at 60% opacity for secondary information.

Small text (f6) for metadata, timestamps, and labels.

Monospace text — used for code, IDs, metadata labels, and buttons.

Default Danger Success Draft Type Warning
Open Waiting Done

.box — Standard padded container with border.

.box.is-narrow — Reduced padding.

.box.is-super-narrow — Minimal padding.

.box.is-notice — Notice/info state.

.box.is-warning — Warning/hold state.

.box.is-success — Success/active state.

.box.is-danger — Error/danger state.

Helper text reinforces intent.
Something went wrong.
Name Status Created Cost
Research Scribe Active Mar 4, 2026 $4.17
Content Writer Waiting Mar 3, 2026 $2.50
Data Analyst Open Mar 1, 2026 $0.00

.stat-grid — auto-fit tile layout for summary metrics. Inner cells use .box.is-narrow.ma0. Add .cols-3 for a fixed 3-column layout.

42

3 categories

1,284

rounded up to 2-min blocks

$21.40

at $1.00/hr

84,921

all-time

.status-dot — animated pulse indicator for live/active states. Use .status-dot--warning or .status-dot--danger for other states.

Active (default green) Warning Danger

.prose — pre-wrap text with word-break and line-height for displaying multi-line user content or AI output.

Line one of pre-wrap text. Line two — preserves newlines. Long words like supercalifragilisticexpialidocious wrap correctly.

In a flex row, add .min-w-0 to the growing column to allow text truncation. Add .flex-shrink-0 to the fixed-size column to prevent shrinking.

Very long scribe name that would overflow without min-w-0 applied to this container

Active

.scribe-empty-view with named .empty-image--* variants. No inline style= needed.

Nothing here yet.

Content will appear here once activity begins.

Hero variant with hat illustration:

No Scribes yet.

Deploy your first Scribe to get started.

curl https://obelisk.li/api/v1/scribes \
  -H "Authorization: Bearer sk_live_..." \
  -d '{ "name": "Research agent" }'
Collapsed section title

Expanded content goes here. Uses native HTML <details> element with custom CSS arrow marker.

Open section title

This section starts open.

Variable Description
--font-size-baseBase font size (16px)
--base-spacingBase spacing unit (14px)
--color-bgPage background
--color-textPrimary text
--color-text-mutedSecondary/muted text
--color-borderBorder color
--color-primaryPrimary accent (#0a0a0a)
--color-dangerError/danger red
--color-successSuccess green
--color-warningWarning/hold amber
--surface-subtleNeutral background for cards/composers
--button-radiusButton border radius (0px — hard edges)
--box-radiusBox border radius (0px — hard edges)
--font-stack-sans-serifsystem-ui / SF Pro / Segoe UI — body text, Inter as fallback
--font-stack-monospaceRoboto Mono — buttons, labels, metadata
--font-stack-serifSerif stack — used sparingly for editorial
--shadow-sm / --shadow-mdElevations for cards, dropdowns
--tooltip-bg / --tooltip-textTooltip background + text
--ss-primary-colorSlimSelect accent (matches primary)

Progress Bars

CSS-only animated bars driven by the --duration custom property. No JavaScript required.

Loading

Done

Pending