aporia 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/style.css ADDED
@@ -0,0 +1,977 @@
1
+ /* Slider group - sliders with 4px gap */
2
+ .sliderGroup {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 4px;
6
+ min-width: 0;
7
+ }
8
+
9
+ /*
10
+ * Flex default min-width:auto uses content min size; an overstretched inner card
11
+ * could inflate this box and poison ResizeObserver-based base width. min-width:0
12
+ * keeps the track width equal to the column.
13
+ */
14
+ .sliderCardWrap {
15
+ width: 100%;
16
+ max-width: 100%;
17
+ min-width: 0;
18
+ position: relative;
19
+ overflow: visible;
20
+ }
21
+
22
+ /* ── Slider card ─────────────────────────────────────────────────────────── */
23
+
24
+ .sliderCard {
25
+ position: relative;
26
+ height: 37px;
27
+ border-radius: 12px;
28
+ background: var(--slider-surface);
29
+ box-shadow: inset 0 0 0 0.5px var(--slider-rim);
30
+ overflow: hidden;
31
+ transition: background-color 0.2s ease-out;
32
+ cursor: pointer;
33
+ display: flex;
34
+ align-items: center;
35
+ /* Figma: 10px top/bottom + ~17px label line ≈ 37px total; 12px matches horizontal inset */
36
+ padding: 10px 12px;
37
+ box-sizing: border-box;
38
+ max-width: none;
39
+ user-select: none;
40
+ -webkit-user-select: none;
41
+ -moz-user-select: none;
42
+ -webkit-user-drag: none;
43
+ }
44
+
45
+ .sliderCard[data-active='true'] {
46
+ background: var(--slider-surface-active);
47
+ }
48
+
49
+ /* Dev-only: thumb overlap heuristic (tint) vs real DOM (outlines) */
50
+ .sliderDebugOverlap {
51
+ position: absolute;
52
+ inset: 0;
53
+ pointer-events: none;
54
+ z-index: 1;
55
+ }
56
+
57
+ .sliderDebugOverlap__heuristic {
58
+ position: absolute;
59
+ top: 0;
60
+ bottom: 0;
61
+ left: 0;
62
+ box-sizing: border-box;
63
+ }
64
+
65
+ .sliderDebugOverlap__heuristic--label {
66
+ background: var(--slider-debug-label-tint);
67
+ }
68
+
69
+ .sliderDebugOverlap__heuristic--value {
70
+ right: 0;
71
+ left: auto;
72
+ width: auto;
73
+ background: var(--slider-debug-value-tint);
74
+ }
75
+
76
+ .sliderDebugOverlap__dom {
77
+ position: absolute;
78
+ box-sizing: border-box;
79
+ border: 2px solid var(--slider-debug-dom-label);
80
+ background: transparent;
81
+ box-shadow: 0 0 0 1px var(--slider-debug-dom-shadow);
82
+ }
83
+
84
+ .sliderDebugOverlap__dom--value {
85
+ border-color: var(--slider-debug-dom-value);
86
+ }
87
+
88
+ /* Filled track — 12px rounding on both ends of the progress pill */
89
+ .sliderTrack {
90
+ position: absolute;
91
+ inset: 0;
92
+ right: auto;
93
+ background: var(--slider-track);
94
+ border-radius: 12px;
95
+ pointer-events: none;
96
+ transition: background-color 0.2s ease-out;
97
+ }
98
+
99
+ .sliderTrack[data-active='true'] {
100
+ background: var(--slider-track-active);
101
+ }
102
+
103
+ /* Tick marks — 10 dots, shown on hover */
104
+ .sliderTicks {
105
+ position: absolute;
106
+ top: 50%;
107
+ left: 12px;
108
+ right: 12px;
109
+ height: 10px;
110
+ transform: translateY(-50%);
111
+ display: flex;
112
+ justify-content: space-between;
113
+ align-items: center;
114
+ opacity: 0;
115
+ pointer-events: none;
116
+ z-index: 1;
117
+ }
118
+
119
+ .sliderTick {
120
+ width: 2px;
121
+ height: 2px;
122
+ flex-shrink: 0;
123
+ border-radius: 50%;
124
+ background: var(--slider-tick);
125
+ opacity: var(--slider-tick-layer-opacity);
126
+ }
127
+
128
+ /* Thumb — 2×16px; height shrinks to 10px when behind label (via motion) */
129
+ .sliderThumb {
130
+ position: absolute;
131
+ top: 50%;
132
+ width: 2px;
133
+ height: 16px;
134
+ border-radius: 999px;
135
+ background: var(--slider-thumb);
136
+ transform: translate(-100%, -50%);
137
+ pointer-events: none;
138
+ opacity: 0;
139
+ z-index: 3;
140
+ transition: background-color 0.15s ease-out;
141
+ }
142
+
143
+ .sliderThumb[data-dragging='true'] {
144
+ background: var(--slider-thumb-dragging);
145
+ }
146
+
147
+ .sliderLabel {
148
+ position: relative;
149
+ font-size: 14px;
150
+ font-weight: 400;
151
+ color: var(--slider-text-muted);
152
+ letter-spacing: 0.28px;
153
+ flex: 1;
154
+ min-width: 0;
155
+ z-index: 2;
156
+ pointer-events: none;
157
+ user-select: none;
158
+ }
159
+
160
+ /* Tight bounds for overlap math (parent flex:1 can be wider than glyphs) */
161
+ .sliderLabelText {
162
+ display: inline;
163
+ }
164
+
165
+ .sliderValueText {
166
+ display: inline;
167
+ }
168
+
169
+ /* Invisible copy of value text + typography — used to size the edit field to content */
170
+ .sliderValueMeasure {
171
+ position: absolute;
172
+ left: 0;
173
+ top: 0;
174
+ visibility: hidden;
175
+ pointer-events: none;
176
+ white-space: pre;
177
+ height: 0;
178
+ overflow: hidden;
179
+ text-decoration: none;
180
+ }
181
+
182
+ .sliderValueZone {
183
+ position: absolute;
184
+ top: 0;
185
+ right: 0;
186
+ width: 72px;
187
+ height: 100%;
188
+ z-index: 3;
189
+ display: flex;
190
+ align-items: center;
191
+ justify-content: flex-end;
192
+ padding-right: 12px;
193
+ user-select: none;
194
+ -webkit-user-select: none;
195
+ -moz-user-select: none;
196
+ }
197
+
198
+ /* Value underline: 1px stroke; color fades with SliderRow motion (0.2s ease-out). */
199
+ .sliderValue {
200
+ font-size: 14px;
201
+ font-weight: 400;
202
+ color: var(--slider-text-muted);
203
+ letter-spacing: 0.28px;
204
+ white-space: nowrap;
205
+ cursor: text;
206
+ text-align: right;
207
+ font-variant-numeric: tabular-nums;
208
+ user-select: none;
209
+ text-decoration: underline;
210
+ text-decoration-color: transparent;
211
+ text-decoration-thickness: 1px;
212
+ text-underline-offset: 3px;
213
+ transition:
214
+ color 0.2s ease-out,
215
+ text-decoration-color 0.2s ease-out;
216
+ }
217
+
218
+ .sliderValue[data-active='true'] {
219
+ color: var(--slider-text);
220
+ }
221
+
222
+ .sliderValueZone:hover
223
+ .sliderValue:not(.sliderValueMeasure) {
224
+ text-decoration-color: currentColor;
225
+ }
226
+
227
+ /* After .sliderValue so width measurement isn’t affected by underline metrics */
228
+ .sliderValue.sliderValueMeasure {
229
+ text-decoration: none;
230
+ }
231
+
232
+ .sliderValueInput {
233
+ position: relative;
234
+ z-index: 4;
235
+ width: auto;
236
+ max-width: 100%;
237
+ min-width: 22px;
238
+ flex-shrink: 0;
239
+ background: transparent;
240
+ border: none;
241
+ border-radius: 0;
242
+ color: var(--slider-text);
243
+ font-family: inherit;
244
+ font-size: 14px;
245
+ font-weight: 400;
246
+ letter-spacing: 0.28px;
247
+ text-align: right;
248
+ outline: none;
249
+ padding: 0;
250
+ pointer-events: all;
251
+ font-variant-numeric: tabular-nums;
252
+ -moz-appearance: textfield;
253
+ user-select: text;
254
+ -webkit-user-select: text;
255
+ -moz-user-select: text;
256
+ text-decoration: underline;
257
+ text-decoration-color: transparent;
258
+ text-decoration-thickness: 1px;
259
+ text-underline-offset: 3px;
260
+ transition: text-decoration-color 0.2s ease-out;
261
+ }
262
+
263
+ .sliderValueInput:hover,
264
+ .sliderValueInput:focus {
265
+ text-decoration-color: currentColor;
266
+ }
267
+
268
+ .sliderValueInput::selection {
269
+ background: var(--slider-value-selection-bg);
270
+ color: var(--slider-value-selection-fg);
271
+ }
272
+
273
+ .sliderValueInput::-moz-selection {
274
+ background: var(--slider-value-selection-bg);
275
+ color: var(--slider-value-selection-fg);
276
+ }
277
+
278
+ .sliderValueInput::-webkit-inner-spin-button,
279
+ .sliderValueInput::-webkit-outer-spin-button {
280
+ -webkit-appearance: none;
281
+ margin: 0;
282
+ }
283
+
284
+ /* The actual range input — invisible, covers the full card */
285
+ .sliderInput {
286
+ position: absolute;
287
+ inset: 0;
288
+ width: 100%;
289
+ height: 100%;
290
+ opacity: 0;
291
+ cursor: pointer;
292
+ margin: 0;
293
+ z-index: 2;
294
+ touch-action: none;
295
+ user-select: none;
296
+ -webkit-user-select: none;
297
+ }
298
+ /* Stack above slider rows (they use z-index + transform layers). */
299
+ .swatchPopoverPortal {
300
+ position: relative;
301
+ z-index: 200000;
302
+ isolation: isolate;
303
+ }
304
+
305
+ .swatchPopoverPositioner {
306
+ z-index: 0;
307
+ }
308
+
309
+ /* Popover container - minimal styling, content controls its own appearance */
310
+ .swatchPopoverPopup {
311
+ position: relative;
312
+ z-index: 1;
313
+ min-width: 190px;
314
+ max-width: min(320px, calc(100vw - 24px));
315
+ padding: 0;
316
+ border-radius: 12px;
317
+ background: transparent;
318
+ color: var(--slider-text);
319
+ outline: none;
320
+ transform-origin: top right;
321
+ opacity: 1;
322
+ transform: translateY(0) scale(1);
323
+ transition:
324
+ opacity 0.2s ease-out,
325
+ transform 0.22s cubic-bezier(0.16, 1, 0.3, 1);
326
+ }
327
+
328
+ /* Open/close: Base UI sets these while mount/unmount transitions run */
329
+ .swatchPopoverPopup[data-starting-style],
330
+ .swatchPopoverPopup[data-ending-style] {
331
+ opacity: 0;
332
+ transform: translateY(-6px) scale(0.97);
333
+ }
334
+
335
+ .swatchPopoverPopup[data-instant] {
336
+ transition-duration: 0ms;
337
+ }
338
+
339
+ @media (prefers-reduced-motion: reduce) {
340
+ .swatchPopoverPopup {
341
+ transition-duration: 0.12s;
342
+ transition-property: opacity;
343
+ }
344
+
345
+ .swatchPopoverPopup[data-starting-style],
346
+ .swatchPopoverPopup[data-ending-style] {
347
+ transform: none;
348
+ }
349
+ }
350
+
351
+ .swatchPopoverTitle {
352
+ margin: 0 0 10px;
353
+ padding: 0;
354
+ font-size: 13px;
355
+ font-weight: 600;
356
+ letter-spacing: 0.02em;
357
+ color: var(--slider-text-muted);
358
+ }
359
+
360
+ .swatchPopoverBody {
361
+ font-size: 13px;
362
+ line-height: 1.45;
363
+ color: var(--slider-text-muted);
364
+ }
365
+
366
+ /* When containing a gradient picker, remove body styling */
367
+ .swatchPopoverBody:has(.gradientPicker) {
368
+ font-size: inherit;
369
+ line-height: inherit;
370
+ color: inherit;
371
+ }
372
+
373
+ .swatchPopoverBody p {
374
+ margin: 0 0 10px;
375
+ }
376
+
377
+ .swatchPopoverBody p:last-child {
378
+ margin-bottom: 0;
379
+ }
380
+
381
+ /* Screen-reader escape hatch for trap-focus (Base UI recommendation) */
382
+ .swatchPopoverCloseSrOnly {
383
+ position: absolute;
384
+ width: 1px;
385
+ height: 1px;
386
+ padding: 0;
387
+ margin: -1px;
388
+ overflow: hidden;
389
+ clip: rect(0, 0, 0, 0);
390
+ white-space: nowrap;
391
+ border: 0;
392
+ }
393
+
394
+ .swatchPopoverNativeColor {
395
+ display: block;
396
+ width: 100%;
397
+ height: 36px;
398
+ margin-top: 4px;
399
+ padding: 0;
400
+ border: none;
401
+ border-radius: 8px;
402
+ cursor: pointer;
403
+ background: transparent;
404
+ }
405
+
406
+ .swatchPopoverNativeColor::-webkit-color-swatch-wrapper {
407
+ padding: 2px;
408
+ }
409
+
410
+ .swatchPopoverNativeColor::-webkit-color-swatch {
411
+ border-radius: 6px;
412
+ border: 1px solid rgba(0, 0, 0, 0.15);
413
+ }
414
+
415
+ .swatchPopoverNativeColor::-moz-color-swatch {
416
+ border-radius: 6px;
417
+ border: 1px solid rgba(0, 0, 0, 0.15);
418
+ }
419
+ /* Same shell as SliderRow / ToggleRow */
420
+
421
+ .colorRowWrap {
422
+ width: 100%;
423
+ max-width: 100%;
424
+ min-width: 0;
425
+ position: relative;
426
+ overflow: visible;
427
+ }
428
+
429
+ .colorCard {
430
+ position: relative;
431
+ height: 37px;
432
+ border-radius: 12px;
433
+ background: var(--slider-surface);
434
+ box-shadow: inset 0 0 0 0.5px var(--slider-rim);
435
+ overflow: hidden;
436
+ transition: background-color 0.2s ease-out;
437
+ display: flex;
438
+ align-items: center;
439
+ padding: 10px 12px;
440
+ box-sizing: border-box;
441
+ user-select: none;
442
+ -webkit-user-select: none;
443
+ -moz-user-select: none;
444
+ }
445
+
446
+ .colorCard[data-active='true'] {
447
+ background: var(--slider-surface-active);
448
+ }
449
+
450
+ .colorLabel {
451
+ position: relative;
452
+ font-size: 14px;
453
+ font-weight: 400;
454
+ color: var(--slider-text-muted);
455
+ letter-spacing: 0.28px;
456
+ flex: 1;
457
+ min-width: 0;
458
+ z-index: 2;
459
+ pointer-events: none;
460
+ transition: color 0.2s ease-out;
461
+ }
462
+
463
+ .colorCard[data-active='true'] .colorLabel {
464
+ color: var(--slider-text);
465
+ }
466
+
467
+ /* Wider than slider value column: # + 6 hex + 8px gap + 16px swatch */
468
+ .colorValueZone {
469
+ position: absolute;
470
+ top: 0;
471
+ right: 0;
472
+ height: 100%;
473
+ z-index: 3;
474
+ display: flex;
475
+ align-items: center;
476
+ justify-content: flex-end;
477
+ gap: 8px;
478
+ padding-right: 12px;
479
+ min-width: 108px;
480
+ max-width: 50%;
481
+ }
482
+
483
+ /* Hex cluster — mirrors .sliderValue underline + hover rules */
484
+ .colorRowValue {
485
+ display: inline-flex;
486
+ align-items: baseline;
487
+ justify-content: flex-end;
488
+ font-size: 14px;
489
+ font-weight: 400;
490
+ letter-spacing: 0.28px;
491
+ white-space: nowrap;
492
+ cursor: text;
493
+ text-align: right;
494
+ font-variant-numeric: tabular-nums;
495
+ color: var(--slider-text-muted);
496
+ text-decoration: underline;
497
+ text-decoration-color: transparent;
498
+ text-decoration-thickness: 1px;
499
+ text-underline-offset: 3px;
500
+ transition:
501
+ color 0.2s ease-out,
502
+ text-decoration-color 0.2s ease-out;
503
+ min-width: 0;
504
+ }
505
+
506
+ .colorCard[data-active='true'] .colorRowValue {
507
+ color: var(--slider-text);
508
+ }
509
+
510
+ .colorValueZone:hover .colorRowValue {
511
+ text-decoration-color: currentColor;
512
+ }
513
+
514
+ .colorHexHash {
515
+ pointer-events: none;
516
+ user-select: none;
517
+ flex-shrink: 0;
518
+ }
519
+
520
+ .colorHexDigits {
521
+ pointer-events: none;
522
+ }
523
+
524
+ .colorHexInput {
525
+ width: 6.2ch;
526
+ min-width: 0;
527
+ padding: 0;
528
+ margin: 0;
529
+ border: none;
530
+ background: transparent;
531
+ font: inherit;
532
+ font-variant-numeric: tabular-nums;
533
+ letter-spacing: 0.28px;
534
+ color: var(--slider-text);
535
+ text-align: left;
536
+ outline: none;
537
+ text-decoration: underline;
538
+ text-decoration-color: transparent;
539
+ text-decoration-thickness: 1px;
540
+ text-underline-offset: 3px;
541
+ transition: text-decoration-color 0.2s ease-out;
542
+ cursor: text;
543
+ }
544
+
545
+ .colorHexInput:hover,
546
+ .colorHexInput:focus {
547
+ text-decoration-color: currentColor;
548
+ }
549
+
550
+ .colorHexInput::selection {
551
+ background: var(--slider-value-selection-bg);
552
+ color: var(--slider-value-selection-fg);
553
+ }
554
+
555
+ .colorHexInput::-moz-selection {
556
+ background: var(--slider-value-selection-bg);
557
+ color: var(--slider-value-selection-fg);
558
+ }
559
+
560
+ /* 16×16 swatch, native picker trigger; inset 0.5px black @ 20% */
561
+ .colorSwatchBtn {
562
+ flex-shrink: 0;
563
+ width: 16px;
564
+ height: 16px;
565
+ padding: 0;
566
+ border: none;
567
+ border-radius: 50%;
568
+ cursor: pointer;
569
+ box-shadow: inset 0 0 0 0.5px rgba(0, 0, 0, 0.2);
570
+ }
571
+
572
+ .colorSwatchBtn:focus-visible {
573
+ outline: 2px solid var(--slider-text-muted);
574
+ outline-offset: 2px;
575
+ }
576
+ /* Mirrors slider row geometry: full width, 37px pill, label + right control column */
577
+
578
+ .toggleRowWrap {
579
+ width: 100%;
580
+ max-width: 100%;
581
+ min-width: 0;
582
+ position: relative;
583
+ overflow: visible;
584
+ }
585
+
586
+ .toggleCard {
587
+ position: relative;
588
+ height: 37px;
589
+ border-radius: 12px;
590
+ background: var(--slider-surface);
591
+ box-shadow: inset 0 0 0 0.5px var(--slider-rim);
592
+ overflow: hidden;
593
+ transition: background-color 0.2s ease-out;
594
+ cursor: pointer;
595
+ display: flex;
596
+ align-items: center;
597
+ padding: 10px 12px;
598
+ box-sizing: border-box;
599
+ max-width: none;
600
+ user-select: none;
601
+ -webkit-user-select: none;
602
+ -moz-user-select: none;
603
+ -webkit-user-drag: none;
604
+ width: 100%;
605
+ font: inherit;
606
+ text-align: left;
607
+ color: inherit;
608
+ }
609
+
610
+ .toggleCard:hover {
611
+ background: var(--slider-surface-active);
612
+ }
613
+
614
+ .toggleCard:focus {
615
+ outline: none;
616
+ }
617
+
618
+ .toggleCard:focus-visible {
619
+ outline: 2px solid var(--slider-text-muted);
620
+ outline-offset: 2px;
621
+ }
622
+
623
+ .toggleLabel {
624
+ position: relative;
625
+ font-size: 14px;
626
+ font-weight: 400;
627
+ letter-spacing: 0.28px;
628
+ flex: 1;
629
+ min-width: 0;
630
+ z-index: 2;
631
+ pointer-events: none;
632
+ color: var(--slider-text-muted);
633
+ transition: color 0.2s ease-out;
634
+ }
635
+
636
+ .toggleCard:hover .toggleLabel,
637
+ .toggleCard[data-on='true'] .toggleLabel {
638
+ color: var(--slider-text);
639
+ }
640
+
641
+ .toggleControl {
642
+ position: absolute;
643
+ top: 0;
644
+ right: 0;
645
+ width: 72px;
646
+ height: 100%;
647
+ z-index: 3;
648
+ display: flex;
649
+ align-items: center;
650
+ justify-content: flex-end;
651
+ padding-right: 12px;
652
+ pointer-events: none;
653
+ }
654
+
655
+ /*
656
+ * 16×16 track (radius 5); thumb 8×14 (radius 4), 1px inset; 6px slide.
657
+ * Thumb uses opaque row-matched fills (see theme) so it stays visible on white ON track.
658
+ */
659
+ .toggleSwitch {
660
+ flex-shrink: 0;
661
+ pointer-events: none;
662
+ }
663
+
664
+ .toggleSwitch__track {
665
+ position: relative;
666
+ width: 16px;
667
+ height: 16px;
668
+ border-radius: 5px;
669
+ background: var(--slider-track);
670
+ transition: background-color 0.2s ease-out;
671
+ }
672
+
673
+ .toggleCard[data-on='true'] .toggleSwitch__track {
674
+ background: var(--slider-value-selection-bg);
675
+ }
676
+
677
+ .toggleSwitch__thumb {
678
+ position: absolute;
679
+ top: 1px;
680
+ left: 1px;
681
+ width: 8px;
682
+ height: 14px;
683
+ border-radius: 4px;
684
+ background: var(--toggle-thumb-row-bg);
685
+ transition:
686
+ transform 0.22s cubic-bezier(0.33, 1, 0.68, 1),
687
+ background-color 0.2s ease-out;
688
+ }
689
+
690
+ .toggleCard:hover .toggleSwitch__thumb {
691
+ background: var(--toggle-thumb-row-bg-hover);
692
+ }
693
+
694
+ .toggleCard[data-on='true'] .toggleSwitch__thumb {
695
+ transform: translateX(6px);
696
+ }
697
+ /* Container - exact Figma specs */
698
+ .gradientPicker {
699
+ display: flex;
700
+ flex-direction: column;
701
+ width: 190px;
702
+ background: #0a0a0a;
703
+ border: 1px solid rgba(255, 255, 255, 0.06);
704
+ border-radius: 12px;
705
+ }
706
+
707
+ /* Header row */
708
+ .gradientPickerHeader {
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: space-between;
712
+ padding: 6px 6px 2px 6px;
713
+ }
714
+
715
+ /* Left icons group (shuffle + invert) */
716
+ .gradientPickerHeaderIconsLeft {
717
+ display: flex;
718
+ align-items: center;
719
+ }
720
+
721
+ /* Icon button - 26x26 with centered 14x14 icon */
722
+ .gradientPickerIconBtn {
723
+ display: flex;
724
+ align-items: center;
725
+ justify-content: center;
726
+ width: 26px;
727
+ height: 26px;
728
+ padding: 0;
729
+ border: none;
730
+ border-radius: 6px;
731
+ background: transparent;
732
+ color: rgba(255, 255, 255, 0.7);
733
+ cursor: pointer;
734
+ transition: background-color 0.15s ease-out, color 0.15s ease-out;
735
+ }
736
+
737
+ .gradientPickerIconBtn svg {
738
+ width: 14px;
739
+ height: 14px;
740
+ display: block;
741
+ }
742
+
743
+ .gradientPickerIconBtn:hover {
744
+ background: #141414;
745
+ color: #ffffff;
746
+ }
747
+
748
+ .gradientPickerIconBtn:focus-visible {
749
+ outline: 2px solid rgba(255, 255, 255, 0.3);
750
+ outline-offset: 1px;
751
+ }
752
+
753
+ /* Stops list - no gap, rows are flush */
754
+ .gradientPickerStopsList {
755
+ display: flex;
756
+ flex-direction: column;
757
+ }
758
+
759
+ /* Individual stop row - no hover state */
760
+ .gradientPickerStop {
761
+ position: relative;
762
+ display: flex;
763
+ align-items: center;
764
+ height: 37px;
765
+ width: 100%;
766
+ border-radius: 12px;
767
+ overflow: hidden;
768
+ }
769
+
770
+ /* Color swatch + hex container - positioned absolutely with gap */
771
+ .gradientPickerStopColorHex {
772
+ position: absolute;
773
+ left: 12px;
774
+ top: 10px;
775
+ display: flex;
776
+ align-items: center;
777
+ gap: 8px;
778
+ }
779
+
780
+ /* Color swatch - 16px circle */
781
+ .gradientPickerStopSwatch {
782
+ flex-shrink: 0;
783
+ width: 16px;
784
+ height: 16px;
785
+ padding: 0;
786
+ border: none;
787
+ border-radius: 16px;
788
+ cursor: pointer;
789
+ box-shadow: inset 0 0 0 0.5px rgba(0, 0, 0, 0.2);
790
+ }
791
+
792
+ .gradientPickerStopSwatch:focus-visible {
793
+ outline: 2px solid rgba(255, 255, 255, 0.5);
794
+ outline-offset: 2px;
795
+ }
796
+
797
+ /* Hex text display - matches ColorRow styling */
798
+ .gradientPickerStopHex {
799
+ display: inline-flex;
800
+ align-items: baseline;
801
+ font-size: 14px;
802
+ font-weight: 400;
803
+ font-variant-numeric: tabular-nums;
804
+ letter-spacing: 0.28px;
805
+ white-space: nowrap;
806
+ color: rgba(255, 255, 255, 0.7);
807
+ cursor: text;
808
+ transition: color 0.2s ease-out;
809
+ }
810
+
811
+ /* Hash is not selectable */
812
+ .gradientPickerStopHexHash {
813
+ pointer-events: none;
814
+ user-select: none;
815
+ flex-shrink: 0;
816
+ }
817
+
818
+ /* Only the digits get the underline */
819
+ .gradientPickerStopHexDigits {
820
+ text-decoration: underline;
821
+ text-decoration-color: transparent;
822
+ text-decoration-thickness: 1px;
823
+ text-underline-offset: 3px;
824
+ transition: text-decoration-color 0.2s ease-out;
825
+ }
826
+
827
+ .gradientPickerStopHex:hover .gradientPickerStopHexDigits,
828
+ .gradientPickerStopHex:focus .gradientPickerStopHexDigits {
829
+ text-decoration-color: currentColor;
830
+ }
831
+
832
+ /* Wrapper for editing state with hash + input */
833
+ .gradientPickerStopHexWrap {
834
+ display: inline-flex;
835
+ align-items: baseline;
836
+ font-size: 14px;
837
+ font-weight: 400;
838
+ font-variant-numeric: tabular-nums;
839
+ letter-spacing: 0.28px;
840
+ color: rgba(255, 255, 255, 0.7);
841
+ }
842
+
843
+ /* Hex input when editing */
844
+ .gradientPickerStopHexInput {
845
+ width: 58px;
846
+ min-width: 0;
847
+ padding: 0;
848
+ margin: 0;
849
+ border: none;
850
+ background: transparent;
851
+ font: inherit;
852
+ font-size: 14px;
853
+ font-variant-numeric: tabular-nums;
854
+ letter-spacing: 0.28px;
855
+ color: #ffffff;
856
+ text-align: left;
857
+ outline: none;
858
+ cursor: text;
859
+ text-decoration: underline;
860
+ text-decoration-color: currentColor;
861
+ text-decoration-thickness: 1px;
862
+ text-underline-offset: 3px;
863
+ }
864
+
865
+ .gradientPickerStopHexInput::selection {
866
+ background: #ffffff;
867
+ color: #000000;
868
+ }
869
+
870
+ /* Delete/minus button - positioned absolutely */
871
+ .gradientPickerStopDelete {
872
+ position: absolute;
873
+ right: 12px;
874
+ top: 12px;
875
+ display: flex;
876
+ align-items: center;
877
+ justify-content: center;
878
+ width: 14px;
879
+ height: 14px;
880
+ padding: 0;
881
+ border: none;
882
+ background: transparent;
883
+ color: rgba(255, 255, 255, 0.7);
884
+ cursor: pointer;
885
+ transition: color 0.15s ease-out, opacity 0.15s ease-out;
886
+ }
887
+
888
+ .gradientPickerStopDelete:hover:not(:disabled) {
889
+ color: #ffffff;
890
+ }
891
+
892
+ .gradientPickerStopDelete:disabled {
893
+ opacity: 0.3;
894
+ cursor: not-allowed;
895
+ }
896
+
897
+ .gradientPickerStopDelete:focus-visible {
898
+ outline: 2px solid rgba(255, 255, 255, 0.5);
899
+ outline-offset: 2px;
900
+ }
901
+ /* Same shell as ColorRow; swatch only (no hex column). */
902
+
903
+ .gradientRowWrap {
904
+ width: 100%;
905
+ max-width: 100%;
906
+ min-width: 0;
907
+ position: relative;
908
+ overflow: visible;
909
+ }
910
+
911
+ .gradientCard {
912
+ position: relative;
913
+ height: 37px;
914
+ border-radius: 12px;
915
+ background: var(--slider-surface);
916
+ box-shadow: inset 0 0 0 0.5px var(--slider-rim);
917
+ overflow: hidden;
918
+ transition: background-color 0.2s ease-out;
919
+ display: flex;
920
+ align-items: center;
921
+ padding: 10px 12px;
922
+ box-sizing: border-box;
923
+ user-select: none;
924
+ -webkit-user-select: none;
925
+ -moz-user-select: none;
926
+ }
927
+
928
+ .gradientCard[data-active='true'] {
929
+ background: var(--slider-surface-active);
930
+ }
931
+
932
+ .gradientLabel {
933
+ position: relative;
934
+ font-size: 14px;
935
+ font-weight: 400;
936
+ color: var(--slider-text-muted);
937
+ letter-spacing: 0.28px;
938
+ flex: 1;
939
+ min-width: 0;
940
+ z-index: 2;
941
+ pointer-events: none;
942
+ transition: color 0.2s ease-out;
943
+ }
944
+
945
+ .gradientCard[data-active='true'] .gradientLabel {
946
+ color: var(--slider-text);
947
+ }
948
+
949
+ .gradientSwatchZone {
950
+ position: absolute;
951
+ top: 0;
952
+ right: 0;
953
+ height: 100%;
954
+ z-index: 3;
955
+ display: flex;
956
+ align-items: center;
957
+ justify-content: flex-end;
958
+ padding-right: 12px;
959
+ min-width: 28px;
960
+ }
961
+
962
+ /* 16×16 circle, same inner stroke as ColorRow swatch */
963
+ .gradientSwatchBtn {
964
+ flex-shrink: 0;
965
+ width: 16px;
966
+ height: 16px;
967
+ padding: 0;
968
+ border: none;
969
+ border-radius: 50%;
970
+ cursor: pointer;
971
+ box-shadow: inset 0 0 0 0.5px rgba(0, 0, 0, 0.2);
972
+ }
973
+
974
+ .gradientSwatchBtn:focus-visible {
975
+ outline: 2px solid var(--slider-text-muted);
976
+ outline-offset: 2px;
977
+ }