anentrypoint-design 0.0.195 → 0.0.197

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/247420.css CHANGED
@@ -646,9 +646,14 @@
646
646
  outline: 2px solid var(--accent);
647
647
  outline-offset: 2px;
648
648
  }
649
+ /* Active tab reads as a subtle tinted pill with an accent underline rather than
650
+ an oversized filled oval that sits taller than its inactive siblings and reads
651
+ as misaligned. Same height as the inactive links — only the tint + underline
652
+ change. */
649
653
  .ds-247420 .app-topbar nav a.active {
650
- color: var(--accent-fg);
651
- background: var(--accent);
654
+ color: var(--accent);
655
+ background: color-mix(in oklab, var(--accent) 16%, transparent);
656
+ box-shadow: inset 0 -2px 0 0 var(--accent);
652
657
  font-weight: 600;
653
658
  }
654
659
 
@@ -941,6 +946,9 @@
941
946
  background: transparent; border-radius: 3px;
942
947
  transition: background var(--dur-snap) var(--ease);
943
948
  }
949
+ /* A clickable row (onClick -> role=button, or a link row) is interactive, so it
950
+ carries a pointer cursor; without this the click affordance is invisible. */
951
+ .ds-247420 .row[role="button"], .ds-247420 a.row { cursor: pointer; }
944
952
  .ds-247420 .row:hover { background: var(--bg-2); }
945
953
  .ds-247420 .row:hover::before { background: var(--rule-strong); }
946
954
  .ds-247420 .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
@@ -989,6 +997,9 @@
989
997
  Section grouping
990
998
  ============================================================ */
991
999
  .ds-247420 .ds-section { margin: var(--space-8) 0; }
1000
+ /* Compact section (e.g. a PageHeader used as a page's first element): no large
1001
+ leading margin, modest trailing margin — top-aligns without consumer overrides. */
1002
+ .ds-247420 .ds-section-compact { margin-top: 0; margin-bottom: var(--space-4); }
992
1003
  .ds-247420 .ds-section > h3 {
993
1004
  font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
994
1005
  margin: 0 0 var(--space-5);
@@ -1461,6 +1472,39 @@
1461
1472
  flex-direction: column;
1462
1473
  gap: 4px;
1463
1474
  }
1475
+ .ds-247420 .ds-file-grid:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-2); }
1476
+
1477
+ /* Listing wrapper holds the optional filter + sort header above the grid. */
1478
+ .ds-247420 .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
1479
+ .ds-247420 .ds-file-filter { padding: 0 0 var(--space-1); }
1480
+ .ds-247420 .ds-file-filter-input {
1481
+ width: 100%; padding: 8px 12px; font-size: var(--fs-sm);
1482
+ background: var(--bg); color: var(--fg);
1483
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1484
+ }
1485
+ .ds-247420 .ds-file-filter-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1486
+ .ds-247420 .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
1487
+ .ds-247420 .ds-file-sort-btn {
1488
+ font-size: var(--fs-tiny); font-family: var(--ff-mono); color: var(--fg-3);
1489
+ background: none; border: none; cursor: pointer; padding: 2px 4px; border-radius: var(--r-1);
1490
+ }
1491
+ .ds-247420 .ds-file-sort-btn:hover { color: var(--fg-2); background: var(--bg-2); }
1492
+ .ds-247420 .ds-file-sort-btn.active { color: var(--accent); }
1493
+ .ds-247420 .ds-file-sort-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1494
+
1495
+ /* Skeleton shimmer rows shown while a directory loads. */
1496
+ .ds-247420 .ds-file-row-skeleton { cursor: default; pointer-events: none; }
1497
+ .ds-247420 .ds-skel { display: inline-block; border-radius: var(--r-1); background: var(--bg-2); position: relative; overflow: hidden; }
1498
+ .ds-247420 .ds-skel::after {
1499
+ content: ''; position: absolute; inset: 0;
1500
+ background: linear-gradient(90deg, transparent, var(--bg-3), transparent);
1501
+ transform: translateX(-100%); animation: ds-skel-shimmer 1.2s infinite;
1502
+ }
1503
+ .ds-247420 .ds-skel-icon { width: 22px; height: 22px; }
1504
+ .ds-247420 .ds-skel-title { height: 12px; width: 60%; }
1505
+ .ds-247420 .ds-skel-meta { height: 10px; width: 64px; margin-left: auto; }
1506
+ @keyframes ds-skel-shimmer { 100% { transform: translateX(100%); } }
1507
+ @media (prefers-reduced-motion: reduce) { .ds-247420 .ds-skel::after { animation: none; } }
1464
1508
 
