anentrypoint-design 0.0.480 → 0.0.482

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/chat.css CHANGED
@@ -244,7 +244,7 @@
244
244
  .chat-msg-action {
245
245
  display: inline-flex; align-items: center; justify-content: center; gap: var(--space-1);
246
246
  min-width: 26px; height: 26px; padding: 0 var(--space-1-75); cursor: pointer;
247
- border: none; border-radius: var(--r-1, 4px); background: none; color: var(--fg-3);
247
+ border: none; border-radius: var(--r-1, 8px); background: none; color: var(--fg-3);
248
248
  font-family: var(--ff-body); font-size: var(--fs-tiny);
249
249
  }
250
250
  .chat-msg-action-label { font-size: var(--fs-tiny); }
@@ -312,7 +312,7 @@
312
312
  display: flex; align-items: center; gap: var(--space-2, 8px);
313
313
  padding: var(--space-1, 4px) var(--space-2, 8px);
314
314
  border: var(--bw-hair) solid var(--rule);
315
- border-radius: var(--r-1, 4px);
315
+ border-radius: var(--r-1, 8px);
316
316
  background: var(--bg-2);
317
317
  }
318
318
  .agentchat-install-agent { flex: 0 0 auto; font-size: var(--fs-tiny); color: var(--fg-3); min-width: 8ch; }
@@ -322,7 +322,7 @@
322
322
  }
323
323
  .agentchat-install-copy {
324
324
  flex: 0 0 auto; cursor: pointer; padding: var(--space-hair) var(--space-2); min-height: 24px;
325
- border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
325
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 8px);
326
326
  background: none; color: var(--fg-3);
327
327
  font-family: var(--ff-body); font-size: var(--fs-tiny);
328
328
  }
@@ -333,7 +333,7 @@
333
333
  /* Host-supplied transcript export actions riding the controls row. */
334
334
  .agentchat-export-act {
335
335
  cursor: pointer; padding: var(--space-1) var(--space-2-5); min-height: 32px;
336
- border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
336
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 8px);
337
337
  background: none; color: var(--fg-3);
338
338
  font-family: var(--ff-body); font-size: var(--fs-tiny);
339
339
  }
@@ -567,7 +567,7 @@
567
567
  background: var(--bg); border: var(--border-w) solid var(--accent); border-radius: var(--r-1);
568
568
  padding: var(--space-1) var(--space-2);
569
569
  }
570
- .ds-session-rename-input:focus { outline: none; box-shadow: var(--focus-ring-inset); }
570
+ .ds-session-rename-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
571
571
 
572
572
  /* Inline delete confirm — same row height, two flat buttons, no modal;
573
573
  mirrors SessionDashboard's arm-then-confirm bulk-stop control. */
@@ -609,7 +609,7 @@
609
609
  .ds-dash-header .btn-primary.danger.is-armed { background: var(--warn); color: var(--ink); border-color: var(--warn); }
610
610
  .ds-dash-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--space-2); padding: var(--space-3); }
611
611
  @media (min-width: 1500px) { .ds-dash-grid { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); } }
612
- .ds-dash-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-2); }
612
+ .ds-dash-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1); }
613
613
 
614
614
  /* Compact density — one line per session. The comfortable card stacks title +
615
615
  head + meta + actions as four flex rows and measured 208px tall on a real
@@ -777,7 +777,7 @@
777
777
  position: absolute; top: 6px; right: 6px;
778
778
  display: inline-flex; align-items: center; justify-content: center;
779
779
  min-width: 48px; min-height: 24px; padding: var(--space-hair) var(--space-2);
780
- border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
780
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 8px);
781
781
  background: var(--bg-2); color: var(--fg-2); cursor: pointer;
782
782
  font-family: var(--ff-body); font-size: var(--fs-tiny);
783
783
  opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease);
@@ -399,6 +399,17 @@
399
399
  --sidebar-width: 220px;
400
400
  --sidebar-width-collapsed: 64px;
401
401
 
402
+ /* Canonical breakpoint values — @media can't reference custom properties,
403
+ so these are documented here (not tokenized) for consistency across
404
+ responsive.css/responsive2-workspace.css/hero-content.css:
405
+ - 480px (max-width) mobile portrait
406
+ - 768px (max-width) mobile/tablet boundary, compact nav/sidebar collapse
407
+ - 768-1024px (min/max-width) tablet landscape band
408
+ - 900px (max-width) / 901px (min-width) tablet/desktop layout reflow
409
+ - 1025px (min-width) desktop
410
+ Always use these exact values; a near-miss (e.g. 760px, 481px) should be
411
+ aligned to its canonical neighbour when touched. */
412
+
402
413
  --lh-tall: 1.4;
403
414
 
404
415
  /* Control size scale — heights for status/topbar/crumb + controls. */
package/community.css CHANGED
@@ -132,11 +132,11 @@
132
132
  min-width: 18px;
133
133
  height: 18px;
134
134
  padding: 0 var(--space-1-5);
