@xsynaptic/sonic-ui 0.12.0 → 0.14.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 (88) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +35 -0
  3. package/dist/default/elements/button.js +5 -1
  4. package/dist/default/elements/dial.js +7 -1
  5. package/dist/default/elements/display-element.js +5 -1
  6. package/dist/default/elements/envelope.js +6 -1
  7. package/dist/default/elements/meter.js +1 -1
  8. package/dist/default/elements/number.js +7 -1
  9. package/dist/default/elements/segmented.js +5 -1
  10. package/dist/default/elements/slider.js +8 -2
  11. package/dist/default/elements/sonic-element.js +1 -1
  12. package/dist/default/elements/switch.js +1 -1
  13. package/dist/default/elements/toggle.js +5 -1
  14. package/dist/default/elements/value-element.js +3 -0
  15. package/dist/default/elements/value-gestures.js +7 -0
  16. package/dist/default/elements/wave-element.js +8 -1
  17. package/dist/default/elements/waveform.js +129 -3
  18. package/dist/default/elements/xy.js +7 -1
  19. package/dist/default/lib/zoom-gesture.js +19 -0
  20. package/dist/dev/elements/button.js +5 -1
  21. package/dist/dev/elements/button.js.map +1 -1
  22. package/dist/dev/elements/dial.js +7 -1
  23. package/dist/dev/elements/dial.js.map +1 -1
  24. package/dist/dev/elements/display-element.js +5 -1
  25. package/dist/dev/elements/display-element.js.map +1 -1
  26. package/dist/dev/elements/envelope.js +6 -1
  27. package/dist/dev/elements/envelope.js.map +1 -1
  28. package/dist/dev/elements/meter.js +1 -1
  29. package/dist/dev/elements/meter.js.map +1 -1
  30. package/dist/dev/elements/number.js +7 -1
  31. package/dist/dev/elements/number.js.map +1 -1
  32. package/dist/dev/elements/segmented.js +5 -1
  33. package/dist/dev/elements/segmented.js.map +1 -1
  34. package/dist/dev/elements/slider.js +8 -2
  35. package/dist/dev/elements/slider.js.map +1 -1
  36. package/dist/dev/elements/sonic-element.d.ts +16 -1
  37. package/dist/dev/elements/sonic-element.js +27 -5
  38. package/dist/dev/elements/sonic-element.js.map +1 -1
  39. package/dist/dev/elements/switch.js +1 -1
  40. package/dist/dev/elements/switch.js.map +1 -1
  41. package/dist/dev/elements/toggle.js +5 -1
  42. package/dist/dev/elements/toggle.js.map +1 -1
  43. package/dist/dev/elements/value-element.d.ts +1 -0
  44. package/dist/dev/elements/value-element.js +3 -0
  45. package/dist/dev/elements/value-element.js.map +1 -1
  46. package/dist/dev/elements/value-gestures.js +7 -0
  47. package/dist/dev/elements/value-gestures.js.map +1 -1
  48. package/dist/dev/elements/wave-element.js +8 -1
  49. package/dist/dev/elements/wave-element.js.map +1 -1
  50. package/dist/dev/elements/waveform.d.ts +10 -0
  51. package/dist/dev/elements/waveform.js +129 -3
  52. package/dist/dev/elements/waveform.js.map +1 -1
  53. package/dist/dev/elements/xy.js +7 -1
  54. package/dist/dev/elements/xy.js.map +1 -1
  55. package/dist/dev/lib/zoom-gesture.js +20 -0
  56. package/dist/dev/lib/zoom-gesture.js.map +1 -0
  57. package/dist/styles/button.css +3 -1
  58. package/dist/styles/dial.css +3 -1
  59. package/dist/styles/envelope.css +3 -1
  60. package/dist/styles/led.css +3 -1
  61. package/dist/styles/material/arc.css +21 -0
  62. package/dist/styles/material/bracket.css +31 -0
  63. package/dist/styles/material/cap.css +179 -0
  64. package/dist/styles/material/core.css +103 -0
  65. package/dist/styles/material/glass.css +62 -0
  66. package/dist/styles/material/groove.css +10 -0
  67. package/dist/styles/material/keycap.css +95 -0
  68. package/dist/styles/material/lens.css +11 -0
  69. package/dist/styles/material/pane.css +97 -0
  70. package/dist/styles/material/readout.css +87 -0
  71. package/dist/styles/material/scale.css +30 -0
  72. package/dist/styles/material/value.css +43 -0
  73. package/dist/styles/material/well.css +24 -0
  74. package/dist/styles/material.css +15 -772
  75. package/dist/styles/meter.css +3 -1
  76. package/dist/styles/number.css +3 -1
  77. package/dist/styles/panel.css +3 -1
  78. package/dist/styles/ring.css +3 -1
  79. package/dist/styles/screen.css +3 -1
  80. package/dist/styles/segmented.css +3 -1
  81. package/dist/styles/slider.css +34 -19
  82. package/dist/styles/spectrum.css +3 -1
  83. package/dist/styles/switch.css +3 -1
  84. package/dist/styles/toggle.css +3 -1
  85. package/dist/styles/waveform.css +3 -1
  86. package/dist/styles/wavestrip.css +3 -1
  87. package/dist/styles/xy.css +3 -1
  88. package/package.json +2 -1
