@xsynaptic/sonic-ui 0.24.0 → 0.25.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 (111) hide show
  1. package/CHANGELOG.md +34 -2
  2. package/README.md +5 -3
  3. package/dist/default/define/region.js +7 -0
  4. package/dist/default/define.js +1 -0
  5. package/dist/default/elements/envelope.js +11 -11
  6. package/dist/default/elements/form-element.js +10 -0
  7. package/dist/default/elements/readout.js +3 -2
  8. package/dist/default/elements/region-layer.js +251 -0
  9. package/dist/default/elements/region.js +157 -0
  10. package/dist/default/elements/sonic-element.js +26 -4
  11. package/dist/default/elements/split.js +2 -2
  12. package/dist/default/elements/toggle.js +2 -2
  13. package/dist/default/elements/value-element.js +9 -5
  14. package/dist/default/elements/value-gestures.js +7 -5
  15. package/dist/default/elements/wave-element.js +12 -3
  16. package/dist/default/elements/waveform.js +38 -2
  17. package/dist/default/elements/wavestrip.js +90 -17
  18. package/dist/default/elements/xy.js +3 -11
  19. package/dist/default/index.js +2 -1
  20. package/dist/default/lib/clock.js +1 -0
  21. package/dist/default/lib/drag-step.js +1 -1
  22. package/dist/default/lib/marker-band.js +40 -29
  23. package/dist/default/lib/region-drag.js +48 -0
  24. package/dist/default/lib/spoken-duration.js +3 -0
  25. package/dist/dev/define/region.d.ts +2 -0
  26. package/dist/dev/define/region.js +8 -0
  27. package/dist/dev/define/region.js.map +1 -0
  28. package/dist/dev/define.d.ts +3 -1
  29. package/dist/dev/define.js +1 -0
  30. package/dist/dev/elements/envelope.js +11 -11
  31. package/dist/dev/elements/envelope.js.map +1 -1
  32. package/dist/dev/elements/form-element.d.ts +1 -0
  33. package/dist/dev/elements/form-element.js +10 -0
  34. package/dist/dev/elements/form-element.js.map +1 -1
  35. package/dist/dev/elements/readout.js +3 -2
  36. package/dist/dev/elements/readout.js.map +1 -1
  37. package/dist/dev/elements/region-layer.js +252 -0
  38. package/dist/dev/elements/region-layer.js.map +1 -0
  39. package/dist/dev/elements/region.d.ts +29 -0
  40. package/dist/dev/elements/region.js +165 -0
  41. package/dist/dev/elements/region.js.map +1 -0
  42. package/dist/dev/elements/sonic-element.d.ts +1 -0
  43. package/dist/dev/elements/sonic-element.js +27 -5
  44. package/dist/dev/elements/sonic-element.js.map +1 -1
  45. package/dist/dev/elements/split.js +2 -2
  46. package/dist/dev/elements/split.js.map +1 -1
  47. package/dist/dev/elements/toggle.js +2 -2
  48. package/dist/dev/elements/toggle.js.map +1 -1
  49. package/dist/dev/elements/value-element.d.ts +3 -1
  50. package/dist/dev/elements/value-element.js +9 -5
  51. package/dist/dev/elements/value-element.js.map +1 -1
  52. package/dist/dev/elements/value-gestures.js +7 -5
  53. package/dist/dev/elements/value-gestures.js.map +1 -1
  54. package/dist/dev/elements/wave-element.d.ts +7 -1
  55. package/dist/dev/elements/wave-element.js +12 -3
  56. package/dist/dev/elements/wave-element.js.map +1 -1
  57. package/dist/dev/elements/waveform.d.ts +7 -0
  58. package/dist/dev/elements/waveform.js +38 -2
  59. package/dist/dev/elements/waveform.js.map +1 -1
  60. package/dist/dev/elements/wavestrip.d.ts +17 -1
  61. package/dist/dev/elements/wavestrip.js +90 -17
  62. package/dist/dev/elements/wavestrip.js.map +1 -1
  63. package/dist/dev/elements/xy.js +3 -11
  64. package/dist/dev/elements/xy.js.map +1 -1
  65. package/dist/dev/index.d.ts +3 -2
  66. package/dist/dev/index.js +2 -1
  67. package/dist/dev/lib/clock.js +1 -0
  68. package/dist/dev/lib/clock.js.map +1 -1
  69. package/dist/dev/lib/drag-step.js +1 -1
  70. package/dist/dev/lib/drag-step.js.map +1 -1
  71. package/dist/dev/lib/marker-band.d.ts +7 -0
  72. package/dist/dev/lib/marker-band.js +40 -29
  73. package/dist/dev/lib/marker-band.js.map +1 -1
  74. package/dist/dev/lib/region-drag.js +49 -0
  75. package/dist/dev/lib/region-drag.js.map +1 -0
  76. package/dist/dev/lib/spoken-duration.js +3 -0
  77. package/dist/dev/lib/spoken-duration.js.map +1 -1
  78. package/dist/styles/button.css +42 -15
  79. package/dist/styles/controls.css +1 -0
  80. package/dist/styles/dial.css +48 -33
  81. package/dist/styles/envelope.css +7 -6
  82. package/dist/styles/led.css +28 -13
  83. package/dist/styles/material/arc.css +2 -2
  84. package/dist/styles/material/cap.css +25 -15
  85. package/dist/styles/material/core.css +53 -1
  86. package/dist/styles/material/glass.css +12 -2
  87. package/dist/styles/material/groove.css +3 -3
  88. package/dist/styles/material/keycap.css +5 -5
  89. package/dist/styles/material/lens.css +1 -1
  90. package/dist/styles/material/pane.css +21 -11
  91. package/dist/styles/material/readout.css +23 -10
  92. package/dist/styles/material/{bracket.css → reticle.css} +15 -8
  93. package/dist/styles/material/scale.css +4 -4
  94. package/dist/styles/material/value.css +12 -3
  95. package/dist/styles/material/well.css +2 -2
  96. package/dist/styles/material.css +1 -1
  97. package/dist/styles/meter.css +24 -11
  98. package/dist/styles/number.css +2 -1
  99. package/dist/styles/panel.css +5 -6
  100. package/dist/styles/region.css +88 -0
  101. package/dist/styles/ring.css +5 -4
  102. package/dist/styles/screen.css +7 -5
  103. package/dist/styles/segmented.css +8 -7
  104. package/dist/styles/slider.css +40 -32
  105. package/dist/styles/spectrum.css +9 -1
  106. package/dist/styles/switch.css +52 -53
  107. package/dist/styles/toggle.css +33 -38
  108. package/dist/styles/waveform.css +5 -4
  109. package/dist/styles/wavestrip.css +15 -12
  110. package/dist/styles/xy.css +19 -19
  111. package/package.json +3 -2
