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/dist/247420.css CHANGED
@@ -9,6 +9,10 @@
9
9
  @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');
10
10
 
11
11
  .ds-247420 {
12
+ /* Tree view indentation tokens */
13
+ --tree-indent: 12px;
14
+ --tree-base-indent: 6px;
15
+
12
16
  /* Paper / Ink — cool stone scale; lets lore palette pop. */
13
17
  --paper: #F6F5F1;
14
18
  --paper-2: #ECEBE6;
@@ -138,6 +142,18 @@
138
142
  --z-overlay: 1000;
139
143
 
140
144
  --measure: 68ch;
145
+ --measure-wide: 940px;
146
+ --measure-narrow: 760px;
147
+
148
+ --sidebar-width: 220px;
149
+ --sidebar-width-collapsed: 64px;
150
+
151
+ --lh-tall: 1.4;
152
+
153
+ /* Control size scale — heights for status/topbar/crumb + controls. */
154
+ --size-sm: 32px;
155
+ --size-base: 42px;
156
+ --size-lg: 56px;
141
157
  }
142
158
 
143
159
  /* ============================================================
@@ -168,7 +184,7 @@
168
184
  .ds-247420 textarea:focus-visible,
169
185
  .ds-247420 select:focus-visible {
170
186
  outline: 2px solid var(--accent);
171
- outline-offset: 1px;
187
+ outline-offset: 2px;
172
188
  }
173
189
 
174
190
  /* Interactive element focus-visible */
@@ -200,6 +216,10 @@
200
216
  --danger: oklch(0.68 0.19 25);
201
217
  }
202
218
 
