anentrypoint-design 0.0.102 → 0.0.103

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 (78) hide show
  1. package/app-shell.css +464 -2005
  2. package/colors_and_type.css +140 -626
  3. package/dist/247420.css +578 -2749
  4. package/dist/247420.js +23 -62
  5. package/package.json +22 -23
  6. package/src/bootstrap.js +5 -18
  7. package/src/components/chat.js +15 -15
  8. package/src/components/community.js +9 -7
  9. package/src/components/content.js +71 -54
  10. package/src/components/files-modals.js +4 -2
  11. package/src/components/files.js +6 -14
  12. package/src/components/freddie/helpers.js +38 -77
  13. package/src/components/freddie.js +32 -16
  14. package/src/components/shell.js +22 -15
  15. package/src/components.js +7 -3
  16. package/src/debug.js +21 -30
  17. package/src/deck-stage.js +10 -6
  18. package/src/highlight.js +25 -11
  19. package/src/index.js +29 -5
  20. package/src/{desktop → kits/os}/freddie/helpers.js +1 -1
  21. package/src/{desktop → kits/os}/freddie/pages-chat.js +2 -2
  22. package/src/{desktop → kits/os}/freddie/pages-core.js +2 -2
  23. package/src/{desktop → kits/os}/freddie/pages-os.js +1 -1
  24. package/src/{desktop → kits/os}/freddie/pages-tools.js +2 -2
  25. package/src/{desktop → kits/os}/freddie-dashboard.js +2 -2
  26. package/src/markdown.js +27 -49
  27. package/src/motion.js +30 -17
  28. package/src/page-html.js +18 -116
  29. package/src/styles.js +14 -22
  30. package/src/web-components/ds-chat.js +24 -56
  31. package/dist/247420.app.js +0 -5
  32. package/dist/fonts/archivo_v25_k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTT0zRp8A.ttf +0 -0
  33. package/dist/fonts/archivo_v25_k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTT6jRp8A.ttf +0 -0
  34. package/dist/fonts/archivo_v25_k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTBjNp8A.ttf +0 -0
  35. package/dist/fonts/archivo_v25_k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTNDNp8A.ttf +0 -0
  36. package/dist/fonts/archivo_v25_k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTnTRp8A.ttf +0 -0
  37. package/dist/fonts/archivo_v25_k3k6o8UDI-1M0wlSV9XAw6lQkqWY8Q82sJaRE-NWIDdgffTTtDRp8A.ttf +0 -0
  38. package/dist/fonts/archivonarrow_v35_tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhv8laKpA.ttf +0 -0
  39. package/dist/fonts/archivonarrow_v35_tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvHlGKpA.ttf +0 -0
  40. package/dist/fonts/archivonarrow_v35_tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvLFGKpA.ttf +0 -0
  41. package/dist/fonts/archivonarrow_v35_tss5ApVBdCYD5Q7hcxTE1ArZ0Zz8oY2KRmwvKhhvy1aKpA.ttf +0 -0
  42. package/dist/fonts/jetbrainsmono_v24_tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8-qxjPQ.ttf +0 -0
  43. package/dist/fonts/jetbrainsmono_v24_tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8FqtjPQ.ttf +0 -0
  44. package/dist/fonts/jetbrainsmono_v24_tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8L6tjPQ.ttf +0 -0
  45. package/dist/fonts/jetbrainsmono_v24_tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxjPQ.ttf +0 -0
  46. package/dist/fonts/jetbrainsmono_v24_tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO-LflOQ.ttf +0 -0
  47. package/dist/fonts/jetbrainsmono_v24_tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO9seVOQ.ttf +0 -0
  48. package/dist/fonts/spacegrotesk_v22_V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj42Vksj.ttf +0 -0
  49. package/dist/fonts/spacegrotesk_v22_V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj4PVksj.ttf +0 -0
  50. package/dist/fonts/spacegrotesk_v22_V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7aUUsj.ttf +0 -0
  51. package/dist/fonts/spacegrotesk_v22_V8mQoQDjQSkFtoMM3T6r8E7mF71Q-gOoraIAEj7oUUsj.ttf +0 -0
  52. package/src/app.js +0 -156
  53. package/src/components/freddie/pages-chains.js +0 -168
  54. package/src/components/freddie/pages-chat.js +0 -122
  55. package/src/components/freddie/pages-config-edit.js +0 -174
  56. package/src/components/freddie/pages-config.js +0 -193
  57. package/src/components/freddie/pages-core.js +0 -170
  58. package/src/components/freddie/pages-runtime.js +0 -69
  59. package/src/components/freddie/pages-voice.js +0 -109
  60. package/src/web-components/freddie-chat.js +0 -34
  61. /package/src/{desktop → kits/os}/about-app.js +0 -0
  62. /package/src/{desktop → kits/os}/app-panes.css +0 -0
  63. /package/src/{desktop → kits/os}/browser-app.js +0 -0
  64. /package/src/{desktop → kits/os}/files-app.js +0 -0
  65. /package/src/{desktop → kits/os}/freddie/routes.js +0 -0
  66. /package/src/{desktop → kits/os}/freddie-dashboard.css +0 -0
  67. /package/src/{desktop → kits/os}/icons.js +0 -0
  68. /package/src/{desktop → kits/os}/index.js +0 -0
  69. /package/src/{desktop → kits/os}/launcher.css +0 -0
  70. /package/src/{desktop → kits/os}/launcher.js +0 -0
  71. /package/src/{desktop → kits/os}/monitor-app.js +0 -0
  72. /package/src/{desktop → kits/os}/shell.js +0 -0
  73. /package/src/{desktop → kits/os}/terminal-app.js +0 -0
  74. /package/src/{desktop → kits/os}/theme.css +0 -0
  75. /package/src/{desktop → kits/os}/validate.css +0 -0
  76. /package/src/{desktop → kits/os}/validator-app.js +0 -0
  77. /package/src/{desktop → kits/os}/wm.css +0 -0
  78. /package/src/{desktop → kits/os}/wm.js +0 -0
