@1agh/maude 0.15.0 → 0.17.1

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.
Files changed (53) hide show
  1. package/README.md +4 -2
  2. package/cli/commands/design.mjs +108 -2
  3. package/package.json +12 -18
  4. package/plugins/design/dev-server/annotations-context-toolbar.tsx +8 -8
  5. package/plugins/design/dev-server/annotations-layer.tsx +8 -10
  6. package/plugins/design/dev-server/api.ts +227 -3
  7. package/plugins/design/dev-server/bin/_enumerate-artboards-playwright.mjs +40 -0
  8. package/plugins/design/dev-server/bin/_html-playwright.mjs +129 -0
  9. package/plugins/design/dev-server/bin/_pdf-playwright.mjs +105 -0
  10. package/plugins/design/dev-server/bin/_png-playwright.mjs +143 -0
  11. package/plugins/design/dev-server/bin/_pptx-playwright.mjs +98 -0
  12. package/plugins/design/dev-server/bin/_svg-playwright.mjs +141 -0
  13. package/plugins/design/dev-server/canvas-lib.tsx +12 -13
  14. package/plugins/design/dev-server/canvas-shell.tsx +111 -9
  15. package/plugins/design/dev-server/client/app.jsx +71 -143
  16. package/plugins/design/dev-server/client/comments-overlay.css +381 -0
  17. package/plugins/design/dev-server/client/styles/3-shell.css +1 -10
  18. package/plugins/design/dev-server/client/styles/4-components.css +5 -161
  19. package/plugins/design/dev-server/client/styles.css +5 -160
  20. package/plugins/design/dev-server/comments-overlay.tsx +1156 -0
  21. package/plugins/design/dev-server/context-menu.tsx +36 -9
  22. package/plugins/design/dev-server/dist/client.bundle.js +52 -211
  23. package/plugins/design/dev-server/dist/styles.css +1 -218
  24. package/plugins/design/dev-server/export-dialog.tsx +401 -0
  25. package/plugins/design/dev-server/exporters/_browser-bundles.ts +89 -0
  26. package/plugins/design/dev-server/exporters/canva-handoff-prompt.ts +74 -0
  27. package/plugins/design/dev-server/exporters/canva.ts +126 -0
  28. package/plugins/design/dev-server/exporters/html.ts +103 -0
  29. package/plugins/design/dev-server/exporters/index.ts +135 -0
  30. package/plugins/design/dev-server/exporters/pdf.ts +109 -0
  31. package/plugins/design/dev-server/exporters/png.ts +136 -0
  32. package/plugins/design/dev-server/exporters/pptx.ts +263 -0
  33. package/plugins/design/dev-server/exporters/scope.ts +196 -0
  34. package/plugins/design/dev-server/exporters/svg.ts +122 -0
  35. package/plugins/design/dev-server/exporters/zip.ts +109 -0
  36. package/plugins/design/dev-server/http.ts +109 -0
  37. package/plugins/design/dev-server/input-router.tsx +21 -0
  38. package/plugins/design/dev-server/inspect.ts +1 -1
  39. package/plugins/design/dev-server/server.mjs +1 -1
  40. package/plugins/design/dev-server/test/canvas-meta-api.test.ts +0 -10
  41. package/plugins/design/dev-server/test/comments-api.test.ts +229 -0
  42. package/plugins/design/dev-server/test/exporters/canva.test.ts +64 -0
  43. package/plugins/design/dev-server/test/exporters/endpoint.test.ts +121 -0
  44. package/plugins/design/dev-server/test/exporters/history.test.ts +79 -0
  45. package/plugins/design/dev-server/test/exporters/html.test.ts +26 -0
  46. package/plugins/design/dev-server/test/exporters/pdf.test.ts +53 -0
  47. package/plugins/design/dev-server/test/exporters/png.test.ts +32 -0
  48. package/plugins/design/dev-server/test/exporters/pptx.test.ts +31 -0
  49. package/plugins/design/dev-server/test/exporters/scope.test.ts +0 -0
  50. package/plugins/design/dev-server/test/exporters/svg.test.ts +29 -0
  51. package/plugins/design/dev-server/test/exporters/zip.test.ts +105 -0
  52. package/plugins/design/dev-server/tool-palette.tsx +34 -16
  53. package/plugins/design/templates/_shell.html +33 -0
