anentrypoint-design 0.0.240 → 0.0.242

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/chat.css CHANGED
@@ -144,13 +144,13 @@
144
144
  position: absolute; right: 16px; bottom: 12px; z-index: 3;
145
145
  display: none; align-items: center; gap: .35em;
146
146
  padding: .4em .8em; font: inherit; font-size: var(--fs-tiny); cursor: pointer;
147
- border-radius: 999px; border: var(--bw-hair) solid var(--rule);
147
+ border-radius: var(--r-pill); border: var(--bw-hair) solid var(--rule);
148
148
  background: var(--bg-2); color: var(--fg-2, var(--fg));
149
149
  box-shadow: 0 2px 8px color-mix(in srgb, var(--fg) 14%, transparent);
150
150
  }
151
151
  .agentchat-jump.show { display: inline-flex; }
152
152
  .agentchat-jump:hover { background: var(--bg-3); }
153
- .agentchat-jump:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
153
+ .agentchat-jump:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
154
154
 
155
155
  /* Streaming caret: a thin blinking bar at the live edge of an assistant turn. */
156
156
  .chat-stream-caret {
@@ -172,7 +172,7 @@
172
172
  }
173
173
  .chat-msg-action-label { font-size: var(--fs-tiny); }
174
174
  .chat-msg-action:hover { background: var(--bg-2); color: var(--fg); }
175
- .chat-msg-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
175
+ .chat-msg-action:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; opacity: 1; }
176
176
 
177
177
  /* Empty state: a fresh thread is an invitation, not a void. */
178
178
  .agentchat-empty {
@@ -200,7 +200,7 @@
200
200
  font: inherit;
201
201
  font-size: var(--fs-tiny);
202
202
  padding: .4em .8em;
203
- border-radius: 999px;
203
+ border-radius: var(--r-pill);
204
204
  border: 1px solid color-mix(in srgb, var(--fg) 16%, transparent);
205
205
  background: color-mix(in srgb, var(--fg) 5%, transparent);
206
206
  color: var(--fg-2, var(--fg));
@@ -239,7 +239,7 @@
239
239
  font-family: var(--ff-body); font-size: var(--fs-tiny);
240
240
  }
241
241
  .agentchat-install-copy:hover { background: var(--bg-3); color: var(--fg); }
242
- .agentchat-install-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
242
+ .agentchat-install-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
243
243
  .agentchat-install-actions { display: flex; justify-content: flex-start; }
244
244
 
245
245
  /* Host-supplied transcript export actions riding the controls row. */
@@ -250,7 +250,7 @@
250
250
  font-family: var(--ff-body); font-size: var(--fs-tiny);
251
251
  }
252
252
  .agentchat-export-act:hover { background: var(--bg-2); color: var(--fg); }
253
- .agentchat-export-act:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
253
+ .agentchat-export-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
254
254
 
255
255
  /* "working" tail: a long silent tool call shouldn't read as frozen. */
256
256
  .agentchat-working {
@@ -381,7 +381,7 @@
381
381
  /* Rail filter uses the shared .ds-search-input primitive (provides bg/border/
382
382
  radius/focus-ring); only the rail layout + touch floor live here. */
383
383
  .ds-session-head .ds-search-input { order: 1; flex: 1 1 auto; min-width: 0; min-height: 36px; padding: 0 10px; }
384
- .ds-session-new:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
384
+ .ds-session-new:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
385
385
  /* Touch floor (must FOLLOW the base rules - same specificity, order decides). */
386
386
  @media (pointer: coarse) {
387
387
  .ds-session-new { width: 44px; min-height: 44px; }
@@ -400,10 +400,10 @@
400
400
  cursor: pointer; text-align: left; color: var(--fg);
401
401
  }
402
402
  .ds-session-row:hover { background: var(--bg-2); }
403
- .ds-session-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
403
+ .ds-session-row:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
404
404
  .ds-session-row.active { background: var(--accent-tint); box-shadow: inset 2px 0 0 var(--accent); }
405
405
  .ds-session-row.rail-green::before, .ds-session-row.rail-purple::before, .ds-session-row.rail-flame::before {
406
- content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: 3px;
406
+ content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: var(--r-hair);
407
407
  }
408
408
  /* Rail tones MUST match .row.rail-* in app-shell.css so the same semantic state
409
409
  reads as one colour across the conversation list and content rows. */
@@ -494,7 +494,7 @@
494
494
  }
