Tokens, components, patterns
A real, editable DS extracted from Apollo's static snapshot. Every screen built on top should consume var(--*) tokens and .ap-* classes from this folder, never the bundled Tailwind output.
Color
Semantic accents in HSL-triplet form. Compose alpha at the call site (hsl(var(--primary) / 0.15)).
| Token | Pair | Notes |
|---|---|---|
| --primary | --primary-foreground | Indigo. Active nav, send button, primary CTAs. |
| --accent | --accent-foreground | Bright blue. Reserved highlight; rarely standalone. |
| --success | --success-foreground | Green. Live indicator, Apply Changes CTA, success states. |
| --warning | --warning-foreground | Amber. "Waiting" status pill. |
| --destructive | --destructive-foreground | Red. Failed status, destructive actions. |
Surface
App chrome — backgrounds, text, borders. Each surface has a foreground pair so text is always legible.
Typography
System font stack. No webfont. Type scale below shows the sizes that the snapshot actually uses; --text-xl is reserved for future headings.
| Token | Value | Notes |
|---|---|---|
| --font-sans | ui-sans-serif, system-ui, … | Default body / UI font. |
| --font-mono | ui-monospace, SFMono-Regular, … | Code, IDs, numerics, eyebrows. |
| --weight-normal / medium / semibold / bold | 400 / 500 / 600 / 700 | All four observed in the snapshot. |
Spacing
Tailwind default 4px scale. The snapshot's class strings (e.g. gap-2, p-6) map onto these tokens; new screens authored in pure CSS should reach for the same values.
Radius
Apollo sets --radius: .75rem as its base; md and sm are derived via calc(), mirroring shadcn's convention.
Shadow
Subtle ink-tinted shadows. Hue matches --foreground so elevation feels native to the cool-tinted background.
Motion
Two transition durations and two easings cover everything in the snapshot.
| Token | Value | Notes |
|---|---|---|
| --duration-fast | 150ms | Hover tints, focus rings. |
| --duration-base | 200ms | Tab activation, nav-tab fill. |
| --ease-out | cubic-bezier(.16, 1, .3, 1) | Default for entrances. |
| --ease-in-out | cubic-bezier(.4, 0, .2, 1) | Default for state changes. |
Buttons · .ap-btn
Variants: .primary, .secondary, .ghost, .icon. Sizes: default + .sm.
| Class | Visual |
|---|---|
| .ap-btn | Base: 40px tall, transparent background, 10px radius. |
| .ap-btn.primary | Filled indigo, white text. Send / Submit / Search. |
| .ap-btn.secondary | White surface with input border, foreground text. |
| .ap-btn.ghost | Transparent until hover (then secondary fill). |
| .ap-btn.icon | Square 40×40; combines with any variant. |
| .ap-btn.sm | 28px tall, 12px font; for toolbars and inline actions. |
Card · .ap-card
White surface with 1px border, 12px radius, soft shadow. Header / body slots provided as separate classes.
Create Task
Create a new task version or concept task
Body content goes here.
| Class | Visual |
|---|---|
| .ap-card | Outer wrapper. |
| .ap-card-header | Padded title block, 24px gap above body. |
| .ap-card-title | 24px semibold, tight tracking. |
| .ap-card-subtitle | 14px muted-foreground. |
| .ap-card-body | Padded body slot. |
Form fields · .ap-input · .ap-select · .ap-textarea
All three share height (40px), border, and radius. Pair with .ap-label above and .ap-help below.
Describe what you want to modify or add to this version.
| Class | Visual |
|---|---|
| .ap-label | 14px medium, sits above the field. |
| .ap-input | Single-line text input. 40px tall. |
| .ap-select | Combobox-style trigger button. Add .placeholder for unset state. |
| .ap-textarea | Multi-line input. min-height: 80px; vertical-resize allowed. |
| .ap-help | 12px muted-foreground; sits below the field. |
Status pill · .ap-status-pill
Tiny rounded-full label on task cards. Variants map to semantic colors.
| Class | Visual |
|---|---|
| .ap-status-pill | Base. Defaults to muted. |
| .warning | Amber — Waiting. |
| .pending-tl | Purple — Pending TL. |
| .success | Green — Done / Succeeded. |
| .destructive | Red — Failed. |
| .muted | Gray — Archived / inactive. |
Chat bubble · .ap-chat-bubble
Agent (Developer) bubbles use a light indigo wash; auditor bubbles use the neutral secondary fill. Up to 70ch wide.
✅ FIXED
Context: Beginning of the game — first 5 shapes are now simple.
- Horizontal line 3×1
- Square 2×2
- Vertical line 1×3
Tweakable: scripted shape ids in src/world/index.ts.
Revert the zigzag back to how it was.
| Class | Visual |
|---|---|
| .ap-chat-bubble | Base bubble — padding, radius, max-width. |
| .ap-chat-bubble.agent | Light indigo wash — Developer messages. |
| .ap-chat-bubble.user | Secondary gray — auditor messages. |
Task card · .ap-task-card
Single card in the right-rail task list. Selected task gets .is-active for the indigo border + shadow.
Replace Sort Eggs with monster discovery viewfinder
| Class | Visual |
|---|---|
| .ap-task-card | Outer card. Hover lifts to --shadow-md. |
| .ap-task-card.is-active | Indigo border + tinted indigo shadow + 4% indigo wash. Marks the currently-loaded task. |
| .ap-task-card-head | Pin + id + version + status dot, single row. |
| .ap-task-card-meta | Status pill + relative timestamp. |
| .ap-task-card-title | 14px semibold, normal line-height. |
| .ap-task-card-summary | Latest message preview (icon + truncated paragraph). |
| .ap-task-card-foot | Slug breadcrumb + More toggle. |
Tabstrip · .ap-tabstrip + .ap-tab
Center-pane sub-tabs (Scene Editor / Chat / Pins / Files / Workspace), Create-Task mode toggle, status filter row.
| Class | Visual |
|---|---|
| .ap-tabstrip | Container — muted gray strip, 4px inset. |
| .ap-tab | Inactive tab — muted text, transparent. |
| .ap-tab.active | Active tab — white surface, foreground text, soft shadow. |
Apollo DS · derived from screens/apollo/auditor.html · long-tail patterns in patterns.md.