@@ -1,772 +1,15 @@
1
- @property --_sonic-readout-size {
2
- syntax: '<length>';
3
- inherits: true;
4
- initial-value: 24px;
5
- }
6
-
7
- @property --_sonic-detent-zone {
8
- syntax: '<length>';
9
- inherits: true;
10
- initial-value: 8px;
11
- }
12
-
13
- @property --_sonic-reveal-delay {
14
- syntax: '<time>';
15
- inherits: true;
16
- initial-value: 250ms;
17
- }
18
-
19
- @keyframes sonic-glass-breathe {
20
- to {
21
- opacity: calc(0.4 * min(1, var(--_sonic-glass-texture)));
22
- }
23
- }
24
-
25
- @layer sonic {
26
- :is(
27
- .sonic-dial,
28
- .sonic-dial-readout,
29
- .sonic-envelope,
30
- .sonic-envelope-readout,
31
- .sonic-button,
32
- .sonic-led,
33
- .sonic-switch,
34
- .sonic-toggle,
35
- .sonic-meter,
36
- .sonic-number,
37
- .sonic-panel,
38
- .sonic-ring,
39
- .sonic-screen,
40
- .sonic-segmented,
41
- .sonic-slider,
42
- .sonic-slider-readout,
43
- .sonic-spectrum,
44
- .sonic-waveform,
45
- .sonic-waveform-readout,
46
- .sonic-wavestrip,
47
- .sonic-wavestrip-readout,
48
- .sonic-xy,
49
- .sonic-xy-readout
50
- ) {
51
- --_sonic-unlit: var(--sonic-unlit, oklch(27.4% 0.005 286deg));
52
- --_sonic-relief: var(--sonic-relief, 0);
53
- --_sonic-light-tilt: var(--sonic-light-tilt, 17deg);
54
- --_sonic-light-fall: calc(180deg - var(--_sonic-light-tilt));
55
- --_sonic-cast-x: calc(sin(var(--_sonic-light-tilt)) * var(--_sonic-unit));
56
- --_sonic-cast-y: calc(cos(var(--_sonic-light-tilt)) * var(--_sonic-unit));
57
- --_sonic-snap: 1px;
58
-
59
- @media (resolution >= 2dppx) {
60
- --_sonic-snap: 0.5px;
61
- }
62
-
63
- @media (resolution >= 3dppx) {
64
- --_sonic-snap: calc(1px / 3);
65
- }
66
- }
67
-
68
- :is(
69
- .sonic-dial,
70
- .sonic-envelope,
71
- .sonic-button,
72
- .sonic-led,
73
- .sonic-meter,
74
- .sonic-number,
75
- .sonic-ring,
76
- .sonic-segmented-option,
77
- .sonic-slider,
78
- .sonic-spectrum,
79
- .sonic-toggle,
80
- .sonic-waveform,
81
- .sonic-wavestrip,
82
- .sonic-xy
83
- ) {
84
- --_sonic-lit: var(--sonic-lit, oklch(76.9% 0.165 70deg));
85
- }
86
-
87
- /* On the parts, since a recipe's `var()`s resolve where it is declared */
88
- .sonic-dial-ring,
89
- .sonic-dial-modulation,
90
- .sonic-ring::before {
91
- --_sonic-arc-mask: radial-gradient(
92
- closest-side,
93
- transparent calc(100% - var(--_sonic-arc-width) - 0.5px),
94
- #000 calc(100% - var(--_sonic-arc-width)),
95
- #000 calc(100% - var(--_sonic-arc-inset) - 0.5px),
96
- transparent calc(100% - var(--_sonic-arc-inset))
97
- );
98
- --_sonic-arc-shade: radial-gradient(
99
- closest-side,
100
- rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))) calc(100% - var(--_sonic-arc-width)),
101
- transparent calc(100% - var(--_sonic-arc-width) * 0.4),
102
- rgb(0 0 0 / calc(0.25 * var(--_sonic-relief))) 100%
103
- );
104
- }
105
-
106
- :is(.sonic-led, .sonic-meter) {
107
- --_sonic-lens-glint: linear-gradient(
108
- var(--_sonic-light-fall),
109
- rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))),
110
- transparent 60%
111
- );
112
- --_sonic-lens-glass: var(--sonic-lens, color-mix(in oklab, var(--_sonic-unlit) 60%, #000));
113
- --_sonic-lens: var(--_sonic-lens-glint), var(--_sonic-lens-glass);
114
- }
115
-
116
- :is(.sonic-led, .sonic-meter, .sonic-spectrum, .sonic-toggle) {
117
- --_sonic-lit-ok: var(--sonic-lit-ok, oklch(79% 0.2 150deg));
118
- --_sonic-lit-warning: var(--sonic-lit-warning, oklch(70.5% 0.187 48deg));
119
- --_sonic-lit-danger: var(--sonic-lit-danger, oklch(63.7% 0.208 25deg));
120
- }
121
-
122
- :is(
123
- .sonic-dial,
124
- .sonic-button,
125
- .sonic-switch,
126
- .sonic-toggle,
127
- .sonic-number,
128
- .sonic-segmented-option,
129
- .sonic-slider,
130
- .sonic-waveform,
131
- .sonic-wavestrip,
132
- .sonic-xy
133
- ) {
134
- --_sonic-cap: var(--sonic-cap, transparent);
135
- --_sonic-cap-hover: var(--sonic-cap-hover, transparent);
136
- --_sonic-focus: var(--sonic-focus, oklch(90% 0.23 128deg));
137
- --_sonic-ink: var(--sonic-ink, currentcolor);
138
- --_sonic-etch: color-mix(in oklab, var(--_sonic-ink) 30%, transparent);
139
- --_sonic-ink-lift: var(--sonic-ink-hover, color-mix(in oklab, var(--_sonic-ink) 60%, #fff));
140
- --_sonic-lit-disabled: color-mix(in oklab, var(--_sonic-ink) 25%, var(--_sonic-unlit));
141
- --_sonic-skirt: linear-gradient(
142
- var(--_sonic-light-fall),
143
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 30% * var(--_sonic-relief)), #fff),
144
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 45% * var(--_sonic-relief)), #000)
145
- );
146
- --_sonic-face: linear-gradient(
147
- var(--_sonic-light-fall),
148
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 15% * var(--_sonic-relief)), #000),
149
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 10% * var(--_sonic-relief)), #fff)
150
- );
151
- --_sonic-sheen: linear-gradient(
152
- 105deg,
153
- transparent 20%,
154
- rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))) 45%,
155
- transparent 55%,
156
- rgb(0 0 0 / calc(0.06 * var(--_sonic-relief))) 80%
157
- );
158
- --_sonic-press-transition:
159
- scale 60ms cubic-bezier(0.4, 0, 0.2, 1), translate 60ms cubic-bezier(0.4, 0, 0.2, 1),
160
- box-shadow 60ms cubic-bezier(0.4, 0, 0.2, 1);
161
- --_sonic-face-shadow:
162
- inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(1.5 * var(--_sonic-unit))
163
- rgb(0 0 0 / calc(0.35 * var(--_sonic-relief))),
164
- calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) var(--_sonic-unit)
165
- rgb(255 255 255 / calc(0.12 * var(--_sonic-relief)));
166
- --_sonic-rim-width: max(1px, round(0.75 * var(--_sonic-unit), var(--_sonic-snap)));
167
- --_sonic-rim: 0 0 0 var(--_sonic-rim-width)
168
- var(
169
- --sonic-cap-edge,
170
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 60% * var(--_sonic-relief)), #000)
171
- );
172
- --_sonic-drop-shade: rgb(0 0 0 / calc(0.65 * var(--_sonic-relief)));
173
- --_sonic-focus-shadow: 0 0 transparent;
174
- --_sonic-focus-glow: 0 0 max(4px, 3 * var(--_sonic-unit)) max(1px, 0.5 * var(--_sonic-unit))
175
- color-mix(in oklab, var(--_sonic-focus) 60%, transparent);
176
- }
177
-
178
- :is(.sonic-number, .sonic-waveform, .sonic-wavestrip, .sonic-xy) {
179
- --_sonic-ink: var(--_sonic-glass-text);
180
- }
181
-
182
- :is(.sonic-dial, .sonic-number, .sonic-slider, .sonic-waveform, .sonic-wavestrip) {
183
- --_sonic-detent-zone: var(--sonic-detent-zone, 8px);
184
- }
185
-
186
- :is(.sonic-dial, .sonic-envelope, .sonic-slider, .sonic-waveform, .sonic-wavestrip, .sonic-xy) {
187
- --_sonic-readout-size: var(--sonic-readout-size, 1.5rem);
188
- }
189
-
190
- :is(
191
- .sonic-dial,
192
- .sonic-envelope,
193
- .sonic-number,
194
- .sonic-slider,
195
- .sonic-waveform,
196
- .sonic-wavestrip,
197
- .sonic-xy
198
- ) {
199
- --_sonic-reveal-delay: var(--sonic-reveal-delay, 250ms);
200
- }
201
-
202
- :is(.sonic-dial, .sonic-slider, .sonic-waveform, .sonic-wavestrip) {
203
- --_sonic-lit-off: var(
204
- --sonic-dimmed,
205
- color-mix(in oklab, var(--_sonic-lit) 50%, var(--_sonic-unlit))
206
- );
207
- }
208
-
209
- :is(
210
- .sonic-dial-readout,
211
- .sonic-envelope,
212
- .sonic-envelope-readout,
213
- .sonic-number,
214
- .sonic-screen,
215
- .sonic-slider-readout,
216
- .sonic-spectrum,
217
- .sonic-waveform,
218
- .sonic-waveform-readout,
219
- .sonic-wavestrip,
220
- .sonic-wavestrip-readout,
221
- .sonic-xy,
222
- .sonic-xy-readout
223
- ) {
224
- --_sonic-glass-slab: color-mix(in oklab, var(--_sonic-unlit) 45%, #000);
225
- --_sonic-glass-base: var(
226
- --sonic-glass,
227
- color-mix(
228
- in oklab,
229
- var(--_sonic-glass-slab) calc(100% * var(--_sonic-relief)),
230
- light-dark(oklch(97% 0.003 286deg), var(--_sonic-glass-slab))
231
- )
232
- );
233
- --_sonic-glass: var(--_sonic-glass-base);
234
- --_sonic-glass-fill: radial-gradient(
235
- closest-side,
236
- color-mix(
237
- in oklab,
238
- var(--_sonic-glass) calc(100% - 12% * var(--_sonic-glass-depth, var(--_sonic-relief))),
239
- #fff
240
- ),
241
- var(--_sonic-glass)
242
- )
243
- var(--_sonic-glass);
244
- --_sonic-glass-text: var(
245
- --sonic-glass-text,
246
- color-mix(
247
- in oklab,
248
- var(--_sonic-glass) 20%,
249
- oklch(from var(--_sonic-glass) clamp(0, (0.6 - l) * 1000, 1) 0 0deg / 100%)
250
- )
251
- );
252
-
253
- /* Invalid with the token unset, so the default takes over */
254
- --_sonic-glass-edge-colour: var(--sonic-glass-edge);
255
- --_sonic-glass-edge-width: var(--sonic-glass-edge-width);
256
- --_sonic-glass-edge-set: var(--_sonic-glass-edge-width, 1px) solid
257
- var(--_sonic-glass-edge-colour);
258
- --_sonic-glass-edge: var(
259
- --_sonic-glass-edge-set,
260
- var(--_sonic-glass-edge-width, calc(1px * (1 - var(--_sonic-relief)))) solid
261
- color-mix(in oklab, currentcolor 35%, transparent)
262
- );
263
-
264
- /* Glass is forced to Canvas like the page, so only a border shows its edge */
265
- @media (forced-colors: active) {
266
- --_sonic-glass-edge: 1px solid CanvasText;
267
- }
268
- }
269
-
270
- /* A definite cell, so percentage-sized content fills the glass; a canvas sized to its own box would feed back */
271
- :is(
272
- .sonic-envelope,
273
- .sonic-number,
274
- .sonic-screen,
275
- .sonic-spectrum,
276
- .sonic-waveform,
277
- .sonic-wavestrip,
278
- .sonic-xy
279
- ) {
280
- --_sonic-glass-depth: var(--sonic-glass-depth, var(--_sonic-relief));
281
- --_sonic-glass-texture: var(--sonic-glass-texture, var(--_sonic-relief));
282
- --_sonic-glass-pitch: max(2px, round(2 * var(--_sonic-unit), 1px));
283
-
284
- position: relative;
285
- box-sizing: border-box;
286
- display: grid;
287
- flex-shrink: 0;
288
- grid-template: minmax(0, 1fr) / minmax(0, 1fr);
289
- place-items: center;
290
- font-family: var(--sonic-glass-font, inherit);
291
- color: var(--_sonic-glass-text);
292
- user-select: none;
293
- background: var(--_sonic-glass-fill);
294
- border: var(--_sonic-glass-edge);
295
-
296
- @media (forced-colors: active) {
297
- --_sonic-glass-texture: 0;
298
- }
299
-
300
- &::after {
301
- position: absolute;
302
- inset: 0;
303
- pointer-events: none;
304
- content: '';
305
- background:
306
- linear-gradient(
307
- var(--_sonic-light-fall),
308
- rgb(255 255 255 / calc(0.07 * var(--_sonic-glass-depth))),
309
- transparent 45%
310
- ),
311
- radial-gradient(
312
- farthest-corner,
313
- transparent 55%,
314
- rgb(0 0 0 / calc(0.4 * var(--_sonic-glass-texture)))
315
- ),
316
- repeating-linear-gradient(
317
- to bottom,
318
- rgb(0 0 0 / calc(0.025 * var(--_sonic-glass-texture))) 0
319
- calc(var(--_sonic-glass-pitch) / 2),
320
- transparent 0 var(--_sonic-glass-pitch)
321
- );
322
- border-radius: inherit;
323
- box-shadow:
324
- var(--_sonic-well),
325
- inset 0 0 calc(3 * var(--_sonic-glass-depth) * var(--_sonic-unit)) rgb(0 0 0 / 45%);
326
- }
327
-
328
- @media (forced-colors: none) {
329
- /* No var() beside the tile, which would parse the url() again on every style recalculation */
330
- &::before {
331
- position: absolute;
332
- inset: 0;
333
- color: color-mix(in oklab, var(--_sonic-glass-text) 7.5%, transparent);
334
- pointer-events: none;
335
- content: '';
336
- background:
337
- radial-gradient(closest-side, currentcolor, transparent) no-repeat,
338
- url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.056 -0.01925'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")
339
- 0 0 / 128px 128px repeat;
340
- border-radius: inherit;
341
- opacity: min(1, var(--_sonic-glass-texture));
342
- }
343
-
344
- @media (prefers-reduced-motion: no-preference) {
345
- &:is(:focus-visible, :focus-within)::before,
346
- :state(dragging) > &::before {
347
- animation: sonic-glass-breathe 3s ease-in-out infinite alternate;
348
- }
349
-
350
- @media (hover: hover) {
351
- &:hover::before {
352
- animation: sonic-glass-breathe 3s ease-in-out infinite alternate;
353
- }
354
- }
355
- }
356
- }
357
- }
358
-
359
- :is(
360
- .sonic-envelope,
361
- .sonic-button,
362
- .sonic-number,
363
- .sonic-screen,
364
- .sonic-segmented,
365
- .sonic-spectrum,
366
- .sonic-toggle,
367
- .sonic-waveform,
368
- .sonic-wavestrip,
369
- .sonic-xy
370
- ) {
371
- --_sonic-well-depth: var(--_sonic-glass-depth, 1);
372
- --_sonic-well:
373
- inset calc(var(--_sonic-well-depth) * var(--_sonic-cast-x))
374
- calc(var(--_sonic-well-depth) * var(--_sonic-cast-y))
375
- calc(2 * var(--_sonic-well-depth) * var(--_sonic-unit))
376
- rgb(0 0 0 / calc(0.6 * var(--_sonic-relief))),
377
- calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-x))
378
- calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-y)) 0
379
- rgb(255 255 255 / calc(0.06 * var(--_sonic-relief)));
380
- }
381
-
382
- :is(.sonic-button, .sonic-segmented, .sonic-toggle) {
383
- --_sonic-well-floor: var(
384
- --sonic-well,
385
- linear-gradient(
386
- var(--_sonic-light-fall),
387
- color-mix(
388
- in oklab,
389
- color-mix(in oklab, var(--_sonic-unlit) 55%, #000) calc(100% * var(--_sonic-relief)),
390
- transparent
391
- ),
392
- color-mix(
393
- in oklab,
394
- color-mix(in oklab, var(--_sonic-unlit) 85%, #000) calc(100% * var(--_sonic-relief)),
395
- transparent
396
- )
397
- )
398
- );
399
- --_sonic-engraving: drop-shadow(
400
- calc(-0.4 * var(--_sonic-cast-x)) calc(-0.4 * var(--_sonic-cast-y))
401
- calc(0.4 * var(--_sonic-unit)) rgb(0 0 0 / calc(0.3 * var(--_sonic-relief)))
402
- )
403
- drop-shadow(
404
- calc(0.3 * var(--_sonic-cast-x)) calc(0.3 * var(--_sonic-cast-y)) 0
405
- rgb(255 255 255 / calc(0.07 * var(--_sonic-relief)))
406
- );
407
- }
408
-
409
- /* On the option rather than the strip, where forced colours clear the drop shade */
410
- :is(.sonic-button, .sonic-segmented-option, .sonic-toggle) {
411
- --_sonic-press-drop: calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y))
412
- var(--_sonic-unit) var(--_sonic-drop-shade);
413
- --_sonic-keycap-shift: calc(var(--_sonic-keycap-depth) / -2);
414
- --_sonic-keycap-scale: 1;
415
- --_sonic-keycap-drop: calc(1.5 * var(--_sonic-cast-x)) calc(1.5 * var(--_sonic-cast-y))
416
- calc(2 * var(--_sonic-unit)) var(--_sonic-drop-shade);
417
- --_sonic-keycap-glow: transparent;
418
- --_sonic-keycap-lit-glow: color-mix(
419
- in oklab,
420
- var(--_sonic-lit) calc(15% * var(--_sonic-relief)),
421
- transparent
422
- );
423
- --_sonic-legend-glow: drop-shadow(
424
- 0 0 var(--_sonic-unit)
425
- color-mix(in oklab, var(--_sonic-lit) calc(24% * var(--_sonic-relief)), transparent)
426
- );
427
- --_sonic-legend-lit-from: var(--_sonic-lit);
428
- --_sonic-legend-lit: color-mix(
429
- in oklab,
430
- var(--sonic-cap) 0%,
431
- oklch(
432
- from
433
- color-mix(
434
- in oklab,
435
- oklch(from var(--_sonic-ink) l c h / clamp(0, (0.6 - l) * 1000, 1)),
436
- oklch(from var(--_sonic-legend-lit-from) l c h / 0.1%)
437
- )
438
- l c h / 100%
439
- )
440
- );
441
- }
442
-
443
- :is(.sonic-button, .sonic-segmented-option, .sonic-switch-position, .sonic-toggle-position) {
444
- --_sonic-target-outset: min(0px, calc((100% - var(--sonic-target-size, 100%)) / 2));
445
-
446
- &::after {
447
- position: absolute;
448
- inset: var(--_sonic-target-outset);
449
- content: '';
450
- }
451
- }
452
-
453
- /* Each sheet maps its own depth, corner, bevel and face corner onto the `keycap` tokens */
454
- :is(.sonic-button-cap, .sonic-segmented-cap, .sonic-toggle-cap) {
455
- display: grid;
456
- place-items: center;
457
- background: var(--_sonic-skirt);
458
- border-radius: var(--_sonic-keycap-corner);
459
- box-shadow:
460
- var(--_sonic-keycap-drop),
461
- var(--_sonic-rim),
462
- 0 0 0 var(--_sonic-rim-width) var(--_sonic-blank-edge, transparent),
463
- var(--_sonic-focus-shadow);
464
- scale: var(--_sonic-keycap-scale);
465
- translate: 0 var(--_sonic-keycap-shift);
466
- transition: var(--_sonic-press-transition);
467
-
468
- &::before {
469
- position: absolute;
470
- inset: var(--_sonic-keycap-bevel);
471
- content: '';
472
- background:
473
- radial-gradient(closest-side, var(--_sonic-keycap-glow), transparent), var(--_sonic-sheen),
474
- var(--_sonic-face);
475
- border-radius: var(--_sonic-keycap-face-corner);
476
- box-shadow: var(--_sonic-face-shadow);
477
- }
478
-
479
- & > * {
480
- position: relative;
481
- }
482
- }
483
-
484
- .sonic-xy-bracket,
485
- .sonic-envelope-bracket::before {
486
- box-sizing: border-box;
487
- inline-size: var(--_sonic-bracket-size);
488
- block-size: var(--_sonic-bracket-size);
489
- pointer-events: none;
490
- content: '';
491
- border: max(1px, 0.06 * var(--_sonic-bracket-size)) solid
492
- color-mix(in oklab, var(--_sonic-glass-text) 45%, transparent);
493
- border-radius: 50%;
494
- opacity: 0;
495
- mask: conic-gradient(
496
- from 10deg,
497
- #000 0 70deg,
498
- transparent 0 180deg,
499
- #000 0 250deg,
500
- transparent 0
501
- );
502
- scale: 0.6;
503
- transition:
504
- opacity 120ms ease-out,
505
- scale 120ms ease-out;
506
- }
507
-
508
- :state(dragging) > * > .sonic-xy-bracket,
509
- :state(dragging) > * > .sonic-envelope-bracket::before {
510
- opacity: calc(1 - var(--_sonic-relief));
511
- scale: 1;
512
- }
513
-
514
- :is(.sonic-meter, .sonic-slider) {
515
- --_sonic-groove:
516
- inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(0.75 * var(--_sonic-unit))
517
- rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))),
518
- inset 0 0 calc(0.5 * var(--_sonic-unit)) rgb(0 0 0 / calc(0.3 * var(--_sonic-relief))),
519
- calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) 0
520
- rgb(255 255 255 / calc(0.06 * var(--_sonic-relief)));
521
- }
522
-
523
- @media (hover: hover) {
524
- :is(.sonic-dial, .sonic-button, .sonic-segmented-option, .sonic-slider):not(
525
- :disabled,
526
- [aria-disabled='true']
527
- ):hover {
528
- --_sonic-cap: var(--_sonic-cap-hover);
529
- }
530
- }
531
-
532
- :is(
533
- .sonic-dial,
534
- .sonic-button,
535
- .sonic-number,
536
- .sonic-segmented-option,
537
- .sonic-slider,
538
- .sonic-waveform,
539
- .sonic-wavestrip,
540
- .sonic-xy-axis
541
- ):focus-visible {
542
- outline: 2px solid transparent;
543
- outline-offset: -2px;
544
-
545
- &:not([data-sonic-pointer-focus]) {
546
- --_sonic-cap: var(--_sonic-cap-hover);
547
- --_sonic-focus-shadow: var(--_sonic-focus-glow);
548
- }
549
- }
550
-
551
- :state(editing)
552
- > :is(.sonic-dial, .sonic-number, .sonic-slider, .sonic-waveform, .sonic-wavestrip) {
553
- --_sonic-cap: var(--_sonic-cap-hover);
554
- --_sonic-focus-shadow: var(--_sonic-focus-glow);
555
- }
556
-
557
- :is(
558
- .sonic-dial-readout,
559
- .sonic-envelope-readout,
560
- .sonic-slider-readout,
561
- .sonic-waveform-readout,
562
- .sonic-wavestrip-readout,
563
- .sonic-xy-readout
564
- ) {
565
- --_sonic-unit: calc(var(--_sonic-readout-size) / 32);
566
- --_sonic-glass: var(--sonic-readout-glass, var(--_sonic-glass-base));
567
- --_sonic-glass-edge-colour: var(--sonic-readout-edge, var(--sonic-glass-edge));
568
- --_sonic-glass-edge-width: var(--sonic-readout-edge-width, var(--sonic-glass-edge-width));
569
-
570
- box-sizing: border-box;
571
- place-items: center;
572
- min-inline-size: calc(1.75 * var(--_sonic-readout-size));
573
- block-size: var(--_sonic-readout-size);
574
- padding: 0 calc(0.3 * var(--_sonic-readout-size));
575
- margin: 0 0 calc(0.25 * var(--_sonic-readout-size));
576
- position-area: block-start;
577
- position-try-fallbacks: flip-block;
578
- overflow: visible;
579
- font: inherit;
580
- font-family: var(--sonic-glass-font, inherit);
581
- font-size: calc(0.5 * var(--_sonic-readout-size));
582
- font-variant-numeric: tabular-nums;
583
- line-height: 1;
584
- color: var(--sonic-readout-text, var(--_sonic-glass-text));
585
- white-space: nowrap;
586
- pointer-events: none;
587
- cursor: default;
588
- user-select: none;
589
- background: var(--_sonic-glass-fill);
590
- border: var(--_sonic-glass-edge);
591
- border-radius: calc(0.25 * var(--_sonic-readout-size));
592
- box-shadow:
593
- calc(2 * var(--_sonic-cast-x)) calc(2 * var(--_sonic-cast-y)) calc(6 * var(--_sonic-unit))
594
- rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))),
595
- inset 0 0 0 max(1px, round(var(--_sonic-unit), var(--_sonic-snap)))
596
- rgb(255 255 255 / calc(0.08 * var(--_sonic-relief)));
597
- opacity: 0;
598
- translate: 0 calc(0.15 * var(--_sonic-readout-size));
599
- transition:
600
- opacity 120ms ease-out,
601
- translate 120ms ease-out,
602
- display 120ms allow-discrete,
603
- overlay 120ms allow-discrete;
604
-
605
- /* Grid only while open; engines keep the flip a closed readout took against a filtered ancestor */
606
- &:popover-open {
607
- display: grid;
608
- opacity: 1;
609
- translate: 0;
610
-
611
- @starting-style {
612
- opacity: 0;
613
- translate: 0 calc(0.15 * var(--_sonic-readout-size));
614
- }
615
- }
616
-
617
- @media (prefers-reduced-motion: reduce) {
618
- translate: 0;
619
-
620
- &:popover-open {
621
- @starting-style {
622
- translate: 0;
623
- }
624
- }
625
- }
626
-
627
- :state(editing) > :is(.sonic-dial, .sonic-slider, .sonic-waveform, .sonic-wavestrip) > & {
628
- pointer-events: auto;
629
- cursor: text;
630
- }
631
- }
632
-
633
- :is(
634
- .sonic-dial-entry,
635
- .sonic-number-entry,
636
- .sonic-slider-entry,
637
- .sonic-waveform-entry,
638
- .sonic-wavestrip-entry
639
- ) {
640
- inline-size: 6ch;
641
- padding: 0;
642
- font: inherit;
643
- color: inherit;
644
- text-align: center;
645
- background: transparent;
646
- border: 0;
647
-
648
- &::selection {
649
- color: var(--_sonic-lit);
650
- background: transparent;
651
- }
652
-
653
- &:focus-visible {
654
- outline: 2px solid transparent;
655
- outline-offset: -2px;
656
- }
657
-
658
- @supports (field-sizing: content) {
659
- inline-size: auto;
660
- min-inline-size: 3ch;
661
- field-sizing: content;
662
- }
663
- }
664
-
665
- :is(.sonic-dial-scale, .sonic-slider-scale) {
666
- position: absolute;
667
- inset: 0;
668
- line-height: 1;
669
- white-space: nowrap;
670
- pointer-events: none;
671
-
672
- & > * {
673
- position: absolute;
674
- }
675
-
676
- & svg {
677
- display: block;
678
- inline-size: 1em;
679
- block-size: 1em;
680
- }
681
-
682
- & > .sonic-scale-tick {
683
- background: var(--sonic-scale, var(--_sonic-etch));
684
- }
685
- }
686
-
687
- @media (forced-colors: active) {
688
- :is(.sonic-dial-scale, .sonic-slider-scale) > .sonic-scale-tick {
689
- forced-color-adjust: none;
690
- background: var(--_sonic-etch);
691
- }
692
-
693
- :is(
694
- .sonic-dial,
695
- .sonic-button,
696
- .sonic-led,
697
- .sonic-meter,
698
- .sonic-number,
699
- .sonic-ring,
700
- .sonic-segmented-option,
701
- .sonic-slider,
702
- .sonic-toggle
703
- ) {
704
- --_sonic-lit: Highlight;
705
- --_sonic-unlit: GrayText;
706
- }
707
-
708
- /* Tokens rather than properties, so a state rule that restates one still paints in system colours */
709
- :is(
710
- .sonic-dial,
711
- .sonic-button,
712
- .sonic-number,
713
- .sonic-segmented-option,
714
- .sonic-slider,
715
- .sonic-toggle,
716
- .sonic-waveform,
717
- .sonic-wavestrip,
718
- .sonic-xy
719
- ) {
720
- --_sonic-ink: ButtonText;
721
- --_sonic-etch: ButtonText;
722
- --_sonic-lit-disabled: GrayText;
723
- --_sonic-skirt: ButtonFace;
724
- --_sonic-face: ButtonFace;
725
- --_sonic-sheen: none;
726
- --_sonic-face-shadow: none;
727
- --_sonic-rim: 0 0 0 var(--_sonic-rim-width) var(--_sonic-ink);
728
- --_sonic-drop-shade: transparent;
729
- --_sonic-focus-glow: 0 0 transparent;
730
- }
731
-
732
- :is(.sonic-dial, .sonic-slider, .sonic-waveform, .sonic-wavestrip) {
733
- --_sonic-lit-off: Highlight;
734
- }
735
-
736
- :is(
737
- :disabled > :is(.sonic-dial, .sonic-slider, .sonic-waveform, .sonic-wavestrip, .sonic-xy),
738
- .sonic-button:is(:disabled, [aria-disabled='true']),
739
- .sonic-segmented-option:disabled
740
- ) {
741
- --_sonic-ink: GrayText;
742
- --_sonic-etch: GrayText;
743
- }
744
-
745
- :is(
746
- .sonic-dial,
747
- .sonic-button,
748
- .sonic-number,
749
- .sonic-segmented-option,
750
- .sonic-slider,
751
- .sonic-waveform,
752
- .sonic-wavestrip
753
- ):focus-visible {
754
- outline-offset: 2px;
755
-
756
- &[data-sonic-pointer-focus] {
757
- outline-style: none;
758
- }
759
- }
760
-
761
- :is(
762
- .sonic-dial-cap,
763
- .sonic-button-cap,
764
- .sonic-segmented-cap,
765
- .sonic-slider-cap,
766
- .sonic-toggle-cap
767
- ) {
768
- color: var(--_sonic-ink);
769
- forced-color-adjust: none;
770
- }
771
- }
772
- }
1
+ @layer sonic.material, sonic.control;
2
+
3
+ @import './material/core.css';
4
+ @import './material/cap.css';
5
+ @import './material/glass.css';
6
+ @import './material/pane.css';
7
+ @import './material/well.css';
8
+ @import './material/readout.css';
9
+ @import './material/value.css';
10
+ @import './material/keycap.css';
11
+ @import './material/arc.css';
12
+ @import './material/lens.css';
13
+ @import './material/bracket.css';
14
+ @import './material/groove.css';
15
+ @import './material/scale.css';