Sett · Cosmo

Design System

Tokens, components, and patterns for the Cosmo pipeline orchestration tool. Built for power users: dense, warm, purposeful.

Foundation · 01

Color

Warm cream surfaces with deep ink and orange accent. All tokens are OKLCH for perceptually uniform mixing. Neutrals are tinted toward the orange hue at ~78° to create subconscious cohesion.


Surfaces

bg-raised
bg-panel
bg-app
bg-sunken
cream-300
cream-400

Ink scale

900
800
700
600
500
400
300
200

Accent — Orange

600
500
400
100
50

Status

On track
At risk
Behind
Not started

Build phase

600
500
100

Cool slate hue (228°) — machine processing stages in the pipeline bar: Build Queued and In Build.

Token reference

Token Swatch Value Use
--build-600oklch(44% 0.12 228)Build phase hover / emphasis
--build-500oklch(53% 0.14 228)In Build pipeline segment
--build-100oklch(92% 0.028 228)Build Queued pipeline segment, build tinted surfaces
--bg-raisedoklch(99.2% 0.005 78)Cards, inputs, raised surfaces
--bg-panelcream-50Sidebar, panels
--bg-appcream-100App canvas, main background
--bg-sunkencream-200Inactive tabs, count chips, sunken wells
--lineoklch(89% 0.022 78)Default borders, dividers
--line-strongoklch(84% 0.028 78)Emphasized borders, table headers
--inkink-900Primary text
--ink-softink-500Secondary text, nav labels
--ink-mutedink-400Metadata, placeholders, labels
--accentorange-500Primary accent, active states, CTA
--accent-darkorange-600Hover state, links, text on accent-wash
--accent-softorange-100Focus rings, tinted surfaces
--accent-washorange-50Active nav bg, today column bg
Foundation · 02

Typography

Three roles. Barlow for display and headings — condensed, sturdy, confident. Red Hat Text for all UI text and body — humanist grotesque, clear and warm at 12–14px. Rubik for metadata, labels, counts, and IDs — compact geometric, no monospacing.


Type scale

3XL / Display
Barlow 700 · 36px · −0.04em
Pipeline Weekly
2XL / Page title
Barlow 700 · 28px · −0.03em
Delivery Board
XL / Section head
Barlow 700 · 22px · −0.02em
Game Overview
LG / Subsection
Barlow 600 · 18px · −0.02em
Auditor schedule
MD / Card title
Barlow 600 · 15px · −0.02em
Spine Road Rumble — Epic Pool
Base / UI body
Red Hat Text 400 · 13.5px · 0
Assign prompts to auditors, review build status, and track delivery progress across the week.
SM / Dense UI
Red Hat Text 500 · 12.5px · 0
PLY-042 · Tatiana Iudina · T2
XS / Data label
Rubik · 9.5–11px · 0.1em
WEEK 17 · APR 21 – APR 25 · 2026

Font roles

TokenFamilyUse
--font-displayBarlowPage titles, section heads, card titles, KPI values, day numbers
--font-uiRed Hat TextBody copy, nav items, buttons, inputs, table cells, all interactive UI
--font-monoRubikIDs, counts, dates, status tags, pipeline labels, metadata — compact data contexts
Foundation · 03

Spacing

4pt base scale. Token names are step-based, not pixel-based, so a redesign doesn't require renaming. Use gap for siblings, padding for internal breathing room.


--space-1
4px Icon gap, micro nudge
--space-2
8px Badge gap, tight pairs
--space-3
12px Small card padding, sibling stacks
--space-4
16px Standard card padding
--space-5
20px Topbar vertical, sidebar head
--space-6
24px Section gap, topbar horizontal
--space-8
32px Preview area padding
--space-10
40px Subsection gap
--space-12
48px Page section gap
--space-16
64px Main content inset
Foundation · 04

Elevation

Shadows are warm-tinted (same hue as ink), never cold gray. They signal hierarchy — raised surfaces use xs/sm; floating panels use md; drawers and modals use lg.


XS
SM
MD
LG
TokenUse
--shadow-xsCards, chip hover states
--shadow-smPlayable cards, detail panels
--shadow-mdCmd-K, floating filters, popover
--shadow-lgDrawers, overlays, deep panels
Components · 01

Buttons

Use primary (ink-900) for one main action per context. Accent (orange) only for the single most critical action in the view — rarely more than once per page. Secondary and ghost carry everything else.


Variants

Sizes

Disabled state