495
495
  .chat-code-block:hover .chat-code-copy, .chat-code-block:focus-within .chat-code-copy { opacity: 1; }
496
496
  .chat-code-copy.is-copied { color: var(--accent-ink); border-color: var(--accent); }
497
- .chat-code-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
497
+ .chat-code-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; opacity: 1; }
498
498
  /* Head-placed copy (structured CodeNode + FilePreviewCode) is always visible. */
499
499
  .chat-code-head .spread { flex: 1; }
500
500
  .chat-code-copy-head { position: static; opacity: 1; }
@@ -583,7 +583,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
583
583
  cursor: pointer; font-family: var(--ff-body); font-size: var(--fs-tiny);
584
584
  }
585
585
  .ds-dash-errors-toggle.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
586
- .ds-dash-errors-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
586
+ .ds-dash-errors-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
587
587
 
588
588
  /* --- C3: per-card select checkbox. --- */
589
589
  .ds-dash-select {
@@ -593,7 +593,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
593
593
  font-family: var(--ff-mono); font-size: var(--fs-sm);
594
594
  }
595
595
  .ds-dash-select[aria-checked="true"] { color: var(--accent-ink); }
596
- .ds-dash-select:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
596
+ .ds-dash-select:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
597
597
 
598
598
  /* --- C5: active dashboard card (current conversation). --- */
599
599
  .ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
@@ -615,7 +615,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
615
615
 
616
616
  /* --- E1: inline file preview pane (split view, non-modal). --- */
617
617
  .ds-preview-pane { display: flex; flex-direction: column; min-height: 0; height: 100%; overflow: hidden; }
618
- .ds-preview-pane:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
618
+ .ds-preview-pane:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
619
619
  .ds-preview-pane .ds-preview-body { flex: 1; min-height: 0; overflow: auto; }
620
620
  .ds-preview-pane-empty { align-items: center; justify-content: center; color: var(--fg-3); font-size: var(--fs-sm); }
621
621
  .ds-preview-code-wrap { display: flex; flex-direction: column; min-height: 0; }
@@ -632,7 +632,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
632
632
  border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2); cursor: pointer;
633
633
  font-family: var(--ff-body); font-size: var(--fs-tiny);
634
634
  }
635
- .ds-file-more-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
635
+ .ds-file-more-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
636
636
  /* --- D3: locked/no-access file row. --- */
637
637
  .ds-file-row.is-locked { opacity: .6; }
638
638
 
@@ -643,8 +643,9 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
643
643
  background: none; color: var(--fg-3); cursor: pointer;
644
644
  font-family: var(--ff-body); font-size: var(--fs-tiny);
645
645
  }
646
+ .ds-roots-tab:hover { background: var(--bg-2); color: var(--fg); }
646
647
  .ds-roots-tab.active { background: var(--bg); color: var(--fg); }
647
- .ds-roots-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
648
+ .ds-roots-tab:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
648
649
 
649
650
  /* --- H4: touch targets. On a coarse pointer / narrow screen the hover-revealed
650
651
  action rows are made permanently visible and small controls floor to 44px so
@@ -676,7 +677,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
676
677
  color: var(--fg-3); font-family: var(--ff-body); font-size: var(--fs-micro);
677
678
  }
678
679
  .ds-session-meta-copy:hover { background: var(--bg-3); color: var(--fg); }
679
- .ds-session-meta-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
680
+ .ds-session-meta-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
680
681
  @media (pointer: coarse), (max-width: 640px) {
681
682
  .ds-session-meta-copy { min-height: 44px; min-width: 44px; }
682
683
  }
@@ -704,7 +705,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
704
705
  }
705
706
 
706
707
  /* Drag-over ring: token accent, never a hex. */
707
- .chat-composer.dragover { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-2); }
708
+ .chat-composer.dragover { outline: 2px solid var(--accent-ink); outline-offset: -2px; border-radius: var(--r-2); }
708
709
 
709
710
  /* Per-bit composer context: only the bit that owns a control is a button. */
710
711
  .chat-composer-context-bit {
@@ -744,7 +745,8 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
744
745
  border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2); cursor: pointer;
