anentrypoint-design 0.0.146 → 0.0.148

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;
@@ -157,10 +158,19 @@ pre .n { color: var(--green-2); }
157
158
  padding-right: env(safe-area-inset-right);
158
159
  }
159
160
 
161
+ /* When the app shell is embedded inside a windowed surface (e.g. the freddie
162
+ dashboard mounted in a WM window via .fd-root) it is NOT a full-page app:
163
+ `min-height:100vh` and the absence of an explicit width make it collapse to
164
+ 0 width at desktop, where the responsive single-column @media rules don't
165
+ apply. Inside .fd-root it must fill its container instead. (At <=767px the
166
+ grid already linearizes, which is why the bug only showed at desktop width.) */
167
+ .fd-root .app { width: 100%; height: 100%; min-height: 0; flex: 1 1 auto; }
168
+ .fd-root .app-body { min-width: 0; }
169
+
160
170
  :root {
161
- --app-status-h: 42px;
162
- --app-topbar-h: 56px;
163
- --app-crumb-h: 32px;
171
+ --app-status-h: var(--size-base);
172
+ --app-topbar-h: var(--size-lg);
173
+ --app-crumb-h: var(--size-sm);
164
174
  }
165
175
 
166
176
  .app-topbar {
@@ -229,8 +239,11 @@ pre .n { color: var(--green-2); }
229
239
  .app-crumb .crumb-right { margin-left: auto; color: var(--fg-3); }
230
240
 
231
241
  .app-side-shell { background: var(--bg); }
232
- .app-body { display: grid; grid-template-columns: 220px minmax(0, 1fr); flex: 1; min-height: 0; }
242
+ .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
243
  .app-body.no-side { grid-template-columns: minmax(0, 1fr); }
244
+ /* When there is no sidebar, the empty side-shell must not occupy a grid row,
245
+ otherwise main wraps to a second (collapsed) row. Remove it from layout. */
246
+ .app-body.no-side .app-side-shell { display: none; }
234
247
 
235
248
  .app-side {
236
249
  display: flex; flex-direction: column; gap: var(--space-4);
@@ -270,23 +283,34 @@ pre .n { color: var(--green-2); }
270
283
  .app-main {
271
284
  padding: var(--space-5) var(--pad-x) 0;
272
285
  min-width: 0;
286
+ /* Full-height flex column so a single flex:1 child (e.g. .chat) fills the
287
+ region between crumb and status instead of floating at content height. */
288
+ display: flex; flex-direction: column;
289
+ min-height: 0;
290
+ align-self: stretch;
291
+ height: 100%;
273
292
  }
274
- .app-main.narrow { max-width: 760px; margin: 0 auto; }
293
+ .app-main > * { min-height: 0; }
294
+ .app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
275
295
 
276
296
  @media (min-width: 1400px) {
277
297
  .app { max-width: 1400px; margin-left: auto; margin-right: auto; }
278
298
  .app-main .chat,
279
299
  .app-main > .chat-area,
280
300
  .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; }
301
+ /* Status bar inherits the .app max-width cap above and stretches edge-to-edge
302
+ within it; no separate width constraint (which previously narrowed it). */
303
+ .app-status { width: 100%; }
282
304
  }
283
305
 
284
306
  .app-status {
285
307
  display: flex; align-items: center; gap: var(--space-3);
308
+ width: 100%;
286
309
  min-height: var(--app-status-h);
287
310
  padding: 10px var(--pad-x);
288
311
  font-family: var(--ff-mono); font-size: var(--fs-xs);
289
312
  color: var(--fg-3);
313
+ border-top: 1px solid var(--rule);
290
314
  }
291
315
  .app-status .item { color: inherit; }
292
316
  .app-status .item:first-of-type { color: var(--accent); }
@@ -318,6 +342,54 @@ pre .n { color: var(--green-2); }
318
342
  outline-offset: 2px;
319
343
  }
320
344
 
