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/app-shell.css CHANGED
@@ -245,9 +245,14 @@ body.canvas-host { background: transparent !important; }
245
245
  outline: 2px solid var(--accent);
246
246
  outline-offset: 2px;
247
247
  }
248
+ /* Active tab reads as a subtle tinted pill with an accent underline rather than
249
+ an oversized filled oval that sits taller than its inactive siblings and reads
250
+ as misaligned. Same height as the inactive links — only the tint + underline
251
+ change. */
248
252
  .app-topbar nav a.active {
249
- color: var(--accent-fg);
250
- background: var(--accent);
253
+ color: var(--accent);
254
+ background: color-mix(in oklab, var(--accent) 16%, transparent);
255
+ box-shadow: inset 0 -2px 0 0 var(--accent);
251
256
  font-weight: 600;
252
257
  }
253
258
 
@@ -540,6 +545,9 @@ body.canvas-host { background: transparent !important; }
540
545
  background: transparent; border-radius: 3px;
541
546
  transition: background var(--dur-snap) var(--ease);
542
547
  }
548
+ /* A clickable row (onClick -> role=button, or a link row) is interactive, so it
549
+ carries a pointer cursor; without this the click affordance is invisible. */
550
+ .row[role="button"], a.row { cursor: pointer; }
543
551
  .row:hover { background: var(--bg-2); }
544
552
  .row:hover::before { background: var(--rule-strong); }
545
553
  .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
@@ -588,6 +596,9 @@ a.row { text-decoration: none; }
588
596
  Section grouping
589
597
  ============================================================ */
590
598
  .ds-section { margin: var(--space-8) 0; }
599
+ /* Compact section (e.g. a PageHeader used as a page's first element): no large
600
+ leading margin, modest trailing margin — top-aligns without consumer overrides. */
601
+ .ds-section-compact { margin-top: 0; margin-bottom: var(--space-4); }
591
602
  .ds-section > h3 {
592
603
  font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
593
604
  margin: 0 0 var(--space-5);
@@ -1060,6 +1071,39 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1060
1071
  flex-direction: column;
1061
1072
  gap: 4px;
1062
1073
  }
1074
+ .ds-file-grid:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-2); }
1075
+
1076
+ /* Listing wrapper holds the optional filter + sort header above the grid. */
1077
+ .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
1078
+ .ds-file-filter { padding: 0 0 var(--space-1); }
1079
+ .ds-file-filter-input {
1080
+ width: 100%; padding: 8px 12px; font-size: var(--fs-sm);
1081
+ background: var(--bg); color: var(--fg);
1082
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1083
+ }
1084
+ .ds-file-filter-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1085
+ .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
1086
+ .ds-file-sort-btn {
1087
+ font-size: var(--fs-tiny); font-family: var(--ff-mono); color: var(--fg-3);
1088
+ background: none; border: none; cursor: pointer; padding: 2px 4px; border-radius: var(--r-1);
1089
+ }
1090
+ .ds-file-sort-btn:hover { color: var(--fg-2); background: var(--bg-2); }
1091
+ .ds-file-sort-btn.active { color: var(--accent); }
1092
+ .ds-file-sort-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1093
+
1094
+ /* Skeleton shimmer rows shown while a directory loads. */
1095
+ .ds-file-row-skeleton { cursor: default; pointer-events: none; }
1096
+ .ds-skel { display: inline-block; border-radius: var(--r-1); background: var(--bg-2); position: relative; overflow: hidden; }
1097
+ .ds-skel::after {
1098
+ content: ''; position: absolute; inset: 0;
1099
+ background: linear-gradient(90deg, transparent, var(--bg-3), transparent);
1100
+ transform: translateX(-100%); animation: ds-skel-shimmer 1.2s infinite;
1101
+ }
1102
+ .ds-skel-icon { width: 22px; height: 22px; }
1103
+ .ds-skel-title { height: 12px; width: 60%; }
1104
+ .ds-skel-meta { height: 10px; width: 64px; margin-left: auto; }
1105
+ @keyframes ds-skel-shimmer { 100% { transform: translateX(100%); } }
1106
+ @media (prefers-reduced-motion: reduce) { .ds-skel::after { animation: none; } }
1063
1107
 
1064
1108
  /* File row — linear layout (icon · title · meta · actions) */
1065
1109
  .ds-file-row {
@@ -2700,3 +2744,155 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2700
2744
  .app-topbar > :last-child { display: none; }
2701
2745
  .brand { font-size: var(--fs-tiny); }
2702
2746
  }
