anentrypoint-design 0.0.207 → 0.0.208

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
@@ -503,10 +503,10 @@ body.canvas-host { background: transparent !important; }
503
503
  ============================================================ */
504
504
  .panel {
505
505
  background: var(--panel-1, var(--bg-2));
506
- border-radius: var(--r-3);
506
+ border: var(--bw-hair) solid var(--rule);
507
+ border-radius: var(--r-2);
507
508
  margin: 0 0 var(--space-5);
508
509
  padding: var(--space-3);
509
- box-shadow: var(--panel-shadow);
510
510
  position: relative;
511
511
  }
512
512
  .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
@@ -895,10 +895,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
895
895
  gap: 3px;
896
896
  }
897
897
  .ds-file-row {
898
- grid-template-columns: 22px minmax(0, 1fr) auto;
899
- gap: 10px; padding: 10px 12px;
898
+ gap: 8px; padding: 10px 12px;
900
899
  font-size: var(--fs-xs);
901
900
  }
901
+ .ds-file-open { gap: 10px; }
902
902
  /* On mobile, fold meta under the title and keep actions inline. */
903
903
  .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
904
904
  .ds-file-row .ds-file-actions { opacity: 1; }
@@ -906,6 +906,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
906
906
  reachable by touch (cohesion sweep). */
907
907
  .ds-file-act, .ds-file-sort-btn, .ds-crumb-seg { min-height: 44px; }
908
908
  .ds-file-filter-input { min-height: 44px; }
909
+ .ds-file-check, .ds-file-selectall, .ds-density-btn { min-height: 44px; min-width: 44px; }
909
910
 
910
911
  /* Chat */
911
912
  .chat-stack { max-width: 100%; min-width: 0; }
@@ -1132,10 +1133,13 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1132
1133
  @keyframes ds-skel-shimmer { 100% { transform: translateX(100%); } }
1133
1134
  @media (prefers-reduced-motion: reduce) { .ds-skel::after { animation: none; } }
1134
1135
 
1135
- /* File row — linear layout (icon · title · meta · actions) */
1136
+ /* File row — linear layout (checkbox? · open-button[code · icon · title · meta] · actions).
1137
+ The row is a flex strip; the open <button> is the stretching member and lays
1138
+ out the entry's own columns. It needs a full reset (UA button chrome off)
1139
+ because FileRow wraps the row content in a real button for native keyboard
1140
+ semantics. */
1136
1141
  .ds-file-row {
1137
- display: grid; grid-template-columns: 26px minmax(0, 1fr) auto auto;
1138
- gap: 14px; align-items: center;
1142
+ display: flex; align-items: center; gap: 10px;
1139
1143
  padding: 11px 16px; background: var(--bg);
1140
1144
  border: var(--bw-hair) solid transparent;
1141
1145
  border-radius: var(--r-2); color: var(--fg);
@@ -1144,6 +1148,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1144
1148
  border-color var(--dur-snap) var(--ease),
1145
1149
  transform var(--dur-snap) var(--ease);
1146
1150
  }