135
- /* TODO(a11y): --paper is a fixed near-white on --warn (#FF5A52) -- likely
136
- ~3:1, below the 4.5:1 AA floor (same defect fixed via --ink elsewhere
137
- for --warn text). Small numeric badge; needs contrast audit. */
135
+ /* --ink, not --paper: --paper is a fixed near-white, which measures ~3:1 on
136
+ --warn (#FF5A52) -- below the 4.5:1 AA floor. --ink clears it (same fix
137
+ as .btn-primary.danger in app-shell/files.css). */
138
138
  background: var(--warn);
139
- color: var(--paper);
139
+ color: var(--ink);
140
140
  font-family: var(--ff-mono);
141
141
  font-size: var(--fs-micro);
142
142
  font-weight: 700;
@@ -467,11 +467,11 @@
467
467
  min-width: 16px;
468
468
  height: 16px;
469
469
  padding: 0 var(--space-1-5);
470
- /* TODO(a11y): --paper is a fixed near-white on --warn (#FF5A52) -- likely
471
- ~3:1, below the 4.5:1 AA floor (same defect fixed via --ink elsewhere
472
- for --warn text). Small numeric badge; needs contrast audit. */
470
+ /* --ink, not --paper: --paper is a fixed near-white, which measures ~3:1 on
471
+ --warn (#FF5A52) -- below the 4.5:1 AA floor. --ink clears it (same fix
472
+ as .btn-primary.danger in app-shell/files.css). */
473
473
  background: var(--warn);
474
- color: var(--paper);
474
+ color: var(--ink);
475
475
  font-family: var(--ff-mono);
476
476
  font-size: var(--fs-micro);
477
477
  font-weight: 700;
@@ -1690,13 +1690,15 @@
1690
1690
  .fd-page-inner { display: flex; flex-direction: column; gap: var(--space-3, 16px); padding: var(--space-3, 16px); max-width: 1100px; }
1691
1691
  .fd-page-inner > * { min-width: 0; }
1692
1692
  .fd-loading { display: flex; align-items: center; gap: var(--space-2, 10px); padding: var(--space-4, 24px); color: var(--fg-2, var(--fg)); }
1693
- .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; }
1693
+ /* Base layout shared with .ds-empty-state (primitives.css); overrides padding
1694
+ (--space-5, denser than the shared --space-6) and color for this context. */
1695
+ .fd-empty { padding: var(--space-5, 32px) var(--space-3, 16px); color: var(--fg-2, var(--fg)); }
1694
1696
  /* 28px is an ICON size (empty-state mark), not a type tier — the --fs-* ladder
1695
1697
  tops out at --fs-xl (21px) before every remaining rung becomes a fluid
1696
1698
  heading clamp, so neither substitutes without visibly resizing the mark.
1697
1699
  --fs-2xl bridges that gap as a fixed 28px token. */
1698
1700
  .fd-empty-glyph { font-size: var(--fs-2xl); opacity: .55; line-height: 1; }
1699
- .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: var(--fs-micro); line-height: 1.5; }
1701
+ .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, 8px); 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: var(--fs-micro); line-height: 1.5; }
1700
1702
  .fd-skill-body { max-height: 320px; }
1701
1703
  .fd-row-actions { display: inline-flex; gap: var(--space-1, 6px); align-items: center; }
1702
1704
  .fd-chat { display: flex; flex-direction: column; gap: var(--space-2, 10px); height: 100%; min-height: 0; }
package/dist/247420.css CHANGED
@@ -401,6 +401,17 @@
401
401
  --sidebar-width: 220px;
402
402
  --sidebar-width-collapsed: 64px;
403
403
 
404
+ /* Canonical breakpoint values — @media can't reference custom properties,
405
+ so these are documented here (not tokenized) for consistency across
406
+ responsive.css/responsive2-workspace.css/hero-content.css:
407
+ - 480px (max-width) mobile portrait
408
+ - 768px (max-width) mobile/tablet boundary, compact nav/sidebar collapse
409
+ - 768-1024px (min/max-width) tablet landscape band
410
+ - 900px (max-width) / 901px (min-width) tablet/desktop layout reflow
411
+ - 1025px (min-width) desktop
412
+ Always use these exact values; a near-miss (e.g. 760px, 481px) should be
413
+ aligned to its canonical neighbour when touched. */
414
+
404
415
  --lh-tall: 1.4;
405
416
 
406
417
  /* Control size scale — heights for status/topbar/crumb + controls. */
@@ -1356,13 +1367,26 @@
1356
1367
  .ds-247420 .app-main > .ds-file-stage,
1357
1368
  .ds-247420 .app-main > .ds-files-stack,
1358
1369
  .ds-247420 .app-main > .grow { flex: 1 1 auto; min-height: 0; }
