anentrypoint-design 0.0.199 → 0.0.201

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
@@ -1280,6 +1280,10 @@
1280
1280
  /* On mobile, fold meta under the title and keep actions inline. */
1281
1281
  .ds-247420 .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
1282
1282
  .ds-247420 .ds-file-row .ds-file-actions { opacity: 1; }
1283
+ /* H4: floor finger-sized controls so file actions/sort/filter/breadcrumb are
1284
+ reachable by touch (cohesion sweep). */
1285
+ .ds-247420 .ds-file-act, .ds-247420 .ds-file-sort-btn, .ds-247420 .ds-crumb-seg { min-height: 44px; }
1286
+ .ds-247420 .ds-file-filter-input { min-height: 44px; }
1283
1287
 
1284
1288
  /* Chat */
1285
1289
  .ds-247420 .chat-stack { max-width: 100%; min-width: 0; }
@@ -3159,6 +3163,13 @@
3159
3163
  .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
3164
  .ds-247420 .ws-shell.ws-no-pane.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr; grid-template-areas: "rail content"; }
3161
3165
  .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"; }
3166
+ /* G1 stable frame: when a tab has no pane but asks to keep the column geometry
3167
+ (ws-no-pane + ws-pane-collapsed), KEEP the 4-track grid with the pane track
3168
+ at width 0 instead of collapsing to a 3-track layout - so the shell does not
3169
+ re-flow its column count on tab switch. The pane track stays present (0px),
3170
+ so chat/history/files/live/settings share one geometry. */
3171
+ .ds-247420 .ws-shell.ws-no-pane.ws-pane-collapsed:not(.ws-no-sessions) { grid-template-columns: var(--ws-rail-w) var(--ws-sessions-w) 1fr var(--ws-pane-w); grid-template-areas: "rail sessions content pane"; }
3172
+ .ds-247420 .ws-shell.ws-no-pane.ws-pane-collapsed.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr var(--ws-pane-w); grid-template-areas: "rail content pane"; }
3162
3173
  .ds-247420 .ws-shell.ws-rail-collapsed { --ws-rail-w: var(--ws-rail-w-collapsed); }
3163
3174
  .ds-247420 .ws-shell.ws-pane-collapsed { --ws-pane-w: 0px; }
3164
3175
 
@@ -3289,6 +3300,48 @@
3289
3300
  .ds-247420 .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3290
3301
  .ds-247420 .ws-scrim { display: none; }
3291
3302
 
3303
+ /* ============================================================
3304
+ Row title highlight, expanded-row actions, filter pills.
3305
+ ============================================================ */
3306
+
3307
+ /* Highlighted match inside a Row title (Row `highlight` prop). */
3308
+ .ds-247420 .ds-hl { background: color-mix(in oklab, var(--accent) 25%, transparent); color: inherit; border-radius: 2px; }
3309
+
3310
+ /* Action strip rendered inside an EXPANDED Row (Row `actions` prop). The
3311
+ buttons stop propagation so they never fire the row onClick. */
3312
+ .ds-247420 .row-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); width: 100%; padding-top: var(--space-2); }
3313
+ .ds-247420 .row-act {
3314
+ display: inline-flex; align-items: center; justify-content: center;
3315
+ padding: 4px 10px; min-height: 28px;
3316
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1);
3317
+ color: var(--fg-2); font-family: var(--ff-body); font-size: var(--fs-tiny); cursor: pointer;
3318
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
3319
+ }
3320
+ .ds-247420 .row-act:hover { background: var(--bg-3); color: var(--fg); }
3321
+ .ds-247420 .row-act:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
3322
+
3323
+ /* FilterPills - a group of pill toggle buttons (aria-pressed). */
3324
+ .ds-247420 .ds-filter-pills { display: flex; flex-wrap: wrap; gap: var(--space-2); }
3325
+ .ds-247420 .ds-filter-pill {
3326
+ display: inline-flex; align-items: center; justify-content: center;
3327
+ padding: 4px 12px; min-height: 28px;
3328
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: 999px;
3329
+ color: var(--fg-2); font-family: var(--ff-body); font-size: var(--fs-tiny); cursor: pointer;
3330
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
3331
+ }
3332
+ .ds-247420 .ds-filter-pill:hover { background: var(--bg-3); color: var(--fg); }
3333
+ .ds-247420 .ds-filter-pill.active { background: var(--accent-tint); color: var(--accent); border-color: var(--accent); }
3334
+ .ds-247420 .ds-filter-pill:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
3335
+
3336
+ /* Touch floor for the new small controls. */
3337
+ @media (pointer: coarse) {
3338
+ .ds-247420 .row-act, .ds-247420 .ds-filter-pill { min-height: 44px; }
3339
+ }
3340
+
3341
+ /* Disabled file actions (read-only row / in-flight mutation) stay visible but inert. */
3342
+ .ds-247420 .ds-file-act:disabled { opacity: .45; cursor: default; }
3343
+ .ds-247420 .ds-file-act:disabled:hover { background: transparent; color: var(--fg-3); }
3344
+
3292
3345
  /* community.css */