1151
+ .ds-file-open {
1152
+ display: flex; align-items: center; gap: 14px;
1153
+ flex: 1 1 auto; min-width: 0;
1154
+ background: none; border: 0; padding: 0; margin: 0;
1155
+ color: inherit; font: inherit; text-align: left; cursor: pointer;
1156
+ }
1157
+ .ds-file-open[disabled] { cursor: default; }
1158
+ .ds-file-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
1147
1159
  .ds-file-row:hover {
1148
1160
  background: var(--bg-2);
1149
1161
  border-color: var(--rule);
@@ -1165,7 +1177,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1165
1177
  .ds-file-row .title {
1166
1178
  font-weight: 500; font-size: var(--fs-sm);
1167
1179
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1168
- min-width: 0;
1180
+ min-width: 0; flex: 1 1 auto;
1169
1181
  }
1170
1182
  .ds-file-row .code {
1171
1183
  font-family: var(--ff-mono); font-size: var(--fs-micro);
@@ -1207,6 +1219,99 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1207
1219
  .ds-file-act:hover { background: var(--bg-3); color: var(--fg); }
1208
1220
  .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
1209
1221
 
1222
+ /* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
1223
+ .ds-file-check {
1224
+ display: inline-flex; align-items: center; justify-content: center;
1225
+ min-width: 28px; height: 28px; padding: 0 4px;
1226
+ background: transparent; border: 0; border-radius: var(--r-1);
1227
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1228
+ cursor: pointer;
1229
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1230
+ }
1231
+ .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
1232
+ .ds-file-check.is-marked { color: var(--accent); }
1233
+ .ds-file-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1234
+ .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
1235
+ .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
1236
+ .ds-file-selectall {
1237
+ display: inline-flex; align-items: center; gap: var(--space-1);
1238
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2);
1239
+ cursor: pointer; background: none; border: none;
1240
+ padding: var(--space-1); border-radius: var(--r-1);
1241
+ }
1242
+ .ds-file-selectall:hover { background: var(--bg-2); color: var(--fg); }
1243
+ .ds-file-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1244
+ .ds-file-controls { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); flex-wrap: wrap; }
1245
+ .ds-file-controls .spread { flex: 1 1 auto; }
1246
+ .ds-file-controls .ds-file-sort { padding: 0; }
1247
+ .ds-bulkbar {
1248
+ display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
1249
+ padding: var(--space-1) var(--space-2);
1250
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1251
+ }
1252
+ .ds-bulkbar-count { font-size: var(--fs-tiny); color: var(--fg-2); }
1253
+
1254
+ /* Density picker — list / compact / thumbnails. */
1255
+ .ds-density {
1256
+ display: inline-flex; gap: 2px; padding: 2px;
1257
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1258
+ }
1259
+ .ds-density-btn {
1260
+ font-size: var(--fs-tiny); color: var(--fg-2);
1261
+ background: none; border: none; cursor: pointer;
1262
+ padding: 2px var(--space-2); border-radius: calc(var(--r-1) - 2px);
1263
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1264
+ }
1265
+ .ds-density-btn:hover { color: var(--fg); }
1266
+ .ds-density-btn.active { background: var(--accent-tint); color: var(--accent); }
1267
+ .ds-density-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1268
+
1269
+ /* Compact density — tighter rows for long listings. */
1270
+ .ds-file-grid[data-density="compact"] { gap: 2px; }
1271
+ .ds-file-grid[data-density="compact"] .ds-file-row { padding: 5px 12px; gap: 10px; }
1272
+ .ds-file-grid[data-density="compact"] .ds-file-row .title { font-size: var(--fs-xs); }
1273
+ .ds-file-grid[data-density="compact"] .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
1274
+ .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: 13px; }
1275
+
1276
+ /* Thumbnail density — tile grid; image entries carry a real lazy thumbnail. */
1277
+ .ds-file-grid-thumb {
1278
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
1279
+ gap: var(--space-3); align-items: start;
1280
+ }
1281
+ .ds-file-cell {
1282
+ position: relative;
1283
+ background: var(--bg); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1284
+ overflow: hidden;
1285
+ transition: border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1286
+ }
1287
+ .ds-file-cell:hover { border-color: var(--fg-3); }
1288
+ .ds-file-cell.active { border-color: var(--accent); background: var(--accent-tint); }
1289
+ .ds-file-cell.is-marked { border-color: var(--accent); background: var(--accent-tint); }
1290
+ .ds-file-cell.is-locked { opacity: 0.6; }
1291
+ .ds-file-cell-open {
1292
+ display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
1293
+ width: 100%; padding: var(--space-1); margin: 0;
1294
+ background: none; border: none; cursor: pointer; color: var(--fg);
1295
+ }
1296
+ .ds-file-cell-open[disabled] { cursor: default; }
1297
+ .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-2); }
1298
+ .ds-file-cell-media {
1299
+ display: flex; align-items: center; justify-content: center;
1300
+ width: 100%; aspect-ratio: 4 / 3;
1301
+ background: var(--bg-2); border-radius: var(--r-1); overflow: hidden;
1302
+ }
1303
+ .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1304
+ .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1305
+ .ds-file-cell-name {
1306
+ font-size: var(--fs-tiny); text-align: left;
1307
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1308
+ }
1309
+ .ds-file-cell-meta { font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-3); text-align: left; }
1310
+ .ds-file-cell-check {
1311
+ position: absolute; top: 4px; left: 4px; z-index: 1;
1312
+ background: color-mix(in oklab, var(--bg) 78%, transparent);
1313
+ }
1314
+
1210
1315
  /* Card mode — opt-in via data-columns; switches the list to a grid. */