@@ -1,634 +1,148 @@
1
1
  /* ============================================================
2
- Design tokensbrand palette + type scale + motion
3
- Loads before any consumer rule; all var(--*) refs resolve.
2
+ 247420 design system colors + type
3
+ Calm, readable, scope-prefixed at build time.
4
+ Source-of-truth tokens. Component sheet lives in app-shell.css.
4
5
  ============================================================ */
5
- :root {
6
- --paper: #F5F0E4;
7
- --ink: #1F1B16;
8
- --acid: #C8FF4D;
9
- --link: #3A66FF;
10
- --warn: #FF6B4A;
11
- --live: #2BB07F;
12
-
13
- --green: #3F8A4A;
14
- --green-2: #B6DEC1;
15
- --green-deep: #2B6B36;
16
- --green-fg: #FFFFFF;
17
- --purple: #6B3A78;
18
- --purple-fg: #FFFFFF;
19
- --mascot: #F07AA8;
20
- --mascot-fg: #FFFFFF;
21
- --sun: #FFD86B;
22
-
23
- --ff-display: 'Archivo Black', 'Archivo', 'Nunito', system-ui, sans-serif;
24
- --ff-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
25
- --ff-prose: 'Nunito', 'Inter', 'Space Grotesk', system-ui, sans-serif;
26
- --ff-ui: 'Nunito', 'Inter', system-ui, sans-serif;
27
-
28
- --fs-hero: 120px;
29
- --fs-h1: 64px;
30
- --fs-h2: 32px;
31
- --lh-tight: 1.05;
32
- --lh-snug: 1.2;
33
- --tr-tight: -0.02em;
34
-
35
- --dur-snap: 80ms;
36
- --dur-base: 160ms;
37
- --ease: cubic-bezier(0.2, 0, 0, 1);
38
-
39
- --surface-2: rgba(0,0,0,0.04);
40
- --surface-ink-2: rgba(255,255,255,0.06);
41
-
42
- --r-1: 6px;
43
- --r-2: 10px;
44
- --r-3: 18px;
45
- --r-pill: 9999px;
46
-
47
- /* Extended brand palette */
48
- --flame: #FF8454;
49
- --sky: #6FA9FF;
50
-
51
- /* Foreground / background aliases — resolved after panel tokens are set;
52
- these are reset below once panel tokens exist, but raw defaults here
53
- ensure no unsatisfied var() at parse time if panel tokens are absent. */
54
- --fg: #0B0B09;
55
- --fg-3: #6d675b;
56
- --bg: #EFE9DD;
57
- --bg-2: #ece5d8;
58
-
59
- /* Colorful-mono palette — canonical hue per slot */
60
- --mono-1: var(--green);
61
- --mono-2: var(--purple);
62
- --mono-3: var(--mascot);
63
- --mono-4: var(--sun);
64
- --mono-5: var(--flame);
65
- --mono-6: var(--sky);
66
-
67
- /* Spacing scale (4px base) */
68
- --space-1: 4px;
69
- --space-2: 8px;
70
- --space-3: 12px;
71
- --space-4: 16px;
72
- --space-5: 24px;
73
- --space-6: 32px;
74
- --space-7: 48px;
75
- --space-8: 64px;
76
-
77
- /* Border widths */
78
- --bw-hair: 1px;
79
- --bw-rule: 2px;
80
-
81
- /* Measure */
82
- --measure: 72ch;
83
- --measure-prose: 68ch;
84
-
85
- /* Prose rhythm — asymmetric stack scale for editorial surfaces */
86
- --prose-stack-sm: 12px;
87
- --prose-stack-md: 24px;
88
- --prose-stack-lg: 56px;
89
-
90
- /* Tool rhythm — canonical gutter for dense panel internals */
91
- --tool-gutter: 16px;
92
-
93
- /* Extended type scale */
94
- --fs-body: 15px;
95
- --fs-lg: 17px;
96
- --fs-sm: 14px;
97
- --fs-xs: 13px;
98
- --fs-tiny: 13px;
99
- --fs-micro: 12px;
100
- --fs-h3: 14px;
101
- --fs-h4: 13px;
102
-
103
- /* Extended line heights */
104
- --lh-base: 1.5;
105
- --lh-long: 1.6;
106
-
107
- /* Extended letter spacing */
108
- --tr-label: 0.08em;
109
- --tr-caps: 0.05em;
110
-
111
- /* Font body alias */
112
- --ff-body: var(--ff-ui);
113
- }
114
-
115
- /* Rows: no separators, hover surface tint instead */
116
- .row { background: transparent; transition: background var(--dur-snap) var(--ease); }
117
- .row:hover { background: var(--surface-2); }
118
- [data-theme="ink"] .row:hover { background: var(--surface-ink-2); }
119
-
120
- body {
121
- background: var(--panel-0);
122
- color: var(--panel-text);
123
- font-family: var(--ff-ui);
124
- font-size: 15px;
125
- line-height: 1.55;
126
- -webkit-font-smoothing: antialiased;
127
- -moz-osx-font-smoothing: grayscale;
128
- text-rendering: optimizeLegibility;
129
- }
130
-
131
- /* ============================================================
132
- Semantic type classes
133
- ============================================================ */
134
-
135
- /* Hero — project name, once per page. Archivo Black territory. */
136
- .t-hero, h1.hero {
137
- font-family: var(--ff-display);
138
- font-size: clamp(64px, 12vw, var(--fs-hero));
139
- line-height: var(--lh-tight);
140
- letter-spacing: var(--tr-tight);
141
- font-weight: 800;
142
- margin: 0;
143
- }
144
-
145
- /* h1 — page title */
146
- .t-h1, h1 {
147
- font-family: var(--ff-display);
148
- font-size: clamp(40px, 6vw, var(--fs-h1));
149
- line-height: var(--lh-tight);
150
- letter-spacing: var(--tr-tight);
151
- font-weight: 700;
152
- margin: 0;
153
- }
154
6
 