745
746
  font-family: var(--ff-body); font-size: var(--fs-tiny);
746
747
  }
747
- .agentchat-earlier-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
748
+ .agentchat-earlier-btn:hover { background: var(--bg-2); color: var(--fg); }
749
+ .agentchat-earlier-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
748
750
  @media (pointer: coarse) {
749
751
  .agentchat-earlier-btn { min-height: 44px; }
750
752
  }
@@ -852,7 +854,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
852
854
  }
853
855
  .chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
854
856
  .chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
855
- .chat-msg .chat-tool .chat-tool-head:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
857
+ .chat-msg .chat-tool .chat-tool-head:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
856
858
  .chat-tool-icon { display: inline-flex; color: var(--fg-3); }
857
859
  .chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
858
860
  .chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
@@ -876,7 +878,7 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
876
878
  .chat-tool-section-label { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
877
879
  .chat-tool-copy { position: static; opacity: 0; }
878
880
  .chat-tool-section:hover .chat-tool-copy, .chat-tool-section:focus-within .chat-tool-copy { opacity: 1; }
879
- .chat-tool-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
881
+ .chat-tool-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; opacity: 1; }
880
882
  .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; }
881
883
  .chat-tool-pre.is-error { color: var(--flame); }
882
884
  .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
@@ -939,10 +941,11 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
939
941
  .ds-dash-breakdown .seg.is-idle::before { background: transparent; box-shadow: inset 0 0 0 1px var(--stale), inset 0 0 0 3px var(--bg); }
940
942
  .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
941
943
  .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); }
942
- .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
944
+ .ds-dash-selectall:hover { color: var(--fg); }
945
+ .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
943
946
  .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); }
944
947
  .ds-dash-clear:hover { color: var(--fg); }
945
- .ds-dash-clear:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; border-radius: var(--r-1); }
948
+ .ds-dash-clear:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; border-radius: var(--r-1); }
946
949
 
947
950
  /* Conversation-rail loading skeleton (cold ccsniff walk). */
948
951
  .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
@@ -5,20 +5,9 @@
5
5
  Source-of-truth tokens. Component sheet lives in app-shell.css.
6
6
  ============================================================ */
7
7
 
8
- @import url('https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,200..800&family=Hanken+Grotesk:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&display=swap');
9
-
10
- /* Metric-matched fallback for the display face. While Bricolage Grotesque
11
- loads, text falls back to Arial with size-adjust tuned to its cap-height so
12
- the oversized hero does not reflow on swap. Referenced first in --ff-display
13
- via the 'Bricolage Grotesque' family; this only kicks in for the fallback
14
- glyphs. */
15
- @font-face {
16
- font-family: 'Bricolage Grotesque Fallback';
17
- src: local('Arial');
18
- size-adjust: 99%;
19
- ascent-override: 94%;
20
- descent-override: 24%;
21
- }
8
+ /* System-font stack only — no web-font @import/@font-face. Every --ff-*
9
+ token below is the same fallback chain that used to sit after the custom
10
+ family names; removing the custom names just exposes it directly. */
22
11
 
23
12
  :root {
24
13
  /* Tree view indentation tokens */
@@ -130,15 +119,11 @@
130
119
  --panel-accent-2: var(--accent-bright, var(--accent));
131
120
  --panel-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 6%, transparent), 0 4px 14px color-mix(in oklab, var(--fg) 8%, transparent);
132
121
 
133
- /* Type — Bricolage Grotesque carries display/headings (variable editorial
134
- grotesque with real character), Hanken Grotesk carries body and UI,
135
- JetBrains carries code. The narrow alias tracks the display face.
136
- size-adjust on the fallback keeps the oversized hero from shifting while
137
- Bricolage Grotesque loads. */
138
- --ff-display: 'Bricolage Grotesque', 'Bricolage Grotesque Fallback', 'Hanken Grotesk', system-ui, sans-serif;
139
- --ff-narrow: 'Bricolage Grotesque', 'Bricolage Grotesque Fallback', 'Hanken Grotesk', system-ui, sans-serif;
140
- --ff-body: 'Hanken Grotesk', system-ui, sans-serif;
141
- --ff-mono: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
122
+ /* Type — system-font stack, no custom web fonts loaded. */
123
+ --ff-display: system-ui, sans-serif;
124
+ --ff-narrow: system-ui, sans-serif;
125
+ --ff-body: system-ui, sans-serif;
126
+ --ff-mono: ui-monospace, Menlo, Consolas, monospace;
142
127
 
