agentgui 1.0.931 → 1.0.933

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 (129) hide show
  1. package/AGENTS.md +17 -12
  2. package/database.js +31 -2
  3. package/lib/http-handler.js +11 -25
  4. package/lib/routes-registry.js +4 -48
  5. package/lib/server-startup.js +3 -11
  6. package/lib/ws-setup.js +2 -1
  7. package/package.json +3 -3
  8. package/server.js +7 -1
  9. package/site/app/index.html +2 -2
  10. package/site/app/js/app.js +91 -86
  11. package/site/app/js/backend.js +1 -1
  12. package/static/lib/xstate.umd.min.js +1 -1
  13. package/lib/db-queries-chunks.js +0 -195
  14. package/lib/db-queries-chunks2.js +0 -82
  15. package/lib/db-queries-cleanup.js +0 -74
  16. package/lib/db-queries-del.js +0 -141
  17. package/lib/db-queries-events.js +0 -68
  18. package/lib/db-queries-import.js +0 -133
  19. package/lib/db-queries-messages.js +0 -102
  20. package/lib/db-queries-sessions.js +0 -112
  21. package/lib/db-queries-streams.js +0 -100
  22. package/lib/db-queries.js +0 -89
  23. package/lib/jsonl-parser.js +0 -190
  24. package/lib/jsonl-watcher.js +0 -64
  25. package/lib/routes-agent-actions.js +0 -61
  26. package/lib/routes-auth-config.js +0 -30
  27. package/lib/routes-conversations.js +0 -96
  28. package/lib/routes-debug.js +0 -119
  29. package/lib/routes-messages.js +0 -139
  30. package/lib/routes-runs.js +0 -156
  31. package/lib/routes-scripts.js +0 -135
  32. package/lib/routes-sessions.js +0 -144
  33. package/lib/routes-threads.js +0 -100
  34. package/lib/routes-util.js +0 -110
  35. package/lib/ws-handlers-conv.js +0 -138
  36. package/lib/ws-handlers-conv2.js +0 -169
  37. package/lib/ws-handlers-msg.js +0 -121
  38. package/lib/ws-handlers-queue.js +0 -56
  39. package/lib/ws-handlers-run.js +0 -182
  40. package/lib/ws-handlers-scripts.js +0 -66
  41. package/lib/ws-handlers-session.js +0 -105
  42. package/lib/ws-handlers-session2.js +0 -85
  43. package/lib/ws-legacy-handlers.js +0 -51
  44. package/static/app.js +0 -261
  45. package/static/css/app-shell.css +0 -419
  46. package/static/css/brand-bible.css +0 -591
  47. package/static/css/colors_and_type.css +0 -568
  48. package/static/css/gmail-skin.css +0 -663
  49. package/static/css/main.css +0 -4015
  50. package/static/css/tools-popup.css +0 -472
  51. package/static/index.html +0 -418
  52. package/static/js/agent-auth.js +0 -146
  53. package/static/js/app-shortcuts.js +0 -30
  54. package/static/js/audio-recorder-processor.js +0 -18
  55. package/static/js/client-agents.js +0 -155
  56. package/static/js/client-cache.js +0 -171
  57. package/static/js/client-conv.js +0 -198
  58. package/static/js/client-events.js +0 -164
  59. package/static/js/client-exec.js +0 -160
  60. package/static/js/client-helpers.js +0 -199
  61. package/static/js/client-load.js +0 -175
  62. package/static/js/client-render.js +0 -132
  63. package/static/js/client-scroll.js +0 -178
  64. package/static/js/client-status.js +0 -167
  65. package/static/js/client-streaming.js +0 -117
  66. package/static/js/client-streaming2.js +0 -116
  67. package/static/js/client-streaming3.js +0 -153
  68. package/static/js/client-streaming4.js +0 -194
  69. package/static/js/client-ui-controls.js +0 -170
  70. package/static/js/client-ui.js +0 -128
  71. package/static/js/client-ui2.js +0 -160
  72. package/static/js/client-url.js +0 -93
  73. package/static/js/client-utils.js +0 -174
  74. package/static/js/client-ws-msg.js +0 -88
  75. package/static/js/client-ws.js +0 -161
  76. package/static/js/client.js +0 -145
  77. package/static/js/codec.js +0 -4
  78. package/static/js/conv-list-machine.js +0 -145
  79. package/static/js/conv-list-renderer.js +0 -198
  80. package/static/js/conv-machine.js +0 -110
  81. package/static/js/conv-sidebar-actions.js +0 -188
  82. package/static/js/conv-sidebar-clone.js +0 -91
  83. package/static/js/conversations.js +0 -116
  84. package/static/js/dialogs-types.js +0 -111
  85. package/static/js/dialogs.js +0 -53
  86. package/static/js/event-filter-config.js +0 -36
  87. package/static/js/event-processor.js +0 -181
  88. package/static/js/features.js +0 -187
  89. package/static/js/image-loader-element.js +0 -76
  90. package/static/js/image-loader.js +0 -146
  91. package/static/js/prompt-machine.js +0 -108
  92. package/static/js/recording-machine.js +0 -49
  93. package/static/js/script-runner.js +0 -192
  94. package/static/js/state-barrier.js +0 -105
  95. package/static/js/streaming-renderer-dispatch.js +0 -144
  96. package/static/js/streaming-renderer-events.js +0 -163
  97. package/static/js/streaming-renderer-events2.js +0 -125
  98. package/static/js/streaming-renderer-params.js +0 -38
  99. package/static/js/streaming-renderer-render-misc.js +0 -107
  100. package/static/js/streaming-renderer-render.js +0 -181
  101. package/static/js/streaming-renderer-render2.js +0 -149
  102. package/static/js/streaming-renderer-render3.js +0 -142
  103. package/static/js/streaming-renderer-static.js +0 -181
  104. package/static/js/streaming-renderer-static2.js +0 -140
  105. package/static/js/streaming-renderer-stream.js +0 -170
  106. package/static/js/streaming-renderer-text.js +0 -185
  107. package/static/js/streaming-renderer-tools.js +0 -189
  108. package/static/js/streaming-renderer-tools2.js +0 -92
  109. package/static/js/streaming-renderer.js +0 -200
  110. package/static/js/syntax-highlighter-render.js +0 -72
  111. package/static/js/syntax-highlighter.js +0 -131
  112. package/static/js/terminal-machine.js +0 -51
  113. package/static/js/terminal.js +0 -178
  114. package/static/js/ui-components-rendering.js +0 -62
  115. package/static/js/ui-components.js +0 -88
  116. package/static/js/websocket-manager.js +0 -107
  117. package/static/js/ws-client.js +0 -87
  118. package/static/js/ws-core.js +0 -162
  119. package/static/js/ws-latency.js +0 -88
  120. package/static/js/ws-machine.js +0 -68
  121. package/static/lib/msgpackr.min.js +0 -2
  122. package/static/theme.js +0 -74
  123. package/static/vendor/highlight-js.css +0 -10
  124. package/static/vendor/highlight.min.js +0 -1244
  125. package/static/vendor/prism-dark.css +0 -129
  126. package/static/vendor/rippleui.css +0 -35
  127. package/static/vendor/xterm-addon-fit.min.js +0 -8
  128. package/static/vendor/xterm.css +0 -8
  129. package/static/vendor/xterm.min.js +0 -8
