@codeyam/codeyam-cli 0.1.22 → 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 (102) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +135 -0
  4. package/analyzer-template/packages/ai/src/lib/astScopes/nodeToSource.ts +19 -0
  5. package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +11 -4
  6. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +5 -1
  7. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +1632 -1554
  8. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +7 -1
  9. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  10. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +7 -1
  11. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  12. package/analyzer-template/project/runMultiScenarioServer.ts +26 -3
  13. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +23 -3
  14. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  15. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js +47 -0
  16. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js.map +1 -0
  17. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js +17 -9
  18. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js.map +1 -1
  19. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js +30 -0
  20. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js.map +1 -0
  21. package/codeyam-cli/src/commands/editor.js +207 -41
  22. package/codeyam-cli/src/commands/editor.js.map +1 -1
  23. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js +23 -0
  24. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js.map +1 -0
  25. package/codeyam-cli/src/data/designSystems.js +27 -0
  26. package/codeyam-cli/src/data/designSystems.js.map +1 -0
  27. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +44 -0
  28. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -1
  29. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +103 -1
  30. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
  31. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +140 -1
  32. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
  33. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +50 -1
  34. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -1
  35. package/codeyam-cli/src/utils/editorApi.js +16 -0
  36. package/codeyam-cli/src/utils/editorApi.js.map +1 -1
  37. package/codeyam-cli/src/utils/editorAudit.js +38 -2
  38. package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
  39. package/codeyam-cli/src/utils/editorScenarios.js +60 -0
  40. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
  41. package/codeyam-cli/src/utils/editorSeedAdapter.js +42 -2
  42. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -1
  43. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js +159 -0
  44. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js.map +1 -0
  45. package/codeyam-cli/src/utils/queue/job.js +9 -1
  46. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  47. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +98 -0
  48. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -0
  49. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +30 -11
  50. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -1
  51. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js +34 -0
  52. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js.map +1 -0
  53. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CKeQT5Ty.js → InteractivePreview-DtYTSPL2.js} +1 -1
  54. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DUMfcNVK.js → ScenarioViewer-CefgqbCr.js} +1 -1
  55. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bc8BG-Lw.js +34 -0
  56. package/codeyam-cli/src/webserver/build/client/assets/{_index-BAWd-Xjf.js → _index-C1YkzTAV.js} +1 -1
  57. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BOARiB-g.js → activity.(_tab)-yH46LLUz.js} +1 -1
  58. package/codeyam-cli/src/webserver/build/client/assets/api.editor-verify-routes-l0sNRNKZ.js +1 -0
  59. package/codeyam-cli/src/webserver/build/client/assets/api.interactive-switch-scenario-l0sNRNKZ.js +1 -0
  60. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-C8y4mmyv.js → dev.empty-CRepiabR.js} +1 -1
  61. package/codeyam-cli/src/webserver/build/client/assets/{editor.entity.(_sha)-aIHKLB-m.js → editor.entity.(_sha)-oBrbke_R.js} +19 -19
  62. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-ByHz6rAQ.js → entity._sha._-DYJRGiDI.js} +1 -1
  63. 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
  64. 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
  65. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-DQM8E7L4.js → entity._sha_.create-scenario-DxfhekTZ.js} +1 -1
  66. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CAoXLsQr.js → entity._sha_.edit._scenarioId-CRXJWmpB.js} +1 -1
  67. package/codeyam-cli/src/webserver/build/client/assets/manifest-694b698a.js +1 -0
  68. package/codeyam-cli/src/webserver/build/client/assets/{root-D2_tktnk.js → root-DXjFYOxD.js} +1 -1
  69. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-D9QZKaLJ.js +2 -0
  70. package/codeyam-cli/src/webserver/build/server/assets/{analysisRunner-DjF-soOH.js → analysisRunner-zEYtiv0T.js} +1 -1
  71. package/codeyam-cli/src/webserver/build/server/assets/{index-nAvHGWbz.js → index-CcHPEbhi.js} +1 -1
  72. package/codeyam-cli/src/webserver/build/server/assets/{init-XhpIt-OT.js → init-D68IyWbU.js} +1 -1
  73. package/codeyam-cli/src/webserver/build/server/assets/{server-build-DVwiibFu.js → server-build-Cxzo0Zp2.js} +192 -148
  74. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  75. package/codeyam-cli/src/webserver/build-info.json +5 -5
  76. package/codeyam-cli/src/webserver/editorProxy.js +55 -3
  77. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  78. package/codeyam-cli/src/webserver/terminalServer.js +1 -2
  79. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  80. package/codeyam-cli/templates/codeyam-editor-reference.md +8 -6
  81. package/codeyam-cli/templates/design-systems/clean-dashboard-design-system.md +255 -0
  82. package/codeyam-cli/templates/design-systems/editorial-design-system.md +267 -0
  83. package/codeyam-cli/templates/design-systems/mono-brutalist-design-system.md +256 -0
  84. package/codeyam-cli/templates/design-systems/neo-brutalist-design-system.md +294 -0
  85. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +47 -34
  86. package/codeyam-cli/templates/seed-adapters/supabase.ts +14 -5
  87. package/package.json +1 -1
  88. package/packages/ai/src/lib/astScopes/methodSemantics.js +99 -0
  89. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  90. package/packages/ai/src/lib/astScopes/nodeToSource.js +16 -0
  91. package/packages/ai/src/lib/astScopes/nodeToSource.js.map +1 -1
  92. package/packages/ai/src/lib/astScopes/paths.js +12 -3
  93. package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
  94. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +5 -1
  95. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  96. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +1330 -1270
  97. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  98. package/packages/database/src/lib/loadAnalysis.js +7 -1
  99. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  100. package/codeyam-cli/src/webserver/build/client/assets/Spinner-D0LgAaSa.js +0 -34
  101. package/codeyam-cli/src/webserver/build/client/assets/manifest-bcbb3d49.js +0 -1
  102. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BNd5hYuW.js +0 -2