143
128
  --fs-micro: 12px;
144
129
  --fs-tiny: 13px;
@@ -200,10 +185,14 @@
200
185
  --rule: color-mix(in oklab, currentColor 14%, transparent);
201
186
  --rule-strong: color-mix(in oklab, currentColor 28%, transparent);
202
187
 
188
+ /* Micro rungs below --r-1 — chips, badges, scrollbar thumbs, tick marks
189
+ genuinely want a tighter corner than 10px; without these two tokens the
190
+ component sheets fell back to raw px literals bypassing the scale. */
191
+ --r-hair: 2px;
192
+ --r-0: 4px;
203
193
  --r-1: 10px;
204
194
  --r-2: 14px;
205
195
  --r-3: 22px;
206
- --r-4: 32px;
207
196
  --r-pill: 999px;
208
197
 
209
198
  --dur-snap: 80ms;
@@ -233,6 +222,10 @@
233
222
  --measure: 68ch;
234
223
  --measure-wide: 940px;
235
224
  --measure-narrow: 760px;
225
+ /* Page-stage ceiling — independent of --measure-wide (which stays the
226
+ narrower editorial hero/prose measure). Fluid so ultra-wide viewports
227
+ actually gain real estate instead of flat-lining at a fixed px cap. */
228
+ --stage-wide: min(96vw, 1440px);
236
229
 
237
230
  --sidebar-width: 220px;
238
231
  --sidebar-width-collapsed: 64px;
@@ -247,8 +240,11 @@
247
240
  /* Unified focus-ring tokens (single source for the design system). Outset
248
241
  rings (the default) tokenize colour+width+offset; bordered text fields use
249
242
  the inset variant. Deliberate negative offsets on edge-flush/clipping
250
- containers stay literal. */
251
- --focus-color: var(--accent);
243
+ containers stay literal. --focus-color uses --accent-ink (the readable
244
+ text/UI-boundary tone), never bare --accent (the lime FILL token, which
245
+ measures ~1.07:1 against --paper and is nearly invisible as an outline —
246
+ see AGENTS.md token-split rule). */
247
+ --focus-color: var(--accent-ink);
252
248
  --focus-w: 2px;
253
249
  --focus-offset: 2px;
254
250
  --focus-ring-inset: inset 0 0 0 var(--focus-w) var(--focus-color);
@@ -273,7 +269,7 @@
273
269
  /* Link focus-visible */
274
270
  a:focus-visible,
275
271
  [role="link"]:focus-visible {
276
- outline: 2px solid var(--accent);
272
+ outline: 2px solid var(--accent-ink);
277
273
  outline-offset: 2px;
278
274
  }
279
275
 
@@ -281,13 +277,13 @@ a:focus-visible,
281
277
  input:focus-visible,
282
278
  textarea:focus-visible,
283
279
  select:focus-visible {
284
- outline: 2px solid var(--accent);
280
+ outline: 2px solid var(--accent-ink);
285
281
  outline-offset: 2px;
286
282
  }
287
283
 
288
284
  /* Interactive element focus-visible */
289
285
  [tabindex]:focus-visible {
290
- outline: 2px solid var(--accent);
286
+ outline: 2px solid var(--accent-ink);
291
287
  outline-offset: 2px;
292
288
  }
293
289
 
package/community.css CHANGED
@@ -100,7 +100,7 @@
100
100
  width: 4px;
101
101
  height: 8px;
102
102
  background: var(--fg);
103
- border-radius: 0 4px 4px 0;
103
+ border-radius: 0 var(--r-0) var(--r-0) 0;
104
104
  transition: height var(--dur-base) var(--ease);
105
105
  }
106
106
  .cm-server-icon:hover .cm-server-pill { height: 20px; }
@@ -156,7 +156,7 @@
156
156
  width: 32px;
157
157
  height: 2px;
158
158
  background: color-mix(in oklab, var(--fg) 12%, transparent);