1465
1509
  /* File row — linear layout (icon · title · meta · actions) */
1466
1510
  .ds-247420 .ds-file-row {
@@ -3093,6 +3137,158 @@
3093
3137
  .ds-247420 .brand { font-size: var(--fs-tiny); }
3094
3138
  }
3095
3139
 
3140
+ /* ----------------------------------------------------------------------------
3141
+ WorkspaceShell — Claude-Desktop / cowork three-column app shell.
3142
+ Columns: [ws-rail] [ws-sessions?] [ws-content] [ws-pane?]
3143
+ Collapse via .ws-rail-collapsed / .ws-pane-collapsed classes on .ws-shell.
3144
+ All sizing/colour from kit tokens; no hardcoded palette.
3145
+ ---------------------------------------------------------------------------- */
3146
+ .ds-247420 .ws-shell {
3147
+ --ws-rail-w: 232px;
3148
+ --ws-rail-w-collapsed: 60px;
3149
+ --ws-sessions-w: 296px;
3150
+ --ws-pane-w: 320px;
3151
+ display: grid;
3152
+ grid-template-columns: var(--ws-rail-w) var(--ws-sessions-w) 1fr var(--ws-pane-w);
3153
+ grid-template-areas: "rail sessions content pane";
3154
+ height: 100%;
3155
+ min-height: 0;
3156
+ background: var(--bg);
3157
+ color: var(--fg);
3158
+ }
3159
+ .ds-247420 .ws-shell.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr var(--ws-pane-w); grid-template-areas: "rail content pane"; }
3160
+ .ds-247420 .ws-shell.ws-no-pane.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr; grid-template-areas: "rail content"; }
3161
+ .ds-247420 .ws-shell.ws-no-pane:not(.ws-no-sessions) { grid-template-columns: var(--ws-rail-w) var(--ws-sessions-w) 1fr; grid-template-areas: "rail sessions content"; }
3162
+ .ds-247420 .ws-shell.ws-rail-collapsed { --ws-rail-w: var(--ws-rail-w-collapsed); }
3163
+ .ds-247420 .ws-shell.ws-pane-collapsed { --ws-pane-w: 0px; }
3164
+
3165
+ /* Rail (left nav) */
3166
+ .ds-247420 .ws-rail {
3167
+ grid-area: rail;
3168
+ position: relative;
3169
+ display: flex;
3170
+ flex-direction: column;
3171
+ min-height: 0;
3172
+ background: var(--bg-2);
3173
+ border-right: var(--bw-hair) solid var(--bg-3);
3174
+ overflow: hidden;
3175
+ transition: width var(--dur-base) var(--ease);
3176
+ }
3177
+ .ds-247420 .ws-rail-toggle {
3178
+ position: absolute; top: var(--space-2); right: var(--space-2);
3179
+ width: 36px; height: 36px;
3180
+ display: inline-flex; align-items: center; justify-content: center;
3181
+ background: transparent; border: none; color: var(--fg-2);
3182
+ border-radius: var(--r-1); cursor: pointer;
3183
+ }
3184
+ .ds-247420 .ws-rail-toggle:hover { background: var(--bg-3); color: var(--fg); }
3185
+ .ds-247420 .ws-rail-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3186
+ .ds-247420 .ws-rail-inner { display: flex; flex-direction: column; min-height: 0; flex: 1; padding: var(--space-3) var(--space-2); gap: var(--space-2); }
3187
+ .ds-247420 .ws-rail-head { display: flex; align-items: center; min-height: 36px; padding: 0 var(--space-2); }
3188
+ .ds-247420 .ws-rail-brand { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-body); color: var(--fg); white-space: nowrap; overflow: hidden; }
3189
+ .ds-247420 .ws-rail-action {
3190
+ display: flex; align-items: center; gap: var(--space-2);
3191
+ padding: var(--space-2) var(--space-3); margin: var(--space-1) 0;
3192
+ background: var(--accent); color: var(--accent-fg, var(--bg));
3193
+ border: none; border-radius: var(--r-1); cursor: pointer;
3194
+ font-family: var(--ff-body); font-size: var(--fs-sm); font-weight: 600;
3195
+ min-height: 40px; white-space: nowrap; overflow: hidden;
3196
+ }
3197
+ .ds-247420 .ws-rail-action:hover { filter: brightness(1.08); }
3198
+ .ds-247420 .ws-rail-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3199
+ .ds-247420 .ws-rail-nav { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; flex: 1; min-height: 0; overflow-y: auto; }
3200
+ .ds-247420 .ws-rail-item {
3201
+ display: flex; align-items: center; gap: var(--space-2);
3202
+ width: 100%; padding: var(--space-2); min-height: 44px;
3203
+ background: transparent; border: none; color: var(--fg-2);
3204
+ border-radius: var(--r-1); cursor: pointer; text-align: left;
3205
+ font-family: var(--ff-body); font-size: var(--fs-sm); white-space: nowrap; overflow: hidden;
3206
+ }
3207
+ .ds-247420 .ws-rail-item:hover { background: var(--bg-3); color: var(--fg); }
3208
+ .ds-247420 .ws-rail-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
3209
+ .ds-247420 .ws-rail-item.active { background: var(--accent-tint); color: var(--fg); box-shadow: inset 2px 0 0 var(--accent); }
3210
+ .ds-247420 .ws-rail-item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; }
3211
+ .ds-247420 .ws-rail-item-count { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
3212
+ .ds-247420 .ws-rail-foot { margin-top: auto; padding-top: var(--space-2); border-top: var(--bw-hair) solid var(--bg-3); }
3213
+
3214
+ /* Collapsed rail: icon-only — hide text labels, center icons, drop toggle's far-right pin */
3215
+ .ds-247420 .ws-rail-collapsed .ws-rail-brand,
3216
+ .ds-247420 .ws-rail-collapsed .ws-rail-action-label,
3217
+ .ds-247420 .ws-rail-collapsed .ws-rail-item-label,
3218
+ .ds-247420 .ws-rail-collapsed .ws-rail-item-count { display: none; }
3219
+ .ds-247420 .ws-rail-collapsed .ws-rail-item,
3220
+ .ds-247420 .ws-rail-collapsed .ws-rail-action { justify-content: center; gap: 0; }
3221
+ .ds-247420 .ws-rail-collapsed .ws-rail-head { justify-content: center; }
3222
+
3223
+ /* Sessions column */
3224
+ .ds-247420 .ws-sessions {
3225
+ grid-area: sessions;
3226
+ min-height: 0; display: flex; flex-direction: column;
3227
+ background: var(--bg); border-right: var(--bw-hair) solid var(--bg-3);
3228
+ overflow: hidden;
3229
+ }
3230
+ .ds-247420 .ws-no-sessions .ws-sessions { display: none; }
3231
+
3232
+ /* Content column */
3233
+ .ds-247420 .ws-content { grid-area: content; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
3234
+ .ds-247420 .ws-crumb { flex: 0 0 auto; display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
3235
+ .ds-247420 .ws-crumb-main { flex: 1 1 auto; min-width: 0; }
3236
+ .ds-247420 .ws-main { flex: 1; min-height: 0; overflow: auto; display: flex; flex-direction: column; }
3237
+ .ds-247420 .ws-main:focus { outline: none; }
3238
+
3239
+ /* Right context pane */
3240
+ .ds-247420 .ws-pane {
3241
+ grid-area: pane; position: relative;
3242
+ min-height: 0; display: flex; flex-direction: column;
3243
+ background: var(--bg-2); border-left: var(--bw-hair) solid var(--bg-3);
3244
+ overflow: hidden; transition: width var(--dur-base) var(--ease);
3245
+ }
3246
+ .ds-247420 .ws-pane-collapsed .ws-pane { width: 0; border-left: none; }
3247
+ .ds-247420 .ws-pane-collapsed .ws-pane > :not(.ws-pane-toggle) { display: none; }
3248
+ .ds-247420 .ws-pane-toggle {
3249
+ position: absolute; top: var(--space-2); left: calc(-1 * var(--space-5));
3250
+ width: 28px; height: 28px;
3251
+ display: inline-flex; align-items: center; justify-content: center;
3252
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg-2);
3253
+ border-radius: var(--r-1); cursor: pointer; z-index: 2;
3254
+ }
3255
+ .ds-247420 .ws-pane-toggle:hover { background: var(--bg-3); color: var(--fg); }
3256
+ .ds-247420 .ws-pane-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3257
+
3258
+ /* Responsive: below 900px collapse to a single content column; rail+sessions+pane
3259
+ become overlay drawers the host can toggle, or simply hide on mobile. We keep it
3260
+ honest: stack rail (icon row) over content, hide sessions+pane unless toggled. */
3261
+ @media (max-width: 900px) {
3262
+ .ds-247420 .ws-shell,
3263
+ .ds-247420 .ws-shell.ws-no-sessions,
3264
+ .ds-247420 .ws-shell.ws-no-pane,
3265
+ .ds-247420 .ws-shell.ws-no-pane.ws-no-sessions {
3266
+ grid-template-columns: 1fr;
3267
+ grid-template-areas: "content";
3268
+ }
3269
+ .ds-247420 .ws-rail { position: fixed; inset: 0 auto 0 0; width: var(--ws-rail-w-collapsed); z-index: 40; }
3270
+ .ds-247420 .ws-sessions { position: fixed; inset: 0 auto 0 var(--ws-rail-w-collapsed); width: min(var(--ws-sessions-w), 80vw); z-index: 42; transform: translateX(-110%); transition: transform var(--dur-base) var(--ease); }
3271
+ .ds-247420 .ws-shell.ws-sessions-open .ws-sessions { transform: translateX(0); }
3272
+ /* On mobile the pane is a drawer driven by .ws-pane-open (an explicit open
3273
+ intent), NOT by :not(.ws-pane-collapsed) - the desktop collapse default is
3274
+ "open" which would otherwise pop the pane over the thread on every load. */
3275
+ .ds-247420 .ws-pane { position: fixed; inset: 0 0 0 auto; width: min(var(--ws-pane-w), 85vw); z-index: 42; transform: translateX(110%); transition: transform var(--dur-base) var(--ease); }
3276
+ .ds-247420 .ws-shell.ws-pane-open .ws-pane { transform: translateX(0); }
3277
+ .ds-247420 .ws-content { grid-area: content; padding-left: var(--ws-rail-w-collapsed); }
3278
+ .ds-247420 .ws-rail-collapsed .ws-rail-item-label, .ds-247420 .ws-rail-collapsed .ws-rail-brand { display: none; }
3279
+ /* Tap-scrim behind an open drawer; dismiss on click. Hidden unless a drawer
3280
+ is open so it never blocks the content area on desktop. */
3281
+ .ds-247420 .ws-scrim { display: none; position: fixed; inset: 0; z-index: 41; background: color-mix(in srgb, var(--fg) 38%, transparent); }
3282
+ .ds-247420 .ws-shell.ws-sessions-open .ws-scrim, .ds-247420 .ws-shell.ws-pane-open .ws-scrim { display: block; }
3283
+ /* The mobile drawer-toggle affordances live in the crumb bar. */
3284
+ .ds-247420 .ws-drawer-toggle { display: inline-flex; }
3285
+ }
3286
+ /* Drawer toggles are mobile-only chrome; hidden on the desktop grid. */
3287
+ .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); }
3288
+ .ds-247420 .ws-drawer-toggle:hover { background: var(--bg-2); color: var(--fg); }
3289
+ .ds-247420 .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3290
+ .ds-247420 .ws-scrim { display: none; }
3291
+
3096
3292
  /* community.css */