2747
+
2748
+ /* ----------------------------------------------------------------------------
2749
+ WorkspaceShell — Claude-Desktop / cowork three-column app shell.
2750
+ Columns: [ws-rail] [ws-sessions?] [ws-content] [ws-pane?]
2751
+ Collapse via .ws-rail-collapsed / .ws-pane-collapsed classes on .ws-shell.
2752
+ All sizing/colour from kit tokens; no hardcoded palette.
2753
+ ---------------------------------------------------------------------------- */
2754
+ .ws-shell {
2755
+ --ws-rail-w: 232px;
2756
+ --ws-rail-w-collapsed: 60px;
2757
+ --ws-sessions-w: 296px;
2758
+ --ws-pane-w: 320px;
2759
+ display: grid;
2760
+ grid-template-columns: var(--ws-rail-w) var(--ws-sessions-w) 1fr var(--ws-pane-w);
2761
+ grid-template-areas: "rail sessions content pane";
2762
+ height: 100%;
2763
+ min-height: 0;
2764
+ background: var(--bg);
2765
+ color: var(--fg);
2766
+ }
2767
+ .ws-shell.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr var(--ws-pane-w); grid-template-areas: "rail content pane"; }
2768
+ .ws-shell.ws-no-pane.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr; grid-template-areas: "rail content"; }
2769
+ .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"; }
2770
+ .ws-shell.ws-rail-collapsed { --ws-rail-w: var(--ws-rail-w-collapsed); }
2771
+ .ws-shell.ws-pane-collapsed { --ws-pane-w: 0px; }
2772
+
2773
+ /* Rail (left nav) */
2774
+ .ws-rail {
2775
+ grid-area: rail;
2776
+ position: relative;
2777
+ display: flex;
2778
+ flex-direction: column;
2779
+ min-height: 0;
2780
+ background: var(--bg-2);
2781
+ border-right: var(--bw-hair) solid var(--bg-3);
2782
+ overflow: hidden;
2783
+ transition: width var(--dur-base) var(--ease);
2784
+ }
2785
+ .ws-rail-toggle {
2786
+ position: absolute; top: var(--space-2); right: var(--space-2);
2787
+ width: 36px; height: 36px;
2788
+ display: inline-flex; align-items: center; justify-content: center;
2789
+ background: transparent; border: none; color: var(--fg-2);
2790
+ border-radius: var(--r-1); cursor: pointer;
2791
+ }
2792
+ .ws-rail-toggle:hover { background: var(--bg-3); color: var(--fg); }
2793
+ .ws-rail-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2794
+ .ws-rail-inner { display: flex; flex-direction: column; min-height: 0; flex: 1; padding: var(--space-3) var(--space-2); gap: var(--space-2); }
2795
+ .ws-rail-head { display: flex; align-items: center; min-height: 36px; padding: 0 var(--space-2); }
2796
+ .ws-rail-brand { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-body); color: var(--fg); white-space: nowrap; overflow: hidden; }
2797
+ .ws-rail-action {
2798
+ display: flex; align-items: center; gap: var(--space-2);
2799
+ padding: var(--space-2) var(--space-3); margin: var(--space-1) 0;
2800
+ background: var(--accent); color: var(--accent-fg, var(--bg));
2801
+ border: none; border-radius: var(--r-1); cursor: pointer;
2802
+ font-family: var(--ff-body); font-size: var(--fs-sm); font-weight: 600;
2803
+ min-height: 40px; white-space: nowrap; overflow: hidden;
2804
+ }
2805
+ .ws-rail-action:hover { filter: brightness(1.08); }
2806
+ .ws-rail-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2807
+ .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; }
2808
+ .ws-rail-item {
2809
+ display: flex; align-items: center; gap: var(--space-2);
2810
+ width: 100%; padding: var(--space-2); min-height: 44px;
2811
+ background: transparent; border: none; color: var(--fg-2);
2812
+ border-radius: var(--r-1); cursor: pointer; text-align: left;
2813
+ font-family: var(--ff-body); font-size: var(--fs-sm); white-space: nowrap; overflow: hidden;
2814
+ }
2815
+ .ws-rail-item:hover { background: var(--bg-3); color: var(--fg); }
2816
+ .ws-rail-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
2817
+ .ws-rail-item.active { background: var(--accent-tint); color: var(--fg); box-shadow: inset 2px 0 0 var(--accent); }
2818
+ .ws-rail-item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; }
2819
+ .ws-rail-item-count { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
2820
+ .ws-rail-foot { margin-top: auto; padding-top: var(--space-2); border-top: var(--bw-hair) solid var(--bg-3); }
2821
+
2822
+ /* Collapsed rail: icon-only — hide text labels, center icons, drop toggle's far-right pin */
2823
+ .ws-rail-collapsed .ws-rail-brand,
2824
+ .ws-rail-collapsed .ws-rail-action-label,
2825
+ .ws-rail-collapsed .ws-rail-item-label,
2826
+ .ws-rail-collapsed .ws-rail-item-count { display: none; }
2827
+ .ws-rail-collapsed .ws-rail-item,
2828
+ .ws-rail-collapsed .ws-rail-action { justify-content: center; gap: 0; }
2829
+ .ws-rail-collapsed .ws-rail-head { justify-content: center; }
2830
+
2831
+ /* Sessions column */
2832
+ .ws-sessions {
2833
+ grid-area: sessions;
2834
+ min-height: 0; display: flex; flex-direction: column;
2835
+ background: var(--bg); border-right: var(--bw-hair) solid var(--bg-3);
2836
+ overflow: hidden;
2837
+ }
2838
+ .ws-no-sessions .ws-sessions { display: none; }
2839
+
2840
+ /* Content column */
2841
+ .ws-content { grid-area: content; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
2842
+ .ws-crumb { flex: 0 0 auto; display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
2843
+ .ws-crumb-main { flex: 1 1 auto; min-width: 0; }
2844
+ .ws-main { flex: 1; min-height: 0; overflow: auto; display: flex; flex-direction: column; }
2845
+ .ws-main:focus { outline: none; }
2846
+
2847
+ /* Right context pane */
2848
+ .ws-pane {
2849
+ grid-area: pane; position: relative;
2850
+ min-height: 0; display: flex; flex-direction: column;
2851
+ background: var(--bg-2); border-left: var(--bw-hair) solid var(--bg-3);
2852
+ overflow: hidden; transition: width var(--dur-base) var(--ease);
2853
+ }
2854
+ .ws-pane-collapsed .ws-pane { width: 0; border-left: none; }
2855
+ .ws-pane-collapsed .ws-pane > :not(.ws-pane-toggle) { display: none; }
2856
+ .ws-pane-toggle {
2857
+ position: absolute; top: var(--space-2); left: calc(-1 * var(--space-5));
2858
+ width: 28px; height: 28px;
2859
+ display: inline-flex; align-items: center; justify-content: center;
2860
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg-2);
2861
+ border-radius: var(--r-1); cursor: pointer; z-index: 2;
2862
+ }
2863
+ .ws-pane-toggle:hover { background: var(--bg-3); color: var(--fg); }
2864
+ .ws-pane-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2865
+
2866
+ /* Responsive: below 900px collapse to a single content column; rail+sessions+pane
2867
+ become overlay drawers the host can toggle, or simply hide on mobile. We keep it
2868
+ honest: stack rail (icon row) over content, hide sessions+pane unless toggled. */
2869
+ @media (max-width: 900px) {
2870
+ .ws-shell,
2871
+ .ws-shell.ws-no-sessions,
2872
+ .ws-shell.ws-no-pane,
2873
+ .ws-shell.ws-no-pane.ws-no-sessions {
2874
+ grid-template-columns: 1fr;
2875
+ grid-template-areas: "content";
2876
+ }
2877
+ .ws-rail { position: fixed; inset: 0 auto 0 0; width: var(--ws-rail-w-collapsed); z-index: 40; }
2878
+ .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); }
2879
+ .ws-shell.ws-sessions-open .ws-sessions { transform: translateX(0); }
2880
+ /* On mobile the pane is a drawer driven by .ws-pane-open (an explicit open
2881
+ intent), NOT by :not(.ws-pane-collapsed) - the desktop collapse default is
2882
+ "open" which would otherwise pop the pane over the thread on every load. */
2883
+ .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); }
2884
+ .ws-shell.ws-pane-open .ws-pane { transform: translateX(0); }
2885
+ .ws-content { grid-area: content; padding-left: var(--ws-rail-w-collapsed); }
2886
+ .ws-rail-collapsed .ws-rail-item-label, .ws-rail-collapsed .ws-rail-brand { display: none; }
2887
+ /* Tap-scrim behind an open drawer; dismiss on click. Hidden unless a drawer
2888
+ is open so it never blocks the content area on desktop. */
2889
+ .ws-scrim { display: none; position: fixed; inset: 0; z-index: 41; background: color-mix(in srgb, var(--fg) 38%, transparent); }
2890
+ .ws-shell.ws-sessions-open .ws-scrim, .ws-shell.ws-pane-open .ws-scrim { display: block; }
2891
+ /* The mobile drawer-toggle affordances live in the crumb bar. */
2892
+ .ws-drawer-toggle { display: inline-flex; }
2893
+ }
2894
+ /* Drawer toggles are mobile-only chrome; hidden on the desktop grid. */
2895
+ .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); }
2896
+ .ws-drawer-toggle:hover { background: var(--bg-2); color: var(--fg); }
2897
+ .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2898
+ .ws-scrim { display: none; }
package/chat.css CHANGED
@@ -110,6 +110,8 @@
110
110
  }