159
- border-radius: 2px;
159
+ border-radius: var(--r-hair);
160
160
  margin: 4px 0;
161
161
  flex-shrink: 0;
162
162
  }
@@ -217,7 +217,7 @@
217
217
  .cm-channel-list::-webkit-scrollbar-track { background: transparent; }
218
218
  .cm-channel-list::-webkit-scrollbar-thumb {
219
219
  background: color-mix(in oklab, var(--fg) 18%, transparent);
220
- border-radius: 4px;
220
+ border-radius: var(--r-0);
221
221
  }
222
222
 
223
223
  /* ============================================================
@@ -297,7 +297,7 @@
297
297
  background: color-mix(in oklab, var(--fg) 8%, transparent);
298
298
  }
299
299
  .cm-cat-add:focus-visible {
300
- outline: 2px solid var(--accent);
300
+ outline: 2px solid var(--accent-ink);
301
301
  outline-offset: 2px;
302
302
  }
303
303
 
@@ -349,7 +349,7 @@
349
349
  bottom: 4px;
350
350
  width: 3px;
351
351
  background: var(--accent);
352
- border-radius: 0 3px 3px 0;
352
+ border-radius: 0 var(--r-hair) var(--r-hair) 0;
353
353
  }
354
354
 
355
355
  .cm-channel-item.voice-active {
@@ -478,7 +478,7 @@
478
478
  background: color-mix(in oklab, var(--fg) 10%, transparent);
479
479
  }
480
480
  .cm-ch-action-btn:focus-visible {
481
- outline: 2px solid var(--accent);
481
+ outline: 2px solid var(--accent-ink);
482
482
  outline-offset: 2px;
483
483
  }
484
484
 
@@ -817,7 +817,7 @@
817
817
  .cm-member-list::-webkit-scrollbar { width: 8px; }
818
818
  .cm-member-list::-webkit-scrollbar-thumb {
819
819
  background: color-mix(in oklab, var(--fg) 18%, transparent);
820
- border-radius: 4px;
820
+ border-radius: var(--r-0);
821
821
  }
822
822
 
823
823
  .cm-member-category {
@@ -1061,45 +1061,45 @@
1061
1061
  .cm-server-icon:focus-visible,
1062
1062
  .cm-server-back:focus-visible,
1063
1063
  .cm-server-add:focus-visible {
1064
- outline: 2px solid var(--accent);
1064
+ outline: 2px solid var(--accent-ink);
1065
1065
  outline-offset: 2px;
1066
1066
  border-radius: var(--r-2);
1067
1067
  }
1068
1068
 
1069
1069
  .cm-channel-item:focus-visible {
1070
- outline: 2px solid var(--accent);
1070
+ outline: 2px solid var(--accent-ink);
1071
1071
  outline-offset: -2px;
1072
1072
  border-radius: var(--r-1);
1073
1073
  }
1074
1074
 
1075
1075
  .cm-server-header:focus-visible,
1076
1076
  .cm-category-header:focus-visible {
1077
- outline: 2px solid var(--accent);
1077
+ outline: 2px solid var(--accent-ink);
1078
1078
  outline-offset: -2px;
1079
1079
  }
1080
1080
 
1081
1081
  .cm-member-item:focus-visible {
1082
- outline: 2px solid var(--accent);
1082
+ outline: 2px solid var(--accent-ink);
1083
1083
  outline-offset: -2px;
1084
1084
  border-radius: var(--r-1);
1085
1085
  }
1086
1086
 
1087
1087
  .cm-vs-btn:focus-visible,
1088
1088
  .cm-user-btn:focus-visible {
1089
- outline: 2px solid var(--accent);
1089
+ outline: 2px solid var(--accent-ink);
1090
1090
  outline-offset: 2px;
1091
1091
  border-radius: var(--r-1);
1092
1092
  }
1093
1093
 
1094
1094
  /* ThreadPanel / Forum / Page interactive elements */
1095
1095
  .cm-tp-item:focus-visible,
1096
- .cm-forum-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-1); }
1096
+ .cm-forum-item:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; border-radius: var(--r-1); }
1097
1097
  .cm-tp-new:focus-visible,
1098
1098
  .cm-tp-close:focus-visible,
1099
1099
  .cm-forum-new:focus-visible,