1359
- .ds-247420 .app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
1370
+ /* width:100% is load-bearing, not redundant with max-width: .app-body is a
1371
+ CSS grid, and margin:auto on a grid item overrides the default stretch,
1372
+ shrinking the item to its max-content width instead of filling the track
1373
+ and then clamping -- confirmed live at 2560px viewport where mainWidth
1374
+ measured 688px against a correctly-resolved 1400px max-width. Explicit
1375
+ width:100% restores fill-then-cap for every .narrow page, not just wide
1376
+ viewports (the shrink-to-fit bug undersized even the base 760px case). */
1377
+ .ds-247420 .app-main.narrow { width: 100%; max-width: var(--measure-narrow); margin: 0 auto; }
1360
1378
  /* A shell with no sidebar has no competing column, so the prose clamp there was
1361
1379
  leaving the whole sidebar's worth of width empty -- 760px of content inside a
1362
1380
  1413px shell on a real page. Widen the clamp by the space the absent sidebar
1363
- would have taken so the measure still reads as prose, just not starved. */
1381
+ would have taken so the measure still reads as prose, just not starved.
1382
+ The floor stays a fixed 980px (no-side is still readable narrow); the
1383
+ ceiling grows with viewport instead of staying pinned at 980px forever --
1384
+ on a 2560px ultrawide the old fixed value left over half the shell as dead
1385
+ side margin. 1400px ceiling keeps prose measure sane (nobody wants a
1386
+ 2400px-wide paragraph) while letting non-prose content (index rows, meta)
1387
+ actually use the extra room. */
1364
1388
  .ds-247420 .app-body.no-side .app-main.narrow {
1365
- max-width: calc(var(--measure-narrow) + var(--sidebar-width));
1389
+ max-width: clamp(calc(var(--measure-narrow) + var(--sidebar-width)), 60vw, 1400px);
1366
1390
  }
1367
1391
  /* Article-body heading rhythm and lede spacing, consumed by flatspace-rendered
1368
1392
  long-form pages (docs, papers) that drop headings/panels directly into .app-main. */
@@ -1490,6 +1514,9 @@
1490
1514
  padding: 0 var(--space-4); font-size: var(--fs-body); gap: var(--space-2);
1491
1515
  }
1492
1516
 
1517
+ /* App chrome is compact/dense (see --fs-h1-app etc in colors_and_type.css) --
1518
+ the marketing-scale hover lift/shadow reads as an oversized flourish at
1519
+ this density, so app-typescale buttons opt out of it deliberately. */
1493
1520
  .ds-247420[data-typescale="app"] .btn:hover,
1494
1521
  .ds-247420[data-typescale="app"] .btn-primary:hover,
1495
1522
  .ds-247420[data-typescale="app"] .btn-ghost:hover { transform: none; box-shadow: none; }
@@ -1503,7 +1530,7 @@
1503
1530
  .ds-247420 .ds-icon-btn {
1504
1531
  display: inline-flex; align-items: center; justify-content: center;
1505
1532
  padding: 0; border: none; cursor: pointer;
1506
- border-radius: var(--r-1, 6px);
1533
+ border-radius: var(--r-1, 8px);
1507
1534
  background: transparent; color: var(--fg);
1508
1535
  width: 32px; height: 32px;
1509
1536
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
@@ -1535,7 +1562,7 @@
1535
1562
  border-radius: var(--r-pill);
1536
1563
  background: var(--bg-3); color: var(--fg-2);
1537
1564
  }
1538
- .ds-247420 .ds-badge.ds-badge--sm { min-width: 14px; height: 14px; padding: 0 var(--space-1); font-size: var(--fs-pico); }
1565
+ .ds-247420 .ds-badge.ds-badge--sm { min-width: var(--icon-xs); height: var(--icon-xs); padding: 0 var(--space-1); font-size: var(--fs-pico); }
1539
1566
  .ds-247420 .ds-badge.ds-badge--lg { min-width: 22px; height: 22px; padding: 0 var(--space-2); font-size: var(--fs-tiny); }
1540
1567
  .ds-247420 .ds-badge.tone-green, .ds-247420 .ds-badge.tone-live, .ds-247420 .ds-badge.tone-success {
1541
1568
  background: var(--green-tint); color: var(--green-deep);
@@ -1552,7 +1579,7 @@
1552
1579
  background: var(--sun); color: var(--ink);
1553
1580
  }
1554
1581
  .ds-247420 .ds-badge.tone-blue { background: var(--accent-tint); color: var(--accent-ink); }
1555
- .ds-247420 .ds-badge.tone-orange { background: color-mix(in oklab, var(--flame) 22%, var(--bg)); color: color-mix(in oklab, var(--flame) 65%, black); }
1582
+ .ds-247420 .ds-badge.tone-orange { background: color-mix(in oklab, var(--flame) 22%, var(--bg)); color: var(--flame); }
1556
1583
 
1557
1584
  .ds-247420 .chip {
1558
1585
  display: inline-flex; align-items: center; gap: var(--space-1-75);
@@ -1603,10 +1630,10 @@
1603
1630
  cursor: pointer;
1604
1631
  }
1605
1632
  .ds-247420 .ds-chip-remove-btn:hover, .ds-247420 .ds-chip-remove-btn:focus-visible { opacity: 1; background: color-mix(in oklab, currentColor 16%, transparent); }