1211
1316
  .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1212
1317
  .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
@@ -1589,7 +1694,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1589
1694
  .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
1590
1695
  .ds-segmented .ds-seg-btn.is-on {
1591
1696
  background: var(--bg); color: var(--fg);
1592
- box-shadow: var(--shadow-1);
1697
+ box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
1593
1698
  }
1594
1699
  .ds-theme-toggle.btn {
1595
1700
  font-family: var(--ff-mono); font-size: var(--fs-xs);
@@ -1795,7 +1900,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1795
1900
  .chat-msg:hover .chat-image,
1796
1901
  .chat-image:hover {
1797
1902
  border-color: color-mix(in oklab, var(--accent) 35%, transparent);
1798
- box-shadow: 0 4px 16px color-mix(in oklab, var(--fg) 12%, transparent);
1799
1903
  }
1800
1904
  .chat-image img { display: block; width: 100%; height: auto; max-height: 360px; object-fit: cover; }
1801
1905
  .chat-image .cap,
@@ -1836,7 +1940,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1836
1940
  border-radius: 12px; overflow: hidden; max-width: min(100%, 480px);
1837
1941
  transition: box-shadow 0.12s ease, border-color 0.12s ease;
1838
1942
  }
1839
- .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); box-shadow: 0 2px 12px color-mix(in oklab, var(--fg) 6%, transparent); }
1943
+ .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); }
1840
1944
  .chat-pdf-head {
1841
1945
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
1842
1946
  background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
@@ -1864,7 +1968,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1864
1968
  .chat-link:hover {
1865
1969
  background: var(--bg-3);
1866
1970
  border-color: color-mix(in oklab, var(--accent) 40%, transparent);
1867
- box-shadow: 0 2px 12px color-mix(in oklab, var(--fg) 8%, transparent);
1868
1971
  }
1869
1972
  .chat-link:not(:has(.thumb)):not(:has(img)) { grid-template-columns: 1fr; }
1870
1973
  .chat-link .thumb,
@@ -2986,6 +3089,15 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2986
3089
  .ws-shell.ws-sessions-open .ws-scrim, .ws-shell.ws-pane-open .ws-scrim { opacity: 1; pointer-events: auto; }
2987
3090
  /* The mobile drawer-toggle affordances live in the crumb bar. */
2988
3091
  .ws-drawer-toggle { display: inline-flex; }
3092
+ /* The Crumb's narrow collapse elsewhere keys on the .app @container, which
3093
+ does not exist inside WorkspaceShell - mirror it here so the crumb bar
3094
+ cannot overflow a narrow viewport (trail hides, leaf ellipsizes, the
3095
+ right cluster wraps under instead of pushing past the edge). */
3096
+ .ws-crumb { padding-top: 6px; padding-bottom: 6px; }
3097
+ .ws-crumb .app-crumb { flex-wrap: wrap; min-width: 0; }
3098
+ .ws-crumb .app-crumb > .sep, .ws-crumb .app-crumb > span:not(.crumb-right):not(.leaf) { display: none; }
3099
+ .ws-crumb .app-crumb .leaf { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
3100
+ .ws-crumb .app-crumb .crumb-right { margin-left: 0; flex-wrap: wrap; min-width: 0; display: inline-flex; }
2989
3101
  }
2990
3102
  /* Drawer toggles are mobile-only chrome; hidden on the desktop grid. */
2991
3103
  .ws-drawer-toggle { display: none; align-items: center; justify-content: center; width: 40px; height: 40px; border: none; background: none; color: var(--fg-2); cursor: pointer; border-radius: var(--r-1); }
package/dist/247420.css CHANGED
@@ -904,10 +904,10 @@
904
904
  ============================================================ */
905
905
  .ds-247420 .panel {
906
906
  background: var(--panel-1, var(--bg-2));
907
- border-radius: var(--r-3);
907
+ border: var(--bw-hair) solid var(--rule);
908
+ border-radius: var(--r-2);
908
909
  margin: 0 0 var(--space-5);
909
910
  padding: var(--space-3);
910
- box-shadow: var(--panel-shadow);
911
911
  position: relative;
912
912
  }
913
913
  .ds-247420 .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
@@ -1296,10 +1296,10 @@
1296
1296
  gap: 3px;
1297
1297
  }