@@ -66,8 +66,9 @@
66
66
  container-type: size;
67
67
  background: var(--_sonic-lens-bezel);
68
68
  border-radius: calc(var(--_sonic-meter-size) * var(--_sonic-meter-radius-ratio));
69
+ }
69
70
 
70
- &::after {
71
+ .sonic-meter::after {
71
72
  position: absolute;
72
73
  inset: 0;
73
74
  pointer-events: none;
@@ -75,7 +76,6 @@
75
76
  border-radius: inherit;
76
77
  box-shadow: var(--_sonic-groove);
77
78
  }
78
- }
79
79
 
80
80
  [orientation='horizontal'] > .sonic-meter {
81
81
  --_sonic-meter-toward: to right;
@@ -167,8 +167,10 @@
167
167
  position: absolute;
168
168
  inset: auto var(--_sonic-meter-inset) var(--_sonic-meter-inset);
169
169
  block-size: calc(var(--_sonic-meter-segments) - var(--_sonic-meter-gap));
170
- mask: var(--_sonic-meter-segment-mask);
171
- mask-composite: add;
170
+ -webkit-mask: var(--_sonic-meter-segment-mask);
171
+ mask: var(--_sonic-meter-segment-mask);
172
+ -webkit-mask-composite: source-over;
173
+ mask-composite: add;
172
174
  }