111
111
  .agentchat-title { font-size: 1em; margin: 0; }
112
112
  .agentchat-sub { font-size: .85em; color: var(--fg-3); }
113
+ /* Thread wrapper hosts the absolutely-positioned jump-to-latest button. */
114
+ .agentchat-thread-wrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
113
115
  .agentchat-thread {
114
116
  flex: 1;
115
117
  min-height: 0;
@@ -119,6 +121,39 @@
119
121
  gap: var(--space-2, 8px);
120
122
  }
121
123
 
124
+ /* Jump-to-latest: hidden until the thread scroll listener adds .show. */
125
+ .agentchat-jump {
126
+ position: absolute; right: 16px; bottom: 12px; z-index: 3;
127
+ display: none; align-items: center; gap: .35em;
128
+ padding: .4em .8em; font: inherit; font-size: .8em; cursor: pointer;
129
+ border-radius: 999px; border: var(--bw-hair) solid var(--rule);
130
+ background: var(--bg-2); color: var(--fg-2, var(--fg));
131
+ box-shadow: 0 2px 8px color-mix(in srgb, var(--fg) 14%, transparent);
132
+ }
133
+ .agentchat-jump.show { display: inline-flex; }
134
+ .agentchat-jump:hover { background: var(--bg-3); }
135
+ .agentchat-jump:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
136
+
137
+ /* Streaming caret: a thin blinking bar at the live edge of an assistant turn. */
138
+ .chat-stream-caret {
139
+ display: inline-block; width: 2px; height: 1.05em; margin-left: 1px;
140
+ vertical-align: text-bottom; background: var(--accent, var(--fg));
141
+ animation: chat-caret-blink 1s step-end infinite;
142
+ }
143
+ @keyframes chat-caret-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }
144
+ @media (prefers-reduced-motion: reduce) { .chat-stream-caret { animation: none; opacity: .8; } }
145
+
146
+ /* Per-message hover-revealed action row (copy / retry / edit). */
147
+ .chat-msg-actions { display: flex; gap: 2px; margin-top: 3px; opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease); }
148
+ .chat-msg:hover .chat-msg-actions, .chat-msg:focus-within .chat-msg-actions { opacity: 1; }
149
+ .chat-msg-action {
150
+ display: inline-flex; align-items: center; justify-content: center;
151
+ width: 26px; height: 26px; padding: 0; cursor: pointer;
152
+ border: none; border-radius: var(--r-1, 4px); background: none; color: var(--fg-3);
153
+ }
154
+ .chat-msg-action:hover { background: var(--bg-2); color: var(--fg); }
155
+ .chat-msg-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
156
+
122
157
  /* Empty state: a fresh thread is an invitation, not a void. */