@@ -0,0 +1,255 @@
1
+ # Clean Dashboard Design System
2
+
3
+ > Minimal, information-dense UI. Subtle depth via soft shadows and thin borders. For any web or mobile app.
4
+
5
+ ## Philosophy
6
+
7
+ High data clarity, minimal chrome. Neutral palette with restrained color accents. Soft shadows and thin borders create depth without visual weight. Professional, calm motion. Consistent 4px grid.
8
+
9
+ **Rules:**
10
+
11
+ 1. Cards use `var(--bg-surface)` — never hardcoded or colored backgrounds
12
+ 2. Text hierarchy: primary → secondary → tertiary (never skip levels)
13
+ 3. No drop shadows on elements already inside a card
14
+ 4. Max 2 font weights per card
15
+ 5. Both light and dark mode required via `data-theme` attribute
16
+
17
+ ---
18
+
19
+ ## Colors
20
+
21
+ ### Light Mode
22
+
23
+ ```css
24
+ [data-theme='light'] {
25
+ --bg-base: #f7f8fa; /* page background */
26
+ --bg-surface: #ffffff; /* cards, panels */
27
+ --bg-overlay: #ffffff; /* modals, dropdowns */
28
+ --bg-muted: #f2f3f7; /* hover states, inactive */
29
+ --bg-active: #eef2ff; /* selected items */
30
+
31
+ --text-primary: #1a1b25;
32
+ --text-secondary: #6b7280;
33
+ --text-tertiary: #9ca3af;
34
+ --text-disabled: #c4c7ce;
35
+
36
+ --border: #e8e9ed;
37
+ --border-strong: #d1d3db;
38
+
39
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
40
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
41
+ }
42
+ ```
43
+
44
+ ### Dark Mode
45
+
46
+ ```css
47
+ [data-theme='dark'] {
48
+ --bg-base: #14141f;
49
+ --bg-surface: #1e1e2e;
50
+ --bg-overlay: #252537;
51
+ --bg-muted: #252537;
52
+ --bg-active: #2d2d45;
53
+
54
+ --text-primary: #e8e9f0;
55
+ --text-secondary: #9899aa;
56
+ --text-tertiary: #5e5f72;
57
+ --text-disabled: #3a3a50;
58
+
59
+ --border: #2a2a3e;
60
+ --border-strong: #383856;
61
+
62
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
63
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
64
+ }
65
+ ```
66
+
67
+ Respect `@media (prefers-color-scheme: dark)` on `:root:not([data-theme="light"])`.
68
+
69
+ ### Accents
70
+
71
+ ```css
72
+ /* These don't change between modes */
73
+ --green-a: #34d399;
74
+ --green-b: #a7f3d0; /* positive states */
75
+ --red: #f87171; /* negative states */
76
+ --purple-a: #9b8afb;
77
+ --purple-b: #c4b5fd;
78
+ --blue-a: #60a5fa;
79
+ --blue-b: #bae6fd;
80
+ --yellow: #fcd34d;
81
+ ```
82
+
83
+ ### Semantic
84
+
85
+ ```css
86
+ --success-bg: var(--green-b);
87
+ --success-text: #065f46;
88
+ --danger-bg: #fee2e2;
89
+ --danger-text: #991b1b;
90
+ --warning-bg: #fef9c3;
91
+ --warning-text: #854d0e;
92
+ ```
93
+
94
+ ### Ordered Palette
95
+
96
+ ```css
97
+ /* For any categorical sequence: tags, categories, avatars, etc. */
98
+ --palette-1: #6c8ef5; /* blue-purple */
99
+ --palette-2: #34d399; /* green */
100
+ --palette-3: #f87171; /* red */
101
+ --palette-4: #fbbf24; /* yellow */
102
+ --palette-5: #a78bfa; /* purple */
103
+ --palette-6: #22d3ee; /* cyan */
104
+ ```
105
+
106
+ ---
107
+
108
+ ## Typography
109
+
110
+ **Font stack:** `'Inter', sans-serif`
111
+
112
+ | Style | Size | Weight | Notes |
113
+ | ------- | ---- | ------- | --------------------- |
114
+ | Display | 48px | 600 | Large emphasis values |
115
+ | 2XL | 24px | 400/600 | Section headings |
116
+ | LG | 18px | 400/600 | Card titles |
117
+ | SM | 14px | 400/600 | Body, labels |
118
+ | XS | 12px | 400/600 | Captions, timestamps |
119
+
120
+ ---
121
+
122
+ ## Spacing & Radius
123
+
124
+ Base unit: 4px. Scale: 4, 8, 12, 16, 20, 24, 32, 40px.
125
+
126
+ | Context | Value |
127
+ | -------------------- | ----------- |
128
+ | Card padding | `20px 24px` |
129
+ | Gap between cards | 16px |
130
+ | Gap between sections | 24px |
131
+
132
+ ```css
133
+ --radius-sm: 6px; /* badges, chips */
134
+ --radius-md: 8px; /* inputs, small cards */
135
+ --radius-lg: 12px; /* cards, panels */
136
+ --radius-xl: 16px; /* large containers */
137
+ --radius-full: 9999px; /* pills, avatars */
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Layout
143
+
144
+ ### Common Patterns
145
+
146
+ - **Sidebar:** 200px fixed, `--bg-surface`, right border
147
+ - **Top bar:** 52px height, `--bg-surface`, bottom border. Contains: breadcrumbs (left), search (center), actions (right)
148
+ - **Side panel:** 260px fixed, `--bg-surface`, left border (optional, toggle on small viewports)
149
+ - **Main content:** flex-1, `--bg-base`, 24px padding
150
+
151
+ ### Navigation States
152
+
153
+ - Section labels: XS, `--text-tertiary`, uppercase, `letter-spacing: 0.08em`
154
+ - Nav items: SM, `--text-secondary`, hover → `--bg-muted`
155
+ - Active item: `--bg-active`, `--text-primary`, weight 600
156
+ - Nested indent: 16px
157
+
158
+ ### Mobile / Small Viewport
159
+
160
+ - Sidebar collapses to hamburger menu or bottom tab bar
161
+ - Side panel becomes slide-over or hidden
162
+ - Cards stack single-column, full width, reduce padding to 16px
163
+ - Top bar simplified: hamburger + key actions only
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: 20px 24px;
177
+ box-shadow: var(--shadow-sm);
178
+ }
179
+ ```
180
+
181
+ **Variants:** none — cards are always neutral surface color.
182
+
183
+ **Interactive states:** hover → `--bg-muted` background or `--shadow-md`. No transform.
184
+
185
+ ### Value Card
186
+
187
+ Card with: label (SM, `--text-secondary`), emphasized value (Display 48px, semibold), optional trend indicator. Positive: `--green-a` + `↗`. Negative: `--red` + `↘`. Trend text: XS, weight 500.
188
+
189
+ ### Button
190
+
191
+ ```css
192
+ .btn {
193
+ padding: 0 14px;
194
+ border-radius: var(--radius-md);
195
+ font-weight: 500;
196
+ font-size: 13px;
197
+ border: none;
198
+ cursor: pointer;
199
+ }
200
+ /* Hover: 8% brightness shift. Disabled: 40% opacity, not-allowed. */
201
+ ```
202
+
203
+ | Variant | Background | Text | Border/Shadow |
204
+ | ------------ | ---------------- | ------------------ | -------------------------------- |
205
+ | Filled | `--text-primary` | `--bg-base` | none |
206
+ | Filled muted | `--bg-muted` | `--text-primary` | none |
207
+ | Outline | transparent | `--text-primary` | `1px solid var(--border-strong)` |
208
+ | Ghost | transparent | `--text-secondary` | none |
209
+
210
+ | Size | Padding | Font Size |
211
+ | ------------ | ----------- | --------- |
212
+ | SM | `6px 10px` | 12px |
213
+ | MD (default) | `8px 14px` | 13px |
214
+ | LG | `11px 18px` | 14px |
215
+
216
+ Icon-only: square at size height. Split button: text + chevron with 1px divider.
217
+
218
+ ### Badge / Pill
219
+
220
+ `border-radius: var(--radius-sm)` for chips, `--radius-full` for pills. Use accent colors at low opacity for backgrounds.
221
+
222
+ ### Input
223
+
224
+ `--bg-surface`, `1px solid var(--border)`, `--radius-md`, SM text. Focus: `--border-strong` or accent ring.
225
+
226
+ ### Table / Data Row
227
+
228
+ Rows 32px height, `border-bottom: var(--border)`. Labels SM, `--text-secondary`. Hover → `--bg-muted`.
229
+
230
+ ---
231
+
232
+ ## Motion
233
+
234
+ ```css
235
+ --transition-fast: 100ms ease; /* hover states */
236
+ --transition-base: 180ms ease; /* general transitions */
237
+ --transition-slow: 280ms ease-in-out; /* panels, overlays */
238
+ ```
239
+
240
+ Calm and professional — no bounce or spring. Subtle opacity and position transitions only.
241
+
242
+ ---
243
+
244
+ ## Checklist
245
+
246
+ - [ ] Page bg is `--bg-base`, cards are `--bg-surface` — no hardcoded colors
247
+ - [ ] Both `data-theme="light"` and `"dark"` fully supported
248
+ - [ ] Text uses primary/secondary/tertiary hierarchy consistently
249
+ - [ ] All spacing on 4px grid
250
+ - [ ] No colored card backgrounds (except active-state chips)
251
+ - [ ] No shadows on elements inside cards
252
+ - [ ] Max 2 font weights per card
253
+ - [ ] Motion is subtle and fast — no bounce effects
254
+ - [ ] Icons are outlined, 1.5px stroke, inherit currentColor
255
+ - [ ] Ordered palette colors used consistently for categorical items
@@ -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