1606
- .ds-247420 .ds-chip-remove-btn svg { width: 10px; height: 10px; }
1633
+ .ds-247420 .ds-chip-remove-btn svg { width: var(--icon-xs); height: var(--icon-xs); }
1607
1634
  @media (pointer: coarse) {
1608
1635
  .ds-247420 .ds-chip-remove-btn { width: 24px; height: 24px; margin-left: 0; }
1609
- .ds-247420 .ds-chip-remove-btn svg { width: 12px; height: 12px; }
1636
+ .ds-247420 .ds-chip-remove-btn svg { width: var(--icon-xs); height: var(--icon-xs); }
1610
1637
  }
1611
1638
 
1612
1639
  .ds-247420 .ds-pill {
@@ -1631,9 +1658,25 @@
1631
1658
  opacity: 0.8;
1632
1659
  }
1633
1660
  .ds-247420 .glyph { --glyph-size-sm: var(--fs-nano); --glyph-size-base: var(--fs-tiny); --glyph-size-lg: var(--fs-body); }
1634
- .ds-247420 .glyph-sm { width: 14px; height: 14px; }
1661
+ .ds-247420 .glyph-sm { width: var(--icon-xs); height: var(--icon-xs); }
1635
1662
  .ds-247420 .glyph-lg { width: 22px; height: 22px; }
1636
1663
 
1664
+ /* Shared empty-state base -- hero-content.css's .empty and community.css's
1665
+ .fd-empty previously duplicated this full rule set; both are joined into
1666
+ this selector list so the shared declarations live in one place, with
1667
+ each keeping its own file-local rule for context-specific extras
1668
+ (background/radius/font-size for .empty; padding for .fd-empty). New
1669
+ consumers can add .ds-empty-state directly instead of a fresh copy. */
1670
+ .ds-247420 .ds-empty-state, .ds-247420 .empty, .ds-247420 .fd-empty {
1671
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
1672
+ gap: var(--space-2);
1673
+ padding: var(--space-6) var(--space-3);
1674
+ text-align: center;
1675
+ color: var(--fg-3);
1676
+ }
1677
+ .ds-247420 .ds-empty-state--panel { background: var(--bg-2); border-radius: var(--r-1); }
1678
+ .ds-247420 .ds-empty-state--compact { padding: var(--space-5) var(--space-3); }
1679
+
1637
1680
  /* ============================================================
1638
1681
  Panel — soft tonal container, no border decoration
1639
1682
  ============================================================ */
@@ -2421,13 +2464,12 @@
2421
2464
  /* ============================================================
2422
2465
  Empty state
2423
2466
  ============================================================ */
