@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
@@ -60,17 +60,21 @@
60
60
  grid-template: var(--_sonic-switch-size) / var(--_sonic-switch-size);
61
61
  place-items: center;
62
62
  line-height: 1;
63
- user-select: none;
63
+ -webkit-user-select: none;
64
+ user-select: none;
64
65
  transition: --_sonic-switch-at 90ms cubic-bezier(0.4, 0, 0.2, 1);
66
+ }
65
67
 
66
68
  @media (prefers-reduced-motion: reduce) {
69
+
70
+ .sonic-switch {
67
71
  transition: none;
72
+ }
68
73
  }
69
74
 
70
- & > * {
75
+ .sonic-switch > * {
71
76
  grid-area: 1 / 1;
72
77
  }
73
- }
74
78
 
75
79
  [orientation='horizontal'] > .sonic-switch {
76
80
  --_sonic-switch-along-x: 1;
@@ -99,20 +103,20 @@
99
103
  cursor: pointer;
100
104
  background: transparent;
101
105
  border: 0;
106
+ }
102
107
 
103
- &:disabled {
108
+ .sonic-switch-position:disabled {
104
109
  cursor: default;
105
110
  }
106
111
 
107
- &:focus-visible {
112
+ .sonic-switch-position:focus-visible {
108
113
  outline: var(--sonic-focus-outline, 2px solid transparent);
109
114
  outline-offset: var(--sonic-focus-outline-offset, -2px);
110
115
  }
111
116
 
112
- &:has([data-sonic-momentary]) {
117
+ .sonic-switch-position:has([data-sonic-momentary]) {
113
118
  touch-action: none;
114
119
  }
115
- }
116
120
 
117
121
  .sonic-switch[data-sonic-position-count] > .sonic-switch-position::after {
118
122
  inset-block: 0;
@@ -128,71 +132,68 @@
128
132
  .sonic-switch-label {
129
133
  padding: calc(var(--_sonic-switch-size) * 0.12);
130
134
  white-space: nowrap;
135
+ }
131
136
 
132
- & svg {
137
+ .sonic-switch-label svg {
133
138
  display: block;
134
139
  inline-size: 1em;
135
140
  block-size: 1em;
136
141
  }
137
- }
138
142
 
139
143
  .sonic-switch-position:disabled > .sonic-switch-label {
140
144
  color: var(--sonic-ink-disabled, color-mix(in oklab, currentcolor 30%, transparent));
141
145
  }
142
-
143
- .sonic-switch[data-sonic-position-count] {
144
- & > :is(.sonic-switch-bushing, .sonic-switch-bat) {
146
+ .sonic-switch[data-sonic-position-count] > :is(.sonic-switch-bushing,.sonic-switch-bat) {
145
147
  grid-area: 2 / 1 / -2 / 2;
146
148
  }
147
149
 
148
- & > .sonic-switch-position {
150
+ .sonic-switch[data-sonic-position-count] > .sonic-switch-position {
149
151
  grid-template: subgrid / subgrid;
150
152
  }
151
- }
152
153
 
153
154
  .sonic-switch[data-sonic-position-count='2'] {
154
155
  grid-template:
155
156
  auto repeat(2, calc(var(--_sonic-switch-size) / 2)) auto /
156
157
  minmax(var(--_sonic-switch-size), auto);
158
+ }
157
159
 
158
- & > .sonic-switch-position {
160
+ .sonic-switch[data-sonic-position-count='2'] > .sonic-switch-position {
159
161
  grid-area: 1 / 1 / 3 / 2;
162
+ }
160
163
 
161
- &:last-child {
164
+ :is(.sonic-switch[data-sonic-position-count='2'] > .sonic-switch-position):last-child {
162
165
  grid-area: 3 / 1 / 5 / 2;
166
+ }
163
167
 
164
- & > .sonic-switch-label {
168
+ :is(.sonic-switch[data-sonic-position-count='2'] > .sonic-switch-position):last-child > .sonic-switch-label {
165
169
  grid-row: 2;
166
170
  }
167
- }
168
- }
169
- }
170
171
 
171
172
  .sonic-switch[data-sonic-position-count='3'] {
172
173
  grid-template:
173
174
  auto repeat(3, calc(var(--_sonic-switch-size) / 3)) auto /
174
175
  minmax(var(--_sonic-switch-size), auto) auto;
176
+ }
175
177
 
176
- & > .sonic-switch-position {
178
+ .sonic-switch[data-sonic-position-count='3'] > .sonic-switch-position {
177
179
  grid-area: 1 / 1 / 3 / 2;
180
+ }
178
181
 
179
- &:last-child {
182
+ :is(.sonic-switch[data-sonic-position-count='3'] > .sonic-switch-position):last-child {
180
183
  grid-area: 4 / 1 / 6 / 2;
184
+ }
181
185
 
182
- & > .sonic-switch-label {
186
+ :is(.sonic-switch[data-sonic-position-count='3'] > .sonic-switch-position):last-child > .sonic-switch-label {
183
187
  grid-row: 2;
184
188
  }
185
- }
186
189
 
187
- &:nth-child(2 of .sonic-switch-position) {
190
+ :is(.sonic-switch[data-sonic-position-count='3'] > .sonic-switch-position):nth-child(2 of .sonic-switch-position) {
188
191
  grid-area: 3 / 1 / 4 / 3;
192
+ }
189
193
 
190
- & > .sonic-switch-label {
194
+ :is(.sonic-switch[data-sonic-position-count='3'] > .sonic-switch-position):nth-child(2 of .sonic-switch-position) > .sonic-switch-label {
191
195
  grid-column: 2;
192
196
  }
193
- }
194
- }
195
- }
196
197
 
197
198
  [orientation='horizontal']
198
199
  > .sonic-switch[data-sonic-position-count]
@@ -204,45 +205,45 @@
204
205
  grid-template:
205
206
  minmax(var(--_sonic-switch-size), auto) /
206
207
  auto repeat(2, calc(var(--_sonic-switch-size) / 2)) auto;
208
+ }
207
209
 
208
- & > .sonic-switch-position {
210
+ :is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='2']) > .sonic-switch-position {
209
211
  grid-area: 1 / 1 / 2 / 3;
212
+ }
210
213
 
211
- &:last-child {
214
+ :is(:is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='2']) > .sonic-switch-position):last-child {
212
215
  grid-area: 1 / 3 / 2 / 5;
216
+ }
213
217
 
214
- & > .sonic-switch-label {
218
+ :is(:is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='2']) > .sonic-switch-position):last-child > .sonic-switch-label {
215
219
  grid-area: 1 / 2;
216
220
  }
217
- }
218
- }
219
- }
220
221
 
