@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.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- 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.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 +72 -23
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- 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/editorApi.js +16 -0
- package/codeyam-cli/src/utils/editorApi.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/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)-DMv5ESGo.js → editor.entity.(_sha)-oBrbke_R.js} +16 -16
- 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-By5slFjw.js → analysisRunner-zEYtiv0T.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-DXaOwBnm.js → index-CcHPEbhi.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{init-CLG1LjQM.js → init-D68IyWbU.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{server-build-NZmUqQv6.js → server-build-Cxzo0Zp2.js} +147 -147
- 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/terminalServer.js +1 -2
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- 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 +10 -5
- package/codeyam-cli/templates/seed-adapters/supabase.ts +14 -5
- package/package.json +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-1a45e154.js +0 -1
- 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
|