ClassDescription
.btnBase — always combine with a size and a variant modifier
.btn-sm / .btn-md / .btn-lgSize — 5 / 7 / 10px vertical padding
.btn-primaryink-900 fill; one per context maximum
.btn-accentOrange fill; use sparingly, one per view at most
.btn-secondarybg-raised with border; general secondary actions
.btn-ghostTransparent; low-hierarchy inline actions
.btn-dangerDestructive — red text, red bg on hover
.btn-linkText-only, accent-dark color, zero horizontal padding
Components · 02

Tags & Badges

Status tags use semantic color pairs (bg + text). Tier badges are always ink-900/cream — they convey rank, not health. Phase tags use subtle neutral styling since the phase label already carries the meaning.


Status tags

On track At risk Behind Not started Delivered

Tier badges

T1 T2 T3 R T1 T2 T3 R

Count & phase

12 42 3 Ideation Build QA Delivery
ClassDescription
.tagBase status pill — mono uppercase, always add a variant
.tag-on-track / .tag-at-risk / .tag-behind / .tag-no-start / .tag-deliveredSemantic color pairs (bg + text)
.tier-badge18×18 ink-900 square badge for T1 / T2 / T3 / R labels
.tier-badge.lg24×24 variant for detail views and cards
.count-badgeNumeric count chip, bg-sunken
.count-badge.accentAccent-colored count for active or important numbers
.phase-tagPipeline phase label — neutral pill with border
Components · 03

Inputs

All form controls share the same border token and focus ring (accent + accent-soft). Keep labels short and above the field. Hint text is optional — only include when something non-obvious needs explaining.


Text input

Name or email
Invalid playable ID format

Select & checkboxes

ClassDescription
.fieldFlex-column wrapper for label + input + hint
.field-label / .field-hintAbove-field label (550 weight) and optional clarifying hint
.inputText input — bg-raised, accent focus ring
.input.input-errorError state — red border and focus shadow
.selectDropdown — same sizing as .input, custom chevron via background-image
.checkbox-rowFlex-row wrapper for checkbox + label
.checkboxNative checkbox styled with accent-color
Components · 04

Playable card

One entity, three representations. The same playable appears as a full two-row card in the backlog, a compact single-row card in the weekly grid, and a flat table row in Pulse views. All three share tier-badge, name, PLY-ID, and game name — only density changes.


Full card — backlog

Two-row card used in the backlog panel, pools panel, and search results. Row 1: tier badge, playable name, PLY-ID. Row 2: game name, concept chip (NV/NC). Add .selected when linked to the open detail panel.

V Coin Rain PLY-001
Solitaire Cash NV
R2 Gold Rush PLY-031
Solitaire Cash NV
V Neon Burst PLY-032
Bubble Cash NV
V Wild Card PLY-016
Bingo Clash NC

Grid card — schedule

Single-row compact variant for weekly board day cells. Row 2 is hidden. The .ply-status badge anchors right in row 1 — its label is the pipeline stage, its age span shows elapsed time.

V Coin Rain PG Approved 2D
V Night Mode Pending TL 4H
R2 Spring Sweep Pending PG 2H
V Triple Crown Build Failed 3H
V Sky High Build Queued 7H

Table row — Pulse

Flat full-width row for Pulse and status views. Same tier badge, name, PLY-ID, and game name — laid out as a horizontal row with state-colored backgrounds. Uses the .task-row component family documented in Patterns · 05.

V
Cascade
PLY-017Bubble Cash
Veljko M.Assigned
R2
Spring Sweep
PLY-024Bubble Cash
Veljko M.2d left
R2
Pop Frenzy
PLY-023Bubble Cash
Nastia B.1d lateStalled

Click popover

260px floating card shown when clicking a grid card. Anchored to the card in JS. Pop-tier-badge color is set inline from the card's status.

R2
Spring Sweep
StatusPending PG
AuditorVeljko M.
ScheduledThu 24, Apr 2026
Revision IDPLY-024
ClassDescription
.ply-cardFull two-row playable card — backlog, pools, search results
.ply-card.selectedAccent border + wash — card linked to the open detail panel
.ply-card--gridCompact variant: single row, row 2 hidden, tighter padding — use in schedule day cells
.ply-card-r1 / .ply-card-r2Row 1 (badge + name + ID) and Row 2 (game + concept chip)
.ply-card-namePlayable name — truncates, takes flex space
.ply-card-idPLY-XXX mono label — flex-shrink 0, always visible
.ply-card-gameGame name in row 2 — truncates
.ply-card-conceptNV / NC concept chip — mono, muted, row 2 right
.ply-statusStatus+time badge anchored right in grid row 1 — default (muted), .ok, .warn, .err
.ply-status-ageElapsed time appended inside .ply-status — e.g. "4H", "2D"
.task-row (+ states)Pulse / table row representation — see Patterns · 05
.popover / .pop-*Click popover on grid cards — see Components · 04 (popover class table in components.css)
Components · 07

