anentrypoint-design 0.0.146 → 0.0.147

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 CHANGED
@@ -9,6 +9,7 @@
9
9
  ============================================================ */
10
10
  * { box-sizing: border-box; }
11
11
  html, body { margin: 0; padding: 0; }
12
+ button, input, select, textarea { font: inherit; }
12
13
 
13
14
  /* ============================================================
14
15
  Accessibility — Skip Link
@@ -28,7 +29,7 @@ html, body { margin: 0; padding: 0; }
28
29
  }
29
30
  .skip-link:focus {
30
31
  top: 10px;
31
- outline: 2px solid var(--fg-3);
32
+ outline: 2px solid var(--accent);
32
33
  outline-offset: 2px;
33
34
  }
34
35
  body {
@@ -71,7 +72,7 @@ h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: v
71
72
 
72
73
  .lede, .t-lede {
73
74
  font-family: var(--ff-body); font-size: var(--fs-xl);
74
- line-height: 1.4; max-width: 38ch; font-weight: 400; color: var(--fg-2);
75
+ line-height: var(--lh-tall); max-width: 38ch; font-weight: 400; color: var(--fg-2);
75
76
  margin: 0;
76
77
  }
77
78
 
@@ -127,8 +128,8 @@ code {
127
128
 
128
129
  pre {
129
130
  font-family: var(--ff-mono);
130
- background: var(--ink);
131
- color: var(--paper);
131
+ background: var(--panel-bg, #15151a);
132
+ color: var(--panel-text, inherit);
132
133
  padding: var(--space-5);
133
134
  overflow-x: auto;
134
135
  line-height: 1.55;
@@ -158,9 +159,9 @@ pre .n { color: var(--green-2); }
158
159
  }
159
160
 
160
161
  :root {
161
- --app-status-h: 42px;
162
- --app-topbar-h: 56px;
163
- --app-crumb-h: 32px;
162
+ --app-status-h: var(--size-base);
163
+ --app-topbar-h: var(--size-lg);
164
+ --app-crumb-h: var(--size-sm);
164
165
  }
165
166
 
166
167
  .app-topbar {
@@ -229,8 +230,11 @@ pre .n { color: var(--green-2); }
229
230
  .app-crumb .crumb-right { margin-left: auto; color: var(--fg-3); }
230
231
 
231
232
  .app-side-shell { background: var(--bg); }
232
- .app-body { display: grid; grid-template-columns: 220px minmax(0, 1fr); flex: 1; min-height: 0; }
233
+ .app-body { display: grid; grid-template-columns: var(--sidebar-width) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); align-items: stretch; align-content: stretch; flex: 1; min-height: 0; }
233
234
  .app-body.no-side { grid-template-columns: minmax(0, 1fr); }
235
+ /* When there is no sidebar, the empty side-shell must not occupy a grid row,
236
+ otherwise main wraps to a second (collapsed) row. Remove it from layout. */
237
+ .app-body.no-side .app-side-shell { display: none; }
234
238
 
235
239
  .app-side {
236
240
  display: flex; flex-direction: column; gap: var(--space-4);
@@ -270,23 +274,34 @@ pre .n { color: var(--green-2); }
270
274
  .app-main {
271
275
  padding: var(--space-5) var(--pad-x) 0;
272
276
  min-width: 0;
277
+ /* Full-height flex column so a single flex:1 child (e.g. .chat) fills the
278
+ region between crumb and status instead of floating at content height. */
279
+ display: flex; flex-direction: column;
280
+ min-height: 0;
281
+ align-self: stretch;
282
+ height: 100%;
273
283
  }
274
- .app-main.narrow { max-width: 760px; margin: 0 auto; }
284
+ .app-main > * { min-height: 0; }
285
+ .app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
275
286
 
276
287
  @media (min-width: 1400px) {
277
288
  .app { max-width: 1400px; margin-left: auto; margin-right: auto; }
278
289
  .app-main .chat,
279
290
  .app-main > .chat-area,
280
291
  .app-main > .main-content { max-width: none; margin: 0; width: 100%; }
281
- .app-status { max-width: 1400px; margin-left: auto; margin-right: auto; left: 0; right: 0; }
292
+ /* Status bar inherits the .app max-width cap above and stretches edge-to-edge
293
+ within it; no separate width constraint (which previously narrowed it). */
294
+ .app-status { width: 100%; }
282
295
  }
283
296
 
284
297
  .app-status {
285
298
  display: flex; align-items: center; gap: var(--space-3);
299
+ width: 100%;
286
300
  min-height: var(--app-status-h);
287
301
  padding: 10px var(--pad-x);
288
302
  font-family: var(--ff-mono); font-size: var(--fs-xs);
289
303
  color: var(--fg-3);
304
+ border-top: 1px solid var(--rule);
290
305
  }
291
306
  .app-status .item { color: inherit; }
292
307
  .app-status .item:first-of-type { color: var(--accent); }
@@ -318,6 +333,54 @@ pre .n { color: var(--green-2); }
318
333
  outline-offset: 2px;
319
334
  }