221
222
  [orientation='horizontal'] > .sonic-switch[data-sonic-position-count='3'] {
222
223
  grid-template:
223
224
  minmax(var(--_sonic-switch-size), auto) auto /
224
225
  auto repeat(3, calc(var(--_sonic-switch-size) / 3)) auto;
226
+ }
225
227
 
226
- & > .sonic-switch-position {
228
+ :is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='3']) > .sonic-switch-position {
227
229
  grid-area: 1 / 1 / 2 / 3;
230
+ }
228
231
 
229
- &:last-child {
232
+ :is(:is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='3']) > .sonic-switch-position):last-child {
230
233
  grid-area: 1 / 4 / 2 / 6;
234
+ }
231
235
 
232
- & > .sonic-switch-label {
236
+ :is(:is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='3']) > .sonic-switch-position):last-child > .sonic-switch-label {
233
237
  grid-area: 1 / 2;
234
238
  }
235
- }
236
239
 
237
- &:nth-child(2 of .sonic-switch-position) {
240
+ :is(:is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='3']) > .sonic-switch-position):nth-child(2 of .sonic-switch-position) {
238
241
  grid-area: 1 / 3 / 3 / 4;
242
+ }
239
243
 
240
- & > .sonic-switch-label {
244
+ :is(:is([orientation='horizontal'] > .sonic-switch[data-sonic-position-count='3']) > .sonic-switch-position):nth-child(2 of .sonic-switch-position) > .sonic-switch-label {
241
245
  grid-area: 2 / 1;
242
246
  }
243
- }
244
- }
245
- }
246
247
 
247
248
  .sonic-switch-bushing {
248
249
  --_sonic-switch-bushing-shade: color-mix(
@@ -325,9 +326,9 @@
325
326
  calc((1 + var(--_sonic-switch-lean)) * var(--_sonic-cast-y)) calc(1.5 * var(--_sonic-unit))
326
327
  var(--_sonic-drop-shade)
327
328
  );
329
+ }
328
330
 
