@getv.design/embed 0.0.0-stage → 0.1.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.
package/edit.css ADDED
@@ -0,0 +1,2185 @@
1
+
2
+ .vd-editor {
3
+ position: relative;
4
+ width: 100%;
5
+ height: 100%;
6
+ }
7
+
8
+ /* --- selection overlay ---------------------------------------------------- */
9
+
10
+ .vd-editor__overlay {
11
+ position: absolute;
12
+ inset: 0;
13
+ width: 100%;
14
+ height: 100%;
15
+ pointer-events: none;
16
+ overflow: visible;
17
+ }
18
+
19
+ /*
20
+ * Weights are a hierarchy, not a uniform value. Loudest first: a guide, which is
21
+ * transient and is the whole answer to "did it align"; then the selection, which
22
+ * is always there; then hover and the members of a multi-selection, which are
23
+ * context rather than the subject.
24
+ *
25
+ * crispEdges turns antialiasing off, so it belongs only on whole-pixel widths —
26
+ * at 1.5 it rounds and the line comes back uneven. The overlay is drawn in
27
+ * screen space, so these are screen pixels at any zoom.
28
+ */
29
+
30
+ /* Under every selection line, just outside it: the opposite colour, so the
31
+ selection reads on a design of either colour (overlay.ts `line`). White by
32
+ default, for the default blue. */
33
+ .vd-editor__halo {
34
+ fill: none;
35
+ stroke: var(--vd-selection-halo, #fff);
36
+ stroke-width: 1;
37
+ }
38
+
39
+ /* As quiet as the hover and member lines they sit under. */
40
+ .vd-editor__halo--quiet {
41
+ opacity: 0.5;
42
+ }
43
+
44
+ /* A highlight's line is the agent's colour in both themes, so its edge is
45
+ always dark: a bright line with a dark rim reads on a white page and a
46
+ black one alike. */
47
+ .vd-editor__halo--highlight {
48
+ stroke: var(--vd-highlight-halo, rgb(0 0 0 / 0.6));
49
+ }
50
+
51
+ /* Previews what a click will hit, before it hits it. */
52
+ .vd-editor__hover {
53
+ fill: none;
54
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
55
+ stroke-width: 1.5;
56
+ opacity: 0.7;
57
+ }
58
+
59
+ .vd-editor__outline {
60
+ fill: none;
61
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
62
+ stroke-width: 2;
63
+ shape-rendering: crispEdges;
64
+ }
65
+
66
+ /* Individual members inside a multi-selection, under the shared box. */
67
+ .vd-editor__member {
68
+ fill: none;
69
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
70
+ stroke-width: 1.5;
71
+ opacity: 0.45;
72
+ }
73
+
74
+ .vd-editor__handle {
75
+ fill: var(--vd-handle, #fff);
76
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
77
+ stroke-width: 1.5;
78
+ }
79
+
80
+ .vd-editor__adjuster {
81
+ fill: var(--vd-handle, #fff);
82
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
83
+ stroke-width: 1.5;
84
+ }
85
+
86
+ /* --- spacing handles and rings -------------------------------------------- */
87
+
88
+ /*
89
+ * Figma draws these pink, to say "this chrome belongs to the arrangement rather
90
+ * than to any one shape". We already spend a second colour on guides, so these
91
+ * stay on the accent and earn their separateness by shape instead: a pill lying
92
+ * across the gap it holds open, and a ring at the centre of what it moves.
93
+ */
94
+ .vd-editor__spacer {
95
+ fill: var(--vd-handle, var(--vd-accent, #3b82f6));
96
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
97
+ stroke-width: 1;
98
+ opacity: 0.75;
99
+ }
100
+
101
+ .vd-editor__ring {
102
+ fill: var(--vd-surface, #ffffff);
103
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
104
+ stroke-width: 2;
105
+ }
106
+
107
+ /* The member being dragged to another slot, so it stays findable while the
108
+ others reflow around it. */
109
+ .vd-editor__lead {
110
+ fill: none;
111
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
112
+ stroke-width: 2;
113
+ shape-rendering: crispEdges;
114
+ }
115
+
116
+ /* --- paths: point mode and the pen ---------------------------------------- */
117
+
118
+ .vd-editor__path {
119
+ fill: none;
120
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
121
+ stroke-width: 1.5;
122
+ }
123
+
124
+ .vd-editor__pending {
125
+ fill: none;
126
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
127
+ stroke-width: 1;
128
+ stroke-dasharray: 4 3;
129
+ }
130
+
131
+ .vd-editor__arm {
132
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
133
+ stroke-width: 1;
134
+ }
135
+
136
+ .vd-editor__knob {
137
+ fill: var(--vd-selection, var(--vd-accent, #3b82f6));
138
+ }
139
+
140
+ .vd-editor__anchor {
141
+ fill: #fff;
142
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
143
+ stroke-width: 1;
144
+ }
145
+
146
+ .vd-editor__anchor--on {
147
+ fill: var(--vd-handle, var(--vd-selection, var(--vd-accent, #3b82f6)));
148
+ }
149
+
150
+ .vd-editor__close {
151
+ fill: none;
152
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
153
+ stroke-width: 1.5;
154
+ }
155
+
156
+ .vd-editor__draft {
157
+ fill: var(--vd-selection, var(--vd-accent, #3b82f6));
158
+ fill-opacity: 0.12;
159
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
160
+ stroke-width: 1.5;
161
+ stroke-dasharray: 4 3;
162
+ }
163
+
164
+ /*
165
+ * The caret blinks in hard steps rather than fading: a fade reads as sluggish,
166
+ * and every native text field on every platform blinks hard.
167
+ */
168
+ .vd-editor__caret {
169
+ stroke: var(--vd-ink, #18181b);
170
+ stroke-width: 1.5;
171
+ animation: vd-caret-blink 1.06s steps(2, jump-none) infinite;
172
+ }
173
+
174
+ @keyframes vd-caret-blink {
175
+ to {
176
+ opacity: 0;
177
+ }
178
+ }
179
+
180
+ /* Selected text: a translucent wash. This rule went missing when the text
181
+ styles moved (af00d34), which left the band in SVG's default fill, solid
182
+ black. Its own variable, because a host's handle colour may be too faint at
183
+ this opacity and its outline colour too heavy. */
184
+ .vd-editor__text-selection {
185
+ fill: var(--vd-text-selection, var(--vd-accent, #3b82f6));
186
+ fill-opacity: 0.35;
187
+ stroke: none;
188
+ }
189
+
190
+ /* Suppressed while typing, so the bar never blinks out under a keystroke. */
191
+ .vd-editor--typing .vd-editor__caret {
192
+ animation: none;
193
+ }
194
+
195
+ .vd-editor__marquee {
196
+ fill: var(--vd-selection, var(--vd-accent, #3b82f6));
197
+ fill-opacity: 0.1;
198
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
199
+ stroke-width: 1.25;
200
+ stroke-dasharray: 3 2;
201
+ }
202
+
203
+ .vd-editor__badge {
204
+ fill: var(--vd-selection, var(--vd-accent, #3b82f6));
205
+ /* The halo's edge, or a badge the page's own colour is not there. */
206
+ stroke: var(--vd-selection-halo, #fff);
207
+ stroke-width: 1;
208
+ }
209
+
210
+ .vd-editor__badge-text {
211
+ fill: var(--vd-on-selection, #fff);
212
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
213
+ font-size: 10px;
214
+ font-variant-numeric: tabular-nums;
215
+ dominant-baseline: middle;
216
+ text-anchor: middle;
217
+ }
218
+
219
+ /* --- page names ------------------------------------------------------------ */
220
+
221
+ /* Each page's name above its corner: quiet until the pointer is on it, in the
222
+ selection's colour once the page is chosen. The fallbacks suit the viewer's
223
+ own default surface, which is dark: a host that sets --vd-surface (or a
224
+ light surface) sets these too, as the app does. */
225
+ .vd-editor__page-label {
226
+ fill: var(--vd-page-label, rgb(255 255 255 / 0.55));
227
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
228
+ font-size: 11px;
229
+ font-weight: 500;
230
+ user-select: none;
231
+ }
232
+
233
+ .vd-editor__page-label--hover {
234
+ fill: var(--vd-page-label-hover, rgb(255 255 255 / 0.9));
235
+ }
236
+
237
+ .vd-editor__page-label--selected {
238
+ fill: var(--vd-accent, #3b82f6);
239
+ }
240
+
241
+ .vd-editor__rename {
242
+ position: absolute;
243
+ z-index: 4;
244
+ box-sizing: border-box;
245
+ height: 22px;
246
+ padding: 0 4px;
247
+ border: 1px solid var(--vd-accent, #3b82f6);
248
+ border-radius: 4px;
249
+ background: var(--vd-surface-raised, #ffffff);
250
+ color: var(--vd-ink, #1a1a1f);
251
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
252
+ font-size: 11px;
253
+ font-weight: 500;
254
+ outline: none;
255
+ }
256
+
257
+ /* --- locked and hidden ------------------------------------------------------ */
258
+
259
+ /* Selected, but not the pointer's to move: no handles, and a dashed line that
260
+ says so. The same colour as the selection, because it *is* selected. */
261
+ .vd-editor__parked {
262
+ fill: none;
263
+ stroke: var(--vd-selection, var(--vd-accent, #3b82f6));
264
+ stroke-width: 1.5;
265
+ stroke-dasharray: 4 3;
266
+ }
267
+
268
+ /* Quiet on purpose: this explains a click that went through, and a hint that
269
+ shouted would be the canvas arguing with the person who locked it. */
270
+ .vd-editor__lock {
271
+ fill: none;
272
+ stroke: var(--vd-muted, #8a8f98);
273
+ stroke-width: 1;
274
+ stroke-dasharray: 3 3;
275
+ }
276
+
277
+ .vd-editor__lock-tag {
278
+ fill: var(--vd-muted, #8a8f98);
279
+ opacity: 0.9;
280
+ }
281
+
282
+ .vd-editor__lock-text {
283
+ fill: #fff;
284
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
285
+ font-size: 10px;
286
+ font-weight: 500;
287
+ dominant-baseline: middle;
288
+ text-anchor: middle;
289
+ }
290
+
291
+ /* --- agents ------------------------------------------------------------------ */
292
+
293
+ /*
294
+ * Another hand on the document. Its own colour rather than the selection's, so
295
+ * "Claude is writing this" can never be mistaken for "you selected this" — and
296
+ * the host uses the same colour in its panel, so the eye links the two.
297
+ */
298
+ .vd-editor__presence {
299
+ fill: none;
300
+ stroke: var(--vd-agent, #8b5cf6);
301
+ stroke-width: 2;
302
+ stroke-dasharray: 6 3;
303
+ opacity: 0.85;
304
+ }
305
+
306
+ .vd-editor__presence-tag {
307
+ fill: var(--vd-agent, #8b5cf6);
308
+ }
309
+
310
+ .vd-editor__presence-text {
311
+ fill: #fff;
312
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
313
+ font-size: 10px;
314
+ font-weight: 600;
315
+ dominant-baseline: middle;
316
+ text-anchor: middle;
317
+ }
318
+
319
+ /* An image waiting for its picture. The agent's colour, because an agent
320
+ usually left it; filled with a wash so it reads as a place, not a line. */
321
+ .vd-editor__slot {
322
+ fill: var(--vd-agent-wash, rgb(139 92 246 / 0.08));
323
+ stroke: var(--vd-agent, #8b5cf6);
324
+ stroke-width: 1.5;
325
+ stroke-dasharray: 5 4;
326
+ }
327
+
328
+ .vd-editor__slot--target {
329
+ fill: var(--vd-agent-wash-strong, rgb(139 92 246 / 0.2));
330
+ stroke-width: 2.5;
331
+ stroke-dasharray: none;
332
+ }
333
+
334
+ .vd-editor__slot-label,
335
+ .vd-editor__slot-hint {
336
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
337
+ font-size: 11px;
338
+ dominant-baseline: middle;
339
+ text-anchor: middle;
340
+ }
341
+
342
+ .vd-editor__slot-label {
343
+ fill: var(--vd-agent, #8b5cf6);
344
+ font-weight: 600;
345
+ }
346
+
347
+ .vd-editor__slot-hint {
348
+ fill: var(--vd-muted, #8a8f98);
349
+ }
350
+
351
+ /* Pointed at from outside the canvas: a hovered step or change row. An
352
+ outline and never a fill: a wash laid over the design hides what it points
353
+ at, and a group's wash stacked on its children's left dark patches that
354
+ matched nothing on the page. */
355
+ .vd-editor__highlight {
356
+ fill: none;
357
+ stroke: var(--vd-highlight, var(--vd-agent, #8b5cf6));
358
+ stroke-width: 2;
359
+ shape-rendering: crispEdges;
360
+ }
361
+
362
+ /* --- guides --------------------------------------------------------------- */
363
+
364
+ /*
365
+ * A colour of their own. Guides are transient feedback about a gesture, not
366
+ * chrome that belongs to the selection, and reusing the accent would make the
367
+ * two read as the same thing.
368
+ */
369
+ /*
370
+ * The loudest thing on the canvas while a drag is happening, and deliberately.
371
+ * A centre-to-centre guide has been drawn since the beginning and was reported
372
+ * as missing, because at one pixel against artwork nobody saw it.
373
+ */
374
+ .vd-editor__guide {
375
+ stroke: var(--vd-guide, #f43f5e);
376
+ stroke-width: 2;
377
+ shape-rendering: crispEdges;
378
+ }
379
+
380
+ .vd-editor__measure {
381
+ fill: none;
382
+ stroke: var(--vd-guide, #f43f5e);
383
+ stroke-width: 1.5;
384
+ }
385
+
386
+ .vd-editor__measure-text {
387
+ fill: var(--vd-guide, #f43f5e);
388
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
389
+ font-size: 10px;
390
+ font-variant-numeric: tabular-nums;
391
+ dominant-baseline: middle;
392
+ text-anchor: middle;
393
+ paint-order: stroke;
394
+ stroke: var(--vd-surface, #ffffff);
395
+ stroke-width: 3px;
396
+ stroke-linejoin: round;
397
+ }
398
+
399
+ /* --- layers --------------------------------------------------------------- */
400
+
401
+ .vd-layers {
402
+ display: flex;
403
+ flex-direction: column;
404
+ min-height: 0;
405
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
406
+ font-size: 12px;
407
+ color: var(--vd-ink, #1a1a1f);
408
+ }
409
+
410
+ .vd-layers__tree {
411
+ flex: 1 1 auto;
412
+ min-height: 0;
413
+ overflow: auto;
414
+ padding: 4px 0 12px;
415
+ outline: none;
416
+ }
417
+
418
+ .vd-layers__tree[hidden],
419
+ .vd-layers__empty[hidden] {
420
+ display: none;
421
+ }
422
+
423
+ .vd-layers__empty {
424
+ margin: 0;
425
+ padding: 16px 14px;
426
+ line-height: 1.5;
427
+ opacity: 0.55;
428
+ }
429
+
430
+ .vd-layers__row {
431
+ --indent: calc(var(--depth, 0) * 14px);
432
+ display: flex;
433
+ align-items: center;
434
+ gap: 4px;
435
+ height: 28px;
436
+ padding: 0 6px 0 calc(4px + var(--indent));
437
+ cursor: default;
438
+ user-select: none;
439
+ position: relative;
440
+ }
441
+
442
+ .vd-layers__row:hover {
443
+ background: var(--vd-row-hover, rgb(0 0 0 / 0.04));
444
+ }
445
+
446
+ .vd-layers__row[aria-selected='true'] {
447
+ background: var(--vd-row-selected, rgb(59 130 246 / 0.14));
448
+ }
449
+
450
+ .vd-layers__tree:focus-visible .vd-layers__row[data-active='true'] {
451
+ box-shadow: inset 0 0 0 1px var(--vd-accent, #3b82f6);
452
+ }
453
+
454
+ .vd-layers__row[data-entered='true'] .vd-layers__label {
455
+ font-weight: 600;
456
+ }
457
+
458
+ /* Hidden rows fade; inherited-hidden ones fade the same, because what you see
459
+ on the canvas is the same either way. */
460
+ .vd-layers__row:not([data-hidden='no']) > :not(.vd-layers__toggles) {
461
+ opacity: 0.45;
462
+ }
463
+
464
+ .vd-layers__twisty {
465
+ display: grid;
466
+ place-items: center;
467
+ flex: 0 0 16px;
468
+ width: 16px;
469
+ height: 16px;
470
+ padding: 0;
471
+ border: 0;
472
+ background: none;
473
+ color: inherit;
474
+ opacity: 0.6;
475
+ cursor: pointer;
476
+ }
477
+
478
+ .vd-layers__twisty:disabled {
479
+ visibility: hidden;
480
+ }
481
+
482
+ .vd-layers__twisty svg {
483
+ width: 10px;
484
+ height: 10px;
485
+ transition: transform 100ms ease;
486
+ }
487
+
488
+ .vd-layers__row[aria-expanded='true'] > .vd-layers__twisty svg {
489
+ transform: rotate(90deg);
490
+ }
491
+
492
+ .vd-layers__icon {
493
+ display: grid;
494
+ place-items: center;
495
+ flex: 0 0 16px;
496
+ opacity: 0.6;
497
+ }
498
+
499
+ .vd-layers__icon svg {
500
+ width: 13px;
501
+ height: 13px;
502
+ }
503
+
504
+ .vd-layers__label {
505
+ flex: 0 1 auto;
506
+ min-width: 0;
507
+ overflow: hidden;
508
+ text-overflow: ellipsis;
509
+ white-space: nowrap;
510
+ }
511
+
512
+ .vd-layers__tag {
513
+ flex: 0 0 auto;
514
+ padding: 0 5px;
515
+ border: 1px solid currentColor;
516
+ border-radius: 4px;
517
+ font-size: 10px;
518
+ line-height: 14px;
519
+ opacity: 0.55;
520
+ }
521
+
522
+ .vd-layers__preview {
523
+ flex: 1 1 0;
524
+ min-width: 0;
525
+ overflow: hidden;
526
+ text-overflow: ellipsis;
527
+ white-space: nowrap;
528
+ opacity: 0.45;
529
+ }
530
+
531
+ .vd-layers__rename {
532
+ flex: 1 1 auto;
533
+ min-width: 0;
534
+ height: 22px;
535
+ padding: 0 6px;
536
+ border: 1px solid var(--vd-accent, #3b82f6);
537
+ border-radius: 4px;
538
+ background: var(--vd-input-bg, #fff);
539
+ color: inherit;
540
+ font: inherit;
541
+ outline: none;
542
+ }
543
+
544
+ .vd-layers__toggles {
545
+ display: flex;
546
+ gap: 2px;
547
+ margin-left: auto;
548
+ flex: 0 0 auto;
549
+ }
550
+
551
+ /* Out of the way until wanted, and never out of the way once set: a hidden or
552
+ locked row has to be recognisable at a glance down a long list. */
553
+ .vd-layers__toggle {
554
+ display: grid;
555
+ place-items: center;
556
+ width: 22px;
557
+ height: 22px;
558
+ padding: 0;
559
+ border: 0;
560
+ border-radius: 4px;
561
+ background: none;
562
+ color: inherit;
563
+ opacity: 0;
564
+ cursor: pointer;
565
+ }
566
+
567
+ .vd-layers__row:hover .vd-layers__toggle,
568
+ .vd-layers__row[data-active='true'] .vd-layers__toggle,
569
+ .vd-layers__toggle[data-state='own'] {
570
+ opacity: 0.7;
571
+ }
572
+
573
+ .vd-layers__toggle[data-state='inherited'] {
574
+ opacity: 0.3;
575
+ cursor: default;
576
+ }
577
+
578
+ .vd-layers__toggle:hover:not(:disabled) {
579
+ opacity: 1;
580
+ background: var(--vd-row-hover, rgb(0 0 0 / 0.06));
581
+ }
582
+
583
+ .vd-layers__toggle svg {
584
+ width: 14px;
585
+ height: 14px;
586
+ }
587
+
588
+ /* Where a drop lands: a line between rows, or the whole row for "inside". */
589
+ .vd-layers__row[data-drop='above']::before,
590
+ .vd-layers__row[data-drop='below']::after {
591
+ content: '';
592
+ position: absolute;
593
+ left: calc(22px + var(--indent));
594
+ right: 6px;
595
+ height: 2px;
596
+ border-radius: 1px;
597
+ background: var(--vd-accent, #3b82f6);
598
+ pointer-events: none;
599
+ }
600
+
601
+ .vd-layers__row[data-drop='above']::before {
602
+ top: -1px;
603
+ }
604
+
605
+ .vd-layers__row[data-drop='below']::after {
606
+ bottom: -1px;
607
+ }
608
+
609
+ .vd-layers__row[data-drop='inside'] {
610
+ box-shadow: inset 0 0 0 2px var(--vd-accent, #3b82f6);
611
+ border-radius: 4px;
612
+ }
613
+
614
+ @media (prefers-reduced-motion: reduce) {
615
+ .vd-layers__twisty svg {
616
+ transition: none;
617
+ }
618
+ }
619
+
620
+ /* --- inspector ------------------------------------------------------------ */
621
+
622
+ .vd-inspector {
623
+ display: flex;
624
+ flex-direction: column;
625
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
626
+ font-size: 12px;
627
+ color: var(--vd-ink, #1a1a1f);
628
+ }
629
+
630
+ .vd-inspector__header {
631
+ display: flex;
632
+ align-items: center;
633
+ gap: 10px;
634
+ padding: 12px 12px 10px;
635
+ }
636
+
637
+ .vd-inspector__type {
638
+ display: inline-grid;
639
+ place-items: center;
640
+ flex: 0 0 auto;
641
+ width: 28px;
642
+ height: 28px;
643
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
644
+ border-radius: 6px;
645
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
646
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
647
+ }
648
+
649
+ .vd-inspector__title {
650
+ display: flex;
651
+ flex-direction: column;
652
+ min-width: 0;
653
+ flex: 1 1 auto;
654
+ }
655
+
656
+ /* The name reads as a title until it is clicked, then as the field it is. */
657
+ .vd-inspector__name {
658
+ width: 100%;
659
+ margin: 0 0 0 -5px;
660
+ padding: 3px 4px;
661
+ border: 1px solid transparent;
662
+ border-radius: 5px;
663
+ background: transparent;
664
+ color: inherit;
665
+ font: inherit;
666
+ font-size: 13px;
667
+ font-weight: 600;
668
+ outline: none;
669
+ text-overflow: ellipsis;
670
+ }
671
+
672
+ .vd-inspector__name::placeholder {
673
+ color: inherit;
674
+ opacity: 1;
675
+ }
676
+
677
+ .vd-inspector__name:hover {
678
+ border-color: var(--vd-rule, rgb(0 0 0 / 0.12));
679
+ }
680
+
681
+ .vd-inspector__name:focus {
682
+ border-color: var(--vd-accent, #3b82f6);
683
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
684
+ }
685
+
686
+ .vd-inspector__name:focus::placeholder {
687
+ opacity: 0.4;
688
+ }
689
+
690
+ .vd-inspector__id {
691
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
692
+ font-size: 10.5px;
693
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
694
+ overflow: hidden;
695
+ text-overflow: ellipsis;
696
+ white-space: nowrap;
697
+ }
698
+
699
+ .vd-inspector__section {
700
+ padding: 12px;
701
+ border-top: 1px solid var(--vd-rule, rgb(0 0 0 / 0.08));
702
+ }
703
+
704
+ /*
705
+ * Every heading one way: the title on the column's left edge, any buttons on
706
+ * the right. Mono capitals, as design.md sets labels.
707
+ */
708
+ .vd-inspector__heading {
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: space-between;
712
+ gap: 8px;
713
+ height: 24px;
714
+ margin: 0 0 8px;
715
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
716
+ font-size: 10.5px;
717
+ font-weight: 500;
718
+ text-transform: uppercase;
719
+ letter-spacing: 0.06em;
720
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
721
+ }
722
+
723
+ .vd-inspector__heading-text {
724
+ min-width: 0;
725
+ overflow: hidden;
726
+ text-overflow: ellipsis;
727
+ white-space: nowrap;
728
+ }
729
+
730
+ .vd-inspector__heading-tools {
731
+ display: flex;
732
+ gap: 2px;
733
+ margin-right: -6px;
734
+ }
735
+
736
+ .vd-inspector__icon-button.vd-inspector__heading-action {
737
+ width: 24px;
738
+ height: 24px;
739
+ }
740
+
741
+ /* Two equal columns: each control is half a row or the whole of one. */
742
+ .vd-inspector__grid {
743
+ display: grid;
744
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
745
+ gap: 8px;
746
+ }
747
+
748
+ .vd-inspector__wide {
749
+ grid-column: 1 / -1;
750
+ }
751
+
752
+ .vd-inspector__row {
753
+ display: flex;
754
+ gap: 8px;
755
+ }
756
+
757
+ .vd-inspector__row > * {
758
+ flex: 1 1 0;
759
+ min-width: 0;
760
+ }
761
+
762
+ /* None, said quietly: "No stroke", "No shadow". Pressing it adds one. */
763
+ .vd-inspector__empty {
764
+ box-sizing: border-box;
765
+ display: flex;
766
+ align-items: center;
767
+ width: 100%;
768
+ height: 28px;
769
+ padding: 0 10px;
770
+ border: 1px dashed var(--vd-rule, rgb(0 0 0 / 0.12));
771
+ border-radius: 8px;
772
+ background: none;
773
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
774
+ font: inherit;
775
+ text-align: left;
776
+ cursor: default;
777
+ }
778
+
779
+ .vd-inspector__empty:hover {
780
+ border-style: solid;
781
+ color: var(--vd-ink, #1a1a1f);
782
+ }
783
+
784
+ .vd-inspector__empty:focus-visible {
785
+ outline: 2px solid var(--vd-accent, #3b82f6);
786
+ outline-offset: 1px;
787
+ }
788
+
789
+ /* A list inside a section — shadows, stops — under a line naming it. */
790
+ .vd-inspector__list {
791
+ display: flex;
792
+ flex-direction: column;
793
+ gap: 8px;
794
+ min-width: 0;
795
+ }
796
+
797
+ .vd-inspector__subhead {
798
+ display: flex;
799
+ align-items: center;
800
+ justify-content: space-between;
801
+ height: 24px;
802
+ margin: 0 -6px -4px 0;
803
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
804
+ }
805
+
806
+ .vd-inspector__subhead > .vd-inspector__icon-button {
807
+ width: 24px;
808
+ height: 24px;
809
+ }
810
+
811
+ /* A list entry’s minus, inside the box at its end. */
812
+ .vd-inspector__icon-button.vd-field__remove {
813
+ width: 20px;
814
+ height: 20px;
815
+ margin-right: -4px;
816
+ border-radius: 4px;
817
+ }
818
+
819
+ .vd-field__remove svg {
820
+ width: 14px;
821
+ height: 14px;
822
+ }
823
+
824
+ .vd-inspector__note {
825
+ margin: 0 0 8px;
826
+ line-height: 1.5;
827
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
828
+ }
829
+
830
+ .vd-inspector > .vd-inspector__section .vd-inspector__subhead:first-child {
831
+ margin-top: 0;
832
+ }
833
+
834
+ p.vd-inspector__subhead {
835
+ margin: 12px 0 8px;
836
+ font-size: 11px;
837
+ }
838
+
839
+ .vd-inspector__readout {
840
+ display: grid;
841
+ grid-template-columns: 18px 1fr 18px 1fr;
842
+ gap: 4px 6px;
843
+ margin: 0 0 10px;
844
+ }
845
+
846
+ .vd-inspector__readout dt {
847
+ opacity: 0.5;
848
+ }
849
+
850
+ .vd-inspector__readout dd {
851
+ margin: 0;
852
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
853
+ font-variant-numeric: tabular-nums;
854
+ }
855
+
856
+ /* Tokens: colours as a grid of swatches ending in a blank one; numbers as
857
+ short fields; other kinds as rows. */
858
+ .vd-token-swatches {
859
+ display: grid;
860
+ grid-template-columns: repeat(auto-fill, minmax(56px, 1fr));
861
+ gap: 8px;
862
+ }
863
+
864
+ .vd-token-swatch {
865
+ position: relative;
866
+ min-width: 0;
867
+ }
868
+
869
+ .vd-token-swatch__open,
870
+ .vd-token-swatch--blank {
871
+ display: flex;
872
+ flex-direction: column;
873
+ gap: 4px;
874
+ width: 100%;
875
+ min-width: 0;
876
+ padding: 0;
877
+ border: 0;
878
+ background: none;
879
+ color: inherit;
880
+ font: inherit;
881
+ text-align: left;
882
+ cursor: default;
883
+ }
884
+
885
+ .vd-token-swatch__chip {
886
+ box-sizing: border-box;
887
+ display: grid;
888
+ place-items: center;
889
+ height: 32px;
890
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
891
+ border-radius: 8px;
892
+ }
893
+
894
+ /* The blank tile: a dashed outline with a plus, where the next colour goes. */
895
+ .vd-token-swatch--blank .vd-token-swatch__chip {
896
+ border-style: dashed;
897
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
898
+ }
899
+
900
+ .vd-token-swatch--blank:hover .vd-token-swatch__chip {
901
+ border-style: solid;
902
+ color: var(--vd-ink, #1a1a1f);
903
+ }
904
+
905
+ .vd-token-swatch__open[aria-pressed='true'] .vd-token-swatch__chip,
906
+ .vd-token-swatch--blank[aria-pressed='true'] .vd-token-swatch__chip,
907
+ .vd-token-swatch__open:focus-visible .vd-token-swatch__chip,
908
+ .vd-token-swatch--blank:focus-visible .vd-token-swatch__chip {
909
+ outline: 2px solid var(--vd-accent, #3b82f6);
910
+ outline-offset: 1px;
911
+ }
912
+
913
+ .vd-token-swatch__name {
914
+ overflow: hidden;
915
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
916
+ font-size: 10.5px;
917
+ text-overflow: ellipsis;
918
+ white-space: nowrap;
919
+ }
920
+
921
+ /* A tile's remove: a small x on its own surface in the chip's corner, shown on
922
+ hover or focus, so twenty tiles are not twenty buttons until you ask. */
923
+ .vd-inspector__icon-button.vd-token-swatch__remove {
924
+ position: absolute;
925
+ top: -6px;
926
+ right: -6px;
927
+ width: 18px;
928
+ height: 18px;
929
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
930
+ border-radius: 50%;
931
+ background: var(--vd-surface-raised, #ffffff);
932
+ opacity: 0;
933
+ }
934
+
935
+ .vd-token-swatch__remove svg {
936
+ width: 12px;
937
+ height: 12px;
938
+ }
939
+
940
+ .vd-token-swatch:hover .vd-token-swatch__remove,
941
+ .vd-token-swatch:focus-within .vd-token-swatch__remove,
942
+ .vd-asset:hover .vd-token-swatch__remove,
943
+ .vd-asset:focus-within .vd-token-swatch__remove {
944
+ opacity: 1;
945
+ }
946
+
947
+ .vd-inspector__icon-button.vd-token-swatch__remove:hover {
948
+ background: var(--vd-surface-raised, #ffffff);
949
+ color: var(--vd-error, #dc2626);
950
+ }
951
+
952
+ .vd-token-editor {
953
+ margin-top: 12px;
954
+ }
955
+
956
+ .vd-token--unused {
957
+ opacity: 0.5;
958
+ }
959
+
960
+ .vd-inspector__empty-icon {
961
+ display: inline-flex;
962
+ margin-right: 6px;
963
+ }
964
+
965
+ .vd-inspector__empty-icon svg {
966
+ width: 14px;
967
+ height: 14px;
968
+ }
969
+
970
+ .vd-inspector__doc-title {
971
+ font-size: 13px;
972
+ font-weight: 600;
973
+ }
974
+
975
+ /* The document's pictures, as thumbnails. */
976
+ .vd-asset-grid {
977
+ display: grid;
978
+ grid-template-columns: repeat(auto-fill, minmax(72px, 1fr));
979
+ gap: 8px;
980
+ }
981
+
982
+ .vd-asset {
983
+ position: relative;
984
+ min-width: 0;
985
+ }
986
+
987
+ .vd-asset__open {
988
+ display: flex;
989
+ flex-direction: column;
990
+ gap: 4px;
991
+ width: 100%;
992
+ padding: 0;
993
+ border: 0;
994
+ background: none;
995
+ color: inherit;
996
+ font: inherit;
997
+ text-align: left;
998
+ cursor: default;
999
+ }
1000
+
1001
+ .vd-asset__thumb {
1002
+ box-sizing: border-box;
1003
+ display: grid;
1004
+ place-items: center;
1005
+ aspect-ratio: 1;
1006
+ overflow: hidden;
1007
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1008
+ border-radius: 8px;
1009
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
1010
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1011
+ }
1012
+
1013
+ .vd-asset__thumb img {
1014
+ width: 100%;
1015
+ height: 100%;
1016
+ object-fit: cover;
1017
+ }
1018
+
1019
+ .vd-asset__open:focus-visible .vd-asset__thumb {
1020
+ outline: 2px solid var(--vd-accent, #3b82f6);
1021
+ outline-offset: 1px;
1022
+ }
1023
+
1024
+ .vd-asset__name {
1025
+ overflow: hidden;
1026
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1027
+ font-size: 10.5px;
1028
+ text-overflow: ellipsis;
1029
+ white-space: nowrap;
1030
+ }
1031
+
1032
+
1033
+ .vd-inspector__button {
1034
+ box-sizing: border-box;
1035
+ height: 28px;
1036
+ padding: 0 12px;
1037
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1038
+ border-radius: 8px;
1039
+ background: transparent;
1040
+ color: inherit;
1041
+ font: inherit;
1042
+ cursor: default;
1043
+ }
1044
+
1045
+ .vd-inspector__button:hover {
1046
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.06));
1047
+ }
1048
+
1049
+ /*
1050
+ * Six alignments spread across the row. With three or more selected, the two
1051
+ * distributions follow after a gap, because "even out the gaps" is a
1052
+ * different question from "line these up against that edge".
1053
+ */
1054
+ .vd-inspector__align {
1055
+ justify-content: space-between;
1056
+ gap: 0;
1057
+ /* The glyphs, not their 28px targets, line up with the column's edges. */
1058
+ margin: 0 -6px;
1059
+ }
1060
+
1061
+ .vd-inspector__align > .vd-inspector__icon-button {
1062
+ flex: 0 0 28px;
1063
+ }
1064
+
1065
+ .vd-inspector__align--spread > .vd-inspector__icon-button:nth-child(7) {
1066
+ margin-left: 8px;
1067
+ }
1068
+
1069
+ .vd-inspector__icon-button {
1070
+ display: inline-flex;
1071
+ align-items: center;
1072
+ justify-content: center;
1073
+ flex: 0 0 auto;
1074
+ box-sizing: border-box;
1075
+ width: 28px;
1076
+ height: 28px;
1077
+ padding: 0;
1078
+ border: 0;
1079
+ border-radius: 6px;
1080
+ background: transparent;
1081
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1082
+ cursor: default;
1083
+ }
1084
+
1085
+ .vd-inspector__icon-button:hover:not(:disabled) {
1086
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.06));
1087
+ color: var(--vd-ink, #1a1a1f);
1088
+ }
1089
+
1090
+ .vd-inspector__icon-button:focus-visible {
1091
+ outline: 2px solid var(--vd-accent, #3b82f6);
1092
+ outline-offset: -2px;
1093
+ }
1094
+
1095
+ .vd-inspector__icon-button:disabled {
1096
+ opacity: 0.35;
1097
+ }
1098
+
1099
+ /* --- fields --------------------------------------------------------------- */
1100
+
1101
+ .vd-field {
1102
+ position: relative;
1103
+ display: flex;
1104
+ flex-wrap: wrap;
1105
+ align-items: center;
1106
+ min-width: 0;
1107
+ margin: 0;
1108
+ }
1109
+
1110
+ /* No label column (design.md): the label is the accessible name and the
1111
+ tooltip, and the box carries a mark or reads by its value. */
1112
+ .vd-field__label {
1113
+ position: absolute;
1114
+ width: 1px;
1115
+ height: 1px;
1116
+ overflow: hidden;
1117
+ clip: rect(0 0 0 0);
1118
+ white-space: nowrap;
1119
+ }
1120
+
1121
+ .vd-field__box {
1122
+ box-sizing: border-box;
1123
+ display: flex;
1124
+ align-items: center;
1125
+ gap: 6px;
1126
+ flex: 1 1 100%;
1127
+ min-width: 0;
1128
+ height: 28px;
1129
+ padding: 0 8px;
1130
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1131
+ border-radius: 8px;
1132
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
1133
+ transition: border-color 80ms ease;
1134
+ }
1135
+
1136
+ .vd-field__box:hover {
1137
+ border-color: color-mix(in srgb, var(--vd-muted, rgb(0 0 0 / 0.55)) 55%, transparent);
1138
+ }
1139
+
1140
+ .vd-field__box:focus-within,
1141
+ .vd-field__box:focus-visible {
1142
+ border-color: var(--vd-accent, #3b82f6);
1143
+ outline: none;
1144
+ }
1145
+
1146
+ .vd-field__prefix {
1147
+ flex: 0 0 auto;
1148
+ min-width: 10px;
1149
+ overflow: hidden;
1150
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1151
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1152
+ font-size: 10.5px;
1153
+ white-space: nowrap;
1154
+ user-select: none;
1155
+ }
1156
+
1157
+ .vd-field__prefix--icon {
1158
+ display: inline-flex;
1159
+ align-items: center;
1160
+ width: 14px;
1161
+ }
1162
+
1163
+ .vd-field__prefix--icon svg {
1164
+ width: 14px;
1165
+ height: 14px;
1166
+ }
1167
+
1168
+ /* Drag the mark to change the value, as in Figma. */
1169
+ .vd-field__prefix--scrub {
1170
+ cursor: ew-resize;
1171
+ }
1172
+
1173
+ .vd-field__input {
1174
+ flex: 1 1 0;
1175
+ min-width: 0;
1176
+ padding: 0;
1177
+ border: 0;
1178
+ background: none;
1179
+ color: inherit;
1180
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1181
+ font-size: 11.5px;
1182
+ font-variant-numeric: tabular-nums;
1183
+ outline: none;
1184
+ text-overflow: ellipsis;
1185
+ }
1186
+
1187
+ .vd-field__input::placeholder {
1188
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1189
+ opacity: 0.7;
1190
+ }
1191
+
1192
+ .vd-field__input:read-only {
1193
+ cursor: default;
1194
+ }
1195
+
1196
+ .vd-field__swatch {
1197
+ box-sizing: border-box;
1198
+ flex: 0 0 auto;
1199
+ width: 16px;
1200
+ height: 16px;
1201
+ border-radius: 4px;
1202
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.15));
1203
+ }
1204
+
1205
+ /*
1206
+ * What the expression currently comes to. Muted, because the expression is the
1207
+ * value and this is only its reading. A half-width box has room for one of
1208
+ * the two, so it shows the expression and the reading waits for the click
1209
+ * that widens it.
1210
+ */
1211
+ .vd-field__resolved {
1212
+ flex: 0 0 auto;
1213
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1214
+ font-size: 10.5px;
1215
+ font-variant-numeric: tabular-nums;
1216
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1217
+ }
1218
+
1219
+ .vd-field__resolved:empty,
1220
+ .vd-inspector__half:not(.vd-field--expanded) .vd-field__resolved {
1221
+ display: none;
1222
+ }
1223
+
1224
+ /* A half-width field widened over its neighbour while it is edited. */
1225
+ .vd-field--compact {
1226
+ min-height: 28px;
1227
+ }
1228
+
1229
+ .vd-field--expanded {
1230
+ z-index: 4;
1231
+ }
1232
+
1233
+ .vd-field--expanded > .vd-field__box {
1234
+ position: absolute;
1235
+ top: 0;
1236
+ }
1237
+
1238
+ .vd-field--expanded > .vd-field__error {
1239
+ margin-top: 32px;
1240
+ }
1241
+
1242
+ /* Detach: shown on a bound field when the pointer or the caret is on it. */
1243
+ .vd-field__detach {
1244
+ display: none;
1245
+ flex: 0 0 auto;
1246
+ align-items: center;
1247
+ justify-content: center;
1248
+ width: 20px;
1249
+ height: 20px;
1250
+ margin-right: -4px;
1251
+ padding: 0;
1252
+ border: 0;
1253
+ border-radius: 4px;
1254
+ background: none;
1255
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1256
+ cursor: default;
1257
+ }
1258
+
1259
+ .vd-field__detach svg {
1260
+ width: 14px;
1261
+ height: 14px;
1262
+ }
1263
+
1264
+ .vd-field:hover .vd-field__detach:not([hidden]),
1265
+ .vd-field:focus-within .vd-field__detach:not([hidden]) {
1266
+ display: inline-flex;
1267
+ }
1268
+
1269
+ .vd-field__detach:hover {
1270
+ background: var(--vd-rule, rgb(0 0 0 / 0.06));
1271
+ color: var(--vd-ink, #1a1a1f);
1272
+ }
1273
+
1274
+ /* Amber, matching the bound handles on the canvas: one colour means "bound". */
1275
+ .vd-field--bound .vd-field__box {
1276
+ border-color: var(--vd-bound, #f0b429);
1277
+ }
1278
+
1279
+ .vd-field--bound .vd-field__input {
1280
+ color: var(--vd-bound-ink, #8a6100);
1281
+ }
1282
+
1283
+ .vd-field--invalid .vd-field__box {
1284
+ border-color: var(--vd-error, #dc2626);
1285
+ }
1286
+
1287
+ .vd-field__error {
1288
+ flex: 1 1 100%;
1289
+ margin-top: 4px;
1290
+ font-size: 11px;
1291
+ color: var(--vd-error, #dc2626);
1292
+ line-height: 1.4;
1293
+ }
1294
+
1295
+ /* A dropdown: our button and list, not the operating system's menu. */
1296
+ .vd-select {
1297
+ width: 100%;
1298
+ margin: 0;
1299
+ color: inherit;
1300
+ font: inherit;
1301
+ text-align: left;
1302
+ cursor: default;
1303
+ }
1304
+
1305
+ .vd-select__value {
1306
+ flex: 1 1 auto;
1307
+ min-width: 0;
1308
+ overflow: hidden;
1309
+ text-overflow: ellipsis;
1310
+ white-space: nowrap;
1311
+ }
1312
+
1313
+ .vd-select__value--mixed {
1314
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1315
+ }
1316
+
1317
+ .vd-select__chevron {
1318
+ display: inline-flex;
1319
+ flex: 0 0 auto;
1320
+ margin-right: -2px;
1321
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1322
+ }
1323
+
1324
+ .vd-select__chevron svg {
1325
+ width: 14px;
1326
+ height: 14px;
1327
+ }
1328
+
1329
+ .vd-listbox.vd-listbox--up {
1330
+ top: auto;
1331
+ bottom: calc(100% + 4px);
1332
+ }
1333
+
1334
+ .vd-listbox {
1335
+ position: absolute;
1336
+ z-index: 6;
1337
+ top: calc(100% + 4px);
1338
+ left: 0;
1339
+ box-sizing: border-box;
1340
+ min-width: 100%;
1341
+ max-height: 264px;
1342
+ margin: 0;
1343
+ padding: 4px;
1344
+ overflow-y: auto;
1345
+ list-style: none;
1346
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1347
+ border-radius: 8px;
1348
+ background: var(--vd-surface-raised, #ffffff);
1349
+ }
1350
+
1351
+ .vd-listbox__item {
1352
+ display: flex;
1353
+ align-items: center;
1354
+ gap: 6px;
1355
+ height: 28px;
1356
+ padding: 0 10px 0 6px;
1357
+ border-radius: 6px;
1358
+ white-space: nowrap;
1359
+ cursor: default;
1360
+ }
1361
+
1362
+ .vd-listbox__item--active {
1363
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.05));
1364
+ }
1365
+
1366
+ .vd-listbox__check {
1367
+ display: inline-flex;
1368
+ width: 14px;
1369
+ visibility: hidden;
1370
+ }
1371
+
1372
+ .vd-listbox__check svg {
1373
+ width: 14px;
1374
+ height: 14px;
1375
+ }
1376
+
1377
+ .vd-listbox__item[aria-selected='true'] .vd-listbox__check {
1378
+ visibility: visible;
1379
+ }
1380
+
1381
+ /* The font menu: a search box on top, a list under it, names in their faces. */
1382
+ .vd-select__detail {
1383
+ flex: 0 1 auto;
1384
+ min-width: 0;
1385
+ overflow: hidden;
1386
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1387
+ font-size: 11px;
1388
+ text-overflow: ellipsis;
1389
+ white-space: nowrap;
1390
+ }
1391
+
1392
+ .vd-listbox--search {
1393
+ display: flex;
1394
+ flex-direction: column;
1395
+ gap: 4px;
1396
+ width: 100%;
1397
+ max-height: 320px;
1398
+ overflow: hidden;
1399
+ }
1400
+
1401
+ .vd-listbox--search[hidden] {
1402
+ display: none;
1403
+ }
1404
+
1405
+ .vd-listbox__search {
1406
+ box-sizing: border-box;
1407
+ flex: 0 0 auto;
1408
+ height: 28px;
1409
+ padding: 0 8px;
1410
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1411
+ border-radius: 6px;
1412
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
1413
+ color: inherit;
1414
+ font: inherit;
1415
+ outline: none;
1416
+ }
1417
+
1418
+ .vd-listbox__search:focus {
1419
+ border-color: var(--vd-accent, #3b82f6);
1420
+ }
1421
+
1422
+ .vd-listbox__list {
1423
+ flex: 1 1 auto;
1424
+ min-height: 0;
1425
+ margin: 0;
1426
+ padding: 0;
1427
+ overflow-y: auto;
1428
+ list-style: none;
1429
+ }
1430
+
1431
+ .vd-listbox__label {
1432
+ flex: 1 1 auto;
1433
+ min-width: 0;
1434
+ overflow: hidden;
1435
+ font-size: 13px;
1436
+ text-overflow: ellipsis;
1437
+ }
1438
+
1439
+ .vd-listbox__detail {
1440
+ flex: 0 1 auto;
1441
+ min-width: 0;
1442
+ overflow: hidden;
1443
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1444
+ font-size: 11px;
1445
+ text-overflow: ellipsis;
1446
+ }
1447
+
1448
+ .vd-listbox__group {
1449
+ padding: 8px 6px 4px;
1450
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1451
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1452
+ font-size: 10px;
1453
+ letter-spacing: 0.06em;
1454
+ text-transform: uppercase;
1455
+ }
1456
+
1457
+ .vd-listbox__group:first-child {
1458
+ padding-top: 2px;
1459
+ }
1460
+
1461
+ .vd-listbox__none {
1462
+ padding: 8px 6px;
1463
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1464
+ }
1465
+
1466
+ /* "Selection · 5 characters": the fields below edit those, not the box. */
1467
+ .vd-inspector__id--run {
1468
+ color: var(--vd-ink, #1a1a1f);
1469
+ font-family: inherit;
1470
+ font-weight: 500;
1471
+ }
1472
+
1473
+ /* A flag: its label on the left in full, the switch on the right. */
1474
+ .vd-field--toggle {
1475
+ justify-content: space-between;
1476
+ gap: 8px;
1477
+ min-height: 28px;
1478
+ flex-wrap: nowrap;
1479
+ }
1480
+
1481
+ .vd-field--toggle > .vd-field__label {
1482
+ position: static;
1483
+ width: auto;
1484
+ height: auto;
1485
+ overflow: hidden;
1486
+ clip: auto;
1487
+ text-overflow: ellipsis;
1488
+ }
1489
+
1490
+ .vd-switch {
1491
+ position: relative;
1492
+ flex: 0 0 auto;
1493
+ width: 28px;
1494
+ height: 16px;
1495
+ margin: 0;
1496
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.2));
1497
+ border-radius: 8px;
1498
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.06));
1499
+ appearance: none;
1500
+ cursor: default;
1501
+ transition: background 120ms ease, border-color 120ms ease;
1502
+ }
1503
+
1504
+ .vd-switch::after {
1505
+ content: '';
1506
+ position: absolute;
1507
+ top: 2px;
1508
+ left: 2px;
1509
+ width: 10px;
1510
+ height: 10px;
1511
+ border-radius: 50%;
1512
+ background: var(--vd-muted, rgb(0 0 0 / 0.55));
1513
+ transition: transform 120ms ease, background 120ms ease;
1514
+ }
1515
+
1516
+ .vd-switch:checked {
1517
+ border-color: var(--vd-chosen, var(--vd-ink, #1a1a1f));
1518
+ background: var(--vd-chosen, var(--vd-ink, #1a1a1f));
1519
+ }
1520
+
1521
+ .vd-switch:checked::after {
1522
+ transform: translateX(12px);
1523
+ background: var(--vd-on-chosen, #ffffff);
1524
+ }
1525
+
1526
+ .vd-switch:indeterminate::after {
1527
+ transform: translateX(6px);
1528
+ }
1529
+
1530
+ .vd-switch:focus-visible {
1531
+ outline: 2px solid var(--vd-accent, #3b82f6);
1532
+ outline-offset: 2px;
1533
+ }
1534
+
1535
+ @media (prefers-reduced-motion: reduce) {
1536
+ .vd-switch,
1537
+ .vd-switch::after {
1538
+ transition: none;
1539
+ }
1540
+ }
1541
+
1542
+ /* Suggestions while typing an expression: a list under the box. */
1543
+ .vd-suggest {
1544
+ position: absolute;
1545
+ z-index: 5;
1546
+ top: calc(100% + 4px);
1547
+ left: 0;
1548
+ right: 0;
1549
+ max-height: 232px;
1550
+ margin: 0;
1551
+ padding: 4px;
1552
+ overflow-y: auto;
1553
+ list-style: none;
1554
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1555
+ border-radius: 8px;
1556
+ background: var(--vd-surface-raised, #ffffff);
1557
+ }
1558
+
1559
+ .vd-suggest__item {
1560
+ display: flex;
1561
+ align-items: center;
1562
+ gap: 8px;
1563
+ min-height: 26px;
1564
+ padding: 0 8px;
1565
+ border-radius: 5px;
1566
+ cursor: default;
1567
+ }
1568
+
1569
+ .vd-suggest__item[aria-selected='true'] {
1570
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.05));
1571
+ box-shadow: inset 0 0 0 1px var(--vd-rule, rgb(0 0 0 / 0.12));
1572
+ }
1573
+
1574
+ .vd-suggest__swatch {
1575
+ flex: 0 0 auto;
1576
+ width: 12px;
1577
+ height: 12px;
1578
+ border: 1px solid rgb(0 0 0 / 0.15);
1579
+ border-radius: 3px;
1580
+ }
1581
+
1582
+ .vd-suggest__label {
1583
+ flex: 1 1 auto;
1584
+ min-width: 0;
1585
+ overflow: hidden;
1586
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1587
+ font-size: 11.5px;
1588
+ text-overflow: ellipsis;
1589
+ white-space: nowrap;
1590
+ }
1591
+
1592
+ /* The sigil carries the kind: amber for tokens, as bound values are. */
1593
+ .vd-suggest__item[data-kind='token'] .vd-suggest__label {
1594
+ color: var(--vd-bound-ink, #8a6100);
1595
+ }
1596
+
1597
+ .vd-suggest__detail {
1598
+ flex: 0 1 auto;
1599
+ min-width: 0;
1600
+ overflow: hidden;
1601
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1602
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1603
+ font-size: 10.5px;
1604
+ text-overflow: ellipsis;
1605
+ white-space: nowrap;
1606
+ }
1607
+
1608
+ /* A swatch that opens the picker. */
1609
+ button.vd-field__swatch {
1610
+ padding: 0;
1611
+ appearance: none;
1612
+ cursor: pointer;
1613
+ }
1614
+
1615
+ button.vd-field__swatch:focus-visible {
1616
+ outline: 2px solid var(--vd-accent, #3b82f6);
1617
+ outline-offset: 1px;
1618
+ }
1619
+
1620
+ /* No colour: a hollow square with a quiet slash, still there to press. It is a
1621
+ state, not an error, so it is muted rather than red. */
1622
+ .vd-field__swatch--empty {
1623
+ background: linear-gradient(
1624
+ to top right,
1625
+ transparent calc(50% - 0.75px),
1626
+ var(--vd-muted, rgb(0 0 0 / 0.55)) calc(50% - 0.75px),
1627
+ var(--vd-muted, rgb(0 0 0 / 0.55)) calc(50% + 0.75px),
1628
+ transparent calc(50% + 0.75px)
1629
+ );
1630
+ }
1631
+
1632
+ /* --- colour picker -------------------------------------------------------- */
1633
+
1634
+ /* The gradient editor: the stops on a bar, the angle on a dial or the centre on
1635
+ a pad, and the selected stop's place. */
1636
+ .vd-picker__gradient-editor {
1637
+ display: flex;
1638
+ flex-direction: column;
1639
+ gap: 10px;
1640
+ }
1641
+
1642
+ .vd-picker__gradient-editor[hidden] {
1643
+ display: none;
1644
+ }
1645
+
1646
+ .vd-picker__stops {
1647
+ position: relative;
1648
+ height: 28px;
1649
+ margin: 0 8px;
1650
+ }
1651
+
1652
+ .vd-picker__track {
1653
+ position: absolute;
1654
+ inset: 4px -8px;
1655
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1656
+ border-radius: 6px;
1657
+ background:
1658
+ var(--vd-picker-gradient, transparent),
1659
+ repeating-conic-gradient(#d4d4d4 0 25%, #ffffff 0 50%) 0 0 / 8px 8px;
1660
+ cursor: copy;
1661
+ }
1662
+
1663
+ /* A stop: its colour in a square with a ring, centred on its place. */
1664
+ .vd-picker__stop {
1665
+ position: absolute;
1666
+ top: 2px;
1667
+ box-sizing: border-box;
1668
+ width: 16px;
1669
+ height: 24px;
1670
+ margin-left: -8px;
1671
+ padding: 0;
1672
+ border: 2px solid var(--vd-surface-raised, #ffffff);
1673
+ border-radius: 5px;
1674
+ background:
1675
+ linear-gradient(var(--vd-picker-stop, #000), var(--vd-picker-stop, #000)),
1676
+ repeating-conic-gradient(#d4d4d4 0 25%, #ffffff 0 50%) 0 0 / 6px 6px;
1677
+ /* A ring, not a shadow: an outline drawn just outside the white border. */
1678
+ outline: 1px solid var(--vd-rule, rgb(0 0 0 / 0.25));
1679
+ cursor: ew-resize;
1680
+ }
1681
+
1682
+ .vd-picker__stop[aria-pressed='true'],
1683
+ .vd-picker__stop:focus-visible {
1684
+ outline: 2px solid var(--vd-accent, #3b82f6);
1685
+ z-index: 1;
1686
+ }
1687
+
1688
+ .vd-picker__stop--leaving {
1689
+ opacity: 0.35;
1690
+ }
1691
+
1692
+ .vd-picker__shape,
1693
+ .vd-picker__stop-row {
1694
+ display: flex;
1695
+ align-items: center;
1696
+ gap: 8px;
1697
+ }
1698
+
1699
+ .vd-picker__stop-label {
1700
+ flex: 1 1 auto;
1701
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1702
+ font-size: 11px;
1703
+ }
1704
+
1705
+ .vd-picker__dial {
1706
+ position: relative;
1707
+ flex: 0 0 auto;
1708
+ box-sizing: border-box;
1709
+ width: 32px;
1710
+ height: 32px;
1711
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1712
+ border-radius: 50%;
1713
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
1714
+ cursor: grab;
1715
+ }
1716
+
1717
+ .vd-picker__dial:focus-visible,
1718
+ .vd-picker__pad:focus-visible {
1719
+ outline: 2px solid var(--vd-accent, #3b82f6);
1720
+ outline-offset: 1px;
1721
+ }
1722
+
1723
+ /* The hand points where the gradient goes: up at 0°, right at 90°. */
1724
+ .vd-picker__hand {
1725
+ position: absolute;
1726
+ top: 3px;
1727
+ left: calc(50% - 1px);
1728
+ width: 2px;
1729
+ height: 13px;
1730
+ border-radius: 1px;
1731
+ background: var(--vd-ink, #1a1a1f);
1732
+ transform-origin: 50% 100%;
1733
+ }
1734
+
1735
+ .vd-picker__angle,
1736
+ .vd-picker__position {
1737
+ box-sizing: border-box;
1738
+ flex: 0 0 64px;
1739
+ width: 64px;
1740
+ height: 26px;
1741
+ padding: 0 8px;
1742
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1743
+ border-radius: 6px;
1744
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
1745
+ color: inherit;
1746
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1747
+ font-size: 11.5px;
1748
+ outline: none;
1749
+ }
1750
+
1751
+ .vd-picker__angle:focus,
1752
+ .vd-picker__position:focus {
1753
+ border-color: var(--vd-accent, #3b82f6);
1754
+ }
1755
+
1756
+ .vd-picker__pad {
1757
+ position: relative;
1758
+ flex: 1 1 auto;
1759
+ height: 72px;
1760
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1761
+ border-radius: 6px;
1762
+ background:
1763
+ var(--vd-picker-gradient, transparent),
1764
+ repeating-conic-gradient(#d4d4d4 0 25%, #ffffff 0 50%) 0 0 / 8px 8px;
1765
+ cursor: crosshair;
1766
+ }
1767
+
1768
+ .vd-picker__icon {
1769
+ display: inline-flex;
1770
+ align-items: center;
1771
+ justify-content: center;
1772
+ flex: 0 0 26px;
1773
+ height: 26px;
1774
+ padding: 0;
1775
+ border: 0;
1776
+ border-radius: 6px;
1777
+ background: none;
1778
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1779
+ }
1780
+
1781
+ .vd-picker__icon svg {
1782
+ width: 14px;
1783
+ height: 14px;
1784
+ }
1785
+
1786
+ .vd-picker__icon:hover:not(:disabled) {
1787
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.06));
1788
+ color: var(--vd-ink, #1a1a1f);
1789
+ }
1790
+
1791
+ .vd-picker__icon:disabled {
1792
+ opacity: 0.35;
1793
+ }
1794
+
1795
+ /* Solid, Linear, Radial: the tabs over a paint that can be a gradient. */
1796
+ .vd-picker__kinds {
1797
+ flex: 0 0 auto;
1798
+ }
1799
+
1800
+ .vd-picker__custom {
1801
+ display: flex;
1802
+ flex-direction: column;
1803
+ gap: 8px;
1804
+ }
1805
+
1806
+ .vd-picker__custom[hidden],
1807
+ .vd-picker__save[hidden] {
1808
+ display: none;
1809
+ }
1810
+
1811
+
1812
+ .vd-picker {
1813
+ position: absolute;
1814
+ z-index: 6;
1815
+ top: calc(100% + 4px);
1816
+ left: 0;
1817
+ right: 0;
1818
+ min-width: 232px;
1819
+ box-sizing: border-box;
1820
+ display: flex;
1821
+ flex-direction: column;
1822
+ gap: 8px;
1823
+ padding: 10px;
1824
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1825
+ border-radius: 10px;
1826
+ background: var(--vd-surface-raised, #ffffff);
1827
+ color: var(--vd-ink, #1a1a1f);
1828
+ }
1829
+
1830
+ .vd-picker--inline {
1831
+ position: static;
1832
+ min-width: 0;
1833
+ margin-top: 8px;
1834
+ }
1835
+
1836
+ .vd-picker__head {
1837
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1838
+ font-size: 10.5px;
1839
+ font-weight: 500;
1840
+ text-transform: uppercase;
1841
+ letter-spacing: 0.06em;
1842
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1843
+ }
1844
+
1845
+ .vd-picker__filter,
1846
+ .vd-picker__inputs input,
1847
+ .vd-picker__save input {
1848
+ box-sizing: border-box;
1849
+ min-width: 0;
1850
+ height: 26px;
1851
+ padding: 0 8px;
1852
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1853
+ border-radius: 6px;
1854
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
1855
+ color: inherit;
1856
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1857
+ font-size: 11.5px;
1858
+ outline: none;
1859
+ }
1860
+
1861
+ .vd-picker__filter:focus,
1862
+ .vd-picker__inputs input:focus,
1863
+ .vd-picker__save input:focus {
1864
+ border-color: var(--vd-accent, #3b82f6);
1865
+ }
1866
+
1867
+ /* Tokens as colour rects: the expression shown as the colour it names. */
1868
+ .vd-picker__tokens {
1869
+ display: grid;
1870
+ grid-template-columns: repeat(auto-fill, minmax(22px, 1fr));
1871
+ gap: 6px;
1872
+ }
1873
+
1874
+ .vd-picker__token {
1875
+ aspect-ratio: 1;
1876
+ padding: 0;
1877
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1878
+ border-radius: 5px;
1879
+ cursor: pointer;
1880
+ }
1881
+
1882
+ .vd-picker__token[aria-pressed='true'],
1883
+ .vd-picker__token:focus-visible {
1884
+ outline: 2px solid var(--vd-accent, #3b82f6);
1885
+ outline-offset: 1px;
1886
+ }
1887
+
1888
+ .vd-picker__square {
1889
+ position: relative;
1890
+ height: 128px;
1891
+ border-radius: 6px;
1892
+ background-image:
1893
+ linear-gradient(to top, #000, transparent),
1894
+ linear-gradient(to right, #fff, transparent);
1895
+ touch-action: none;
1896
+ cursor: crosshair;
1897
+ }
1898
+
1899
+ .vd-picker__strip {
1900
+ position: relative;
1901
+ height: 12px;
1902
+ border-radius: 6px;
1903
+ touch-action: none;
1904
+ cursor: ew-resize;
1905
+ }
1906
+
1907
+ .vd-picker__hue {
1908
+ background: linear-gradient(
1909
+ to right,
1910
+ #f00 0%,
1911
+ #ff0 17%,
1912
+ #0f0 33%,
1913
+ #0ff 50%,
1914
+ #00f 67%,
1915
+ #f0f 83%,
1916
+ #f00 100%
1917
+ );
1918
+ }
1919
+
1920
+ /* Alpha over a checkerboard, so transparency reads as transparency. */
1921
+ .vd-picker__alpha {
1922
+ background:
1923
+ linear-gradient(to right, transparent, var(--vd-picker-solid, #000)),
1924
+ repeating-conic-gradient(#ccc 0 25%, #fff 0 50%) 0 0 / 8px 8px;
1925
+ }
1926
+
1927
+ .vd-picker__thumb {
1928
+ position: absolute;
1929
+ top: 50%;
1930
+ width: 12px;
1931
+ height: 12px;
1932
+ border: 2px solid #fff;
1933
+ border-radius: 50%;
1934
+ outline: 1px solid rgb(0 0 0 / 0.35);
1935
+ transform: translate(-50%, -50%);
1936
+ pointer-events: none;
1937
+ }
1938
+
1939
+ .vd-picker__square > .vd-picker__thumb {
1940
+ top: 0;
1941
+ }
1942
+
1943
+ .vd-picker__square:focus-visible,
1944
+ .vd-picker__strip:focus-visible {
1945
+ outline: 2px solid var(--vd-accent, #3b82f6);
1946
+ outline-offset: 2px;
1947
+ }
1948
+
1949
+ .vd-picker__inputs {
1950
+ display: flex;
1951
+ gap: 6px;
1952
+ }
1953
+
1954
+ .vd-picker__hex {
1955
+ flex: 1 1 auto;
1956
+ }
1957
+
1958
+ .vd-picker__percent {
1959
+ flex: 0 0 56px;
1960
+ width: 56px;
1961
+ }
1962
+
1963
+ .vd-picker__dropper {
1964
+ flex: 0 0 26px;
1965
+ height: 26px;
1966
+ padding: 0;
1967
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
1968
+ border-radius: 6px;
1969
+ display: inline-flex;
1970
+ align-items: center;
1971
+ justify-content: center;
1972
+ background: none;
1973
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
1974
+ cursor: pointer;
1975
+ }
1976
+
1977
+ .vd-picker__save {
1978
+ display: flex;
1979
+ flex-direction: column;
1980
+ gap: 4px;
1981
+ }
1982
+
1983
+ .vd-picker__error {
1984
+ color: var(--vd-error, #dc2626);
1985
+ line-height: 1.4;
1986
+ }
1987
+
1988
+ /* A small closed set, shown whole. */
1989
+ .vd-field--segmented {
1990
+ margin-bottom: 0;
1991
+ }
1992
+
1993
+ .vd-segmented {
1994
+ box-sizing: border-box;
1995
+ display: flex;
1996
+ flex: 1 1 0;
1997
+ min-width: 0;
1998
+ height: 28px;
1999
+ padding: 2px;
2000
+ gap: 2px;
2001
+ border: 1px solid var(--vd-rule, rgb(0 0 0 / 0.12));
2002
+ border-radius: 8px;
2003
+ background: var(--vd-input-bg, rgb(0 0 0 / 0.02));
2004
+ }
2005
+
2006
+ .vd-field--segmented > .vd-segmented {
2007
+ flex: 1 1 100%;
2008
+ }
2009
+
2010
+ .vd-segmented__option svg {
2011
+ width: 14px;
2012
+ height: 14px;
2013
+ }
2014
+
2015
+ .vd-segmented__option {
2016
+ display: inline-flex;
2017
+ align-items: center;
2018
+ justify-content: center;
2019
+ flex: 1 1 0;
2020
+ min-width: 0;
2021
+ padding: 0 4px;
2022
+ border: 0;
2023
+ border-radius: 6px;
2024
+ background: none;
2025
+ color: var(--vd-muted, rgb(0 0 0 / 0.55));
2026
+ font: inherit;
2027
+ font-size: 11px;
2028
+ cursor: default;
2029
+ }
2030
+
2031
+ .vd-segmented__option:hover {
2032
+ color: var(--vd-ink, #1a1a1f);
2033
+ }
2034
+
2035
+ .vd-segmented__option[aria-pressed='true'] {
2036
+ background: var(--vd-surface-raised, rgb(0 0 0 / 0.08));
2037
+ color: var(--vd-ink, #1a1a1f);
2038
+ box-shadow: inset 0 0 0 1px var(--vd-rule, rgb(0 0 0 / 0.12));
2039
+ }
2040
+
2041
+ /* --- context menu --------------------------------------------------------- */
2042
+
2043
+ .vd-menu {
2044
+ position: absolute;
2045
+ z-index: 3;
2046
+ min-width: 200px;
2047
+ padding: 4px;
2048
+ border-radius: 8px;
2049
+ background: var(--vd-chrome-bg, #202027);
2050
+ border: 1px solid rgb(255 255 255 / 0.08);
2051
+ box-shadow: var(--vd-chrome-shadow, 0 10px 30px rgb(0 0 0 / 0.35));
2052
+ font-family: var(--vd-font, system-ui, -apple-system, sans-serif);
2053
+ font-size: 12px;
2054
+ user-select: none;
2055
+ }
2056
+
2057
+ .vd-menu[hidden] {
2058
+ display: none;
2059
+ }
2060
+
2061
+ .vd-menu__item {
2062
+ display: flex;
2063
+ align-items: center;
2064
+ justify-content: space-between;
2065
+ gap: 24px;
2066
+ width: 100%;
2067
+ padding: 6px 10px;
2068
+ border: 0;
2069
+ border-radius: 5px;
2070
+ background: none;
2071
+ color: rgb(255 255 255 / 0.86);
2072
+ font: inherit;
2073
+ text-align: left;
2074
+ cursor: default;
2075
+ }
2076
+
2077
+ .vd-menu__item:hover:not(:disabled),
2078
+ .vd-menu__item:focus-visible {
2079
+ background: var(--vd-menu-active, var(--vd-accent, #3b82f6));
2080
+ color: var(--vd-menu-active-ink, #fff);
2081
+ outline: none;
2082
+ }
2083
+
2084
+ .vd-menu__item:disabled {
2085
+ color: rgb(255 255 255 / 0.28);
2086
+ }
2087
+
2088
+ /* The expression you are about to lose, or the shortcut that does the same. */
2089
+ .vd-menu__hint {
2090
+ color: rgb(255 255 255 / 0.4);
2091
+ font-family: var(--vd-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
2092
+ font-size: 11px;
2093
+ max-width: 190px;
2094
+ overflow: hidden;
2095
+ text-overflow: ellipsis;
2096
+ white-space: nowrap;
2097
+ }
2098
+
2099
+ .vd-menu__item:hover:not(:disabled) .vd-menu__hint,
2100
+ .vd-menu__item:focus-visible .vd-menu__hint {
2101
+ color: rgb(255 255 255 / 0.75);
2102
+ }
2103
+
2104
+ .vd-menu__separator {
2105
+ height: 1px;
2106
+ margin: 4px 6px;
2107
+ background: rgb(255 255 255 / 0.1);
2108
+ }
2109
+
2110
+ /* --- floating toolbar ----------------------------------------------------- */
2111
+
2112
+ .vd-chrome {
2113
+ position: absolute;
2114
+ left: 50%;
2115
+ bottom: 20px;
2116
+ transform: translateX(-50%);
2117
+ z-index: 5;
2118
+ display: flex;
2119
+ align-items: center;
2120
+ gap: 2px;
2121
+ padding: 5px;
2122
+ border-radius: 12px;
2123
+ border: 1px solid rgb(255 255 255 / 0.08);
2124
+ background: var(--vd-chrome-bg, #2c2c33);
2125
+ box-shadow: var(
2126
+ --vd-chrome-shadow,
2127
+ 0 1px 2px rgb(0 0 0 / 0.3),
2128
+ 0 10px 30px rgb(0 0 0 / 0.35)
2129
+ );
2130
+ color: var(--vd-chrome-ink, #d8d8de);
2131
+ user-select: none;
2132
+ }
2133
+
2134
+ .vd-chrome__tool {
2135
+ display: grid;
2136
+ place-items: center;
2137
+ width: 32px;
2138
+ height: 32px;
2139
+ padding: 0;
2140
+ border: 0;
2141
+ border-radius: 8px;
2142
+ background: transparent;
2143
+ color: inherit;
2144
+ cursor: pointer;
2145
+ }
2146
+
2147
+ .vd-chrome__tool:hover:not(:disabled) {
2148
+ background: rgb(255 255 255 / 0.09);
2149
+ color: #fff;
2150
+ }
2151
+
2152
+ .vd-chrome__tool[aria-pressed='true'] {
2153
+ background: var(--vd-chrome-active, var(--vd-accent, #3b82f6));
2154
+ color: var(--vd-chrome-active-ink, #fff);
2155
+ }
2156
+
2157
+ .vd-chrome__tool:disabled {
2158
+ opacity: 0.32;
2159
+ cursor: default;
2160
+ }
2161
+
2162
+ .vd-chrome__divider {
2163
+ width: 1px;
2164
+ height: 20px;
2165
+ margin: 0 4px;
2166
+ background: rgb(255 255 255 / 0.12);
2167
+ }
2168
+
2169
+ .vd-chrome__zoom {
2170
+ min-width: 54px;
2171
+ height: 32px;
2172
+ padding: 0 8px;
2173
+ border: 0;
2174
+ border-radius: 8px;
2175
+ background: transparent;
2176
+ color: inherit;
2177
+ font: 500 12px/1 var(--vd-font, ui-sans-serif, system-ui, sans-serif);
2178
+ font-variant-numeric: tabular-nums;
2179
+ cursor: pointer;
2180
+ }
2181
+
2182
+ .vd-chrome__zoom:hover {
2183
+ background: rgb(255 255 255 / 0.09);
2184
+ color: #fff;
2185
+ }