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