173
175
 
174
176
  :state(ladder) > .sonic-meter > :is(.sonic-meter-segments, .sonic-meter-bar) {
@@ -270,7 +272,7 @@
270
272
  :state(ladder) > .sonic-meter > .sonic-meter-bar::after {
271
273
  background: radial-gradient(
272
274
  circle var(--_sonic-meter-ladder-radius),
273
- rgb(from var(--_sonic-shine) r g b / calc(0.45 * var(--_sonic-relief))),
275
+ color-mix(in srgb, var(--_sonic-shine) calc(45% * var(--_sonic-relief)), transparent),
274
276
  transparent
275
277
  )
276
278
  0 100% / 100% var(--_sonic-meter-pitch) repeat-y;
@@ -321,7 +323,17 @@
321
323
  var(--_sonic-lit-warning) 0 var(--_sonic-meter-clip-at),
322
324
  var(--_sonic-lit-danger) 0
323
325
  );
324
- mask:
326
+ -webkit-mask:
327
+ linear-gradient(
328
+ var(--_sonic-meter-toward),
329
+ transparent var(--_sonic-meter-lit-from),
330
+ #000 0 var(--_sonic-meter-lit),
331
+ transparent 0 calc(var(--_sonic-meter-peak-hold-edge) - var(--_sonic-meter-pitch)),
332
+ #000 0 var(--_sonic-meter-peak-hold-edge),
333
+ transparent 0
334
+ ),
335
+ var(--_sonic-meter-segment-mask);
336
+ mask:
325
337
  linear-gradient(
326
338
  var(--_sonic-meter-toward),
327
339
  transparent var(--_sonic-meter-lit-from),
@@ -331,7 +343,8 @@
331
343
  transparent 0
332
344
  ),
333
345
  var(--_sonic-meter-segment-mask);
334
- mask-composite: intersect, add, add, add, add, add, add;
346
+ -webkit-mask-composite: source-in, source-over, source-over, source-over, source-over, source-over, source-over, xor;
347
+ mask-composite: intersect, add, add, add, add, add, add;
335
348
  }
336
349
 
337
350
  .sonic-meter-clip {
@@ -340,8 +353,9 @@
340
353
  block-size: var(--_sonic-meter-lens);
341
354
  background: var(--_sonic-lens);
342
355
  border-radius: 50%;
356
+ }
343
357
 
344
- &::after {
358
+ .sonic-meter-clip::after {
345
359
  position: absolute;
346
360
  inset: 0;
347
361
  content: '';
@@ -353,7 +367,6 @@
353
367
  border-radius: inherit;
354
368
  opacity: var(--_sonic-meter-clipped, 0);
355
369
  }
356
- }
357
370
 
358
371
  :is([value], :state(ladder)) > .sonic-meter > .sonic-meter-clip {
359
372
  display: none;
@@ -370,12 +383,12 @@
370
383
  .sonic-meter {
371
384
  forced-color-adjust: none;
372
385
  background: Canvas;
386
+ }
373
387
 
374
- &::after {
388
+ .sonic-meter::after {
375
389
  border: 1px solid CanvasText;
376
390
  box-shadow: none;
377
391
  }
378
- }
379
392
 
380
393
  :is(.sonic-meter-segments, .sonic-meter-clip) {
381
394
  background: var(--_sonic-unlit);
@@ -47,7 +47,8 @@
47
47
  line-height: 1;
48
48
  touch-action: var(--sonic-touch-action, pan-x);
49
49
  cursor: ns-resize;
50
- user-select: none;
50
+ -webkit-user-select: none;
51
+ user-select: none;
51
52
  box-shadow: var(--_sonic-focus-shadow);
52
53
  }
53
54
 
@@ -29,14 +29,14 @@
29
29
  box-shadow:
30
30
  inset var(--_sonic-cast-x) var(--_sonic-cast-y)
31
31
  max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth))
32
- rgb(from var(--_sonic-shine) r g b / calc(0.07 * var(--_sonic-relief))),
32
+ color-mix(in srgb, var(--_sonic-shine) calc(7% * var(--_sonic-relief)), transparent),
33
33
  inset calc(-1 * var(--_sonic-cast-x)) calc(-1 * var(--_sonic-cast-y))