3293
3346
  /* ============================================================
3294
3347
  247420 design system — community surface (Discord-style chat)
@@ -4967,10 +5020,12 @@
4967
5020
  .ds-247420 .chat-msg-actions { display: flex; gap: 2px; margin-top: 3px; opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease); }
4968
5021
  .ds-247420 .chat-msg:hover .chat-msg-actions, .ds-247420 .chat-msg:focus-within .chat-msg-actions { opacity: 1; }
4969
5022
  .ds-247420 .chat-msg-action {
4970
- display: inline-flex; align-items: center; justify-content: center;
4971
- width: 26px; height: 26px; padding: 0; cursor: pointer;
5023
+ display: inline-flex; align-items: center; justify-content: center; gap: 4px;
5024
+ min-width: 26px; height: 26px; padding: 0 6px; cursor: pointer;
4972
5025
  border: none; border-radius: var(--r-1, 4px); background: none; color: var(--fg-3);
5026
+ font-family: var(--ff-body); font-size: var(--fs-tiny);
4973
5027
  }
5028
+ .ds-247420 .chat-msg-action-label { font-size: var(--fs-tiny); }
4974
5029
  .ds-247420 .chat-msg-action:hover { background: var(--bg-2); color: var(--fg); }
4975
5030
  .ds-247420 .chat-msg-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
4976
5031
 
@@ -5008,6 +5063,50 @@
5008
5063
  .ds-247420 .agentchat-empty-suggestion:hover { background: color-mix(in srgb, var(--accent, var(--fg)) 12%, transparent); }
5009
5064
  .ds-247420 .agentchat-empty-suggestion:focus-visible { outline: 2px solid var(--accent, var(--fg)); outline-offset: 2px; }
5010
5065
 
5066
+ /* Guided install path in the empty state: copy line + monospaced command rows
5067
+ (each with its own copy button) + a recheck button. No animation. */
5068
+ .ds-247420 .agentchat-install {
5069
+ margin-top: var(--space-4, 16px);
5070
+ display: flex;
5071
+ flex-direction: column;
5072
+ gap: var(--space-2, 8px);
5073
+ text-align: left;
5074
+ width: 100%;
5075
+ }
5076
+ .ds-247420 .agentchat-install-text { margin: 0; font-size: .9em; color: var(--fg-3); }
5077
+ .ds-247420 .agentchat-install-list { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: var(--space-1, 4px); }
5078
+ .ds-247420 .agentchat-install-row {
5079
+ display: flex; align-items: center; gap: var(--space-2, 8px);
5080
+ padding: var(--space-1, 4px) var(--space-2, 8px);
5081
+ border: var(--bw-hair) solid var(--rule);
5082
+ border-radius: var(--r-1, 4px);
5083
+ background: var(--bg-2);
5084
+ }
5085
+ .ds-247420 .agentchat-install-agent { flex: 0 0 auto; font-size: var(--fs-tiny); color: var(--fg-3); min-width: 8ch; }
5086
+ .ds-247420 .agentchat-install-cmd {
5087
+ flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
5088
+ font-family: var(--ff-mono); font-size: var(--fs-sm); color: var(--fg-2, var(--fg));
5089
+ }
5090
+ .ds-247420 .agentchat-install-copy {
5091
+ flex: 0 0 auto; cursor: pointer; padding: 2px 8px; min-height: 24px;
5092
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
5093
+ background: none; color: var(--fg-3);
5094
+ font-family: var(--ff-body); font-size: var(--fs-tiny);
5095
+ }
5096
+ .ds-247420 .agentchat-install-copy:hover { background: var(--bg-3); color: var(--fg); }
5097
+ .ds-247420 .agentchat-install-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5098
+ .ds-247420 .agentchat-install-actions { display: flex; justify-content: flex-start; }
5099
+
5100
+ /* Host-supplied transcript export actions riding the controls row. */
5101
+ .ds-247420 .agentchat-export-act {
5102
+ cursor: pointer; padding: 4px 10px; min-height: 32px;
5103
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
5104
+ background: none; color: var(--fg-3);
5105
+ font-family: var(--ff-body); font-size: var(--fs-tiny);
5106
+ }
5107
+ .ds-247420 .agentchat-export-act:hover { background: var(--bg-2); color: var(--fg); }
5108
+ .ds-247420 .agentchat-export-act:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5109
+
5011
5110
  /* "working" tail: a long silent tool call shouldn't read as frozen. */
