@xsynaptic/sonic-ui 0.10.4 → 0.13.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 (119) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +39 -15
  3. package/dist/default/define/toggle.js +7 -0
  4. package/dist/default/define.js +1 -0
  5. package/dist/default/elements/button.js +7 -1
  6. package/dist/default/elements/dial.js +7 -1
  7. package/dist/default/elements/display-element.js +5 -1
  8. package/dist/default/elements/envelope.js +6 -1
  9. package/dist/default/elements/meter.js +1 -1
  10. package/dist/default/elements/number.js +7 -1
  11. package/dist/default/elements/position-group.js +163 -0
  12. package/dist/default/elements/radio-group.js +34 -12
  13. package/dist/default/elements/segmented.js +5 -1
  14. package/dist/default/elements/slider.js +7 -1
  15. package/dist/default/elements/sonic-element.js +1 -1
  16. package/dist/default/elements/switch.js +34 -168
  17. package/dist/default/elements/toggle.js +193 -0
  18. package/dist/default/elements/value-element.js +3 -0
  19. package/dist/default/elements/value-gestures.js +7 -0
  20. package/dist/default/elements/wave-element.js +8 -1
  21. package/dist/default/elements/waveform.js +159 -13
  22. package/dist/default/elements/wavestrip.js +4 -0
  23. package/dist/default/elements/xy.js +7 -1
  24. package/dist/default/index.js +2 -1
  25. package/dist/default/lib/key-press.js +27 -0
  26. package/dist/default/lib/toggle-travel.js +19 -0
  27. package/dist/default/lib/zoom-gesture.js +19 -0
  28. package/dist/dev/define/toggle.d.ts +2 -0
  29. package/dist/dev/define/toggle.js +8 -0
  30. package/dist/dev/define/toggle.js.map +1 -0
  31. package/dist/dev/define.d.ts +3 -1
  32. package/dist/dev/define.js +1 -0
  33. package/dist/dev/elements/button.js +7 -1
  34. package/dist/dev/elements/button.js.map +1 -1
  35. package/dist/dev/elements/dial.js +7 -1
  36. package/dist/dev/elements/dial.js.map +1 -1
  37. package/dist/dev/elements/display-element.js +5 -1
  38. package/dist/dev/elements/display-element.js.map +1 -1
  39. package/dist/dev/elements/envelope.js +6 -1
  40. package/dist/dev/elements/envelope.js.map +1 -1
  41. package/dist/dev/elements/meter.js +1 -1
  42. package/dist/dev/elements/meter.js.map +1 -1
  43. package/dist/dev/elements/number.js +7 -1
  44. package/dist/dev/elements/number.js.map +1 -1
  45. package/dist/dev/elements/position-group.d.ts +38 -0
  46. package/dist/dev/elements/position-group.js +164 -0
  47. package/dist/dev/elements/position-group.js.map +1 -0
  48. package/dist/dev/elements/radio-group.d.ts +4 -0
  49. package/dist/dev/elements/radio-group.js +34 -12
  50. package/dist/dev/elements/radio-group.js.map +1 -1
  51. package/dist/dev/elements/segmented.js +5 -1
  52. package/dist/dev/elements/segmented.js.map +1 -1
  53. package/dist/dev/elements/slider.js +7 -1
  54. package/dist/dev/elements/slider.js.map +1 -1
  55. package/dist/dev/elements/sonic-element.d.ts +16 -1
  56. package/dist/dev/elements/sonic-element.js +27 -5
  57. package/dist/dev/elements/sonic-element.js.map +1 -1
  58. package/dist/dev/elements/switch.d.ts +4 -19
  59. package/dist/dev/elements/switch.js +34 -168
  60. package/dist/dev/elements/switch.js.map +1 -1
  61. package/dist/dev/elements/toggle.d.ts +21 -0
  62. package/dist/dev/elements/toggle.js +201 -0
  63. package/dist/dev/elements/toggle.js.map +1 -0
  64. package/dist/dev/elements/value-element.d.ts +1 -0
  65. package/dist/dev/elements/value-element.js +3 -0
  66. package/dist/dev/elements/value-element.js.map +1 -1
  67. package/dist/dev/elements/value-gestures.js +7 -0
  68. package/dist/dev/elements/value-gestures.js.map +1 -1
  69. package/dist/dev/elements/wave-element.js +8 -1
  70. package/dist/dev/elements/wave-element.js.map +1 -1
  71. package/dist/dev/elements/waveform.d.ts +11 -1
  72. package/dist/dev/elements/waveform.js +159 -13
  73. package/dist/dev/elements/waveform.js.map +1 -1
  74. package/dist/dev/elements/wavestrip.d.ts +1 -0
  75. package/dist/dev/elements/wavestrip.js +4 -0
  76. package/dist/dev/elements/wavestrip.js.map +1 -1
  77. package/dist/dev/elements/xy.js +7 -1
  78. package/dist/dev/elements/xy.js.map +1 -1
  79. package/dist/dev/index.d.ts +3 -2
  80. package/dist/dev/index.js +2 -1
  81. package/dist/dev/lib/key-press.js +28 -0
  82. package/dist/dev/lib/key-press.js.map +1 -0
  83. package/dist/dev/lib/toggle-travel.js +20 -0
  84. package/dist/dev/lib/toggle-travel.js.map +1 -0
  85. package/dist/dev/lib/zoom-gesture.js +20 -0
  86. package/dist/dev/lib/zoom-gesture.js.map +1 -0
  87. package/dist/styles/button.css +5 -3
  88. package/dist/styles/controls.css +1 -0
  89. package/dist/styles/dial.css +3 -1
  90. package/dist/styles/envelope.css +3 -1
  91. package/dist/styles/led.css +19 -14
  92. package/dist/styles/material/arc.css +21 -0
  93. package/dist/styles/material/bracket.css +31 -0
  94. package/dist/styles/material/cap.css +179 -0
  95. package/dist/styles/material/core.css +103 -0
  96. package/dist/styles/material/glass.css +62 -0
  97. package/dist/styles/material/groove.css +10 -0
  98. package/dist/styles/material/keycap.css +95 -0
  99. package/dist/styles/material/lens.css +11 -0
  100. package/dist/styles/material/pane.css +97 -0
  101. package/dist/styles/material/readout.css +87 -0
  102. package/dist/styles/material/scale.css +30 -0
  103. package/dist/styles/material/value.css +43 -0
  104. package/dist/styles/material/well.css +24 -0
  105. package/dist/styles/material.css +15 -745
  106. package/dist/styles/meter.css +10 -7
  107. package/dist/styles/number.css +3 -1
  108. package/dist/styles/panel.css +3 -1
  109. package/dist/styles/ring.css +3 -1
  110. package/dist/styles/screen.css +3 -1
  111. package/dist/styles/segmented.css +11 -5
  112. package/dist/styles/slider.css +3 -1
  113. package/dist/styles/spectrum.css +5 -3
  114. package/dist/styles/switch.css +9 -3
  115. package/dist/styles/toggle.css +483 -0
  116. package/dist/styles/waveform.css +3 -1
  117. package/dist/styles/wavestrip.css +3 -1
  118. package/dist/styles/xy.css +3 -1
  119. package/package.json +3 -1