329
- &::before,
330
- &::after {
331
+ .sonic-switch-bat::before,.sonic-switch-bat::after {
331
332
  position: absolute;
332
333
  inset: 0;
333
334
  margin: auto;
@@ -338,7 +339,7 @@
338
339
  box-shadow: 0 0 0 var(--_sonic-switch-outline) var(--_sonic-switch-rim);
339
340
  }
340
341
 
341
- &::before {
342
+ .sonic-switch-bat::before {
342
343
  --_sonic-switch-shaft-top: calc(
343
344
  var(--_sonic-switch-pivot) + var(--_sonic-switch-along-y) *
344
345
  min(0px, var(--_sonic-switch-throw))
@@ -362,20 +363,19 @@
362
363
  calc(-1 * var(--_sonic-switch-shaft-top));
363
364
  }
364
365
 
365
- &::after {
366
+ .sonic-switch-bat::after {
366
367
  inline-size: var(--_sonic-switch-ball);
367
368
  block-size: var(--_sonic-switch-ball);
368
369
  background-position: calc((var(--_sonic-switch-ball) - var(--_sonic-switch-size)) / 2)
369
370
  calc((var(--_sonic-switch-ball) - var(--_sonic-switch-size)) / 2);
370
371
  box-shadow:
371
372
  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))),
373
+ color-mix(in srgb, var(--_sonic-shade) calc(30% * var(--_sonic-relief)), transparent),
373
374
  0 0 0 var(--_sonic-switch-outline) var(--_sonic-switch-rim),
374
375
  var(--_sonic-focus-shadow);
375
376
  translate: calc(var(--_sonic-switch-along-x) * var(--_sonic-switch-throw))
376
377
  calc(var(--_sonic-switch-along-y) * var(--_sonic-switch-throw));
377
378
  }
378
- }
379
379
 
380
380
  .sonic-switch:has(> .sonic-switch-position:focus-visible) {
381
381
  --_sonic-focus-shadow: var(--_sonic-focus-glow);
@@ -414,13 +414,12 @@
414
414
 
415
415
  .sonic-switch-bat {
416
416
  filter: none;
417
+ }
417
418
 
418
- &::before,
419
- &::after {
419
+ .sonic-switch-bat::before,.sonic-switch-bat::after {
420
420
  background: var(--_sonic-switch-metal);
421
421
  box-shadow: none;
422
422
  }
423
- }
424
423
 
425
424
  .sonic-switch-position:focus-visible {
426
425
  outline-offset: 2px;
@@ -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);
@@ -222,8 +223,9 @@
222
223
  transition:
223
224
  scale var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1),
224
225
  box-shadow var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1);
226
+ }
225
227
 
226
- & > .sonic-led {
228
+ .sonic-toggle-cap > .sonic-led {
227
229
  --_sonic-led-size: var(
228
230
  --sonic-led-size,
229
231
  calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-led-ratio))
@@ -233,10 +235,9 @@
233
235
  box-shadow: inset 0 0 0 max(1px, 0.1 * var(--_sonic-led-size)) var(--_sonic-toggle-led-ring);
234
236
  }
235
237
 
236
- & > * {
238
+ .sonic-toggle-cap > * {
237
239
  color: var(--_sonic-toggle-legend);
238
240
  }
239
- }
240
241
 
241
242
  .sonic-toggle-position {
242
243
  position: relative;
@@ -313,11 +314,11 @@
313
314
  translate: calc(var(--_sonic-toggle-along-x) * var(--_sonic-toggle-ride))
314
315
  calc(var(--_sonic-toggle-along-y) * var(--_sonic-toggle-ride) + var(--_sonic-toggle-sink));
315
316
  transition: opacity var(--_sonic-fade-duration) ease-out;
317
+ }
316
318
 
317
- & > * {
319
+ .sonic-toggle-legend > * {
318
320
  filter: var(--_sonic-engraving);
319
321
  }
320
- }
321
322
 
