anentrypoint-design 0.0.68 → 0.0.70

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/app-shell.css ADDED
@@ -0,0 +1,2001 @@
1
+ /* ============================================================
2
+ App shell — IDE-modern density patterns
3
+ Consumed by landing, ui_kits/*, docs, blog, slides
4
+ Light default · dark via prefers-color-scheme or [data-theme=dark]
5
+ ============================================================ */
6
+
7
+ html, body {
8
+ background: var(--panel-0);
9
+ color: var(--panel-text);
10
+ font-family: var(--ff-ui);
11
+ font-size: 14px;
12
+ line-height: 1.55;
13
+ }
14
+
15
+ .app {
16
+ height: 100vh;
17
+ display: flex;
18
+ flex-direction: column;
19
+ background: var(--panel-0);
20
+ overflow: hidden;
21
+ }
22
+
23
+ /* Top bar — sticky chrome, elevated via shadow so content doesn't bleed under */
24
+ .app-topbar {
25
+ position: sticky;
26
+ top: 0;
27
+ z-index: 100;
28
+ height: 56px;
29
+ background: var(--panel-0);
30
+ color: var(--panel-text);
31
+ display: flex;
32
+ align-items: center;
33
+ padding: 0 20px;
34
+ gap: 16px;
35
+ font-size: 13px;
36
+ flex-shrink: 0;
37
+ }
38
+ .app-topbar .menu {
39
+ width: 36px; height: 36px;
40
+ display: inline-flex; align-items: center; justify-content: center;
41
+ color: var(--panel-text-2);
42
+ background: transparent;
43
+ border-radius: 999px;
44
+ cursor: pointer;
45
+ font-family: var(--ff-ui);
46
+ font-size: 16px;
47
+ transition: background 80ms ease;
48
+ }
49
+ .app-topbar .menu:hover { background: var(--panel-hover); color: var(--panel-text); }
50
+ .app-search {
51
+ flex: 1;
52
+ max-width: 720px;
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 10px;
56
+ background: var(--panel-2);
57
+ border-radius: 999px;
58
+ padding: 0 18px;
59
+ height: 40px;
60
+ transition: background 80ms ease;
61
+ }
62
+ .app-search:hover, .app-search:focus-within { background: var(--panel-1); }
63
+ .app-search .icon { color: var(--panel-text-2); font-family: var(--ff-ui); font-size: 14px; }
64
+ .app-search input {
65
+ flex: 1;
66
+ background: transparent;
67
+ color: var(--panel-text);
68
+ font-family: inherit;
69
+ font-size: 14px;
70
+ height: 100%;
71
+ padding: 0;
72
+ }
73
+ .app-search input::placeholder { color: var(--panel-text-2); }
74
+ .app-topbar .brand {
75
+ font-weight: 600;
76
+ color: var(--panel-text);
77
+ display: inline-flex;
78
+ align-items: center;
79
+ }
80
+ .app-topbar .brand .slash { color: var(--panel-text-3); margin: 0 6px; font-weight: 400; }
81
+ .app-topbar nav {
82
+ display: flex;
83
+ gap: 2px;
84
+ margin-left: auto;
85
+ align-items: center;
86
+ }
87
+ .app-topbar nav a {
88
+ color: var(--panel-text-2);
89
+ text-decoration: none;
90
+ padding: 7px 14px;
91
+ font-size: 13px;
92
+ border-radius: 999px;
93
+ line-height: 1;
94
+ transition: background 80ms ease, color 80ms ease;
95
+ }
96
+ .app-topbar nav a:hover { background: var(--panel-hover); color: var(--panel-text); }
97
+ .app-topbar nav a.active:hover { filter: brightness(1.06); }
98
+ .app-topbar nav a.active { color: var(--panel-accent-fg); background: var(--panel-accent); }
99
+
100
+ /* Breadcrumb — under topbar */
101
+ .app-crumb {
102
+ position: sticky;
103
+ top: 40px;
104
+ z-index: 99;
105
+ background: var(--panel-1);
106
+ padding: 8px 20px;
107
+ font-family: var(--ff-ui);
108
+ font-size: 12px;
109
+ color: var(--panel-text-2);
110
+ display: flex;
111
+ gap: 6px;
112
+ align-items: center;
113
+ flex-shrink: 0;
114
+ }
115
+ .app-crumb .sep { color: var(--panel-text-3); }
116
+ .app-crumb .leaf { color: var(--panel-text); }
117
+
118
+ /* Shell body — optional sidebar + main */
119
+ .app-body {
120
+ display: grid;
121
+ grid-template-columns: 256px 1fr;
122
+ flex: 1;
123
+ min-height: 0;
124
+ background: var(--panel-0);
125
+ gap: 0;
126
+ transition: grid-template-columns var(--motion-fast, 220ms) ease;
127
+ }
128
+ .app-body.no-side { grid-template-columns: 1fr; }
129
+ .app-body.no-side > .app-main { grid-column: 1 / -1; }
130
+
131
+ .app-side-shell {
132
+ min-width: 0;
133
+ overflow: hidden;
134
+ opacity: 1;
135
+ transform: translateX(0);
136
+ transition: opacity var(--motion-fast, 220ms) ease, transform var(--motion-fast, 220ms) ease;
137
+ }
138
+ .app-body.no-side .app-side-shell {
139
+ opacity: 0;
140
+ transform: translateX(-12px);
141
+ pointer-events: none;
142
+ }
143
+
144
+ /* Sidebar */
145
+ .app-side {
146
+ background: var(--panel-0);
147
+ padding: 8px 0 24px 0;
148
+ overflow-y: auto;
149
+ height: 100%;
150
+ }
151
+ .app-side .group {
152
+ padding: 14px 18px 6px 18px;
153
+ font-family: var(--ff-ui);
154
+ font-size: 12px;
155
+ letter-spacing: 0.01em;
156
+ color: var(--panel-text-3);
157
+ font-weight: 600;
158
+ }
159
+ .app-side a {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 10px;
163
+ margin: 1px 8px;
164
+ padding: 6px 12px 6px 16px;
165
+ color: var(--panel-text);
166
+ text-decoration: none;
167
+ font-size: 13px;
168
+ border-radius: 999px;
169
+ transition: background 80ms ease;
170
+ }
171
+ .app-side a:hover { background: var(--panel-hover); }
172
+ .app-side a.active { background: var(--panel-select); color: var(--panel-text); font-weight: 600; }
173
+ .app-side a.active:hover { background: var(--panel-select); filter: brightness(0.97); }
174
+ .app-side a .glyph { color: var(--panel-text-2); font-family: var(--ff-ui); width: 14px; flex-shrink: 0; }
175
+ .app-side a.active .glyph { color: var(--panel-accent); }
176
+
177
+ /* Main content area */
178
+ .app-main {
179
+ background: var(--panel-0);
180
+ padding: 16px 20px 72px 20px;
181
+ overflow-y: auto;
182
+ min-height: 0;
183
+ }
184
+ .app-main.narrow { max-width: 820px; }
185
+ .app-main.centered { margin: 0 auto; }
186
+ .app-main.stage { background: var(--panel-1); border-radius: 18px; margin: 8px; padding: 24px 28px 56px 28px; }
187
+
188
+ .app-main h1 {
189
+ font-size: 28px;
190
+ font-weight: 600;
191
+ margin: 4px 0 4px 0;
192
+ color: var(--panel-text);
193
+ letter-spacing: -0.01em;
194
+ line-height: 1.2;
195
+ }
196
+ .app-main h2 {
197
+ font-size: 18px;
198
+ font-weight: 600;
199
+ margin: 32px 0 8px 0;
200
+ color: var(--panel-text);
201
+ letter-spacing: -0.005em;
202
+ }
203
+ .app-main h3 {
204
+ font-family: var(--ff-ui);
205
+ font-size: 13px;
206
+ font-weight: 600;
207
+ margin: 24px 0 8px 0;
208
+ color: var(--panel-accent);
209
+ letter-spacing: 0.01em;
210
+ }
211
+ .app-main p {
212
+ margin: 0 0 12px 0;
213
+ max-width: 72ch;
214
+ font-size: 14px;
215
+ line-height: 1.6;
216
+ color: var(--panel-text);
217
+ }
218
+ .app-main .lede {
219
+ font-size: 15px;
220
+ color: var(--panel-text-2);
221
+ margin: 0 0 24px 0;
222
+ max-width: 60ch;
223
+ }
224
+ .app-main a {
225
+ color: var(--panel-accent);
226
+ text-decoration: none;
227
+ }
228
+ .app-main a:hover { text-decoration: underline; text-underline-offset: 2px; }
229
+ .app-main code {
230
+ font-family: var(--ff-mono);
231
+ font-size: 12.5px;
232
+ background: var(--panel-2);
233
+ padding: 1px 6px;
234
+ border-radius: 6px;
235
+ color: var(--panel-text);
236
+ }
237
+ .app-main pre {
238
+ background: var(--panel-1);
239
+ padding: 14px 16px;
240
+ font-family: var(--ff-mono);
241
+ font-size: 12.5px;
242
+ line-height: 1.6;
243
+ color: var(--panel-text);
244
+ overflow-x: auto;
245
+ margin: 12px 0;
246
+ border-radius: 12px;
247
+ }
248
+ .app-main pre code { background: transparent; padding: 0; }
249
+ .app-main pre .c { color: var(--panel-text-2); }
250
+ .app-main pre .k { color: var(--panel-accent); }
251
+ .app-main pre .s { color: #ce9178; }
252
+
253
+ /* Panel — grouped content block, flat tonal surface */
254
+ .panel {
255
+ background: var(--panel-1);
256
+ border-radius: 20px;
257
+ overflow: hidden;
258
+ margin: 16px 0;
259
+ }
260
+ .panel-head {
261
+ padding: 14px 22px;
262
+ background: var(--panel-1);
263
+ font-family: var(--ff-ui);
264
+ font-size: 13px;
265
+ letter-spacing: 0.005em;
266
+ color: var(--panel-text-2);
267
+ font-weight: 600;
268
+ display: flex;
269
+ justify-content: space-between;
270
+ align-items: center;
271
+ gap: 12px;
272
+ }
273
+ .panel-body { padding: 12px 16px; background: var(--panel-1); }
274
+ .panel-body > .row, .panel-body > div > .row { border-radius: 0; margin-bottom: 0; }
275
+ .panel-body > .row-form, .panel-body > form.row-form { margin-bottom: 0; }
276
+
277
+ /* Row — airy list item, tonal hover/select */
278
+ .row {
279
+ display: grid;
280
+ grid-template-columns: 80px 1fr auto;
281
+ gap: 12px;
282
+ padding: 10px 20px;
283
+ align-items: baseline;
284
+ color: var(--panel-text);
285
+ text-decoration: none;
286
+ font-size: 13px;
287
+ cursor: pointer;
288
+ background: transparent;
289
+ transition: background 80ms ease;
290
+ }
291
+ .row:nth-child(even) { background: var(--panel-2); }
292
+ .row:hover { background: var(--panel-hover); }
293
+ .row.active { background: var(--panel-select); font-weight: 500; }
294
+ .row.active:hover { background: var(--panel-select); filter: brightness(0.97); }
295
+ .row .code {
296
+ font-family: var(--ff-mono);
297
+ font-size: 11px;
298
+ color: var(--panel-text-2);
299
+ letter-spacing: 0.02em;
300
+ }
301
+ .row .title { color: var(--panel-text); font-weight: 500; }
302
+ .row .sub { color: var(--panel-text-2); font-size: 12px; margin-left: 8px; font-weight: 400; }
303
+ .row .meta { color: var(--panel-text-2); font-size: 11px; text-align: right; font-family: var(--ff-ui); }
304
+
305
+ /* List — dense single-line item set, full-bleed. Drop into .app-main directly. */
306
+ .list {
307
+ background: var(--panel-1);
308
+ border-radius: 20px;
309
+ overflow: hidden;
310
+ margin: 8px 0;
311
+ }
312
+ .list-row {
313
+ display: grid;
314
+ grid-template-columns: 22px 18px 22px 200px 1fr auto 64px;
315
+ gap: 12px;
316
+ padding: 6px 16px;
317
+ align-items: center;
318
+ color: var(--panel-text-2);
319
+ text-decoration: none;
320
+ font-size: 13.5px;
321
+ line-height: 1.2;
322
+ cursor: pointer;
323
+ background: transparent;
324
+ transition: background 80ms ease;
325
+ min-height: 36px;
326
+ }
327
+ .list-row:nth-child(even) { background: var(--panel-2); }
328
+ .list-row:hover { background: var(--panel-hover); }
329
+ .list-row.unread { color: var(--panel-text); font-weight: 600; }
330
+ .list-row .check {
331
+ width: 18px; height: 18px;
332
+ border-radius: 4px;
333
+ background: var(--panel-2);
334
+ display: inline-block;
335
+ transition: background 80ms ease;
336
+ }
337
+ .list-row:hover .check { background: var(--panel-3); }
338
+ .list-row .star {
339
+ color: var(--panel-text-3);
340
+ font-family: var(--ff-ui);
341
+ font-size: 14px;
342
+ text-align: center;
343
+ cursor: pointer;
344
+ }
345
+ .list-row .star.on { color: var(--sun, #e0a200); }
346
+ .list-row .glyph {
347
+ color: var(--panel-text-3);
348
+ font-family: var(--ff-ui);
349
+ font-size: 14px;
350
+ text-align: center;
351
+ }
352
+ .list-row.unread .glyph { color: var(--panel-accent); }
353
+
354
+ /* Category color separation — left-edge tint band + glyph color via [data-cat] */
355
+ .list-row[data-cat] { box-shadow: inset 4px 0 0 transparent; transition: background 80ms ease, box-shadow 80ms ease; }
356
+ .list-row[data-cat="kit"] { box-shadow: inset 4px 0 0 var(--green); }
357
+ .list-row[data-cat="kit"] .glyph { color: var(--green); }
358
+ .list-row[data-cat="deck"] { box-shadow: inset 4px 0 0 var(--sun); }
359
+ .list-row[data-cat="deck"] .glyph { color: var(--sun); }
360
+ .list-row[data-cat="preview"] { box-shadow: inset 4px 0 0 var(--purple); }
361
+ .list-row[data-cat="preview"] .glyph { color: var(--purple); }
362
+ .list-row[data-cat="doc"] { box-shadow: inset 4px 0 0 var(--mascot); }
363
+ .list-row[data-cat="doc"] .glyph { color: var(--mascot); }
364
+ .list-row[data-cat="external"] { box-shadow: inset 4px 0 0 var(--panel-text-3); }
365
+ .list-row[data-cat="external"] .glyph { color: var(--panel-text-3); }
366
+
367
+ /* Label chip color variants — match the category */
368
+ .label[data-cat="kit"] { background: color-mix(in oklab, var(--green) 22%, var(--panel-2)); color: var(--panel-text); }
369
+ .label[data-cat="deck"] { background: color-mix(in oklab, var(--sun) 24%, var(--panel-2)); color: var(--panel-text); }
370
+ .label[data-cat="preview"] { background: color-mix(in oklab, var(--purple) 26%, var(--panel-2)); color: var(--panel-text); }
371
+ .label[data-cat="doc"] { background: color-mix(in oklab, var(--mascot) 22%, var(--panel-2)); color: var(--panel-text); }
372
+
373
+ /* Hover-reveal action strip on list rows */
374
+ .list-row .actions {
375
+ display: inline-flex;
376
+ gap: 2px;
377
+ opacity: 0;
378
+ transition: opacity 80ms ease;
379
+ }
380
+ .list-row:hover .actions { opacity: 1; }
381
+ .list-row:hover .meta .label { display: none; }
382
+ .list-row .actions .icon-btn {
383
+ width: 28px; height: 28px;
384
+ display: inline-flex; align-items: center; justify-content: center;
385
+ background: transparent;
386
+ color: var(--panel-text-2);
387
+ border-radius: 999px;
388
+ cursor: pointer;
389
+ font-family: var(--ff-ui);
390
+ font-size: 13px;
391
+ transition: background 80ms ease;
392
+ }
393
+ .list-row .actions .icon-btn:hover { background: var(--panel-3); color: var(--panel-text); }
394
+ .list-row .from {
395
+ color: inherit;
396
+ white-space: nowrap;
397
+ overflow: hidden;
398
+ text-overflow: ellipsis;
399
+ }
400
+ .list-row .subject {
401
+ color: var(--panel-text-2);
402
+ white-space: nowrap;
403
+ overflow: hidden;
404
+ text-overflow: ellipsis;
405
+ }
406
+ .list-row.unread .subject { color: var(--panel-text); }
407
+ .list-row .subject .preview {
408
+ color: var(--panel-text-2);
409
+ font-weight: 400;
410
+ margin-left: 8px;
411
+ }
412
+ .list-row.unread .subject .preview { color: var(--panel-text-2); font-weight: 400; }
413
+ .list-row .meta {
414
+ display: inline-flex;
415
+ gap: 6px;
416
+ align-items: center;
417
+ flex-shrink: 0;
418
+ }
419
+ .list-row .time {
420
+ color: var(--panel-text-2);
421
+ font-family: var(--ff-ui);
422
+ font-size: 11px;
423
+ text-align: right;
424
+ white-space: nowrap;
425
+ }
426
+ .list-row.unread .time { color: var(--panel-text); font-weight: 600; }
427
+
428
+ /* Label chip — tonal pill that lives next to the subject */
429
+ .label {
430
+ display: inline-flex;
431
+ align-items: center;
432
+ padding: 1px 8px;
433
+ border-radius: 999px;
434
+ font-family: var(--ff-ui);
435
+ font-size: 10.5px;
436
+ font-weight: 500;
437
+ color: var(--panel-text-2);
438
+ background: var(--panel-2);
439
+ white-space: nowrap;
440
+ text-transform: lowercase;
441
+ letter-spacing: 0.04em;
442
+ }
443
+ .list-row:nth-child(even) .label { background: var(--panel-3); }
444
+ .label.accent { background: color-mix(in oklab, var(--panel-accent) 22%, var(--panel-2)); color: var(--panel-text); }
445
+
446
+ /* Category tabs — Primary / Promotions / Updates pattern */
447
+ .tabs {
448
+ display: flex;
449
+ gap: 0;
450
+ margin: 0 0 8px 0;
451
+ border-radius: 16px 16px 0 0;
452
+ overflow: hidden;
453
+ background: var(--panel-1);
454
+ }
455
+ .tabs a {
456
+ flex: 1;
457
+ display: inline-flex;
458
+ align-items: center;
459
+ gap: 10px;
460
+ padding: 14px 20px;
461
+ color: var(--panel-text-2);
462
+ text-decoration: none;
463
+ font-size: 13px;
464
+ font-weight: 500;
465
+ background: transparent;
466
+ transition: background 80ms ease, color 80ms ease, box-shadow 80ms ease;
467
+ box-shadow: inset 0 -3px 0 transparent;
468
+ }
469
+ .tabs a:hover { background: var(--panel-hover); color: var(--panel-text); }
470
+ .tabs a.active {
471
+ color: var(--panel-accent);
472
+ box-shadow: inset 0 -3px 0 var(--panel-accent);
473
+ background: var(--panel-1);
474
+ }
475
+ .tabs a .glyph { color: var(--panel-text-3); font-family: var(--ff-ui); }
476
+ .tabs a.active .glyph { color: var(--panel-accent); }
477
+
478
+ /* Toolbar — sits above .list, holds bulk actions, sticky while scrolling */
479
+ .list-toolbar {
480
+ display: flex;
481
+ align-items: center;
482
+ gap: 4px;
483
+ padding: 6px 12px;
484
+ background: var(--panel-1);
485
+ border-radius: 16px 16px 0 0;
486
+ margin-top: 8px;
487
+ color: var(--panel-text-2);
488
+ font-size: 12px;
489
+ position: sticky;
490
+ top: 0;
491
+ z-index: 10;
492
+ }
493
+ .list-toolbar + .list { border-radius: 0 0 16px 16px; margin-top: 0; }
494
+ .list-toolbar .icon-btn {
495
+ width: 32px; height: 32px;
496
+ display: inline-flex; align-items: center; justify-content: center;
497
+ background: transparent;
498
+ color: var(--panel-text-2);
499
+ border-radius: 999px;
500
+ cursor: pointer;
501
+ font-family: var(--ff-ui);
502
+ font-size: 14px;
503
+ transition: background 80ms ease;
504
+ }
505
+ .list-toolbar .icon-btn:hover { background: var(--panel-hover); color: var(--panel-text); }
506
+ .list-toolbar .spacer { flex: 1; }
507
+ .list-toolbar .count { color: var(--panel-text-2); font-family: var(--ff-ui); font-size: 11px; padding: 0 8px; }
508
+
509
+ /* Floating action button — sidebar primary CTA */
510
+ .btn-fab {
511
+ display: inline-flex;
512
+ align-items: center;
513
+ gap: 12px;
514
+ margin: 0 16px 16px 16px;
515
+ padding: 14px 24px 14px 18px;
516
+ background: var(--panel-2);
517
+ color: var(--panel-text);
518
+ font-family: inherit;
519
+ font-size: 14px;
520
+ font-weight: 600;
521
+ border-radius: 999px;
522
+ cursor: pointer;
523
+ text-decoration: none;
524
+ transition: background 80ms ease;
525
+ }
526
+ .btn-fab:hover { background: var(--panel-hover); }
527
+ .btn-fab .icon { font-family: var(--ff-ui); font-size: 18px; color: var(--panel-accent); }
528
+
529
+ /* Sidebar count badge */
530
+ .app-side a .count {
531
+ margin-left: auto;
532
+ color: var(--panel-text-2);
533
+ font-family: var(--ff-ui);
534
+ font-size: 11px;
535
+ }
536
+ .app-side a.active .count { color: var(--panel-text); font-weight: 600; }
537
+
538
+ /* CLI install block */
539
+ .cli {
540
+ display: flex;
541
+ align-items: stretch;
542
+ background: var(--panel-1);
543
+ border-radius: 16px;
544
+ overflow: hidden;
545
+ font-family: var(--ff-mono);
546
+ font-size: 13px;
547
+ max-width: 640px;
548
+ margin: 12px 0;
549
+ }
550
+ .cli .prompt { padding: 10px 14px; color: var(--panel-accent); font-weight: 600; }
551
+ .cli .cmd { flex: 1; padding: 10px 0; color: var(--panel-text); }
552
+ .cli .copy {
553
+ padding: 0 16px;
554
+ background: var(--panel-2);
555
+ color: var(--panel-text-2);
556
+ cursor: pointer;
557
+ font-size: 12px;
558
+ letter-spacing: 0.01em;
559
+ display: flex;
560
+ align-items: center;
561
+ }
562
+ .cli .copy:hover { background: var(--panel-hover); color: var(--panel-text); }
563
+
564
+ /* Base input element styles — text-like inputs get tonal padding to match btn/textarea */
565
+ input[type="text"],
566
+ input[type="email"],
567
+ input[type="password"],
568
+ input[type="search"],
569
+ input[type="number"],
570
+ input:not([type]) {
571
+ padding: 8px 12px;
572
+ background: var(--panel-2);
573
+ color: var(--panel-text);
574
+ font-family: var(--ff-ui);
575
+ font-size: 14px;
576
+ border-radius: 10px;
577
+ border: 0;
578
+ outline: 0;
579
+ transition: background 80ms ease;
580
+ }
581
+ input[type="text"]:hover, input[type="text"]:focus,
582
+ input[type="email"]:hover, input[type="email"]:focus,
583
+ input[type="password"]:hover, input[type="password"]:focus,
584
+ input[type="search"]:hover, input[type="search"]:focus,
585
+ input[type="number"]:hover, input[type="number"]:focus,
586
+ input:not([type]):hover, input:not([type]):focus { background: var(--panel-3); }
587
+ input[type="text"]::placeholder, input[type="email"]::placeholder,
588
+ input[type="password"]::placeholder, input[type="search"]::placeholder,
589
+ input[type="number"]::placeholder, input:not([type])::placeholder { color: var(--panel-text-2); }
590
+
591
+ /* Buttons */
592
+ .btn {
593
+ display: inline-flex;
594
+ align-items: center;
595
+ gap: 6px;
596
+ padding: 8px 18px;
597
+ background: var(--panel-2);
598
+ color: var(--panel-text);
599
+ font-family: inherit;
600
+ font-size: 13px;
601
+ font-weight: 500;
602
+ border-radius: 999px;
603
+ cursor: pointer;
604
+ text-decoration: none;
605
+ transition: background 80ms ease;
606
+ }
607
+ .btn:hover { background: var(--panel-hover); }
608
+ .btn:active { background: var(--panel-3); }
609
+
610
+ .btn-primary {
611
+ display: inline-flex;
612
+ align-items: center;
613
+ gap: 6px;
614
+ padding: 8px 18px;
615
+ background: var(--panel-accent);
616
+ color: var(--panel-accent-fg);
617
+ font-family: inherit;
618
+ font-size: 13px;
619
+ font-weight: 500;
620
+ border-radius: 999px;
621
+ cursor: pointer;
622
+ text-decoration: none;
623
+ transition: background 80ms ease, filter 80ms ease;
624
+ }
625
+ .btn-primary:hover { background: var(--panel-accent-2); }
626
+ .btn-primary:active { filter: brightness(0.94); }
627
+
628
+ .btn-ghost {
629
+ display: inline-flex;
630
+ align-items: center;
631
+ gap: 6px;
632
+ padding: 8px 18px;
633
+ background: transparent;
634
+ color: var(--panel-text-2);
635
+ font-family: inherit;
636
+ font-size: 13px;
637
+ cursor: pointer;
638
+ text-decoration: none;
639
+ border-radius: 999px;
640
+ transition: background 80ms ease;
641
+ }
642
+ .btn-ghost:hover { background: var(--panel-hover); color: var(--panel-text); }
643
+
644
+ /* Tag / chip */
645
+ .chip {
646
+ display: inline-flex;
647
+ align-items: center;
648
+ padding: 3px 10px;
649
+ border-radius: 999px;
650
+ font-family: var(--ff-ui);
651
+ font-size: 11px;
652
+ font-weight: 500;
653
+ background: var(--panel-2);
654
+ color: var(--panel-text);
655
+ }
656
+ .chip.accent { background: var(--panel-accent); color: var(--panel-accent-fg); }
657
+ .chip.dim { color: var(--panel-text-2); background: var(--panel-1); }
658
+
659
+ /* Status bar — accent-colored footer */
660
+ .app-status {
661
+ height: 24px;
662
+ background: var(--panel-accent);
663
+ color: var(--panel-accent-fg);
664
+ display: flex;
665
+ align-items: center;
666
+ padding: 0 14px;
667
+ gap: 14px;
668
+ font-family: var(--ff-ui);
669
+ font-size: 11px;
670
+ flex-shrink: 0;
671
+ }
672
+ .app-status .spread { flex: 1; }
673
+ .app-status .item { display: flex; align-items: center; gap: 4px; }
674
+ .app-status a { color: var(--panel-accent-fg); text-decoration: none; }
675
+
676
+ /* Key-value table — zebra, no rules */
677
+ .kv {
678
+ width: 100%;
679
+ max-width: 640px;
680
+ background: var(--panel-1);
681
+ border-radius: 16px;
682
+ overflow: hidden;
683
+ border-collapse: collapse;
684
+ margin: 12px 0;
685
+ }
686
+ .kv td { padding: 10px 20px; font-size: 13px; }
687
+ .kv tr { transition: background 80ms ease; }
688
+ .kv tr:nth-child(even) { background: var(--panel-2); }
689
+ .kv tr:hover { background: var(--panel-hover); }
690
+ .kv td:first-child {
691
+ color: var(--panel-text-2);
692
+ font-family: var(--ff-ui);
693
+ font-size: 12px;
694
+ letter-spacing: 0.01em;
695
+ width: 160px;
696
+ }
697
+ .kv td:last-child { color: var(--panel-text); }
698
+
699
+ /* Card grid — landing index */
700
+ .cards {
701
+ display: grid;
702
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
703
+ gap: 8px;
704
+ margin: 12px 0 24px 0;
705
+ }
706
+ .card-item {
707
+ display: grid;
708
+ grid-template-columns: 44px 1fr;
709
+ gap: 10px;
710
+ padding: 18px 20px;
711
+ background: var(--panel-1);
712
+ color: var(--panel-text);
713
+ text-decoration: none;
714
+ align-items: baseline;
715
+ border-radius: 20px;
716
+ transition: background var(--dur-base, 160ms) ease;
717
+ }
718
+ .card-item:hover { background: var(--panel-hover); }
719
+ .card-item .code {
720
+ font-family: var(--ff-ui);
721
+ font-size: 11px;
722
+ color: var(--panel-accent);
723
+ letter-spacing: 0.04em;
724
+ font-weight: 600;
725
+ }
726
+ .card-item .name {
727
+ font-size: 13px;
728
+ font-weight: 500;
729
+ color: var(--panel-text);
730
+ }
731
+
732
+ /* Readability floor across all surfaces */
733
+ .app-side .group { font-size: 13px; }
734
+ .app-side a { font-size: 15px; }
735
+ .app-side a .count { font-size: 13px; }
736
+ .tabs a { font-size: 15px; }
737
+ .list-toolbar .count { font-size: 13px; }
738
+ .list-row .from, .list-row .subject { font-size: 15px; }
739
+ .list-row .time, .label { font-size: 13px; }
740
+
741
+ /* Scrollbars */
742
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
743
+ ::-webkit-scrollbar-thumb { background: var(--panel-3); border-radius: 5px; }
744
+ ::-webkit-scrollbar-thumb:hover { background: var(--panel-hover); }
745
+ ::-webkit-scrollbar-track { background: transparent; }
746
+
747
+ /* ============================================================
748
+ Chat & AICat — message thread + composer
749
+ Tonal panels, pill bubbles, monospace meta. Tokens-only.
750
+ ============================================================ */
751
+
752
+ .chat {
753
+ display: flex;
754
+ flex-direction: column;
755
+ background: var(--panel-1);
756
+ border-radius: 20px;
757
+ overflow: hidden;
758
+ margin: 12px 0;
759
+ max-width: 820px;
760
+ min-height: 480px;
761
+ }
762
+ .chat-head {
763
+ display: flex;
764
+ align-items: center;
765
+ gap: 10px;
766
+ padding: 12px 18px;
767
+ background: var(--panel-1);
768
+ color: var(--panel-text-2);
769
+ font-family: var(--ff-ui);
770
+ font-size: 13px;
771
+ font-weight: 600;
772
+ }
773
+ .chat-head .dot {
774
+ width: 8px; height: 8px; border-radius: 999px;
775
+ background: var(--panel-accent);
776
+ display: inline-block;
777
+ }
778
+ .chat-head .spread { flex: 1; }
779
+ .chat-head .sub { color: var(--panel-text-3); font-weight: 400; font-size: 12px; }
780
+
781
+ .chat-thread {
782
+ flex: 1;
783
+ padding: 18px 18px 8px 18px;
784
+ overflow-y: auto;
785
+ display: flex;
786
+ flex-direction: column;
787
+ gap: 14px;
788
+ background: var(--panel-1);
789
+ }
790
+
791
+ .chat-msg {
792
+ display: grid;
793
+ grid-template-columns: 32px minmax(0, 1fr);
794
+ gap: 10px;
795
+ align-items: start;
796
+ max-width: 92%;
797
+ }
798
+ .chat-msg.you {
799
+ grid-template-columns: minmax(0, 1fr) 32px;
800
+ margin-left: auto;
801
+ justify-self: end;
802
+ }
803
+ .chat-msg.you .chat-stack { align-items: flex-end; }
804
+ .chat-msg.you .chat-bubble { background: var(--panel-accent); color: var(--panel-accent-fg); border-radius: 18px 18px 4px 18px; }
805
+ .chat-msg.you .chat-meta { justify-content: flex-end; }
806
+
807
+ .chat-stack {
808
+ display: flex;
809
+ flex-direction: column;
810
+ align-items: flex-start;
811
+ gap: 4px;
812
+ min-width: 0;
813
+ }
814
+
815
+ .chat-avatar {
816
+ width: 32px; height: 32px;
817
+ border-radius: 999px;
818
+ background: var(--panel-2);
819
+ display: inline-flex;
820
+ align-items: center;
821
+ justify-content: center;
822
+ font-family: var(--ff-mono);
823
+ font-size: 14px;
824
+ color: var(--panel-text);
825
+ flex-shrink: 0;
826
+ line-height: 1;
827
+ }
828
+ .chat-msg.them .chat-avatar { grid-column: 1; }
829
+ .chat-msg.you .chat-avatar { grid-column: 2; background: var(--panel-accent); color: var(--panel-accent-fg); }
830
+
831
+ .chat-bubble {
832
+ background: var(--panel-2);
833
+ color: var(--panel-text);
834
+ padding: 10px 14px;
835
+ border-radius: 18px 18px 18px 4px;
836
+ font-size: 14px;
837
+ line-height: 1.5;
838
+ text-align: left;
839
+ white-space: pre-wrap;
840
+ overflow-wrap: anywhere;
841
+ max-width: 100%;
842
+ }
843
+
844
+ .chat-meta {
845
+ display: flex;
846
+ gap: 6px;
847
+ font-family: var(--ff-mono);
848
+ font-size: 10.5px;
849
+ color: var(--panel-text-3);
850
+ letter-spacing: 0.02em;
851
+ }
852
+
853
+ .chat-typing {
854
+ display: inline-flex;
855
+ align-items: center;
856
+ gap: 4px;
857
+ padding: 12px 14px;
858
+ background: var(--panel-2);
859
+ border-radius: 18px 18px 18px 4px;
860
+ }
861
+ .chat-typing span {
862
+ width: 6px; height: 6px;
863
+ border-radius: 999px;
864
+ background: var(--panel-text-3);
865
+ animation: chat-bounce 1.2s infinite ease-in-out;
866
+ }
867
+ .chat-typing span:nth-child(2) { animation-delay: 0.18s; }
868
+ .chat-typing span:nth-child(3) { animation-delay: 0.36s; }
869
+ @keyframes chat-bounce {
870
+ 0%, 80%, 100% { opacity: 0.3; transform: translateY(0); }
871
+ 40% { opacity: 1; transform: translateY(-4px); }
872
+ }
873
+
874
+ .chat-composer {
875
+ display: flex;
876
+ align-items: flex-end;
877
+ gap: 8px;
878
+ padding: 10px 12px;
879
+ background: var(--panel-1);
880
+ }
881
+ .chat-composer textarea {
882
+ flex: 1;
883
+ background: var(--panel-2);
884
+ color: var(--panel-text);
885
+ font-family: inherit;
886
+ font-size: 14px;
887
+ line-height: 1.5;
888
+ padding: 10px 14px;
889
+ border-radius: 18px;
890
+ resize: none;
891
+ min-height: 40px;
892
+ max-height: 140px;
893
+ border: 0;
894
+ outline: 0;
895
+ transition: background 80ms ease;
896
+ }
897
+ .chat-composer textarea:hover, .chat-composer textarea:focus { background: var(--panel-3); }
898
+ .chat-composer .send {
899
+ flex-shrink: 0;
900
+ width: 40px; height: 40px;
901
+ border-radius: 999px;
902
+ background: var(--panel-accent);
903
+ color: var(--panel-accent-fg);
904
+ display: inline-flex; align-items: center; justify-content: center;
905
+ cursor: pointer;
906
+ font-family: var(--ff-ui);
907
+ font-size: 18px;
908
+ transition: filter 80ms ease;
909
+ border: 0;
910
+ }
911
+ .chat-composer .send:hover { filter: brightness(1.06); }
912
+ .chat-composer .send:disabled { background: var(--panel-3); color: var(--panel-text-3); cursor: not-allowed; }
913
+
914
+ /* AICat — cat-themed AI assistant chat variant */
915
+ .aicat-portrait {
916
+ background: var(--panel-2);
917
+ border-radius: 16px;
918
+ padding: 18px 20px;
919
+ margin: 12px 0;
920
+ display: flex;
921
+ gap: 16px;
922
+ align-items: center;
923
+ max-width: 820px;
924
+ }
925
+ .aicat-face {
926
+ font-family: var(--ff-mono);
927
+ font-size: 13px;
928
+ line-height: 1.15;
929
+ color: var(--panel-accent);
930
+ white-space: pre;
931
+ background: var(--panel-1);
932
+ padding: 10px 14px;
933
+ border-radius: 12px;
934
+ margin: 0;
935
+ }
936
+ .aicat-meta { display: flex; flex-direction: column; gap: 4px; }
937
+ .aicat-meta .name { color: var(--panel-text); font-weight: 600; font-size: 15px; }
938
+ .aicat-meta .status { color: var(--panel-text-2); font-family: var(--ff-mono); font-size: 12px; }
939
+ .aicat-meta .status .dot { color: var(--panel-accent); }
940
+
941
+ .chat-msg.them.aicat .chat-avatar {
942
+ background: var(--panel-2);
943
+ color: var(--panel-accent);
944
+ font-size: 11px;
945
+ line-height: 1.0;
946
+ letter-spacing: -0.5px;
947
+ }
948
+
949
+ /* Inline elements inside bubbles */
950
+ .chat-bubble a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
951
+ .chat-bubble strong { font-weight: 600; }
952
+ .chat-bubble em { font-style: italic; }
953
+ .chat-bubble code.chat-tick {
954
+ font-family: var(--ff-mono);
955
+ font-size: 12px;
956
+ background: rgba(0,0,0,0.18);
957
+ padding: 1px 5px;
958
+ border-radius: 5px;
959
+ }
960
+ .chat-msg.you .chat-bubble code.chat-tick { background: rgba(255,255,255,0.22); }
961
+
962
+ /* Markdown-lite block bubble */
963
+ .chat-md p { margin: 0 0 8px 0; }
964
+ .chat-md p:last-child { margin-bottom: 0; }
965
+ .chat-md ul { margin: 4px 0 4px 0; padding-left: 18px; }
966
+ .chat-md li { margin: 2px 0; }
967
+
968
+ /* Code attachment */
969
+ .chat-code {
970
+ padding: 0;
971
+ overflow: hidden;
972
+ max-width: 100%;
973
+ background: var(--panel-1);
974
+ border-radius: 14px 14px 14px 6px;
975
+ width: 100%;
976
+ box-sizing: border-box;
977
+ }
978
+ .chat-msg.you .chat-code { border-radius: 14px 14px 6px 14px; background: var(--panel-1); color: var(--panel-text); }
979
+ .chat-code-head {
980
+ display: flex;
981
+ align-items: center;
982
+ gap: 10px;
983
+ padding: 8px 14px;
984
+ background: var(--panel-2);
985
+ color: var(--panel-text-2);
986
+ font-family: var(--ff-mono);
987
+ font-size: 11.5px;
988
+ letter-spacing: 0.02em;
989
+ }
990
+ .chat-code-head .lang { color: var(--panel-accent); font-weight: 600; text-transform: lowercase; }
991
+ .chat-code-head .name { color: var(--panel-text-2); }
992
+ .chat-code pre {
993
+ margin: 0;
994
+ padding: 12px 14px;
995
+ background: var(--panel-1);
996
+ color: var(--panel-text);
997
+ font-family: var(--ff-mono);
998
+ font-size: 12.5px;
999
+ line-height: 1.55;
1000
+ overflow-x: auto;
1001
+ max-width: 100%;
1002
+ box-sizing: border-box;
1003
+ }
1004
+ .chat-code pre code { background: transparent; padding: 0; font-family: inherit; font-size: inherit; }
1005
+
1006
+ /* Image attachment */
1007
+ .chat-image {
1008
+ display: block;
1009
+ max-width: 100%;
1010
+ border-radius: 14px 14px 14px 6px;
1011
+ overflow: hidden;
1012
+ background: var(--panel-2);
1013
+ text-decoration: none;
1014
+ color: inherit;
1015
+ }
1016
+ .chat-msg.you .chat-image { border-radius: 14px 14px 6px 14px; }
1017
+ .chat-image img { display: block; max-width: 360px; max-height: 320px; width: 100%; height: auto; object-fit: cover; }
1018
+ .chat-image .cap {
1019
+ display: block;
1020
+ padding: 6px 12px 8px 12px;
1021
+ font-size: 12px;
1022
+ color: var(--panel-text-2);
1023
+ }
1024
+
1025
+ /* PDF attachment */
1026
+ .chat-pdf {
1027
+ background: var(--panel-2);
1028
+ border-radius: 14px 14px 14px 6px;
1029
+ overflow: hidden;
1030
+ max-width: 100%;
1031
+ width: 360px;
1032
+ }
1033
+ .chat-msg.you .chat-pdf { border-radius: 14px 14px 6px 14px; }
1034
+ .chat-pdf-head {
1035
+ display: flex;
1036
+ align-items: center;
1037
+ gap: 8px;
1038
+ padding: 10px 12px;
1039
+ font-family: var(--ff-mono);
1040
+ font-size: 12px;
1041
+ color: var(--panel-text);
1042
+ background: var(--panel-1);
1043
+ }
1044
+ .chat-pdf-head .glyph { color: var(--mascot, #e0a200); font-size: 16px; }
1045
+ .chat-pdf-head .name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1046
+ .chat-pdf-head .size { color: var(--panel-text-3); font-size: 11px; }
1047
+ .chat-pdf-head .open { color: var(--panel-accent); text-decoration: none; font-size: 11px; padding: 2px 8px; border-radius: 999px; background: var(--panel-2); }
1048
+ .chat-pdf-head .open:hover { filter: brightness(1.1); }
1049
+ .chat-pdf embed { display: block; width: 100%; height: 280px; background: var(--panel-0); border: 0; }
1050
+
1051
+ /* Generic file attachment */
1052
+ .chat-file {
1053
+ display: grid;
1054
+ grid-template-columns: 36px 1fr 28px;
1055
+ gap: 12px;
1056
+ align-items: center;
1057
+ background: var(--panel-2);
1058
+ color: var(--panel-text);
1059
+ text-decoration: none;
1060
+ padding: 10px 14px;
1061
+ border-radius: 14px 14px 14px 6px;
1062
+ max-width: 360px;
1063
+ transition: background 80ms ease;
1064
+ }
1065
+ .chat-msg.you .chat-file { border-radius: 14px 14px 6px 14px; background: rgba(255,255,255,0.18); color: var(--panel-accent-fg); }
1066
+ .chat-file:hover { background: var(--panel-3); }
1067
+ .chat-msg.you .chat-file:hover { background: rgba(255,255,255,0.28); }
1068
+ .chat-file .glyph {
1069
+ width: 36px; height: 36px;
1070
+ display: inline-flex; align-items: center; justify-content: center;
1071
+ background: var(--panel-1);
1072
+ color: var(--panel-accent);
1073
+ border-radius: 10px;
1074
+ font-family: var(--ff-mono);
1075
+ font-size: 16px;
1076
+ }
1077
+ .chat-msg.you .chat-file .glyph { background: rgba(0,0,0,0.18); color: var(--panel-accent-fg); }
1078
+ .chat-file .meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
1079
+ .chat-file .name { font-size: 13px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1080
+ .chat-file .size { font-family: var(--ff-mono); font-size: 11px; color: var(--panel-text-3); letter-spacing: 0.02em; text-transform: uppercase; }
1081
+ .chat-msg.you .chat-file .size { color: rgba(255,255,255,0.7); }
1082
+ .chat-file .go { color: var(--panel-text-3); font-size: 14px; text-align: right; }
1083
+ .chat-msg.you .chat-file .go { color: rgba(255,255,255,0.7); }
1084
+
1085
+ /* Link card */
1086
+ .chat-link {
1087
+ display: flex;
1088
+ gap: 12px;
1089
+ background: var(--panel-2);
1090
+ color: var(--panel-text);
1091
+ text-decoration: none;
1092
+ padding: 10px 12px;
1093
+ border-radius: 14px 14px 14px 6px;
1094
+ max-width: 420px;
1095
+ transition: background 80ms ease;
1096
+ }
1097
+ .chat-msg.you .chat-link { border-radius: 14px 14px 6px 14px; background: rgba(255,255,255,0.18); color: var(--panel-accent-fg); }
1098
+ .chat-link:hover { background: var(--panel-3); }
1099
+ .chat-link .thumb { width: 64px; height: 64px; object-fit: cover; border-radius: 10px; flex-shrink: 0; background: var(--panel-1); }
1100
+ .chat-link .meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
1101
+ .chat-link .host { font-family: var(--ff-mono); font-size: 10.5px; color: var(--panel-text-3); letter-spacing: 0.02em; text-transform: uppercase; }
1102
+ .chat-msg.you .chat-link .host { color: rgba(255,255,255,0.7); }
1103
+ .chat-link .title { font-size: 13px; font-weight: 600; line-height: 1.35; }
1104
+ .chat-link .desc { font-size: 12px; color: var(--panel-text-2); line-height: 1.4; max-height: 2.8em; overflow: hidden; }
1105
+ .chat-msg.you .chat-link .desc { color: rgba(255,255,255,0.78); }
1106
+
1107
+ /* Reactions */
1108
+ .chat-reactions {
1109
+ display: flex;
1110
+ flex-wrap: wrap;
1111
+ gap: 4px;
1112
+ }
1113
+ .chat-reactions .rxn {
1114
+ display: inline-flex;
1115
+ align-items: center;
1116
+ gap: 4px;
1117
+ padding: 2px 8px;
1118
+ background: var(--panel-2);
1119
+ color: var(--panel-text-2);
1120
+ border-radius: 999px;
1121
+ font-family: var(--ff-ui);
1122
+ font-size: 11.5px;
1123
+ line-height: 1.3;
1124
+ cursor: pointer;
1125
+ transition: background 80ms ease;
1126
+ }
1127
+ .chat-reactions .rxn:hover { background: var(--panel-3); }
1128
+ .chat-reactions .rxn.you {
1129
+ background: color-mix(in oklab, var(--panel-accent) 26%, var(--panel-2));
1130
+ color: var(--panel-text);
1131
+ }
1132
+ .chat-reactions .rxn .e { font-size: 13px; }
1133
+ .chat-reactions .rxn .n { font-family: var(--ff-mono); font-size: 11px; }
1134
+
1135
+ /* Meta meta — name + tick */
1136
+ .chat-meta .who { color: var(--panel-text-2); font-family: var(--ff-ui); font-weight: 600; font-size: 11px; }
1137
+ .chat-meta .tick { color: var(--panel-text-3); }
1138
+ .chat-meta .tick.read { color: var(--panel-accent); }
1139
+
1140
+ /* Stack: when bubble is a card kind, give them a little gap */
1141
+ .chat-stack > .chat-image,
1142
+ .chat-stack > .chat-code,
1143
+ .chat-stack > .chat-pdf,
1144
+ .chat-stack > .chat-file,
1145
+ .chat-stack > .chat-link { max-width: 100%; }
1146
+
1147
+ /* ============================================================
1148
+ ds-* utility classes — replace inline styles in components
1149
+ ============================================================ */
1150
+
1151
+ .ds-hero { padding: 32px 32px 24px 32px; }
1152
+ .ds-hero-title { font-size: 36px; font-weight: 600; margin: 0 0 4px 0; color: var(--panel-text); letter-spacing: -0.01em; }
1153
+ .ds-hero-body { font-size: 14px; line-height: 1.55; color: var(--panel-text-2); max-width: 64ch; margin: 0 0 20px 0; }
1154
+ .ds-hero-accent { color: var(--panel-accent); font-weight: 500; }
1155
+
1156
+ .ds-section { padding: 20px 32px; }
1157
+
1158
+ .ds-link-accent { color: var(--panel-accent); text-decoration: none; }
1159
+
1160
+ .ds-changelog-row { grid-template-columns: 100px 70px 1fr; }
1161
+ .ds-changelog-ver { color: var(--panel-accent); font-family: var(--ff-mono); font-size: 14px; }
1162
+
1163
+ .work-detail {
1164
+ padding: 14px 20px 18px 86px;
1165
+ background: var(--panel-2);
1166
+ color: var(--panel-text);
1167
+ font-size: 13px;
1168
+ line-height: 1.6;
1169
+ }
1170
+ .ds-work-body { margin: 0 0 12px 0; max-width: 64ch; }
1171
+ .ds-work-actions { display: flex; gap: 8px; }
1172
+
1173
+ .panel.panel-inline { max-width: 560px; margin: 0; }
1174
+ .panel.panel-wide { max-width: 900px; }
1175
+ .panel.panel-manifesto { /* width comes from style attr */ }
1176
+
1177
+ .ds-manifesto { padding: 20px 24px; font-size: 14px; line-height: 1.7; color: var(--panel-text); }
1178
+ .ds-manifesto-para { margin: 0 0 12px 0; }
1179
+ .ds-manifesto-para.dim { color: var(--panel-text-2); }
1180
+
1181
+ .ds-pattern-notes {
1182
+ padding: 14px 20px;
1183
+ font-size: 13px;
1184
+ line-height: 1.65;
1185
+ color: var(--panel-text-2);
1186
+ }
1187
+ .ds-pattern-notes p { margin: 0 0 8px 0; }
1188
+ .ds-pattern-notes p:last-child { margin-bottom: 0; }
1189
+
1190
+ .ds-dot-live { color: var(--panel-accent); }
1191
+ .ds-dot-idle { color: var(--panel-text-3); }
1192
+
1193
+ .crumb-right { margin-left: auto; display: flex; gap: 10px; align-items: center; }
1194
+
1195
+ /* ============================================================
1196
+ Marked block markdown inside .chat-md (rendered via innerHTML
1197
+ so styling applies to real tags rather than vnodes).
1198
+ ============================================================ */
1199
+ .chat-md h1, .chat-md h2, .chat-md h3, .chat-md h4 {
1200
+ margin: 8px 0 6px 0;
1201
+ color: var(--panel-text);
1202
+ font-weight: 600;
1203
+ line-height: 1.25;
1204
+ }
1205
+ .chat-md h1 { font-size: 17px; }
1206
+ .chat-md h2 { font-size: 15px; }
1207
+ .chat-md h3 { font-size: 14px; }
1208
+ .chat-md p { margin: 0 0 8px 0; }
1209
+ .chat-md p:last-child { margin-bottom: 0; }
1210
+ .chat-md ul, .chat-md ol { margin: 4px 0; padding-left: 18px; }
1211
+ .chat-md li { margin: 2px 0; }
1212
+ .chat-md blockquote {
1213
+ margin: 6px 0;
1214
+ padding: 4px 12px;
1215
+ border-left: 3px solid var(--panel-accent);
1216
+ color: var(--panel-text-2);
1217
+ background: var(--panel-1);
1218
+ border-radius: 0 6px 6px 0;
1219
+ }
1220
+ .chat-md hr { border: 0; border-top: 1px solid var(--panel-3); margin: 8px 0; }
1221
+ .chat-md table { border-collapse: collapse; margin: 6px 0; font-size: 12.5px; }
1222
+ .chat-md th, .chat-md td { padding: 4px 10px; border-bottom: 1px solid var(--panel-3); text-align: left; }
1223
+ .chat-md a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
1224
+ .chat-md code {
1225
+ font-family: var(--ff-mono);
1226
+ font-size: 12px;
1227
+ background: rgba(0,0,0,0.18);
1228
+ padding: 1px 5px;
1229
+ border-radius: 5px;
1230
+ }
1231
+ .chat-msg.you .chat-md code { background: rgba(255,255,255,0.22); }
1232
+ .chat-md pre {
1233
+ margin: 6px 0;
1234
+ padding: 10px 12px;
1235
+ background: var(--panel-1);
1236
+ border-radius: 8px;
1237
+ overflow-x: auto;
1238
+ font-family: var(--ff-mono);
1239
+ font-size: 12.5px;
1240
+ }
1241
+ .chat-md pre code { background: transparent; padding: 0; }
1242
+
1243
+
1244
+ /* ============================================================
1245
+ File browser surfaces — FileRow, FileGrid, DropZone, FileViewer,
1246
+ modals. Rail color is keyed by [data-file-type] so consumers
1247
+ never apply .rail-* manually. The seven canonical types:
1248
+ dir image video audio code text archive document (+symlink, other).
1249
+ ============================================================ */
1250
+
1251
+ .ds-file-toolbar {
1252
+ display: flex;
1253
+ align-items: center;
1254
+ justify-content: space-between;
1255
+ gap: var(--space-3);
1256
+ padding: var(--space-3) var(--space-4);
1257
+ background: var(--panel-1);
1258
+ border-radius: var(--r-3);
1259
+ margin-bottom: var(--space-3);
1260
+ }
1261
+ .ds-file-toolbar-left, .ds-file-toolbar-right {
1262
+ display: flex; align-items: center; gap: var(--space-2);
1263
+ }
1264
+
1265
+ .ds-file-grid {
1266
+ display: flex;
1267
+ flex-direction: column;
1268
+ gap: var(--space-2);
1269
+ }
1270
+
1271
+ .ds-file-row {
1272
+ display: grid;
1273
+ grid-template-columns: auto 28px 1fr auto auto;
1274
+ gap: var(--space-3);
1275
+ align-items: center;
1276
+ padding: var(--space-3) var(--space-4);
1277
+ background: var(--panel-1);
1278
+ border-radius: var(--r-3);
1279
+ cursor: pointer;
1280
+ transition: background var(--dur-snap) var(--ease);
1281
+ }
1282
+ .ds-file-row:hover { background: var(--panel-hover); }
1283
+ .ds-file-row.active { background: var(--panel-select); }
1284
+ .ds-file-row > .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--panel-text-3); }
1285
+ .ds-file-row > .title { font-weight: 500; color: var(--panel-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1286
+ .ds-file-row > .meta { font-size: var(--fs-xs); color: var(--panel-text-3); white-space: nowrap; }
1287
+
1288
+ .ds-file-icon {
1289
+ display: inline-flex; align-items: center; justify-content: center;
1290
+ width: 28px; height: 28px;
1291
+ font-family: var(--ff-mono);
1292
+ font-size: 16px;
1293
+ color: var(--panel-text-2);
1294
+ }
1295
+
1296
+ /* File-type rail mapping — owned by [data-file-type] attribute */
1297
+ .ds-file-row[data-file-type="image"] { box-shadow: inset 4px 0 0 var(--sky); }
1298
+ .ds-file-row[data-file-type="video"] { box-shadow: inset 4px 0 0 var(--purple); }
1299
+ .ds-file-row[data-file-type="audio"] { box-shadow: inset 4px 0 0 var(--mascot); }
1300
+ .ds-file-row[data-file-type="code"] { box-shadow: inset 4px 0 0 var(--green); }
1301
+ .ds-file-row[data-file-type="text"] { box-shadow: inset 4px 0 0 var(--mascot); }
1302
+ .ds-file-row[data-file-type="archive"] { box-shadow: inset 4px 0 0 var(--flame); }
1303
+ .ds-file-row[data-file-type="document"] { box-shadow: inset 4px 0 0 var(--sun); }
1304
+ .ds-file-row[data-file-type="dir"] { box-shadow: inset 4px 0 0 var(--green); }
1305
+ .ds-file-row[data-file-type="symlink"] { box-shadow: inset 4px 0 0 var(--sky); }
1306
+ .ds-file-row[data-file-type="other"] { box-shadow: inset 4px 0 0 var(--panel-text-3); }
1307
+
1308
+ .ds-file-icon[data-file-type="image"] { color: var(--sky); }
1309
+ .ds-file-icon[data-file-type="video"] { color: var(--purple); }
1310
+ .ds-file-icon[data-file-type="audio"] { color: var(--mascot); }
1311
+ .ds-file-icon[data-file-type="code"] { color: var(--green); }
1312
+ .ds-file-icon[data-file-type="text"] { color: var(--mascot); }
1313
+ .ds-file-icon[data-file-type="archive"] { color: var(--flame); }
1314
+ .ds-file-icon[data-file-type="document"] { color: var(--sun); }
1315
+ .ds-file-icon[data-file-type="dir"] { color: var(--green); }
1316
+ .ds-file-icon[data-file-type="symlink"] { color: var(--sky); }
1317
+
1318
+ .ds-file-actions { display: inline-flex; gap: 4px; }
1319
+ .ds-file-act {
1320
+ width: 28px; height: 28px;
1321
+ display: inline-flex; align-items: center; justify-content: center;
1322
+ background: transparent;
1323
+ color: var(--panel-text-2);
1324
+ border-radius: var(--r-1);
1325
+ cursor: pointer;
1326
+ font-size: 14px;
1327
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1328
+ }
1329
+ .ds-file-act:hover { background: var(--panel-2); color: var(--panel-text); }
1330
+ .ds-file-act-warn:hover { background: var(--warn); color: var(--paper); }
1331
+
1332
+ .ds-file-empty {
1333
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
1334
+ padding: var(--space-7) var(--space-4);
1335
+ gap: var(--space-2);
1336
+ color: var(--panel-text-3);
1337
+ background: var(--panel-1);
1338
+ border-radius: var(--r-3);
1339
+ }
1340
+ .ds-file-empty-glyph { font-family: var(--ff-mono); font-size: 32px; }
1341
+ .ds-file-empty-text { font-size: var(--fs-sm); }
1342
+
1343
+ /* DropZone */
1344
+ .ds-dropzone {
1345
+ display: block;
1346
+ padding: var(--space-4);
1347
+ border-radius: var(--r-3);
1348
+ background: var(--panel-1);
1349
+ transition: background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
1350
+ }
1351
+ .ds-dropzone.dragover {
1352
+ background: var(--panel-select);
1353
+ box-shadow: inset 0 0 0 2px var(--green);
1354
+ }
1355
+ .ds-dropzone-inner {
1356
+ display: flex; align-items: center; gap: var(--space-3);
1357
+ }
1358
+ .ds-dropzone-glyph { font-family: var(--ff-mono); font-size: 20px; color: var(--green); }
1359
+ .ds-dropzone-label { color: var(--panel-text-2); font-size: var(--fs-sm); flex: 1; }
1360
+
1361
+ /* Upload progress */
1362
+ .ds-upload-progress {
1363
+ display: flex; flex-direction: column; gap: var(--space-2);
1364
+ padding: var(--space-3) var(--space-4);
1365
+ background: var(--panel-1);
1366
+ border-radius: var(--r-3);
1367
+ margin-top: var(--space-3);
1368
+ }
1369
+ .ds-upload-item { display: grid; grid-template-columns: 1fr 120px 40px; gap: var(--space-3); align-items: center; }
1370
+ .ds-upload-name { font-size: var(--fs-xs); color: var(--panel-text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1371
+ .ds-upload-bar { position: relative; height: 6px; background: var(--panel-2); border-radius: var(--r-pill); overflow: hidden; }
1372
+ .ds-upload-fill {
1373
+ position: absolute; left: 0; top: 0; bottom: 0;
1374
+ background: var(--green);
1375
+ width: 0%;
1376
+ transition: width var(--dur-base) var(--ease);
1377
+ }
1378
+ /* Width set via attr — generated runtime via inline style is the only carve-out the kit allows. */
1379
+ .ds-upload-fill[data-pct="0"] { width: 0%; }
1380
+ .ds-upload-fill[data-pct="10"] { width: 10%; } .ds-upload-fill[data-pct="20"] { width: 20%; }
1381
+ .ds-upload-fill[data-pct="30"] { width: 30%; } .ds-upload-fill[data-pct="40"] { width: 40%; }
1382
+ .ds-upload-fill[data-pct="50"] { width: 50%; } .ds-upload-fill[data-pct="60"] { width: 60%; }
1383
+ .ds-upload-fill[data-pct="70"] { width: 70%; } .ds-upload-fill[data-pct="80"] { width: 80%; }
1384
+ .ds-upload-fill[data-pct="90"] { width: 90%; } .ds-upload-fill[data-pct="100"] { width: 100%; }
1385
+ .ds-upload-pct { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--panel-text-3); text-align: right; }
1386
+ .ds-upload-item.done .ds-upload-fill { background: var(--live); }
1387
+ .ds-upload-item.error .ds-upload-fill { background: var(--warn); }
1388
+
1389
+ /* BreadcrumbPath */
1390
+ .ds-crumb-path { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; font-size: var(--fs-sm); }
1391
+ .ds-crumb-seg {
1392
+ background: transparent; color: var(--panel-text-2);
1393
+ padding: var(--space-1) var(--space-2); border-radius: var(--r-1);
1394
+ cursor: pointer; font-family: var(--ff-ui); font-size: var(--fs-sm);
1395
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1396
+ }
1397
+ .ds-crumb-seg:hover { background: var(--panel-2); color: var(--panel-text); }
1398
+ .ds-crumb-seg.leaf { color: var(--panel-accent); font-weight: 600; }
1399
+ .ds-crumb-sep { color: var(--panel-text-3); font-family: var(--ff-mono); }
1400
+
1401
+ /* Modal backdrop & shells */
1402
+ .ds-modal-backdrop {
1403
+ position: fixed; inset: 0;
1404
+ background: color-mix(in oklab, var(--ink) 55%, transparent);
1405
+ display: flex; align-items: center; justify-content: center;
1406
+ padding: var(--space-4);
1407
+ z-index: 1000;
1408
+ }
1409
+ .ds-modal {
1410
+ background: var(--panel-1);
1411
+ color: var(--panel-text);
1412
+ border-radius: var(--r-3);
1413
+ padding: 0;
1414
+ max-width: min(92vw, 560px);
1415
+ max-height: 92vh;
1416
+ overflow: hidden;
1417
+ display: flex; flex-direction: column;
1418
+ }
1419
+ .ds-modal-small { max-width: min(92vw, 420px); }
1420
+ .ds-modal-preview { max-width: min(96vw, 1080px); width: 100%; }
1421
+ .ds-modal-head {
1422
+ padding: var(--space-3) var(--space-4);
1423
+ background: var(--panel-2);
1424
+ font-weight: 600;
1425
+ display: flex; align-items: center; gap: var(--space-3);
1426
+ }
1427
+ .ds-modal-body {
1428
+ padding: var(--space-4);
1429
+ overflow: auto;
1430
+ }
1431
+ .ds-modal-actions {
1432
+ padding: var(--space-3) var(--space-4);
1433
+ background: var(--panel-2);
1434
+ display: flex; gap: var(--space-2); justify-content: flex-end;
1435
+ }
1436
+ .ds-modal-input { width: 100%; }
1437
+
1438
+ /* FileViewer */
1439
+ .ds-preview-head { box-shadow: inset 4px 0 0 var(--panel-text-3); }
1440
+ .ds-preview-head[data-file-type="image"] { box-shadow: inset 4px 0 0 var(--sky); }
1441
+ .ds-preview-head[data-file-type="video"] { box-shadow: inset 4px 0 0 var(--purple); }
1442
+ .ds-preview-head[data-file-type="audio"] { box-shadow: inset 4px 0 0 var(--mascot); }
1443
+ .ds-preview-head[data-file-type="code"] { box-shadow: inset 4px 0 0 var(--green); }
1444
+ .ds-preview-head[data-file-type="text"] { box-shadow: inset 4px 0 0 var(--mascot); }
1445
+ .ds-preview-head[data-file-type="archive"] { box-shadow: inset 4px 0 0 var(--flame); }
1446
+ .ds-preview-head[data-file-type="document"] { box-shadow: inset 4px 0 0 var(--sun); }
1447
+ .ds-preview-name { flex: 1; font-family: var(--ff-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1448
+ .ds-preview-meta { color: var(--panel-text-3); font-size: var(--fs-xs); font-family: var(--ff-mono); }
1449
+ .ds-preview-actions { display: inline-flex; gap: 4px; }
1450
+ .ds-preview-body {
1451
+ flex: 1; overflow: auto;
1452
+ background: var(--panel-0);
1453
+ padding: var(--space-3);
1454
+ min-height: 200px;
1455
+ display: flex; align-items: center; justify-content: center;
1456
+ }
1457
+ .ds-preview-body[data-file-type="code"], .ds-preview-body[data-file-type="text"] {
1458
+ align-items: stretch; justify-content: stretch; padding: 0;
1459
+ }
1460
+ .ds-preview-media { max-width: 100%; max-height: 70vh; display: block; }
1461
+ .ds-preview-audio { width: 100%; }
1462
+ .ds-preview-fallback { display: flex; flex-direction: column; align-items: center; gap: var(--space-2); color: var(--panel-text-3); padding: var(--space-6); }
1463
+ .ds-preview-glyph { font-family: var(--ff-mono); font-size: 48px; color: var(--panel-text-3); }
1464
+ .ds-preview-code, .ds-preview-text {
1465
+ margin: 0;
1466
+ padding: var(--space-4);
1467
+ background: var(--panel-2);
1468
+ color: var(--panel-text);
1469
+ font-family: var(--ff-mono);
1470
+ font-size: 12.5px;
1471
+ line-height: 1.55;
1472
+ overflow: auto;
1473
+ width: 100%;
1474
+ max-height: 70vh;
1475
+ }
1476
+ .ds-preview-code code, .ds-preview-text code { background: transparent; padding: 0; font-size: inherit; }
1477
+
1478
+ /* Large-screen responsive layout */
1479
+ @media (min-width: 1280px) {
1480
+ .app-body { grid-template-columns: 300px 1fr; }
1481
+ .app-topbar { padding: 0 32px; }
1482
+ .app-main { padding: 24px 40px 96px 40px; }
1483
+ }
1484
+
1485
+ @media (min-width: 1600px) {
1486
+ .app { max-width: 1600px; margin: 0 auto; }
1487
+ .app-body { grid-template-columns: 320px 1fr; }
1488
+ .app-topbar { padding: 0 40px; }
1489
+ .app-main { padding: 32px 56px 96px 56px; }
1490
+ }
1491
+
1492
+ @media (min-width: 1920px) {
1493
+ .app { max-width: 1920px; }
1494
+ .app-body { grid-template-columns: 360px 1fr; }
1495
+ }
1496
+ .ds-preview-truncated { color: var(--panel-text-3); font-style: italic; padding: var(--space-2) 0 0 0; }
1497
+
1498
+
1499
+ /* ============================================================
1500
+ KPI grid · row form · rails+dots · chip tones · empty · table clickable
1501
+ Moved from consumer (freddie dashboard + theme) — generic 247420 primitives.
1502
+ ============================================================ */
1503
+
1504
+ .kpi {
1505
+ display: grid;
1506
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
1507
+ gap: 1px;
1508
+ background: var(--panel-2);
1509
+ padding: 1px;
1510
+ border-radius: 20px;
1511
+ overflow: hidden;
1512
+ }
1513
+ .kpi-card { background: var(--panel-1); padding: 14px 18px; }
1514
+ .kpi-card .num {
1515
+ font-size: 1.75rem;
1516
+ color: var(--panel-text);
1517
+ font-weight: 400;
1518
+ font-family: var(--ff-mono);
1519
+ }
1520
+ .kpi-card .lbl {
1521
+ font-size: 0.75rem;
1522
+ color: var(--panel-text-2);
1523
+ font-weight: 600;
1524
+ text-transform: uppercase;
1525
+ letter-spacing: 0.08em;
1526
+ margin-top: 2px;
1527
+ }
1528
+
1529
+ .row-form {
1530
+ display: flex;
1531
+ gap: 8px;
1532
+ flex-wrap: wrap;
1533
+ align-items: center;
1534
+ margin-bottom: 12px;
1535
+ }
1536
+ .row-form input { flex: 1; min-width: 140px; padding: 10px 12px; }
1537
+
1538
+ .chip.ok { background: var(--green); color: #fff; }
1539
+ .chip.miss { background: var(--warn); color: #fff; }
1540
+
1541
+ .empty { color: var(--panel-text-3); padding: 12px 0; }
1542
+
1543
+ tr.clickable { cursor: pointer; }
1544
+ tr.clickable:hover td { background: var(--panel-hover); }
1545
+
1546
+ .rail-green { box-shadow: inset 4px 0 0 var(--green); }
1547
+ .rail-purple { box-shadow: inset 4px 0 0 var(--purple); }
1548
+ .rail-mascot { box-shadow: inset 4px 0 0 var(--mascot); }
1549
+ .rail-sun { box-shadow: inset 4px 0 0 var(--sun); }
1550
+ .rail-flame { box-shadow: inset 4px 0 0 var(--flame); }
1551
+ .rail-sky { box-shadow: inset 4px 0 0 var(--sky); }
1552
+ .dot-green { color: var(--green); }
1553
+ .dot-purple { color: var(--purple); }
1554
+ .dot-mascot { color: var(--mascot); }
1555
+ .dot-sun { color: var(--sun); }
1556
+ .dot-flame { color: var(--flame); }
1557
+ .dot-sky { color: var(--sky); }
1558
+
1559
+ .ds-section {
1560
+ margin: 32px 0;
1561
+ padding: 18px 22px;
1562
+ background: var(--panel-1);
1563
+ border-radius: 20px;
1564
+ }
1565
+ .ds-section .ds-section-title { margin-top: 0; }
1566
+ .ds-section .ds-lede { opacity: 0.8; max-width: 60ch; }
1567
+ .ds-section .row {
1568
+ border-radius: 10px;
1569
+ margin: 6px 0;
1570
+ padding: 10px 14px;
1571
+ background: var(--panel-2);
1572
+ }
1573
+ .ds-section .row .dot {
1574
+ display: inline-block;
1575
+ width: 8px; height: 8px;
1576
+ border-radius: 50%;
1577
+ margin-right: 8px;
1578
+ background: currentColor;
1579
+ opacity: 0.8;
1580
+ }
1581
+ .ds-section .row-benefit { opacity: 0.75; margin-top: 4px; font-style: italic; }
1582
+ .ds-section .row .sub { opacity: 0.85; margin-top: 4px; }
1583
+ .ds-section a.row { display: block; text-decoration: none; color: inherit; }
1584
+ .ds-section a.row .code {
1585
+ font-family: var(--ff-mono);
1586
+ opacity: 0.6;
1587
+ margin-right: 12px;
1588
+ }
1589
+
1590
+ /* ============================================================
1591
+ Responsive — collapse sidebar below 860px and turn it into
1592
+ a horizontal scroll-pill nav at the top of the main area
1593
+ ============================================================ */
1594
+ @media (max-width: 860px) {
1595
+ .app-body { grid-template-columns: 1fr; }
1596
+ .app-side-shell {
1597
+ grid-row: 1;
1598
+ position: sticky;
1599
+ top: 56px;
1600
+ z-index: 90;
1601
+ background: var(--panel-0);
1602
+ }
1603
+ .app-side {
1604
+ height: auto;
1605
+ padding: 8px 12px;
1606
+ overflow-x: auto;
1607
+ overflow-y: hidden;
1608
+ white-space: nowrap;
1609
+ -webkit-overflow-scrolling: touch;
1610
+ border-bottom: 1px solid var(--panel-2);
1611
+ }
1612
+ .app-side .group { display: none; }
1613
+ .app-side > div, .app-side nav, .app-side > section {
1614
+ display: inline-flex;
1615
+ gap: 4px;
1616
+ flex-wrap: nowrap;
1617
+ }
1618
+ .app-side a {
1619
+ display: inline-flex;
1620
+ margin: 0 2px;
1621
+ padding: 6px 12px;
1622
+ border-radius: 999px;
1623
+ background: var(--panel-2);
1624
+ font-size: 12px;
1625
+ }
1626
+ .app-side a.active { background: var(--panel-accent); color: var(--panel-accent-fg); }
1627
+ .app-topbar { padding: 0 12px; gap: 8px; }
1628
+ .app-topbar .brand { font-size: 13px; }
1629
+ .app-topbar input[type=search] { min-width: 120px !important; max-width: 180px; }
1630
+ .app-main { padding: 12px 14px 80px 14px; }
1631
+ .app-crumb { padding: 6px 14px; }
1632
+ }
1633
+
1634
+ @media (max-width: 480px) {
1635
+ .app-topbar .brand .leaf { display: none; }
1636
+ .app-topbar input[type=search] { display: none; }
1637
+ .app-main { padding: 10px 10px 80px 10px; }
1638
+ .panel-body { padding: 10px 12px; }
1639
+ .row { grid-template-columns: 60px 1fr auto; gap: 8px; padding: 8px 12px; font-size: 12px; }
1640
+ .row .meta { font-size: 10px; }
1641
+ h1 { font-size: 22px !important; }
1642
+ }
1643
+
1644
+ /* file-browser stage + utility surfaces — replaces inline style strings in kit/fsbrowse */
1645
+ .ds-file-stage { padding: var(--space-4) var(--space-5); }
1646
+ .ds-meta-mono { color: var(--panel-text-3); font-family: var(--ff-mono); font-size: var(--fs-xs); }
1647
+ .ds-error-banner { background: var(--flame); color: var(--ink); padding: var(--space-2) var(--space-3); border-radius: var(--r-3); margin-bottom: var(--space-3); cursor: pointer; }
1648
+
1649
+ /* ============================================================
1650
+ Community shell — Discord-style server rail + channel sidebar
1651
+ + member list + voice strip. Tokens-only, ink/dark ready.
1652
+ ============================================================ */
1653
+
1654
+ .cm-shell {
1655
+ display: flex;
1656
+ flex-direction: row;
1657
+ height: 100vh;
1658
+ width: 100%;
1659
+ overflow: hidden;
1660
+ background: var(--panel-0);
1661
+ }
1662
+
1663
+ /* Server rail */
1664
+ .cm-server-rail {
1665
+ display: flex;
1666
+ flex-direction: column;
1667
+ align-items: center;
1668
+ width: 72px;
1669
+ min-width: 72px;
1670
+ background: var(--panel-0);
1671
+ padding: 8px 0;
1672
+ gap: 4px;
1673
+ overflow-y: auto;
1674
+ overflow-x: hidden;
1675
+ scrollbar-width: none;
1676
+ flex-shrink: 0;
1677
+ }
1678
+ .cm-server-rail::-webkit-scrollbar { display: none; }
1679
+
1680
+ .cm-server-back {
1681
+ display: flex; align-items: center; justify-content: center;
1682
+ width: 48px; height: 32px;
1683
+ color: var(--panel-text-2);
1684
+ text-decoration: none;
1685
+ font-family: var(--ff-mono);
1686
+ font-size: 16px; font-weight: 700;
1687
+ flex-shrink: 0; margin-bottom: 4px;
1688
+ transition: color 0.15s;
1689
+ }
1690
+ .cm-server-back:hover { color: var(--panel-text); }
1691
+
1692
+ .cm-server-sep {
1693
+ width: 32px; height: 2px;
1694
+ background: var(--panel-2);
1695
+ border-radius: 1px; margin: 4px 0;
1696
+ flex-shrink: 0;
1697
+ }
1698
+
1699
+ .cm-server-icon {
1700
+ position: relative;
1701
+ width: 48px; height: 48px;
1702
+ border-radius: 50%;
1703
+ background: var(--panel-2);
1704
+ color: var(--panel-text-2);
1705
+ display: flex; align-items: center; justify-content: center;
1706
+ font-weight: 600; font-size: 18px;
1707
+ cursor: pointer;
1708
+ transition: border-radius 0.15s, background 0.15s, color 0.15s;
1709
+ flex-shrink: 0; user-select: none;
1710
+ border: 2px solid transparent;
1711
+ }
1712
+ .cm-server-icon:hover, .cm-server-icon.active {
1713
+ border-radius: 30%;
1714
+ background: var(--panel-accent);
1715
+ color: var(--panel-accent-fg);
1716
+ }
1717
+ .cm-server-icon img { width: 100%; height: 100%; border-radius: inherit; object-fit: cover; }
1718
+
1719
+ .cm-server-pill {
1720
+ position: absolute;
1721
+ left: -8px; top: 50%; transform: translateY(-50%);
1722
+ width: 4px;
1723
+ background: var(--panel-text);
1724
+ border-radius: 0 2px 2px 0;
1725
+ height: 0; transition: height 0.15s;
1726
+ }
1727
+ .cm-server-icon:hover .cm-server-pill { height: 20px; }
1728
+ .cm-server-icon.active .cm-server-pill { height: 40px; }
1729
+
1730
+ .cm-server-badge {
1731
+ position: absolute; bottom: -2px; right: -2px;
1732
+ background: var(--warn); color: #fff;
1733
+ border-radius: 50%; min-width: 16px; height: 16px;
1734
+ display: flex; align-items: center; justify-content: center;
1735
+ font-size: 9px; font-weight: 600; border: 2px solid var(--panel-0);
1736
+ }
1737
+
1738
+ .cm-server-add {
1739
+ width: 48px; height: 48px;
1740
+ border-radius: 50%;
1741
+ background: var(--panel-2);
1742
+ color: var(--panel-accent);
1743
+ font-size: 24px;
1744
+ cursor: pointer;
1745
+ display: flex; align-items: center; justify-content: center;
1746
+ transition: border-radius 0.15s, background 0.15s;
1747
+ flex-shrink: 0;
1748
+ }
1749
+ .cm-server-add:hover { border-radius: 30%; background: var(--panel-accent); color: var(--panel-accent-fg); }
1750
+
1751
+ /* Channel sidebar */
1752
+ .cm-channel-sidebar {
1753
+ display: flex;
1754
+ flex-direction: column;
1755
+ width: 240px; min-width: 240px;
1756
+ background: var(--panel-1);
1757
+ flex-shrink: 0; overflow: hidden;
1758
+ transition: width 0.2s, min-width 0.2s, opacity 0.2s;
1759
+ }
1760
+ .cm-channel-sidebar.collapsed { width: 0; min-width: 0; opacity: 0; pointer-events: none; }
1761
+
1762
+ .cm-server-header {
1763
+ display: flex; align-items: center; justify-content: space-between;
1764
+ padding: 0 12px; height: 48px;
1765
+ background: var(--panel-2); flex-shrink: 0;
1766
+ }
1767
+ .cm-server-header-name {
1768
+ font-weight: 600; font-size: 14px;
1769
+ color: var(--panel-text);
1770
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
1771
+ }
1772
+
1773
+ .cm-channel-list {
1774
+ flex: 1; overflow-y: auto; overflow-x: hidden;
1775
+ padding: 8px 0;
1776
+ scrollbar-width: thin;
1777
+ scrollbar-color: var(--panel-3) transparent;
1778
+ }
1779
+ .cm-channel-list::-webkit-scrollbar { width: 4px; }
1780
+ .cm-channel-list::-webkit-scrollbar-thumb { background: var(--panel-3); border-radius: 2px; }
1781
+
1782
+ .cm-category-header {
1783
+ padding: 12px 8px 2px 16px;
1784
+ font-size: 11px; font-weight: 600;
1785
+ color: var(--panel-text-3);
1786
+ display: flex; align-items: center; gap: 4px;
1787
+ cursor: pointer;
1788
+ }
1789
+ .cm-category-header:hover { color: var(--panel-text-2); }
1790
+ .cm-cat-arrow {
1791
+ width: 12px; height: 12px; fill: currentColor;
1792
+ transition: transform 0.15s; flex-shrink: 0;
1793
+ }
1794
+ .cm-category-header.collapsed .cm-cat-arrow { transform: rotate(-90deg); }
1795
+ .cm-cat-name { flex: 1; text-transform: uppercase; letter-spacing: 0.04em; }
1796
+ .cm-cat-add {
1797
+ background: none; color: var(--panel-text-3);
1798
+ font-size: 16px; padding: 0 4px; border-radius: 3px;
1799
+ opacity: 0; transition: opacity 0.1s;
1800
+ cursor: pointer;
1801
+ }
1802
+ .cm-category-header:hover .cm-cat-add { opacity: 1; }
1803
+ .cm-cat-add:hover { color: var(--panel-text); }
1804
+
1805
+ .cm-channel-item {
1806
+ display: flex; align-items: center;
1807
+ padding: 4px 8px 4px 16px;
1808
+ gap: 8px; border-radius: 4px; margin: 1px 8px;
1809
+ cursor: pointer; color: var(--panel-text-3);
1810
+ font-size: 14px; font-weight: 500;
1811
+ transition: background 0.1s, color 0.1s;
1812
+ }
1813
+ .cm-channel-item:hover { background: var(--panel-hover); color: var(--panel-text-2); }
1814
+ .cm-channel-item.active { background: var(--panel-2); color: var(--panel-text); }
1815
+ .cm-ch-icon { font-size: 16px; opacity: 0.6; flex-shrink: 0; }
1816
+ .cm-ch-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1817
+
1818
+ /* User panel */
1819
+ .cm-user-panel {
1820
+ display: flex; align-items: center; gap: 8px;
1821
+ padding: 8px 12px; height: 52px;
1822
+ background: var(--panel-0); flex-shrink: 0;
1823
+ }
1824
+ .cm-user-avatar {
1825
+ position: relative;
1826
+ width: 32px; height: 32px; border-radius: 50%;
1827
+ background: var(--panel-accent);
1828
+ color: var(--panel-accent-fg);
1829
+ display: flex; align-items: center; justify-content: center;
1830
+ font-weight: 600; font-size: 14px; cursor: pointer; flex-shrink: 0;
1831
+ }
1832
+ .cm-user-status-dot {
1833
+ position: absolute; bottom: -1px; right: -1px;
1834
+ width: 10px; height: 10px; border-radius: 50%;
1835
+ background: var(--live); border: 2px solid var(--panel-0);
1836
+ }
1837
+ .cm-user-info { flex: 1; overflow: hidden; }
1838
+ .cm-user-name {
1839
+ font-size: 12px; font-weight: 600; color: var(--panel-text);
1840
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
1841
+ }
1842
+ .cm-user-tag {
1843
+ font-size: 10px; color: var(--panel-text-3);
1844
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
1845
+ }
1846
+ .cm-user-controls { display: flex; gap: 2px; }
1847
+ .cm-user-btn {
1848
+ background: none; cursor: pointer;
1849
+ color: var(--panel-text-3); padding: 6px; border-radius: 4px;
1850
+ display: flex; align-items: center;
1851
+ transition: background 0.1s, color 0.1s;
1852
+ }
1853
+ .cm-user-btn:hover { background: var(--panel-2); color: var(--panel-text); }
1854
+ .cm-user-btn.muted, .cm-user-btn.deafened { color: var(--warn); }
1855
+
1856
+ /* Main area */
1857
+ .cm-main {
1858
+ display: flex; flex-direction: column;
1859
+ flex: 1; min-width: 0;
1860
+ background: var(--panel-1); overflow: hidden;
1861
+ }
1862
+
1863
+ /* Chat header bar */
1864
+ .cm-chat-header {
1865
+ display: flex; align-items: center;
1866
+ height: 48px; padding: 0 16px; gap: 8px;
1867
+ background: var(--panel-1); flex-shrink: 0;
1868
+ box-shadow: 0 1px 0 var(--panel-2);
1869
+ }
1870
+ .cm-chat-header-icon { font-size: 20px; color: var(--panel-text-2); flex-shrink: 0; }
1871
+ .cm-chat-header-name { font-weight: 600; font-size: 14px; color: var(--panel-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1872
+ .cm-chat-header-topic { flex: 1; font-size: 12px; color: var(--panel-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1873
+ .cm-chat-header-toolbar { display: flex; gap: 4px; flex-shrink: 0; }
1874
+
1875
+ /* Member list */
1876
+ .cm-member-list {
1877
+ width: 240px; min-width: 240px;
1878
+ background: var(--panel-1);
1879
+ overflow-y: auto; overflow-x: hidden;
1880
+ flex-shrink: 0; padding: 8px 0;
1881
+ scrollbar-width: thin;
1882
+ scrollbar-color: var(--panel-3) transparent;
1883
+ display: none;
1884
+ }
1885
+ .cm-member-list.open { display: block; }
1886
+ .cm-member-category {
1887
+ padding: 12px 8px 4px 16px;
1888
+ font-size: 11px; font-weight: 600;
1889
+ color: var(--panel-text-3); text-transform: uppercase; letter-spacing: 0.04em;
1890
+ }
1891
+ .cm-member-item {
1892
+ display: flex; align-items: center; gap: 10px;
1893
+ padding: 5px 12px; border-radius: 4px; margin: 1px 8px;
1894
+ cursor: pointer; transition: background 0.1s;
1895
+ }
1896
+ .cm-member-item:hover { background: var(--panel-hover); }
1897
+ .cm-member-avatar {
1898
+ width: 32px; height: 32px; border-radius: 50%;
1899
+ background: var(--panel-accent); color: var(--panel-accent-fg);
1900
+ display: flex; align-items: center; justify-content: center;
1901
+ font-weight: 600; font-size: 12px; flex-shrink: 0; position: relative;
1902
+ }
1903
+ .cm-member-status {
1904
+ position: absolute; bottom: -1px; right: -1px;
1905
+ width: 10px; height: 10px; border-radius: 50%;
1906
+ background: var(--panel-3); border: 2px solid var(--panel-1);
1907
+ }
1908
+ .cm-member-status.online { background: var(--live); }
1909
+ .cm-member-name { font-size: 12px; font-weight: 500; color: var(--panel-text-2); }
1910
+
1911
+ /* Voice user in channel list */
1912
+ .cm-voice-user {
1913
+ display: flex; align-items: center; gap: 8px;
1914
+ padding: 3px 8px 3px 36px; border-radius: 4px; margin: 1px 0;
1915
+ font-size: 11px; color: var(--panel-text-3);
1916
+ }
1917
+ .cm-voice-user.speaking { color: var(--live); }
1918
+ .cm-voice-user-avatar {
1919
+ width: 20px; height: 20px; border-radius: 50%;
1920
+ background: var(--panel-2); flex-shrink: 0;
1921
+ display: flex; align-items: center; justify-content: center;
1922
+ font-size: 10px; font-weight: 600;
1923
+ }
1924
+ .cm-voice-user-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1925
+
1926
+ /* Voice strip — persistent bottom bar when in voice */
1927
+ .cm-voice-strip {
1928
+ display: none; position: fixed;
1929
+ bottom: 0; left: 72px;
1930
+ width: 240px; background: var(--panel-0);
1931
+ box-shadow: inset 0 4px 0 var(--live);
1932
+ padding: 12px 12px 8px; z-index: 200;
1933
+ align-items: center; gap: 8px;
1934
+ }
1935
+ .cm-voice-strip.open { display: flex; }
1936
+ .cm-vs-label { flex: 1; overflow: hidden; }
1937
+ .cm-vs-channel { display: block; font-size: 12px; font-weight: 600; color: var(--live); }
1938
+ .cm-vs-status { display: block; font-size: 10px; color: var(--panel-text-3); }
1939
+ .cm-vs-btn {
1940
+ background: none; cursor: pointer;
1941
+ color: var(--panel-text-3); font-size: 16px; padding: 4px; border-radius: 4px;
1942
+ }
1943
+ .cm-vs-btn:hover { background: var(--panel-2); color: var(--panel-text); }
1944
+ .cm-vs-btn.danger { color: var(--warn); }
1945
+
1946
+ /* Mobile */
1947
+ @media (max-width: 768px) {
1948
+ .cm-server-rail { width: 60px; min-width: 60px; }
1949
+ .cm-channel-sidebar {
1950
+ position: fixed; left: 0; top: 0; bottom: 0; z-index: 500;
1951
+ transform: translateX(-100%); transition: transform 0.2s;
1952
+ width: 260px; min-width: 260px;
1953
+ }
1954
+ .cm-channel-sidebar.mobile-open { transform: translateX(60px); }
1955
+ .cm-member-list {
1956
+ position: fixed; right: 0; top: 0; bottom: 0; z-index: 500;
1957
+ transform: translateX(100%); transition: transform 0.2s;
1958
+ }
1959
+ .cm-member-list.open { transform: translateX(0); }
1960
+ }
1961
+
1962
+ /* Community demo kit — message area utility classes */
1963
+ .ds-community-page { display: flex; flex-direction: column; height: 100vh; overflow: hidden; background: var(--panel-0); }
1964
+ .ds-community-main { display: flex; flex-direction: column; height: 100%; overflow: hidden; }
1965
+ .ds-community-messages {
1966
+ flex: 1; overflow-y: auto; padding: 16px 20px;
1967
+ display: flex; flex-direction: column; gap: 12px;
1968
+ scrollbar-width: thin; scrollbar-color: var(--panel-3) transparent;
1969
+ }
1970
+ .ds-community-msg { display: flex; gap: 12px; align-items: flex-start; }
1971
+ .ds-community-avatar {
1972
+ width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0;
1973
+ display: flex; align-items: center; justify-content: center;
1974
+ font-weight: 700; font-size: 14px; color: #fff;
1975
+ background: var(--panel-accent);
1976
+ }
1977
+ .ds-community-msg-body { display: flex; flex-direction: column; gap: 2px; }
1978
+ .ds-community-msg-name { font-weight: 600; font-size: 13px; margin-right: 8px; }
1979
+ .ds-community-msg-time { font-size: 11px; color: var(--panel-text-3); font-family: var(--ff-mono); }
1980
+ .ds-community-msg-text { margin: 0; font-size: 13px; color: var(--panel-text); line-height: 1.5; }
1981
+
1982
+ /* freddie dashboard fd-* classes */
1983
+ .fd-label { font-size: 0.75em; opacity: 0.7; letter-spacing: 0.05em; display: block; margin-bottom: 2px; }
1984
+ .fd-row { display: flex; gap: 8px; flex-wrap: wrap; }
1985
+ .fd-row-send { align-items: flex-end; }
1986
+ .fd-col { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 120px; }
1987
+ .fd-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 4px; }
1988
+ .fd-chip-wrap { cursor: pointer; }
1989
+ .fd-chat-thread { max-height: 50vh; overflow-y: auto; border-radius: 10px; padding: 4px; margin-top: 8px; background: rgba(0,0,0,0.08); }
1990
+ .fd-msg { padding: 6px 10px; border-bottom: 1px solid rgba(128,128,128,0.1); white-space: pre-wrap; word-break: break-word; }
1991
+ .fd-msg-assistant { opacity: 0.9; }
1992
+ .fd-tool-call { margin: 4px 0; padding: 4px 8px; background: rgba(0,0,0,0.12); border-radius: 6px; font-family: var(--ff-mono); font-size: 0.85em; }
1993
+ .fd-tool-call summary { cursor: pointer; padding: 2px 0; }
1994
+ .fd-tool-body { margin: 4px 0 0; white-space: pre-wrap; word-break: break-all; max-height: 200px; overflow-y: auto; }
1995
+ .fd-pre { white-space: pre-wrap; word-break: break-all; font-family: var(--ff-mono); font-size: 0.85em; }
1996
+ .row-form { display: flex; flex-direction: column; gap: 8px; }
1997
+ .fd-chat-form { display: flex; flex-direction: column; gap: 8px; }
1998
+ .fd-chat-send-row { display: flex; gap: 8px; align-items: flex-end; }
1999
+ .fd-chat-send-row textarea { flex: 1; resize: vertical; }
2000
+ .fd-chat-send-row .btn-primary { flex-shrink: 0; align-self: flex-end; padding: 10px 20px; }
2001
+ .fd-muted { opacity: 0.5; }