219
+ /* NOTE: the [data-theme="auto"] block below intentionally duplicates the
220
+ [data-theme="ink"/"dark"] block above. They are NOT literally identical —
221
+ the explicit-dark block also overrides --danger for contrast — so they are
222
+ kept separate rather than consolidated to avoid a behavior change. */
203
223
  @media (prefers-color-scheme: dark) {
204
224
  .ds-247420[data-theme="auto"] {
205
225
  --bg: var(--ink);
@@ -311,6 +331,7 @@
311
331
  ============================================================ */
312
332
  .ds-247420 * { box-sizing: border-box; }
313
333
  .ds-247420, .ds-247420 body { margin: 0; padding: 0; }
334
+ .ds-247420 button, .ds-247420 input, .ds-247420 select, .ds-247420 textarea { font: inherit; }
314
335
 
315
336
  /* ============================================================
316
337
  Accessibility — Skip Link
@@ -330,7 +351,7 @@
330
351
  }
331
352
  .ds-247420 .skip-link:focus {
332
353
  top: 10px;
333
- outline: 2px solid var(--fg-3);
354
+ outline: 2px solid var(--accent);
334
355
  outline-offset: 2px;
335
356
  }
336
357
  .ds-247420 body {
@@ -373,7 +394,7 @@
373
394
 
374
395
  .ds-247420 .lede, .ds-247420 .t-lede {
375
396
  font-family: var(--ff-body); font-size: var(--fs-xl);
376
- line-height: 1.4; max-width: 38ch; font-weight: 400; color: var(--fg-2);
397
+ line-height: var(--lh-tall); max-width: 38ch; font-weight: 400; color: var(--fg-2);
377
398
  margin: 0;
378
399
  }
379
400
 
@@ -429,8 +450,8 @@
429
450
 
430
451
  .ds-247420 pre {
431
452
  font-family: var(--ff-mono);
432
- background: var(--ink);
433
- color: var(--paper);
453
+ background: var(--panel-bg, #15151a);
454
+ color: var(--panel-text, inherit);
434
455
  padding: var(--space-5);
435
456
  overflow-x: auto;
436
457
  line-height: 1.55;
@@ -460,9 +481,9 @@
460
481
  }
461
482
 
462
483
  .ds-247420 {
463
- --app-status-h: 42px;
464
- --app-topbar-h: 56px;
465
- --app-crumb-h: 32px;
484
+ --app-status-h: var(--size-base);
485
+ --app-topbar-h: var(--size-lg);
486
+ --app-crumb-h: var(--size-sm);
466
487
  }
467
488
 
468
489
  .ds-247420 .app-topbar {
@@ -531,8 +552,11 @@
531
552
  .ds-247420 .app-crumb .crumb-right { margin-left: auto; color: var(--fg-3); }
532
553
 
533
554
  .ds-247420 .app-side-shell { background: var(--bg); }
534
- .ds-247420 .app-body { display: grid; grid-template-columns: 220px minmax(0, 1fr); flex: 1; min-height: 0; }
555
+ .ds-247420 .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; }
535
556
  .ds-247420 .app-body.no-side { grid-template-columns: minmax(0, 1fr); }
557
+ /* When there is no sidebar, the empty side-shell must not occupy a grid row,
558
+ otherwise main wraps to a second (collapsed) row. Remove it from layout. */
559
+ .ds-247420 .app-body.no-side .app-side-shell { display: none; }
536
560
 
537
561
  .ds-247420 .app-side {
538
562
  display: flex; flex-direction: column; gap: var(--space-4);
@@ -572,23 +596,34 @@
572
596
  .ds-247420 .app-main {
573
597
  padding: var(--space-5) var(--pad-x) 0;
574
598
  min-width: 0;
599
+ /* Full-height flex column so a single flex:1 child (e.g. .chat) fills the
600
+ region between crumb and status instead of floating at content height. */
601
+ display: flex; flex-direction: column;
602
+ min-height: 0;
603
+ align-self: stretch;
604
+ height: 100%;
575
605
  }
576
- .ds-247420 .app-main.narrow { max-width: 760px; margin: 0 auto; }
606
+ .ds-247420 .app-main > * { min-height: 0; }
607
+ .ds-247420 .app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
577
608
 
578
609
  @media (min-width: 1400px) {
579
610
  .ds-247420 .app { max-width: 1400px; margin-left: auto; margin-right: auto; }
580
611
  .ds-247420 .app-main .chat,
581
612
  .ds-247420 .app-main > .chat-area,
582
613
  .ds-247420 .app-main > .main-content { max-width: none; margin: 0; width: 100%; }
583
- .ds-247420 .app-status { max-width: 1400px; margin-left: auto; margin-right: auto; left: 0; right: 0; }
614
+ /* Status bar inherits the .app max-width cap above and stretches edge-to-edge
615
+ within it; no separate width constraint (which previously narrowed it). */
616
+ .ds-247420 .app-status { width: 100%; }
584
617
  }
585
618
 
586
619
  .ds-247420 .app-status {
587
620
  display: flex; align-items: center; gap: var(--space-3);
621
+ width: 100%;
588
622
  min-height: var(--app-status-h);
589
623
  padding: 10px var(--pad-x);
590
624
  font-family: var(--ff-mono); font-size: var(--fs-xs);
591
625
  color: var(--fg-3);
626
+ border-top: 1px solid var(--rule);
592
627
  }
593
628
  .ds-247420 .app-status .item { color: inherit; }
594
629
  .ds-247420 .app-status .item:first-of-type { color: var(--accent); }
@@ -620,6 +655,54 @@
620
655
  outline-offset: 2px;
621
656
  }
622
657
 
658
+ /* ============================================================
659
+ IconButton — square icon-only button
660
+ ============================================================ */
661
+ .ds-247420 .ds-icon-btn {
662
+ display: inline-flex; align-items: center; justify-content: center;
663
+ padding: 0; border: none; cursor: pointer;
664
+ border-radius: var(--r-1, 6px);
665
+ background: transparent; color: var(--fg);
666
+ width: 32px; height: 32px;
667
+ }
668
+ .ds-247420 .ds-icon-btn-xs { width: 22px; height: 22px; }
669
+ .ds-247420 .ds-icon-btn-sm { width: 26px; height: 26px; }
670
+ .ds-247420 .ds-icon-btn-base { width: 32px; height: 32px; }
671
+ .ds-247420 .ds-icon-btn-lg { width: 40px; height: 40px; }
672
+ .ds-247420 .ds-icon-btn-xl { width: 48px; height: 48px; }
673
+ .ds-247420 .ds-icon-btn-ghost { background: transparent; }
674
+ .ds-247420 .ds-icon-btn-ghost:hover { background: var(--bg-2); }
675
+ .ds-247420 .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
676
+ .ds-247420 .ds-icon-btn-primary:hover { background: var(--fg); color: var(--bg); }
677
+ .ds-247420 .ds-icon-btn-danger { background: var(--flame); color: var(--paper); }
678
+ .ds-247420 .ds-icon-btn-danger:hover { filter: brightness(1.1); }
679
+ .ds-247420 .ds-icon-btn:active { transform: translateY(1px); }
680
+ .ds-247420 .ds-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
681
+ .ds-247420 .ds-icon-btn:disabled, .ds-247420 .ds-icon-btn.is-disabled {
682
+ opacity: 0.5; cursor: not-allowed; pointer-events: none;
683
+ }
684
+
685
+ /* ============================================================
686
+ Badge — small inline count/status pill
687
+ ============================================================ */
688
+ .ds-247420 .ds-badge {
689
+ display: inline-flex; align-items: center; justify-content: center;
690
+ min-width: 18px; height: 18px; padding: 0 6px;
691
+ font-size: 11px; font-weight: 600; line-height: 1;
692
+ border-radius: 999px;
693
+ background: var(--bg-3); color: var(--fg-2);
694
+ }
695
+ .ds-247420 .ds-badge.tone-green { background: var(--green-tint); color: var(--green-deep); }
696
+ .ds-247420 .ds-badge.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
697
+ .ds-247420 .ds-badge.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
698
+ .ds-247420 .ds-badge.tone-sun { background: var(--sun); color: var(--ink); }
699
+ .ds-247420 .ds-badge.tone-flame { background: var(--flame); color: var(--paper); }
700
+ .ds-247420 .ds-badge.tone-live { background: var(--green-tint); color: var(--green-deep); }
701
+ .ds-247420 .ds-badge.tone-wip { background: var(--bg-3); color: var(--fg-2); }
702
+ .ds-247420 .ds-badge.tone-error { background: var(--flame); color: var(--paper); }
703
+ .ds-247420 .ds-badge.tone-success { background: var(--green-tint); color: var(--green-deep); }
704
+ .ds-247420 .ds-badge.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
705
+
623
706
  .ds-247420 .chip {
624
707
  display: inline-flex; align-items: center; gap: 6px;
625
708
  padding: 3px 10px;
@@ -636,6 +719,12 @@
636
719
  .ds-247420 .chip.tone-flame { background: var(--flame); color: var(--paper); }
637
720
  .ds-247420 .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
638
721
  .ds-247420 .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
722
+ .ds-247420 .chip.tone-error { background: var(--flame); color: var(--paper); }
723
+ .ds-247420 .chip.tone-success { background: var(--green-tint); color: var(--green-deep); }
724
+ .ds-247420 .chip.tone-disabled { background: var(--bg-3); color: var(--fg-3); }
725
+ .ds-247420 .chip.tone-ok { background: var(--green-tint); color: var(--green-deep); }
726
+ .ds-247420 .chip.tone-miss { background: var(--flame); color: var(--paper); }
727
+ .ds-247420 .chip.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
639
728
 
640
729
  .ds-247420 .glyph {
641
730
  display: inline-flex; align-items: center; justify-content: center;
@@ -696,6 +785,9 @@
696
785
  .ds-247420 .row:hover::before { background: var(--rule-strong); }
697
786
  .ds-247420 .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
698
787
  .ds-247420 .row.active::before { background: var(--accent); }
788
+ .ds-247420 .row.row-state-disabled { opacity: 0.5; pointer-events: none; }
789
+ .ds-247420 .row.row-state-error { background: color-mix(in oklab, var(--flame) 10%, var(--bg-2)); }
790
+ .ds-247420 .row.row-state-error::before { background: var(--flame); }
699
791
  .ds-247420 .row-grid { /* explicit grid-template-columns set inline */ }
700
792
 
701
793
  .ds-247420 .row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
@@ -711,7 +803,7 @@
711
803
  .ds-247420 .ds-hero {
712
804
  padding: var(--space-9) 0 var(--space-8);
713
805
  display: grid; gap: var(--space-5);
714
- max-width: 940px;
806
+ max-width: var(--measure-wide);
715
807
  }
716
808
  .ds-247420 .ds-hero-title {
717
809
  font-family: var(--ff-body); font-weight: 600;
@@ -725,6 +817,8 @@
725
817
  color: var(--fg-2);
726
818
  }
727
819
  .ds-247420 .ds-hero-accent { color: var(--accent); font-weight: 500; }
820
+ .ds-247420 .ds-hero-actions { display: flex; gap: var(--space-2, 10px); flex-wrap: wrap; margin-top: var(--space-2, 8px); }
821
+ .ds-247420 .ds-chat-title { margin: 0; font-size: inherit; }
728
822
 
729
823
  /* ============================================================
730
824
  Section grouping
@@ -890,6 +984,21 @@
890
984
  .ds-247420 .row-form input:focus,
891
985
  .ds-247420 .row-form textarea:focus { box-shadow: inset 0 0 0 2px var(--accent); }
892
986
 
987
+ /* Field char counter (TextField maxLength) */
988
+ .ds-247420 .ds-field-count {
989
+ font-size: var(--fs-tiny, 12px);
990
+ color: var(--fg-3, var(--fg-2));
991
+ text-align: right;
992
+ }
993
+
994
+ /* Multi-column form layout (Form columns prop) */
995
+ .ds-247420 .row-form[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
996
+ .ds-247420 .row-form[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
997
+ @media (max-width: 600px) {
998
+ .ds-247420 .row-form[data-columns="2"],
999
+ .ds-247420 .row-form[data-columns="3"] { grid-template-columns: 1fr; }
1000
+ }
1001
+
893
1002
  /* ============================================================
894
1003
  Responsive Design — Mobile (480px), Tablet (1024px), Desktop (1440px+)
895
1004
  ============================================================ */
@@ -970,7 +1079,6 @@
970
1079
  /* Chat */
971
1080
  .ds-247420 .chat-stack { max-width: 100%; min-width: 0; }
972
1081
  .ds-247420 .chat-bubble {
973
- max-width: clamp(200px, 85vw, 320px);
974
1082
  padding: 10px 12px; font-size: var(--fs-sm);
975
1083
  }
976
1084
  .ds-247420 .chat-avatar { width: 28px; height: 28px; font-size: 11px; }
@@ -1080,7 +1188,6 @@
1080
1188
  /* Chat Bubbles */
1081
1189
  .ds-247420 .chat-stack { max-width: min(75%, 420px); }
1082
1190
  .ds-247420 .chat-bubble {
1083
- max-width: clamp(220px, 75vw, 420px);
1084
1191
  padding: 11px 14px; font-size: var(--fs-sm);
1085
1192
  }
1086
1193
  .ds-247420 .chat-avatar { width: 32px; height: 32px; font-size: 12px; }
@@ -1111,15 +1218,29 @@
1111
1218
  }
1112
1219
  }
1113
1220
 
1221
+ /* ────────────────────────────────────────────────────────────────────
1222
+ Mid Breakpoint (768px and below) — collapse sidebar + simplify row grid
1223
+ ────────────────────────────────────────────────────────────────────── */
1224
+ @media (max-width: 768px) {
1225
+ /* Sidebar stacks above main rather than sitting beside it */
1226
+ .ds-247420 .app-body { grid-template-columns: 1fr; }
1227
+ .ds-247420 .app-side { width: 100%; max-width: none; }
1228
+
1229
+ /* Row drops the leading code column; title + meta share the line */
1230
+ .ds-247420 .row {
1231
+ grid-template-columns: minmax(0, 1fr) auto;
1232
+ gap: var(--space-2);
1233
+ }
1234
+ .ds-247420 .row .code { display: none; }
1235
+ .ds-247420 .row .sub { grid-column: 1 / -1; }
1236
+ }
1237
+
1114
1238
  /* ────────────────────────────────────────────────────────────────────
1115
1239
  Desktop Breakpoint Enhancements (1025px and up)
1116
1240
  ────────────────────────────────────────────────────────────────────── */
1117
1241
  @media (min-width: 1025px) {
1118
1242
  /* Chat Bubbles */
1119
1243
  .ds-247420 .chat-stack { max-width: min(70%, 480px); }
1120
- .ds-247420 .chat-bubble {
1121
- max-width: clamp(240px, 70vw, 480px);
1122
- }
1123
1244
 
1124
1245
  /* KPI Cards */
1125
1246
  .ds-247420 .kpi {
@@ -1398,7 +1519,7 @@
1398
1519
  border-radius: var(--r-2); color: var(--fg);
1399
1520
  font-family: inherit; font-size: var(--fs-sm);
1400
1521
  }
1401
- .ds-247420 .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
1522
+ .ds-247420 .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
1402
1523
  .ds-247420 .btn-primary.danger {
1403
1524
  background: var(--warn);
1404
1525
  border-color: var(--warn);
@@ -1487,7 +1608,7 @@
1487
1608
  border-radius: var(--r-pill); color: var(--fg);
1488
1609
  font-family: inherit; font-size: var(--fs-xs);
1489
1610
  }
1490
- .ds-247420 .ds-filter-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
1611
+ .ds-247420 .ds-filter-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
1491
1612
 
1492
1613
  /* Loading skeleton — placeholder rows while a directory loads. */
1493
1614
  .ds-247420 .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
@@ -1676,7 +1797,7 @@
1676
1797
  border-radius: 14px; line-height: 1.55;
1677
1798
  word-wrap: break-word; overflow-wrap: anywhere;
1678
1799
  font-size: var(--fs-sm);
1679
- max-width: 100%;
1800
+ max-width: clamp(220px, min(75vw, 28em), 480px);
1680
1801
  min-width: 0;
1681
1802
  transition: transform 0.12s ease, box-shadow 0.12s ease;
1682
1803
  }
@@ -1950,6 +2071,8 @@
1950
2071
  font-family: inherit; font-size: var(--fs-sm);
1951
2072
  line-height: 1.4; resize: none;
1952
2073
  min-height: 44px; max-height: 200px;
2074
+ box-sizing: border-box; overflow-y: auto;
2075
+ scrollbar-width: thin;
1953
2076
  }
1954
2077
  .ds-247420 .chat-composer textarea::placeholder { color: var(--fg-3); }
1955
2078
  .ds-247420 .chat-composer textarea:focus {
@@ -2497,6 +2620,12 @@
2497
2620
  .ds-247420 .ds-spinner-sm { height: 12px; gap: 2px; }
2498
2621
  .ds-247420 .ds-spinner-sm span { width: 2px; height: 2px; }
2499
2622
 
2623
+ .ds-247420 .ds-spinner-xs { height: 8px; gap: 1px; }
2624
+ .ds-247420 .ds-spinner-xs span { width: 1.5px; height: 1.5px; }
2625
+
2626
+ .ds-247420 .ds-spinner-xl { height: 32px; gap: 8px; }
2627
+ .ds-247420 .ds-spinner-xl span { width: 8px; height: 8px; }
2628
+
2500
2629
  @keyframes ds-bounce {
2501
2630
  0%, 80%, 100% { transform: translateY(0); }
2502
2631
  40% { transform: translateY(-8px); }
@@ -2622,7 +2751,7 @@
2622
2751
  .ds-247420 .app-main { padding-left: var(--space-3); padding-right: var(--space-3); }
2623
2752
  }
2624
2753
 
2625
- /* Drawer scrim */
2754
+ /* Drawer scrim — lives inside .app-body, shown when drawer open ≤900px */
2626
2755
  .ds-247420 .app-side-scrim {
2627
2756
  display: none;
2628
2757
  position: fixed; inset: 0;
@@ -2630,8 +2759,34 @@
2630
2759
  z-index: 49;
2631
2760
  }
2632
2761
  @media (max-width: 900px) {
2633
- .ds-247420 .app-body.side-open ~ .app-side-scrim,
2634
- .ds-247420 .app-side-shell.open ~ .app-side-scrim { display: block; }
2762
+ .ds-247420 .app-body.side-open .app-side-scrim { display: block; }
2763
+ }
2764
+
2765
+ /* Mobile nav toggle (hamburger) — hidden on desktop, shown ≤900px */
2766
+ .ds-247420 .app-side-toggle {
2767
+ display: none;
2768
+ position: fixed; top: calc((var(--app-topbar-h) - 32px) / 2); left: 10px;
2769
+ z-index: 51;
2770
+ width: 36px; height: 36px;
2771
+ align-items: center; justify-content: center;
2772
+ font-size: 18px; line-height: 1;
2773
+ background: var(--bg-2); color: var(--fg);
2774
+ border: 1px solid var(--rule, color-mix(in oklab, var(--fg) 12%, transparent));
2775
+ border-radius: var(--r-1, 6px);
2776
+ cursor: pointer;
2777
+ }
2778
+ .ds-247420 .app-side-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2779
+ @media (max-width: 900px) {
2780
+ .ds-247420 .app-side-toggle { display: inline-flex; }
2781
+ .ds-247420 .app-topbar .brand { margin-left: 44px; }
2782
+ }
2783
+
2784
+ /* Desktop: independent scroll for side rail and main, so a short viewport
2785
+ keeps the bottom nav items reachable and main scrolls on its own. */
2786
+ @media (min-width: 901px) {
2787
+ .ds-247420 .app-body { min-height: 0; max-height: calc(100vh - var(--app-topbar-h) - var(--app-crumb-h, 0px) - var(--app-status-h, 0px)); }
2788
+ .ds-247420 .app-side-shell { overflow-y: auto; max-height: 100%; }
2789
+ .ds-247420 .app-main { overflow-y: auto; max-height: 100%; }
2635
2790
  }
2636
2791
 
2637
2792
  /* Mobile (≤480) status bar compact; hide tail item */
@@ -3171,7 +3326,7 @@
3171
3326
  width: 20px;
3172
3327
  height: 20px;
3173
3328
  border-radius: 50%;
3174
- background: var(--bg-3);
3329
+ background: var(--avatar-bg, var(--bg-3));
3175
3330
  color: var(--fg-2);
3176
3331
  display: inline-flex;
3177
3332
  align-items: center;
@@ -3304,7 +3459,7 @@
3304
3459
  width: 32px;
3305
3460
  height: 32px;
3306
3461
  border-radius: 50%;
3307
- background: var(--bg-3);
3462
+ background: var(--avatar-bg, var(--bg-3));
3308
3463
  color: var(--fg-2);
3309
3464
  display: inline-flex;
3310
3465
  align-items: center;
@@ -3508,7 +3663,7 @@
3508
3663
  width: 28px;
3509
3664
  height: 28px;
3510
3665
  border-radius: 50%;
3511
- background: var(--bg-3);
3666
+ background: var(--avatar-bg, var(--bg-3));
3512
3667
  color: var(--fg-2);
3513
3668
  display: inline-flex;
3514
3669
  align-items: center;
@@ -3569,7 +3724,7 @@
3569
3724
  width: 56px;
3570
3725
  height: 56px;
3571
3726
  border-radius: 50%;
3572
- background: var(--bg-3);
3727
+ background: var(--avatar-bg, var(--bg-3));
3573
3728
  color: var(--fg-2);
3574
3729
  display: inline-flex;
3575
3730
  align-items: center;
@@ -4161,6 +4316,27 @@
4161
4316
  .ds-247420 .cm-page-body { padding: var(--space-3); line-height: 1.6; }
4162
4317
  .ds-247420 .cm-page-empty { color: var(--fg-2, var(--fg)); opacity: .7; }
4163
4318
 
4319
+ /* ============================================================
4320
+ freddie pages — layout for FREDDIE_PAGES renderers.
4321
+ Scoped under .ds-247420 by the build prefixer. Tokens only.
4322
+ ============================================================ */
4323
+ .ds-247420 .fd-page-root { display: block; height: 100%; }
4324
+ .ds-247420 .fd-page-inner { display: flex; flex-direction: column; gap: var(--space-3, 16px); padding: var(--space-3, 16px); max-width: 1100px; }
4325
+ .ds-247420 .fd-page-inner > * { min-width: 0; }
4326
+ .ds-247420 .fd-loading { display: flex; align-items: center; gap: var(--space-2, 10px); padding: var(--space-4, 24px); color: var(--fg-2, var(--fg)); }
4327
+ .ds-247420 .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; }
4328
+ .ds-247420 .fd-empty-glyph { font-size: 28px; opacity: .55; line-height: 1; }
4329
+ .ds-247420 .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; }
4330
+ .ds-247420 .fd-skill-body { max-height: 320px; }
4331
+ .ds-247420 .fd-row-actions { display: inline-flex; gap: var(--space-1, 6px); align-items: center; }
4332
+ .ds-247420 .fd-chat { display: flex; flex-direction: column; gap: var(--space-2, 10px); height: 100%; min-height: 0; }
4333
+ .ds-247420 .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); }
4334
+ .ds-247420 .fd-page-error { white-space: pre-wrap; overflow-wrap: anywhere; }
4335
+ /* page-level responsive: tighten padding on narrow viewports */
4336
+ @media (max-width: 640px) {
4337
+ .ds-247420 .fd-page-inner { padding: var(--space-2, 10px); gap: var(--space-2, 10px); }
4338
+ }
4339
+
4164
4340
  /* chat.css */