2467
+ /* Shares its base declarations with .ds-empty-state (primitives.css) via the
2468
+ combined selector there -- .empty only adds its own font-size/background/
2469
+ radius modifiers on top. Was --space-8 (96px) padding; --space-6 (48px)
2470
+ still centres a message with air without the empty state dominating the
2471
+ fold. */
2424
2472
  .ds-247420 .empty {
2425
- /* Was --space-8 (96px) — an empty list spent 192px of vertical space on
2426
- nothing. --space-6 (48px) still centres a message with air, without the
2427
- empty state dominating the fold. Mobile drops it further (below). */
2428
- padding: var(--space-6);
2429
- text-align: center;
2430
- color: var(--fg-3);
2431
2473
  background: var(--bg-2);
2432
2474
  border-radius: var(--r-1);
2433
2475
  font-size: var(--fs-sm);
@@ -2478,9 +2520,9 @@
2478
2520
  of this value, worth aligning to 768px when touched.
2479
2521
  - Tablet/desktop boundary: 900px (max-width) / 901px (min-width) — used for
2480
2522
  main layout reflow (hero-content.css, responsive2-workspace.css)
2481
- - Legacy tablet band: 481px–1024px (min-width 481px / max-width 1025px) —
2482
- used in this file (responsive.css) for a specific tablet treatment,
2483
- consider migrating to the 768/900 pair
2523
+ - Tablet landscape band: 768px–1024px (min-width 768px / max-width 1024px) —
2524
+ used in this file (responsive.css) for a specific tablet treatment;
2525
+ aligned to the 768px mobile/tablet boundary above (was 481px, a near-miss).
2484
2526
  */
2485
2527
 
2486
2528
  /* --------------------------------------------------------------------
@@ -2660,7 +2702,7 @@
2660
2702
  /* --------------------------------------------------------------------
2661
2703
  Tablet Landscape Breakpoint (768px to 1024px)
2662
2704
  ---------------------------------------------------------------------- */
2663
- @media (min-width: 481px) and (max-width: 1024px) {
2705
+ @media (min-width: 768px) and (max-width: 1024px) {
2664
2706
  /* App Layout — side handled by 900px drawer block; restore for 901-1024 */
2665
2707
  .ds-247420 .app-side a {
2666
2708
  padding: var(--space-2-75) var(--space-2-75); gap: var(--space-2);
@@ -3248,7 +3290,7 @@
3248
3290
  padding: var(--space-4) var(--space-3); text-align: center;
3249
3291
  }
3250
3292
  /* Icon size, not type — see .ds-file-cell-media .ds-file-icon above. */
3251
- .ds-247420 .ds-dropzone-glyph { font-size: 22px; color: var(--fg-3); }
3293
+ .ds-247420 .ds-dropzone-glyph { font-size: var(--icon-lg, 24px); color: var(--fg-3); }
3252
3294
  .ds-247420 .ds-dropzone-label { font-size: var(--fs-sm); color: var(--fg-3); }
3253
3295
  .ds-247420 .ds-dropzone.dragover {
3254
3296
  border-color: var(--accent);
@@ -4111,7 +4153,7 @@
4111
4153
 
4112
4154
  .ds-247420 .chat-typing { display: inline-flex; gap: var(--space-1); align-items: center; }
4113
4155
  .ds-247420 .chat-typing span {
4114
- width: 6px; height: 6px; border-radius: 50%; background: var(--fg-3);
4156
+ width: 8px; height: 8px; border-radius: 50%; background: var(--fg-3);
4115
4157
  }
4116
4158
 
4117
4159
  @media (prefers-reduced-motion: no-preference) {
@@ -5242,13 +5284,13 @@
5242
5284
  .ds-247420 .ds-spinner-lg { height: 24px; gap: var(--space-1-75); }
5243
5285
  .ds-247420 .ds-spinner-lg span { width: var(--space-1-75); height: var(--space-1-75); }
5244
5286
 
5245
- .ds-247420 .ds-spinner-sm { height: 12px; gap: var(--space-hair); }
5287
+ .ds-247420 .ds-spinner-sm { height: var(--space-2-5); gap: var(--space-hair); }
5246
5288
  .ds-247420 .ds-spinner-sm span { width: var(--space-hair); height: var(--space-hair); }
5247
5289
 
5248
- .ds-247420 .ds-spinner-xs { height: 8px; gap: 1px; }
5290
+ .ds-247420 .ds-spinner-xs { height: var(--space-2); gap: 1px; }
5249
5291
  .ds-247420 .ds-spinner-xs span { width: 1.5px; height: 1.5px; }
5250
5292
 
5251
- .ds-247420 .ds-spinner-xl { height: 32px; gap: var(--space-2); }
5293
+ .ds-247420 .ds-spinner-xl { height: var(--space-5); gap: var(--space-2); }
5252
5294
  .ds-247420 .ds-spinner-xl span { width: var(--space-2); height: var(--space-2); }
5253
5295
 
5254
5296
  @keyframes ds-bounce {
@@ -5256,6 +5298,11 @@
5256
5298
  40% { transform: translateY(-8px); }
5257
5299
  }
5258
5300
 
5301
+ /* Two spinner visual languages coexist intentionally: dots (.ds-spinner*)
5302
+ are for small inline/compact loading states (buttons, chips, list rows),
5303
+ the ring (.loading::after in states-interactions.css) is for larger
5304
+ blocking/full-region loading states (panels, full views). */
5305
+
5259
5306
  /* ============================================================
5260
5307
  Skeleton — animated loading placeholder
5261
5308
  ============================================================ */
@@ -5299,7 +5346,7 @@
5299
5346
  flex-shrink: 0;
5300
5347
  color: var(--alert-tone);
5301
5348
  font-weight: 600;
5302
- min-width: var(--space-3-5);
5349
+ min-width: var(--icon-md);
5303
5350
  text-align: center;
5304
5351
  }
5305
5352
 
@@ -5330,7 +5377,7 @@
5330
5377
  padding: 0;
5331
5378
  font-size: var(--fs-xs);
5332
5379
  line-height: 1;
5333
- min-width: var(--space-3-5);
5380
+ min-width: var(--icon-md);
5334
5381
  text-align: center;
5335
5382
  transition: color var(--dur-snap) var(--ease);
5336
5383
  }
@@ -5665,8 +5712,14 @@
5665
5712
  because the chat thread carries its own --measure gutter. */
5666
5713
  .ds-247420 .ws-main { flex: 1; min-height: 0; overflow: auto; display: flex; flex-direction: column; padding: var(--space-4) var(--space-5); }
5667
5714
  .ds-247420 .ws-main.ws-main--flush { padding: 0; }
5668
- /* Non-interactive scroll region (content column), not a focusable control — outline intentionally suppressed. */
5715
+ /* Skip-link target (workspace-shell.js's "#ws-main" skip-link, tabindex="-1")
5716
+ — it does receive real keyboard-driven focus when the skip link is
5717
+ activated, so it needs a visible ring rather than a bare outline:none. */
5669
5718
  .ds-247420 .ws-main:focus { outline: none; }
5719
+ .ds-247420 .ws-main:focus-visible {
5720
+ outline: var(--focus-w) solid var(--focus-color);
5721
+ outline-offset: calc(-1 * var(--focus-offset));
5722
+ }
5670
5723
 
5671
5724
  /* Right context pane */
5672
5725
  .ds-247420 .ws-pane {
@@ -5865,7 +5918,7 @@
5865
5918
  }
5866
5919
 
5867
5920
  /* Disabled file actions (read-only row / in-flight mutation) stay visible but inert. */
5868
- .ds-247420 .ds-file-act:disabled { opacity: .45; cursor: default; }
5921
+ .ds-247420 .ds-file-act:disabled { opacity: .5; cursor: default; }
5869
5922
  .ds-247420 .ds-file-act:disabled:hover { background: transparent; color: var(--fg-3); }
5870
5923
  .ds-247420 .ds-file-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
5871
5924
 
@@ -5949,10 +6002,6 @@
5949
6002
 
5950
6003
  /* PhaseWalk */
5951
6004
  .ds-247420 .ds-phasewalk { display: inline-flex; gap: var(--space-hair); vertical-align: middle; }
5952
- /* NOTE: a second toggle-switch-shaped implementation exists in
5953
- plugins-config.css:91 (.ds-plugins-toggle) at a different scale (40x22 vs
5954
- this 18x10) — consider consolidating into a shared .ds-switch primitive
5955
- with a size modifier. */
5956
6005
  .ds-247420 .ds-phasewalk-seg {
5957
6006
  width: 18px; height: 10px; border-radius: var(--r-hair);
5958
6007
  background: var(--bg-3); position: relative;
@@ -7361,15 +7410,16 @@
7361
7410
  }
7362
7411
  .ds-247420 .ds-plugins-version { font-size: var(--fs-micro); color: var(--fg-3); }
7363
7412
 
7364
- /* NOTE: a second toggle-switch implementation exists in data-density.css:18
7365
- (.ds-phasewalk-seg) at a different scale (18x10 vs this 40x22) — consider
7366
- consolidating into a shared .ds-switch primitive with a size modifier. */
7413
+ /* Same track/knob proportions as the shared .ds-toggle primitive
7414
+ (states-interactions.css) -- kept as its own class since ds-plugins-toggle
7415
+ is a plain <button>+.on instead of .ds-toggle's [aria-checked] contract,
7416
+ but sized and colored to match it exactly rather than drifting. */
7367
7417
  .ds-247420 .ds-plugins-toggle {
7368
- flex: 0 0 auto; width: 40px; height: 22px; border-radius: 11px; border: none; padding: 0;
7418
+ flex: 0 0 auto; width: 40px; height: 22px; border-radius: var(--r-pill, 999px); border: none; padding: 0;
7369
7419
  background: var(--rule); position: relative; cursor: pointer;
7370
7420
  transition: background var(--dur-snap) var(--ease);
7371
7421
  }
7372
- .ds-247420 .ds-plugins-toggle.on { background: var(--accent); }
7422
+ .ds-247420 .ds-plugins-toggle.on { background: var(--accent-ink); }
7373
7423
  .ds-247420 .ds-plugins-toggle[disabled] { cursor: wait; opacity: 0.65; }
7374
7424
  .ds-247420 .ds-plugins-toggle-knob {
7375
7425
  position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%;
@@ -8043,11 +8093,11 @@
8043
8093
  min-width: 18px;
8044
8094
  height: 18px;
8045
8095
  padding: 0 var(--space-1-5);
8046
- /* TODO(a11y): --paper is a fixed near-white on --warn (#FF5A52) -- likely
8047
- ~3:1, below the 4.5:1 AA floor (same defect fixed via --ink elsewhere
8048
- for --warn text). Small numeric badge; needs contrast audit. */
8096
+ /* --ink, not --paper: --paper is a fixed near-white, which measures ~3:1 on
8097
+ --warn (#FF5A52) -- below the 4.5:1 AA floor. --ink clears it (same fix
8098
+ as .btn-primary.danger in app-shell/files.css). */
8049
8099
  background: var(--warn);
8050
- color: var(--paper);
8100
+ color: var(--ink);
8051
8101
  font-family: var(--ff-mono);
8052
8102
  font-size: var(--fs-micro);
8053
8103
  font-weight: 700;
@@ -8378,11 +8428,11 @@
8378
8428
  min-width: 16px;
8379
8429
  height: 16px;
8380
8430
  padding: 0 var(--space-1-5);
8381
- /* TODO(a11y): --paper is a fixed near-white on --warn (#FF5A52) -- likely
8382
- ~3:1, below the 4.5:1 AA floor (same defect fixed via --ink elsewhere
8383
- for --warn text). Small numeric badge; needs contrast audit. */
8431
+ /* --ink, not --paper: --paper is a fixed near-white, which measures ~3:1 on
8432
+ --warn (#FF5A52) -- below the 4.5:1 AA floor. --ink clears it (same fix
8433
+ as .btn-primary.danger in app-shell/files.css). */
8384
8434
  background: var(--warn);
8385
- color: var(--paper);
8435
+ color: var(--ink);
8386
8436
  font-family: var(--ff-mono);
8387
8437
  font-size: var(--fs-micro);
8388
8438
  font-weight: 700;
@@ -9599,13 +9649,15 @@
9599
9649
  .ds-247420 .fd-page-inner { display: flex; flex-direction: column; gap: var(--space-3, 16px); padding: var(--space-3, 16px); max-width: 1100px; }
9600
9650
  .ds-247420 .fd-page-inner > * { min-width: 0; }
9601
9651
  .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)); }
9602
- .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; }
9652
+ /* Base layout shared with .ds-empty-state (primitives.css); overrides padding
9653
+ (--space-5, denser than the shared --space-6) and color for this context. */
9654
+ .ds-247420 .fd-empty { padding: var(--space-5, 32px) var(--space-3, 16px); color: var(--fg-2, var(--fg)); }
9603
9655
  /* 28px is an ICON size (empty-state mark), not a type tier — the --fs-* ladder
9604
9656
  tops out at --fs-xl (21px) before every remaining rung becomes a fluid
9605
9657
  heading clamp, so neither substitutes without visibly resizing the mark.
9606
9658
  --fs-2xl bridges that gap as a fixed 28px token. */