@@ -0,0 +1,483 @@
1
+ @layer sonic.material, sonic.control;
2
+
3
+ @property --_sonic-toggle-size {
4
+ syntax: '<length>';
5
+ inherits: true;
6
+ initial-value: 32px;
7
+ }
8
+
9
+ @property --_sonic-toggle-at {
10
+ syntax: '<number>';
11
+ inherits: true;
12
+ initial-value: 0;
13
+ }
14
+
15
+ @property --_sonic-toggle-sink {
16
+ syntax: '<length>';
17
+ inherits: true;
18
+ initial-value: 0;
19
+ }
20
+
21
+ @property --_sonic-toggle-well-tint {
22
+ syntax: '<color>';
23
+ inherits: false;
24
+ initial-value: transparent;
25
+ }
26
+
27
+ @layer sonic.control {
28
+ :is(sonic-toggle, .sonic-toggle) {
29
+ --_sonic-toggle-size: var(--sonic-toggle-size, 2rem);
30
+ }
31
+
32
+ :has(> .sonic-toggle):not([hidden]) {
33
+ display: contents;
34
+ }
35
+
36
+ sonic-toggle:not(:defined, [hidden]) {
37
+ display: block;
38
+ visibility: hidden;
39
+ flex-shrink: 0;
40
+ inline-size: var(--_sonic-toggle-size);
41
+ block-size: var(--_sonic-toggle-size);
42
+ overflow: hidden;
43
+ }
44
+
45
+ .sonic-toggle {
46
+ --_sonic-toggle-travel-ratio: var(--sonic-toggle-travel-ratio, 0.75);
47
+ --_sonic-toggle-gap-ratio: var(
48
+ --sonic-toggle-gap-ratio,
49
+ calc(0.14 - 0.06 * var(--_sonic-relief))
50
+ );
51
+ --_sonic-toggle-radius-ratio: var(--sonic-toggle-radius-ratio, 0.5);
52
+ --_sonic-toggle-bevel-ratio: var(--sonic-toggle-bevel-ratio, 0.075);
53
+ --_sonic-toggle-depth-ratio: var(--sonic-toggle-depth-ratio, calc(0.03 * var(--_sonic-relief)));
54
+ --_sonic-toggle-font-ratio: var(--sonic-toggle-font-ratio, 0.26);
55
+ --_sonic-toggle-press-scale: var(--sonic-toggle-press-scale, 0.985);
56
+ --_sonic-toggle-icon-ratio: var(--sonic-toggle-icon-ratio, 0.5);
57
+ --_sonic-toggle-led-ratio: var(--sonic-toggle-led-ratio, 0.25);
58
+ --_sonic-toggle-well-glow: color-mix(
59
+ in oklab,
60
+ var(--_sonic-lit) calc(100% * var(--_sonic-relief)),
61
+ transparent
62
+ );
63
+ --_sonic-toggle-well-lit: var(--sonic-well-lit, var(--_sonic-toggle-well-glow));
64
+ --_sonic-toggle-well-fill: transparent;
65
+ --_sonic-toggle-sink: 0px;
66
+ --_sonic-toggle-well-forced: Canvas;
67
+ --_sonic-toggle-count: 2;
68
+ --_sonic-toggle-along-x: 1;
69
+ --_sonic-toggle-along-y: 0;
70
+ --_sonic-toggle-disc: var(--_sonic-ink);
71
+ --_sonic-cap: var(--sonic-cap, var(--_sonic-toggle-disc));
72
+ --_sonic-cap-hover: var(--sonic-cap-hover, var(--sonic-cap, var(--_sonic-toggle-disc)));
73
+ --_sonic-toggle-pole: oklch(from var(--_sonic-cap) clamp(0, (0.6 - l) * 1000, 1) 0 0deg / 100%);
74
+ --_sonic-toggle-ink-set: color-mix(in oklab, var(--sonic-cap) 0%, var(--_sonic-ink));
75
+ --_sonic-toggle-legend: var(--_sonic-toggle-ink-set, var(--_sonic-toggle-pole));
76
+ --_sonic-toggle-legend-lit: var(--_sonic-legend-lit, var(--_sonic-toggle-pole));
77
+ --_sonic-toggle-well-edge-off: color-mix(in oklab, var(--sonic-well) 0%, transparent);
78
+ --_sonic-toggle-well-edge: var(--_sonic-toggle-well-edge-off, var(--_sonic-etch));
79
+ --_sonic-toggle-led-ring-off: color-mix(in oklab, var(--sonic-cap) 0%, transparent);
80
+ --_sonic-toggle-led-ring: var(--_sonic-toggle-led-ring-off, var(--_sonic-toggle-pole));
81
+ --_sonic-unit: calc(var(--_sonic-toggle-size) / 32);
82
+ --_sonic-toggle-step: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-travel-ratio));
83
+ --_sonic-toggle-gap: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-gap-ratio));
84
+ --_sonic-toggle-cap-size: calc(var(--_sonic-toggle-size) - 2 * var(--_sonic-toggle-gap));
85
+ --_sonic-toggle-slice: calc(
86
+ (var(--_sonic-toggle-size) + var(--_sonic-toggle-run)) / var(--_sonic-toggle-count)
87
+ );
88
+ --_sonic-toggle-run: calc((var(--_sonic-toggle-count) - 1) * var(--_sonic-toggle-step));
89
+ --_sonic-toggle-mid: calc((var(--_sonic-toggle-count) - 1) / 2);
90
+ --_sonic-toggle-throw: calc(
91
+ (var(--_sonic-toggle-at) - var(--_sonic-toggle-mid)) * var(--_sonic-toggle-step)
92
+ );
93
+ --_sonic-toggle-corner: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-radius-ratio));
94
+ --_sonic-keycap-depth: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-depth-ratio));
95
+ --_sonic-keycap-corner: max(0px, var(--_sonic-toggle-corner) - var(--_sonic-toggle-gap));
96
+ --_sonic-keycap-bevel: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-bevel-ratio));
97
+ --_sonic-keycap-face-corner: max(0px, var(--_sonic-keycap-corner) - var(--_sonic-keycap-bevel));
98
+
99
+ position: relative;
100
+ display: inline-grid;
101
+ flex-shrink: 0;
102
+ grid-template-rows: var(--_sonic-toggle-size);
103
+ grid-auto-columns: var(--_sonic-toggle-slice);
104
+ grid-auto-flow: column;
105
+ line-height: 1;
106
+ touch-action: pan-y;
107
+ user-select: none;
108
+ transition:
109
+ --_sonic-toggle-at 120ms cubic-bezier(0.4, 0, 0.2, 1),
110
+ --_sonic-toggle-sink 60ms cubic-bezier(0.4, 0, 0.2, 1);
111
+ }
112
+
113
+ [orientation='vertical'] > .sonic-toggle {
114
+ --_sonic-toggle-along-x: 0;
115
+ --_sonic-toggle-along-y: 1;
116
+
117
+ grid-template-rows: none;
118
+ grid-template-columns: var(--_sonic-toggle-size);
119
+ grid-auto-rows: var(--_sonic-toggle-slice);
120
+ grid-auto-flow: row;
121
+ touch-action: pan-x;
122
+ }
123
+
124
+ :state(dragging) > .sonic-toggle {
125
+ transition: --_sonic-toggle-sink 60ms cubic-bezier(0.4, 0, 0.2, 1);
126
+ }
127
+
128
+ [data-sonic-lit='ok'] > .sonic-toggle:has(> [role='switch']),
129
+ .sonic-toggle:has(> [aria-checked='true'] [data-sonic-lit='ok']) {
130
+ --_sonic-lit: var(--_sonic-lit-ok);
131
+ }
132
+
133
+ [data-sonic-lit='warning'] > .sonic-toggle:has(> [role='switch']),
134
+ .sonic-toggle:has(> [aria-checked='true'] [data-sonic-lit='warning']) {
135
+ --_sonic-lit: var(--_sonic-lit-warning);
136
+ }
137
+
138
+ [data-sonic-lit='danger'] > .sonic-toggle:has(> [role='switch']),
139
+ .sonic-toggle:has(> [aria-checked='true'] [data-sonic-lit='danger']) {
140
+ --_sonic-lit: var(--_sonic-lit-danger);
141
+ }
142
+
143
+ /* `--sonic-well-lit` holds a skin's one lit colour, so a coloured position takes only whether it is set */
144
+ [data-sonic-lit]:where(:not([data-sonic-lit=''], [data-sonic-lit='idle']))
145
+ > .sonic-toggle:has(> [role='switch']),
146
+ .sonic-toggle:has(
147
+ > [aria-checked='true']
148
+ [data-sonic-lit]:where(:not([data-sonic-lit=''], [data-sonic-lit='idle']))
149
+ ) {
150
+ --_sonic-toggle-well-lit-set: color-mix(in oklab, var(--sonic-well-lit) 0%, var(--_sonic-lit));
151
+ --_sonic-toggle-well-lit: var(--_sonic-toggle-well-lit-set, var(--_sonic-toggle-well-glow));
152
+ }
153
+
154
+ :where([data-sonic-lit]) > .sonic-toggle:has(> [role='switch'][aria-checked='true']),
155
+ .sonic-toggle:has(> [aria-checked='true'] [data-sonic-lit]) {
156
+ --_sonic-toggle-disc: var(--_sonic-lit);
157
+ --_sonic-toggle-well-fill: var(--_sonic-toggle-well-lit);
158
+ --_sonic-toggle-well-forced: var(--_sonic-lit);
159
+ }
160
+
161
+ .sonic-toggle:not(:has(> .sonic-toggle-position:not(:disabled))) {
162
+ --_sonic-lit: var(--_sonic-lit-disabled);
163
+ --_sonic-toggle-disc: var(--_sonic-etch);
164
+ --_sonic-toggle-ink-set: color-mix(in oklab, var(--sonic-cap) 0%, var(--_sonic-etch));
165
+ --_sonic-legend-lit: color-mix(in oklab, var(--sonic-cap) 0%, var(--_sonic-lit));
166
+ }
167
+
168
+ .sonic-toggle:has(> .sonic-toggle-position:focus-visible) {
169
+ --_sonic-cap: var(--_sonic-cap-hover);
170
+ --_sonic-focus-shadow: var(--_sonic-focus-glow);
171
+ }
172
+
173
+ @media (hover: hover) {
174
+ .sonic-toggle:has(> .sonic-toggle-position:not(:disabled):hover) {
175
+ --_sonic-cap: var(--_sonic-cap-hover);
176
+ }
177
+ }
178
+
179
+ /* Held, never resting: the chosen position's cap stands as proud as any other */
180
+ .sonic-toggle:has(> .sonic-toggle-position[data-sonic-pressed]):has(
181
+ > .sonic-toggle-position:not(:disabled)
182
+ ) {
183
+ --_sonic-toggle-sink: calc(var(--_sonic-keycap-depth) / 2);
184
+ --_sonic-keycap-scale: var(--_sonic-toggle-press-scale);
185
+ --_sonic-keycap-drop: var(--_sonic-press-drop);
186
+ }
187
+
188
+ .sonic-toggle-well {
189
+ --_sonic-toggle-well-tint: var(--_sonic-toggle-well-fill);
190
+
191
+ position: absolute;
192
+ inset: 0;
193
+ inline-size: calc(
194
+ var(--_sonic-toggle-size) + var(--_sonic-toggle-along-x) * var(--_sonic-toggle-run)
195
+ );
196
+ block-size: calc(
197
+ var(--_sonic-toggle-size) + var(--_sonic-toggle-along-y) * var(--_sonic-toggle-run)
198
+ );
199
+ margin: auto;
200
+ pointer-events: none;
201
+ background:
202
+ linear-gradient(var(--_sonic-toggle-well-tint), var(--_sonic-toggle-well-tint)),
203
+ var(--_sonic-well-floor);
204
+ border-radius: var(--_sonic-toggle-corner);
205
+ box-shadow:
206
+ var(--_sonic-well),
207
+ inset 0 0 0 calc(1px * (1 - var(--_sonic-relief))) var(--_sonic-toggle-well-edge);
208
+ transition: --_sonic-toggle-well-tint 120ms ease-out;
209
+ }
210
+
211
+ /* The position rides `--_sonic-toggle-at`, which already eases; easing the offset too would trail a drag */
212
+ .sonic-toggle-cap {
213
+ position: absolute;
214
+ inset: 0;
215
+ inline-size: var(--_sonic-toggle-cap-size);
216
+ block-size: var(--_sonic-toggle-cap-size);
217
+ margin: auto;
218
+ pointer-events: none;
219
+ translate: calc(var(--_sonic-toggle-along-x) * var(--_sonic-toggle-throw))
220
+ calc(var(--_sonic-toggle-along-y) * var(--_sonic-toggle-throw) + var(--_sonic-toggle-sink));
221
+ transition:
222
+ scale 60ms cubic-bezier(0.4, 0, 0.2, 1),
223
+ box-shadow 60ms cubic-bezier(0.4, 0, 0.2, 1);
224
+
225
+ & > .sonic-led {
226
+ --_sonic-led-size: var(
227
+ --sonic-led-size,
228
+ calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-led-ratio))
229
+ );
230
+ --_sonic-lit: inherit;
231
+
232
+ box-shadow: inset 0 0 0 max(1px, 0.1 * var(--_sonic-led-size)) var(--_sonic-toggle-led-ring);
233
+ }
234
+
235
+ & > * {
236
+ color: var(--_sonic-toggle-legend);
237
+ }
238
+ }
239
+
240
+ .sonic-toggle-position {
241
+ position: relative;
242
+ padding: 0;
243
+ font: inherit;
244
+ font-size: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-font-ratio));
245
+ line-height: 1;
246
+ color: inherit;
247
+ text-transform: inherit;
248
+ letter-spacing: inherit;
249
+ cursor: pointer;
250
+ background: transparent;
251
+ border: 0;
252
+ }
253
+
254
+ .sonic-toggle-position:focus-visible {
255
+ outline: 2px solid transparent;
256
+ outline-offset: -2px;
257
+ }
258
+
259
+ .sonic-toggle-position:disabled {
260
+ cursor: default;
261
+ }
262
+
263
+ .sonic-toggle-position:has([data-sonic-momentary]),
264
+ .sonic-toggle[data-sonic-position-count='2']:has([data-sonic-momentary])
265
+ > .sonic-toggle-position {
266
+ touch-action: none;
267
+ }
268
+
269
+ .sonic-toggle-position::after {
270
+ inset-inline: 0;
271
+ }
272
+
273
+ [orientation='vertical'] > .sonic-toggle > .sonic-toggle-position::after {
274
+ inset-block: 0;
275
+ inset-inline: var(--_sonic-target-outset);
276
+ }
277
+
278
+ .sonic-toggle-position[role='switch'] {
279
+ grid-column: span 2;
280
+ }
281
+
282
+ [orientation='vertical'] > .sonic-toggle > .sonic-toggle-position[role='switch'] {
283
+ grid-row: span 2;
284
+ grid-column: auto;
285
+ }
286
+
287
+ /* Every legend sits at the cap, so a press must fall through to the position under it */
288
+ .sonic-toggle-legend {
289
+ --_sonic-toggle-ride: calc(
290
+ var(--_sonic-toggle-throw) - (var(--_sonic-toggle-index, 0) - var(--_sonic-toggle-mid)) *
291
+ var(--_sonic-toggle-slice)
292
+ );
293
+
294
+ position: absolute;
295
+ inset: 0;
296
+ display: grid;
297
+ place-items: center;
298
+ inline-size: var(--_sonic-toggle-cap-size);
299
+ block-size: var(--_sonic-toggle-cap-size);
300
+ margin: auto;
301
+ color: var(--_sonic-toggle-legend);
302
+ white-space: nowrap;
303
+ pointer-events: none;
304
+ opacity: 0;
305
+ translate: calc(var(--_sonic-toggle-along-x) * var(--_sonic-toggle-ride))
306
+ calc(var(--_sonic-toggle-along-y) * var(--_sonic-toggle-ride) + var(--_sonic-toggle-sink));
307
+ transition: opacity 120ms ease-out;
308
+
309
+ & > * {
310
+ filter: var(--_sonic-engraving);
311
+ }
312
+ }
313
+
314
+ :is(.sonic-toggle-cap, .sonic-toggle-legend) > svg {
315
+ display: block;
316
+ inline-size: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-icon-ratio));
317
+ block-size: calc(var(--_sonic-toggle-size) * var(--_sonic-toggle-icon-ratio));
318
+ }
319
+
320
+ .sonic-toggle-position[aria-checked='true'] > .sonic-toggle-legend {
321
+ opacity: 1;
322
+ }
323
+
324
+ .sonic-toggle-position[aria-checked='true']:has([data-sonic-lit]) > .sonic-toggle-legend {
325
+ color: var(--_sonic-toggle-legend-lit);
326
+
327
+ & > * {
328
+ filter: var(--_sonic-engraving) var(--_sonic-legend-glow);
329
+ }
330
+ }
331
+
332
+ [legends='outside'] > .sonic-toggle[data-sonic-position-count] {
333
+ & > :is(.sonic-toggle-well, .sonic-toggle-cap) {
334
+ grid-area: 1 / 2 / 2 / -2;
335
+ }
336
+
337
+ & > .sonic-toggle-position {
338
+ display: grid;
339
+ grid-area: 1 / 1 / 2 / 3;
340
+ grid-template: subgrid / subgrid;
341
+ place-items: center;
342
+ }
343
+
344
+ & > .sonic-toggle-position > .sonic-toggle-legend {
345
+ position: static;
346
+ display: block;
347
+ inline-size: auto;
348
+ block-size: auto;
349
+ padding: calc(var(--_sonic-toggle-size) * 0.12);
350
+ margin: 0;
351
+ color: inherit;
352
+ pointer-events: auto;
353
+ opacity: 1;
354
+ translate: none;
355
+
356
+ & > * {
357
+ filter: none;
358
+ }
359
+ }
360
+
361
+ & > .sonic-toggle-position:disabled > .sonic-toggle-legend {
362
+ color: color-mix(in oklab, currentcolor 30%, transparent);
363
+ }
364
+
365
+ & > .sonic-toggle-position:last-child > .sonic-toggle-legend {
366
+ grid-column: 2;
367
+ }
368
+ }
369
+
370
+ [legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count] {
371
+ & > :is(.sonic-toggle-well, .sonic-toggle-cap) {
372
+ grid-area: 2 / 1 / -2 / 2;
373
+ }
374
+
375
+ & > .sonic-toggle-position {
376
+ grid-area: 1 / 1 / 3 / 2;
377
+ }
378
+
379
+ & > .sonic-toggle-position:last-child > .sonic-toggle-legend {
380
+ grid-area: 2 / 1;
381
+ }
382
+ }
383
+
384
+ [legends='outside'] > .sonic-toggle[data-sonic-position-count='2'] {
385
+ grid-template: var(--_sonic-toggle-size) / auto repeat(2, var(--_sonic-toggle-slice)) auto;
386
+
387
+ & > .sonic-toggle-position:last-child {
388
+ grid-area: 1 / 3 / 2 / 5;
389
+ }
390
+ }
391
+
392
+ [legends='outside'] > .sonic-toggle[data-sonic-position-count='3'] {
393
+ grid-template: var(--_sonic-toggle-size) auto / auto repeat(3, var(--_sonic-toggle-slice)) auto;
394
+
395
+ & > .sonic-toggle-position:last-child {
396
+ grid-area: 1 / 4 / 2 / 6;
397
+ }
398
+
399
+ & > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position) {
400
+ grid-area: 1 / 3 / 3 / 4;
401
+
402
+ & > .sonic-toggle-legend {
403
+ grid-row: 2;
404
+ }
405
+ }
406
+ }
407
+
408
+ [legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='2'] {
409
+ grid-template:
410
+ auto repeat(2, var(--_sonic-toggle-slice)) auto /
411
+ minmax(var(--_sonic-toggle-size), auto);
412
+
413
+ & > .sonic-toggle-position:last-child {
414
+ grid-area: 3 / 1 / 5 / 2;
415
+ }
416
+ }
417
+
418
+ [legends='outside'][orientation='vertical'] > .sonic-toggle[data-sonic-position-count='3'] {
419
+ grid-template:
420
+ auto repeat(3, var(--_sonic-toggle-slice)) auto /
421
+ minmax(var(--_sonic-toggle-size), auto) auto;
422
+
423
+ & > .sonic-toggle-position:last-child {
424
+ grid-area: 4 / 1 / 6 / 2;
425
+ }
426
+
427
+ & > .sonic-toggle-position:nth-child(2 of .sonic-toggle-position) {
428
+ grid-area: 3 / 1 / 4 / 3;
429
+
430
+ & > .sonic-toggle-legend {
431
+ grid-area: 1 / 2;
432
+ }
433
+ }
434
+ }
435
+
436
+ @media (prefers-reduced-motion: reduce) {
437
+ .sonic-toggle,
438
+ :state(dragging) > .sonic-toggle,
439
+ .sonic-toggle-well,
440
+ .sonic-toggle-cap,
441
+ .sonic-toggle-legend {
442
+ transition: none;
443
+ }
444
+ }
445
+
446
+ @media (forced-colors: active) {
447
+ .sonic-toggle {
448
+ --_sonic-skirt: CanvasText;
449
+ --_sonic-face: CanvasText;
450
+ --_sonic-rim: 0 0 0 var(--_sonic-rim-width) Canvas;
451
+ --_sonic-toggle-legend: Canvas;
452
+ --_sonic-toggle-legend-lit: Canvas;
453
+ --_sonic-toggle-led-ring: transparent;
454
+ }
455
+
456
+ .sonic-toggle:not(:has(> .sonic-toggle-position:not(:disabled))) {
457
+ --_sonic-skirt: GrayText;
458
+ --_sonic-face: GrayText;
459
+ }
460
+
461
+ .sonic-toggle-well {
462
+ forced-color-adjust: none;
463
+ background: var(--_sonic-toggle-well-forced);
464
+ box-shadow: inset 0 0 0 1px CanvasText;
465
+ }
466
+
467
+ .sonic-toggle-position:focus-visible {
468
+ outline-offset: 2px;
469
+ }
470
+
471
+ .sonic-toggle-legend {
472
+ forced-color-adjust: none;
473
+ }
474
+
475
+ [legends='outside'] > .sonic-toggle > .sonic-toggle-position > .sonic-toggle-legend {
476
+ forced-color-adjust: auto;
477
+ }
478
+
479
+ .sonic-toggle-position > .sonic-toggle-legend > * {
480
+ filter: none;
481
+ }
482
+ }
483
+ }
@@ -1,3 +1,5 @@
1
+ @layer sonic.material, sonic.control;
2
+
1
3
  @property --_sonic-waveform-size {
2
4
  syntax: '<length>';
3
5
  inherits: true;
@@ -64,7 +66,7 @@
64
66
  initial-value: rgb(200 200 208);
65
67
  }