@@ -0,0 +1,381 @@
1
+ /* Phase 6 — in-place comments overlay
2
+ *
3
+ * Lives inside the canvas iframe; portaled into `.dc-world` so CSS zoom on the
4
+ * world plane scales the entire layer (pins + composer + thread popover)
5
+ * uniformly with the artboards.
6
+ *
7
+ * DS-token only. No raw hex literals, no glow shadows, no rounded > 4px, no
8
+ * gradients. The design-system-guard subagent enforces this on PR — keep edits
9
+ * inside the token vocabulary.
10
+ */
11
+
12
+ .cm-layer {
13
+ position: fixed;
14
+ inset: 0;
15
+ pointer-events: none;
16
+ /* Pins / composer / thread sit ABOVE the SelectionHalos chrome (z-index 5
17
+ * in canvas-shell HALO_CSS). Rendered as a sibling of `.dc-canvas` (NOT
18
+ * portaled into `.dc-world`) so we share the root stacking context with
19
+ * the halos — z-index here directly competes with theirs. Bonus: pins stay
20
+ * fixed 24px regardless of canvas zoom, FigJam-style. */
21
+ z-index: 10;
22
+ }
23
+
24
+ /* ─── Pin badge ───────────────────────────────────────────────────────────── */
25
+ .cm-pin {
26
+ position: absolute;
27
+ width: 24px;
28
+ height: 24px;
29
+ padding: 0;
30
+ margin: 0;
31
+ background: var(--accent, #d63b1f);
32
+ color: var(--accent-fg, #faf6ef);
33
+ border: 1px solid var(--border-strong, #2a2520);
34
+ border-radius: 0;
35
+ font: 600 var(--type-xs, 11px) / 1 var(--font-mono, ui-monospace, monospace);
36
+ letter-spacing: var(--tracking-sku, 0.04em);
37
+ display: grid;
38
+ place-items: center;
39
+ cursor: pointer;
40
+ pointer-events: auto;
41
+ user-select: none;
42
+ transition: background var(--dur-flip, 120ms) var(--ease-out, ease-out);
43
+ will-change: transform;
44
+ }
45
+
46
+ .cm-pin:hover,
47
+ .cm-pin[aria-expanded='true'] {
48
+ background: var(--accent-hover, color-mix(in oklab, var(--accent, #d63b1f) 90%, white));
49
+ }
50
+
51
+ .cm-pin:focus-visible {
52
+ outline: none;
53
+ box-shadow: var(--shadow-focus, 0 0 0 2px var(--accent, #d63b1f));
54
+ }
55
+
56
+ .cm-pin[data-resolved='true'] {
57
+ background: var(--bg-3, #1c1916);
58
+ color: var(--fg-2, #6e6660);
59
+ opacity: 0.6;
60
+ }
61
+
62
+ .cm-pin[data-focused='true'] {
63
+ /* Subtle ring — DS hard-edges discipline: no glow, just a hairline outline. */
64
+ outline: 1px solid var(--fg-0, #2a2520);
65
+ outline-offset: 1px;
66
+ }
67
+
68
+ /* ─── Composer card ───────────────────────────────────────────────────────── */
69
+ .cm-composer {
70
+ position: absolute;
71
+ width: 300px;
72
+ background: var(--bg-1, #faf6ef);
73
+ border: var(--rule-thin, 1px solid #2a2520);
74
+ border-radius: var(--radius-sm, 2px);
75
+ padding: var(--space-4, 12px);
76
+ box-shadow: none;
77
+ font: var(--type-sm, 13px) / var(--lh-sm, 1.45) var(--font-mono, ui-monospace, monospace);
78
+ color: var(--fg-0, #2a2520);
79
+ pointer-events: auto;
80
+ z-index: 4;
81
+ }
82
+
83
+ .cm-composer__head {
84
+ font-size: var(--type-xs, 11px);
85
+ color: var(--fg-2, #6e6660);
86
+ letter-spacing: var(--tracking-eyebrow, 0.08em);
87
+ text-transform: uppercase;
88
+ margin: 0 0 var(--space-2, 4px) 0;
89
+ display: flex;
90
+ align-items: center;
91
+ gap: var(--space-2, 4px);
92
+ }
93
+
94
+ .cm-composer__selector {
95
+ color: var(--fg-1, #4a4540);
96
+ background: var(--mono-cell-bg, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--accent, #d63b1f) 6%));
97
+ padding: 0 var(--space-2, 4px);
98
+ border: 1px solid var(--mono-rule, var(--border-subtle, #c8bfb4));
99
+ font-size: var(--type-xs, 11px);
100
+ letter-spacing: 0;
101
+ text-transform: none;
102
+ }
103
+
104
+ .cm-composer__textarea {
105
+ width: 100%;
106
+ min-height: 72px;
107
+ resize: vertical;
108
+ background: var(--bg-0, #ffffff);
109
+ color: var(--fg-0, #2a2520);
110
+ border: var(--rule-thin, 1px solid #2a2520);
111
+ border-radius: 0;
112
+ padding: var(--space-3, 8px);
113
+ font: inherit;
114
+ box-sizing: border-box;
115
+ }
116
+
117
+ .cm-composer__textarea:focus-visible {
118
+ outline: none;
119
+ border-color: var(--accent, #d63b1f);
120
+ box-shadow: var(--shadow-focus, 0 0 0 2px var(--accent, #d63b1f));
121
+ }
122
+
123
+ .cm-composer__actions {
124
+ display: flex;
125
+ gap: var(--space-2, 4px);
126
+ justify-content: flex-end;
127
+ margin-top: var(--space-3, 8px);
128
+ }
129
+
130
+ .cm-btn {
131
+ font: 500 var(--type-xs, 11px) / 1.4 var(--font-mono, ui-monospace, monospace);
132
+ letter-spacing: var(--tracking-eyebrow, 0.08em);
133
+ text-transform: uppercase;
134
+ padding: var(--space-2, 4px) var(--space-3, 8px);
135
+ border: var(--rule-thin, 1px solid #2a2520);
136
+ border-radius: 0;
137
+ cursor: pointer;
138
+ background: transparent;
139
+ color: var(--fg-0, #2a2520);
140
+ transition: background var(--dur-flip, 120ms) var(--ease-out, ease-out);
141
+ }
142
+
143
+ .cm-btn:hover {
144
+ background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
145
+ }
146
+
147
+ .cm-btn--primary {
148
+ background: var(--accent, #d63b1f);
149
+ color: var(--accent-fg, #faf6ef);
150
+ border-color: var(--accent, #d63b1f);
151
+ }
152
+
153
+ .cm-btn--primary:hover {
154
+ background: var(--accent-hover, color-mix(in oklab, var(--accent, #d63b1f) 90%, white));
155
+ }
156
+
157
+ .cm-btn:disabled {
158
+ opacity: 0.5;
159
+ cursor: not-allowed;
160
+ }
161
+
162
+ .cm-btn:focus-visible {
163
+ outline: none;
164
+ box-shadow: var(--shadow-focus, 0 0 0 2px var(--accent, #d63b1f));
165
+ }
166
+
167
+ /* ─── Thread popover ──────────────────────────────────────────────────────── */
168
+ .cm-thread {
169
+ position: absolute;
170
+ width: 340px;
171
+ max-height: 60vh;
172
+ overflow: auto;
173
+ background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
174
+ border: var(--rule-thin, 1px solid #2a2520);
175
+ border-radius: var(--radius-sm, 2px);
176
+ padding: var(--space-4, 12px);
177
+ box-shadow: none;
178
+ font: var(--type-sm, 13px) / var(--lh-sm, 1.45) var(--font-mono, ui-monospace, monospace);
179
+ color: var(--fg-0, #2a2520);
180
+ pointer-events: auto;
181
+ z-index: 5;
182
+ }
183
+
184
+ .cm-thread__head {
185
+ display: flex;
186
+ flex-direction: column;
187
+ gap: var(--space-2, 4px);
188
+ padding-bottom: var(--space-3, 8px);
189
+ border-bottom: var(--rule-thin, 1px solid #2a2520);
190
+ }
191
+
192
+ .cm-thread__head-row {
193
+ display: flex;
194
+ justify-content: space-between;
195
+ align-items: baseline;
196
+ gap: var(--space-2, 4px);
197
+ }
198
+
199
+ .cm-thread__close {
200
+ background: transparent;
201
+ color: var(--fg-2, #6e6660);
202
+ border: var(--rule-thin, 1px solid #2a2520);
203
+ border-radius: 0;
204
+ padding: 0 var(--space-2, 4px);
205
+ font: 600 var(--type-xs, 11px) / 1.2 var(--font-mono, ui-monospace, monospace);
206
+ cursor: pointer;
207
+ align-self: flex-start;
208
+ margin-left: var(--space-2, 4px);
209
+ transition: background var(--dur-flip, 120ms) var(--ease-out, ease-out);
210
+ }
211
+
212
+ .cm-thread__close:hover {
213
+ background: var(--bg-3, #1c1916);
214
+ color: var(--fg-0, #2a2520);
215
+ }
216
+
217
+ .cm-thread__close:focus-visible {
218
+ outline: none;
219
+ box-shadow: var(--shadow-focus, 0 0 0 2px var(--accent, #d63b1f));
220
+ }
221
+
222
+ .cm-thread__author {
223
+ color: var(--fg-0, #2a2520);
224
+ font-weight: 600;
225
+ }
226
+
227
+ .cm-thread__time {
228
+ color: var(--fg-2, #6e6660);
229
+ font-size: var(--type-xs, 11px);
230
+ }
231
+
232
+ .cm-thread__selector {
233
+ display: inline-block;
234
+ color: var(--fg-2, #6e6660);
235
+ font-size: var(--type-xs, 11px);
236
+ border: 1px solid var(--mono-rule, var(--border-subtle, #c8bfb4));
237
+ padding: 0 var(--space-2, 4px);
238
+ background: var(--mono-cell-bg, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--accent, #d63b1f) 6%));
239
+ align-self: flex-start;
240
+ max-width: 100%;
241
+ overflow: hidden;
242
+ text-overflow: ellipsis;
243
+ white-space: nowrap;
244
+ }
245
+
246
+ .cm-thread__body {
247
+ padding: var(--space-3, 8px) 0;
248
+ white-space: pre-wrap;
249
+ word-break: break-word;
250
+ }
251
+
252
+ .cm-thread__body strong,
253
+ .cm-thread__reply-body strong {
254
+ /* @mention tokens — bold, accent color. Inserted by `renderBodyWithMentions`. */
255
+ color: var(--accent, #d63b1f);
256
+ font-weight: 600;
257
+ }
258
+
259
+ .cm-thread__reply {
260
+ padding: var(--space-3, 8px) 0;
261
+ border-top: 1px solid var(--border-subtle, #c8bfb4);
262
+ }
263
+
264
+ .cm-thread__reply-head {
265
+ display: flex;
266
+ align-items: baseline;
267
+ gap: var(--space-2, 4px);
268
+ margin-bottom: var(--space-2, 4px);
269
+ }
270
+
271
+ .cm-thread__reply-author {
272
+ color: var(--fg-1, #4a4540);
273
+ font-weight: 600;
274
+ }
275
+
276
+ .cm-thread__reply-time {
277
+ color: var(--fg-3, var(--fg-2, #6e6660));
278
+ font-size: var(--type-xs, 11px);
279
+ }
280
+
281
+ .cm-thread__reply-body {
282
+ white-space: pre-wrap;
283
+ word-break: break-word;
284
+ }
285
+
286
+ .cm-thread__reply-form {
287
+ padding-top: var(--space-3, 8px);
288
+ border-top: var(--rule-thin, 1px solid #2a2520);
289
+ display: flex;
290
+ flex-direction: column;
291
+ gap: var(--space-2, 4px);
292
+ }
293
+
294
+ .cm-thread__reply-textarea {
295
+ width: 100%;
296
+ min-height: 56px;
297
+ resize: vertical;
298
+ background: var(--bg-0, #ffffff);
299
+ color: var(--fg-0, #2a2520);
300
+ border: var(--rule-thin, 1px solid #2a2520);
301
+ border-radius: 0;
302
+ padding: var(--space-3, 8px);
303
+ font: inherit;
304
+ box-sizing: border-box;
305
+ }
306
+
307
+ .cm-thread__reply-textarea:focus-visible {
308
+ outline: none;
309
+ border-color: var(--accent, #d63b1f);
310
+ box-shadow: var(--shadow-focus, 0 0 0 2px var(--accent, #d63b1f));
311
+ }
312
+
313
+ .cm-thread__reply-actions {
314
+ display: flex;
315
+ justify-content: flex-end;
316
+ gap: var(--space-2, 4px);
317
+ }
318
+
319
+ .cm-thread__actions {
320
+ display: flex;
321
+ gap: var(--space-2, 4px);
322
+ padding-top: var(--space-3, 8px);
323
+ margin-top: var(--space-3, 8px);
324
+ border-top: var(--rule-thin, 1px solid #2a2520);
325
+ }
326
+
327
+ .cm-thread__actions .cm-btn--danger {
328
+ margin-left: auto;
329
+ color: var(--status-error, #c0392b);
330
+ border-color: var(--status-error, #c0392b);
331
+ }
332
+
333
+ .cm-thread__actions .cm-btn--danger:hover {
334
+ background: color-mix(in oklab, var(--status-error, #c0392b) 12%, transparent);
335
+ }
336
+
337
+ /* ─── @mention autocomplete ──────────────────────────────────────────────── */
338
+ .cm-mention-popup {
339
+ position: absolute;
340
+ background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
341
+ border: var(--rule-thin, 1px solid #2a2520);
342
+ border-radius: 0;
343
+ font: var(--type-xs, 11px) / var(--lh-xs, 1.3) var(--font-mono, ui-monospace, monospace);
344
+ color: var(--fg-0, #2a2520);
345
+ max-height: 180px;
346
+ min-width: 160px;
347
+ overflow: auto;
348
+ box-shadow: none;
349
+ pointer-events: auto;
350
+ z-index: 6;
351
+ list-style: none;
352
+ padding: 0;
353
+ margin: 0;
354
+ }
355
+
356
+ .cm-mention-popup__item {
357
+ padding: var(--space-2, 4px) var(--space-3, 8px);
358
+ cursor: pointer;
359
+ display: flex;
360
+ justify-content: space-between;
361
+ gap: var(--space-3, 8px);
362
+ }
363
+
364
+ .cm-mention-popup__item[aria-selected='true'] {
365
+ background: var(--accent, #d63b1f);
366
+ color: var(--accent-fg, #faf6ef);
367
+ }
368
+
369
+ .cm-mention-popup__name {
370
+ font-weight: 600;
371
+ }
372
+
373
+ .cm-mention-popup__email {
374
+ color: var(--fg-2, #6e6660);
375
+ font-size: var(--type-xs, 11px);
376
+ }
377
+
378
+ .cm-mention-popup__item[aria-selected='true'] .cm-mention-popup__email {
379
+ color: var(--accent-fg, #faf6ef);
380
+ opacity: 0.85;
381
+ }
@@ -758,8 +758,7 @@
758
758
  flex: 1;
759
759
  min-width: 0;
760
760
  }
761
- .sb-clear-sel,
762
- .sb-add-comment {
761
+ .sb-clear-sel {
763
762
  background: transparent;
764
763
  color: var(--u-fg-2);
765
764
  border: 1px solid var(--u-border);
@@ -772,19 +771,11 @@
772
771
  text-transform: uppercase;
773
772
  cursor: pointer;
774
773
  }
775
- .sb-add-comment {
776
- color: var(--u-accent);
777
- border-color: var(--u-accent);
778
- }
779
774
  .sb-clear-sel:hover {
780
775
  color: var(--u-fg-0);
781
776
  background: var(--u-bg-2);
782
777
  border-color: var(--u-border-strong);
783
778
  }
784
- .sb-add-comment:hover {
785
- background: var(--u-accent);
786
- color: var(--u-accent-fg);
787
- }
788
779
  .sb-unread .sb-count {
789
780
  font-family: var(--u-font-mono);
790
781
  font-size: 10px;
@@ -447,179 +447,23 @@
447
447
  flex-wrap: wrap;
448
448
  }
449
449
  /* Composer — stacked vertically so the textarea has real estate */
450
- .composer {
451
- display: flex;
452
- flex-direction: column;
453
- gap: var(--u-s-2);
454
- padding: var(--u-s-3);
455
- background: var(--u-bg-2);
456
- border: 1px solid var(--u-accent-line);
457
- border-radius: var(--u-r-md);
458
- margin: 4px 0;
459
- }
460
- .composer-head {
461
- display: flex;
462
- align-items: baseline;
463
- gap: var(--u-s-2);
464
- font-size: 11px;
465
- color: var(--u-fg-3);
466
- }
467
- .composer-selector {
468
- font-family: var(--u-font-mono);
469
- font-size: 11px;
470
- color: var(--u-fg-1);
471
- background: var(--u-bg-1);
472
- padding: 2px 8px;
473
- border-radius: var(--u-r-sm);
474
- border: 1px solid var(--u-border);
475
- overflow: hidden;
476
- text-overflow: ellipsis;
477
- white-space: nowrap;
478
- flex: 1;
479
- min-width: 0;
480
- }
481
- .comment-bar textarea.composer-textarea {
482
- width: 100%;
483
- background: var(--u-bg-1);
484
- border: 1px solid var(--u-border);
485
- border-radius: var(--u-r-sm);
486
- color: var(--u-fg-0);
487
- font-family: inherit;
488
- font-size: 13px;
489
- line-height: 1.5;
490
- padding: var(--u-s-3);
491
- resize: vertical;
492
- min-height: 100px;
493
- outline: none;
494
- }
495
- .comment-bar textarea.composer-textarea:focus { border-color: var(--u-accent-line); }
496
- .comment-bar textarea.composer-textarea::placeholder { color: var(--u-fg-3); }
497
- .composer-actions {
498
- display: flex;
499
- justify-content: flex-end;
500
- gap: 6px;
501
- }
450
+ /* Phase 6 — the shell-side composer / focused-row / pin-strip surfaces moved
451
+ * into the canvas iframe (see plugins/design/dev-server/comments-overlay.tsx
452
+ * + .css). Only the residual BottomBar open-count label survives. The legacy
453
+ * `.composer*` / `.cb-pin-chip` / `.cb-row.focused` / `.cb-text` / `.cb-target`
454
+ * / `.cb-pinno` / `.cb-more` rules were removed in the same change. */
502
455
 
503
- .cb-row.composer {
504
- align-items: stretch;
505
- flex-wrap: nowrap;
506
- }
507
456
  .cb-label {
508
457
  color: var(--u-fg-3);
509
458
  font-size: 11px;
510
459
  flex: none;
511
460
  align-self: center;
512
461
  }
513
- .cb-label code {
514
- font-family: var(--u-font-mono);
515
- font-size: 10px;
516
- background: var(--u-bg-2);
517
- padding: 1px 4px;
518
- border-radius: var(--u-r-xs);
519
- color: var(--u-fg-1);
520
- }
521
- .comment-bar textarea {
522
- flex: 1;
523
- background: var(--u-bg-2);
524
- border: 1px solid var(--u-border);
525
- border-radius: var(--u-r-sm);
526
- color: var(--u-fg-0);
527
- font-family: inherit;
528
- font-size: 12px;
529
- padding: var(--u-s-2);
530
- resize: vertical;
531
- min-height: 40px;
532
- outline: none;
533
- }
534
- .comment-bar textarea:focus { border-color: var(--u-accent-line); }
535
- .cb-actions {
536
- display: flex;
537
- gap: 4px;
538
- align-self: flex-end;
539
- }
540
- .cb-primary, .cb-secondary {
541
- border: 1px solid var(--u-border);
542
- background: var(--u-bg-2);
543
- color: var(--u-fg-1);
544
- border-radius: var(--u-r-sm);
545
- padding: 4px var(--u-s-3);
546
- font-family: var(--u-font-mono);
547
- font-size: 11px;
548
- cursor: pointer;
549
- }
550
- .cb-primary {
551
- background: var(--u-accent);
552
- color: var(--u-bg-0);
553
- border-color: var(--u-accent);
554
- font-weight: 600;
555
- }
556
- .cb-primary:hover { background: var(--u-accent-strong); border-color: var(--u-accent-strong); }
557
- .cb-primary:disabled { opacity: 0.5; cursor: not-allowed; }
558
- .cb-secondary:hover { background: var(--u-bg-3); color: var(--u-fg-0); }
559
-
560
- .cb-row.focused {
561
- background: var(--u-bg-2);
562
- border-radius: var(--u-r-sm);
563
- padding: 4px var(--u-s-2);
564
- }
565
- .cb-pinno {
566
- font-family: var(--u-font-mono);
567
- font-size: 11px;
568
- background: var(--u-accent);
569
- color: var(--u-accent-fg);
570
- border-radius: var(--u-r-sm);
571
- padding: 1px 6px;
572
- font-weight: 700;
573
- flex: none;
574
- letter-spacing: var(--tracking-sku);
575
- }
576
- .cb-text {
577
- flex: 1;
578
- color: var(--u-fg-0);
579
- overflow: hidden;
580
- text-overflow: ellipsis;
581
- white-space: nowrap;
582
- font-size: 12px;
583
- }
584
- .cb-target code {
585
- font-family: var(--u-font-mono);
586
- font-size: 10px;
587
- background: var(--u-bg-3);
588
- padding: 1px 6px;
589
- border-radius: var(--u-r-xs);
590
- color: var(--u-fg-2);
591
- max-width: 240px;
592
- overflow: hidden;
593
- text-overflow: ellipsis;
594
- white-space: nowrap;
595
- display: inline-block;
596
- }
597
462
 
598
463
  .cb-row.strip {
599
464
  font-size: 11px;
600
465
  color: var(--u-fg-3);
601
466
  }
602
- .cb-pin-strip {
603
- display: flex;
604
- gap: 4px;
605
- flex: 1;
606
- flex-wrap: wrap;
607
- }
608
- .cb-pin-chip {
609
- font-family: var(--u-font-mono);
610
- font-size: 10px;
611
- background: var(--u-accent);
612
- color: var(--u-accent-fg);
613
- border: 0;
614
- border-radius: var(--u-r-sm);
615
- padding: 2px 7px;
616
- font-weight: 600;
617
- cursor: pointer;
618
- transition: transform 100ms;
619
- letter-spacing: var(--tracking-sku);
620
- }
621
- .cb-pin-chip:hover { transform: scale(1.1); }
622
- .cb-more { font-family: var(--u-font-mono); font-size: 10px; color: var(--u-fg-3); align-self: center; }
623
467
 
624
468
  /* ----- Right sidebar — Comments panel (CV-10) ----- */
625
469
  .rsidebar {