9607
9659
  .ds-247420 .fd-empty-glyph { font-size: var(--fs-2xl); opacity: .55; line-height: 1; }
9608
- .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: var(--fs-micro); line-height: 1.5; }
9660
+ .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, 8px); 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: var(--fs-micro); line-height: 1.5; }
9609
9661
  .ds-247420 .fd-skill-body { max-height: 320px; }
9610
9662
  .ds-247420 .fd-row-actions { display: inline-flex; gap: var(--space-1, 6px); align-items: center; }
9611
9663
  .ds-247420 .fd-chat { display: flex; flex-direction: column; gap: var(--space-2, 10px); height: 100%; min-height: 0; }
@@ -9868,7 +9920,7 @@
9868
9920
  .ds-247420 .chat-msg-action {
9869
9921
  display: inline-flex; align-items: center; justify-content: center; gap: var(--space-1);
9870
9922
  min-width: 26px; height: 26px; padding: 0 var(--space-1-75); cursor: pointer;
9871
- border: none; border-radius: var(--r-1, 4px); background: none; color: var(--fg-3);
9923
+ border: none; border-radius: var(--r-1, 8px); background: none; color: var(--fg-3);
9872
9924
  font-family: var(--ff-body); font-size: var(--fs-tiny);
9873
9925
  }
