@xsynaptic/sonic-ui 0.24.1 → 0.26.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.
Files changed (137) hide show
  1. package/CHANGELOG.md +42 -2
  2. package/README.md +6 -4
  3. package/dist/default/define/region.js +7 -0
  4. package/dist/default/define.js +1 -0
  5. package/dist/default/elements/button.js +3 -0
  6. package/dist/default/elements/dial.js +3 -0
  7. package/dist/default/elements/envelope.js +14 -11
  8. package/dist/default/elements/form-element.js +10 -0
  9. package/dist/default/elements/meter.js +3 -0
  10. package/dist/default/elements/number.js +3 -0
  11. package/dist/default/elements/radio-group.js +4 -1
  12. package/dist/default/elements/readout.js +1 -1
  13. package/dist/default/elements/region-layer.js +253 -0
  14. package/dist/default/elements/region.js +161 -0
  15. package/dist/default/elements/slider.js +3 -0
  16. package/dist/default/elements/sonic-element.js +7 -9
  17. package/dist/default/elements/split.js +2 -2
  18. package/dist/default/elements/toggle.js +4 -4
  19. package/dist/default/elements/value-element.js +21 -3
  20. package/dist/default/elements/value-gestures.js +7 -5
  21. package/dist/default/elements/wave-element.js +15 -3
  22. package/dist/default/elements/waveform.js +38 -2
  23. package/dist/default/elements/wavestrip.js +90 -17
  24. package/dist/default/elements/xy.js +6 -11
  25. package/dist/default/index.js +2 -1
  26. package/dist/default/lib/canvas-surface.js +22 -1
  27. package/dist/default/lib/clock.js +1 -0
  28. package/dist/default/lib/drag-step.js +1 -1
  29. package/dist/default/lib/key-press.js +2 -2
  30. package/dist/default/lib/marker-band.js +40 -29
  31. package/dist/default/lib/region-drag.js +48 -0
  32. package/dist/dev/define/region.d.ts +2 -0
  33. package/dist/dev/define/region.js +8 -0
  34. package/dist/dev/define/region.js.map +1 -0
  35. package/dist/dev/define.d.ts +3 -1
  36. package/dist/dev/define.js +1 -0
  37. package/dist/dev/elements/button.d.ts +1 -0
  38. package/dist/dev/elements/button.js +3 -0
  39. package/dist/dev/elements/button.js.map +1 -1
  40. package/dist/dev/elements/dial.d.ts +1 -0
  41. package/dist/dev/elements/dial.js +3 -0
  42. package/dist/dev/elements/dial.js.map +1 -1
  43. package/dist/dev/elements/envelope.d.ts +1 -0
  44. package/dist/dev/elements/envelope.js +14 -11
  45. package/dist/dev/elements/envelope.js.map +1 -1
  46. package/dist/dev/elements/form-element.d.ts +1 -0
  47. package/dist/dev/elements/form-element.js +10 -0
  48. package/dist/dev/elements/form-element.js.map +1 -1
  49. package/dist/dev/elements/meter.d.ts +1 -0
  50. package/dist/dev/elements/meter.js +3 -0
  51. package/dist/dev/elements/meter.js.map +1 -1
  52. package/dist/dev/elements/number.d.ts +1 -0
  53. package/dist/dev/elements/number.js +3 -0
  54. package/dist/dev/elements/number.js.map +1 -1
  55. package/dist/dev/elements/radio-group.d.ts +1 -0
  56. package/dist/dev/elements/radio-group.js +4 -1
  57. package/dist/dev/elements/radio-group.js.map +1 -1
  58. package/dist/dev/elements/readout.js +1 -1
  59. package/dist/dev/elements/readout.js.map +1 -1
  60. package/dist/dev/elements/region-layer.js +254 -0
  61. package/dist/dev/elements/region-layer.js.map +1 -0
  62. package/dist/dev/elements/region.d.ts +30 -0
  63. package/dist/dev/elements/region.js +169 -0
  64. package/dist/dev/elements/region.js.map +1 -0
  65. package/dist/dev/elements/slider.d.ts +1 -0
  66. package/dist/dev/elements/slider.js +3 -0
  67. package/dist/dev/elements/slider.js.map +1 -1
  68. package/dist/dev/elements/sonic-element.d.ts +2 -0
  69. package/dist/dev/elements/sonic-element.js +8 -10
  70. package/dist/dev/elements/sonic-element.js.map +1 -1
  71. package/dist/dev/elements/split.js +2 -2
  72. package/dist/dev/elements/split.js.map +1 -1
  73. package/dist/dev/elements/toggle.js +4 -4
  74. package/dist/dev/elements/toggle.js.map +1 -1
  75. package/dist/dev/elements/value-element.d.ts +3 -1
  76. package/dist/dev/elements/value-element.js +21 -3
  77. package/dist/dev/elements/value-element.js.map +1 -1
  78. package/dist/dev/elements/value-gestures.js +7 -5
  79. package/dist/dev/elements/value-gestures.js.map +1 -1
  80. package/dist/dev/elements/wave-element.d.ts +8 -1
  81. package/dist/dev/elements/wave-element.js +15 -3
  82. package/dist/dev/elements/wave-element.js.map +1 -1
  83. package/dist/dev/elements/waveform.d.ts +7 -0
  84. package/dist/dev/elements/waveform.js +38 -2
  85. package/dist/dev/elements/waveform.js.map +1 -1
  86. package/dist/dev/elements/wavestrip.d.ts +17 -1
  87. package/dist/dev/elements/wavestrip.js +90 -17
  88. package/dist/dev/elements/wavestrip.js.map +1 -1
  89. package/dist/dev/elements/xy.d.ts +1 -0
  90. package/dist/dev/elements/xy.js +6 -11
  91. package/dist/dev/elements/xy.js.map +1 -1
  92. package/dist/dev/index.d.ts +3 -2
  93. package/dist/dev/index.js +2 -1
  94. package/dist/dev/lib/canvas-surface.js +22 -1
  95. package/dist/dev/lib/canvas-surface.js.map +1 -1
  96. package/dist/dev/lib/clock.js +1 -0
  97. package/dist/dev/lib/clock.js.map +1 -1
  98. package/dist/dev/lib/drag-step.js +1 -1
  99. package/dist/dev/lib/drag-step.js.map +1 -1
  100. package/dist/dev/lib/key-press.js +2 -2
  101. package/dist/dev/lib/key-press.js.map +1 -1
  102. package/dist/dev/lib/marker-band.d.ts +7 -0
  103. package/dist/dev/lib/marker-band.js +40 -29
  104. package/dist/dev/lib/marker-band.js.map +1 -1
  105. package/dist/dev/lib/region-drag.js +49 -0
  106. package/dist/dev/lib/region-drag.js.map +1 -0
  107. package/dist/styles/button.css +23 -13
  108. package/dist/styles/controls.css +1 -0
  109. package/dist/styles/dial.css +41 -24
  110. package/dist/styles/envelope.css +12 -5
  111. package/dist/styles/led.css +8 -8
  112. package/dist/styles/material/arc.css +2 -2
  113. package/dist/styles/material/cap.css +34 -13
  114. package/dist/styles/material/glass.css +1 -1
  115. package/dist/styles/material/groove.css +3 -3
  116. package/dist/styles/material/keycap.css +2 -2
  117. package/dist/styles/material/lens.css +1 -1
  118. package/dist/styles/material/pane.css +20 -6
  119. package/dist/styles/material/readout.css +14 -5
  120. package/dist/styles/material/{bracket.css → reticle.css} +15 -8
  121. package/dist/styles/material/well.css +2 -2
  122. package/dist/styles/material.css +1 -1
  123. package/dist/styles/meter.css +29 -16
  124. package/dist/styles/number.css +3 -2
  125. package/dist/styles/panel.css +3 -3
  126. package/dist/styles/region.css +94 -0
  127. package/dist/styles/ring.css +2 -1
  128. package/dist/styles/screen.css +7 -5
  129. package/dist/styles/segmented.css +5 -4
  130. package/dist/styles/slider.css +24 -15
  131. package/dist/styles/spectrum.css +9 -1
  132. package/dist/styles/switch.css +9 -2
  133. package/dist/styles/toggle.css +5 -4
  134. package/dist/styles/waveform.css +10 -3
  135. package/dist/styles/wavestrip.css +17 -8
  136. package/dist/styles/xy.css +24 -11
  137. package/package.json +3 -2