34
34
  max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth))
35
- rgb(from var(--_sonic-shade) r g b / calc(0.35 * var(--_sonic-relief))),
35
+ color-mix(in srgb, var(--_sonic-shade) calc(35% * var(--_sonic-relief)), transparent),
36
36
  calc(2 * sin(var(--_sonic-light-tilt)) * max(0px, var(--_sonic-panel-depth)))
37
37
  calc(2 * cos(var(--_sonic-light-tilt)) * max(0px, var(--_sonic-panel-depth)))
38
38
  calc(3 * max(0px, var(--_sonic-panel-depth)))
39
- rgb(from var(--_sonic-shade) r g b / calc(0.45 * var(--_sonic-relief)));
39
+ color-mix(in srgb, var(--_sonic-shade) calc(45% * var(--_sonic-relief)), transparent);
40
40
  }
41
41
 
42
42
  .sonic-panel-title {
@@ -45,15 +45,14 @@
45
45
  align-items: center;
46
46
  margin: 0;
47
47
  white-space: nowrap;
48
+ }
48
49
 
49
- &::before,
50
- &::after {
50
+ .sonic-panel-title::before,.sonic-panel-title::after {
51
51
  flex: 1;
52
52
  min-inline-size: 1em;
53
53
  content: '';
54
54
  border-block-start: 1px solid var(--_sonic-panel-line);
55
55
  }
56
- }
57
56
 
58
57
  .sonic-panel-rule {
59
58
  align-self: stretch;
@@ -0,0 +1,88 @@
1
+ @layer sonic.material, sonic.control;
2
+
3
+ @layer sonic.control {
4
+ sonic-region {
5
+ display: none;
6
+ }
7
+
8
+ .sonic-region {
9
+ --_sonic-region-paint: var(--sonic-region-bracket, var(--_sonic-marker, var(--_sonic-ink)));
10
+ --_sonic-region-colour: var(--_sonic-region-paint);
11
+ --_sonic-region-bracket-width: var(
12
+ --sonic-region-bracket-width,
13
+ max(1px, round(var(--_sonic-unit), var(--_sonic-snap)))
14
+ );
15
+
16
+ position: absolute;
17
+ inset-block: 0;
18
+ inset-inline-start: calc(var(--_sonic-region-from, 0) * 100%);
19
+ inline-size: calc((var(--_sonic-region-to, 0) - var(--_sonic-region-from, 0)) * 100%);
20
+ min-inline-size: calc(2 * var(--_sonic-region-bracket-width));
21
+ pointer-events: none;
22
+ border-radius: var(--sonic-region-bracket-radius, calc(2 * var(--_sonic-unit)));
23
+ }
24
+
25
+ .sonic-region:focus-visible {
26
+ outline: 2px solid transparent;
27
+ outline-offset: var(--sonic-focus-outline-offset, -2px);
28
+ }
29
+
30
+ .sonic-region:focus-visible:not([data-sonic-pointer-focus]) {
31
+ outline: var(--sonic-focus-outline, 2px solid transparent);
32
+ box-shadow: var(--_sonic-focus-glow);
33
+ }
34
+
35
+ :is(.sonic-region[aria-disabled='true'], [dimmed] > .sonic-wavestrip .sonic-region) {
36
+ --_sonic-region-colour: color-mix(in oklab, var(--_sonic-region-paint) 45%, transparent);
37
+ }
38
+
39
+ .sonic-region-bracket {
40
+ position: absolute;
41
+ inset: 0;
42
+ box-sizing: border-box;
43
+ background: var(--sonic-region-fill, transparent);
44
+ border: var(--_sonic-region-bracket-width) solid var(--_sonic-region-colour);
45
+ border-radius: inherit;
46
+ }
47
+
48
+ .sonic-region[data-sonic-clipped~='start'] {
49
+ border-start-start-radius: 0;
50
+ border-end-start-radius: 0;
51
+ }
52
+
53
+ .sonic-region[data-sonic-clipped~='start'] > .sonic-region-bracket {
54
+ border-inline-start-width: 0;
55
+ }
56
+
57
+ .sonic-region[data-sonic-clipped~='end'] {
58
+ border-start-end-radius: 0;
59
+ border-end-end-radius: 0;
60
+ }
61
+
62
+ .sonic-region[data-sonic-clipped~='end'] > .sonic-region-bracket {
63
+ border-inline-end-width: 0;
64
+ }
65
+
66
+ @media (forced-colors: active) {
67
+ .sonic-region {
68
+ --_sonic-region-colour: CanvasText;
69
+ }
70
+
71
+ .sonic-region:focus-visible {
72
+ outline-offset: 2px;
73
+ }
74
+
75
+ .sonic-region[data-sonic-pointer-focus]:focus-visible {
76
+ outline-style: none;
77
+ }
78
+
79
+ :is(.sonic-region[aria-disabled='true'], [dimmed] > .sonic-wavestrip .sonic-region) {
80
+ --_sonic-region-colour: GrayText;
81
+ }
82
+
83
+ .sonic-region-bracket {
84
+ forced-color-adjust: none;
85
+ background: none;
86
+ }
87
+ }
88
+ }
@@ -28,8 +28,9 @@
28
28
  var(--_sonic-ring-size) * (var(--_sonic-ring-ratio) + var(--_sonic-ring-gap-ratio))
29
29
  );