Icons

Icons come from Lucide — a MIT-licensed stroke icon library. The library is embedded locally at design-system/lib/lucide.min.js and updated via npm run update-icons in data/.


Navigation icons

layout-dashboard Dashboard
calendar-days Weekly
send Delivery
chevron-left Collapse toggle
chevron-right Expand toggle

Usage

14×14 nav icon with 1.8 stroke
16×16 inline icon with 1.5 stroke
UsageDescription
<i data-lucide="icon-name"></i>Replaced at runtime by lucide.createIcons(). Add CSS width/height and stroke properties to size and color.
.nav-icon14×14 with stroke-width: 1.8. Inherits opacity from parent nav-item state.
npm run update-iconsRun from data/ to pull latest Lucide and copy the UMD bundle to lib/lucide.min.js.
Patterns · 01

Data patterns

KPI tiles, progress bars, segmented bars, and load bars form the observability layer of Cosmo. All use Barlow for numeric values (tight tracking, no ambiguity) and Rubik for labels.


KPI tiles

Delivered this week
38 / wk
↑ +6 vs last week
In-flight
84
↓ 4 overdue
Revision rate
12 %
— steady
Capacity used
74 %

Progress bars

Spine Road Rumble 78%
Epic Kingdoms 54%
Space Defenders 31%

Tier breakdown bar (.seg-bar)

Tier breakdown 84 total
18
26
12
16
12
T1 18
T2 26
Rev 12
T3 16
New 12

Use .seg-bar only for tier T1/T2/T3 breakdowns. For pipeline stage_status use Status Distribution Bar.

Load bars (auditor capacity)

Tatiana Iudina
6 / 11
Daria Yakusheva
9 / 11
Amir Cohen
13 / 11
ClassDescription
.kpi / .kpi.smKPI tile — flex column with label, value, delta. .sm is compact height
.kpi.accentTints .kpi-value to the accent color
.kpi-label / .kpi-value / .kpi-deltaMono label / display numeral / mono trend indicator
.kpi-delta.down / .flatRed or muted delta; default is green
.progress-wrap / .progress-track / .progress-fillLabeled progress bar with track + fill
.progress-fill.green / .amber / .redStatus color variants for progress
.seg-bar / .seg-bar.compactTier breakdown bar (tier T1/T2/T3) — 28px or 14px height. For pipeline stage_status use the Status Distribution Bar instead.
.load-bar-fill.low / .mid / .high / .overCapacity states — green / accent / amber / red
Patterns · 01b

Status distribution bar

Horizontal bar showing the breakdown of playables by pipeline stage_status. Each segment is proportional to its count. Supports click-to-filter (active segment emphasized, others dimmed), a clear-filter affordance, per-segment responsive label collapse, and label-only hover tooltips. Canonical JS pattern lives in screens/prototypes/air.html.


Live demo

Click a segment to activate the filter (others dim). Click again or use × clear to reset. Drag the bottom-right corner to resize — labels collapse to icon-only when there isn't room.

Pipeline

Behavior notes

  • Filtering: filterByStatus(key) — clicking a segment toggles it active. Active = .is-active; others = .is-dimmed. Clicking the active segment again clears the filter.
  • Clear affordance: .sdb-filter-hint.visible reveals the hint + clear button. Show/hide via JS when filter is active.
  • Responsive collapse: evaluatePbWide(bar) measures each segment; adds .is-wide when wide enough to show the label alongside the icon. Wire to a ResizeObserver on the bar element.
  • Tooltip: showPbTooltip(seg) reads data-tip from the segment and positions a body-attached .sdb-tooltip above it. Label only — no meaning copy.
  • Background color: set inline via JS from STATUS_CFG[n].cssVar (e.g. style="background:var(--amber-500)").