1100
1100
  .cm-forum-sort:focus-visible,
1101
- .cm-page-edit:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
1102
- .cm-forum-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
1101
+ .cm-page-edit:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-1); }
1102
+ .cm-forum-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent-ink); }
1103
1103
 
1104
1104
  /* ---------- mobile header ---------- */
1105
1105
  .cm-mobile-header {
@@ -1127,7 +1127,7 @@
1127
1127
  border-radius: var(--r-1);
1128
1128
  }
1129
1129
  .cm-mh-btn:hover { background: var(--panel-3); }
1130
- .cm-mh-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
1130
+ .cm-mh-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
1131
1131
  .cm-mh-title {
1132
1132
  flex: 1 1 auto;
1133
1133
  min-width: 0;
@@ -1172,7 +1172,7 @@
1172
1172
  border-radius: var(--r-1);
1173
1173
  }
1174
1174
  .cm-rb-cancel:hover { background: var(--panel-3); color: var(--fg); }
1175
- .cm-rb-cancel:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1175
+ .cm-rb-cancel:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1176
1176
 
1177
1177
  /* ---------- banner ---------- */
1178
1178
  .cm-banner {
@@ -1185,6 +1185,7 @@
1185
1185
  font-weight: 500;
1186
1186
  }
1187
1187
  .cm-banner.clickable { cursor: pointer; }
1188
+ .cm-banner.clickable:hover { background: color-mix(in oklab, currentColor 10%, transparent); }
1188
1189
  .cm-banner-msg { flex: 1 1 auto; min-width: 0; }
1189
1190
  .cm-banner-action {
1190
1191
  flex: none;
@@ -1261,6 +1262,7 @@
1261
1262
  touch-action: none;
1262
1263
  transition: background var(--dur-base) var(--ease), border-color var(--dur-base) var(--ease), transform var(--dur-snap) var(--ease);
1263
1264
  }
1265
+ .vx-ptt:hover { background: color-mix(in oklab, var(--fg) 8%, var(--bg-2)); }
1264
1266
  .vx-ptt:active { transform: scale(0.97); }
1265
1267
  .vx-ptt-icon { font-size: var(--fs-xl); line-height: 1; }
1266
1268
  .vx-ptt-label { font-size: var(--fs-tiny); letter-spacing: var(--tr-label); text-transform: uppercase; }
@@ -1370,6 +1372,7 @@
1370
1372
  cursor: pointer;
1371
1373
  transition: background var(--dur-base) var(--ease);
1372
1374
  }