322
323
  :is(.sonic-toggle-cap, .sonic-toggle-legend) > svg {
323
324
  display: block;
@@ -331,25 +332,23 @@
331
332
 
332
333
  .sonic-toggle-position[aria-checked='true']:has([data-sonic-lit]) > .sonic-toggle-legend {
333
334
  color: var(--_sonic-toggle-legend-lit);
335
+ }
334
336
 
335
- & > * {
337
+ :is(.sonic-toggle-position[aria-checked='true']:has([data-sonic-lit]) > .sonic-toggle-legend) > * {
336
338
  filter: var(--_sonic-engraving) var(--_sonic-legend-glow);
337
339
  }
338
- }
339
-
340
- [legends='outside'] > .sonic-toggle[data-sonic-position-count] {
341
- & > :is(.sonic-toggle-well, .sonic-toggle-cap) {
340
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count]) > :is(.sonic-toggle-well,.sonic-toggle-cap) {
342
341
  grid-area: 1 / 2 / 2 / -2;
343
342
  }
344
343
 
345
- & > .sonic-toggle-position {
344
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count]) > .sonic-toggle-position {
346
345
  display: grid;
347
346
  grid-area: 1 / 1 / 2 / 3;
348
347
  grid-template: subgrid / subgrid;
349
348
  place-items: center;
350
349
  }
351
350
 
352
- & > .sonic-toggle-position > .sonic-toggle-legend {
351
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count]) > .sonic-toggle-position > .sonic-toggle-legend {
353
352
  position: static;
354
353
  display: block;
355
354
  inline-size: auto;
@@ -360,86 +359,82 @@
360
359
  pointer-events: auto;
361
360
  opacity: 1;
362
361
  translate: none;
362
+ }
363
363
 
364
- & > * {
364
+ :is(:is([legends='outside'] > .sonic-toggle[data-sonic-position-count]) > .sonic-toggle-position > .sonic-toggle-legend) > * {
365
365
  filter: none;
366
366
  }
367
- }
368
367
 
369
- & > .sonic-toggle-position:disabled > .sonic-toggle-legend {
368
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count]) > .sonic-toggle-position:disabled > .sonic-toggle-legend {
370
369
  color: var(--sonic-ink-disabled, color-mix(in oklab, currentcolor 30%, transparent));
371
370
  }
372
371
 
373
- & > .sonic-toggle-position:last-child > .sonic-toggle-legend {
372
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count]) > .sonic-toggle-position:last-child > .sonic-toggle-legend {
374
373
  grid-column: 2;
375
374
  }
376
- }
377
-
378
- [legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count] {
379
- & > :is(.sonic-toggle-well, .sonic-toggle-cap) {
375
+ :is([legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count]) > :is(.sonic-toggle-well,.sonic-toggle-cap) {
380
376
  grid-area: 2 / 1 / -2 / 2;
381
377
  }
382
378
 
383
- & > .sonic-toggle-position {
379
+ :is([legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count]) > .sonic-toggle-position {
384
380
  grid-area: 1 / 1 / 3 / 2;
385
381
  }
386
382
 
387
- & > .sonic-toggle-position:last-child > .sonic-toggle-legend {
383
+ :is([legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count]) > .sonic-toggle-position:last-child > .sonic-toggle-legend {
388
384
  grid-area: 2 / 1;
389
385
  }
390
- }
391
386
 
392
387
  [legends='outside'] > .sonic-toggle[data-sonic-position-count='2'] {
393
388
  grid-template: var(--_sonic-toggle-size) / auto repeat(2, var(--_sonic-toggle-slice)) auto;
389
+ }
394
390
 
395
- & > .sonic-toggle-position:last-child {
391
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count='2']) > .sonic-toggle-position:last-child {
396
392
  grid-area: 1 / 3 / 2 / 5;
397
393
  }
398
- }
399
394
 
400
395
  [legends='outside'] > .sonic-toggle[data-sonic-position-count='3'] {
401
396
  grid-template: var(--_sonic-toggle-size) auto / auto repeat(3, var(--_sonic-toggle-slice)) auto;
397
+ }
402
398
 
403
- & > .sonic-toggle-position:last-child {
399
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count='3']) > .sonic-toggle-position:last-child {
404
400
  grid-area: 1 / 4 / 2 / 6;
405
401
  }
406
402
 
407
- & > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position) {
403
+ :is([legends='outside'] > .sonic-toggle[data-sonic-position-count='3']) > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position) {
408
404
  grid-area: 1 / 3 / 3 / 4;
405
+ }
409
406
 
410
- & > .sonic-toggle-legend {
407
+ :is(:is([legends='outside'] > .sonic-toggle[data-sonic-position-count='3']) > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position)) > .sonic-toggle-legend {
411
408
  grid-row: 2;
412
409
  }