1298
1298
  .ds-247420 .ds-file-row {
1299
- grid-template-columns: 22px minmax(0, 1fr) auto;
1300
- gap: 10px; padding: 10px 12px;
1299
+ gap: 8px; padding: 10px 12px;
1301
1300
  font-size: var(--fs-xs);
1302
1301
  }
1302
+ .ds-247420 .ds-file-open { gap: 10px; }
1303
1303
  /* On mobile, fold meta under the title and keep actions inline. */
1304
1304
  .ds-247420 .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
1305
1305
  .ds-247420 .ds-file-row .ds-file-actions { opacity: 1; }
@@ -1307,6 +1307,7 @@
1307
1307
  reachable by touch (cohesion sweep). */
1308
1308
  .ds-247420 .ds-file-act, .ds-247420 .ds-file-sort-btn, .ds-247420 .ds-crumb-seg { min-height: 44px; }
1309
1309
  .ds-247420 .ds-file-filter-input { min-height: 44px; }
1310
+ .ds-247420 .ds-file-check, .ds-247420 .ds-file-selectall, .ds-247420 .ds-density-btn { min-height: 44px; min-width: 44px; }
1310
1311
 
1311
1312
  /* Chat */
1312
1313
  .ds-247420 .chat-stack { max-width: 100%; min-width: 0; }
@@ -1533,10 +1534,13 @@
1533
1534
  @keyframes ds-skel-shimmer { 100% { transform: translateX(100%); } }
1534
1535
  @media (prefers-reduced-motion: reduce) { .ds-247420 .ds-skel::after { animation: none; } }
1535
1536
 
1536
- /* File row — linear layout (icon · title · meta · actions) */
1537
+ /* File row — linear layout (checkbox? · open-button[code · icon · title · meta] · actions).
1538
+ The row is a flex strip; the open <button> is the stretching member and lays
1539
+ out the entry's own columns. It needs a full reset (UA button chrome off)
1540
+ because FileRow wraps the row content in a real button for native keyboard
1541
+ semantics. */
1537
1542
  .ds-247420 .ds-file-row {
1538
- display: grid; grid-template-columns: 26px minmax(0, 1fr) auto auto;
1539
- gap: 14px; align-items: center;
1543
+ display: flex; align-items: center; gap: 10px;
1540
1544
  padding: 11px 16px; background: var(--bg);
1541
1545
  border: var(--bw-hair) solid transparent;
1542
1546
  border-radius: var(--r-2); color: var(--fg);
@@ -1545,6 +1549,14 @@
1545
1549
  border-color var(--dur-snap) var(--ease),
1546
1550
  transform var(--dur-snap) var(--ease);
1547
1551
  }
