anentrypoint-design 0.0.206 → 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 +124 -12
- package/chat.css +139 -2
- package/dist/247420.css +263 -14
- package/dist/247420.js +15 -13
- package/package.json +1 -1
- package/src/components/agent-chat.js +5 -1
- package/src/components/chat.js +26 -3
- package/src/components/files-modals.js +45 -3
- package/src/components/files.js +164 -29
- package/src/components/sessions.js +131 -50
- package/src/components/shell.js +14 -6
- package/src/components.js +1 -1
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
|
|
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
|
-
|
|
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:
|
|
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(--
|
|
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);
|
|
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/chat.css
CHANGED
|
@@ -464,7 +464,10 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
464
464
|
/* --- C5: active dashboard card (current conversation). --- */
|
|
465
465
|
.ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
|
|
466
466
|
.ds-dash-card.is-selected { background: var(--accent-tint); }
|
|
467
|
-
|
|
467
|
+
/* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
|
|
468
|
+
agent is flagged in a dense grid, not merely faded near-invisibly. The word
|
|
469
|
+
'idle' co-carries state, so this stays colour-blind safe. */
|
|
470
|
+
.ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber, #d9a93a); }
|
|
468
471
|
|
|
469
472
|
/* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
|
|
470
473
|
|
|
@@ -550,7 +553,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
550
553
|
/* Enter-to-send hint: visible while the composer is focused or carries a
|
|
551
554
|
draft; hidden under 420px to save rows. */
|
|
552
555
|
.chat-composer-hint {
|
|
553
|
-
display: none; padding: 2px var(--space-
|
|
556
|
+
display: none; width: 100%; order: 5; padding: 2px var(--space-1) 0;
|
|
554
557
|
font-size: var(--fs-micro); color: var(--fg-3);
|
|
555
558
|
}
|
|
556
559
|
.chat-composer:focus-within .chat-composer-hint,
|
|
@@ -632,3 +635,137 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
632
635
|
|
|
633
636
|
/* One connection vocabulary: offline (is-lost kept as legacy alias). */
|
|
634
637
|
.ds-dash-stream.is-offline { color: var(--flame); }
|
|
638
|
+
|
|
639
|
+
/* ============================================================
|
|
640
|
+
10th run - Claude-Code-web design-language parity
|
|
641
|
+
============================================================ */
|
|
642
|
+
|
|
643
|
+
/* Flat full-width chat turns (claude.ai/code), replacing the messenger
|
|
644
|
+
avatar-disc + colored-bubble layout. AgentChat passes flat:true; the demo
|
|
645
|
+
Chat keeps the bubble layout. Turns are full-width to --measure; the user vs
|
|
646
|
+
assistant distinction is a role label + a faint assistant background. */
|
|
647
|
+
.chat-msg-flat { display: block; padding: var(--space-3) var(--space-4); margin: 0; background: none; border-radius: var(--r-2); }
|
|
648
|
+
.chat-msg-flat.them { background: color-mix(in oklab, var(--fg) 3%, transparent); }
|
|
649
|
+
.chat-msg-flat.you { background: none; }
|
|
650
|
+
.chat-msg-flat .chat-stack { max-width: var(--measure); width: 100%; margin: 0; align-items: stretch; }
|
|
651
|
+
.chat-msg-flat.you .chat-stack { align-items: stretch; }
|
|
652
|
+
.chat-role { font-size: var(--fs-tiny); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); margin-bottom: var(--space-1); }
|
|
653
|
+
.chat-msg-flat.you .chat-role { color: var(--accent); }
|
|
654
|
+
.chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
|
|
655
|
+
.chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
|
|
656
|
+
.chat-msg-flat:hover { background: color-mix(in oklab, var(--fg) 3%, transparent); }
|
|
657
|
+
.chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 2%, transparent); }
|
|
658
|
+
.chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
|
|
659
|
+
.chat-msg-flat .chat-avatar { display: none; }
|
|
660
|
+
|
|
661
|
+
/* Tool-call card: a bordered, status-toned, scannable card (claude.ai/code),
|
|
662
|
+
not the raw mascot-tinted details dump. The node keeps the .chat-bubble
|
|
663
|
+
class, so these rules de-frame it and restyle. Placed after the flat-bubble
|
|
664
|
+
reset so they win on equal specificity. */
|
|
665
|
+
.chat-msg .chat-tool {
|
|
666
|
+
display: block; max-width: 100%; padding: 0; margin: var(--space-1) 0;
|
|
667
|
+
background: var(--bg); color: var(--fg);
|
|
668
|
+
border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
|
|
669
|
+
box-shadow: none; overflow: hidden;
|
|
670
|
+
}
|
|
671
|
+
.chat-msg .chat-tool[open] { background: var(--bg); }
|
|
672
|
+
.chat-msg .chat-tool .chat-tool-head {
|
|
673
|
+
display: flex; align-items: center; gap: var(--space-2);
|
|
674
|
+
padding: var(--space-2) var(--space-3); cursor: pointer;
|
|
675
|
+
font-size: var(--fs-sm); list-style: none;
|
|
676
|
+
}
|
|
677
|
+
.chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
|
|
678
|
+
.chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
|
|
679
|
+
.chat-tool-icon { display: inline-flex; color: var(--fg-3); }
|
|
680
|
+
.chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
|
|
681
|
+
.chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
682
|
+
.chat-tool-status {
|
|
683
|
+
margin-left: auto; flex: 0 0 auto;
|
|
684
|
+
font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
|
|
685
|
+
color: var(--fg-3);
|
|
686
|
+
padding: 2px var(--space-2); border-radius: var(--r-pill);
|
|
687
|
+
background: color-mix(in oklab, var(--fg) 6%, transparent);
|
|
688
|
+
}
|
|
689
|
+
.chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
|
|
690
|
+
.chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
|
|
691
|
+
.chat-tool-body { border-top: var(--bw-hair) solid var(--rule); padding: var(--space-2) var(--space-3); display: flex; flex-direction: column; gap: var(--space-2); }
|
|
692
|
+
.chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
|
|
693
|
+
.chat-tool-section-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--fg-3); }
|
|
694
|
+
.chat-tool-pre { margin: 0; padding: var(--space-2); background: var(--bg-2); border-radius: var(--r-1); font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.45; overflow-x: auto; max-height: 320px; overflow-y: auto; }
|
|
695
|
+
.chat-tool-pre.is-error { color: var(--flame); }
|
|
696
|
+
.chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
|
|
697
|
+
|
|
698
|
+
/* Fenced-code language tab on every rendered-markdown block (not just the
|
|
699
|
+
structured CodeNode). injectCodeCopy reads the language- class. */
|
|
700
|
+
.chat-code-block { position: relative; }
|
|
701
|
+
.chat-code-lang {
|
|
702
|
+
position: absolute; top: 0; left: 0; z-index: 2;
|
|
703
|
+
padding: 2px var(--space-2); border-bottom-right-radius: var(--r-1);
|
|
704
|
+
font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: .04em;
|
|
705
|
+
color: var(--fg-3); background: color-mix(in oklab, var(--fg) 6%, transparent);
|
|
706
|
+
pointer-events: none;
|
|
707
|
+
}
|
|
708
|
+
.chat-code-block pre { padding-top: calc(var(--space-3) + 4px); }
|
|
709
|
+
|
|
710
|
+
/* Motion + microinteraction polish (all reduced-motion guarded). */
|
|
711
|
+
.ds-session-row { transition: background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease); }
|
|
712
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
713
|
+
.agentchat-thread { scroll-behavior: smooth; }
|
|
714
|
+
.ds-alert { animation: ds-alert-in var(--dur-base) var(--ease); }
|
|
715
|
+
}
|
|
716
|
+
@keyframes ds-alert-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
|
|
717
|
+
.chat-code-copy { transition: opacity var(--dur-snap, .12s) var(--ease, ease), color var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease); }
|
|
718
|
+
.chat-msg-action { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
|
|
719
|
+
.agentchat-install-copy { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
|
|
720
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
721
|
+
.btn.is-armed, .btn-primary.is-armed { animation: ds-arm-pulse var(--dur-slow) var(--ease); }
|
|
722
|
+
}
|
|
723
|
+
@keyframes ds-arm-pulse { 0% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--warn) 55%, transparent); } 100% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--warn) 0%, transparent); } }
|
|
724
|
+
.ds-dash-card.is-new { box-shadow: inset 2px 0 0 var(--accent), 0 0 0 1px color-mix(in oklab, var(--accent) 40%, transparent); }
|
|
725
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
726
|
+
.ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
|
|
727
|
+
}
|
|
728
|
+
@keyframes ds-card-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
|
|
729
|
+
|
|
730
|
+
/* Live command-center: status-bucket groups + header breakdown + heartbeat. */
|
|
731
|
+
.ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
732
|
+
.ds-dash-group-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); padding: 0 var(--space-1); }
|
|
733
|
+
.ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
|
|
734
|
+
.ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
|
|
735
|
+
.ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
|
|
736
|
+
.ds-dash-breakdown .seg.is-idle { color: var(--amber, #d9a93a); }
|
|
737
|
+
.ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
|
|
738
|
+
.ds-dash-selectall { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--fs-tiny); color: var(--fg-2); cursor: pointer; background: none; border: none; padding: var(--space-1); }
|
|
739
|
+
.ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
740
|
+
.ds-dash-clear { background: none; border: none; color: var(--fg-3); cursor: pointer; font-size: var(--fs-tiny); text-decoration: underline dotted; padding: var(--space-1); }
|
|
741
|
+
|
|
742
|
+
/* Conversation-rail loading skeleton (cold ccsniff walk). */
|
|
743
|
+
.ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
|
|
744
|
+
.ds-session-row-skeleton .ds-skel { background: var(--bg-3); border-radius: var(--r-1); }
|
|
745
|
+
.ds-session-row-skeleton .ds-skel-title { height: 12px; width: 70%; }
|
|
746
|
+
.ds-session-row-skeleton .ds-skel-meta { height: 9px; width: 45%; }
|
|
747
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
748
|
+
.ds-session-row-skeleton .ds-skel { animation: ds-skel-shimmer 1.3s ease-in-out infinite; background: linear-gradient(90deg, var(--bg-3) 0%, var(--bg-2) 50%, var(--bg-3) 100%); background-size: 200% 100%; }
|
|
749
|
+
}
|
|
750
|
+
@keyframes ds-skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
|
|
751
|
+
|
|
752
|
+
/* File code preview: paint Prism tokens (the bundle scoped them to the chat
|
|
753
|
+
block only) + an optional non-selectable line-number gutter. */
|
|
754
|
+
.ds-preview-code code { color: var(--fg); }
|
|
755
|
+
.ds-preview-code .token.comment, .ds-preview-code .token.prolog, .ds-preview-code .token.doctype, .ds-preview-code .token.cdata { color: var(--fg-3); }
|
|
756
|
+
.ds-preview-code .token.punctuation { color: var(--fg-2); }
|
|
757
|
+
.ds-preview-code .token.property, .ds-preview-code .token.tag, .ds-preview-code .token.boolean, .ds-preview-code .token.number, .ds-preview-code .token.constant, .ds-preview-code .token.symbol { color: var(--purple-2, #7F18A4); }
|
|
758
|
+
.ds-preview-code .token.selector, .ds-preview-code .token.attr-name, .ds-preview-code .token.string, .ds-preview-code .token.char, .ds-preview-code .token.builtin { color: var(--green-2, #3A9A34); }
|
|
759
|
+
.ds-preview-code .token.atrule, .ds-preview-code .token.attr-value, .ds-preview-code .token.keyword { color: var(--sky, #3A6EFF); }
|
|
760
|
+
.ds-preview-code .token.function, .ds-preview-code .token.class-name { color: var(--flame); }
|
|
761
|
+
.ds-preview-code.has-gutter { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0 var(--space-2); }
|
|
762
|
+
.ds-preview-code.has-gutter code { display: block; min-width: 0; overflow-x: auto; }
|
|
763
|
+
.ds-preview-gutter { user-select: none; text-align: right; padding: 0 var(--space-2) 0 0; color: var(--fg-3); border-right: var(--bw-hair) solid var(--rule); font-family: var(--ff-mono); white-space: pre; line-height: inherit; }
|
|
764
|
+
|
|
765
|
+
/* Image preview: fit/actual control + alpha checkerboard. */
|
|
766
|
+
.ds-preview-media-controls { display: flex; gap: var(--space-2); padding: var(--space-2); justify-content: center; }
|
|
767
|
+
.ds-preview-media-alpha {
|
|
768
|
+
background-image: linear-gradient(45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(-45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--bg-3) 75%), linear-gradient(-45deg, transparent 75%, var(--bg-3) 75%);
|
|
769
|
+
background-size: 16px 16px; background-position: 0 0, 0 8px, 8px -8px, -8px 0;
|
|
770
|
+
}
|
|
771
|
+
.ds-preview-media.is-actual { max-width: none; max-height: none; }
|