155
- /* h2 — section */
156
- .t-h2, h2 {
157
- font-family: var(--ff-display);
158
- font-size: var(--fs-h2);
159
- line-height: var(--lh-snug);
160
- letter-spacing: var(--tr-tight);
161
- font-weight: 700;
162
- margin: 0;
163
- }
164
-
165
- /* h3 — subsection (mono, colorful-eligible) */
166
- .t-h3, h3 {
167
- font-family: var(--ff-ui);
168
- font-size: var(--fs-h3);
169
- line-height: var(--lh-snug);
170
- letter-spacing: 0;
171
- font-weight: 600;
172
- margin: 0;
173
- }
174
-
175
- /* h4 */
176
- .t-h4, h4 {
177
- font-family: var(--ff-ui);
178
- font-size: var(--fs-h4);
179
- line-height: var(--lh-snug);
180
- font-weight: 500;
181
- margin: 0;
182
- }
183
-
184
- /* Body UI — mono, the default UI voice */
185
- .t-body {
186
- font-family: var(--ff-ui);
187
- font-size: var(--fs-body);
188
- line-height: var(--lh-base);
189
- }
190
-
191
- /* Long-form prose — SANS, not serif. Space Grotesk. */
192
- .t-prose, .prose p {
193
- font-family: var(--ff-body);
194
- font-size: var(--fs-lg);
195
- line-height: var(--lh-long);
196
- max-width: var(--measure);
197
- text-wrap: pretty;
198
- font-weight: 400;
199
- }
200
- .prose p { margin: 0 0 var(--space-4) 0; }
201
-
202
- /* Label — mono, gentle */
203
- .t-label {
204
- font-family: var(--ff-ui);
205
- font-size: var(--fs-xs);
206
- letter-spacing: 0.02em;
207
- font-weight: 500;
208
- }
209
-
210
- /* Meta — mono, small, dim */
211
- .t-meta {
212
- font-family: var(--ff-ui);
213
- font-size: var(--fs-xs);
214
- color: var(--fg-3);
215
- }
216
-
217
- /* Micro — smallest, datelines */
218
- .t-micro {
219
- font-family: var(--ff-ui);
220
- font-size: var(--fs-micro);
221
- letter-spacing: 0.02em;
222
- color: var(--fg-3);
223
- }
7
+ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap');
224
8
 