1552
+ .ds-247420 .ds-file-open {
1553
+ display: flex; align-items: center; gap: 14px;
1554
+ flex: 1 1 auto; min-width: 0;
1555
+ background: none; border: 0; padding: 0; margin: 0;
1556
+ color: inherit; font: inherit; text-align: left; cursor: pointer;
1557
+ }
1558
+ .ds-247420 .ds-file-open[disabled] { cursor: default; }
1559
+ .ds-247420 .ds-file-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
1548
1560
  .ds-247420 .ds-file-row:hover {
1549
1561
  background: var(--bg-2);
1550
1562
  border-color: var(--rule);
@@ -1566,7 +1578,7 @@
1566
1578
  .ds-247420 .ds-file-row .title {
1567
1579
  font-weight: 500; font-size: var(--fs-sm);
1568
1580
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1569
- min-width: 0;
1581
+ min-width: 0; flex: 1 1 auto;
1570
1582
  }
1571
1583
  .ds-247420 .ds-file-row .code {
1572
1584
  font-family: var(--ff-mono); font-size: var(--fs-micro);
@@ -1608,6 +1620,99 @@
1608
1620
  .ds-247420 .ds-file-act:hover { background: var(--bg-3); color: var(--fg); }
1609
1621
  .ds-247420 .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
1610
1622
 
1623
+ /* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
1624
+ .ds-247420 .ds-file-check {
1625
+ display: inline-flex; align-items: center; justify-content: center;
1626
+ min-width: 28px; height: 28px; padding: 0 4px;
1627
+ background: transparent; border: 0; border-radius: var(--r-1);
1628
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1629
+ cursor: pointer;
1630
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1631
+ }
1632
+ .ds-247420 .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
1633
+ .ds-247420 .ds-file-check.is-marked { color: var(--accent); }
1634
+ .ds-247420 .ds-file-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1635
+ .ds-247420 .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
1636
+ .ds-247420 .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
1637
+ .ds-247420 .ds-file-selectall {
1638
+ display: inline-flex; align-items: center; gap: var(--space-1);
1639
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2);
1640
+ cursor: pointer; background: none; border: none;
1641
+ padding: var(--space-1); border-radius: var(--r-1);
1642
+ }
1643
+ .ds-247420 .ds-file-selectall:hover { background: var(--bg-2); color: var(--fg); }
1644
+ .ds-247420 .ds-file-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1645
+ .ds-247420 .ds-file-controls { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); flex-wrap: wrap; }
1646
+ .ds-247420 .ds-file-controls .spread { flex: 1 1 auto; }
1647
+ .ds-247420 .ds-file-controls .ds-file-sort { padding: 0; }
1648
+ .ds-247420 .ds-bulkbar {
1649
+ display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
1650
+ padding: var(--space-1) var(--space-2);
1651
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1652
+ }
1653
+ .ds-247420 .ds-bulkbar-count { font-size: var(--fs-tiny); color: var(--fg-2); }
1654
+
1655
+ /* Density picker — list / compact / thumbnails. */
1656
+ .ds-247420 .ds-density {
1657
+ display: inline-flex; gap: 2px; padding: 2px;
1658
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1659
+ }
1660
+ .ds-247420 .ds-density-btn {
1661
+ font-size: var(--fs-tiny); color: var(--fg-2);
1662
+ background: none; border: none; cursor: pointer;
1663
+ padding: 2px var(--space-2); border-radius: calc(var(--r-1) - 2px);
1664
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1665
+ }
1666
+ .ds-247420 .ds-density-btn:hover { color: var(--fg); }
1667
+ .ds-247420 .ds-density-btn.active { background: var(--accent-tint); color: var(--accent); }
1668
+ .ds-247420 .ds-density-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1669
+
1670
+ /* Compact density — tighter rows for long listings. */
1671
+ .ds-247420 .ds-file-grid[data-density="compact"] { gap: 2px; }
1672
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row { padding: 5px 12px; gap: 10px; }
1673
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row .title { font-size: var(--fs-xs); }
1674
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
1675
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: 13px; }
1676
+
1677
+ /* Thumbnail density — tile grid; image entries carry a real lazy thumbnail. */
1678
+ .ds-247420 .ds-file-grid-thumb {
1679
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
1680
+ gap: var(--space-3); align-items: start;
1681
+ }
1682
+ .ds-247420 .ds-file-cell {
1683
+ position: relative;
1684
+ background: var(--bg); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1685
+ overflow: hidden;
1686
+ transition: border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1687
+ }
1688
+ .ds-247420 .ds-file-cell:hover { border-color: var(--fg-3); }
1689
+ .ds-247420 .ds-file-cell.active { border-color: var(--accent); background: var(--accent-tint); }
1690
+ .ds-247420 .ds-file-cell.is-marked { border-color: var(--accent); background: var(--accent-tint); }
1691
+ .ds-247420 .ds-file-cell.is-locked { opacity: 0.6; }
1692
+ .ds-247420 .ds-file-cell-open {
1693
+ display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
1694
+ width: 100%; padding: var(--space-1); margin: 0;
1695
+ background: none; border: none; cursor: pointer; color: var(--fg);
1696
+ }
1697
+ .ds-247420 .ds-file-cell-open[disabled] { cursor: default; }
1698
+ .ds-247420 .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-2); }
1699
+ .ds-247420 .ds-file-cell-media {
1700
+ display: flex; align-items: center; justify-content: center;
1701
+ width: 100%; aspect-ratio: 4 / 3;
1702
+ background: var(--bg-2); border-radius: var(--r-1); overflow: hidden;
1703
+ }
1704
+ .ds-247420 .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1705
+ .ds-247420 .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1706
+ .ds-247420 .ds-file-cell-name {
1707
+ font-size: var(--fs-tiny); text-align: left;
1708
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1709
+ }
1710
+ .ds-247420 .ds-file-cell-meta { font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-3); text-align: left; }
1711
+ .ds-247420 .ds-file-cell-check {
1712
+ position: absolute; top: 4px; left: 4px; z-index: 1;
1713
+ background: color-mix(in oklab, var(--bg) 78%, transparent);
1714
+ }
1715
+
1611
1716
  /* Card mode — opt-in via data-columns; switches the list to a grid. */
