Lattice
Color System
Lattice enforces a strict two-color-system architecture. Chrome and data palettes are separate — they cannot share a hex value. Chrome is maximally restrained (grays + one accent). Data uses purpose-fit palettes. Color in chrome competes with color in data, and color in data carries meaning.
| Foreground | Background | Hex values | Ratio | Status | Use |
|---|---|---|---|---|---|
| --chrome-text | --chrome-bg | #E5E5E5 / #0A0A0A | 16.5:1 | AAA | Body text (primary) |
| --chrome-text-muted | --chrome-bg | #999999 / #0A0A0A | 8.2:1 | AAA | Secondary labels |
| --chrome-text-faint | --chrome-bg | #666666 / #0A0A0A | 4.7:1 | AA | Metadata, timestamps |
| --chrome-text-disabled | --chrome-bg | #4A4A4A / #0A0A0A | 2.9:1 | FAIL | Disabled only — WCAG SC 1.4.3 exempt |
| --chrome-accent | --chrome-bg | #4DA3FF / #0A0A0A | 7.1:1 | AAA | Active states, focus rings |
| --status-success-text | --chrome-bg | #2CA02C / #0A0A0A | 4.6:1 | AA | Success pills — always + icon + text |
| --status-error-text | --chrome-bg | #D62728 / #0A0A0A | 4.5:1 | AA | Error pills — always + icon + text |
| --status-warning-text | --chrome-bg | #E8B24D / #0A0A0A | 7.3:1 | AAA | Warning pills — always + icon + text |
| --status-info-text | --chrome-bg | #1F77B4 / #0A0A0A | 4.5:1 | AA | Info pills — always + icon + text |
| --chrome-text | --chrome-bg-elevated | #E5E5E5 / #141414 | 14.8:1 | AAA | Pane body text |
Typography
| Token | Value | Use |
|---|---|---|
| --weight-regular | 400 | Body, table cells |
| --weight-medium | 500 | Column headers, labels |
| --weight-semibold | 600 | Emphasized values, totals |
| --weight-bold | 700 | Reserved for primary alerts ONLY |
Spacing
2px base — half of other archetypes. 4px base would still waste pixels at terminal density. 2px increments allow finer tuning of dense rows.
| Token | Value | Use | Preview |
|---|---|---|---|
| --space-25 | 2px | Inline gap, badge inner padding | |
| --space-50 | 4px | Tight pair (icon+number) | |
| --space-75 | 6px | Row internal padding | |
| --space-100 | 8px | DEFAULT cell padding | |
| --space-150 | 12px | Between cells / form fields (rare) | |
| --space-200 | 16px | Pane internal padding | |
| --space-300 | 24px | Between sections (rare) | |
| --space-400 | 32px | Page-level breaks (very rare) |
Elevation
Lattice is the FLATTEST archetype — zero shadows on default surfaces. Shadows are reserved strictly for transient overlays (popovers, tooltips, command palette). Visual weight reduces the information zone.
| Token | Value | Use | Banned on |
|---|---|---|---|
| none | box-shadow: none | ALL default chrome surfaces | Required for panes, rows, cells |
| --shadow-overlay | 0 4px 12px rgba(0,0,0,0.4) | Popovers, tooltips, dropdowns | – |
| --shadow-modal | 0 12px 40px rgba(0,0,0,0.6) | Modal dialogs only (use sparingly) | – |
Shape & Borders
Sharp corners reinforce the tabular grid. Lattice is not trying to feel friendly — it's trying to feel precise.
0 · cells, panes
2px · badges
4px · DEFAULT
6px · dialogs
8px · rare CTAs
50% · kbd hint
Motion
--duration-instant: 0ms is the DEFAULT. Motion fatigue is real. Power users in terminals for 8 hours will viscerally hate any animation that triggers on common actions. Instant > smooth.
| Token | Value | Use | Banned for |
|---|---|---|---|
| --duration-instant | 0ms · DEFAULT | State changes (selected row, sort, filter, hover row — ALL instant) | – |
| --duration-fast | 80ms | Hover color shift only | Data updates |
| --duration-base | 120ms | Popover entry, focus shift | Row hover |
| --duration-slow | 200ms | Pane resize commit (drag) | Sort / filter |
| --easing-linear | linear | Default — no flourish | Bouncing easing |
| --easing-standard | cubic-bezier(0.4, 0, 0.2, 1) | Popovers, overlays | – |
prefers-reduced-motion: Lattice's default is already minimal (0ms). Reduced-motion fallback: instant transitions (already the default).
Iconography — Tabler Icons
| Property | Value |
|---|---|
| Grid | 16px standard · 14px in dense rows · 20px in nav |
| Stroke | 1.5px at all sizes (Tabler default) |
| Color | inherit via currentColor |
| Style | Line icons by default; filled for binary states |
Sparklines replace "open chart" chrome with an inline glance. First-class in Lattice — 80–120px wide, single-hue, inside table cells.
Voice & Content
Terse · technical · abbreviated · mono numbers with units. Use technical vocabulary — do not explain it (operators know what P95 means).
Foundation Components
Composite Components
| Job ID | Status | Duration | Owner | |
|---|---|---|---|---|
| job-4821 | Failed | 30.0s | team-x | |
| job-4820 | Running | 4.2s | team-y | |
| job-4819 | Queued | — | team-x |
Domain Layer — 5 Named Components
Domain components compose Layers 1–3 with Lattice rules: mono numbers, dense spacing, keyboard shortcuts visible in tooltips, color+icon+text triple encoding on every status.
Workspace Layouts
Every Lattice screen is one of these six. Operators learn the chrome once and never re-learn it.
| Layout | Primary use | Required features |
|---|---|---|
| W1 Multi-Pane | Lattice default — nav + table + detail | Drag-to-resize splitters, keyboard resize (Shift+Arrow), min-width per pane |
| W2 Full Table | Exploration — logs, events, transactions | Virtualization (10K+ rows), sticky header + filter bar |
| W3 Chart Grid | Monitoring dashboards — multi-metric | Resizable/draggable chart cards, shared crosshair, independent time ranges |
| W4 Split Editor | Query, config, log filter builders | Synced scroll option, Ctrl+Shift+P to swap sides |
| W5 Streaming Log | Log tailing — ops, incident response | Pause-on-scroll-up, resume-on-scroll-bottom, Cmd+End to jump to tail |
| W6 Modal | Only when input doesn't fit in a pane | Esc to close, Cmd/Ctrl+Enter to submit, focus trap |
Data Grid — 50+ Realistic Rows
The iconic Lattice component. Sticky header · zebra striping · mono tabular numerics · status pills (color+icon+text) · sparklines · heatmap cells · P95 numbers · compact 24px rows.
| Job ID | Status | Pipeline | Cluster | Owner | Duration | P95 (ms) | Rows | Trend 30d | Cost | Started | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| job-4821 | Failed | etl-prod | us-east-1b | team-x | 30.0s | 4,215 | — | $0.82 | 14:32:08 | ||
| job-4820 | Running | ml-train | gpu-1 | team-ml | 4.2s | 82 | 142,441 | $2.40 | 14:31:44 | ||
| job-4819 | Queued | etl-staging | us-west-2 | team-x | — | — | — | — | 14:31:22 | ||
| job-4818 | Success | report-daily | eu-central-1 | team-bi | 12.8s | 1,089 | 2,100,482 | $1.10 | 14:30:55 | ||
| job-4817 | Failed | sync-s3 | us-east-1b | team-infra | 8.1s | 3,782 | — | $0.44 | 14:30:10 | ||
| job-4816 | Success | etl-prod | us-east-1a | team-x | 22.3s | 1,441 | 5,882,100 | $3.21 | 14:28:44 | ||
| job-4815 | Cancelled | backfill-2026 | us-west-2 | team-data | 1.2s | — | — | $0.02 | 14:28:01 | ||
| job-4814 | Success | ml-infer | gpu-2 | team-ml | 1.8s | 44 | 88,200 | $0.88 | 14:27:30 | ||
| job-4813 | Success | report-hourly | eu-central-1 | team-bi | 3.4s | 287 | 182,041 | $0.40 | 14:27:00 | ||
| job-4812 | Failed | sync-warehouse | us-east-1b | team-data | 45.2s | 5,102 | — | $5.60 | 14:25:42 | ||
| job-4811 | Success | etl-prod | us-east-1a | team-x | 18.4s | 1,204 | 5,441,092 | $2.85 | 14:24:10 | ||
| job-4810 | Partial | backfill-q1 | ap-southeast-1 | team-data | 34.1s | 2,890 | 1,002,841 | $4.10 | 14:22:05 | ||
| job-4809 | Success | ml-train | gpu-1 | team-ml | 8.4m | 28 | 400,000 | $12.20 | 14:14:00 | ||
| job-4808 | Success | report-daily | eu-central-1 | team-bi | 11.2s | 988 | 2,050,400 | $1.08 | 14:12:30 | ||
| job-4807 | Failed | sync-s3 | us-west-2 | team-infra | 7.8s | 3,442 | — | $0.41 | 14:10:18 | ||
| job-4806 | Success | etl-staging | us-east-1b | team-x | 9.1s | 620 | 882,110 | $0.95 | 14:09:44 | ||
| job-4805 | Success | ml-infer | gpu-3 | team-ml | 1.6s | 38 | 90,400 | $0.82 | 14:08:10 | ||
| job-4804 | Queued | backfill-2025 | us-east-1a | team-data | — | — | — | — | 14:07:55 | ||
| job-4803 | Success | report-hourly | eu-central-1 | team-bi | 3.1s | 262 | 181,200 | $0.38 | 14:07:00 | ||
| job-4802 | Success | etl-prod | us-east-1a | team-x | 20.1s | 1,380 | 5,780,200 | $3.10 | 14:05:12 | ||
| job-4801 | Success | sync-warehouse | us-east-1b | team-data | 41.0s | 4,810 | 8,200,000 | $5.20 | 14:03:40 | ||
| job-4800 | Success | ml-train | gpu-2 | team-ml | 7.1m | 24 | 402,100 | $11.80 | 13:55:20 | ||
| job-4799 | Failed | etl-prod | us-east-1b | team-x | 30.0s | 4,102 | — | $0.80 | 13:50:05 | ||
| job-4798 | Success | report-daily | eu-central-1 | team-bi | 13.2s | 1,120 | 2,080,110 | $1.12 | 13:48:00 | ||
| job-4797 | Success | sync-s3 | ap-southeast-1 | team-infra | 6.4s | 510 | 1,200,800 | $0.70 | 13:45:12 | ||
| job-4796 | Partial | backfill-q4 | us-west-2 | team-data | 28.8s | 2,110 | 900,400 | $3.40 | 13:42:00 | ||
| job-4795 | Success | etl-prod | us-east-1a | team-x | 19.0s | 1,280 | 5,602,400 | $2.90 | 13:40:10 | ||
| job-4794 | Success | ml-infer | gpu-1 | team-ml | 1.9s | 41 | 89,200 | $0.85 | 13:38:44 | ||
| job-4793 | Success | report-hourly | eu-central-1 | team-bi | 3.0s | 244 | 179,800 | $0.36 | 13:37:00 | ||
| job-4792 | Failed | sync-warehouse | us-east-1b | team-data | 43.1s | 4,992 | — | $5.40 | 13:34:22 | ||
| job-4791 | Success | etl-prod | us-east-1a | team-x | 17.8s | 1,190 | 5,320,100 | $2.70 | 13:32:40 | ||
| job-4790 | Success | ml-train | gpu-3 | team-ml | 6.8m | 22 | 398,400 | $11.40 | 13:25:10 | ||
| job-4789 | Cancelled | backfill-2024 | us-east-1b | team-data | 0.4s | — | — | $0.01 | 13:22:00 | ||
| job-4788 | Success | report-daily | eu-central-1 | team-bi | 12.0s | 1,002 | 2,010,040 | $1.05 | 13:18:00 | ||
| job-4787 | Success | etl-staging | us-west-2 | team-x | 8.8s | 600 | 880,400 | $0.90 | 13:14:22 | ||
| job-4786 | Success | sync-s3 | us-east-1b | team-infra | 5.8s | 490 | 1,180,000 | $0.65 | 13:10:05 | ||
| job-4785 | Failed | etl-prod | us-east-1b | team-x | 30.0s | 4,080 | — | $0.79 | 13:08:44 | ||
| job-4784 | Success | ml-infer | gpu-2 | team-ml | 1.7s | 36 | 88,800 | $0.83 | 13:06:00 | ||
| job-4783 | Success | report-hourly | eu-central-1 | team-bi | 3.3s | 270 | 180,500 | $0.37 | 13:07:00 |
Print Behavior
Operators print Lattice views: incident reports, audit exports, shift handoff docs, regulatory compliance snapshots. Print is a first-class concern. ⌘P must "just work" for any view. Sticky header on every page. Status text-prefix for B&W printers. Mono numerics preserved.
Keyboard-First Interaction Map
Lattice is keyboard-primary. Mouse is supported but not optimized for. Every action must have a shortcut. Every icon button has a shortcut documented in its tooltip. Operators who learn these never reach for a mouse.
| Shortcut | Action | Context |
|---|---|---|
| ⌘K | Command palette — primary input method; all actions reachable | Global |
| ⌘/ / ? | Keyboard shortcut help overlay | Global |
| ⌘F / / | Focus search / filter field | Global |
| ⌘↵ | Submit / commit (forms, modals, query run) | Global |
| Esc | Close popover · clear focus · dismiss drawer · cancel | Global |
| J | Next row in table / next alert in list | Table / list |
| K | Previous row in table / previous alert | Table / list |
| ↵ | Open selected row in detail drawer | Table |
| Space | Select / deselect row (adds to selection) | Table |
| ⇧↓ | Extend selection down (range select) | Table |
| ⌘A | Select all rows in current view | Table |
| N | New item (context-sensitive) | Global |
| E | Edit selected item | Global |
| D | Delete selected (with undo snackbar — no confirm dialog) | Global |
| R | Refresh current view | Global |
| A | Acknowledge alert | Alert view |
| S | Silence alert | Alert view |
| P | Page on-call | Alert view |
| GI | Go to inbox (G then I) | Global nav |
| ⇧←→ | Resize focused pane (Shift+Arrow) | Workspace |
Accessibility
| Gate | Status |
|---|---|
| Body text contrast ≥ 4.5:1 AA | AAA 16.5:1 |
| Focus indicator visible (2px, offset 2px) | Pass |
| Tab order matches visual order | Pass |
| All icon-only buttons have aria-label | Pass |
| Status indicators: color + icon + text | Pass |
| Form fields have programmatic labels | Pass |
| prefers-reduced-motion honored | Pass |
| Skip-to-content link present | Pass |
| Data tables have aria-label | Pass |
Sparklines: role="img" with aria-label describing the trend (e.g., "P&L sparkline positive trend over 30 days").
Data grid: aria-label on table, cells read as "job-4821, Failed, etl-prod, 30.0s, 4215ms, team-x".
Live regions: aria-live="polite" on filter count updates, row count changes. aria-live="assertive" on error states.
Governance + BYOC
| Rule | Enforcement | Rationale |
|---|---|---|
| Two-color-system architecture (chrome ≠ data) | lint flag | Chrome and data tokens cannot share the same hex value |
| Monospace + tabular figures on all numeric columns | lint flag | font-feature-settings: "tnum" 1 — column alignment collapses without |
| Every interactive element has a documented keyboard shortcut | lint flag | Icon-buttons without shortcut metadata fail |
| Animation on data updates banned | motion review | Cell flash, row pulse — motion fatigue over 8h sessions |
| Shadows on default surfaces banned | lint flag | Panes, cells, rows — any non-overlay shadow fails |
| Confirmation dialogs banned for reversible actions | workflow review | Use undo snackbar pattern instead |
| Pagination banned for data tables — must virtualize | lint flag | Pagination breaks scroll context; filter resets |
| Color-only encoding banned | lint flag | Every status = color + icon + text (governance baseline) |
| Body type ≥ 11px in chrome | lint flag | 10px only for axis labels / micro-metadata |
| Pane resizability required | workspace lint | Non-resizable splitter fails; operators have different preferences |
If using the BYOC variant (Prompt 1b), your palette MUST cover BOTH systems separately. ~14 chrome colors + ~22 data colors = ~36 total. Prompt 1b validation rejects any BYOC that shares chrome and data hex values, is missing light mode, or uses pastel data colors.
When to Pick Lattice
If 3+ of your brand adjectives appear below, Lattice is likely your archetype (Finding 5 demoted-adjective routing).
Failure Modes
When teams force Lattice onto the wrong use case, predictable failures appear in this order.