30
30
  border-radius: 50%;
31
+ }
31
32
 
32
- &::before {
33
+ .sonic-ring::before {
33
34
  --_sonic-arc-width: calc(var(--_sonic-ring-size) * var(--_sonic-ring-ratio));
34
35
  --_sonic-arc-inset: 0px;
35
36
 
@@ -49,17 +50,17 @@
49
50
  transparent 0
50
51
  );
51
52
  border-radius: 50%;
52
- mask: var(--_sonic-arc-mask);
53
+ -webkit-mask: var(--_sonic-arc-mask);
54
+ mask: var(--_sonic-arc-mask);
53
55
  }
54
56
 
55
57
  @media (forced-colors: active) {
56
- &::before {
58
+ .sonic-ring::before {
57
59
  --_sonic-arc-shade: none;
58
60
 
59
61
  forced-color-adjust: none;
60
62
  }
61
63
  }
62
- }
63
64
 
64
65
  .sonic-ring > :not(:defined),
65
66
  .sonic-ring > * > .sonic-button {
@@ -11,14 +11,16 @@
11
11
  --_sonic-screen-size: var(--sonic-screen-size, 2.5rem);
12
12
  --_sonic-screen-radius-ratio: var(--sonic-screen-radius-ratio, 0.15);
13
13
  --_sonic-screen-radius-own: calc(var(--_sonic-screen-size) * var(--sonic-screen-radius-ratio));
14
+ --_sonic-screen-radius: var(
15
+ --_sonic-screen-radius-own,
16
+ var(--sonic-radius, calc(var(--_sonic-screen-size) * var(--_sonic-screen-radius-ratio)))
17
+ );
14
18
  --_sonic-screen-inset-ratio: var(--sonic-screen-inset-ratio, 0.1);
19
+ --_sonic-screen-inset: calc(var(--_sonic-screen-size) * var(--_sonic-screen-inset-ratio));
15
20
  --_sonic-unit: calc(var(--_sonic-screen-size) / 32);
16
21
 
17
22
  min-block-size: var(--_sonic-screen-size);
18
- padding: calc(var(--_sonic-screen-size) * var(--_sonic-screen-inset-ratio));
19
- border-radius: var(
20
- --_sonic-screen-radius-own,
21
- var(--sonic-radius, calc(var(--_sonic-screen-size) * var(--_sonic-screen-radius-ratio)))
22
- );
23
+ padding: var(--_sonic-screen-inset);
24
+ border-radius: var(--_sonic-screen-radius);
23
25
  }
24
26
  }
@@ -65,7 +65,8 @@
65
65
  block-size: var(--_sonic-segmented-size);
66
66
  padding: var(--_sonic-segmented-gap);