123
158
  .agentchat-empty {
124
159
  margin: auto;
@@ -192,3 +227,102 @@
192
227
  .agentchat-cwd-text { max-width: 42vw; }
193
228
  .agentchat-controls { gap: .4em; }
194
229
  }
230
+
231
+ /* ----------------------------------------------------------------------------
232
+ Global status disc — a CSS-drawn status indicator (no text glyph) usable
233
+ outside .agentchat-status (session rows, dashboard cards). Tone via modifier.
234
+ ---------------------------------------------------------------------------- */
235
+ .status-dot-disc {
236
+ display: inline-block; width: 8px; height: 8px; border-radius: 50%;
237
+ background: var(--fg-3); flex: 0 0 auto;
238
+ }
239
+ .status-dot-disc.status-dot-live { background: var(--green); }
240
+ .status-dot-disc.status-dot-error { background: var(--flame); }
241
+
242
+ /* ----------------------------------------------------------------------------
243
+ ConversationList — left-rail "Chats" column.
244
+ ---------------------------------------------------------------------------- */
245
+ .ds-sessions { display: flex; flex-direction: column; min-height: 0; height: 100%; }
246
+ .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); }
247
+ .ds-session-new {
248
+ display: flex; align-items: center; gap: var(--space-2); justify-content: center;
249
+ padding: var(--space-2) var(--space-3); min-height: 44px;
250
+ background: var(--accent); color: var(--accent-fg, var(--bg)); border: none;
251
+ border-radius: var(--r-1); cursor: pointer; font-family: var(--ff-body);
252
+ font-size: var(--fs-sm); font-weight: 600;
253
+ }
254
+ .ds-session-new:hover { filter: brightness(1.08); }
255
+ .ds-session-new:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
256
+ .ds-session-search {
257
+ width: 100%; padding: var(--space-2) var(--space-3); min-height: 44px;
258
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg);
259
+ border-radius: var(--r-1); font-family: var(--ff-body); font-size: var(--fs-sm);
260
+ }
261
+ .ds-session-search:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
262
+ .ds-session-list, .ds-session-groups { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-2); }
263
+ /* Grouped rows (Today/Yesterday/...) lay out like the flat list; the section
264
+ label sticks to the top of the scroll area for Claude-Desktop-style headers. */
265
+ .ds-session-group { display: flex; flex-direction: column; }
266
+ .ds-session-group-rows { display: flex; flex-direction: column; gap: 2px; }
267
+ .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); }
268
+ .ds-session-row {
269
+ position: relative; display: flex; align-items: center; gap: var(--space-2);
270
+ width: 100%; padding: var(--space-2); min-height: 52px; margin-bottom: 2px;
271
+ background: transparent; border: none; border-radius: var(--r-1);
272
+ cursor: pointer; text-align: left; color: var(--fg);
273
+ }
274
+ .ds-session-row:hover { background: var(--bg-2); }
275
+ .ds-session-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
276
+ .ds-session-row.active { background: var(--accent-tint); box-shadow: inset 2px 0 0 var(--accent); }
277
+ .ds-session-row.rail-green::before, .ds-session-row.rail-purple::before, .ds-session-row.rail-flame::before {
278
+ content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: 3px;
279
+ }
280
+ .ds-session-row.rail-green::before { background: var(--green); }
281
+ .ds-session-row.rail-purple::before { background: var(--purple, var(--accent)); }
282
+ .ds-session-row.rail-flame::before { background: var(--flame); }
283
+ .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
284
+ .ds-session-title { font-size: var(--fs-sm); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
285
+ .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
286
+ .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
287
+ .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
288
+ .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); display: inline-block; }
289
+ .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
290
+ .ds-session-state-error { color: var(--flame); }
291
+
292
+ /* ----------------------------------------------------------------------------
293
+ SessionDashboard — grid of live-session cards.
294
+ ---------------------------------------------------------------------------- */
295
+ .ds-dash { display: flex; flex-direction: column; min-height: 0; }
296
+ .ds-dash-header { flex: 0 0 auto; display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4) 0; }
297
+ .ds-dash-count { font-size: var(--fs-sm); color: var(--fg-2); font-weight: 600; }
298
+ .ds-dash-header .btn, .ds-dash-header .btn-primary { margin-left: auto; }
299
+ .ds-dash-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--space-3); padding: var(--space-4); }
300
+ .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); }
301
+ .ds-dash-card.is-error { border-color: var(--flame); }
302
+ .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
303
+ .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
304
+ .ds-dash-status.is-running { color: var(--green); }
305
+ .ds-dash-status.is-error { color: var(--flame); }
306
+ .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
307
+ .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
308
+ .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
309
+ .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; }
310
+ .ds-dash-stat { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
311
+ .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
312
+ .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
313
+ .ds-dash-state { padding: var(--space-6) var(--space-4); text-align: center; color: var(--fg-3); font-size: var(--fs-body); }
314
+ .ds-dash-state-error { color: var(--flame); }
315
+
316
+ @media (max-width: 640px) {
317
+ .ds-dash-grid { grid-template-columns: 1fr; padding: var(--space-3); }
318
+ }
319
+
320
+ /* ----------------------------------------------------------------------------
321
+ ContextPane — compact right-hand context panel for the chat surface.
322
+ ---------------------------------------------------------------------------- */
323
+ .ds-context { display: flex; flex-direction: column; gap: var(--space-3); padding: var(--space-3); }
324
+ .ds-context .panel { background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-2); }
325
+ .ds-context .row { font-size: var(--fs-sm); }
326
+ .ds-context .row .meta { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
327
+ .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; }
328
+ .ds-context-actions { display: flex; gap: var(--space-2); }