ClassDescription
.sdbBar container — flex row, 22px height, radius-full, overflow hidden. Segments flex inside.
.sdb-headerRow above the bar: label left, filter hint right.
.sdb-labelMono uppercase label ("Pipeline").
.sdb-filter-hintHidden by default. Add .visible when a filter is active.
.sdb-clear-btnInline button inside the filter hint. Calls clearPipelineFilter().
.sdb-segIndividual segment. Width set inline as % of total. Background set inline from STATUS_CFG.
.sdb-seg.is-activeThis segment is the current filter target — brightened + ink outline.
.sdb-seg.is-dimmedAnother segment is active — this one is muted (opacity 0.18).
.sdb-seg.is-wideSegment is wide enough to show its label. Added/removed by evaluatePbWide().
.sdb-seg.is-lightSegment has a dark background — icon and label use cream-100 instead of ink-700.
.sdb-seg-iconLucide icon wrapper. SVG is 10×10px stroke-width 2.
.sdb-seg-labelMono label. Hidden unless .is-wide is present.
.sdb-tooltipBody-attached fixed tooltip. JS positions it above the hovered segment. Add .is-visible to show.
.dist-bar / .dist-segLegacy aliases — same visual output. Prototypes should migrate to .sdb / .sdb-seg over time.
Patterns · 02

Charts

All charts use Recharts (React) styled with Cosmo design tokens. Area charts track trends, stacked bars compare across dimensions, donut and gauge show proportions and capacity. Color: green = on-track, amber = at-risk, red = behind, accent = highlight.


Delivery Trend · Weekly
Status by Game
Status Distribution
Team Capacity
Auditor Workload
ChartRecharts components used
Delivery TrendAreaChart + Area (fill gradient) + Line (target dashed) + XAxis + YAxis + Tooltip + CartesianGrid
Status by GameBarChart + Bar × 3 (stacked, On Track / At Risk / Behind) + XAxis + YAxis + Tooltip + Legend
Status DonutPieChart + Pie (innerRadius 60, outerRadius 90) + Cell per segment + Legend
Capacity GaugePieChart + Pie (startAngle=180, endAngle=0, 2 cells) + center label via foreignObject
Auditor WorkloadBarChart (layout=vertical) + Bar × 2 (active + remaining) + XAxis + YAxis (type=category) + Tooltip
Color palettegreen-500 (on-track), amber-600 (at-risk), red-500 (behind), orange-500 (accent/delivered), ink-300 (grid), ink-400 (axis text)
Patterns · 03

Topbar

The topbar anchors page identity (title left) and controls (filters + week switch right). The date range uses mono type to signal it's a coordinate, not a headline.


Weekly Board
Apr 21 – 25
ClassDescription
.date-labelMono uppercase date range label — use in topbar right
.week-switchRounded pill container for prev / current / next navigation
.week-btn / .week-btn.activeWeek nav button; active gets ink-900 fill
Patterns · 04

Feedback

Inline alerts use the same semantic color pairs as status tags. Empty states are functional — they tell the user what to do, not just that nothing is here.


Inline alerts

Sync in progress
Atlas data is refreshing. Counts may change in the next few seconds.
PLY-042 sent to Apollo
Build triggered successfully for Spine Road Rumble.
3 playables at risk
Due today with no build confirmation. Review before EOD.
Quota mismatch detected
Atlas shows 84 but Cosmo count is 91. Data may be stale.

Empty state

No playables this day
Drag a playable from the pool or assign one from the weekly queue.
ClassDescription
.alertInline contextual alert — flex row, always add a semantic variant
.alert-info / .alert-success / .alert-warning / .alert-dangerSemantic color variants
.alert-body / .alert-title / .alert-descContent wrapper, bold heading, softer description
.empty-stateCentered flex column for zero-data states — always include an action
.empty-icon / .empty-title / .empty-desc40px icon box, heading, instructional copy (max ~30ch)
.status-tag + variantsInline status with dot — same semantic variants as .tag
.status-dot5px circle, color: currentColor — inherits from .status-tag variant
.popoverFixed 260px overlay panel — prefer over modals for detail views
.toastFixed bottom-center notification — 0.2s opacity + translate transition
Patterns · 05

Entity cards

Three entity types — Playable, Game, and Auditor — each represented at two scales: a compact task row for dense lists, and a collapsible entity card for grouped views. All states shown.


Playable task row

Compact row used in Dispatch backlog, Pulse status view, and Delivery table. Height 44px. States communicate urgency without adding visual weight.

T2
Sky Drop
PLY-003Bubble Cash
Jelena J. Assigned
R2
Tilt Shot
PLY-018Pool Payday
Jelena J. SLA · 2d left Needs Review
R2
Pop Frenzy
PLY-023Bubble Cash
Nastia B. SLA · 1d late Stalled
R2
Ice Breaker
PLY-202Pool Payday
Dmitri S. SLA · 2d late Build Failed
T1
Straight Shot
PLY-021Pool Payday
Nastia B. Approved

Game entity card

Groups all tasks for a game. Expandable — collapsed shows summary stats, expanded shows individual task rows. Square avatar with partner badge.