345
+ /* ============================================================
346
+ IconButton — square icon-only button
347
+ ============================================================ */
348
+ .ds-icon-btn {
349
+ display: inline-flex; align-items: center; justify-content: center;
350
+ padding: 0; border: none; cursor: pointer;
351
+ border-radius: var(--r-1, 6px);
352
+ background: transparent; color: var(--fg);
353
+ width: 32px; height: 32px;
354
+ }
355
+ .ds-icon-btn-xs { width: 22px; height: 22px; }
356
+ .ds-icon-btn-sm { width: 26px; height: 26px; }
357
+ .ds-icon-btn-base { width: 32px; height: 32px; }
358
+ .ds-icon-btn-lg { width: 40px; height: 40px; }
359
+ .ds-icon-btn-xl { width: 48px; height: 48px; }
360
+ .ds-icon-btn-ghost { background: transparent; }
361
+ .ds-icon-btn-ghost:hover { background: var(--bg-2); }
362
+ .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
363
+ .ds-icon-btn-primary:hover { background: var(--fg); color: var(--bg); }
364
+ .ds-icon-btn-danger { background: var(--flame); color: var(--paper); }
365
+ .ds-icon-btn-danger:hover { filter: brightness(1.1); }
366
+ .ds-icon-btn:active { transform: translateY(1px); }
367
+ .ds-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
368
+ .ds-icon-btn:disabled, .ds-icon-btn.is-disabled {
369
+ opacity: 0.5; cursor: not-allowed; pointer-events: none;
370
+ }
371
+
372
+ /* ============================================================
373
+ Badge — small inline count/status pill
374
+ ============================================================ */
375
+ .ds-badge {
376
+ display: inline-flex; align-items: center; justify-content: center;
377
+ min-width: 18px; height: 18px; padding: 0 6px;
378
+ font-size: 11px; font-weight: 600; line-height: 1;
379
+ border-radius: 999px;
380
+ background: var(--bg-3); color: var(--fg-2);
381
+ }
382
+ .ds-badge.tone-green { background: var(--green-tint); color: var(--green-deep); }
383
+ .ds-badge.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
384
+ .ds-badge.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
385
+ .ds-badge.tone-sun { background: var(--sun); color: var(--ink); }
386
+ .ds-badge.tone-flame { background: var(--flame); color: var(--paper); }
387
+ .ds-badge.tone-live { background: var(--green-tint); color: var(--green-deep); }
388
+ .ds-badge.tone-wip { background: var(--bg-3); color: var(--fg-2); }
389
+ .ds-badge.tone-error { background: var(--flame); color: var(--paper); }
390
+ .ds-badge.tone-success { background: var(--green-tint); color: var(--green-deep); }
391
+ .ds-badge.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
392
+
321
393
  .chip {
322
394
  display: inline-flex; align-items: center; gap: 6px;
323
395
  padding: 3px 10px;
@@ -334,6 +406,12 @@ pre .n { color: var(--green-2); }
334
406
  .chip.tone-flame { background: var(--flame); color: var(--paper); }
335
407
  .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
336
408
  .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
409
+ .chip.tone-error { background: var(--flame); color: var(--paper); }
410
+ .chip.tone-success { background: var(--green-tint); color: var(--green-deep); }
411
+ .chip.tone-disabled { background: var(--bg-3); color: var(--fg-3); }
412
+ .chip.tone-ok { background: var(--green-tint); color: var(--green-deep); }
413
+ .chip.tone-miss { background: var(--flame); color: var(--paper); }
414
+ .chip.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
337
415
 
338
416
  .glyph {
339
417
  display: inline-flex; align-items: center; justify-content: center;
@@ -394,6 +472,9 @@ pre .n { color: var(--green-2); }
394
472
  .row:hover::before { background: var(--rule-strong); }
395
473
  .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
396
474
  .row.active::before { background: var(--accent); }
475
+ .row.row-state-disabled { opacity: 0.5; pointer-events: none; }
476
+ .row.row-state-error { background: color-mix(in oklab, var(--flame) 10%, var(--bg-2)); }
477
+ .row.row-state-error::before { background: var(--flame); }
397
478
  .row-grid { /* explicit grid-template-columns set inline */ }
398
479
 
399
480
  .row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
@@ -409,7 +490,7 @@ a.row { text-decoration: none; }
409
490
  .ds-hero {
410
491
  padding: var(--space-9) 0 var(--space-8);
411
492
  display: grid; gap: var(--space-5);
412
- max-width: 940px;
493
+ max-width: var(--measure-wide);
413
494
  }
414
495
  .ds-hero-title {
415
496
  font-family: var(--ff-body); font-weight: 600;
@@ -423,6 +504,8 @@ a.row { text-decoration: none; }
423
504
  color: var(--fg-2);
424
505
  }
425
506
  .ds-hero-accent { color: var(--accent); font-weight: 500; }
507
+ .ds-hero-actions { display: flex; gap: var(--space-2, 10px); flex-wrap: wrap; margin-top: var(--space-2, 8px); }
508
+ .ds-chat-title { margin: 0; font-size: inherit; }
426
509
 
427
510
  /* ============================================================
428
511
  Section grouping
@@ -588,6 +671,21 @@ table tr.clickable:hover td { background: var(--bg-2); }
588
671
  .row-form input:focus,
589
672
  .row-form textarea:focus { box-shadow: inset 0 0 0 2px var(--accent); }
590
673
 
674
+ /* Field char counter (TextField maxLength) */
675
+ .ds-field-count {
676
+ font-size: var(--fs-tiny, 12px);
677
+ color: var(--fg-3, var(--fg-2));
678
+ text-align: right;
679
+ }
680
+
681
+ /* Multi-column form layout (Form columns prop) */
682
+ .row-form[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
683
+ .row-form[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
684
+ @media (max-width: 600px) {
685
+ .row-form[data-columns="2"],
686
+ .row-form[data-columns="3"] { grid-template-columns: 1fr; }
687
+ }
688
+
591
689
  /* ============================================================
592
690
  Responsive Design — Mobile (480px), Tablet (1024px), Desktop (1440px+)
593
691
  ============================================================ */
@@ -668,7 +766,6 @@ table tr.clickable:hover td { background: var(--bg-2); }
668
766
  /* Chat */
669
767
  .chat-stack { max-width: 100%; min-width: 0; }
670
768
  .chat-bubble {
671
- max-width: clamp(200px, 85vw, 320px);
672
769
  padding: 10px 12px; font-size: var(--fs-sm);
673
770
  }
674
771
  .chat-avatar { width: 28px; height: 28px; font-size: 11px; }
@@ -778,7 +875,6 @@ table tr.clickable:hover td { background: var(--bg-2); }
778
875
  /* Chat Bubbles */
779
876
  .chat-stack { max-width: min(75%, 420px); }
780
877
  .chat-bubble {
781
- max-width: clamp(220px, 75vw, 420px);
782
878
  padding: 11px 14px; font-size: var(--fs-sm);
783
879
  }
784
880
  .chat-avatar { width: 32px; height: 32px; font-size: 12px; }
@@ -809,15 +905,29 @@ table tr.clickable:hover td { background: var(--bg-2); }
809
905
  }
810
906
  }
811
907
 
908
+ /* ────────────────────────────────────────────────────────────────────
909
+ Mid Breakpoint (768px and below) — collapse sidebar + simplify row grid
910
+ ────────────────────────────────────────────────────────────────────── */
911
+ @media (max-width: 768px) {
912
+ /* Sidebar stacks above main rather than sitting beside it */
913
+ .app-body { grid-template-columns: 1fr; }
914
+ .app-side { width: 100%; max-width: none; }
915
+
916
+ /* Row drops the leading code column; title + meta share the line */
917
+ .row {
918
+ grid-template-columns: minmax(0, 1fr) auto;
919
+ gap: var(--space-2);
920
+ }
921
+ .row .code { display: none; }
922
+ .row .sub { grid-column: 1 / -1; }
923
+ }
924
+
812
925
  /* ────────────────────────────────────────────────────────────────────
813
926
  Desktop Breakpoint Enhancements (1025px and up)
814
927
  ────────────────────────────────────────────────────────────────────── */
815
928
  @media (min-width: 1025px) {
816
929
  /* Chat Bubbles */
817
930
  .chat-stack { max-width: min(70%, 480px); }
818
- .chat-bubble {
819
- max-width: clamp(240px, 70vw, 480px);
820
- }
821
931
 
822
932
  /* KPI Cards */
823
933
  .kpi {
@@ -1096,7 +1206,7 @@ table tr.clickable:hover td { background: var(--bg-2); }
1096
1206
  border-radius: var(--r-2); color: var(--fg);
1097
1207
  font-family: inherit; font-size: var(--fs-sm);
1098
1208
  }
1099
- .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
1209
+ .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
1100
1210
  .btn-primary.danger {
1101
1211
  background: var(--warn);
1102
1212
  border-color: var(--warn);
@@ -1185,7 +1295,7 @@ table tr.clickable:hover td { background: var(--bg-2); }
1185
1295
  border-radius: var(--r-pill); color: var(--fg);
1186
1296
  font-family: inherit; font-size: var(--fs-xs);
1187
1297
  }
1188
- .ds-filter-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
1298
+ .ds-filter-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
1189
1299
 
1190
1300
  /* Loading skeleton — placeholder rows while a directory loads. */
1191
1301
  .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
@@ -1374,7 +1484,7 @@ table tr.clickable:hover td { background: var(--bg-2); }
1374
1484
  border-radius: 14px; line-height: 1.55;
1375
1485
  word-wrap: break-word; overflow-wrap: anywhere;
1376
1486
  font-size: var(--fs-sm);
1377
- max-width: 100%;
1487
+ max-width: clamp(220px, min(75vw, 28em), 480px);
1378
1488
  min-width: 0;
1379
1489
  transition: transform 0.12s ease, box-shadow 0.12s ease;
1380
1490
  }
@@ -1648,6 +1758,8 @@ table tr.clickable:hover td { background: var(--bg-2); }
1648
1758
  font-family: inherit; font-size: var(--fs-sm);
1649
1759
  line-height: 1.4; resize: none;
1650
1760
  min-height: 44px; max-height: 200px;
1761
+ box-sizing: border-box; overflow-y: auto;
1762
+ scrollbar-width: thin;
1651
1763
  }
1652
1764
  .chat-composer textarea::placeholder { color: var(--fg-3); }
1653
1765
  .chat-composer textarea:focus {
@@ -2205,6 +2317,12 @@ body {
2205
2317
  .ds-spinner-sm { height: 12px; gap: 2px; }
2206
2318
  .ds-spinner-sm span { width: 2px; height: 2px; }
2207
2319
 
2320
+ .ds-spinner-xs { height: 8px; gap: 1px; }
2321
+ .ds-spinner-xs span { width: 1.5px; height: 1.5px; }
2322
+
2323
+ .ds-spinner-xl { height: 32px; gap: 8px; }
2324
+ .ds-spinner-xl span { width: 8px; height: 8px; }
2325
+
2208
2326
  @keyframes ds-bounce {
2209
2327
  0%, 80%, 100% { transform: translateY(0); }
2210
2328
  40% { transform: translateY(-8px); }
@@ -2330,7 +2448,7 @@ body {
2330
2448
  .app-main { padding-left: var(--space-3); padding-right: var(--space-3); }
2331
2449
  }
2332
2450
 
2333
- /* Drawer scrim */
2451
+ /* Drawer scrim — lives inside .app-body, shown when drawer open ≤900px */
2334
2452
  .app-side-scrim {
2335
2453
  display: none;
2336
2454
  position: fixed; inset: 0;
@@ -2338,8 +2456,34 @@ body {
2338
2456
  z-index: 49;
2339
2457
  }
2340
2458
  @media (max-width: 900px) {
2341
- .app-body.side-open ~ .app-side-scrim,
2342
- .app-side-shell.open ~ .app-side-scrim { display: block; }
2459
+ .app-body.side-open .app-side-scrim { display: block; }
2460
+ }
2461
+
2462
+ /* Mobile nav toggle (hamburger) — hidden on desktop, shown ≤900px */
2463
+ .app-side-toggle {
2464
+ display: none;
2465
+ position: fixed; top: calc((var(--app-topbar-h) - 32px) / 2); left: 10px;
2466
+ z-index: 51;
2467
+ width: 36px; height: 36px;
2468
+ align-items: center; justify-content: center;
2469
+ font-size: 18px; line-height: 1;
2470
+ background: var(--bg-2); color: var(--fg);
2471
+ border: 1px solid var(--rule, color-mix(in oklab, var(--fg) 12%, transparent));
2472
+ border-radius: var(--r-1, 6px);
2473
+ cursor: pointer;
2474
+ }
2475
+ .app-side-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2476
+ @media (max-width: 900px) {
2477
+ .app-side-toggle { display: inline-flex; }
2478
+ .app-topbar .brand { margin-left: 44px; }
2479
+ }
2480
+
2481
+ /* Desktop: independent scroll for side rail and main, so a short viewport
2482
+ keeps the bottom nav items reachable and main scrolls on its own. */
2483
+ @media (min-width: 901px) {
2484
+ .app-body { min-height: 0; max-height: calc(100vh - var(--app-topbar-h) - var(--app-crumb-h, 0px) - var(--app-status-h, 0px)); }
2485
+ .app-side-shell { overflow-y: auto; max-height: 100%; }
2486
+ .app-main { overflow-y: auto; max-height: 100%; }
2343
2487
  }
2344
2488
 
2345
2489
  /* 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
+ }