@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.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +135 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/nodeToSource.ts +19 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +11 -4
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +5 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +1632 -1554
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +7 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +7 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
- package/analyzer-template/project/runMultiScenarioServer.ts +26 -3
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js +23 -3
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js +47 -0
- package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js +17 -9
- package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js +30 -0
- package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js.map +1 -0
- package/codeyam-cli/src/commands/editor.js +207 -41
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js +23 -0
- package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js.map +1 -0
- package/codeyam-cli/src/data/designSystems.js +27 -0
- package/codeyam-cli/src/data/designSystems.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js +44 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +103 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +140 -1
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +50 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -1
- package/codeyam-cli/src/utils/editorApi.js +16 -0
- package/codeyam-cli/src/utils/editorApi.js.map +1 -1
- package/codeyam-cli/src/utils/editorAudit.js +38 -2
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorScenarios.js +60 -0
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/editorSeedAdapter.js +42 -2
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js +159 -0
- package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js.map +1 -0
- package/codeyam-cli/src/utils/queue/job.js +9 -1
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +98 -0
- package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +30 -11
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -1
- package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js +34 -0
- package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js.map +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CKeQT5Ty.js → InteractivePreview-DtYTSPL2.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DUMfcNVK.js → ScenarioViewer-CefgqbCr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bc8BG-Lw.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/{_index-BAWd-Xjf.js → _index-C1YkzTAV.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BOARiB-g.js → activity.(_tab)-yH46LLUz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-verify-routes-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.interactive-switch-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-C8y4mmyv.js → dev.empty-CRepiabR.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{editor.entity.(_sha)-aIHKLB-m.js → editor.entity.(_sha)-oBrbke_R.js} +19 -19
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-ByHz6rAQ.js → entity._sha._-DYJRGiDI.js} +1 -1
- 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
- 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
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-DQM8E7L4.js → entity._sha_.create-scenario-DxfhekTZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CAoXLsQr.js → entity._sha_.edit._scenarioId-CRXJWmpB.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-694b698a.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{root-D2_tktnk.js → root-DXjFYOxD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-D9QZKaLJ.js +2 -0
- package/codeyam-cli/src/webserver/build/server/assets/{analysisRunner-DjF-soOH.js → analysisRunner-zEYtiv0T.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-nAvHGWbz.js → index-CcHPEbhi.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{init-XhpIt-OT.js → init-D68IyWbU.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{server-build-DVwiibFu.js → server-build-Cxzo0Zp2.js} +192 -148
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/src/webserver/editorProxy.js +55 -3
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +1 -2
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- package/codeyam-cli/templates/codeyam-editor-reference.md +8 -6
- package/codeyam-cli/templates/design-systems/clean-dashboard-design-system.md +255 -0
- package/codeyam-cli/templates/design-systems/editorial-design-system.md +267 -0
- package/codeyam-cli/templates/design-systems/mono-brutalist-design-system.md +256 -0
- package/codeyam-cli/templates/design-systems/neo-brutalist-design-system.md +294 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +47 -34
- package/codeyam-cli/templates/seed-adapters/supabase.ts +14 -5
- package/package.json +1 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +99 -0
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/nodeToSource.js +16 -0
- package/packages/ai/src/lib/astScopes/nodeToSource.js.map +1 -1
- package/packages/ai/src/lib/astScopes/paths.js +12 -3
- package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +5 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +1330 -1270
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +7 -1
- package/packages/database/src/lib/loadAnalysis.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-D0LgAaSa.js +0 -34
- package/codeyam-cli/src/webserver/build/client/assets/manifest-bcbb3d49.js +0 -1
- 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
|