225
- /* Pull — display, for section intros and callouts */
226
- .t-pull {
227
- font-family: var(--ff-display);
228
- font-size: var(--fs-h2);
229
- line-height: var(--lh-snug);
230
- font-weight: 600;
231
- max-width: 20ch;
232
- letter-spacing: var(--tr-tight);
233
- }
234
-
235
- /* Code */
236
- code, .t-code, .t-mono, kbd, samp, pre {
237
- font-family: var(--ff-mono);
238
- font-size: 0.9em;
239
- background: var(--bg-2);
240
- padding: 0.15em 0.5em;
241
-
242
- border-radius: var(--r-1);
243
- }
244
- pre { padding: var(--space-3) var(--space-4); }
245
- pre code { background: transparent; padding: 0; }
246
-
247
- /* ============================================================
248
- COLORFUL MONO — the signature treatment
249
- Mono is the UI voice. We don't leave it grey. Every mono block
250
- is allowed — encouraged — to carry a canonical hue per token.
251
- ============================================================ */
252
-
253
- /* Hue utilities — apply to mono runs to tint them */
254
- .mono-green { color: var(--mono-1); }
255
- .mono-purple { color: var(--mono-2); }
256
- .mono-mascot { color: var(--mono-3); }
257
- .mono-sun { color: var(--mono-4); }
258
- .mono-flame { color: var(--mono-5); }
259
- .mono-sky { color: var(--mono-6); }
260
- .mono-ink { color: var(--fg); }
261
- .mono-dim { color: var(--fg-3); }
262
-
263
- /* Highlight block — a mono run on a tinted bg with dark text */
264
- .hl-green { background: var(--green); color: var(--green-fg); padding: 0.08em 0.4em; border-radius: var(--r-1); }
265
- .hl-purple { background: var(--purple); color: var(--purple-fg); padding: 0.08em 0.4em; border-radius: var(--r-1); }
266
- .hl-mascot { background: var(--mascot); color: var(--mascot-fg); padding: 0.08em 0.4em; border-radius: var(--r-1); }
267
- .hl-sun { background: var(--sun); color: var(--ink); padding: 0.08em 0.4em; border-radius: var(--r-1); }
268
- .hl-flame { background: var(--flame); color: var(--paper); padding: 0.08em 0.4em; border-radius: var(--r-1); }
269
- .hl-sky { background: var(--sky); color: var(--paper); padding: 0.08em 0.4em; border-radius: var(--r-1); }
270
-
271
- /* Role-colored mono spans — semantic, self-documenting */
272
- .m-k { color: var(--mono-2); font-weight: 500; } /* keyword */
273
- .m-s { color: var(--mono-4); } /* string */
274
- .m-n { color: var(--mono-1); } /* number / live */
275
- .m-c { color: var(--fg-3); font-style: italic; } /* comment */
276
- .m-tag { color: var(--mono-3); } /* tag / mention */
277
- .m-op { color: var(--mono-5); } /* operator / punct */
278
- .m-ref { color: var(--mono-6); text-decoration: underline; text-underline-offset: 3px; }
279
-
280
- /* Links in prose */
281
- .prose a, a.t-link {
282
- color: var(--link);
283
- text-decoration: underline;
284
- text-underline-offset: 3px;
285
- text-decoration-thickness: 1px;
286
- }
287
- .prose a:hover, a.t-link:hover {
288
- background: var(--link);
289
- color: var(--paper);
290
- text-decoration: none;
291
- }
292
-
293
- /* ============================================================
294
- Primitives — rails, rules, stamps, buttons
295
-
296
- Rail = a 4px tonal stripe on the inline-start edge of any block.
297
- Used to separate concerns by hue without ever drawing a border.
298
- ============================================================ */
299
-
300
- .rail { box-shadow: inset 4px 0 0 var(--panel-text-3); }
301
- .rail-green { box-shadow: inset 4px 0 0 var(--green); }
302
- .rail-purple { box-shadow: inset 4px 0 0 var(--purple); }
303
- .rail-mascot { box-shadow: inset 4px 0 0 var(--mascot); }
304
- .rail-sun { box-shadow: inset 4px 0 0 var(--sun); }
305
- .rail-flame { box-shadow: inset 4px 0 0 var(--flame); }
306
- .rail-sky { box-shadow: inset 4px 0 0 var(--sky); }
307
- .rail-live { box-shadow: inset 4px 0 0 var(--live); }
308
- .rail-warn { box-shadow: inset 4px 0 0 var(--warn); }
309
-
310
- /* Dot — 8px tonal status pip. Use for "live", "draft", "shipped" indicators. */
311
- .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--panel-text-3); vertical-align: middle; margin-right: 8px; }
312
- .dot.green { background: var(--green); }
313
- .dot.purple { background: var(--purple); }
314
- .dot.mascot { background: var(--mascot); }
315
- .dot.sun { background: var(--sun); }
316
- .dot.flame { background: var(--flame); }
317
- .dot.sky { background: var(--sky); }
318
- .dot.live { background: var(--live); }
319
- .dot.warn { background: var(--warn); }
320
-
321
- .rule { margin: 0; }
322
- .rule-double{ height: var(--bw-rule); margin: 0; }
323
- .rule-dotted{ margin: 0; }
324
- .rule-green { margin: 0; }
325
- .rule-purple{ margin: 0; }
326
- .rule-mascot{ margin: 0; }
327
-
328
- /* The 247420 stamp */
329
- .stamp {
330
- display: inline-block;
331
- padding: var(--space-1) var(--space-3);
332
-
333
- border-radius: var(--r-pill);
334
- color: var(--fg);
335
- background: transparent;
336
- font-family: var(--ff-ui);
337
- font-size: var(--fs-tiny);
338
- letter-spacing: 0.02em;
339
- font-weight: 600;
340
- transform: none;
341
- }
342
- .stamp.ink { background: var(--fg); color: var(--bg); }
343
- .stamp.green { background: var(--green); color: var(--green-fg); }
344
- .stamp.purple { background: var(--purple); color: var(--purple-fg); }
345
- .stamp.mascot { background: var(--mascot); color: var(--mascot-fg); }
346
- .stamp.sun { background: var(--sun); color: var(--ink); }
347
- .stamp.flame { background: var(--flame); color: var(--paper); }
348
-
349
- /* Legacy alias — .stamp.acid now means green */
350
- .stamp.acid { background: var(--green); color: var(--green-fg); }
351
-
352
- /* The "stamp button" */
353
- .btn-stamp {
354
- display: inline-flex;
355
- align-items: center;
356
- gap: var(--space-2);
357
- padding: var(--space-3) var(--space-5);
358
- background: var(--fg);
359
- color: var(--bg);
360
-
361
- border-radius: var(--r-pill);
362
- font-family: var(--ff-ui);
363
- font-weight: 600;
364
- font-size: var(--fs-sm);
365
- letter-spacing: 0.01em;
366
- text-decoration: none;
367
- cursor: pointer;
368
- transition: filter var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
369
- }
370
- .btn-stamp:hover { filter: brightness(1.05); }
371
- .btn-stamp:active { filter: brightness(0.96); }
372
-
373
- .btn-stamp.green { background: var(--green); color: var(--green-fg); }
374
- .btn-stamp.purple { background: var(--purple); color: var(--purple-fg); }
375
- .btn-stamp.mascot { background: var(--mascot); color: var(--mascot-fg); }
376
- .btn-stamp.sun { background: var(--sun); color: var(--ink); }
377
- .btn-stamp.flame { background: var(--flame); color: var(--paper); }
378
- .btn-stamp.acid { background: var(--green); color: var(--green-fg); }
379
-
380
- /* Plain button — default */
381
- .btn {
382
- display: inline-flex;
383
- align-items: center;
384
- gap: var(--space-2);
385
- padding: var(--space-3) var(--space-5);
386
- background: var(--bg-2);
387
- color: var(--fg);
388
-
389
- border-radius: var(--r-pill);
390
- font-family: var(--ff-ui);
391
- font-weight: 500;
392
- font-size: var(--fs-sm);
393
- letter-spacing: 0.01em;
394
- text-decoration: none;
395
- cursor: pointer;
396
- transition: background var(--dur-base) var(--ease), color var(--dur-base) var(--ease);
397
- }
398
- .btn:hover { background: var(--green-2); color: var(--ink); }
399
- .btn:active { background: var(--green); color: var(--green-fg); }
400
-
401
- /* Ghost/link button */
402
- .btn-ghost {
403
- background: transparent;
404
-
405
- color: var(--fg);
406
- font-family: var(--ff-ui);
407
- font-size: var(--fs-sm);
408
- letter-spacing: 0.01em;
409
- padding: var(--space-2) var(--space-3);
410
- border-radius: var(--r-pill);
411
- cursor: pointer;
412
- text-decoration: none;
413
- transition: background var(--dur-base) var(--ease), color var(--dur-base) var(--ease);
414
- }
415
- .btn-ghost:hover { color: var(--ink); background: var(--green-2); }
416
-
417
- /* Input — softened: full border, rounded, 2px default */
418
- .input {
419
- width: 100%;
420
- background: var(--bg);
421
-
422
- border-radius: var(--r-2);
423
- padding: var(--space-3) var(--space-3);
424
- font-family: var(--ff-ui);
425
- font-size: var(--fs-body);
426
- color: var(--fg);
427
-
428
- transition: border-color var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
429
- }
430
- .input:focus {
431
-
432
- box-shadow: 0 0 0 4px color-mix(in oklab, var(--green) 25%, transparent);
433
- }
434
- .input::placeholder { color: var(--fg-3); }
435
-
436
- /* ============================================================
437
- Layout scaffolds
438
- ============================================================ */
439
-
440
- .page { min-height: 100vh; padding: var(--space-5); }
441
-
442
- .dateline {
443
- display: flex;
444
- justify-content: space-between;
445
- align-items: baseline;
446
- gap: var(--space-4);
447
- padding-bottom: var(--space-2);
448
-
449
- font-family: var(--ff-ui);
450
- font-size: var(--fs-xs);
451
- letter-spacing: 0.02em;
452
- color: var(--fg-3);
453
- }
454
- .dateline > * { white-space: nowrap; }
455
- .dateline .spread { flex: 1; align-self: center; }
456
-
457
- /* Index-card row — soft card with breathing room */
458
- .row {
459
- display: grid;
460
- grid-template-columns: 80px 1fr auto;
461
- gap: var(--space-4);
462
- padding: var(--space-4);
463
-
464
- border-radius: var(--r-3);
465
- background: var(--bg);
466
- align-items: baseline;
467
- margin-bottom: calc(var(--bw-hair) * -1);
468
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease), transform var(--dur-snap) var(--ease);
469
- }
470
- .row + .row { margin-top: var(--space-2); margin-bottom: 0; }
471
- .row .row-code { font-family: var(--ff-mono); font-size: var(--fs-xs); letter-spacing: 0.02em; color: var(--mono-1); }
472
- .row .row-title { font-family: var(--ff-display); font-weight: 700; font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); }
473
- .row .row-meta { font-family: var(--ff-ui); font-size: var(--fs-xs); letter-spacing: 0.02em; color: var(--fg-3); }
474
- .row:hover { background: var(--green-2); color: var(--ink); }
475
- .row:hover .row-code { color: var(--green-deep); }
476
- .row:hover .row-meta { color: var(--ink); }
477
-
478
- /* Soft card — the generic container */
479
- .card {
480
-
481
- border-radius: var(--r-3);
482
- background: var(--bg);
483
- padding: var(--space-5);
484
- }
485
- .card.chunk { }
486
-
487
- /* ============================================================
488
- Selection
489
- ============================================================ */
490
- ::selection { background: var(--mascot); color: var(--mascot-fg); }
491
-
492
-
493
- /* ============================================================
494
- Panel surface tokens — brand-bible parchment palette
495
- Light default. Dark via prefers-color-scheme or [data-theme="dark"].
496
- ============================================================ */
497
9
  :root {
498
- --panel-0: var(--paper); /* warm canvas */
499
- --panel-1: #FBF6EB;
500
- --panel-2: #F0E9DA;
501
- --panel-3: #E3DAC7;
502
- --panel-hover: #EBE1CD;
503
- --panel-select: #D8ECCB;
504
- --panel-text: var(--ink);
505
- --panel-text-2: #5A5246;
506
- --panel-text-3: #857B6C;
507
- --panel-accent: var(--green);
508
- --panel-accent-2: var(--green-deep);
509
- --panel-accent-fg: #ffffff;
510
- --panel-shadow: none;
511
- --panel-shadow-top: none;
10
+ /* Paper / Ink — cool stone scale; lets lore palette pop. */
11
+ --paper: #F6F5F1;
12
+ --paper-2: #ECEBE6;
13
+ --paper-3: #DFDED9;
14
+ --ink: #131318;
15
+ --ink-2: #25252C;
16
+ --ink-3: #6A6A70;
17
+
18
+ /* Lore palette */
19
+ --green: #247420;
20
+ --green-2: #3A9A34;
21
+ --green-deep: #133F10;
22
+ --green-tint: #D9E5C8;
23
+ --purple: #420247;
24
+ --purple-2: #7F18A4;
25
+ --purple-deep: #28002B;
26
+ --purple-tint: #E4D3E5;
27
+ --mascot: #E84B8A;
28
+ --mascot-2: #FF3CA7;
29
+ --mascot-tint: #F5D2DF;
30
+
31
+ /* Signals */
32
+ --sun: #F5C344;
33
+ --flame: #FF5A1F;
34
+ --sky: #3A6EFF;
35
+ --warn: #E0241A;
36
+ --live: var(--green);
37
+
38
+ /* Semantic surfaces */
39
+ --bg: var(--paper);
40
+ --bg-2: var(--paper-2);
41
+ --bg-3: var(--paper-3);
42
+ --fg: var(--ink);
43
+ --fg-2: var(--ink-2);
44
+ --fg-3: var(--ink-3);
45
+
46
+ --accent: var(--green);
47
+ --accent-fg: var(--paper);
48
+ --accent-tint: color-mix(in oklab, var(--accent) 18%, var(--bg));
49
+
50
+ --panel-bg: var(--bg);
51
+ --panel-bg-2: var(--bg-2);
52
+ --panel-accent: var(--accent);
53
+
54
+ /* Type — one family, used purposefully. Space Grotesk for everything
55
+ non-mono. The display/narrow aliases stay so consumers that reference
56
+ them keep working; they just resolve to the body font now. */
57
+ --ff-display: 'Space Grotesk', system-ui, sans-serif;
58
+ --ff-narrow: 'Space Grotesk', system-ui, sans-serif;
59
+ --ff-body: 'Space Grotesk', system-ui, sans-serif;
60
+ --ff-mono: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
61
+
62
+ --fs-micro: 11px;
63
+ --fs-tiny: 12px;
64
+ --fs-xs: 13px;
65
+ --fs-sm: 14px;
66
+ --fs-body: 16px;
67
+ --fs-lg: 18px;
68
+ --fs-xl: 21px;
69
+ --fs-h4: clamp(19px, 1.8cqi, 24px);
70
+ --fs-h3: clamp(22px, 2.4cqi, 30px);
71
+ --fs-h2: clamp(28px, 3.6cqi, 44px);
72
+ --fs-h1: clamp(34px, 5cqi, 64px);
73
+ --fs-hero: clamp(42px, 7cqi, 96px);
74
+ --fs-mega: clamp(56px, 11cqi, 168px);
75
+
76
+ --lh-tight: 1.05;
77
+ --lh-snug: 1.2;
78
+ --lh-base: 1.55;
79
+ --lh-long: 1.7;
80
+
81
+ --tr-caps: 0.06em;
82
+ --tr-label: 0.10em;
83
+ --tr-tight: -0.02em;
84
+ --tr-tighter: -0.03em;
85
+
86
+ /* Spacing (8pt) */
87
+ --space-0: 0;
88
+ --space-1: 4px;
89
+ --space-2: 8px;
90
+ --space-3: 16px;
91
+ --space-4: 24px;
92
+ --space-5: 32px;
93
+ --space-6: 48px;
94
+ --space-7: 64px;
95
+ --space-8: 96px;
96
+ --space-9: 128px;
97
+
98
+ --density: 1;
99
+ --pad-y: calc(var(--space-5) * var(--density));
100
+ --pad-x: calc(var(--space-5) * var(--density));
101
+ --gutter: calc(var(--space-4) * var(--density));
102
+
103
+ /* Borders — chunky or none */
104
+ --bw-hair: 1px;
105
+ --bw-rule: 2px;
106
+ --bw-chunk: 4px;
107
+ --bw-slab: 8px;
108
+
109
+ --rule: color-mix(in oklab, currentColor 14%, transparent);
110
+ --rule-strong: color-mix(in oklab, currentColor 28%, transparent);
111
+
112
+ --r-1: 10px;
113
+ --r-2: 14px;
114
+ --r-3: 22px;
115
+ --r-4: 32px;
116
+ --r-pill: 999px;
117
+
118
+ --dur-snap: 80ms;
119
+ --dur-base: 160ms;
120
+ --dur-slow: 280ms;
121
+ --ease: cubic-bezier(0.2, 0, 0, 1);
122
+
123
+ --z-header: 100;
124
+ --z-overlay: 1000;
125
+
126
+ --measure: 68ch;
512
127
  }