413
- }
414
- }
415
410
 
416
411
  [legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='2'] {
417
412
  grid-template:
418
413
  auto repeat(2, var(--_sonic-toggle-slice)) auto /
419
414
  minmax(var(--_sonic-toggle-size), auto);
415
+ }
420
416
 
421
- & > .sonic-toggle-position:last-child {
417
+ :is([legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='2']) > .sonic-toggle-position:last-child {
422
418
  grid-area: 3 / 1 / 5 / 2;
423
419
  }
424
- }
425
420
 
426
421
  [legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='3'] {
427
422
  grid-template:
428
423
  auto repeat(3, var(--_sonic-toggle-slice)) auto /
429
424
  minmax(var(--_sonic-toggle-size), auto) auto;
425
+ }
430
426
 
431
- & > .sonic-toggle-position:last-child {
427
+ :is([legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='3']) > .sonic-toggle-position:last-child {
432
428
  grid-area: 4 / 1 / 6 / 2;
433
429
  }
434
430
 
435
- & > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position) {
431
+ :is([legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='3']) > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position) {
436
432
  grid-area: 3 / 1 / 4 / 3;
433
+ }
437
434
 
438
- & > .sonic-toggle-legend {
435
+ :is(:is([legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='3']) > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position)) > .sonic-toggle-legend {
439
436
  grid-area: 1 / 2;
440
437
  }
441
- }
442
- }
443
438
 