3097
3293
  /* ============================================================
3098
3294
  247420 design system — community surface (Discord-style chat)
@@ -4734,6 +4930,8 @@
4734
4930
  }
4735
4931
  .ds-247420 .agentchat-title { font-size: 1em; margin: 0; }
4736
4932
  .ds-247420 .agentchat-sub { font-size: .85em; color: var(--fg-3); }
4933
+ /* Thread wrapper hosts the absolutely-positioned jump-to-latest button. */
4934
+ .ds-247420 .agentchat-thread-wrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
4737
4935
  .ds-247420 .agentchat-thread {
4738
4936
  flex: 1;
4739
4937
  min-height: 0;
@@ -4743,6 +4941,39 @@
4743
4941
  gap: var(--space-2, 8px);
4744
4942
  }
4745
4943
 
4944
+ /* Jump-to-latest: hidden until the thread scroll listener adds .show. */
4945
+ .ds-247420 .agentchat-jump {
4946
+ position: absolute; right: 16px; bottom: 12px; z-index: 3;
4947
+ display: none; align-items: center; gap: .35em;
4948
+ padding: .4em .8em; font: inherit; font-size: .8em; cursor: pointer;
4949
+ border-radius: 999px; border: var(--bw-hair) solid var(--rule);
4950
+ background: var(--bg-2); color: var(--fg-2, var(--fg));
4951
+ box-shadow: 0 2px 8px color-mix(in srgb, var(--fg) 14%, transparent);
4952
+ }
4953
+ .ds-247420 .agentchat-jump.show { display: inline-flex; }
4954
+ .ds-247420 .agentchat-jump:hover { background: var(--bg-3); }
4955
+ .ds-247420 .agentchat-jump:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
4956
+
4957
+ /* Streaming caret: a thin blinking bar at the live edge of an assistant turn. */
4958
+ .ds-247420 .chat-stream-caret {
4959
+ display: inline-block; width: 2px; height: 1.05em; margin-left: 1px;
4960
+ vertical-align: text-bottom; background: var(--accent, var(--fg));
4961
+ animation: chat-caret-blink 1s step-end infinite;
4962
+ }
4963
+ @keyframes chat-caret-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }
4964
+ @media (prefers-reduced-motion: reduce) { .ds-247420 .chat-stream-caret { animation: none; opacity: .8; } }
4965
+
4966
+ /* Per-message hover-revealed action row (copy / retry / edit). */
4967
+ .ds-247420 .chat-msg-actions { display: flex; gap: 2px; margin-top: 3px; opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease); }
4968
+ .ds-247420 .chat-msg:hover .chat-msg-actions, .ds-247420 .chat-msg:focus-within .chat-msg-actions { opacity: 1; }
4969
+ .ds-247420 .chat-msg-action {
4970
+ display: inline-flex; align-items: center; justify-content: center;
4971
+ width: 26px; height: 26px; padding: 0; cursor: pointer;
4972
+ border: none; border-radius: var(--r-1, 4px); background: none; color: var(--fg-3);
4973
+ }
4974
+ .ds-247420 .chat-msg-action:hover { background: var(--bg-2); color: var(--fg); }
4975
+ .ds-247420 .chat-msg-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
4976
+
4746
4977
  /* Empty state: a fresh thread is an invitation, not a void. */