67
67
  touch-action: pan-y;
68
- user-select: none;
68
+ -webkit-user-select: none;
69
+ user-select: none;
69
70
  background: var(--_sonic-well-floor);
70
71
  border-radius: var(--_sonic-segmented-corner);
71
72
  box-shadow: var(--_sonic-well);
@@ -166,16 +167,16 @@
166
167
 
167
168
  position: relative;
168
169
  padding-inline: calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-padding-ratio));
170
+ }
169
171
 
170
- & > * {
172
+ .sonic-segmented-cap > * {
171
173
  filter: var(--_sonic-engraving);
172
174
  }
173
175
 
174
- & > svg {
176
+ .sonic-segmented-cap > svg {
175
177
  inline-size: calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-icon-ratio));
176
178
  block-size: calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-icon-ratio));
177
179
  }
178
- }
179
180
 
180
181
  .sonic-segmented-option[aria-checked='true'] .sonic-segmented-cap > * {
181
182
  filter: var(--_sonic-engraving) var(--_sonic-legend-glow);
@@ -190,14 +191,14 @@
190
191
  --_sonic-skirt: var(--_sonic-lit);
191
192
  --_sonic-face: var(--_sonic-lit);
192
193
  --_sonic-ink: HighlightText;
194
+ }
193
195
 
194
- &:disabled {
196
+ .sonic-segmented-option[aria-checked='true']:disabled {
195
197
  --_sonic-ink: ButtonFace;
196
198
  }
197
199
 
198
- & .sonic-segmented-cap > * {
200
+ .sonic-segmented-option[aria-checked='true'] .sonic-segmented-cap > * {
199
201
  filter: none;
200
202
  }
201
- }
202
203
  }
203
204
  }
@@ -112,16 +112,20 @@
112
112
  container-type: size;
113
113
  touch-action: var(--sonic-touch-action, pan-y);
114
114
  cursor: var(--_sonic-slider-cursor);
115
- user-select: none;
115
+ -webkit-user-select: none;
116
+ user-select: none;
116
117
  transition:
117
118
  --_sonic-slider-groove-hovered var(--_sonic-fade-duration) ease-out
118
119
  var(--_sonic-slider-groove-hover-delay),
119
120
  --_sonic-slider-groove-held var(--_sonic-fade-duration) ease-out;
121
+ }
120
122
 
121
123
  @media (prefers-reduced-motion: reduce) {
124
+
125
+ .sonic-slider {
122
126
  transition: none;
123
- }
124
127
  }
128
+ }
125
129
 
126
130
  :where(:not(:disabled)) > .sonic-slider:focus-visible,
127
131
  :state(dragging) > .sonic-slider {
@@ -206,11 +210,14 @@
206
210
  1,
207
211
  1
208
212
  );
213
+ }
209
214
 
210
215
  @media (prefers-reduced-motion: reduce) {
216
+
217
+ :state(springing) > .sonic-slider {
211
218
  transition: none;
212
- }
213
219
  }
220
+ }
214
221
 
215
222
  [dimmed] > .sonic-slider {
216
223
  --_sonic-slider-lit: var(--_sonic-lit-off);
@@ -248,7 +255,15 @@
248
255
  var(--_sonic-etch) 0 var(--_sonic-unit),
249
256
  transparent 0 var(--_sonic-slider-notch-pitch)
250
257
  );