444
439
  @media (prefers-reduced-motion: reduce) {
445
440
  .sonic-toggle,
@@ -135,7 +135,7 @@
135
135
  --_sonic-waveform-lit: var(--_sonic-lit);
136
136
  --_sonic-waveform-wave: var(--_sonic-waveform-lit);
137
137
  --_sonic-waveform-shade: var(--_sonic-shade);
138
- --_sonic-waveform-shade-clear: rgb(from var(--_sonic-shade) r g b / 0%);
138
+ --_sonic-waveform-shade-clear: color-mix(in srgb, var(--_sonic-shade) 0%, transparent);
139
139
  --_sonic-waveform-edge-shade: var(--sonic-waveform-edge-shade, 0);
140
140
  --_sonic-waveform-band-opacity: calc(
141
141
  var(--sonic-waveform-band-opacity, 1) * var(--_sonic-waveform-band-dim, 1)
@@ -175,7 +175,8 @@
175
175
  overflow: hidden;
176
176
  touch-action: var(--sonic-touch-action, pan-y);
177
177
  cursor: grab;
178
- user-select: none;
178
+ -webkit-user-select: none;
179
+ user-select: none;
179
180
  box-shadow: var(--_sonic-focus-shadow);
180
181
  }
181
182
 
@@ -280,12 +281,12 @@
280
281
 
281
282
  .sonic-waveform-label {
282
283
  color: CanvasText;
284
+ }
283
285
 
284
- &[data-sonic-dimmed] {
286
+ .sonic-waveform-label[data-sonic-dimmed] {
285
287
  color: GrayText;
286
288
  filter: none;
287
289
  }
288
- }
289
290
 
290
291
  .sonic-waveform-playhead {
291
292
  background: CanvasText;
@@ -123,7 +123,7 @@
123
123
  --_sonic-marker-step: calc(var(--_sonic-marker-size) + var(--_sonic-marker-edge));
124
124
  --_sonic-marker-default: var(--sonic-marker, var(--_sonic-ink));
125
125
  --_sonic-wavestrip-wave: var(
126
- --sonic-wave,
126
+ --sonic-unplayed,
127
127
  color-mix(in oklab, var(--_sonic-ink) 30%, var(--_sonic-unlit))
128
128
  );
129
129
  --_sonic-wavestrip-buffered: var(
@@ -143,8 +143,8 @@
143
143
  container-type: size;
144
144
  touch-action: var(--sonic-touch-action, pan-y);
145
145
  cursor: ew-resize;
146
- user-select: none;
147
- box-shadow: var(--_sonic-focus-shadow);
146
+ -webkit-user-select: none;
147
+ user-select: none;
148
148
  }
149
149
 
150
150
  [fill] > .sonic-wavestrip,
@@ -166,9 +166,10 @@
166
166
  display: block;
167
167
  inline-size: 100%;
168
168
  block-size: 100%;
169
+ box-shadow: var(--_sonic-focus-shadow);
169
170
  }
170
171
 
171
- .sonic-wavestrip-markers {
172
+ :is(.sonic-wavestrip-markers, .sonic-wavestrip-regions) {
172
173
  position: absolute;
173
174
  inset: 0;
174
175
  pointer-events: none;
@@ -178,24 +179,26 @@
178
179
  --_sonic-marker-colour: var(--_sonic-marker, var(--_sonic-marker-default));
179
180
 
180
181
  position: absolute;
182
+ }
181
183
 
182
- &[data-sonic-dimmed] {
184
+ [data-sonic-dimmed]:is(.sonic-wavestrip-marker,.sonic-wavestrip-region) {
183
185
  --_sonic-marker-colour: color-mix(
184
186
  in oklab,
185
187
  var(--_sonic-marker, var(--_sonic-marker-default)) 45%,
186
188
  transparent
187
189
  );
188
190
  }
189
- }
190
191
 
191
192
  .sonic-wavestrip-marker {
192
193
  inset: calc(var(--_sonic-marker-lane, 0) * var(--_sonic-marker-step)) auto auto
193
194
  calc(var(--_sonic-marker-from, 0) * 100% - var(--_sonic-marker-size) / 2);
194
195
  inline-size: var(--_sonic-marker-size);
195
196
  block-size: var(--_sonic-marker-size);
196
- background: var(--_sonic-marker-colour);
197
+ color: var(--_sonic-marker-colour);
198
+ background: var(--_sonic-marker-paint, var(--_sonic-marker-colour));
197
199
  border-radius: 50%;
198
- box-shadow: 0 0 0 var(--_sonic-marker-edge) var(--sonic-wavestrip-marker-edge, transparent);
200
+ box-shadow: 0 0 0 var(--_sonic-marker-edge)
201
+ var(--_sonic-marker-paint, var(--sonic-wavestrip-marker-edge, transparent));
199
202
  }
200
203
 
201
204
  .sonic-wavestrip-region {
@@ -233,15 +236,15 @@
233
236
  --_sonic-marker-colour: CanvasText;
234
237
 
235
238
  forced-color-adjust: none;
239
+ }
236
240
 
237
- &[data-sonic-dimmed] {
241
+ [data-sonic-dimmed]:is(.sonic-wavestrip-marker,.sonic-wavestrip-region) {
238
242
  --_sonic-marker-colour: GrayText;
239
243
  }
240
- }
241
244
 
242
245
  .sonic-wavestrip-marker {
243
- background: var(--_sonic-marker-colour);
244
- box-shadow: 0 0 0 var(--_sonic-marker-edge) Canvas;
246
+ background: var(--_sonic-marker-paint, var(--_sonic-marker-colour));
247
+ box-shadow: 0 0 0 var(--_sonic-marker-edge) var(--_sonic-marker-paint, Canvas);
245
248
  }
246
249
 
247
250
  .sonic-wavestrip-region {
@@ -43,7 +43,8 @@
43
43
  container-type: size;
44
44
  touch-action: none;
45
45
  cursor: crosshair;
46
- user-select: none;
46
+ -webkit-user-select: none;
47
+ user-select: none;
47
48
  }
48
49
 
49
50
  :disabled > .sonic-xy {
@@ -64,14 +65,14 @@
64
65
  position: absolute;
65
66
  inset: 0;
66
67
  pointer-events: none;
68
+ }
67
69
 
68
- &::before,
69
- &::after {
70
+ .sonic-xy-field::before,.sonic-xy-field::after {
70
71
  position: absolute;
71
72
  content: '';
72
73
  }
73
74
 
74
- &::before {
75
+ .sonic-xy-field::before {
75
76
  inset: auto 0
76
77
  calc(
77
78
  var(--_sonic-xy-y, 0) * var(--_sonic-xy-travel-y) +
@@ -84,19 +85,19 @@
84
85
  transparent
85
86
  calc(
86
87
  var(--_sonic-xy-x-low) * var(--_sonic-xy-travel-x) + var(--_sonic-xy-puck) / 2 *
87
- sign(var(--_sonic-xy-x-low))
88
+ clamp(0, var(--_sonic-xy-x-low) * 100000, 1)
88
89
  ),
89
90
  var(--_sonic-xy-lit) 0
90
91
  calc(
91
92
  var(--_sonic-xy-x-high) * var(--_sonic-xy-travel-x) + var(--_sonic-xy-puck) / 2 *
92
- (2 - sign(1 - var(--_sonic-xy-x-high)))
93
+ (2 - clamp(0, (1 - var(--_sonic-xy-x-high)) * 100000, 1))
93
94
  ),
94
95
  transparent 0
95
96
  ),
96
97
  var(--_sonic-unlit);
97
98
  }
98
99
 
99
- &::after {
100
+ .sonic-xy-field::after {
100
101
  inset: 0 auto 0
101
102
  calc(
102
103
  var(--_sonic-xy-x, 0) * var(--_sonic-xy-travel-x) +
@@ -109,20 +110,19 @@
109
110
  transparent
110
111
  calc(
111
112
  var(--_sonic-xy-y-low) * var(--_sonic-xy-travel-y) + var(--_sonic-xy-puck) / 2 *
112
- sign(var(--_sonic-xy-y-low))
113
+ clamp(0, var(--_sonic-xy-y-low) * 100000, 1)
113
114
  ),
114
115
  var(--_sonic-xy-lit) 0
115
116
  calc(
116
117
  var(--_sonic-xy-y-high) * var(--_sonic-xy-travel-y) + var(--_sonic-xy-puck) / 2 *
117
- (2 - sign(1 - var(--_sonic-xy-y-high)))
118
+ (2 - clamp(0, (1 - var(--_sonic-xy-y-high)) * 100000, 1))
118
119
  ),
119
120
  transparent 0
120
121
  ),
121
122
  var(--_sonic-unlit);
122
123
  }
123
- }
124
124
 
125
- :is(.sonic-xy-bracket, .sonic-xy-puck) {
125
+ :is(.sonic-xy-reticle, .sonic-xy-puck) {
126
126
  position: absolute;
127
127
  inset: auto auto calc(var(--_sonic-xy-y, 0) * var(--_sonic-xy-travel-y))
128
128
  calc(var(--_sonic-xy-x, 0) * var(--_sonic-xy-travel-x));
@@ -131,8 +131,8 @@
131
131
  border-radius: 50%;
132
132
  }
133
133
 
134
- .sonic-xy-bracket {
135
- --_sonic-bracket-size: var(--_sonic-xy-puck);
134
+ .sonic-xy-reticle {
135
+ --_sonic-reticle-size: var(--_sonic-xy-puck);
136
136
  }
137
137
 
138
138
  .sonic-xy-puck {
@@ -146,8 +146,9 @@
146
146
  cursor: var(--_sonic-xy-cursor);
147
147
  filter: drop-shadow(0 0 calc(0.15 * var(--_sonic-xy-puck)) var(--_sonic-xy-puck-glow));
148
148
  transition: filter var(--_sonic-fade-duration) ease-out;
149
+ }
149
150
 
150
- &::before {
151
+ .sonic-xy-puck::before {
151
152
  position: absolute;
152
153
  inset: 25%;
153
154
  pointer-events: none;
@@ -162,7 +163,6 @@
162
163
  border-color var(--_sonic-fade-duration) ease-out,
163
164
  outline-color var(--_sonic-fade-duration) ease-out;
164
165
  }
165
- }
166
166
 
167
167
  @media (hover: hover) {
168
168
  :not(:disabled, :state(dragging)) > .sonic-xy > .sonic-xy-puck:hover {
@@ -208,10 +208,10 @@
208
208
  forced-color-adjust: none;
209
209
 
210
210
  /* The axis's own outline is the focus here */
211
- &::before {
211
+ }
212
+ .sonic-xy-puck::before {
212
213
  outline-style: none;
213
214
  }
214
- }
215
215
 
216
216
  :state(dragging) > .sonic-xy > .sonic-xy-puck {
217
217
  --_sonic-xy-puck-fill: Canvas;
@@ -224,10 +224,10 @@
224
224
 
225
225
  .sonic-xy-axis:focus-visible {
226
226
  outline-offset: 2px;
227
+ }
227
228
 
228
- &[data-sonic-pointer-focus] {
229
+ .sonic-xy-axis[data-sonic-pointer-focus]:focus-visible {
229
230
  outline-style: none;
230
231
  }
231
- }
232
232
  }
233
233
  }