@codeyam/codeyam-cli 0.1.23 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +7 -1
  4. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  5. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +7 -1
  6. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  7. package/analyzer-template/project/runMultiScenarioServer.ts +26 -3
  8. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +23 -3
  9. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  10. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js +30 -0
  11. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js.map +1 -0
  12. package/codeyam-cli/src/commands/editor.js +72 -23
  13. package/codeyam-cli/src/commands/editor.js.map +1 -1
  14. package/codeyam-cli/src/data/designSystems.js +27 -0
  15. package/codeyam-cli/src/data/designSystems.js.map +1 -0
  16. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +44 -0
  17. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -1
  18. package/codeyam-cli/src/utils/editorApi.js +16 -0
  19. package/codeyam-cli/src/utils/editorApi.js.map +1 -1
  20. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js +159 -0
  21. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js.map +1 -0
  22. package/codeyam-cli/src/utils/queue/job.js +9 -1
  23. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  24. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +98 -0
  25. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -0
  26. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js +34 -0
  27. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js.map +1 -0
  28. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CKeQT5Ty.js → InteractivePreview-DtYTSPL2.js} +1 -1
  29. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DUMfcNVK.js → ScenarioViewer-CefgqbCr.js} +1 -1
  30. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bc8BG-Lw.js +34 -0
  31. package/codeyam-cli/src/webserver/build/client/assets/{_index-BAWd-Xjf.js → _index-C1YkzTAV.js} +1 -1
  32. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BOARiB-g.js → activity.(_tab)-yH46LLUz.js} +1 -1
  33. package/codeyam-cli/src/webserver/build/client/assets/api.editor-verify-routes-l0sNRNKZ.js +1 -0
  34. package/codeyam-cli/src/webserver/build/client/assets/api.interactive-switch-scenario-l0sNRNKZ.js +1 -0
  35. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-C8y4mmyv.js → dev.empty-CRepiabR.js} +1 -1
  36. package/codeyam-cli/src/webserver/build/client/assets/{editor.entity.(_sha)-DMv5ESGo.js → editor.entity.(_sha)-oBrbke_R.js} +16 -16
  37. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-ByHz6rAQ.js → entity._sha._-DYJRGiDI.js} +1 -1
  38. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-CmLO432x.js → entity._sha.scenarios._scenarioId.dev-wdiwx5-Z.js} +1 -1
  39. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-Bz9sCUF_.js → entity._sha.scenarios._scenarioId.fullscreen-BrkN-40Y.js} +1 -1
  40. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-DQM8E7L4.js → entity._sha_.create-scenario-DxfhekTZ.js} +1 -1
  41. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CAoXLsQr.js → entity._sha_.edit._scenarioId-CRXJWmpB.js} +1 -1
  42. package/codeyam-cli/src/webserver/build/client/assets/manifest-694b698a.js +1 -0
  43. package/codeyam-cli/src/webserver/build/client/assets/{root-D2_tktnk.js → root-DXjFYOxD.js} +1 -1
  44. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-D9QZKaLJ.js +2 -0
  45. package/codeyam-cli/src/webserver/build/server/assets/{analysisRunner-By5slFjw.js → analysisRunner-zEYtiv0T.js} +1 -1
  46. package/codeyam-cli/src/webserver/build/server/assets/{index-DXaOwBnm.js → index-CcHPEbhi.js} +1 -1
  47. package/codeyam-cli/src/webserver/build/server/assets/{init-CLG1LjQM.js → init-D68IyWbU.js} +1 -1
  48. package/codeyam-cli/src/webserver/build/server/assets/{server-build-NZmUqQv6.js → server-build-Cxzo0Zp2.js} +147 -147
  49. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  50. package/codeyam-cli/src/webserver/build-info.json +5 -5
  51. package/codeyam-cli/src/webserver/terminalServer.js +1 -2
  52. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  53. package/codeyam-cli/templates/design-systems/clean-dashboard-design-system.md +255 -0
  54. package/codeyam-cli/templates/design-systems/editorial-design-system.md +267 -0
  55. package/codeyam-cli/templates/design-systems/mono-brutalist-design-system.md +256 -0
  56. package/codeyam-cli/templates/design-systems/neo-brutalist-design-system.md +294 -0
  57. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +10 -5
  58. package/codeyam-cli/templates/seed-adapters/supabase.ts +14 -5
  59. package/package.json +1 -1
  60. package/packages/database/src/lib/loadAnalysis.js +7 -1
  61. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  62. package/codeyam-cli/src/webserver/build/client/assets/Spinner-D0LgAaSa.js +0 -34
  63. package/codeyam-cli/src/webserver/build/client/assets/manifest-1a45e154.js +0 -1
  64. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BNd5hYuW.js +0 -2