@@ -1,568 +0,0 @@
1
- /* ============================================================
2
- Design tokens — brand palette + type scale + motion
3
- Loads before any consumer rule; all var(--*) refs resolve.
4
- ============================================================ */
5
- :root {
6
- --paper: #EFE9DD;
7
- --ink: #0B0B09;
8
- --acid: #B8FF00;
9
- --link: #1F4DFF;
10
- --warn: #FF3B1F;
11
- --live: #00A86B;
12
-
13
- --green: #247420;
14
- --green-2: #92CEAC;
15
- --green-deep: #1c5a19;
16
- --green-fg: #FFFFFF;
17
- --purple: #420247;
18
- --purple-fg: #FFFFFF;
19
- --mascot: #E84B8A;
20
- --mascot-fg: #FFFFFF;
21
- --sun: #FFD100;
22
-
23
- --ff-display: 'Archivo Black', 'Archivo', system-ui, sans-serif;
24
- --ff-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
25
- --ff-prose: 'Instrument Serif', Georgia, serif;
26
-
27
- --fs-hero: 120px;
28
- --fs-h1: 64px;
29
- --fs-h2: 32px;
30
- --lh-tight: 1.05;
31
- --lh-snug: 1.2;
32
- --tr-tight: -0.02em;
33
-
34
- --dur-snap: 80ms;
35
- --dur-base: 160ms;
36
- --ease: cubic-bezier(0.2, 0, 0, 1);
37
-
38
- --surface-2: rgba(0,0,0,0.04);
39
- --surface-ink-2: rgba(255,255,255,0.06);
40
-
41
- --r-1: 0;
42
- --r-2: 0;
43
- --r-3: 0;
44
- --r-pill: 9999px;
45
-
46
- /* Extended brand palette */
47
- --flame: #FF5C1A;
48
- --sky: #3B82F6;
49
-
50
- /* Foreground / background aliases — resolved after panel tokens are set;
51
- these are reset below once panel tokens exist, but raw defaults here
52
- ensure no unsatisfied var() at parse time if panel tokens are absent. */
53
- --fg: #0B0B09;
54
- --fg-3: #6d675b;
55
- --bg: #EFE9DD;
56
- --bg-2: #ece5d8;
57
-
58
- /* Colorful-mono palette — canonical hue per slot */
59
- --mono-1: var(--green);
60
- --mono-2: var(--purple);
61
- --mono-3: var(--mascot);
62
- --mono-4: var(--sun);
63
- --mono-5: var(--flame);
64
- --mono-6: var(--sky);
65
-
66
- /* Spacing scale (4px base) */
67
- --space-1: 4px;
68
- --space-2: 8px;
69
- --space-3: 12px;
70
- --space-4: 16px;
71
- --space-5: 24px;
72
- --space-6: 32px;
73
- --space-7: 48px;
74
- --space-8: 64px;
75
-
76
- /* Border widths */
77
- --bw-hair: 1px;
78
- --bw-rule: 2px;
79
-
80
- /* Measure */
81
- --measure: 72ch;
82
-
83
- /* Extended type scale */
84
- --fs-body: 13px;
85
- --fs-lg: 14px;
86
- --fs-sm: 12px;
87
- --fs-xs: 11px;
88
- --fs-tiny: 11px;
89
- --fs-micro: 9px;
90
- --fs-h3: 14px;
91
- --fs-h4: 13px;
92
-
93
- /* Extended line heights */
94
- --lh-base: 1.5;
95
- --lh-long: 1.6;
96
-
97
- /* Extended letter spacing */
98
- --tr-label: 0.08em;
99
- --tr-caps: 0.05em;
100
-
101
- /* Font body alias */
102
- --ff-body: var(--ff-prose);
103
- }
104
-
105
- /* Rows: no separators, hover surface tint instead */
106
- .row { background: transparent; transition: background var(--dur-snap) var(--ease); }
107
- .row:hover { background: var(--surface-2); }
108
- [data-theme="ink"] .row:hover { background: var(--surface-ink-2); }
109
-
110
- body {
111
- background: var(--panel-0);
112
- color: var(--panel-text);
113
- font-family: var(--ff-mono);
114
- font-size: 13px;
115
- line-height: 1.5;
116
- -webkit-font-smoothing: antialiased;
117
- -moz-osx-font-smoothing: grayscale;
118
- text-rendering: optimizeLegibility;
119
- }
120
-
121
- /* ============================================================
122
- Semantic type classes
123
- ============================================================ */
124
-
125
- /* Hero — project name, once per page. Archivo Black territory. */
126
- .t-hero, h1.hero {
127
- font-family: var(--ff-display);
128
- font-size: clamp(64px, 12vw, var(--fs-hero));
129
- line-height: var(--lh-tight);
130
- letter-spacing: var(--tr-tight);
131
- font-weight: 800;
132
- margin: 0;
133
- }
134
-
135
- /* h1 — page title */
136
- .t-h1, h1 {
137
- font-family: var(--ff-display);
138
- font-size: clamp(40px, 6vw, var(--fs-h1));
139
- line-height: var(--lh-tight);
140
- letter-spacing: var(--tr-tight);
141
- font-weight: 700;
142
- margin: 0;
143
- }
144
-
145
- /* h2 — section */
146
- .t-h2, h2 {
147
- font-family: var(--ff-display);
148
- font-size: var(--fs-h2);
149
- line-height: var(--lh-snug);
150
- letter-spacing: var(--tr-tight);
151
- font-weight: 700;
152
- margin: 0;
153
- }
154
-
155
- /* h3 — subsection (mono, colorful-eligible) */
156
- .t-h3, h3 {
157
- font-family: var(--ff-mono);
158
- font-size: var(--fs-h3);
159
- line-height: var(--lh-snug);
160
- letter-spacing: 0;
161
- font-weight: 600;
162
- margin: 0;
163
- }
164
-
165
- /* h4 */
166
- .t-h4, h4 {
167
- font-family: var(--ff-mono);
168
- font-size: var(--fs-h4);
169
- line-height: var(--lh-snug);
170
- font-weight: 500;
171
- margin: 0;
172
- }
173
-
174
- /* Body UI — mono, the default UI voice */
175
- .t-body {
176
- font-family: var(--ff-mono);
177
- font-size: var(--fs-body);
178
- line-height: var(--lh-base);
179
- }
180
-
181
- /* Long-form prose — SANS, not serif. Space Grotesk. */
182
- .t-prose, .prose p {
183
- font-family: var(--ff-body);
184
- font-size: var(--fs-lg);
185
- line-height: var(--lh-long);
186
- max-width: var(--measure);
187
- text-wrap: pretty;
188
- font-weight: 400;
189
- }
190
- .prose p { margin: 0 0 var(--space-4) 0; }
191
-
192
- /* Label — mono caps, terminal voice */
193
- .t-label {
194
- font-family: var(--ff-mono);
195
- font-size: var(--fs-xs);
196
- text-transform: uppercase;
197
- letter-spacing: var(--tr-label);
198
- font-weight: 500;
199
- }
200
-
201
- /* Meta — mono, small, dim */
202
- .t-meta {
203
- font-family: var(--ff-mono);
204
- font-size: var(--fs-xs);
205
- color: var(--fg-3);
206
- }
207
-
208
- /* Micro — smallest, datelines */
209
- .t-micro {
210
- font-family: var(--ff-mono);
211
- font-size: var(--fs-micro);
212
- letter-spacing: var(--tr-label);
213
- text-transform: uppercase;
214
- color: var(--fg-3);
215
- }
216
-
217
- /* Pull — display, for section intros and callouts */
218
- .t-pull {
219
- font-family: var(--ff-display);
220
- font-size: var(--fs-h2);
221
- line-height: var(--lh-snug);
222
- font-weight: 600;
223
- max-width: 20ch;
224
- letter-spacing: var(--tr-tight);
225
- }
226
-
227
- /* Code */
228
- code, .t-code {
229
- font-family: var(--ff-mono);
230
- font-size: 0.9em;
231
- background: var(--bg-2);
232
- padding: 0.15em 0.5em;
233
-
234
- border-radius: var(--r-1);
235
- }
236
-
237
- /* ============================================================
238
- COLORFUL MONO — the signature treatment
239
- Mono is the UI voice. We don't leave it grey. Every mono block
240
- is allowed — encouraged — to carry a canonical hue per token.
241
- ============================================================ */
242
-
243
- /* Hue utilities — apply to mono runs to tint them */
244
- .mono-green { color: var(--mono-1); }
245
- .mono-purple { color: var(--mono-2); }
246
- .mono-mascot { color: var(--mono-3); }
247
- .mono-sun { color: var(--mono-4); }
248
- .mono-flame { color: var(--mono-5); }
249
- .mono-sky { color: var(--mono-6); }
250
- .mono-ink { color: var(--fg); }
251
- .mono-dim { color: var(--fg-3); }
252
-
253
- /* Highlight block — a mono run on a tinted bg with dark text */
254
- .hl-green { background: var(--green); color: var(--green-fg); padding: 0.08em 0.4em; border-radius: var(--r-1); }
255
- .hl-purple { background: var(--purple); color: var(--purple-fg); padding: 0.08em 0.4em; border-radius: var(--r-1); }
256
- .hl-mascot { background: var(--mascot); color: var(--mascot-fg); padding: 0.08em 0.4em; border-radius: var(--r-1); }
257
- .hl-sun { background: var(--sun); color: var(--ink); padding: 0.08em 0.4em; border-radius: var(--r-1); }
258
- .hl-flame { background: var(--flame); color: var(--paper); padding: 0.08em 0.4em; border-radius: var(--r-1); }
259
- .hl-sky { background: var(--sky); color: var(--paper); padding: 0.08em 0.4em; border-radius: var(--r-1); }
260
-
261
- /* Role-colored mono spans — semantic, self-documenting */
262
- .m-k { color: var(--mono-2); font-weight: 500; } /* keyword */
263
- .m-s { color: var(--mono-4); } /* string */
264
- .m-n { color: var(--mono-1); } /* number / live */
265
- .m-c { color: var(--fg-3); font-style: italic; } /* comment */
266
- .m-tag { color: var(--mono-3); } /* tag / mention */
267
- .m-op { color: var(--mono-5); } /* operator / punct */
268
- .m-ref { color: var(--mono-6); text-decoration: underline; text-underline-offset: 3px; }
269
-
270
- /* Links in prose */
271
- .prose a, a.t-link {
272
- color: var(--link);
273
- text-decoration: underline;
274
- text-underline-offset: 3px;
275
- text-decoration-thickness: 1px;
276
- }
277
- .prose a:hover, a.t-link:hover {
278
- background: var(--link);
279
- color: var(--paper);
280
- text-decoration: none;
281
- }
282
-
283
- /* ============================================================
284
- Primitives — rules, stamps, buttons
285
- ============================================================ */
286
-
287
- .rule { margin: 0; }
288
- .rule-double{ height: var(--bw-rule); margin: 0; }
289
- .rule-dotted{ margin: 0; }
290
- .rule-green { margin: 0; }
291
- .rule-purple{ margin: 0; }
292
- .rule-mascot{ margin: 0; }
293
-
294
- /* The 247420 stamp */
295
- .stamp {
296
- display: inline-block;
297
- padding: var(--space-1) var(--space-3);
298
-
299
- border-radius: var(--r-pill);
300
- color: var(--fg);
301
- background: transparent;
302
- font-family: var(--ff-mono);
303
- font-size: var(--fs-tiny);
304
- letter-spacing: var(--tr-label);
305
- text-transform: uppercase;
306
- font-weight: 600;
307
- transform: rotate(-2deg);
308
- }
309
- .stamp.ink { background: var(--fg); color: var(--bg); }
310
- .stamp.green { background: var(--green); color: var(--green-fg); }
311
- .stamp.purple { background: var(--purple); color: var(--purple-fg); }
312
- .stamp.mascot { background: var(--mascot); color: var(--mascot-fg); }
313
- .stamp.sun { background: var(--sun); color: var(--ink); }
314
- .stamp.flame { background: var(--flame); color: var(--paper); }
315
-
316
- /* Legacy alias — .stamp.acid now means green */
317
- .stamp.acid { background: var(--green); color: var(--green-fg); }
318
-
319
- /* The "stamp button" */
320
- .btn-stamp {
321
- display: inline-flex;
322
- align-items: center;
323
- gap: var(--space-2);
324
- padding: var(--space-3) var(--space-4);
325
- background: var(--fg);
326
- color: var(--bg);
327
-
328
- border-radius: var(--r-2);
329
- box-shadow: 4px 4px 0 var(--fg);
330
- font-family: var(--ff-mono);
331
- font-weight: 600;
332
- font-size: var(--fs-sm);
333
- text-transform: uppercase;
334
- letter-spacing: var(--tr-caps);
335
- text-decoration: none;
336
- cursor: pointer;
337
- transition: transform var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
338
- }
339
- .btn-stamp:hover { transform: translate(1px, 1px); box-shadow: 3px 3px 0 var(--fg); }
340
- .btn-stamp:active { transform: translate(4px, 4px); box-shadow: 0 0 0 var(--fg); }
341
-
342
- .btn-stamp.green { background: var(--green); color: var(--green-fg); box-shadow: 4px 4px 0 var(--ink); }
343
- .btn-stamp.purple { background: var(--purple); color: var(--purple-fg); box-shadow: 4px 4px 0 var(--ink); }
344
- .btn-stamp.mascot { background: var(--mascot); color: var(--mascot-fg); box-shadow: 4px 4px 0 var(--ink); }
345
- .btn-stamp.sun { background: var(--sun); color: var(--ink); box-shadow: 4px 4px 0 var(--ink); }
346
- .btn-stamp.flame { background: var(--flame); color: var(--paper); box-shadow: 4px 4px 0 var(--ink); }
347
- .btn-stamp.acid { background: var(--green); color: var(--green-fg); box-shadow: 4px 4px 0 var(--ink); } /* legacy */
348
-
349
- /* Plain button — default */
350
- .btn {
351
- display: inline-flex;
352
- align-items: center;
353
- gap: var(--space-2);
354
- padding: var(--space-3) var(--space-4);
355
- background: transparent;
356
- color: var(--fg);
357
-
358
- border-radius: var(--r-2);
359
- font-family: var(--ff-mono);
360
- font-weight: 500;
361
- font-size: var(--fs-sm);
362
- text-transform: uppercase;
363
- letter-spacing: var(--tr-caps);
364
- text-decoration: none;
365
- cursor: pointer;
366
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
367
- }
368
- .btn:hover { background: var(--fg); color: var(--bg); }
369
- .btn:active { background: var(--green); color: var(--green-fg); }
370
-
371
- /* Ghost/link button */
372
- .btn-ghost {
373
- background: transparent;
374
-
375
- color: var(--fg);
376
- font-family: var(--ff-mono);
377
- font-size: var(--fs-sm);
378
- text-transform: uppercase;
379
- letter-spacing: var(--tr-caps);
380
- padding: var(--space-2) 0;
381
- cursor: pointer;
382
- text-decoration: underline;
383
- text-underline-offset: 4px;
384
- }
385
- .btn-ghost:hover { color: var(--green-fg); background: var(--green); }
386
-
387
- /* Input — softened: full border, rounded, 2px default */
388
- .input {
389
- width: 100%;
390
- background: var(--bg);
391
-
392
- border-radius: var(--r-2);
393
- padding: var(--space-3) var(--space-3);
394
- font-family: var(--ff-mono);
395
- font-size: var(--fs-body);
396
- color: var(--fg);
397
-
398
- transition: border-color var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
399
- }
400
- .input:focus {
401
-
402
- box-shadow: 0 0 0 4px color-mix(in oklab, var(--green) 25%, transparent);
403
- }
404
- .input::placeholder { color: var(--fg-3); }
405
-
406
- /* ============================================================
407
- Layout scaffolds
408
- ============================================================ */
409
-
410
- .page { min-height: 100vh; padding: var(--space-5); }
411
-
412
- .dateline {
413
- display: flex;
414
- justify-content: space-between;
415
- align-items: baseline;
416
- gap: var(--space-4);
417
- padding-bottom: var(--space-2);
418
-
419
- font-family: var(--ff-mono);
420
- font-size: var(--fs-xs);
421
- text-transform: uppercase;
422
- letter-spacing: var(--tr-label);
423
- }
424
- .dateline > * { white-space: nowrap; }
425
- .dateline .spread { flex: 1; align-self: center; }
426
-
427
- /* Index-card row — soft card with breathing room */
428
- .row {
429
- display: grid;
430
- grid-template-columns: 80px 1fr auto;
431
- gap: var(--space-4);
432
- padding: var(--space-4);
433
-
434
- border-radius: var(--r-3);
435
- background: var(--bg);
436
- align-items: baseline;
437
- margin-bottom: calc(var(--bw-hair) * -1);
438
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease), transform var(--dur-snap) var(--ease);
439
- }
440
- .row + .row { margin-top: var(--space-2); margin-bottom: 0; }
441
- .row .row-code { font-family: var(--ff-mono); font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--mono-1); }
442
- .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); }
443
- .row .row-meta { font-family: var(--ff-mono); font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--fg-3); }
444
- .row:hover { background: var(--green); color: var(--green-fg); transform: translate(-2px, -2px); box-shadow: 4px 4px 0 var(--ink); }
445
- .row:hover .row-code { color: var(--sun); }
446
- .row:hover .row-meta { color: var(--green-fg); }
447
-
448
- /* Soft card — the generic container */
449
- .card {
450
-
451
- border-radius: var(--r-3);
452
- background: var(--bg);
453
- padding: var(--space-5);
454
- }
455
- .card.chunk { }
456
-
457
- /* ============================================================
458
- Selection
459
- ============================================================ */
460
- ::selection { background: var(--mascot); color: var(--mascot-fg); }
461
-
462
-
463
- /* ============================================================
464
- Panel surface tokens — brand-bible parchment palette
465
- Light default. Dark via prefers-color-scheme or [data-theme="dark"].
466
- ============================================================ */
467
- :root {
468
- --panel-0: var(--paper); /* #EFE9DD canvas */
469
- --panel-1: #f6f1e7;
470
- --panel-2: #ece5d8;
471
- --panel-3: #ddd4c3;
472
- --panel-hover: #e6dece;
473
- --panel-select: #d8eed6;
474
- --panel-text: var(--ink); /* #0B0B09 */
475
- --panel-text-2: #4a473f;
476
- --panel-text-3: #6d675b;
477
- --panel-accent: var(--green);
478
- --panel-accent-2: var(--green-deep);
479
- --panel-accent-fg: #ffffff;
480
- --panel-shadow: none;
481
- --panel-shadow-top: none;
482
- }
483
-
484
- @media (prefers-color-scheme: dark) {
485
- :root:not([data-theme="light"]) {
486
- --panel-0: #0B0B09;
487
- --panel-1: #141411;
488
- --panel-2: #1f1f1a;
489
- --panel-3: #2a2a23;
490
- --panel-hover: #24241f;
491
- --panel-select: #1f3520;
492
- --panel-text: #EFE9DD;
493
- --panel-text-2: #d2cab9;
494
- --panel-text-3: #afa797;
495
- --panel-accent: var(--green-2);
496
- --panel-accent-2: var(--green-2);
497
- --panel-accent-fg: var(--ink);
498
- --panel-shadow: none;
499
- --panel-shadow-top: none;
500
- }
501
- }
502
-
503
- [data-theme="dark"] {
504
- --panel-0: #0B0B09;
505
- --panel-1: #141411;
506
- --panel-2: #1f1f1a;
507
- --panel-3: #2a2a23;
508
- --panel-hover: #24241f;
509
- --panel-select: #1f3520;
510
- --panel-text: #EFE9DD;
511
- --panel-text-2: #d2cab9;
512
- --panel-text-3: #afa797;
513
- --panel-accent: var(--green-2);
514
- --panel-accent-2: var(--green-2);
515
- --panel-accent-fg: var(--ink);
516
- --panel-shadow: none;
517
- --panel-shadow-top: none;
518
- }
519
-
520
- [data-theme="light"] {
521
- --panel-0: var(--paper);
522
- --panel-1: #f6f1e7;
523
- --panel-2: #ece5d8;
524
- --panel-3: #ddd4c3;
525
- --panel-hover: #e6dece;
526
- --panel-select: #d8eed6;
527
- --panel-text: var(--ink);
528
- --panel-text-2: #4a473f;
529
- --panel-text-3: #6d675b;
530
- --panel-accent: var(--green);
531
- --panel-accent-2: var(--green-deep);
532
- --panel-accent-fg: #ffffff;
533
- --panel-shadow: none;
534
- }
535
-
536
- /* Foreground / background aliases derived from panel tokens */
537
- :root {
538
- --fg: var(--panel-text);
539
- --fg-3: var(--panel-text-3);
540
- --bg: var(--panel-0);
541
- --bg-2: var(--panel-2);
542
- }
543
- @media (prefers-color-scheme: dark) {
544
- :root:not([data-theme="light"]) {
545
- --fg: var(--panel-text);
546
- --fg-3: var(--panel-text-3);
547
- --bg: var(--panel-0);
548
- --bg-2: var(--panel-2);
549
- }
550
- }
551
- [data-theme="dark"] { --fg: var(--panel-text); --fg-3: var(--panel-text-3); --bg: var(--panel-0); --bg-2: var(--panel-2); }
552
- [data-theme="light"] { --fg: var(--panel-text); --fg-3: var(--panel-text-3); --bg: var(--panel-0); --bg-2: var(--panel-2); }
553
-
554
- /* Contrast safety on any acid/lime/mint surface — text must be ink,
555
- never light grey / white. Covers the --acid token and any hue that
556
- pairs a near-white fg against a near-white accent. */
557
- .on-acid, .on-lime, [data-accent="acid"], [data-accent="lime"] {
558
- background: var(--acid);
559
- color: var(--ink);
560
- }
561
- .on-acid *, .on-lime *, [data-accent="acid"] *, [data-accent="lime"] * {
562
- color: inherit;
563
- }
564
-
565
- /* Universal reset — no borders, no outlines except :focus-visible */
566
- *, *::before, *::after { box-sizing: border-box; border: 0 !important; outline: 0 !important; }
567
- :focus-visible { outline: 2px solid var(--panel-accent) !important; outline-offset: 2px; }
568
- html, body { margin: 0; padding: 0; }