@@ -84,11 +84,11 @@
84
84
  block-size: var(--_sonic-meter-size);
85
85
  }
86
86
 
87
- :is([value], :state(ladder)) > .sonic-meter {
87
+ :is([value] > .sonic-meter, .sonic-meter[data-sonic-ladder]) {
88
88
  --_sonic-meter-clip-space: 0px;
89
89
  }
90
90
 
91
- :state(ladder) > .sonic-meter {
91
+ .sonic-meter[data-sonic-ladder] {
92
92
  --_sonic-meter-gap: 0px;
93
93
  }
94
94
 
@@ -167,11 +167,13 @@
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
- :state(ladder) > .sonic-meter > :is(.sonic-meter-segments, .sonic-meter-bar) {
176
+ .sonic-meter[data-sonic-ladder] > :is(.sonic-meter-segments, .sonic-meter-bar) {
175
177
  --_sonic-meter-pitch: calc(
176
178
  (var(--_sonic-meter-length) - 2 * var(--_sonic-meter-inset)) / var(--_sonic-meter-count, 1)
177
179
  );
@@ -249,8 +251,8 @@
249
251
  block-size: auto;
250
252
  }
251
253
 
252
- [orientation='horizontal']:state(ladder)
253
- > .sonic-meter
254
+ [orientation='horizontal']
255
+ > .sonic-meter[data-sonic-ladder]
254
256
  > :is(.sonic-meter-segments, .sonic-meter-bar) {
255
257
  --_sonic-meter-segment-mask: radial-gradient(
256
258
  circle var(--_sonic-meter-ladder-radius),
@@ -260,24 +262,24 @@
260
262
  0 0 / var(--_sonic-meter-pitch) 100% repeat no-repeat;
261
263
  }
262
264
 
263
- :state(ladder) > .sonic-meter > :is(.sonic-meter-segments, .sonic-meter-bar)::after {
265
+ .sonic-meter[data-sonic-ladder] > :is(.sonic-meter-segments, .sonic-meter-bar)::after {
264
266
  position: absolute;
265
267
  inset: 0;
266
268
  content: '';
267
269
  background: var(--_sonic-lens-glint) 0 100% / 100% var(--_sonic-meter-pitch) repeat-y;
268
270
  }
269
271
 
270
- :state(ladder) > .sonic-meter > .sonic-meter-bar::after {
272
+ .sonic-meter[data-sonic-ladder] > .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;
277
279
  }
278
280
 
279
- [orientation='horizontal']:state(ladder)
280
- > .sonic-meter
281
+ [orientation='horizontal']
282
+ > .sonic-meter[data-sonic-ladder]
281
283
  > :is(.sonic-meter-segments, .sonic-meter-bar)::after {
282
284
  background-repeat: repeat-x;
283
285
  background-position: 0 0;
@@ -321,7 +323,7 @@
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:
325
327
  linear-gradient(
326
328
  var(--_sonic-meter-toward),
327
329
  transparent var(--_sonic-meter-lit-from),
@@ -331,7 +333,18 @@
331
333
  transparent 0
332
334
  ),
333
335
  var(--_sonic-meter-segment-mask);
334
- mask-composite: intersect, add, add, add, add, add, add;
336
+ mask:
337
+ linear-gradient(
338
+ var(--_sonic-meter-toward),
339
+ transparent var(--_sonic-meter-lit-from),
340
+ #000 0 var(--_sonic-meter-lit),
341
+ transparent 0 calc(var(--_sonic-meter-peak-hold-edge) - var(--_sonic-meter-pitch)),
342
+ #000 0 var(--_sonic-meter-peak-hold-edge),
343
+ transparent 0
344
+ ),
345
+ var(--_sonic-meter-segment-mask);
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 {
@@ -355,7 +368,7 @@
355
368
  opacity: var(--_sonic-meter-clipped, 0);
356
369
  }
357
370
 
358
- :is([value], :state(ladder)) > .sonic-meter > .sonic-meter-clip {
371
+ :is([value] > .sonic-meter, .sonic-meter[data-sonic-ladder]) > .sonic-meter-clip {
359
372
  display: none;
360
373
  }
361
374
 
@@ -389,7 +402,7 @@
389
402
  background: Mark;
390
403
  }
391
404
 
392
- :state(ladder) > .sonic-meter > :is(.sonic-meter-segments, .sonic-meter-bar)::after {
405
+ .sonic-meter[data-sonic-ladder] > :is(.sonic-meter-segments, .sonic-meter-bar)::after {
393
406
  display: none;
394
407
  }
395
408
  }
@@ -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
 
@@ -67,7 +68,7 @@
67
68
  white-space: nowrap;
68
69
  }
69
70
 
70
- :state(editing) > .sonic-number > .sonic-number-value {
71
+ .sonic-number[data-sonic-editing] > .sonic-number-value {
71
72
  visibility: hidden;
72
73
  }
73
74
 
@@ -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 {
@@ -0,0 +1,94 @@
1
+ @layer sonic.material, sonic.control;
2
+
3
+ @property --_sonic-region-bracket-width {
4
+ syntax: '<length>';
5
+ inherits: true;
6
+ initial-value: 1px;
7
+ }
8
+
9
+ @layer sonic.control {
10
+ sonic-region {
11
+ display: none;
12
+ }
13
+
14
+ .sonic-region {
15
+ --_sonic-region-paint: var(--sonic-region-bracket, var(--_sonic-marker, var(--_sonic-ink)));
16
+ --_sonic-region-colour: var(--_sonic-region-paint);
17
+ --_sonic-region-bracket-width: var(
18
+ --sonic-region-bracket-width,
19
+ max(1px, round(var(--_sonic-unit), var(--_sonic-snap)))
20
+ );
21
+
22
+ position: absolute;
23
+ inset-block: 0;
24
+ inset-inline-start: calc(var(--_sonic-region-from, 0) * 100%);
25
+ inline-size: calc((var(--_sonic-region-to, 0) - var(--_sonic-region-from, 0)) * 100%);
26
+ min-inline-size: calc(2 * var(--_sonic-region-bracket-width));
27
+ pointer-events: none;
28
+ border-radius: var(--sonic-region-bracket-radius, calc(2 * var(--_sonic-unit)));
29
+ }
30
+
31
+ .sonic-region:focus-visible {
32
+ outline: 2px solid transparent;
33
+ outline-offset: var(--sonic-focus-outline-offset, -2px);
34
+ }
35
+
36
+ .sonic-region:focus-visible:not([data-sonic-pointer-focus]) {
37
+ outline: var(--sonic-focus-outline, 2px solid transparent);
38
+ box-shadow: var(--_sonic-focus-glow);
39
+ }
40
+
41
+ :is(.sonic-region[aria-disabled='true'], [dimmed] > .sonic-wavestrip .sonic-region) {
42
+ --_sonic-region-colour: color-mix(in oklab, var(--_sonic-region-paint) 45%, transparent);
43
+ }
44
+
45
+ .sonic-region-bracket {
46
+ position: absolute;
47
+ inset: 0;
48
+ box-sizing: border-box;
49
+ background: var(--sonic-region-fill, transparent);
50
+ border: var(--_sonic-region-bracket-width) solid var(--_sonic-region-colour);
51
+ border-radius: inherit;
52
+ }
53
+
54
+ .sonic-region[data-sonic-clipped~='start'] {
55
+ border-start-start-radius: 0;
56
+ border-end-start-radius: 0;
57
+ }
58
+
59
+ .sonic-region[data-sonic-clipped~='start'] > .sonic-region-bracket {
60
+ border-inline-start-width: 0;
61
+ }
62
+
63
+ .sonic-region[data-sonic-clipped~='end'] {
64
+ border-start-end-radius: 0;
65
+ border-end-end-radius: 0;
66
+ }
67
+
68
+ .sonic-region[data-sonic-clipped~='end'] > .sonic-region-bracket {
69
+ border-inline-end-width: 0;
70
+ }
71
+
72
+ @media (forced-colors: active) {
73
+ .sonic-region {
74
+ --_sonic-region-colour: CanvasText;
75
+ }
76
+
77
+ .sonic-region:focus-visible {
78
+ outline-offset: 2px;
79
+ }
80
+
81
+ .sonic-region[data-sonic-pointer-focus]:focus-visible {
82
+ outline-style: none;
83
+ }
84
+
85
+ :is(.sonic-region[aria-disabled='true'], [dimmed] > .sonic-wavestrip .sonic-region) {
86
+ --_sonic-region-colour: GrayText;
87
+ }
88
+
89
+ .sonic-region-bracket {
90
+ forced-color-adjust: none;
91
+ background: none;
92
+ }
93
+ }
94
+ }
@@ -50,7 +50,8 @@
50
50
  transparent 0
51
51
  );
52
52
  border-radius: 50%;
53
- mask: var(--_sonic-arc-mask);
53
+ -webkit-mask: var(--_sonic-arc-mask);
54
+ mask: var(--_sonic-arc-mask);
54
55
  }
55
56
 
56
57
  @media (forced-colors: active) {
@@ -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);
@@ -98,14 +99,14 @@
98
99
  transition: color var(--_sonic-fade-duration) ease-out;
99
100
  }
100
101
 
101
- .sonic-segmented-option:where([data-sonic-pressed]):not(:disabled),
102
+ .sonic-segmented-option:where([data-sonic-active]):not(:disabled),
102
103
  .sonic-segmented-option[aria-checked='true'] {
103
104
  --_sonic-keycap-shift: calc(var(--_sonic-keycap-depth) / 2);
104
105
  --_sonic-keycap-scale: var(--_sonic-segmented-latched-scale);
105
106
  --_sonic-keycap-drop: var(--_sonic-press-drop);
106
107
  }
107
108
 
108
- .sonic-segmented-option:where([data-sonic-pressed]):not(:disabled) {
109
+ .sonic-segmented-option:where([data-sonic-active]):not(:disabled) {
109
110
  --_sonic-keycap-scale: var(--_sonic-segmented-press-scale);
110
111
  }
111
112
 
@@ -127,7 +128,7 @@
127
128
  .sonic-segmented-option:not([aria-checked='true'], :disabled):is(
128
129
  :focus-visible,
129
130
  :active,
130
- [data-sonic-pressed]
131
+ [data-sonic-active]
131
132
  ) {
132
133
  color: var(--_sonic-ink-lift);
133
134
  }
@@ -112,7 +112,8 @@
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),
@@ -127,7 +128,7 @@
127
128
  }
128
129
 
129
130
  :where(:not(:disabled)) > .sonic-slider:focus-visible,
130
- :state(dragging) > .sonic-slider {
131
+ .sonic-slider[data-sonic-dragging] {
131
132
  --_sonic-slider-groove-held: 1;
132
133
  }
133
134
 
@@ -159,11 +160,11 @@
159
160
  touch-action: var(--sonic-touch-action, pan-x);
160
161
  }
161
162
 
162
- :state(dragging) > .sonic-slider {
163
+ .sonic-slider[data-sonic-dragging] {
163
164
  --_sonic-cap: var(--_sonic-cap-hover);
164
165
  }
165
166
 
166
- :state(springing) > .sonic-slider {
167
+ .sonic-slider[data-sonic-springing] {
167
168
  /* A damped spring with 10% bounce, sampled into `linear()` */
168
169
  transition: --_sonic-slider-value 200ms
169
170
  linear(
@@ -213,7 +214,7 @@
213
214
 
214
215
  @media (prefers-reduced-motion: reduce) {
215
216
 
216
- :state(springing) > .sonic-slider {
217
+ .sonic-slider[data-sonic-springing] {
217
218
  transition: none;
218
219
  }
219
220
  }
@@ -231,7 +232,7 @@
231
232
  --_sonic-slider-scale-band: calc(var(--_sonic-slider-size) * var(--_sonic-slider-scale-ratio));
232
233
  }
233
234
 
234
- [groove-press='none']:not(:state(dragging)) > .sonic-slider {
235
+ [groove-press='none'] > .sonic-slider:not([data-sonic-dragging]) {
235
236
  cursor: default;
236
237
  }
237
238
 
@@ -254,7 +255,15 @@
254
255
  var(--_sonic-etch) 0 var(--_sonic-unit),
255
256
  transparent 0 var(--_sonic-slider-notch-pitch)
256
257
  );
257
- 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(
258
267
  var(--_sonic-slider-across),
259
268
  transparent 15%,
260
269
  #000 0 calc(var(--_sonic-slider-notch-mid) - var(--_sonic-slider-notch-lip)),
@@ -374,7 +383,7 @@
374
383
  display: none;
375
384
  }
376
385
 
377
- :state(modulated) > .sonic-slider > .sonic-slider-modulation {
386
+ .sonic-slider[data-sonic-modulated] > .sonic-slider-modulation {
378
387
  --_sonic-slider-live-low: min(
379
388
  var(--_sonic-slider-value, 0),
380
389
  var(--_sonic-slider-modulation-value, 0)
@@ -407,31 +416,31 @@
407
416
  background: color-mix(in oklab, var(--_sonic-slider-modulation) 50%, transparent);
408
417
  }
409
418
 
410
- :is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::before,:is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::after {
419
+ :is(.sonic-slider[data-sonic-modulated] > .sonic-slider-modulation)::before,:is(.sonic-slider[data-sonic-modulated] > .sonic-slider-modulation)::after {
411
420
  position: absolute;
412
421
  content: '';
413
422
  }
414
423
 
415
- :is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::before {
424
+ :is(.sonic-slider[data-sonic-modulated] > .sonic-slider-modulation)::before {
416
425
  inset: 0 auto 0 var(--_sonic-slider-live-start);
417
426
  inline-size: var(--_sonic-slider-live-length);
418
427
  background: var(--_sonic-slider-modulation);
419
428
  border-radius: inherit;
420
429
  }
421
430
 
422
- :is(:state(modulated) > .sonic-slider > .sonic-slider-modulation)::after {
431
+ :is(.sonic-slider[data-sonic-modulated] > .sonic-slider-modulation)::after {
423
432
  inset: var(--_sonic-slider-tick-overhang) auto var(--_sonic-slider-tick-overhang)
424
433
  var(--_sonic-slider-tick-start);
425
434
  inline-size: var(--_sonic-unit);
426
435
  background: var(--_sonic-slider-modulation-tick);
427
436
  }
428
- :is(:where([orientation='vertical']):state(modulated) > .sonic-slider > .sonic-slider-modulation)::before {
437
+ :is(:where([orientation='vertical']) > .sonic-slider[data-sonic-modulated] > .sonic-slider-modulation)::before {
429
438
  inset: auto 0 var(--_sonic-slider-live-start);
430
439
  inline-size: auto;
431
440
  block-size: var(--_sonic-slider-live-length);
432
441
  }
433
442
 
434
- :is(:where([orientation='vertical']):state(modulated) > .sonic-slider > .sonic-slider-modulation)::after {
443
+ :is(:where([orientation='vertical']) > .sonic-slider[data-sonic-modulated] > .sonic-slider-modulation)::after {
435
444
  inset: auto var(--_sonic-slider-tick-overhang) var(--_sonic-slider-tick-start);
436
445
  inline-size: auto;
437
446
  block-size: var(--_sonic-unit);
@@ -484,7 +493,7 @@
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
498
 
490
499
  [orientation='vertical'] > .sonic-slider > .sonic-slider-cap {
@@ -529,7 +538,7 @@
529
538
  --_sonic-slider-modulation: CanvasText;
530
539
  }
531
540
 
532
- :state(modulated) > .sonic-slider > .sonic-slider-modulation {
541
+ .sonic-slider[data-sonic-modulated] > .sonic-slider-modulation {
533
542
  --_sonic-slider-modulation-tick: CanvasText;
534
543
 
535
544
  background: GrayText;
@@ -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 */
@@ -12,6 +12,12 @@
12
12
  initial-value: 0;
13
13
  }
14
14
 
15
+ @property --_sonic-switch-outline {
16
+ syntax: '<length>';
17
+ inherits: true;
18
+ initial-value: 1px;
19
+ }
20
+
15
21
  @layer sonic.control {
16
22
  :is(sonic-switch, .sonic-switch) {
17
23
  --_sonic-switch-size: var(--sonic-switch-size, 2rem);
@@ -60,7 +66,8 @@
60
66
  grid-template: var(--_sonic-switch-size) / var(--_sonic-switch-size);
61
67
  place-items: center;
62
68
  line-height: 1;
63
- user-select: none;
69
+ -webkit-user-select: none;
70
+ user-select: none;
64
71
  transition: --_sonic-switch-at 90ms cubic-bezier(0.4, 0, 0.2, 1);
65
72
  }
66
73
 
@@ -369,7 +376,7 @@
369
376
  calc((var(--_sonic-switch-ball) - var(--_sonic-switch-size)) / 2);
370
377
  box-shadow:
371
378
  inset 0 0 calc(1.5 * var(--_sonic-unit)) calc(0.4 * var(--_sonic-unit))
372
- rgb(from var(--_sonic-shade) r g b / calc(0.3 * var(--_sonic-relief))),
379
+ color-mix(in srgb, var(--_sonic-shade) calc(30% * var(--_sonic-relief)), transparent),
373
380
  0 0 0 var(--_sonic-switch-outline) var(--_sonic-switch-rim),
374
381
  var(--_sonic-focus-shadow);
375
382
  translate: calc(var(--_sonic-switch-along-x) * var(--_sonic-switch-throw))
@@ -105,7 +105,8 @@
105
105
  grid-auto-flow: column;
106
106
  line-height: 1;
107
107
  touch-action: pan-y;
108
- user-select: none;
108
+ -webkit-user-select: none;
109
+ user-select: none;
109
110
  transition:
110
111
  --_sonic-toggle-at 120ms cubic-bezier(0.4, 0, 0.2, 1),
111
112
  --_sonic-toggle-sink var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1);
@@ -122,7 +123,7 @@
122
123
  touch-action: pan-x;
123
124
  }
124
125
 
125
- :state(dragging) > .sonic-toggle {
126
+ .sonic-toggle[data-sonic-dragging] {
126
127
  transition: --_sonic-toggle-sink var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1);
127
128
  }
128
129
 
@@ -178,7 +179,7 @@
178
179
  }
179
180
 
180
181
  /* Held, never resting: the chosen position's cap stands as proud as any other */
181
- .sonic-toggle:has(> .sonic-toggle-position[data-sonic-pressed]):has(
182
+ .sonic-toggle:has(> .sonic-toggle-position[data-sonic-active]):has(
182
183
  > .sonic-toggle-position:not(:disabled)
183
184
  ) {
184
185
  --_sonic-toggle-sink: calc(var(--_sonic-keycap-depth) / 2);
@@ -437,7 +438,7 @@
437
438
 
438
439
  @media (prefers-reduced-motion: reduce) {
439
440
  .sonic-toggle,
440
- :state(dragging) > .sonic-toggle,
441
+ .sonic-toggle[data-sonic-dragging],
441
442
  .sonic-toggle-well,
442
443
  .sonic-toggle-cap,
443
444
  .sonic-toggle-legend {
@@ -108,6 +108,12 @@
108
108
  initial-value: rgb(200 200 208);
109
109
  }
110
110
 
111
+ @property --_sonic-waveform-line {
112
+ syntax: '<length>';
113
+ inherits: true;
114
+ initial-value: 1px;
115
+ }
116
+
111
117
  @layer sonic.control {
112
118
  :is(sonic-waveform, .sonic-waveform) {
113
119
  --_sonic-waveform-size: var(--sonic-waveform-size, 6rem);
@@ -135,7 +141,7 @@
135
141
  --_sonic-waveform-lit: var(--_sonic-lit);
136
142
  --_sonic-waveform-wave: var(--_sonic-waveform-lit);
137
143
  --_sonic-waveform-shade: var(--_sonic-shade);
138
- --_sonic-waveform-shade-clear: rgb(from var(--_sonic-shade) r g b / 0%);
144
+ --_sonic-waveform-shade-clear: color-mix(in srgb, var(--_sonic-shade) 0%, transparent);
139
145
  --_sonic-waveform-edge-shade: var(--sonic-waveform-edge-shade, 0);
140
146
  --_sonic-waveform-band-opacity: calc(
141
147
  var(--sonic-waveform-band-opacity, 1) * var(--_sonic-waveform-band-dim, 1)
@@ -175,7 +181,8 @@
175
181
  overflow: hidden;
176
182
  touch-action: var(--sonic-touch-action, pan-y);
177
183
  cursor: grab;
178
- user-select: none;
184
+ -webkit-user-select: none;
185
+ user-select: none;
179
186
  box-shadow: var(--_sonic-focus-shadow);
180
187
  }
181
188
 
@@ -184,7 +191,7 @@
184
191
  block-size: 100%;
185
192
  }
186
193
 
187
- :state(dragging) > .sonic-waveform {
194
+ .sonic-waveform[data-sonic-dragging] {
188
195
  cursor: grabbing;
189
196
  }
190
197
 
@@ -72,6 +72,12 @@
72
72
  initial-value: 0;
73
73
  }
74
74
 
75
+ @property --_sonic-marker-edge {
76
+ syntax: '<length>';
77
+ inherits: true;
78
+ initial-value: 1px;
79
+ }
80
+
75
81
  @property --_sonic-marker-step {
76
82
  syntax: '<length>';
77
83
  inherits: true;
@@ -123,7 +129,7 @@
123
129
  --_sonic-marker-step: calc(var(--_sonic-marker-size) + var(--_sonic-marker-edge));
124
130
  --_sonic-marker-default: var(--sonic-marker, var(--_sonic-ink));
125
131
  --_sonic-wavestrip-wave: var(
126
- --sonic-wave,
132
+ --sonic-unplayed,
127
133
  color-mix(in oklab, var(--_sonic-ink) 30%, var(--_sonic-unlit))
128
134
  );
129
135
  --_sonic-wavestrip-buffered: var(
@@ -143,8 +149,8 @@
143
149
  container-type: size;
144
150
  touch-action: var(--sonic-touch-action, pan-y);
145
151
  cursor: ew-resize;
146
- user-select: none;
147
- box-shadow: var(--_sonic-focus-shadow);
152
+ -webkit-user-select: none;
153
+ user-select: none;
148
154
  }
149
155
 
150
156
  [fill] > .sonic-wavestrip,
@@ -166,9 +172,10 @@
166
172
  display: block;
167
173
  inline-size: 100%;
168
174
  block-size: 100%;
175
+ box-shadow: var(--_sonic-focus-shadow);
169
176
  }
170
177
 
171
- .sonic-wavestrip-markers {
178
+ :is(.sonic-wavestrip-markers, .sonic-wavestrip-regions) {
172
179
  position: absolute;
173
180
  inset: 0;
174
181
  pointer-events: none;
@@ -193,9 +200,11 @@
193
200
  calc(var(--_sonic-marker-from, 0) * 100% - var(--_sonic-marker-size) / 2);
194
201
  inline-size: var(--_sonic-marker-size);
195
202
  block-size: var(--_sonic-marker-size);
196
- background: var(--_sonic-marker-colour);
203
+ color: var(--_sonic-marker-colour);
204
+ background: var(--_sonic-marker-paint, var(--_sonic-marker-colour));
197
205
  border-radius: 50%;
198
- box-shadow: 0 0 0 var(--_sonic-marker-edge) var(--sonic-wavestrip-marker-edge, transparent);
206
+ box-shadow: 0 0 0 var(--_sonic-marker-edge)
207
+ var(--_sonic-marker-paint, var(--sonic-wavestrip-marker-edge, transparent));
199
208
  }
200
209
 
201
210
  .sonic-wavestrip-region {
@@ -240,8 +249,8 @@
240
249
  }
241
250
 
242
251
  .sonic-wavestrip-marker {
243
- background: var(--_sonic-marker-colour);
244
- box-shadow: 0 0 0 var(--_sonic-marker-edge) Canvas;
252
+ background: var(--_sonic-marker-paint, var(--_sonic-marker-colour));
253
+ box-shadow: 0 0 0 var(--_sonic-marker-edge) var(--_sonic-marker-paint, Canvas);
245
254
  }
246
255
 
247
256
  .sonic-wavestrip-region {