@@ -0,0 +1,267 @@
1
+ # Editorial Design System
2
+
3
+ > Serif-first, warm, print-inspired UI. Parchment tones, sharp corners, typography-driven hierarchy. For any web or mobile app.
4
+
5
+ ## Philosophy
6
+
7
+ Draws from quality print publications and luxury brand identities. Typography, spacing, and weight do the work that color and shape do in other systems. Warmth without softness. Restraint with intention — minimal color means color carries meaning when it appears.
8
+
9
+ **Rules:**
10
+
11
+ 1. Cards use borders only — never box-shadows
12
+ 2. Nearly square-cornered everywhere (max 4px radius, no pills)
13
+ 3. Background is always warm parchment — never white, never grey
14
+ 4. Accent colors (burgundy, sage, gold) appear only as text, borders, or thin fills — never large background fills
15
+ 5. Font-weight never exceeds 500 — heaviness destroys the elegance
16
+
17
+ ---
18
+
19
+ ## Colors
20
+
21
+ ### Light Mode (only mode — no dark mode)
22
+
23
+ ```css
24
+ :root {
25
+ /* Surfaces — lightest to darkest warm neutral */
26
+ --bg-base: #f4efe4; /* parchment page bg */
27
+ --bg-surface: #ede5d6; /* cards, sidebar, topbar */
28
+ --bg-muted: #e0d5c0; /* hover states, inset areas */
29
+
30
+ /* Text */
31
+ --text-primary: #1c1409; /* headings, active states (warm near-black, not #000) */
32
+ --text-secondary: #5a4f3f; /* body text, secondary content */
33
+ --text-muted: #8a7d6b; /* labels, metadata, placeholders */
34
+
35
+ /* Border */
36
+ --border: #c9bbaa; /* all borders and dividers */
37
+
38
+ /* Shadows — intentionally none. Borders and background contrast do all separation. */
39
+ --shadow-sm: none;
40
+ --shadow-md: none;
41
+ }
42
+ ```
43
+
44
+ Hover states shift surfaces one step darker: base → surface → muted.
45
+
46
+ ### Accents
47
+
48
+ ```css
49
+ /* Use sparingly — as text, borders, or thin fills only */
50
+ --burgundy: #7a1e1e; /* critical, error, accent highlight */
51
+ --burgundy-lt: #c84b4b; /* burgundy hover */
52
+ --sage: #3e5145; /* success, active, positive */
53
+ --gold: #b08830; /* warning, in-progress, special */
54
+ ```
55
+
56
+ ### Semantic
57
+
58
+ ```css
59
+ /* Outlined badges at 6% opacity tint, never solid fills */
60
+ --success-border: var(--sage);
61
+ --success-text: var(--sage);
62
+ --danger-border: var(--burgundy);
63
+ --danger-text: var(--burgundy);
64
+ --warning-border: var(--gold);
65
+ --warning-text: var(--gold);
66
+ ```
67
+
68
+ ### Ordered Palette
69
+
70
+ ```css
71
+ /* For any categorical sequence: tags, categories, avatars, etc. */
72
+ --palette-1: #1c1409; /* ink */
73
+ --palette-2: #7a1e1e; /* burgundy */
74
+ --palette-3: #3e5145; /* sage */
75
+ --palette-4: #b08830; /* gold */
76
+ --palette-5: #5a4f3f; /* secondary */
77
+ ```
78
+
79
+ ---
80
+
81
+ ## Typography
82
+
83
+ **Font stack:** `'Cormorant Garamond', Georgia, serif` (display/UI), `'EB Garamond', Georgia, serif` (body prose only)
84
+
85
+ | Style | Size | Weight | Notes |
86
+ | -------------- | ------- | ------ | ----------------------------------------------------------------------------- |
87
+ | Display | 44–52px | 300 | `letter-spacing: -0.02em; line-height: 1`. Italic `em` for editorial emphasis |
88
+ | Headline | 28–36px | 400 | Italic. Section headers |
89
+ | Subhead | 18–22px | 500 | `letter-spacing: 0.01em`. Card titles |
90
+ | Label / Kicker | 9–11px | 400 | `uppercase; letter-spacing: 0.22–0.28em; color: --text-muted` |
91
+ | Body | 15–16px | 400 | EB Garamond. `line-height: 1.6` |
92
+ | Body Italic | 14–15px | 400 | EB Garamond italic. Metadata, timestamps, captions |
93
+ | UI Small | 11–13px | 400 | `letter-spacing: 0.12–0.18em`. Buttons, badges, tags |
94
+ | Large Value | 32–44px | 300 | `letter-spacing: -0.02em`. Emphasized numbers |
95
+
96
+ **Key distinctions:**
97
+
98
+ - Display font (Cormorant Garamond) for ALL UI chrome: nav, labels, buttons, badges, numbers
99
+ - Body font (EB Garamond) ONLY for prose text and descriptions
100
+ - Labels and categories are ALWAYS uppercase with generous letter-spacing (0.2em+)
101
+ - Italic signals metadata, dates, captions — use it meaningfully, not decoratively
102
+ - Prefer Unicode symbols (✦ ◈ ◇ ▷) over icon libraries — they fit the editorial aesthetic
103
+
104
+ ---
105
+
106
+ ## Spacing & Radius
107
+
108
+ Base unit: 4px. Scale: 4, 8, 16, 24, 40, 64px.
109
+
110
+ | Context | Value |
111
+ | ------------ | -------------------------------- |
112
+ | Card padding | `24px` (header/body/footer each) |
113
+ | Grid gap | 40px |
114
+ | Section gap | 40px |
115
+
116
+ ```css
117
+ --radius-sm: 2px; /* inputs, small chips — use sparingly */
118
+ --radius-md: 4px; /* maximum radius in the system */
119
+ /* No large radius. No pills. Buttons are square-cornered (0px). */
120
+ ```
121
+
122
+ ---
123
+
124
+ ## Layout
125
+
126
+ ### Common Patterns
127
+
128
+ - **Sidebar:** 220px fixed, `--bg-surface`, right border `--border`
129
+ - **Top bar:** Sticky, `--bg-surface`, bottom border. Title (uppercase, letter-spaced) + date (italic) + avatar
130
+ - **Bottom nav (mobile):** Use dot + label pattern from sidebar nav items
131
+ - **Main content:** flex-1, `--bg-base`, padding 40px
132
+ - **Reading column:** `max-width: 68ch` for optimal EB Garamond readability
133
+
134
+ ### Navigation States
135
+
136
+ - Section labels: 9px, uppercase, `letter-spacing: 0.22em`, `--text-muted`
137
+ - Nav items: 14px body font, `--text-secondary`. Hover → `--bg-muted` bg. Active → `--text-primary` bg + `--bg-base` text
138
+ - Active dot indicator: 5px circle in `--gold`
139
+
140
+ ### Mobile / Small Viewport
141
+
142
+ - Sidebar collapses to bottom tab bar (dot + label)
143
+ - Cards stack single-column, full width
144
+ - Display type reduces to 28px, value type to 28px
145
+ - Grid columns collapse to 1
146
+
147
+ ---
148
+
149
+ ## Components
150
+
151
+ ### Card
152
+
153
+ ```css
154
+ .card {
155
+ background: var(--bg-surface);
156
+ border: 1px solid var(--border);
157
+ display: flex;
158
+ flex-direction: column;
159
+ }
160
+ .card-header {
161
+ padding: 24px 24px 16px;
162
+ border-bottom: 1px solid var(--border);
163
+ }
164
+ .card-body {
165
+ padding: 24px;
166
+ flex: 1;
167
+ }
168
+ .card-footer {
169
+ padding: 16px 24px;
170
+ border-top: 1px solid var(--border);
171
+ }
172
+ ```
173
+
174
+ **Variants:** none — cards are always `--bg-surface` with `--border`. No shadows ever.
175
+
176
+ **Interactive states:** hover is color/background only — never move or transform elements.
177
+
178
+ ### Value Card
179
+
180
+ Card with: label (Label style, uppercase), emphasized value (Large Value style, weight 300), optional trend text (Body Italic, `--sage` for up, `--burgundy` for down). For stat rows: use a grid with 1px `--border` gap background to create ruled-line separation.
181
+
182
+ ### Button
183
+
184
+ ```css
185
+ .btn {
186
+ font-family: var(--font-display);
187
+ font-size: 11px;
188
+ letter-spacing: 0.18em;
189
+ text-transform: uppercase;
190
+ padding: 9px 20px;
191
+ border-radius: 0;
192
+ transition: all 0.15s ease;
193
+ }
194
+ ```
195
+
196
+ | Variant | Background | Text | Border |
197
+ | --------- | ---------------- | ---------------- | ------------------------- |
198
+ | Primary | `--text-primary` | `--bg-base` | none |
199
+ | Secondary | transparent | `--text-primary` | `1px solid var(--border)` |
200
+ | Ghost | transparent | `--text-muted` | none |
201
+
202
+ Primary: only one per view. Ghost: for inline navigation actions ("View Detail →"). No icons unless text alone is insufficient.
203
+
204
+ ### Badge
205
+
206
+ `padding: 2px 10px; font-size: 9px; letter-spacing: 0.18em; uppercase; border: 1px solid`. Always outlined — background tint is 6% opacity of accent color, never solid fill. Variants: default (`--border`/`--text-muted`), active (`--sage`), warning (`--gold`), critical (`--burgundy`).
207
+
208
+ ### Input
209
+
210
+ Underline-style — bottom border is the primary affordance. `border: 1px solid var(--border); border-bottom: 2px solid var(--text-secondary); background: var(--bg-base); font-family: var(--font-body); font-size: 15px`. Focus: `border-bottom-color: var(--text-primary)`. Placeholder: italic, `--border` color. Labels: always present, uppercase display font.
211
+
212
+ ### Table
213
+
214
+ Header row: `border-bottom: 2px solid var(--text-primary)`. Header cells: 9px uppercase label style, weight 400. Data cells: 14px body font, `--text-secondary`. Hover → `--bg-muted`. Primary column and numbers: `--text-primary`, weight 500.
215
+
216
+ ### Tag / Chip
217
+
218
+ `font-size: 11px; letter-spacing: 0.1em; padding: 4px 12px; border: 1px solid var(--border); background: transparent`. Selected/hover → `--text-primary` bg + `--bg-base` text.
219
+
220
+ ### Progress Bar
221
+
222
+ Track: 3px height, `--bg-muted`, no rounded ends. Fill: `--text-primary` (default), or accent color. Animate: `width 0.8s cubic-bezier(0.4, 0, 0.2, 1)`.
223
+
224
+ ### Tooltip
225
+
226
+ `background: --text-primary; color: --bg-base; font-size: 12px; padding: 8px 14px`. No border-radius. Trigger text: dashed underline in `--burgundy`.
227
+
228
+ ---
229
+
230
+ ## Motion
231
+
232
+ ```css
233
+ --transition-base: 150ms ease; /* all hover states and interactions */
234
+ ```
235
+
236
+ No bouncy or springy animations. Ease only. No animations on text — only containers. Staggered fade-up on page load:
237
+
238
+ ```css
239
+ @keyframes fadeUp {
240
+ from {
241
+ opacity: 0;
242
+ transform: translateY(12px);
243
+ }
244
+ to {
245
+ opacity: 1;
246
+ transform: translateY(0);
247
+ }
248
+ }
249
+ /* animation: fadeUp 0.5s ease both; delay: n * 0.07s */
250
+ ```
251
+
252
+ Respect `prefers-reduced-motion` by disabling all animations.
253
+
254
+ ---
255
+
256
+ ## Checklist
257
+
258
+ - [ ] Background is `#F4EFE4` parchment — never white, never grey, never #000
259
+ - [ ] No box-shadows anywhere — borders and background contrast only
260
+ - [ ] All corners are square or max 4px radius — no pills, no rounded buttons
261
+ - [ ] Cormorant Garamond for all UI chrome; EB Garamond only for prose
262
+ - [ ] Labels are uppercase with letter-spacing 0.2em+
263
+ - [ ] Italic is used meaningfully (metadata, dates) — not decoratively
264
+ - [ ] Accent colors appear only as text/borders/thin fills — no large color fills
265
+ - [ ] Font-weight never exceeds 500
266
+ - [ ] Badges are outlined with 6% opacity tint — never solid
267
+ - [ ] Hover states are color/background only — elements never move
@@ -0,0 +1,256 @@
1
+ # Mono-Brutalist Design System
2
+
3
+ > Raw, typographic, terminal-warm UI. Monospace identity, dashed borders, single mint-green accent. For any web or mobile app.
4
+
5
+ ## Philosophy
6
+
7
+ Brutalism's exposed skeleton — visible grids, raw type, no embellishment — warmed with organic off-whites, sage greens, and monospaced type. Feels like a well-worn notebook: structured but human.
8
+
9
+ **Rules:**
10
+
11
+ 1. Monospace font carries the identity — labels, tags, metadata, inputs, buttons, nav all use mono
12
+ 2. Dashed borders are the signature element — used on tags, chips, empty states, never on structural containers
13
+ 3. Single chromatic accent (mint green) — resist adding secondary colors
14
+ 4. Never use pure black (`#000`) or pure white (`#fff`) — everything lives between warm off-white and dark olive
15
+
16
+ ---
17
+
18
+ ## Colors
19
+
20
+ ### Light Mode
21
+
22
+ ```css
23
+ [data-theme='light'] {
24
+ --bg-base: #eeece6; /* warm off-white page bg */
25
+ --bg-surface: #fafaf7; /* cards, panels */
26
+ --bg-surface-raised: #ffffff; /* modals, overlays */
27
+ --bg-inverse: #2d3228; /* dark olive — inverted accent blocks, headers */
28
+
29
+ --text-primary: #2d3228; /* headings, primary content */
30
+ --text-secondary: #555550; /* body, descriptions */
31
+ --text-muted: #777772; /* labels, metadata */
32
+ --text-faint: #999994; /* placeholders, disabled */
33
+
34
+ --border: #e2dfd6; /* solid borders — cards, panels, dividers */
35
+ --border-dashed: #999690; /* dashed borders — tags, chips, empty states */
36
+
37
+ --shadow-sm: none; /* no shadows in this system — borders do the work */
38
+ --shadow-md: none;
39
+ }
40
+ ```
41
+
42
+ ### Dark Mode
43
+
44
+ ```css
45
+ [data-theme='dark'] {
46
+ --bg-base: #1a1e18;
47
+ --bg-surface: #222820;
48
+ --bg-surface-raised: #2a3028;
49
+ --bg-inverse: #2d3228; /* unchanged — constant anchor */
50
+
51
+ --text-primary: #e0ddd6;
52
+ --text-secondary: #a8a89e;
53
+ --text-muted: #6a7a64;
54
+ --text-faint: #4a5a44;
55
+
56
+ --border: #2e3628;
57
+ --border-dashed: #3e4a38;
58
+ /* Accent unchanged. Inverse surfaces unchanged. */
59
+ }
60
+ ```
61
+
62
+ Respect `@media (prefers-color-scheme: dark)` on `:root:not([data-theme="light"])`.
63
+
64
+ ### Accents
65
+
66
+ ```css
67
+ /* Mint green — the only chromatic accent. Unchanged between modes. */
68
+ --accent: #b8e0a0; /* primary: on dark surfaces, active indicators */
69
+ --accent-soft: #c5e8b0; /* light mode soft fill; dark mode: #1e3a18 */
70
+ --accent-dark: #82b870; /* darker variant for emphasis */
71
+ ```
72
+
73
+ ### Semantic
74
+
75
+ ```css
76
+ --success-bg: #dff0d4;
77
+ --success-text: #3a5c2a;
78
+ --danger-bg: #f0d4d4;
79
+ --danger-text: #5c2a2a;
80
+ /* Dark mode: --success-bg: #1e3018; --success-text: #82b870; */
81
+ ```
82
+
83
+ ### Ordered Palette
84
+
85
+ ```css
86
+ /* Single-accent system — categorical sequence uses value/opacity variations */
87
+ --palette-1: #2d3228; /* ink */
88
+ --palette-2: #82b870; /* accent dark */
89
+ --palette-3: #b8e0a0; /* accent */
90
+ --palette-4: #555550; /* secondary */
91
+ --palette-5: #999690; /* muted */
92
+ ```
93
+
94
+ ---
95
+
96
+ ## Typography
97
+
98
+ **Font stack:** `'Courier New', Courier, monospace` (identity — labels, tags, inputs, buttons, nav), `system-ui, -apple-system, sans-serif` (headings and body prose only). Optional upgrade: `'DM Mono'` for mono.
99
+
100
+ | Style | Size | Weight | Font | Notes |
101
+ | ----------- | ------------------------ | ------ | ---- | ------------------------------------------------------------ |
102
+ | Display | `clamp(28px, 5vw, 56px)` | 300 | Sans | `letter-spacing: -0.02em; line-height: 1.2` |
103
+ | H1 | `clamp(22px, 3vw, 36px)` | 400 | Sans | `letter-spacing: -0.02em` |
104
+ | H2 | 18px | 500 | Sans | Card titles |
105
+ | H3 | 14px | 500 | Sans | Panel titles |
106
+ | Body | 13px | 400 | Sans | `line-height: 1.6` |
107
+ | Mono L | 13px | 400 | Mono | Large mono labels |
108
+ | Mono M | 12px | 400 | Mono | Default — inputs, content text |
109
+ | Mono S | 11px | 400 | Mono | Tags, metadata, table cells. `letter-spacing: 0.03em` |
110
+ | Mono XS | 10px | 400 | Mono | Section labels, footers. `uppercase; letter-spacing: 0.12em` |
111
+ | Large Value | `clamp(28px, 4vw, 44px)` | 300 | Sans | Emphasized numbers. `letter-spacing: -0.02em` |
112
+
113
+ **Key distinctions:**
114
+
115
+ - ALL CAPS labels always use `letter-spacing: 0.10em` minimum
116
+ - Wrapping user-generated content in quotes (`"text like this"`) is a signature pattern
117
+ - Mono for everything structural/interactive; sans only for headings and prose
118
+
119
+ ---
120
+
121
+ ## Spacing & Radius
122
+
123
+ Base unit: 4px. Scale: 4, 8, 12, 16, 20, 24, 32, 40, 48px.
124
+
125
+ | Context | Value |
126
+ | ---------------------- | ------ |
127
+ | Card padding (compact) | `16px` |
128
+ | Card padding (default) | `24px` |
129
+ | Grid gap (cards) | 10px |
130
+ | Section gap | 32px |
131
+
132
+ ```css
133
+ --radius-sm: 8px; /* badges */
134
+ --radius-md: 12px; /* inputs, small cards */
135
+ --radius-lg: 16px; /* cards, panels */
136
+ --radius-xl: 20px; /* modals */
137
+ --radius-pill: 100px; /* buttons, tag pills */
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Layout
143
+
144
+ ### Common Patterns
145
+
146
+ - **Sidebar/Header:** Dark olive (`--bg-inverse`), same in both modes — constant anchor
147
+ - **Top bar:** Sticky, dark olive bg, mint accent for active nav
148
+ - **Bottom nav (mobile):** Dark olive bg, mint accent active indicator
149
+ - **Main content:** flex-1, `--bg-base`, 40px padding (desktop), 20px (mobile)
150
+
151
+ ### Navigation States
152
+
153
+ - Section labels: Mono XS, uppercase, `letter-spacing: 0.12em`, `--text-muted`
154
+ - Nav items: Mono M, `--text-secondary`. Hover → `--bg-surface` bg. Active → mint accent text on inverse bg
155
+ - Dark olive header is always present — `--bg-inverse`, `z-index: 20`
156
+
157
+ ### Mobile / Small Viewport
158
+
159
+ - Single column, 20px padding
160
+ - Cards full-width, `--radius-lg`
161
+ - Tag pills in horizontal scroll row (no wrap)
162
+ - Tap targets minimum 44px height
163
+ - Display type scales down via clamp
164
+
165
+ ---
166
+
167
+ ## Components
168
+
169
+ ### Card
170
+
171
+ ```css
172
+ .card {
173
+ background: var(--bg-surface);
174
+ border: 1px solid var(--border);
175
+ border-radius: var(--radius-lg);
176
+ padding: 24px;
177
+ }
178
+ ```
179
+
180
+ **Variants:** `default` (surface), `inverted` (ink bg, no border), `accent` (accent-soft bg, accent border).
181
+
182
+ **Interactive states:** hover → subtle bg shift only. No transforms, no shadows.
183
+
184
+ **Card anatomy:** Label row (ALL CAPS mono) → content → footer (timestamp + tag pill).
185
+
186
+ ### Value Card
187
+
188
+ Card with: label (Mono XS, uppercase), emphasized value (Large Value style), optional trend indicator (`--success-text` for up, `--danger-text` for down, italic). Stats row: grid with thin border gaps between cards.
189
+
190
+ ### Button
191
+
192
+ ```css
193
+ .btn {
194
+ font-family: var(--font-mono);
195
+ font-size: 12px;
196
+ padding: 12px 22px;
197
+ border-radius: var(--radius-pill);
198
+ letter-spacing: 0.04em;
199
+ cursor: pointer;
200
+ }
201
+ ```
202
+
203
+ | Variant | Background | Text | Border |
204
+ | --------- | -------------- | ---------------- | ----------------------------------- |
205
+ | Primary | `--bg-inverse` | `--accent` | none |
206
+ | Secondary | transparent | `--text-primary` | `1.5px dashed var(--border-dashed)` |
207
+ | Ghost | transparent | `--text-muted` | `1px solid var(--border)` |
208
+
209
+ Primary: always dark bg + mint text. All buttons use mono font, pill radius.
210
+
211
+ ### Tag / Pill (signature element)
212
+
213
+ `font-family: mono; font-size: 11px; padding: 4px 11px; border-radius: 100px; border: 1.5px dashed var(--border-dashed); letter-spacing: 0.03em; background: transparent`. Active → solid border + inverse bg + white text. Accent variant → accent-dark border + accent-dark text.
214
+
215
+ ### Badge
216
+
217
+ `font-family: mono; font-size: 10px; padding: 3px 10px; border-radius: 100px; letter-spacing: 0.04em`. Variants: trending (inverse bg + accent text), rising (success bg + success text), default (base bg + muted text).
218
+
219
+ ### Input
220
+
221
+ `font-family: mono; font-size: 12px; padding: 12px 16px; border-radius: var(--radius-md); border: 1px solid var(--border); background: var(--bg-base)`. Focus: `border-color: var(--border-dashed)`. Placeholder: `--text-faint`, mono.
222
+
223
+ ### Table
224
+
225
+ Header: Mono XS uppercase labels, `--text-muted`. Rows: Mono S, `--text-secondary`, `border-bottom: 1px solid var(--border)`. Hover → `--bg-base`. Numbers: `--text-primary`, weight 500.
226
+
227
+ ### Empty State
228
+
229
+ Centered dashed circle (`1.5px dotted var(--accent-dark)`, 50px, `+` inside) on accent-soft background. Lowercase conversational text: `"no items here yet"`.
230
+
231
+ ---
232
+
233
+ ## Motion
234
+
235
+ ```css
236
+ --transition-fast: 100ms ease; /* button/tag hover */
237
+ --transition-base: 120ms ease; /* card hover, general */
238
+ --transition-slow: 200ms ease-out; /* modals, panels */
239
+ ```
240
+
241
+ Grounded and minimal — things slide and fade, never bounce. No spring physics, parallax, rotation, or scale-up on hover. Page load: staggered fade-up, 40ms delay per item.
242
+
243
+ ---
244
+
245
+ ## Checklist
246
+
247
+ - [ ] Background is warm off-white (`#eeece6`) or dark olive (`#1a1e18`) — never pure black or white
248
+ - [ ] Monospace font on all labels, tags, inputs, buttons, and nav — sans only for headings/prose
249
+ - [ ] Tags/pills use dashed borders — structural containers use solid borders
250
+ - [ ] Only one chromatic accent (mint green) — no secondary colors
251
+ - [ ] Primary buttons: dark bg + mint text, always pill-shaped
252
+ - [ ] ALL CAPS labels have letter-spacing 0.10em+
253
+ - [ ] Dark olive inverse surfaces are the same in both light and dark mode
254
+ - [ ] No box-shadows — borders and background contrast only
255
+ - [ ] User content wrapped in quotes (`"..."`) where applicable
256
+ - [ ] Motion is grounded — fade and slide only, no bounce