251
- mask: linear-gradient(
258
+ -webkit-mask: linear-gradient(
259
+ var(--_sonic-slider-across),
260
+ transparent 15%,
261
+ #000 0 calc(var(--_sonic-slider-notch-mid) - var(--_sonic-slider-notch-lip)),
262
+ transparent 0 calc(var(--_sonic-slider-notch-mid) + var(--_sonic-slider-notch-lip)),
263
+ #000 0 85%,
264
+ transparent 0
265
+ );
266
+ mask: linear-gradient(
252
267
  var(--_sonic-slider-across),
253
268
  transparent 15%,
254
269
  #000 0 calc(var(--_sonic-slider-notch-mid) - var(--_sonic-slider-notch-lip)),
@@ -269,8 +284,9 @@
269
284
 
270
285
  .sonic-slider-scale {
271
286
  font-size: calc(var(--_sonic-slider-size) * var(--_sonic-slider-scale-font-ratio));
287
+ }
272
288
 
273
- & > * {
289
+ .sonic-slider-scale > * {
274
290
  --_sonic-slider-scale-along: calc(
275
291
  var(--_sonic-slider-cap) / 2 + var(--_sonic-scale-at, 0) * var(--_sonic-slider-travel)
276
292
  );
@@ -280,23 +296,19 @@
280
296
  translate: -50% 0;
281
297
  }
282
298
 
283
- & > .sonic-scale-tick {
299
+ .sonic-slider-scale > .sonic-scale-tick {
284
300
  inline-size: var(--_sonic-unit);
285
301
  block-size: calc(var(--_sonic-slider-scale-band) * 0.4);
286
302
  }
287
- }
288
-
289
- [orientation='vertical'] > .sonic-slider > .sonic-slider-scale {
290
- & > * {
303
+ :is([orientation='vertical'] > .sonic-slider > .sonic-slider-scale) > * {
291
304
  inset: auto var(--_sonic-slider-scale-edge) var(--_sonic-slider-scale-along) auto;
292
305
  translate: 0 50%;
293
306
  }
294
307
 
295
- & > .sonic-scale-tick {
308
+ :is([orientation='vertical'] > .sonic-slider > .sonic-slider-scale) > .sonic-scale-tick {
296
309
  inline-size: calc(var(--_sonic-slider-scale-band) * 0.4);
297
310
  block-size: var(--_sonic-unit);
298
311
  }
299
- }
300
312
 
301
313
  .sonic-slider-groove {
302
314
  --_sonic-slider-lit-to: var(--_sonic-slider-played, var(--_sonic-slider-value, 0));
@@ -314,12 +326,13 @@
314
326
  transparent
315
327
  calc(
316
328
  var(--_sonic-slider-lit-low) * var(--_sonic-slider-travel) +
317
- var(--_sonic-slider-groove-end) * sign(var(--_sonic-slider-lit-low))
329
+ var(--_sonic-slider-groove-end) * clamp(0, var(--_sonic-slider-lit-low) * 100000, 1)
318
330
  ),
319
331
  var(--_sonic-slider-lit) 0
320
332
  calc(
321
333
  var(--_sonic-slider-lit-high) * var(--_sonic-slider-travel) +
322
- var(--_sonic-slider-groove-end) * (2 - sign(1 - var(--_sonic-slider-lit-high)))
334
+ var(--_sonic-slider-groove-end) *
335
+ (2 - clamp(0, (1 - var(--_sonic-slider-lit-high)) * 100000, 1))
323
336
  ),
324
337
  transparent 0
325
338
  ),
@@ -401,41 +414,37 @@
401
414
 
402
415
  display: block;
403
416
  background: color-mix(in oklab, var(--_sonic-slider-modulation) 50%, transparent);
417
+ }
404
418
 
405
- &::before,
406
- &::after {
419
+ :is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::before,:is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::after {
407
420
  position: absolute;
408
421
  content: '';
409
422
  }
410
423
 
411
- &::before {
424
+ :is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::before {
412
425
  inset: 0 auto 0 var(--_sonic-slider-live-start);
413
426
  inline-size: var(--_sonic-slider-live-length);
414
427
  background: var(--_sonic-slider-modulation);
415
428
  border-radius: inherit;
416
429
  }
417
430
 
418
- &::after {
431
+ :is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::after {
419
432
  inset: var(--_sonic-slider-tick-overhang) auto var(--_sonic-slider-tick-overhang)
420
433
  var(--_sonic-slider-tick-start);
421
434
  inline-size: var(--_sonic-unit);
422
435
  background: var(--_sonic-slider-modulation-tick);
423
436
  }
424
- }
425
-
426
- :where([orientation='vertical']):state(modulated) > .sonic-slider > .sonic-slider-modulation {
427
- &::before {
437
+ :is(:where([orientation='vertical']):state(modulated) > .sonic-slider > .sonic-slider-modulation)::before {
428
438
  inset: auto 0 var(--_sonic-slider-live-start);
429
439
  inline-size: auto;
430
440
  block-size: var(--_sonic-slider-live-length);
431
441
  }
432
442
 
433
- &::after {
443
+ :is(:where([orientation='vertical']):state(modulated) > .sonic-slider > .sonic-slider-modulation)::after {
434
444
  inset: auto var(--_sonic-slider-tick-overhang) var(--_sonic-slider-tick-start);
435
445
  inline-size: auto;
436
446
  block-size: var(--_sonic-unit);
437
447
  }
438
- }
439
448
 
440
449
  .sonic-slider-cap {
441
450
  --_sonic-slider-indicator-width: calc(
@@ -464,41 +473,40 @@
464
473
  var(--_sonic-rim),
465
474
  var(--_sonic-focus-shadow);
466
475
  translate: var(--_sonic-slider-offset) 0;
476
+ }
467
477
 
468
- &::before,
469
- &::after {
478
+ .sonic-slider-cap::before,.sonic-slider-cap::after {
470
479
  position: absolute;
471
480
  content: '';
472
481
  }
473
482
 
474
- &::before {
483
+ .sonic-slider-cap::before {
475
484
  inset: var(--_sonic-slider-bevel);
476
485
  background: var(--_sonic-face);
477
486
  border-radius: max(0px, var(--_sonic-slider-corner) - var(--_sonic-slider-bevel));
478
487
  box-shadow: var(--_sonic-face-shadow);
479
488
  }
480
489
 
481
- &::after {
490
+ .sonic-slider-cap::after {
482
491
  inset: var(--_sonic-slider-indicator-inset)
483
492
  calc(50% - var(--_sonic-slider-indicator-width) / 2);
484
493
  background: var(--_sonic-slider-indicator);
485
494
  border-radius: calc(var(--_sonic-slider-indicator-width) / 2);
486
495
  box-shadow: inset 0 0 calc(0.75 * var(--_sonic-unit))
487
- rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-relief)));
496
+ color-mix(in srgb, var(--_sonic-shade) calc(55% * var(--_sonic-relief)), transparent);
488
497
  }
489
- }
490
498
 
491
499
  [orientation='vertical'] > .sonic-slider > .sonic-slider-cap {
492
500
  inset: auto 0 0 var(--_sonic-slider-scale-band);
493
501
  inline-size: auto;
494
502
  block-size: var(--_sonic-slider-cap);
495
503
  translate: 0 calc(-1 * var(--_sonic-slider-offset));
504
+ }
496
505
 
497
- &::after {
506
+ :is([orientation='vertical'] > .sonic-slider > .sonic-slider-cap)::after {
498
507
  inset: calc(50% - var(--_sonic-slider-indicator-width) / 2)
499
508
  var(--_sonic-slider-indicator-inset);
500
509
  }
501
- }
502
510
 
503
511
  :disabled > .sonic-slider > .sonic-slider-cap::after {
504
512
  background: var(--_sonic-ink-disabled);
@@ -85,7 +85,8 @@
85
85
 
86
86
  /* The canvas's backing size would otherwise feed an intrinsically sized parent */
87
87
  contain: size;
88
- user-select: none;
88
+ -webkit-user-select: none;
89
+ user-select: none;
89
90
  }
90
91
 
91
92
  [fill] > .sonic-spectrum,
@@ -94,9 +95,16 @@
94
95
  }
95
96
 
96
97
  .sonic-spectrum-canvas {
98
+ --_sonic-spectrum-corner: max(
99
+ 0px,
100
+ var(--_sonic-screen-radius, 0px) - var(--_sonic-screen-inset, 0px)
101
+ );
102
+
97
103
  display: block;
98
104
  inline-size: 100%;
99
105
  block-size: 100%;
106
+ border-end-start-radius: var(--_sonic-spectrum-corner);
107
+ border-end-end-radius: var(--_sonic-spectrum-corner);
100
108
  }
101
109
 
102
110
  /* Opaque, since a system highlight carries alpha that would blend the bars into what is behind them */