anentrypoint-design 0.0.210 → 0.0.212

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
@@ -590,8 +590,13 @@ body.canvas-host { background: transparent !important; }
590
590
  .row.rail-purple::before,
591
591
  .row.rail-flame::before { height: 56%; opacity: 1; }
592
592
  .row.rail-green::before { background: var(--accent); }
593
- .row.rail-purple::before { background: var(--purple-2, #7F18A4); }
593
+ .row.rail-purple::before { background: var(--purple-2); }
594
594
  .row.rail-flame::before { background: var(--flame); }
595
+ /* Differentiate the rail by SHAPE, not hue alone (color-blind safety): error
596
+ reads as a taller solid bar, subagent as a dashed/gapped fill, ok stays the
597
+ short solid bar. Paired with the sr-only status word emitted by Row(). */
598
+ .row.rail-flame::before { height: 64%; }
599
+ .row.rail-purple::before { background: repeating-linear-gradient(var(--purple-2) 0 4px, transparent 4px 7px); }
595
600
  .row-grid { /* explicit grid-template-columns set inline */ }
596
601
  /* A row with no leading code/index drops the empty first column so the title
597
602
  takes the full width instead of wrapping in the narrow code gutter. */
@@ -827,8 +832,8 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
827
832
  border: 0; border-radius: var(--r-2);
828
833
  box-shadow: inset 0 0 0 1px var(--rule);
829
834
  }
830
- .row-form input:focus,
831
- .row-form textarea:focus { box-shadow: inset 0 0 0 2px var(--accent); }
835
+ .row-form input:focus-visible,
836
+ .row-form textarea:focus-visible { box-shadow: var(--focus-ring-inset); }
832
837
 
833
838
  /* Field char counter (TextField maxLength) */
834
839
  .ds-field-count {
@@ -849,9 +854,9 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
849
854
  Responsive Design — Mobile (480px), Tablet (1024px), Desktop (1440px+)
850
855
  ============================================================ */
851
856
 
852
- /* ────────────────────────────────────────────────────────────────────
857
+ /* --------------------------------------------------------------------
853
858
  Mobile Portrait Breakpoint (480px and below)
854
- ────────────────────────────────────────────────────────────────────── */
859
+ ---------------------------------------------------------------------- */
855
860
  @media (max-width: 480px) {
856
861
  /* App Layout: single-column + drawer is handled once in the ≤900px block;
857
862
  no need to re-declare grid-template-columns here (was a redundant !important). */
@@ -975,9 +980,9 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
975
980
  .cli .copy { padding: 6px 12px; font-size: var(--fs-micro); }
976
981
  }
977
982
 
978
- /* ────────────────────────────────────────────────────────────────────
983
+ /* --------------------------------------------------------------------
979
984
  Container Query Responsive (720px and below)
980
- ────────────────────────────────────────────────────────────────────── */
985
+ ---------------------------------------------------------------------- */
981
986
  @container (max-width: 760px) {
982
987
  .app-body { grid-template-columns: 1fr !important; }
983
988
  .app-side-shell { border-right: 0; border-bottom: 1px solid var(--rule); }
@@ -987,9 +992,9 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
987
992
  .row .sub { grid-column: 1 / -1; order: 3; }
988
993
  }
989
994
 
990
- /* ────────────────────────────────────────────────────────────────────
995
+ /* --------------------------------------------------------------------
991
996
  Tablet Landscape Breakpoint (768px to 1024px)
992
- ────────────────────────────────────────────────────────────────────── */
997
+ ---------------------------------------------------------------------- */
993
998
  @media (min-width: 481px) and (max-width: 1024px) {
994
999
  /* App Layout — side handled by 900px drawer block; restore for 901-1024 */
995
1000
  .app-side a {
@@ -1066,9 +1071,9 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1066
1071
  }
1067
1072
  }
1068
1073
 
1069
- /* ────────────────────────────────────────────────────────────────────
1074
+ /* --------------------------------------------------------------------
1070
1075
  Mid Breakpoint (768px and below) — collapse sidebar + simplify row grid
1071
- ────────────────────────────────────────────────────────────────────── */
1076
+ ---------------------------------------------------------------------- */
1072
1077
  @media (max-width: 768px) {
1073
1078
  /* Sidebar stacks above main rather than sitting beside it */
1074
1079
  .app-body { grid-template-columns: 1fr; }
@@ -1083,9 +1088,9 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1083
1088
  .row .sub { grid-column: 1 / -1; }
1084
1089
  }
1085
1090
 
1086
- /* ────────────────────────────────────────────────────────────────────
1091
+ /* --------------------------------------------------------------------
1087
1092
  Desktop Breakpoint Enhancements (1025px and up)
1088
- ────────────────────────────────────────────────────────────────────── */
1093
+ ---------------------------------------------------------------------- */
1089
1094
  @media (min-width: 1025px) {
1090
1095
  /* Chat Bubbles */
1091
1096
  .chat-stack { max-width: min(70%, 480px); }
@@ -1106,7 +1111,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1106
1111
  .ds-chat-md { font-size: var(--fs-sm); line-height: 1.6; }
1107
1112
  .ds-chat-composer { display: flex; gap: 8px; padding: var(--space-4); }
1108
1113
  .ds-chat-composer input { flex: 1; padding: 13px 18px; background: var(--bg-2); border: 0; border-radius: var(--r-pill); font-family: inherit; font-size: var(--fs-sm); color: var(--fg); }
1109
- .ds-chat-composer input:focus { box-shadow: inset 0 0 0 2px var(--accent); }
1114
+ .ds-chat-composer input:focus-visible { box-shadow: var(--focus-ring-inset); }
1110
1115
 
1111
1116
  /* ============================================================
1112
1117
  File surface — responsive grid + row layouts
@@ -1126,13 +1131,15 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1126
1131
  .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
1127
1132
  /* The quick filter is a compact control, not a full-width form row - a giant
1128
1133
  input above the grid reads as a search page and costs fold height. */
1129
- .ds-file-filter { padding: 0 0 var(--space-1); display: flex; justify-content: flex-end; }
1134
+ /* The filter is now an inline item in the single .ds-file-controls toolbar row
1135
+ (the standalone right-aligned .ds-file-filter strip was removed). */
1130
1136
  .ds-file-filter-input {
1131
1137
  width: min(280px, 100%); padding: 6px 12px; font-size: var(--fs-sm);
1132
1138
  background: var(--bg); color: var(--fg);
1133
1139
  border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1134
1140
  }
1135
- .ds-file-filter-input:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
1141
+ .ds-file-controls .ds-file-filter-input { flex: 0 1 220px; }
1142
+ .ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
1136
1143
  .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
1137
1144
  .ds-file-sort-btn {
1138
1145
  font-size: var(--fs-tiny); font-family: var(--ff-mono); color: var(--fg-3);
@@ -1253,11 +1260,34 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1253
1260
  .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
1254
1261
 
1255
1262
  /* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
1263
+ /* CSS-drawn multi-select checkbox: a bordered box that fills with the accent +
1264
+ a border-drawn tick when its parent button is .is-marked or aria-checked.
1265
+ Shared by FileRow/FileCell (.is-marked) and the file/session select-all +
1266
+ SessionCard select (aria-checked true/mixed) since the bundle concatenates
1267
+ all CSS. Replaces the old [x]/[ ] bracket text - no glyphs, AT keeps the
1268
+ role=checkbox/aria-checked name+state. */
1269
+ .ds-check-box {
1270
+ width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
1271
+ border: 1.5px solid var(--fg-3); border-radius: 4px;
1272
+ transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
1273
+ }
1274
+ .is-marked > .ds-check-box,
1275
+ [aria-checked="true"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
1276
+ .is-marked > .ds-check-box::after,
1277
+ [aria-checked="true"] > .ds-check-box::after {
1278
+ content: ""; position: absolute; left: 4px; top: 1px; width: 4px; height: 8px;
1279
+ border: solid var(--bg); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg);
1280
+ }
1281
+ [aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
1282
+ [aria-checked="mixed"] > .ds-check-box::after {
1283
+ content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: 1px;
1284
+ }
1285
+
1256
1286
  .ds-file-check {
1257
1287
  display: inline-flex; align-items: center; justify-content: center;
1258
1288
  min-width: 28px; height: 28px; padding: 0 4px;
1259
1289
  background: transparent; border: 0; border-radius: var(--r-1);
1260
- font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1290
+ color: var(--fg-3);
1261
1291
  cursor: pointer;
1262
1292
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1263
1293
  }
@@ -1282,7 +1312,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1282
1312
  padding: var(--space-1) var(--space-2);
1283
1313
  background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1284
1314
  }
1285
- .ds-bulkbar-count { font-size: var(--fs-tiny); color: var(--fg-2); }
1315
+ .ds-bulkbar-count { font-size: var(--fs-sm); font-weight: 600; color: var(--fg-2); }
1286
1316
  /* BulkBar is a toolbar (it even declares role=toolbar): compact rect buttons,
1287
1317
  quiet destructive outline - the app arm-confirms destructive bulk actions
1288
1318
  via ConfirmDialog, so the strip never needs a loud CTA. */
@@ -1348,6 +1378,16 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1348
1378
  }
1349
1379
  .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1350
1380
  .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1381
+ /* Per-type icon tints on thumb tiles so the grid keeps the colour-coding the
1382
+ list rows already carry (mirrors .ds-file-row[data-file-type] .ds-file-icon). */
1383
+ .ds-file-cell[data-file-type="dir"] .ds-file-icon { color: var(--accent); }
1384
+ .ds-file-cell[data-file-type="image"] .ds-file-icon { color: var(--mascot); }
1385
+ .ds-file-cell[data-file-type="video"] .ds-file-icon { color: var(--purple-2); }
1386
+ .ds-file-cell[data-file-type="audio"] .ds-file-icon { color: var(--sky); }
1387
+ .ds-file-cell[data-file-type="code"] .ds-file-icon { color: var(--green-2); }
1388
+ .ds-file-cell[data-file-type="archive"] .ds-file-icon { color: var(--flame); }
1389
+ .ds-file-cell[data-file-type="document"] .ds-file-icon { color: var(--amber); }
1390
+ .ds-file-cell[data-file-type="symlink"] .ds-file-icon { color: var(--purple); }
1351
1391
  .ds-file-cell-name {
1352
1392
  font-size: var(--fs-tiny); text-align: left;
1353
1393
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
@@ -1358,13 +1398,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1358
1398
  background: color-mix(in oklab, var(--bg) 78%, transparent);
1359
1399
  }
1360
1400
 
1361
- /* Card mode — opt-in via data-columns; switches the list to a grid. */
1362
- .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1363
- .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
1364
- .ds-file-grid[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
1365
- .ds-file-grid[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
1366
- .ds-file-grid[data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
1367
-
1368
1401
  /* ============================================================
1369
1402
  File browser surface — stage, toolbar, breadcrumb, dropzone,
1370
1403
  upload progress, empty state, modals, preview. Authored for
@@ -1543,7 +1576,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1543
1576
  .ds-file-empty-glyph { font-size: 34px; opacity: 0.55; }
1544
1577
  .ds-file-empty-text { font-size: var(--fs-sm); }
1545
1578
 
1546
- /* ── Modals ───────────────────────────────────────────────── */
1579
+ /* -- Modals ------------------------------------------------- */
1547
1580
  .ds-modal-backdrop {
1548
1581
  position: fixed; inset: 0; z-index: var(--z-modal, 800);
1549
1582
  display: flex; align-items: center; justify-content: center;
@@ -1589,7 +1622,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1589
1622
  border-radius: var(--r-2); color: var(--fg);
1590
1623
  font-family: inherit; font-size: var(--fs-sm);
1591
1624
  }
1592
- .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
1625
+ .ds-modal-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
1593
1626
  /* In-body modal error (role=alert): mutation failures (409/403) surface INSIDE
1594
1627
  the dialog, not behind the fixed overlay. */
1595
1628
  .ds-modal-error {
@@ -1604,7 +1637,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1604
1637
  color: var(--on-color);
1605
1638
  }
1606
1639
 
1607
- /* ── Preview ──────────────────────────────────────────────── */
1640
+ /* -- Preview ------------------------------------------------ */
1608
1641
  .ds-preview-head {
1609
1642
  display: flex; align-items: center; gap: var(--space-3);
1610
1643
  padding: var(--space-3) var(--space-4);
@@ -1677,7 +1710,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1677
1710
  .ds-file-stage { padding: var(--space-3) var(--space-2); }
1678
1711
  }
1679
1712
 
1680
- /* ── File browser UX affordances ──────────────────────────── */
1713
+ /* -- File browser UX affordances ---------------------------- */
1681
1714
  /* Toolbar filter input — compact search box. */
1682
1715
  .ds-filter-input {
1683
1716
  width: clamp(120px, 22vw, 220px);
@@ -1686,23 +1719,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1686
1719
  border-radius: var(--r-pill); color: var(--fg);
1687
1720
  font-family: inherit; font-size: var(--fs-xs);
1688
1721
  }
1689
- .ds-filter-input:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
1722
+ .ds-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
1690
1723
 
1691
- /* Loading skeleton placeholder rows while a directory loads. */
1692
- .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
1693
- .ds-file-skeleton {
1694
- height: 48px; border-radius: var(--r-2);
1695
- background: linear-gradient(90deg,
1696
- var(--bg) 0%, var(--bg-2) 50%, var(--bg) 100%);
1697
- background-size: 200% 100%;
1698
- }
1699
- @media (prefers-reduced-motion: no-preference) {
1700
- .ds-file-skeleton { animation: ds-skeleton-shimmer 1.2s var(--ease) infinite; }
1701
- }
1702
- @keyframes ds-skeleton-shimmer {
1703
- 0% { background-position: 200% 0; }
1704
- 100% { background-position: -200% 0; }
1705
- }
1724
+ /* Loading skeleton: FileSkeleton renders `.ds-file-grid.ds-file-skeleton` with
1725
+ `.ds-file-row.ds-file-row-skeleton` rows whose inner `.ds-skel` children shimmer
1726
+ (via .ds-skel::after). The container therefore inherits the .ds-file-grid layout
1727
+ and must NOT be a single 48px gradient bar (that collapsed every row and double-
1728
+ shimmered). The dead .ds-file-grid-loading rule + unused ds-skeleton-shimmer
1729
+ keyframe were removed; only the inner .ds-skel children animate. */
1706
1730
 
1707
1731
  /* Drag-to-move drop target highlight on a directory row. */
1708
1732
  .ds-file-row.ds-drop-target {
@@ -1911,6 +1935,13 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1911
1935
  padding: 10px 12px; border-radius: 6px; overflow-x: auto;
1912
1936
  font-family: var(--ff-mono); font-size: 0.9em; margin: 8px 0;
1913
1937
  }
1938
+ /* Markdown tables + horizontal rules: agents routinely emit them, but they were
1939
+ unstyled (bare unspaced cells, vanished rules). */
1940
+ .chat-bubble.chat-md table { border-collapse: collapse; width: auto; max-width: 100%; margin: 8px 0; font-size: .95em; display: block; overflow-x: auto; }
1941
+ .chat-bubble.chat-md th,
1942
+ .chat-bubble.chat-md td { border: var(--bw-hair) solid var(--rule); padding: 4px 10px; text-align: left; }
1943
+ .chat-bubble.chat-md th { background: color-mix(in oklab, var(--fg) 5%, transparent); font-weight: 600; }
1944
+ .chat-bubble.chat-md hr { border: 0; border-top: var(--bw-hair) solid var(--rule); margin: 12px 0; }
1914
1945
 
1915
1946
  .chat-msg .chat-bubble.chat-code,
1916
1947
  .chat-msg.you .chat-bubble.chat-code,
@@ -2209,7 +2240,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2209
2240
  .app-side a .glyph { font-family: var(--ff-mono); font-size: 13px; font-weight: 600; color: var(--fg-3); text-align: center; }
2210
2241
  .app-side a.active .glyph { color: var(--accent); }
2211
2242
 
2212
- /* ── select primitive ─────────────────────────────────────────────────── */
2243
+ /* -- select primitive --------------------------------------------------- */
2213
2244
  .ds-select {
2214
2245
  width: 100%;
2215
2246
  min-width: 0;
@@ -2233,10 +2264,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2233
2264
  background-repeat: no-repeat;
2234
2265
  cursor: pointer;
2235
2266
  }
2236
- .ds-select:focus-visible { box-shadow: inset 0 0 0 2px var(--accent); }
2267
+ .ds-select:focus-visible { box-shadow: var(--focus-ring-inset); }
2237
2268
  .ds-select:hover { background-color: var(--bg-3); }
2238
2269
 
2239
- /* ── chat composer autogrow polish (sizing lives in the primary block) ── */
2270
+ /* -- chat composer autogrow polish (sizing lives in the primary block) -- */
2240
2271
  .chat-composer textarea {
2241
2272
  transition: height var(--dur-snap) var(--ease);
2242
2273
  }
@@ -2245,7 +2276,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2245
2276
  cursor: not-allowed;
2246
2277
  }
2247
2278
 
2248
- /* ── mobile responsive: chat ──────────────────────────────────────────── */
2279
+ /* -- mobile responsive: chat -------------------------------------------- */
2249
2280
  @media (max-width: 768px) {
2250
2281
  .chat-stack { max-width: 100%; }
2251
2282
  .chat-msg { padding: 4px 0; }
@@ -2270,9 +2301,9 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2270
2301
  Comprehensive improvements for perfect UX across all surfaces
2271
2302
  ============================================================ */
2272
2303
 
2273
- /* ────────────────────────────────────────────────────────────
2304
+ /* ------------------------------------------------------------
2274
2305
  Component States — Disabled, Loading, Error, Success
2275
- ────────────────────────────────────────────────────────────── */
2306
+ -------------------------------------------------------------- */
2276
2307
 
2277
2308
  /* Disabled state for all interactive elements */
2278
2309
  .btn:disabled, .btn-primary:disabled, .btn-ghost:disabled,
@@ -2324,9 +2355,9 @@ textarea.error {
2324
2355
  opacity: 0.8;
2325
2356
  }
2326
2357
 
2327
- /* ────────────────────────────────────────────────────────────
2358
+ /* ------------------------------------------------------------
2328
2359
  Enhanced Button Micro-Interactions
2329
- ────────────────────────────────────────────────────────────── */
2360
+ -------------------------------------------------------------- */
2330
2361
 
2331
2362
  /* Button scale feedback on active */
2332
2363
  .btn:active:not(:disabled),
@@ -2356,9 +2387,9 @@ input[type="checkbox"], input[type="radio"] {
2356
2387
  -webkit-touch-callout: none;
2357
2388
  }
2358
2389
 
2359
- /* ────────────────────────────────────────────────────────────
2390
+ /* ------------------------------------------------------------
2360
2391
  Drag-and-Drop Styles
2361
- ────────────────────────────────────────────────────────────── */
2392
+ -------------------------------------------------------------- */
2362
2393
 
2363
2394
  /* Draggable element */
2364
2395
  [draggable="true"], .draggable {
@@ -2415,9 +2446,9 @@ input[type="checkbox"], input[type="radio"] {
2415
2446
  50% { opacity: 1; }
2416
2447
  }
2417
2448
 
2418
- /* ────────────────────────────────────────────────────────────
2449
+ /* ------------------------------------------------------------
2419
2450
  Context Menu Styles
2420
- ────────────────────────────────────────────────────────────── */
2451
+ -------------------------------------------------------------- */
2421
2452
 
2422
2453
  .ds-context-menu {
2423
2454
  position: absolute;
@@ -2479,9 +2510,9 @@ input[type="checkbox"], input[type="radio"] {
2479
2510
  cursor: context-menu;
2480
2511
  }
2481
2512
 
2482
- /* ────────────────────────────────────────────────────────────
2513
+ /* ------------------------------------------------------------
2483
2514
  Enhanced Form Inputs
2484
- ────────────────────────────────────────────────────────────── */
2515
+ -------------------------------------------------------------- */
2485
2516
 
2486
2517
  input[type="text"],
2487
2518
  input[type="email"],
@@ -2507,7 +2538,7 @@ textarea::placeholder {
2507
2538
  color: var(--fg-3);
2508
2539
  }
2509
2540
 
2510
- /* ── Field controls: themed base for TextField / Select / SearchInput ──
2541
+ /* -- Field controls: themed base for TextField / Select / SearchInput --
2511
2542
  Root fix: previously only `transition` was set, so themed apps got
2512
2543
  browser-default white boxes in dark mode and labels collided with inputs
2513
2544
  because `.ds-field` had no layout. */
@@ -2556,7 +2587,7 @@ textarea::placeholder {
2556
2587
  .ds-field .ds-select:focus-visible,
2557
2588
  .ds-search-input:focus-visible {
2558
2589
  outline: none;
2559
- box-shadow: inset 0 0 0 2px var(--accent);
2590
+ box-shadow: var(--focus-ring-inset);
2560
2591
  }
2561
2592
  .ds-field input:disabled,
2562
2593
  .ds-field textarea:disabled,
@@ -2594,9 +2625,9 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2594
2625
  color: var(--fg);
2595
2626
  }
2596
2627
 
2597
- /* ────────────────────────────────────────────────────────────
2628
+ /* ------------------------------------------------------------
2598
2629
  Accessibility Enhancements
2599
- ────────────────────────────────────────────────────────────── */
2630
+ -------------------------------------------------------------- */
2600
2631
 
2601
2632
  /* Enhanced focus-visible for all interactive elements */
2602
2633
  [role="button"]:focus-visible,
@@ -2625,11 +2656,17 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2625
2656
  animation-iteration-count: 1 !important;
2626
2657
  transition-duration: 0.01ms !important;
2627
2658
  }
2659
+ /* Kill the residual paint frame of looping skeleton/shimmer placeholders and
2660
+ give reduced-motion users a steady placeholder fill instead. */
2661
+ .skeleton, .ds-skeleton, .ds-session-row-skeleton .ds-skel {
2662
+ animation: none !important;
2663
+ background: var(--bg-2) !important;
2664
+ }
2628
2665
  }
2629
2666
 
2630
- /* ────────────────────────────────────────────────────────────
2667
+ /* ------------------------------------------------------------
2631
2668
  Performance
2632
- ────────────────────────────────────────────────────────────── */
2669
+ -------------------------------------------------------------- */
2633
2670
 
2634
2671
  /* Limit layout/style containment to self-contained components. `paint` is
2635
2672
  intentionally omitted — it clips focus rings, tooltips and dropdowns that
@@ -2638,9 +2675,9 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2638
2675
  contain: layout style;
2639
2676
  }
2640
2677
 
2641
- /* ────────────────────────────────────────────────────────────
2678
+ /* ------------------------------------------------------------
2642
2679
  Mobile Touch Optimizations
2643
- ────────────────────────────────────────────────────────────── */
2680
+ -------------------------------------------------------------- */
2644
2681
 
2645
2682
  @media (hover: none) and (pointer: coarse) {
2646
2683
  /* Mobile devices: larger touch targets, faster responses */
@@ -2671,9 +2708,9 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2671
2708
  }
2672
2709
  }
2673
2710
 
2674
- /* ────────────────────────────────────────────────────────────
2711
+ /* ------------------------------------------------------------
2675
2712
  Theme Transition Smoothness
2676
- ────────────────────────────────────────────────────────────── */
2713
+ -------------------------------------------------------------- */
2677
2714
 
2678
2715
  /* Scoped to the DS wrapper so the design system never reaches out and
2679
2716
  animates the host document's html/body. */
@@ -2682,9 +2719,9 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2682
2719
  color var(--dur-base) var(--ease);
2683
2720
  }
2684
2721
 
2685
- /* ────────────────────────────────────────────────────────────
2722
+ /* ------------------------------------------------------------
2686
2723
  Empty State & Loading States
2687
- ────────────────────────────────────────────────────────────── */
2724
+ -------------------------------------------------------------- */
2688
2725
 
2689
2726
  .empty-state {
2690
2727
  display: flex; flex-direction: column; align-items: center; gap: var(--space-4);
@@ -2722,9 +2759,9 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2722
2759
  .skeleton-line { height: 12px; margin-bottom: 12px; }
2723
2760
  .skeleton-title { height: 24px; margin-bottom: 16px; width: 60%; }
2724
2761
 
2725
- /* ────────────────────────────────────────────────────────────
2762
+ /* ------------------------------------------------------------
2726
2763
  Toast Notification Styles
2727
- ────────────────────────────────────────────────────────────── */
2764
+ -------------------------------------------------------------- */
2728
2765
 
2729
2766
  .toast {
2730
2767
  position: fixed;
@@ -3051,6 +3088,15 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3051
3088
  .ws-resizer.ws-resizer-rail { grid-column: 1; }
3052
3089
  .ws-resizer.ws-resizer-sessions { grid-column: 2; }
3053
3090
  .ws-resizer.ws-resizer-pane { grid-column: 3; justify-self: end; }
3091
+ /* A resizer must vanish once its TRACK is removed by the staging media blocks,
3092
+ else dragging it writes a --ws-*-w var that no longer affects the now-fixed
3093
+ drawer (a dead handle). Mirror the 1480 / 1100 / 900 staging exactly. */
3094
+ @media (max-width: 1480px) { .ws-resizer.ws-resizer-pane { display: none; } }
3095
+ @media (max-width: 1100px) { .ws-resizer.ws-resizer-sessions { display: none; } }
3096
+ @media (max-width: 900px) { .ws-resizer { display: none; } }
3097
+ /* Coarse-pointer hit target for hybrid touch laptops above the drawer breakpoint
3098
+ (the 8px sliver is un-grabbable by touch). */
3099
+ @media (pointer: coarse) { .ws-resizer { width: 16px; margin-right: -8px; } }
3054
3100
  /* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
3055
3101
  width var flips), so grid-template-columns is animatable; reduced-motion
3056
3102
  drops it to an instant swap. */
@@ -3130,7 +3176,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3130
3176
  /* Crumb band is the top chrome of the content column: a stable height so the
3131
3177
  top edge aligns with the rail head, and a left gutter matching .ws-main so
3132
3178
  the trail text is not flush against the rail border. */
3133
- .ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-4); display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
3179
+ .ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-5); display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
3134
3180
  .ws-crumb-main { flex: 1 1 auto; min-width: 0; }
3135
3181
  /* Content column gutter. Claude-Code-class calm: file grid / dashboard / event
3136
3182
  list / history get a generous, consistent inner gutter instead of butting