513
128
 
514
- @media (prefers-color-scheme: dark) {
515
- :root:not([data-theme="light"]) {
516
- --panel-0: #1A1B1E;
517
- --panel-1: #232428;
518
- --panel-2: #2B2D31;
519
- --panel-3: #36383E;
520
- --panel-hover: #36383E;
521
- --panel-select: #29402F;
522
- --panel-text: #ECEEF2;
523
- --panel-text-2: #BFC3CB;
524
- --panel-text-3: #92979F;
525
- --panel-accent: var(--green-2);
526
- --panel-accent-2: var(--green-2);
527
- --panel-accent-fg: var(--ink);
528
- --panel-shadow: none;
529
- --panel-shadow-top: none;
530
- }
531
- }
532
-
533
- [data-theme="dark"],
534
129
  [data-theme="ink"] {
535
- --panel-0: #1A1B1E;
536
- --panel-1: #232428;
537
- --panel-2: #2B2D31;
538
- --panel-3: #36383E;
539
- --panel-hover: #36383E;
540
- --panel-select: #29402F;
541
- --panel-text: #ECEEF2;
542
- --panel-text-2: #BFC3CB;
543
- --panel-text-3: #92979F;
544
- --panel-accent: var(--green-2);
545
- --panel-accent-2: var(--green-2);
546
- --panel-accent-fg: var(--ink);
547
- --panel-shadow: none;
548
- --panel-shadow-top: none;
549
- }
550
-
551
- [data-theme="light"] {
552
- --panel-0: var(--paper);
553
- --panel-1: #FBF6EB;
554
- --panel-2: #F0E9DA;
555
- --panel-3: #E3DAC7;
556
- --panel-hover: #EBE1CD;
557
- --panel-select: #D8ECCB;
558
- --panel-text: var(--ink);
559
- --panel-text-2: #4a473f;
560
- --panel-text-3: #6d675b;
561
- --panel-accent: var(--green);
562
- --panel-accent-2: var(--green-deep);
563
- --panel-accent-fg: #ffffff;
564
- --panel-shadow: none;
565
- }
566
-
567
- /* Foreground / background aliases derived from panel tokens */
568
- :root {
569
- --fg: var(--panel-text);
570
- --fg-3: var(--panel-text-3);
571
- --bg: var(--panel-0);
572
- --bg-2: var(--panel-2);
573
- }
574
- @media (prefers-color-scheme: dark) {
575
- :root:not([data-theme="light"]) {
576
- --fg: var(--panel-text);
577
- --fg-3: var(--panel-text-3);
578
- --bg: var(--panel-0);
579
- --bg-2: var(--panel-2);
580
- }
581
- }
582
- [data-theme="dark"],
583
- [data-theme="ink"] { --fg: var(--panel-text); --fg-3: var(--panel-text-3); --bg: var(--panel-0); --bg-2: var(--panel-2); }
584
- [data-theme="light"] { --fg: var(--panel-text); --fg-3: var(--panel-text-3); --bg: var(--panel-0); --bg-2: var(--panel-2); }
585
-
586
- /* Contrast safety on any acid/lime/mint surface — text must be ink,
587
- never light grey / white. Covers the --acid token and any hue that
588
- pairs a near-white fg against a near-white accent. */
589
- .on-acid, .on-lime, [data-accent="acid"], [data-accent="lime"] {
590
- background: var(--acid);
591
- color: var(--ink);
592
- }
593
- .on-acid *, .on-lime *, [data-accent="acid"] *, [data-accent="lime"] * {
594
- color: inherit;
595
- }
596
-
597
- /* Hard guard: accent backgrounds must use --panel-accent-fg, not literal white.
598
- In dark mode --panel-accent flips to a LIGHT mint; literal #fff text on top
599
- becomes invisible. Catch any drift via attribute-style selectors and the
600
- common chip/status/btn-primary/topbar-active patterns. */
601
- .chip.accent,
602
- .app-status,
603
- .app-status a,
604
- .app-topbar nav a.active,
605
- .btn-primary,
606
- [data-on-accent] {
607
- color: var(--panel-accent-fg) !important;
608
- }
609
- [data-on-accent] { background: var(--panel-accent); }
610
-
611
- /* Universal reset — no borders, no outlines except :focus-visible */
612
- *, *::before, *::after { box-sizing: border-box; border: 0 !important; outline: 0 !important; }
613
- :focus-visible { outline: 2px solid var(--panel-accent) !important; outline-offset: 2px; }
614
- html, body { margin: 0; padding: 0; }
615
-
616
- /* Button base reset — bare <button> is unstyled; use .btn/.btn-primary/.btn-ghost for styled buttons. */
617
- button {
618
- padding: 0;
619
- background: none;
620
- font-family: var(--ff-ui);
621
- font-size: var(--fs-sm);
622
- cursor: pointer;
623
- color: inherit;
624
- }
625
- textarea {
626
- padding: 10px 12px;
627
- border-radius: var(--r-2);
628
- font-family: var(--ff-ui);
629
- font-size: var(--fs-sm);
630
- background: var(--bg-2);
631
- color: var(--fg);
632
- resize: vertical;
633
- }
634
- textarea::placeholder { color: var(--fg-3); }
130
+ --bg: var(--ink);
131
+ --bg-2: var(--ink-2);
132
+ --bg-3: #34343C;
133
+ --fg: var(--paper);
134
+ --fg-2: var(--paper-2);
135
+ --fg-3: #9A9AA2;
136
+ --panel-bg: var(--bg);
137
+ --panel-bg-2: var(--bg-2);
138
+ --accent: var(--accent-bright, var(--green-2));
139
+ --accent-fg: var(--ink);
140
+ }
141
+
142
+ [data-density="compact"] { --density: 0.75; }
143
+ [data-density="comfortable"] { --density: 1; }
144
+ [data-density="spacious"] { --density: 1.35; }
145
+
146
+ [data-accent="green"] { --accent: var(--green); --accent-bright: var(--green-2); --accent-fg: var(--paper); --panel-accent: var(--green); }
147
+ [data-accent="purple"] { --accent: var(--purple); --accent-bright: #C277FF; --accent-fg: var(--paper); --panel-accent: var(--purple); }
148
+ [data-accent="mascot"] { --accent: var(--mascot); --accent-bright: var(--mascot-2); --accent-fg: var(--ink); --panel-accent: var(--mascot); }