320
335
 
336
+ /* ============================================================
337
+ IconButton — square icon-only button
338
+ ============================================================ */
339
+ .ds-icon-btn {
340
+ display: inline-flex; align-items: center; justify-content: center;
341
+ padding: 0; border: none; cursor: pointer;
342
+ border-radius: var(--r-1, 6px);
343
+ background: transparent; color: var(--fg);
344
+ width: 32px; height: 32px;
345
+ }
346
+ .ds-icon-btn-xs { width: 22px; height: 22px; }
347
+ .ds-icon-btn-sm { width: 26px; height: 26px; }
348
+ .ds-icon-btn-base { width: 32px; height: 32px; }
349
+ .ds-icon-btn-lg { width: 40px; height: 40px; }
350
+ .ds-icon-btn-xl { width: 48px; height: 48px; }
351
+ .ds-icon-btn-ghost { background: transparent; }
352
+ .ds-icon-btn-ghost:hover { background: var(--bg-2); }
353
+ .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
354
+ .ds-icon-btn-primary:hover { background: var(--fg); color: var(--bg); }
355
+ .ds-icon-btn-danger { background: var(--flame); color: var(--paper); }
356
+ .ds-icon-btn-danger:hover { filter: brightness(1.1); }
357
+ .ds-icon-btn:active { transform: translateY(1px); }
358
+ .ds-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
359
+ .ds-icon-btn:disabled, .ds-icon-btn.is-disabled {
360
+ opacity: 0.5; cursor: not-allowed; pointer-events: none;
361
+ }
362
+
363
+ /* ============================================================
364
+ Badge — small inline count/status pill
365
+ ============================================================ */
366
+ .ds-badge {
367
+ display: inline-flex; align-items: center; justify-content: center;
368
+ min-width: 18px; height: 18px; padding: 0 6px;
369
+ font-size: 11px; font-weight: 600; line-height: 1;
370
+ border-radius: 999px;
371
+ background: var(--bg-3); color: var(--fg-2);
372
+ }
373
+ .ds-badge.tone-green { background: var(--green-tint); color: var(--green-deep); }
374
+ .ds-badge.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
375
+ .ds-badge.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
376
+ .ds-badge.tone-sun { background: var(--sun); color: var(--ink); }
377
+ .ds-badge.tone-flame { background: var(--flame); color: var(--paper); }
378
+ .ds-badge.tone-live { background: var(--green-tint); color: var(--green-deep); }
379
+ .ds-badge.tone-wip { background: var(--bg-3); color: var(--fg-2); }
380
+ .ds-badge.tone-error { background: var(--flame); color: var(--paper); }
381
+ .ds-badge.tone-success { background: var(--green-tint); color: var(--green-deep); }
382
+ .ds-badge.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
383
+
321
384
  .chip {
322
385
  display: inline-flex; align-items: center; gap: 6px;
323
386
  padding: 3px 10px;
@@ -334,6 +397,12 @@ pre .n { color: var(--green-2); }
334
397
  .chip.tone-flame { background: var(--flame); color: var(--paper); }
335
398
  .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
336
399
  .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
400
+ .chip.tone-error { background: var(--flame); color: var(--paper); }
401
+ .chip.tone-success { background: var(--green-tint); color: var(--green-deep); }
402
+ .chip.tone-disabled { background: var(--bg-3); color: var(--fg-3); }
403
+ .chip.tone-ok { background: var(--green-tint); color: var(--green-deep); }
404
+ .chip.tone-miss { background: var(--flame); color: var(--paper); }
405
+ .chip.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
337
406
 
338
407
  .glyph {
339
408
  display: inline-flex; align-items: center; justify-content: center;
@@ -394,6 +463,9 @@ pre .n { color: var(--green-2); }
394
463
  .row:hover::before { background: var(--rule-strong); }
395
464
  .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
396
465
  .row.active::before { background: var(--accent); }
466
+ .row.row-state-disabled { opacity: 0.5; pointer-events: none; }
467
+ .row.row-state-error { background: color-mix(in oklab, var(--flame) 10%, var(--bg-2)); }
468
+ .row.row-state-error::before { background: var(--flame); }
397
469
  .row-grid { /* explicit grid-template-columns set inline */ }
398
470
 
399
471
  .row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
@@ -409,7 +481,7 @@ a.row { text-decoration: none; }
409
481
  .ds-hero {
410
482
  padding: var(--space-9) 0 var(--space-8);
411
483
  display: grid; gap: var(--space-5);
412
- max-width: 940px;
484
+ max-width: var(--measure-wide);
413
485
  }
414
486
  .ds-hero-title {
415
487
  font-family: var(--ff-body); font-weight: 600;
@@ -423,6 +495,8 @@ a.row { text-decoration: none; }
423
495
  color: var(--fg-2);
424
496
  }
425
497
  .ds-hero-accent { color: var(--accent); font-weight: 500; }
498
+ .ds-hero-actions { display: flex; gap: var(--space-2, 10px); flex-wrap: wrap; margin-top: var(--space-2, 8px); }
499
+ .ds-chat-title { margin: 0; font-size: inherit; }
426
500
 
427
501
  /* ============================================================
428
502
  Section grouping
@@ -588,6 +662,21 @@ table tr.clickable:hover td { background: var(--bg-2); }
588
662
  .row-form input:focus,
589
663
  .row-form textarea:focus { box-shadow: inset 0 0 0 2px var(--accent); }
590
664
 
665
+ /* Field char counter (TextField maxLength) */
666
+ .ds-field-count {
667
+ font-size: var(--fs-tiny, 12px);
668
+ color: var(--fg-3, var(--fg-2));
669
+ text-align: right;
670
+ }
671
+
672
+ /* Multi-column form layout (Form columns prop) */
673
+ .row-form[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
674
+ .row-form[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
675
+ @media (max-width: 600px) {
676
+ .row-form[data-columns="2"],
677
+ .row-form[data-columns="3"] { grid-template-columns: 1fr; }
678
+ }
679
+
591
680
  /* ============================================================
592
681
  Responsive Design — Mobile (480px), Tablet (1024px), Desktop (1440px+)
593
682
  ============================================================ */
@@ -668,7 +757,6 @@ table tr.clickable:hover td { background: var(--bg-2); }
668
757
  /* Chat */
669
758
  .chat-stack { max-width: 100%; min-width: 0; }
670
759
  .chat-bubble {
671
- max-width: clamp(200px, 85vw, 320px);
672
760
  padding: 10px 12px; font-size: var(--fs-sm);
673
761
  }
674
762
  .chat-avatar { width: 28px; height: 28px; font-size: 11px; }
@@ -778,7 +866,6 @@ table tr.clickable:hover td { background: var(--bg-2); }
778
866
  /* Chat Bubbles */
779
867
  .chat-stack { max-width: min(75%, 420px); }
780
868
  .chat-bubble {
781
- max-width: clamp(220px, 75vw, 420px);
782
869
  padding: 11px 14px; font-size: var(--fs-sm);
783
870
  }
784
871
  .chat-avatar { width: 32px; height: 32px; font-size: 12px; }
@@ -809,15 +896,29 @@ table tr.clickable:hover td { background: var(--bg-2); }
809
896
  }
810
897
  }
811
898
 
899
+ /* ────────────────────────────────────────────────────────────────────
900
+ Mid Breakpoint (768px and below) — collapse sidebar + simplify row grid
901
+ ────────────────────────────────────────────────────────────────────── */
902
+ @media (max-width: 768px) {
903
+ /* Sidebar stacks above main rather than sitting beside it */
904
+ .app-body { grid-template-columns: 1fr; }
905
+ .app-side { width: 100%; max-width: none; }
906
+
907
+ /* Row drops the leading code column; title + meta share the line */
908
+ .row {
909
+ grid-template-columns: minmax(0, 1fr) auto;
910
+ gap: var(--space-2);
911
+ }
912
+ .row .code { display: none; }
913
+ .row .sub { grid-column: 1 / -1; }
914
+ }
915
+
812
916
  /* ────────────────────────────────────────────────────────────────────
813
917
  Desktop Breakpoint Enhancements (1025px and up)
814
918
  ────────────────────────────────────────────────────────────────────── */
815
919
  @media (min-width: 1025px) {
816
920
  /* Chat Bubbles */
817
921
  .chat-stack { max-width: min(70%, 480px); }
818
- .chat-bubble {
819
- max-width: clamp(240px, 70vw, 480px);
820
- }
821
922
 
822
923
  /* KPI Cards */
823
924
  .kpi {
@@ -1096,7 +1197,7 @@ table tr.clickable:hover td { background: var(--bg-2); }
1096
1197
  border-radius: var(--r-2); color: var(--fg);
1097
1198
  font-family: inherit; font-size: var(--fs-sm);
1098
1199
  }
1099
- .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
1200
+ .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
1100
1201
  .btn-primary.danger {
1101
1202
  background: var(--warn);
1102
1203
  border-color: var(--warn);
@@ -1185,7 +1286,7 @@ table tr.clickable:hover td { background: var(--bg-2); }
1185
1286
  border-radius: var(--r-pill); color: var(--fg);
1186
1287
  font-family: inherit; font-size: var(--fs-xs);
1187
1288
  }
1188
- .ds-filter-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
1289
+ .ds-filter-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
1189
1290
 
1190
1291
  /* Loading skeleton — placeholder rows while a directory loads. */
1191
1292
  .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
@@ -1374,7 +1475,7 @@ table tr.clickable:hover td { background: var(--bg-2); }
1374
1475
  border-radius: 14px; line-height: 1.55;
1375
1476
  word-wrap: break-word; overflow-wrap: anywhere;
1376
1477
  font-size: var(--fs-sm);
1377
- max-width: 100%;
1478
+ max-width: clamp(220px, min(75vw, 28em), 480px);
1378
1479
  min-width: 0;
1379
1480
  transition: transform 0.12s ease, box-shadow 0.12s ease;
1380
1481
  }
@@ -1648,6 +1749,8 @@ table tr.clickable:hover td { background: var(--bg-2); }
1648
1749
  font-family: inherit; font-size: var(--fs-sm);
1649
1750
  line-height: 1.4; resize: none;
1650
1751
  min-height: 44px; max-height: 200px;
1752
+ box-sizing: border-box; overflow-y: auto;
1753
+ scrollbar-width: thin;
1651
1754
  }
1652
1755
  .chat-composer textarea::placeholder { color: var(--fg-3); }
1653
1756
  .chat-composer textarea:focus {
@@ -2205,6 +2308,12 @@ body {
2205
2308
  .ds-spinner-sm { height: 12px; gap: 2px; }
2206
2309
  .ds-spinner-sm span { width: 2px; height: 2px; }
2207
2310
 
2311
+ .ds-spinner-xs { height: 8px; gap: 1px; }
2312
+ .ds-spinner-xs span { width: 1.5px; height: 1.5px; }
2313
+
2314
+ .ds-spinner-xl { height: 32px; gap: 8px; }
2315
+ .ds-spinner-xl span { width: 8px; height: 8px; }
2316
+
2208
2317
  @keyframes ds-bounce {
2209
2318
  0%, 80%, 100% { transform: translateY(0); }
2210
2319
  40% { transform: translateY(-8px); }
@@ -2330,7 +2439,7 @@ body {
2330
2439
  .app-main { padding-left: var(--space-3); padding-right: var(--space-3); }
2331
2440
  }
2332
2441
 
2333
- /* Drawer scrim */
2442
+ /* Drawer scrim — lives inside .app-body, shown when drawer open ≤900px */
2334
2443
  .app-side-scrim {
2335
2444
  display: none;
2336
2445
  position: fixed; inset: 0;
@@ -2338,8 +2447,34 @@ body {
2338
2447
  z-index: 49;
2339
2448
  }
2340
2449
  @media (max-width: 900px) {
2341
- .app-body.side-open ~ .app-side-scrim,
2342
- .app-side-shell.open ~ .app-side-scrim { display: block; }
2450
+ .app-body.side-open .app-side-scrim { display: block; }
2451
+ }
2452
+
2453
+ /* Mobile nav toggle (hamburger) — hidden on desktop, shown ≤900px */
2454
+ .app-side-toggle {
2455
+ display: none;
2456
+ position: fixed; top: calc((var(--app-topbar-h) - 32px) / 2); left: 10px;
2457
+ z-index: 51;
2458
+ width: 36px; height: 36px;
2459
+ align-items: center; justify-content: center;
2460
+ font-size: 18px; line-height: 1;
2461
+ background: var(--bg-2); color: var(--fg);
2462
+ border: 1px solid var(--rule, color-mix(in oklab, var(--fg) 12%, transparent));
2463
+ border-radius: var(--r-1, 6px);
2464
+ cursor: pointer;
2465
+ }
2466
+ .app-side-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2467
+ @media (max-width: 900px) {
2468
+ .app-side-toggle { display: inline-flex; }
2469
+ .app-topbar .brand { margin-left: 44px; }
2470
+ }
2471
+
2472
+ /* Desktop: independent scroll for side rail and main, so a short viewport
2473
+ keeps the bottom nav items reachable and main scrolls on its own. */
2474
+ @media (min-width: 901px) {
2475
+ .app-body { min-height: 0; max-height: calc(100vh - var(--app-topbar-h) - var(--app-crumb-h, 0px) - var(--app-status-h, 0px)); }
2476
+ .app-side-shell { overflow-y: auto; max-height: 100%; }
2477
+ .app-main { overflow-y: auto; max-height: 100%; }
2343
2478
  }
2344
2479
 
2345
2480
  /* Mobile (≤480) status bar compact; hide tail item */
@@ -7,6 +7,10 @@
7
7
  @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap');
8
8
 
9
9
  :root {
10
+ /* Tree view indentation tokens */
11
+ --tree-indent: 12px;
12
+ --tree-base-indent: 6px;
13
+
10
14
  /* Paper / Ink — cool stone scale; lets lore palette pop. */
11
15
  --paper: #F6F5F1;
12
16
  --paper-2: #ECEBE6;
@@ -136,6 +140,18 @@
136
140
  --z-overlay: 1000;
137
141
 
138
142
  --measure: 68ch;
143
+ --measure-wide: 940px;
144
+ --measure-narrow: 760px;
145
+
146
+ --sidebar-width: 220px;
147
+ --sidebar-width-collapsed: 64px;
148
+
149
+ --lh-tall: 1.4;
150
+
151
+ /* Control size scale — heights for status/topbar/crumb + controls. */
152
+ --size-sm: 32px;
153
+ --size-base: 42px;
154
+ --size-lg: 56px;
139
155
  }
140
156
 
141
157
  /* ============================================================
@@ -166,7 +182,7 @@ input:focus-visible,
166
182
  textarea:focus-visible,
167
183
  select:focus-visible {
168
184
  outline: 2px solid var(--accent);
169
- outline-offset: 1px;
185
+ outline-offset: 2px;
170
186
  }
171
187
 
172
188
  /* Interactive element focus-visible */
@@ -198,6 +214,10 @@ select:focus-visible {
198
214
  --danger: oklch(0.68 0.19 25);
199
215
  }
200
216
 
217
+ /* NOTE: the [data-theme="auto"] block below intentionally duplicates the
218
+ [data-theme="ink"/"dark"] block above. They are NOT literally identical —
219
+ the explicit-dark block also overrides --danger for contrast — so they are
220
+ kept separate rather than consolidated to avoid a behavior change. */
201
221
  @media (prefers-color-scheme: dark) {
202
222
  [data-theme="auto"] {
203
223
  --bg: var(--ink);
package/community.css CHANGED
@@ -512,7 +512,7 @@
512
512
  width: 20px;
513
513
  height: 20px;
514
514
  border-radius: 50%;
515
- background: var(--bg-3);
515
+ background: var(--avatar-bg, var(--bg-3));
516
516
  color: var(--fg-2);
517
517
  display: inline-flex;
518
518
  align-items: center;
@@ -645,7 +645,7 @@
645
645
  width: 32px;
646
646
  height: 32px;
647
647
  border-radius: 50%;
648
- background: var(--bg-3);
648
+ background: var(--avatar-bg, var(--bg-3));
649
649
  color: var(--fg-2);
650
650
  display: inline-flex;
651
651
  align-items: center;
@@ -849,7 +849,7 @@
849
849
  width: 28px;
850
850
  height: 28px;
851
851
  border-radius: 50%;
852
- background: var(--bg-3);
852
+ background: var(--avatar-bg, var(--bg-3));
853
853
  color: var(--fg-2);
854
854
  display: inline-flex;
855
855
  align-items: center;
@@ -910,7 +910,7 @@
910
910
  width: 56px;
911
911
  height: 56px;
912
912
  border-radius: 50%;
913
- background: var(--bg-3);
913
+ background: var(--avatar-bg, var(--bg-3));
914
914
  color: var(--fg-2);
915
915
  display: inline-flex;
916
916
  align-items: center;
@@ -1501,3 +1501,24 @@
1501
1501
  .cm-page-edit { padding: var(--space-1) var(--space-2); border: var(--bw-hair) solid var(--rule-strong); border-radius: var(--r-1); background: var(--bg-3); color: var(--fg); cursor: pointer; }
1502
1502
  .cm-page-body { padding: var(--space-3); line-height: 1.6; }
1503
1503
  .cm-page-empty { color: var(--fg-2, var(--fg)); opacity: .7; }
1504
+
1505
+ /* ============================================================
1506
+ freddie pages — layout for FREDDIE_PAGES renderers.
1507
+ Scoped under .ds-247420 by the build prefixer. Tokens only.
1508
+ ============================================================ */
1509
+ .fd-page-root { display: block; height: 100%; }
1510
+ .fd-page-inner { display: flex; flex-direction: column; gap: var(--space-3, 16px); padding: var(--space-3, 16px); max-width: 1100px; }
1511
+ .fd-page-inner > * { min-width: 0; }
1512
+ .fd-loading { display: flex; align-items: center; gap: var(--space-2, 10px); padding: var(--space-4, 24px); color: var(--fg-2, var(--fg)); }
1513
+ .fd-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-2, 10px); padding: var(--space-5, 32px) var(--space-3, 16px); color: var(--fg-2, var(--fg)); text-align: center; }
1514
+ .fd-empty-glyph { font-size: 28px; opacity: .55; line-height: 1; }
1515
+ .fd-pre { margin: 0; padding: var(--space-2, 10px); background: var(--bg-3, var(--panel-bg-2)); border: var(--bw-hair, 1px) solid var(--rule, var(--panel-accent)); border-radius: var(--r-1, 6px); overflow: auto; max-height: 460px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; font-family: var(--font-mono, ui-monospace, monospace); font-size: 12px; line-height: 1.5; }
1516
+ .fd-skill-body { max-height: 320px; }
1517
+ .fd-row-actions { display: inline-flex; gap: var(--space-1, 6px); align-items: center; }
1518
+ .fd-chat { display: flex; flex-direction: column; gap: var(--space-2, 10px); height: 100%; min-height: 0; }
1519
+ .fd-chat-thread { flex: 1 1 auto; min-height: 240px; overflow-y: auto; display: flex; flex-direction: column; gap: var(--space-2, 10px); padding: var(--space-2, 10px); }
1520
+ .fd-page-error { white-space: pre-wrap; overflow-wrap: anywhere; }
1521
+ /* page-level responsive: tighten padding on narrow viewports */
1522
+ @media (max-width: 640px) {
1523
+ .fd-page-inner { padding: var(--space-2, 10px); gap: var(--space-2, 10px); }
1524
+ }