4747
4978
  .ds-247420 .agentchat-empty {
4748
4979
  margin: auto;
@@ -4817,6 +5048,105 @@
4817
5048
  .ds-247420 .agentchat-controls { gap: .4em; }
4818
5049
  }
4819
5050
 
5051
+ /* ----------------------------------------------------------------------------
5052
+ Global status disc — a CSS-drawn status indicator (no text glyph) usable
5053
+ outside .agentchat-status (session rows, dashboard cards). Tone via modifier.
5054
+ ---------------------------------------------------------------------------- */
5055
+ .ds-247420 .status-dot-disc {
5056
+ display: inline-block; width: 8px; height: 8px; border-radius: 50%;
5057
+ background: var(--fg-3); flex: 0 0 auto;
5058
+ }
5059
+ .ds-247420 .status-dot-disc.status-dot-live { background: var(--green); }
5060
+ .ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); }
5061
+
5062
+ /* ----------------------------------------------------------------------------
5063
+ ConversationList — left-rail "Chats" column.
5064
+ ---------------------------------------------------------------------------- */
5065
+ .ds-247420 .ds-sessions { display: flex; flex-direction: column; min-height: 0; height: 100%; }
5066
+ .ds-247420 .ds-session-head { flex: 0 0 auto; display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); border-bottom: var(--bw-hair) solid var(--bg-3); }
5067
+ .ds-247420 .ds-session-new {
5068
+ display: flex; align-items: center; gap: var(--space-2); justify-content: center;
5069
+ padding: var(--space-2) var(--space-3); min-height: 44px;
5070
+ background: var(--accent); color: var(--accent-fg, var(--bg)); border: none;
5071
+ border-radius: var(--r-1); cursor: pointer; font-family: var(--ff-body);
5072
+ font-size: var(--fs-sm); font-weight: 600;
5073
+ }
5074
+ .ds-247420 .ds-session-new:hover { filter: brightness(1.08); }
5075
+ .ds-247420 .ds-session-new:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
5076
+ .ds-247420 .ds-session-search {
5077
+ width: 100%; padding: var(--space-2) var(--space-3); min-height: 44px;
5078
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg);
5079
+ border-radius: var(--r-1); font-family: var(--ff-body); font-size: var(--fs-sm);
5080
+ }
5081
+ .ds-247420 .ds-session-search:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5082
+ .ds-247420 .ds-session-list, .ds-247420 .ds-session-groups { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-2); }
5083
+ /* Grouped rows (Today/Yesterday/...) lay out like the flat list; the section
5084
+ label sticks to the top of the scroll area for Claude-Desktop-style headers. */
5085
+ .ds-247420 .ds-session-group { display: flex; flex-direction: column; }
5086
+ .ds-247420 .ds-session-group-rows { display: flex; flex-direction: column; gap: 2px; }
5087
+ .ds-247420 .ds-session-group-label { position: sticky; top: 0; z-index: 1; background: var(--bg-1, var(--bg)); font-size: var(--fs-tiny); color: var(--fg-3); text-transform: uppercase; letter-spacing: .04em; padding: var(--space-2) var(--space-2) var(--space-1); }
5088
+ .ds-247420 .ds-session-row {
5089
+ position: relative; display: flex; align-items: center; gap: var(--space-2);
5090
+ width: 100%; padding: var(--space-2); min-height: 52px; margin-bottom: 2px;
5091
+ background: transparent; border: none; border-radius: var(--r-1);
5092
+ cursor: pointer; text-align: left; color: var(--fg);
5093
+ }
5094
+ .ds-247420 .ds-session-row:hover { background: var(--bg-2); }
5095
+ .ds-247420 .ds-session-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
5096
+ .ds-247420 .ds-session-row.active { background: var(--accent-tint); box-shadow: inset 2px 0 0 var(--accent); }
5097
+ .ds-247420 .ds-session-row.rail-green::before, .ds-247420 .ds-session-row.rail-purple::before, .ds-247420 .ds-session-row.rail-flame::before {
5098
+ content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: 3px;
5099
+ }
5100
+ .ds-247420 .ds-session-row.rail-green::before { background: var(--green); }
5101
+ .ds-247420 .ds-session-row.rail-purple::before { background: var(--purple, var(--accent)); }
5102
+ .ds-247420 .ds-session-row.rail-flame::before { background: var(--flame); }
5103
+ .ds-247420 .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
5104
+ .ds-247420 .ds-session-title { font-size: var(--fs-sm); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5105
+ .ds-247420 .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5106
+ .ds-247420 .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
5107
+ .ds-247420 .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
5108
+ .ds-247420 .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); display: inline-block; }
5109
+ .ds-247420 .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
5110
+ .ds-247420 .ds-session-state-error { color: var(--flame); }
5111
+
5112
+ /* ----------------------------------------------------------------------------
5113
+ SessionDashboard — grid of live-session cards.
5114
+ ---------------------------------------------------------------------------- */
5115
+ .ds-247420 .ds-dash { display: flex; flex-direction: column; min-height: 0; }
5116
+ .ds-247420 .ds-dash-header { flex: 0 0 auto; display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4) 0; }
5117
+ .ds-247420 .ds-dash-count { font-size: var(--fs-sm); color: var(--fg-2); font-weight: 600; }
5118
+ .ds-247420 .ds-dash-header .btn, .ds-247420 .ds-dash-header .btn-primary { margin-left: auto; }
5119
+ .ds-247420 .ds-dash-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--space-3); padding: var(--space-4); }
5120
+ .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); }
5121
+ .ds-247420 .ds-dash-card.is-error { border-color: var(--flame); }
5122
+ .ds-247420 .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
5123
+ .ds-247420 .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
5124
+ .ds-247420 .ds-dash-status.is-running { color: var(--green); }
5125
+ .ds-247420 .ds-dash-status.is-error { color: var(--flame); }
5126
+ .ds-247420 .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
5127
+ .ds-247420 .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
5128
+ .ds-247420 .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
5129
+ .ds-247420 .ds-dash-cwd { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5130
+ .ds-247420 .ds-dash-stat { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
5131
+ .ds-247420 .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5132
+ .ds-247420 .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
5133
+ .ds-247420 .ds-dash-state { padding: var(--space-6) var(--space-4); text-align: center; color: var(--fg-3); font-size: var(--fs-body); }
5134
+ .ds-247420 .ds-dash-state-error { color: var(--flame); }
5135
+
5136
+ @media (max-width: 640px) {
5137
+ .ds-247420 .ds-dash-grid { grid-template-columns: 1fr; padding: var(--space-3); }
5138
+ }
5139
+
5140
+ /* ----------------------------------------------------------------------------
5141
+ ContextPane — compact right-hand context panel for the chat surface.
5142
+ ---------------------------------------------------------------------------- */
5143
+ .ds-247420 .ds-context { display: flex; flex-direction: column; gap: var(--space-3); padding: var(--space-3); }
5144
+ .ds-247420 .ds-context .panel { background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-2); }
5145
+ .ds-247420 .ds-context .row { font-size: var(--fs-sm); }
5146
+ .ds-247420 .ds-context .row .meta { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
5147
+ .ds-247420 .ds-context .row .sub { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5148
+ .ds-247420 .ds-context-actions { display: flex; gap: var(--space-2); }
5149
+
4820
5150
  /* editor-primitives.css */
4821
5151
  /* editor-primitives.css — chrome for in-engine editors, inspectors, IDEs,
4822
5152
  debug HUDs. All rules under .ds-247420 scope (build prefixes). Tokens