9874
9926
  .ds-247420 .chat-msg-action-label { font-size: var(--fs-tiny); }
@@ -9936,7 +9988,7 @@
9936
9988
  display: flex; align-items: center; gap: var(--space-2, 8px);
9937
9989
  padding: var(--space-1, 4px) var(--space-2, 8px);
9938
9990
  border: var(--bw-hair) solid var(--rule);
9939
- border-radius: var(--r-1, 4px);
9991
+ border-radius: var(--r-1, 8px);
9940
9992
  background: var(--bg-2);
9941
9993
  }
9942
9994
  .ds-247420 .agentchat-install-agent { flex: 0 0 auto; font-size: var(--fs-tiny); color: var(--fg-3); min-width: 8ch; }
@@ -9946,7 +9998,7 @@
9946
9998
  }
9947
9999
  .ds-247420 .agentchat-install-copy {
9948
10000
  flex: 0 0 auto; cursor: pointer; padding: var(--space-hair) var(--space-2); min-height: 24px;
9949
- border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
10001
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 8px);
9950
10002
  background: none; color: var(--fg-3);
9951
10003
  font-family: var(--ff-body); font-size: var(--fs-tiny);
9952
10004
  }
@@ -9957,7 +10009,7 @@
9957
10009
  /* Host-supplied transcript export actions riding the controls row. */
9958
10010
  .ds-247420 .agentchat-export-act {
9959
10011
  cursor: pointer; padding: var(--space-1) var(--space-2-5); min-height: 32px;
9960
- border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
10012
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 8px);
9961
10013
  background: none; color: var(--fg-3);
9962
10014
  font-family: var(--ff-body); font-size: var(--fs-tiny);
9963
10015
  }
@@ -10190,7 +10242,7 @@
10190
10242
  background: var(--bg); border: var(--border-w) solid var(--accent); border-radius: var(--r-1);
10191
10243
  padding: var(--space-1) var(--space-2);
10192
10244
  }
10193
- .ds-247420 .ds-session-rename-input:focus { outline: none; box-shadow: var(--focus-ring-inset); }
10245
+ .ds-247420 .ds-session-rename-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
10194
10246
 
10195
10247
  /* Inline delete confirm — same row height, two flat buttons, no modal;
10196
10248
  mirrors SessionDashboard's arm-then-confirm bulk-stop control. */
@@ -10232,7 +10284,7 @@
10232
10284
  .ds-247420 .ds-dash-header .btn-primary.danger.is-armed { background: var(--warn); color: var(--ink); border-color: var(--warn); }
10233
10285
  .ds-247420 .ds-dash-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--space-2); padding: var(--space-3); }
10234
10286
  @media (min-width: 1500px) { .ds-247420 .ds-dash-grid { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); } }
10235
- .ds-247420 .ds-dash-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-2); }
10287
+ .ds-247420 .ds-dash-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1); }
10236
10288
 