66
68
 
67
- @layer sonic {
69
+ @layer sonic.control {
68
70
  :is(sonic-waveform, .sonic-waveform) {
69
71
  --_sonic-waveform-size: var(--sonic-waveform-size, 6rem);
70
72
  --_sonic-waveform-length: var(--sonic-waveform-length, 20rem);
@@ -1,3 +1,5 @@
1
+ @layer sonic.material, sonic.control;
2
+
1
3
  @property --_sonic-wavestrip-size {
2
4
  syntax: '<length>';
3
5
  inherits: true;
@@ -82,7 +84,7 @@
82
84
  initial-value: 48px;
83
85
  }
84
86
 
85
- @layer sonic {
87
+ @layer sonic.control {
86
88
  :is(sonic-wavestrip, .sonic-wavestrip) {
87
89
  --_sonic-wavestrip-size: var(--sonic-wavestrip-size, 3.5rem);
88
90
  --_sonic-wavestrip-length: var(--sonic-wavestrip-length, 16rem);
@@ -1,10 +1,12 @@
1
+ @layer sonic.material, sonic.control;
2
+
1
3
  @property --_sonic-xy-size {
2
4
  syntax: '<length>';
3
5
  inherits: true;
4
6
  initial-value: 128px;
5
7
  }
6
8
 
7
- @layer sonic {
9
+ @layer sonic.control {
8
10
  :is(sonic-xy, .sonic-xy) {
9
11
  --_sonic-xy-size: var(--sonic-xy-size, 8rem);
10
12
  --_sonic-xy-aspect-ratio: var(--sonic-xy-aspect-ratio, 1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsynaptic/sonic-ui",
3
- "version": "0.10.4",
3
+ "version": "0.13.0",
4
4
  "description": "Native custom elements for audio interfaces, skinned with CSS custom properties",
5
5
  "keywords": [
6
6
  "custom-elements",
@@ -55,6 +55,7 @@
55
55
  },
56
56
  "./controls.css": "./dist/styles/controls.css",
57
57
  "./material.css": "./dist/styles/material.css",
58
+ "./material/*.css": "./dist/styles/material/*.css",
58
59
  "./button.css": "./dist/styles/button.css",
59
60
  "./dial.css": "./dist/styles/dial.css",
60
61
  "./envelope.css": "./dist/styles/envelope.css",
@@ -68,6 +69,7 @@
68
69
  "./slider.css": "./dist/styles/slider.css",
69
70
  "./spectrum.css": "./dist/styles/spectrum.css",
70
71
  "./switch.css": "./dist/styles/switch.css",
72
+ "./toggle.css": "./dist/styles/toggle.css",
71
73
  "./waveform.css": "./dist/styles/waveform.css",
72
74
  "./wavestrip.css": "./dist/styles/wavestrip.css",
73
75
  "./xy.css": "./dist/styles/xy.css",