4165
4341
  /* chat.css — chat-specific styles. Currently empty; all chat styles live in
4166
4342
  app-shell.css under the .chat-* prefix. Reserved for future split. */
@@ -4180,7 +4356,7 @@
4180
4356
  border-bottom: 1px solid var(--rule);
4181
4357
  font: var(--fs-tiny, 12px)/var(--lh-base, 1.4) var(--ff-mono, monospace);
4182
4358
  }
4183
- .ds-247420 .ds-ep-toolbar.dense { padding: 4px 6px; gap: 4px; }
4359
+ .ds-247420 .ds-ep-toolbar.dense { padding: 2px 4px; gap: 2px; }
4184
4360
  .ds-247420 .ds-ep-toolbar-leading,
4185
4361
  .ds-247420 .ds-ep-toolbar-center,
4186
4362
  .ds-247420 .ds-ep-toolbar-trailing { display: flex; align-items: center; gap: 4px; }
@@ -4190,7 +4366,8 @@
4190
4366
  /* Tabs */
4191
4367
  .ds-247420 .ds-ep-tabs { display: flex; flex-direction: column; min-height: 0; height: 100%; }
4192
4368
  .ds-247420 .ds-ep-tabs-head {
4193
- display: flex; flex-shrink: 0;
4369
+ display: flex; flex-shrink: 0; flex-wrap: nowrap;
4370
+ overflow-x: auto; scroll-behavior: smooth;
4194
4371
  background: var(--panel-1);
4195
4372
  border-bottom: 1px solid var(--rule);
4196
4373
  }