1612
1717
  .ds-247420 .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1613
1718
  .ds-247420 .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
@@ -1990,7 +2095,7 @@
1990
2095
  .ds-247420 .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
1991
2096
  .ds-247420 .ds-segmented .ds-seg-btn.is-on {
1992
2097
  background: var(--bg); color: var(--fg);
1993
- box-shadow: var(--shadow-1);
2098
+ box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
1994
2099
  }
1995
2100
  .ds-247420 .ds-theme-toggle.btn {
1996
2101
  font-family: var(--ff-mono); font-size: var(--fs-xs);
@@ -2196,7 +2301,6 @@
2196
2301
  .ds-247420 .chat-msg:hover .chat-image,
2197
2302
  .ds-247420 .chat-image:hover {
2198
2303
  border-color: color-mix(in oklab, var(--accent) 35%, transparent);
2199
- box-shadow: 0 4px 16px color-mix(in oklab, var(--fg) 12%, transparent);
2200
2304
  }
2201
2305
  .ds-247420 .chat-image img { display: block; width: 100%; height: auto; max-height: 360px; object-fit: cover; }
2202
2306
  .ds-247420 .chat-image .cap,
@@ -2237,7 +2341,7 @@
2237
2341
  border-radius: 12px; overflow: hidden; max-width: min(100%, 480px);
2238
2342
  transition: box-shadow 0.12s ease, border-color 0.12s ease;
2239
2343
  }
2240
- .ds-247420 .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); box-shadow: 0 2px 12px color-mix(in oklab, var(--fg) 6%, transparent); }
2344
+ .ds-247420 .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); }
2241
2345
  .ds-247420 .chat-pdf-head {
2242
2346
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
2243
2347
  background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
@@ -2265,7 +2369,6 @@
2265
2369
  .ds-247420 .chat-link:hover {
2266
2370
  background: var(--bg-3);
2267
2371
  border-color: color-mix(in oklab, var(--accent) 40%, transparent);
2268
- box-shadow: 0 2px 12px color-mix(in oklab, var(--fg) 8%, transparent);
2269
2372
  }
2270
2373
  .ds-247420 .chat-link:not(:has(.thumb)):not(:has(img)) { grid-template-columns: 1fr; }
2271
2374
  .ds-247420 .chat-link .thumb,
@@ -3378,6 +3481,15 @@
3378
3481
  .ds-247420 .ws-shell.ws-sessions-open .ws-scrim, .ds-247420 .ws-shell.ws-pane-open .ws-scrim { opacity: 1; pointer-events: auto; }
3379
3482
  /* The mobile drawer-toggle affordances live in the crumb bar. */
3380
3483
  .ds-247420 .ws-drawer-toggle { display: inline-flex; }
3484
+ /* The Crumb's narrow collapse elsewhere keys on the .app @container, which
3485
+ does not exist inside WorkspaceShell - mirror it here so the crumb bar
3486
+ cannot overflow a narrow viewport (trail hides, leaf ellipsizes, the
3487
+ right cluster wraps under instead of pushing past the edge). */
3488
+ .ds-247420 .ws-crumb { padding-top: 6px; padding-bottom: 6px; }
3489
+ .ds-247420 .ws-crumb .app-crumb { flex-wrap: wrap; min-width: 0; }
3490
+ .ds-247420 .ws-crumb .app-crumb > .sep, .ds-247420 .ws-crumb .app-crumb > span:not(.crumb-right):not(.leaf) { display: none; }
3491
+ .ds-247420 .ws-crumb .app-crumb .leaf { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
3492
+ .ds-247420 .ws-crumb .app-crumb .crumb-right { margin-left: 0; flex-wrap: wrap; min-width: 0; display: inline-flex; }
3381
3493
  }
3382
3494
  /* Drawer toggles are mobile-only chrome; hidden on the desktop grid. */
3383
3495
  .ds-247420 .ws-drawer-toggle { display: none; align-items: center; justify-content: center; width: 40px; height: 40px; border: none; background: none; color: var(--fg-2); cursor: pointer; border-radius: var(--r-1); }