1375
+ .vx-btn:hover { background: var(--bg-4, var(--bg-3)); }
1373
1376
  .vx-btn-on, .vx-btn-primary { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
1374
1377
 
1375
1378
  .vx-modal-backdrop {
@@ -1400,6 +1403,7 @@
1400
1403
  border: 0; background: transparent; color: var(--fg-3);
1401
1404
  font-size: var(--fs-xl); line-height: 1; cursor: pointer; padding: 0 var(--space-1);
1402
1405
  }
1406
+ .vx-modal-x:hover { color: var(--fg); }
1403
1407
  .vx-modal-body { padding: var(--space-3); overflow-y: auto; display: flex; flex-direction: column; gap: var(--space-3); }
1404
1408
  .vx-modal-foot {
1405
1409
  display: flex; justify-content: flex-end; gap: var(--space-2);
@@ -1457,6 +1461,7 @@
1457
1461
  cursor: pointer;
1458
1462
  font-size: var(--fs-sm);
1459
1463
  }
1464
+ .vx-queue-btn:hover { background: var(--bg-4, var(--bg-2)); }
1460
1465
  .vx-queue-strip {
1461
1466
  display: flex; gap: var(--space-2);
1462
1467
  overflow-x: auto;
@@ -1474,6 +1479,7 @@
1474
1479
  font-size: var(--fs-tiny);
1475
1480
  cursor: pointer;
1476
1481
  }
1482
+ .vx-chip:hover { background: var(--bg-4, var(--bg-2)); border-color: var(--rule-strong); }
1477
1483
  .vx-chip-current { border-color: var(--accent); background: color-mix(in oklab, var(--accent) 16%, var(--bg-3)); }
1478
1484
  .vx-chip-live { border-color: var(--green-2); }
1479
1485
  .vx-chip-dot { width: 8px; height: 8px; border-radius: var(--r-pill); background: var(--fg-3); flex-shrink: 0; }
@@ -1550,7 +1556,46 @@
1550
1556
  .cm-tp-item-title { font-size: var(--fs-1, 14px); }
1551
1557
  .cm-tp-item-snippet { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1552
1558
  .cm-tp-item-meta { display: flex; gap: var(--space-2); font-size: var(--fs-micro, 11px); color: var(--fg-2, var(--fg)); opacity: .7; }
1553
- .cm-tp-empty, .cm-forum-empty, .cm-channel-empty, .cm-member-empty { padding: var(--space-3); text-align: center; color: var(--fg-2, var(--fg)); opacity: .7; font-size: var(--fs-sm); }
1559
+ .cm-tp-empty, .cm-forum-empty, .cm-channel-empty, .cm-member-empty {
1560
+ display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
1561
+ padding: var(--space-4) var(--space-3); text-align: center;
1562
+ color: var(--fg-2, var(--fg)); opacity: .7; font-size: var(--fs-sm);
1563
+ }
1564
+ .cm-tp-empty svg, .cm-forum-empty svg, .cm-channel-empty svg, .cm-member-empty svg { opacity: .6; }
1565
+
1566
+ /* Loading skeletons — cold-load placeholders for channel/member/thread/forum
1567
+ lists. Same .ds-skel shimmer primitive as sessions.js/files.js so every
1568
+ list surface in the kit uses one shimmer language, never a bare spinner. */
1569
+ .cm-channel-item-skeleton, .cm-member-item-skeleton {
1570
+ display: flex; align-items: center; gap: var(--space-2);
1571
+ padding: var(--space-2); margin: 2px var(--space-1);
1572
+ }
1573
+ .cm-channel-item-skeleton .ds-skel-icon, .cm-member-item-skeleton .ds-skel-icon {
1574
+ width: 20px; height: 20px; border-radius: var(--r-round, 50%); flex: none; background: var(--bg-3);
1575
+ }
1576
+ .cm-channel-item-skeleton .ds-skel-title, .cm-member-item-skeleton .ds-skel-title {
1577
+ height: 12px; width: 60%; border-radius: var(--r-1); background: var(--bg-3);
1578
+ }
1579
+ .cm-list-item-skeleton {
1580
+ display: flex; flex-direction: column; gap: 6px;
1581
+ padding: var(--space-2) var(--space-3); border-bottom: var(--bw-hair) solid var(--rule);
1582
+ }
1583
+ .cm-list-item-skeleton .ds-skel-title { height: 12px; width: 55%; border-radius: var(--r-1); background: var(--bg-3); }
1584
+ .cm-list-item-skeleton .ds-skel-meta { height: 9px; width: 35%; border-radius: var(--r-1); background: var(--bg-3); }
1585
+ /* Self-contained shimmer keyframe: community.css ships standalone (the
1586
+ community-app kit does not also load chat.css), so this cannot depend on
1587
+ chat.css's ds-skel-shimmer definition even though the visual language and
1588
+ token vocabulary match it exactly. */
1589
+ @media (prefers-reduced-motion: no-preference) {
1590
+ .cm-channel-item-skeleton .ds-skel-icon, .cm-channel-item-skeleton .ds-skel-title,
1591
+ .cm-member-item-skeleton .ds-skel-icon, .cm-member-item-skeleton .ds-skel-title,
1592
+ .cm-list-item-skeleton .ds-skel-title, .cm-list-item-skeleton .ds-skel-meta {
1593
+ animation: cm-skel-shimmer 1.3s ease-in-out infinite;
1594
+ background: linear-gradient(90deg, var(--bg-3) 0%, var(--bg-2) 50%, var(--bg-3) 100%);
1595
+ background-size: 200% 100%;
1596
+ }
1597
+ }
1598
+ @keyframes cm-skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
1554
1599
 
1555
1600
  /* ForumView — cm-forum / cm-forum-* */
1556
1601
  .cm-forum { display: flex; flex-direction: column; height: 100%; min-height: 0; background: var(--bg-1, var(--bg-2)); color: var(--fg); }