10237
10289
  /* Compact density — one line per session. The comfortable card stacks title +
10238
10290
  head + meta + actions as four flex rows and measured 208px tall on a real
@@ -10400,7 +10452,7 @@
10400
10452
  position: absolute; top: 6px; right: 6px;
10401
10453
  display: inline-flex; align-items: center; justify-content: center;
10402
10454
  min-width: 48px; min-height: 24px; padding: var(--space-hair) var(--space-2);
10403
- border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
10455
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 8px);
10404
10456
  background: var(--bg-2); color: var(--fg-2); cursor: pointer;
10405
10457
  font-family: var(--ff-body); font-size: var(--fs-tiny);
10406
10458
  opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease);
@@ -13266,7 +13318,7 @@
13266
13318
  .ds-247420 .health-summary { display: flex; flex-wrap: wrap; gap: .4em; margin: .6em 0; }
13267
13319
  .ds-247420 .health-chip {
13268
13320
  font-family: var(--ff-mono, ui-monospace, monospace);
13269
- font-size: .8rem; padding: .15em .55em; border-radius: var(--r-1, 6px);
13321
+ font-size: .8rem; padding: .15em .55em; border-radius: var(--r-1, 8px);
13270
13322
  background: color-mix(in srgb, var(--fg) 8%, transparent);
13271
13323
  color: var(--fg-2);
13272
13324
  border: var(--bw-hair, 1px) solid color-mix(in srgb, var(--fg) 12%, transparent);
@@ -13284,7 +13336,7 @@
13284
13336
  .ds-247420 .ds-status-chip {
13285
13337
  display: inline-flex; align-items: center; gap: .35em;
13286
13338
  font-family: var(--ff-mono, ui-monospace, monospace);
13287
- font-size: .8rem; padding: .15em .55em; border-radius: var(--r-1, 6px);
13339
+ font-size: .8rem; padding: .15em .55em; border-radius: var(--r-1, 8px);
13288
13340
  background: color-mix(in srgb, var(--fg) 8%, transparent);
13289
13341
  color: var(--fg-2);
13290
13342
  border: var(--bw-hair, 1px) solid color-mix(in srgb, var(--fg) 12%, transparent);
@@ -13312,7 +13364,7 @@
13312
13364
  }
13313
13365
  .ds-247420 .cwd-bar-btn {
13314
13366
  cursor: pointer; font: inherit; line-height: 1.3;
13315
- padding: .15em .55em; border-radius: var(--r-1, 6px);
13367
+ padding: .15em .55em; border-radius: var(--r-1, 8px);
13316
13368
  background: color-mix(in srgb, var(--fg) 8%, transparent);
13317
13369
  border: var(--bw-hair, 1px) solid color-mix(in srgb, var(--fg) 14%, transparent);
13318
13370
  color: var(--fg-2);
@@ -13400,7 +13452,7 @@
13400
13452
  /* Re-assert the paper-tuned signal tokens so token-derived foregrounds
13401
13453
  (status discs, error text, tool cards) print with light-theme colours
13402
13454
  rather than the dark-theme-derived values inherited under auto-dark. */
13403
- .ds-247420 { --flame:#C53E00; --amber:#7C570F; --warn:#E0241A; --sky:#3A6EFF; --bg:var(--paper); --fg:var(--ink); }
13455
+ .ds-247420 { --flame:#C53E00; --amber:#7C570F; --warn:#C41C0C; --sky:#3A6EFF; --bg:var(--paper); --fg:var(--ink); }
13404
13456
  .ds-247420 #app { min-height: auto; display: block; height: auto; }
13405
13457
  .ds-247420 .skip-link, .ds-247420 .status-dot, .ds-247420 .history-actions, .ds-247420 .chat-composer { display: none !important; }
13406
13458
  .ds-247420 .app, .ds-247420 .app-main, .ds-247420 .panel, .ds-247420 .chat, .ds-247420 .chat-thread {
@@ -13858,8 +13910,8 @@
13858
13910
  width: min(360px, 88vw);
13859
13911
  display: flex;
13860
13912
  flex-direction: column;
13861
- gap: 12px;
13862
- padding: 24px;
13913
+ gap: var(--space-2-75);
13914
+ padding: var(--space-4);
13863
13915
  background: var(--bg-2);
13864
13916
  border: 1px solid var(--bw-rule, var(--rule));
13865
13917
  border-radius: var(--r-2, 10px);
@@ -13888,7 +13940,7 @@
13888
13940
  font-family: var(--ff-mono);
13889
13941
  font-size: var(--fs-body);
13890
13942
  padding: 10px 14px;
13891
- border-radius: var(--r-1, 6px);
13943
+ border-radius: var(--r-1, 8px);
13892
13944
  cursor: pointer;
13893
13945
  }
13894
13946
  .ds-247420 .sp-lobby-btn:hover { background: var(--bg-2); }
@@ -13920,7 +13972,7 @@
13920
13972
  color: var(--accent);
13921
13973
  padding: 8px;
13922
13974
  background: var(--bg);
13923
- border-radius: var(--r-1, 6px);
13975
+ border-radius: var(--r-1, 8px);
13924
13976
  }
13925
13977
  .ds-247420 .sp-lobby-err { min-height: 16px; color: var(--danger); font-size: var(--fs-small, 11px); }
13926
13978
  .ds-247420 .sp-lobby-close {