BU
SK
Bubble Cash
Skillz · 7 tasks
5V
2R
2To Send
1Stalled
2Done
T2
Cascade
PLY-017
Veljko M.Assigned
R2
Spring Sweep
PLY-024
Veljko M.2d left
R2
Pop Frenzy
PLY-023
Nastia B.1d lateStalled

Auditor entity card

Groups tasks by auditor. Shows capacity bar inline in the header. Circle avatar (person). Used in TL Dispatch and TL Pulse.

TI
Tatiana Iudina
Auditor
Capacity 3 / 4
3Active
1Done
T2
Cascade
PLY-017Bubble Cash
Assigned
T1
Power Rush
PLY-006Solitaire Cash
Pending TL
T3
Diamond Cut
PLY-103Bubble Cash
Approved
ClassDescription
.task-listContainer for task rows — bordered, rounded, clips overflow
.task-row44px flex row — default state for assigned/in-progress tasks
.task-row.needs-reviewAmber wash — task waiting for sign-off (pending-pg or pending-tl)
.task-row.stalledLight amber wash — no movement 2+ days
.task-row.failedRed wash — build failed or critical error
.task-row.selectedAccent wash — row linked to open detail panel
.task-row-type / -name / -title / -sub / -meta / -actionsInternal layout slots — type chip | name block | meta badges | hover actions
.task-row-id / .task-row-gameMono sub-labels in the name block second row
.entity-cardCollapsible group card — add .collapsed to collapse the body
.entity-card.selectedAccent border + accent-wash header — linked to open detail panel
.entity-card-head / -bodyAlways-visible header / hideable content area
.entity-av / .entity-av-sq / .entity-av-badge / .entity-av-circleAvatar wrapper, square (games), partner badge, circle (people)
.entity-name / .entity-subPrimary label and secondary line in entity header
.entity-stats / .entity-stat / .entity-stat-n / .entity-stat-lStat cluster — number + label, add .warn/.danger/.good to color the number
.entity-chevronCollapse/expand indicator — rotates -90° when .collapsed on card
.entity-detail-btnPanel-open icon button in card header — use stopPropagation to not trigger collapse
.cap-bar / .cap-bar-track / .cap-bar-fillCapacity bar — auditor load indicator. Add .ok / .warn / .over to fill
Patterns · 06

Detail panel

Docked right panel (320px) that slides open when an entity row or card is clicked. Three entity types — Playable, Game, Auditor — each with their own head, actions, and body sections. One panel at a time.


Three entity types

Panels are rendered side-by-side here for comparison. In the product, only one is visible at a time — docked to the right edge of the main content area.

Task · PLY-018
R2 Tilt Shot
Pool Payday · NV
Needs Review 1d ago
AuditorJelena J. OwnerGal PartnerPapaya SLA2d left Rev.#2 of 2
Game
Bubble Cash
Skillz
5V
2R
2To Send
1Stalled
2Done
PartnerSkillz Total tasks7 Revision rate29% SLA issues1 overdue AuditorsVeljko, Nastia, Mile
Auditor
TI
Tatiana Iudina
3 active · 75% capacity
3 of 4 slots filled 75%
T2
Cascade
PLY-017Bubble Cash
Assigned
R2
Tilt Shot
PLY-018Pool Payday
2d left
T1
Power Rush
PLY-006Solitaire Cash
Pending TL
PLY-017 → Assigned
1h ago
PLY-018 → Pending TL
1d ago
PLY-006 → Pending TL
1d ago
ClassDescription
.detail-panel320px flex column, docked right — add .hidden to collapse (width → 0)
.dp-headPanel header — relative positioned to allow absolute .dp-close button
.dp-closeAbsolute top-right × button — always present
.dp-typeMono uppercase label — e.g. "Task · PLY-018" or "Game"
.dp-title-row / .dp-title / .dp-subTitle row (icon + name), subtitle line below
.dp-bodyScrollable flex column — gap 20px between .dp-section items
.dp-section / .dp-section-labelNamed section with 9px uppercase mono label
.dp-actions / .dp-actionAction button row — variants: .primary / .secondary / .ghost
.dp-meta / .dp-meta-key / .dp-meta-val2-column key/value grid — auto-width keys, 1fr values
.dp-preview / .dp-preview-play110px playable thumbnail with centered play button — provide a background gradient
.dp-timeline / .dp-tl-item / .dp-tl-dot / .dp-tl-event / .dp-tl-whenVertical timeline — dot colors: .green / .amber / .red
.dp-pipeline / .dp-pipe-box / .dp-pipe-n / .dp-pipe-lPipeline stats boxes — add .warn/.danger to box for border color, .warn/.danger/.good to number for text color