@@ -4217,6 +4394,7 @@
4217
4394
  overflow: auto;
4218
4395
  }
4219
4396
  .ds-247420 .ds-ep-tree-item { display: flex; flex-direction: column; }
4397
+ .ds-247420 .ds-ep-tree-item:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
4220
4398
  .ds-247420 .ds-ep-tree-row {
4221
4399
  display: flex; align-items: center; gap: 6px;
4222
4400
  padding: 4px 8px 4px 0;
@@ -4256,7 +4434,7 @@
4256
4434
  }
4257
4435
  .ds-247420 .ds-ep-propfield {
4258
4436
  display: grid;
4259
- grid-template-columns: 120px 1fr;
4437
+ grid-template-columns: minmax(80px, 120px) 1fr;
4260
4438
  gap: 4px 10px;
4261
4439
  align-items: center;
4262
4440
  }
@@ -4319,6 +4497,14 @@
4319
4497
  }
4320
4498
  .ds-247420 .ds-ep-dock-center > * { pointer-events: auto; }
4321
4499
 
4500
+ /* Mobile — stack dock regions vertically instead of the 3x3 grid */
4501
+ @media (max-width: 600px) {
4502
+ .ds-247420 .ds-ep-dock {
4503
+ display: flex;
4504
+ flex-direction: column;
4505
+ }
4506
+ }
4507
+
4322
4508
  /* IconButtonGroup */
4323
4509
  .ds-247420 .ds-ep-btngrp {
4324
4510
  display: inline-flex;
@@ -4378,6 +4564,8 @@
4378
4564
  .ds-247420 .ds-ep-split.horiz { flex-direction: row; }
4379
4565
  .ds-247420 .ds-ep-split.vert { flex-direction: column; }
4380
4566
  .ds-247420 .ds-ep-split-pane { overflow: auto; }
4567
+ .ds-247420 .ds-ep-split.horiz > .ds-ep-split-pane:not(.grow) { width: var(--split-size); }
4568
+ .ds-247420 .ds-ep-split.vert > .ds-ep-split-pane:not(.grow) { height: var(--split-size); }
4381
4569
  .ds-247420 .ds-ep-split-pane.grow { flex: 1 1 0; }
4382
4570
 
4383
4571
  /* ---------------------------------------------------------------