5012
5111
  .ds-247420 .agentchat-working {
5013
5112
  display: flex;
@@ -5052,12 +5151,27 @@
5052
5151
  Global status disc — a CSS-drawn status indicator (no text glyph) usable
5053
5152
  outside .agentchat-status (session rows, dashboard cards). Tone via modifier.
5054
5153
  ---------------------------------------------------------------------------- */
5154
+ /* Single canonical status disc — one source for live/error/connecting/stale
5155
+ everywhere (crumb dot, conversation row, dashboard card, composer status).
5156
+ The app's index.html disc/pulse override is deleted in favour of this. Only
5157
+ the -live disc pulses; -stale is deliberately static (a stuck session must NOT
5158
+ read as busy). Pulse colour is derived from --accent via color-mix so it
5159
+ tracks the theme instead of a hardcoded rgba. */
5055
5160
  .ds-247420 .status-dot-disc {
5056
5161
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
5057
5162
  background: var(--fg-3); flex: 0 0 auto;
5058
5163
  }
5059
- .ds-247420 .status-dot-disc.status-dot-live { background: var(--green); }
5164
+ .ds-247420 .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
5060
5165
  .ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); }
5166
+ .ds-247420 .status-dot-disc.status-dot-connecting { background: var(--amber, #d9a93a); }
5167
+ .ds-247420 .status-dot-disc.status-dot-stale { background: var(--amber, #d9a93a); }
5168
+ @keyframes status-disc-pulse {
5169
+ 0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
5170
+ 50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
5171
+ }
5172
+ @media (prefers-reduced-motion: reduce) {
5173
+ .ds-247420 .status-dot-disc.status-dot-live { animation: none; }
5174
+ }
5061
5175
 
5062
5176
  /* ----------------------------------------------------------------------------
5063
5177
  ConversationList — left-rail "Chats" column.
@@ -5097,8 +5211,10 @@
5097
5211
  .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
5212
  content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: 3px;
5099
5213
  }
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)); }
5214
+ /* Rail tones MUST match .row.rail-* in app-shell.css so the same semantic state
5215
+ reads as one colour across the conversation list and content rows. */
5216
+ .ds-247420 .ds-session-row.rail-green::before { background: var(--accent); }
5217
+ .ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2, #7F18A4); }
5102
5218
  .ds-247420 .ds-session-row.rail-flame::before { background: var(--flame); }
5103
5219
  .ds-247420 .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
5104
5220
  .ds-247420 .ds-session-title { font-size: var(--fs-sm); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@@ -5147,6 +5263,158 @@
5147
5263
  .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
5264
  .ds-247420 .ds-context-actions { display: flex; gap: var(--space-2); }
5149
5265
 
5266
+ /* ============================================================================
5267
+ Cohesion sweep (gui-cohesion.js): one-product polish across surfaces.
5268
+ ============================================================================ */
5269
+
5270
+ /* --- A1/A2/E3: per-block code copy. The <pre> is wrapped in .chat-code-block
5271
+ (position:relative) so the copy button sits top-right and reveals on hover/
5272
+ focus-within, matching the .chat-msg-actions pattern. The structured CodeNode
5273
+ head + preview head place the button inline (always visible). --- */
5274
+ .ds-247420 .chat-code-block { position: relative; }
5275
+ .ds-247420 .chat-code-copy {
5276
+ position: absolute; top: 6px; right: 6px;
5277
+ display: inline-flex; align-items: center; justify-content: center;
5278
+ min-width: 48px; min-height: 24px; padding: 2px 8px;
5279
+ border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
5280
+ background: var(--bg-2); color: var(--fg-2); cursor: pointer;
5281
+ font-family: var(--ff-body); font-size: var(--fs-tiny);
5282
+ opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease);
5283
+ }
5284
+ .ds-247420 .chat-code-block:hover .chat-code-copy, .ds-247420 .chat-code-block:focus-within .chat-code-copy { opacity: 1; }
5285
+ .ds-247420 .chat-code-copy.is-copied { color: var(--accent); border-color: var(--accent); }
5286
+ .ds-247420 .chat-code-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
5287
+ /* Head-placed copy (structured CodeNode + FilePreviewCode) is always visible. */
5288
+ .ds-247420 .chat-code-head .spread { flex: 1; }
5289
+ .ds-247420 .chat-code-copy-head { position: static; opacity: 1; }
5290
+
5291
+ /* --- B1: streaming pre shell — monospaced bubble while a fenced block streams,
5292
+ so it does not reflow prose->block on settle. --- */
5293
+ .ds-247420 .chat-stream-pre pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: var(--ff-mono); font-size: var(--fs-sm); }
5294
+
5295
+ /* --- A5: composer context line (agent / model / cwd at point of typing). --- */
5296
+ .ds-247420 .chat-composer-context {
5297
+ display: block; width: 100%; text-align: left; padding: 4px var(--space-3) 0;
5298
+ background: none; border: none; cursor: default; color: var(--fg-3);
5299
+ font-family: var(--ff-mono); font-size: var(--fs-tiny);
5300
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
5301
+ }
5302
+ .ds-247420 button.chat-composer-context { cursor: pointer; }
5303
+ .ds-247420 button.chat-composer-context:hover { color: var(--fg-2); }
5304
+ .ds-247420 button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5305
+
5306
+ /* --- B2: follow-up chips below the last settled assistant turn. --- */
5307
+ .ds-247420 .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
5308
+
5309
+ /* --- C1: stale/idle dashboard status (static, NOT pulsing). --- */
5310
+ .ds-247420 .ds-dash-status.is-stale { color: var(--amber, #d9a93a); }
5311
+ .ds-247420 .ds-dash-status.is-running { color: var(--accent); }
5312
+
5313
+ /* --- C2: dashboard sort/filter toolbar + stream-state line. --- */
5314
+ .ds-247420 .ds-dash-toolbar { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
5315
+ .ds-247420 .ds-dash-stream { font-size: var(--fs-tiny); color: var(--fg-3); }
5316
+ .ds-247420 .ds-dash-stream.is-lost { color: var(--flame); }
5317
+ .ds-247420 .ds-dash-stream.is-connecting { color: var(--amber, #d9a93a); }
5318
+ .ds-247420 .ds-dash-header .spread { flex: 1; }
5319
+ .ds-247420 .ds-dash-errors-toggle {
5320
+ padding: 4px 10px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
5321
+ border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2);
5322
+ cursor: pointer; font-family: var(--ff-body); font-size: var(--fs-tiny);
5323
+ }
5324
+ .ds-247420 .ds-dash-errors-toggle.active { background: var(--accent-tint); color: var(--accent); border-color: var(--accent); }
5325
+ .ds-247420 .ds-dash-errors-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5326
+
5327
+ /* --- C3: per-card select checkbox. --- */
5328
+ .ds-247420 .ds-dash-select {
5329
+ display: inline-flex; align-items: center; justify-content: center;
5330
+ min-width: 24px; min-height: 24px; padding: 0; cursor: pointer;
5331
+ border: none; background: none; color: var(--fg-3);
5332
+ font-family: var(--ff-mono); font-size: var(--fs-sm);
5333
+ }
5334
+ .ds-247420 .ds-dash-select[aria-checked="true"] { color: var(--accent); }
5335
+ .ds-247420 .ds-dash-select:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5336
+
5337
+ /* --- C5: active dashboard card (current conversation). --- */
5338
+ .ds-247420 .ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
5339
+ .ds-247420 .ds-dash-card.is-selected { background: var(--accent-tint); }
5340
+ .ds-247420 .ds-dash-card.is-stale { opacity: .92; }
5341
+
5342
+ /* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
5343
+
5344
+ /* --- C6: per-tab conversation-list caption. --- */
5345
+ .ds-247420 .ds-session-caption { padding: var(--space-2) var(--space-3) 0; font-size: var(--fs-tiny); color: var(--fg-3); }
5346
+
5347
+ /* --- F1: context-pane empty state. --- */
5348
+ .ds-247420 .ds-context-empty { padding: var(--space-4) var(--space-3); color: var(--fg-3); font-size: var(--fs-sm); line-height: 1.5; }
5349
+
5350
+ /* --- E1: inline file preview pane (split view, non-modal). --- */
5351
+ .ds-247420 .ds-preview-pane { display: flex; flex-direction: column; min-height: 0; height: 100%; overflow: hidden; }
5352
+ .ds-247420 .ds-preview-pane:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
5353
+ .ds-247420 .ds-preview-pane .ds-preview-body { flex: 1; min-height: 0; overflow: auto; }
5354
+ .ds-247420 .ds-preview-pane-empty { align-items: center; justify-content: center; color: var(--fg-3); font-size: var(--fs-sm); }
5355
+ .ds-247420 .ds-preview-code-wrap { display: flex; flex-direction: column; min-height: 0; }
5356
+ .ds-247420 .ds-preview-code-head { flex: 0 0 auto; }
5357
+ /* --- E2: prev/next stepper in preview head. --- */
5358
+ .ds-247420 .ds-preview-step { display: inline-flex; gap: 2px; }
5359
+ .ds-247420 .ds-preview-step .ds-file-act { min-width: 40px; padding: 0 6px; font-family: var(--ff-body); font-size: var(--fs-tiny); }
5360
+
5361
+ /* --- D1: file grid "show more" row. --- */
5362
+ .ds-247420 .ds-file-more { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3); justify-content: center; }
5363
+ .ds-247420 .ds-file-more-count { font-size: var(--fs-tiny); color: var(--fg-3); }
5364
+ .ds-247420 .ds-file-more-btn {
5365
+ padding: 4px 12px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
5366
+ border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2); cursor: pointer;
5367
+ font-family: var(--ff-body); font-size: var(--fs-tiny);
5368
+ }
5369
+ .ds-247420 .ds-file-more-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5370
+ /* --- D3: locked/no-access file row. --- */
5371
+ .ds-247420 .ds-file-row.is-locked { opacity: .6; }
5372
+
5373
+ /* --- D4: roots picker segmented control. --- */
5374
+ .ds-247420 .ds-roots-picker { display: inline-flex; gap: 2px; padding: 2px; background: var(--bg-2); border-radius: var(--r-1); }
5375
+ .ds-247420 .ds-roots-tab {
5376
+ padding: 4px 10px; min-height: 32px; border: none; border-radius: var(--r-1);
5377
+ background: none; color: var(--fg-3); cursor: pointer;
5378
+ font-family: var(--ff-body); font-size: var(--fs-tiny);
5379
+ }
5380
+ .ds-247420 .ds-roots-tab.active { background: var(--bg); color: var(--fg); }
5381
+ .ds-247420 .ds-roots-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5382
+
5383
+ /* --- H4: touch targets. On a coarse pointer / narrow screen the hover-revealed
5384
+ action rows are made permanently visible and small controls floor to 44px so
5385
+ they are reachable by finger. --- */
5386
+ @media (pointer: coarse), (max-width: 640px) {
5387
+ .ds-247420 .chat-msg-actions { opacity: 1; }
5388
+ .ds-247420 .chat-code-copy { opacity: 1; }
5389
+ .ds-247420 .chat-msg-action { min-width: 44px; height: 44px; }
5390
+ .ds-247420 .ds-dash-select { min-width: 44px; min-height: 44px; }
5391
+ .ds-247420 .ds-file-more-btn, .ds-247420 .ds-roots-tab, .ds-247420 .ds-dash-errors-toggle { min-height: 44px; }
5392
+ .ds-247420 .agentchat-export-act { min-height: 44px; }
5393
+ .ds-247420 .agentchat-install-copy { min-height: 44px; min-width: 44px; }
5394
+ }
5395
+
5396
+ /* --- SessionMeta: middot-separated session metadata strip. Class is
5397
+ .ds-session-meta-strip (.ds-session-meta is taken by ConversationList row
5398
+ meta above). Wraps at narrow widths. --- */
5399
+ .ds-247420 .ds-session-meta-strip {
5400
+ display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2);
5401
+ font-size: var(--fs-tiny); color: var(--fg-3);
5402
+ }
5403
+ .ds-247420 .ds-session-meta-item { display: inline-flex; align-items: center; gap: var(--space-1); min-width: 0; }
5404
+ .ds-247420 .ds-session-meta-item + .ds-session-meta-item::before { content: '\00B7'; color: var(--fg-3); margin-right: var(--space-1); }
5405
+ .ds-247420 .ds-session-meta-label { color: var(--fg-3); }
5406
+ .ds-247420 .ds-session-meta-value { font-family: var(--ff-mono); color: var(--fg-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
5407
+ .ds-247420 .ds-session-meta-copy {
5408
+ padding: 2px 8px; min-height: 24px; cursor: pointer;
5409
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1);
5410
+ color: var(--fg-3); font-family: var(--ff-body); font-size: var(--fs-micro);
5411
+ }
5412
+ .ds-247420 .ds-session-meta-copy:hover { background: var(--bg-3); color: var(--fg); }
5413
+ .ds-247420 .ds-session-meta-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5414
+ @media (pointer: coarse), (max-width: 640px) {
5415
+ .ds-247420 .ds-session-meta-copy { min-height: 44px; min-width: 44px; }
5416
+ }
5417
+
5150
5418
  /* editor-primitives.css */
5151
5419
  /* editor-primitives.css — chrome for in-engine editors, inspectors, IDEs,
5152
5420
  debug HUDs. All rules under .ds-247420 scope (build prefixes). Tokens