@xsynaptic/sonic-ui 0.18.0 → 0.20.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 (101) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +20 -9
  3. package/dist/default/elements/button.js +0 -5
  4. package/dist/default/elements/dial.js +0 -7
  5. package/dist/default/elements/display-element.js +0 -5
  6. package/dist/default/elements/envelope.js +0 -6
  7. package/dist/default/elements/meter.js +0 -1
  8. package/dist/default/elements/number.js +0 -7
  9. package/dist/default/elements/segmented.js +0 -5
  10. package/dist/default/elements/slider.js +0 -7
  11. package/dist/default/elements/sonic-element.js +3 -1
  12. package/dist/default/elements/switch.js +0 -1
  13. package/dist/default/elements/toggle.js +0 -5
  14. package/dist/default/elements/value-element.js +8 -4
  15. package/dist/default/elements/wave-element.js +7 -8
  16. package/dist/default/elements/xy.js +0 -7
  17. package/dist/default/index.js +2 -1
  18. package/dist/default/lib/canvas-surface.js +5 -1
  19. package/dist/default/lib/clock.js +23 -0
  20. package/dist/default/lib/spoken-duration.js +30 -0
  21. package/dist/default/lib/waveform-buckets.js +7 -1
  22. package/dist/dev/elements/button.js +5 -5
  23. package/dist/dev/elements/button.js.map +1 -1
  24. package/dist/dev/elements/dial.js +4 -7
  25. package/dist/dev/elements/dial.js.map +1 -1
  26. package/dist/dev/elements/display-element.js +1 -5
  27. package/dist/dev/elements/display-element.js.map +1 -1
  28. package/dist/dev/elements/envelope.js +4 -6
  29. package/dist/dev/elements/envelope.js.map +1 -1
  30. package/dist/dev/elements/meter.js +1 -1
  31. package/dist/dev/elements/meter.js.map +1 -1
  32. package/dist/dev/elements/number.js +4 -7
  33. package/dist/dev/elements/number.js.map +1 -1
  34. package/dist/dev/elements/segmented.js +5 -5
  35. package/dist/dev/elements/segmented.js.map +1 -1
  36. package/dist/dev/elements/slider.js +4 -7
  37. package/dist/dev/elements/slider.js.map +1 -1
  38. package/dist/dev/elements/sonic-element.d.ts +6 -16
  39. package/dist/dev/elements/sonic-element.js +54 -29
  40. package/dist/dev/elements/sonic-element.js.map +1 -1
  41. package/dist/dev/elements/split.js.map +1 -1
  42. package/dist/dev/elements/switch.js +4 -1
  43. package/dist/dev/elements/switch.js.map +1 -1
  44. package/dist/dev/elements/toggle.js +5 -5
  45. package/dist/dev/elements/toggle.js.map +1 -1
  46. package/dist/dev/elements/value-element.d.ts +6 -0
  47. package/dist/dev/elements/value-element.js +8 -4
  48. package/dist/dev/elements/value-element.js.map +1 -1
  49. package/dist/dev/elements/wave-element.d.ts +2 -1
  50. package/dist/dev/elements/wave-element.js +11 -8
  51. package/dist/dev/elements/wave-element.js.map +1 -1
  52. package/dist/dev/elements/waveform.d.ts +1 -1
  53. package/dist/dev/elements/xy.js +4 -7
  54. package/dist/dev/elements/xy.js.map +1 -1
  55. package/dist/dev/index.d.ts +3 -2
  56. package/dist/dev/index.js +2 -1
  57. package/dist/dev/lib/canvas-surface.js +5 -1
  58. package/dist/dev/lib/canvas-surface.js.map +1 -1
  59. package/dist/dev/lib/clock.d.ts +5 -0
  60. package/dist/dev/lib/clock.js +24 -0
  61. package/dist/dev/lib/clock.js.map +1 -0
  62. package/dist/dev/lib/mirror-children.js.map +1 -1
  63. package/dist/dev/lib/owned-control.js.map +1 -1
  64. package/dist/dev/lib/spoken-duration.js +31 -0
  65. package/dist/dev/lib/spoken-duration.js.map +1 -0
  66. package/dist/dev/lib/waveform-buckets.d.ts +2 -2
  67. package/dist/dev/lib/waveform-buckets.js +7 -1
  68. package/dist/dev/lib/waveform-buckets.js.map +1 -1
  69. package/dist/styles/button.css +29 -5
  70. package/dist/styles/dial.css +10 -9
  71. package/dist/styles/envelope.css +17 -10
  72. package/dist/styles/led.css +5 -1
  73. package/dist/styles/material/arc.css +3 -2
  74. package/dist/styles/material/bracket.css +3 -3
  75. package/dist/styles/material/cap.css +38 -13
  76. package/dist/styles/material/core.css +4 -0
  77. package/dist/styles/material/glass.css +1 -6
  78. package/dist/styles/material/groove.css +4 -3
  79. package/dist/styles/material/keycap.css +3 -2
  80. package/dist/styles/material/lens.css +1 -1
  81. package/dist/styles/material/pane.css +7 -13
  82. package/dist/styles/material/readout.css +6 -6
  83. package/dist/styles/material/well.css +3 -14
  84. package/dist/styles/meter.css +2 -7
  85. package/dist/styles/number.css +5 -1
  86. package/dist/styles/panel.css +4 -3
  87. package/dist/styles/ring.css +1 -1
  88. package/dist/styles/screen.css +6 -4
  89. package/dist/styles/segmented.css +17 -4
  90. package/dist/styles/slider.css +9 -3
  91. package/dist/styles/spectrum.css +8 -9
  92. package/dist/styles/switch.css +35 -10
  93. package/dist/styles/toggle.css +14 -7
  94. package/dist/styles/waveform.css +17 -18
  95. package/dist/styles/wavestrip.css +12 -25
  96. package/dist/styles/xy.css +46 -25
  97. package/package.json +1 -6
  98. package/dist/default/dat.js +0 -52
  99. package/dist/dev/dat.d.ts +0 -20
  100. package/dist/dev/dat.js +0 -53
  101. package/dist/dev/dat.js.map +0 -1
@@ -24,7 +24,6 @@
24
24
  }
25
25
 
26
26
  .sonic-envelope {
27
- --_sonic-envelope-radius-ratio: var(--sonic-envelope-radius-ratio, 0.08);
28
27
  --_sonic-envelope-inset-ratio: var(--sonic-envelope-inset-ratio, 0.1);
29
28
  --_sonic-envelope-handle-ratio: var(--sonic-envelope-handle-ratio, 0.14);
30
29
  --_sonic-envelope-handle-stroke-ratio: var(--sonic-envelope-handle-stroke-ratio, 0.025);
@@ -32,12 +31,16 @@
32
31
  --_sonic-envelope-curve-ratio: var(--sonic-envelope-curve-ratio, 0.08);
33
32
  --_sonic-unit: calc(var(--_sonic-envelope-size) / 64);
34
33
  --_sonic-envelope-inset: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-inset-ratio));
35
- --_sonic-glass-radius: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-radius-ratio));
36
34
 
35
+ /* fallow-ignore-next-line code-duplication -- a plain box restated, since sheets never import each other */
36
+ position: relative;
37
+ display: grid;
38
+ flex-shrink: 0;
39
+ grid-template: minmax(0, 1fr) / minmax(0, 1fr);
37
40
  inline-size: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-aspect-ratio));
38
41
  block-size: var(--_sonic-envelope-size);
39
42
  container-type: size;
40
- border-radius: var(--_sonic-glass-radius);
43
+ user-select: none;
41
44
  isolation: isolate;
42
45
  }
43
46
 
@@ -62,7 +65,6 @@
62
65
  inset: 0;
63
66
  overflow: clip;
64
67
  pointer-events: none;
65
- border-radius: inherit;
66
68
 
67
69
  &[data-sonic-part='curve'] {
68
70
  --_sonic-point-size: calc(
@@ -124,9 +126,9 @@
124
126
  var(--_sonic-point-halo),
125
127
  var(--_sonic-focus-shadow, 0 0 transparent);
126
128
  transition:
127
- background-color 120ms ease-out,
128
- border-color 120ms ease-out,
129
- box-shadow 120ms ease-out;
129
+ background-color var(--_sonic-fade-duration) ease-out,
130
+ border-color var(--_sonic-fade-duration) ease-out,
131
+ box-shadow var(--_sonic-fade-duration) ease-out;
130
132
  }
131
133
 
132
134
  .sonic-envelope-handle {
@@ -155,7 +157,7 @@
155
157
 
156
158
  :is(.sonic-envelope-curve, .sonic-envelope-handle)[data-sonic-disabled] {
157
159
  --_sonic-point-ring: var(--_sonic-unlit);
158
- --_sonic-point-core: var(--_sonic-glass);
160
+ --_sonic-point-core: var(--_sonic-point-ring);
159
161
 
160
162
  cursor: default;
161
163
  }
@@ -169,7 +171,7 @@
169
171
 
170
172
  :is(.sonic-envelope-curve, .sonic-envelope-handle):not([data-sonic-disabled]):active {
171
173
  --_sonic-point-ring: var(--_sonic-lit);
172
- --_sonic-point-core: var(--_sonic-glass);
174
+ --_sonic-point-core: var(--_sonic-point-ring);
173
175
  --_sonic-point-halo: color-mix(
174
176
  in oklab,
175
177
  var(--_sonic-lit) calc(50% * var(--_sonic-relief)),
@@ -181,7 +183,6 @@
181
183
  .sonic-envelope {
182
184
  --_sonic-lit: Highlight;
183
185
  --_sonic-unlit: GrayText;
184
- --_sonic-glass: Canvas;
185
186
  }
186
187
 
187
188
  .sonic-envelope-graph {
@@ -199,6 +200,12 @@
199
200
  --_sonic-point-core: Canvas;
200
201
  }
201
202
 
203
+ /* Spelt as the rules above are, to outrank them */
204
+ :is(.sonic-envelope-curve, .sonic-envelope-handle)[data-sonic-disabled],
205
+ :is(.sonic-envelope-curve, .sonic-envelope-handle):not([data-sonic-disabled]):active {
206
+ --_sonic-point-core: Canvas;
207
+ }
208
+
202
209
  .sonic-envelope-fill {
203
210
  fill: none;
204
211
  }
@@ -117,7 +117,11 @@
117
117
  &::after {
118
118
  background: radial-gradient(
119
119
  closest-side,
120
- color-mix(in oklab, var(--_sonic-lit) calc(100% - 45% * var(--_sonic-relief)), #fff),
120
+ color-mix(
121
+ in oklab,
122
+ var(--_sonic-lit) calc(100% - 45% * var(--_sonic-relief)),
123
+ var(--_sonic-shine)
124
+ ),
121
125
  var(--_sonic-lit)
122
126
  );
123
127
  }
@@ -13,9 +13,10 @@
13
13
  );
14
14
  --_sonic-arc-shade: radial-gradient(
15
15
  closest-side,
16
- rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))) calc(100% - var(--_sonic-arc-width)),
16
+ rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-relief)))
17
+ calc(100% - var(--_sonic-arc-width)),
17
18
  transparent calc(100% - var(--_sonic-arc-width) * 0.4),
18
- rgb(0 0 0 / calc(0.25 * var(--_sonic-relief))) 100%
19
+ rgb(from var(--_sonic-shade) r g b / calc(0.25 * var(--_sonic-relief))) 100%
19
20
  );
20
21
  }
21
22
  }
@@ -7,7 +7,7 @@
7
7
  pointer-events: none;
8
8
  content: '';
9
9
  border: max(1px, 0.06 * var(--_sonic-bracket-size)) solid
10
- color-mix(in oklab, var(--_sonic-glass-text) 45%, transparent);
10
+ color-mix(in oklab, currentcolor 45%, transparent);
11
11
  border-radius: 50%;
12
12
  opacity: 0;
13
13
  mask: conic-gradient(
@@ -19,8 +19,8 @@
19
19
  );
20
20
  scale: 0.6;
21
21
  transition:
22
- opacity 120ms ease-out,
23
- scale 120ms ease-out;
22
+ opacity var(--_sonic-fade-duration) ease-out,
23
+ scale var(--_sonic-fade-duration) ease-out;
24
24
  }
25
25
 
26
26
  :state(dragging) > * > .sonic-xy-bracket,
@@ -23,45 +23,70 @@
23
23
  --_sonic-lit-disabled: color-mix(in oklab, var(--_sonic-ink) 25%, var(--_sonic-unlit));
24
24
  --_sonic-skirt: linear-gradient(
25
25
  var(--_sonic-light-fall),
26
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 30% * var(--_sonic-relief)), #fff),
27
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 45% * var(--_sonic-relief)), #000)
26
+ color-mix(
27
+ in oklab,
28
+ var(--_sonic-cap) calc(100% - 30% * var(--_sonic-relief)),
29
+ var(--_sonic-shine)
30
+ ),
31
+ color-mix(
32
+ in oklab,
33
+ var(--_sonic-cap) calc(100% - 45% * var(--_sonic-relief)),
34
+ var(--_sonic-shade)
35
+ )
28
36
  );
29
37
  --_sonic-face: linear-gradient(
30
38
  var(--_sonic-light-fall),
31
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 15% * var(--_sonic-relief)), #000),
32
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 10% * var(--_sonic-relief)), #fff)
39
+ color-mix(
40
+ in oklab,
41
+ var(--_sonic-cap) calc(100% - 15% * var(--_sonic-relief)),
42
+ var(--_sonic-shade)
43
+ ),
44
+ color-mix(
45
+ in oklab,
46
+ var(--_sonic-cap) calc(100% - 10% * var(--_sonic-relief)),
47
+ var(--_sonic-shine)
48
+ )
33
49
  );
34
50
  --_sonic-sheen: linear-gradient(
35
51
  105deg,
36
52
  transparent 20%,
37
- rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))) 45%,
53
+ rgb(from var(--_sonic-shine) r g b / calc(0.1 * var(--_sonic-relief))) 45%,
38
54
  transparent 55%,
39
- rgb(0 0 0 / calc(0.06 * var(--_sonic-relief))) 80%
55
+ rgb(from var(--_sonic-shade) r g b / calc(0.06 * var(--_sonic-relief))) 80%
40
56
  );
41
57
  --_sonic-press-transition:
42
- scale 60ms cubic-bezier(0.4, 0, 0.2, 1), translate 60ms cubic-bezier(0.4, 0, 0.2, 1),
43
- box-shadow 60ms cubic-bezier(0.4, 0, 0.2, 1);
58
+ scale var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1),
59
+ translate var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1),
60
+ box-shadow var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1);
44
61
  --_sonic-face-shadow:
45
62
  inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(1.5 * var(--_sonic-unit))
46
- rgb(0 0 0 / calc(0.35 * var(--_sonic-relief))),
63
+ rgb(from var(--_sonic-shade) r g b / calc(0.35 * var(--_sonic-relief))),
47
64
  calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) var(--_sonic-unit)
48
- rgb(255 255 255 / calc(0.12 * var(--_sonic-relief)));
65
+ rgb(from var(--_sonic-shine) r g b / calc(0.12 * var(--_sonic-relief)));
49
66
  --_sonic-rim-width: max(1px, round(0.75 * var(--_sonic-unit), var(--_sonic-snap)));
50
67
  --_sonic-rim: 0 0 0 var(--_sonic-rim-width)
51
68
  var(
52
69
  --sonic-cap-edge,
53
- color-mix(in oklab, var(--_sonic-cap) calc(100% - 60% * var(--_sonic-relief)), #000)
70
+ color-mix(
71
+ in oklab,
72
+ var(--_sonic-cap) calc(100% - 60% * var(--_sonic-relief)),
73
+ var(--_sonic-shade)
74
+ )
54
75
  );
55
- --_sonic-drop-shade: rgb(0 0 0 / calc(0.65 * var(--_sonic-relief)));
76
+ --_sonic-drop-shade: rgb(from var(--_sonic-shade) r g b / calc(0.65 * var(--_sonic-relief)));
56
77
  --_sonic-focus-shadow: 0 0 transparent;
57
78
  --_sonic-focus-glow: 0 0 max(4px, 3 * var(--_sonic-unit)) max(1px, 0.5 * var(--_sonic-unit))
58
79
  color-mix(in oklab, var(--_sonic-focus) calc(60% * var(--_sonic-focus-strength)), transparent);
59
80
  }
60
81
 
61
- :is(.sonic-number, .sonic-waveform, .sonic-wavestrip, .sonic-xy) {
82
+ .sonic-number {
62
83
  --_sonic-ink: var(--_sonic-glass-text);
63
84
  }
64
85
 
86
+ :is(.sonic-waveform, .sonic-wavestrip, .sonic-xy) {
87
+ --_sonic-ink: currentcolor;
88
+ }
89
+
65
90
  :is(.sonic-dial, .sonic-slider, .sonic-waveform, .sonic-wavestrip) {
66
91
  --_sonic-lit-off: var(
67
92
  --sonic-dimmed,
@@ -32,6 +32,10 @@
32
32
  ) {
33
33
  --_sonic-unlit: var(--sonic-unlit, oklch(27.4% 0.005 286deg));
34
34
  --_sonic-relief: var(--sonic-relief, 0);
35
+ --_sonic-shade: var(--sonic-shade, #000);
36
+ --_sonic-shine: var(--sonic-shine, #fff);
37
+ --_sonic-press-duration: var(--sonic-press-duration, 60ms);
38
+ --_sonic-fade-duration: var(--sonic-fade-duration, 120ms);
35
39
  --_sonic-light-tilt: var(--sonic-light-tilt, 17deg);
36
40
  --_sonic-light-fall: calc(180deg - var(--_sonic-light-tilt));
37
41
  --_sonic-cast-x: calc(sin(var(--_sonic-light-tilt)) * var(--_sonic-unit));
@@ -1,17 +1,12 @@
1
1
  @layer sonic.material {
2
2
  :is(
3
3
  .sonic-dial-readout,
4
- .sonic-envelope,
5
4
  .sonic-envelope-readout,
6
5
  .sonic-number,
7
6
  .sonic-screen,
8
7
  .sonic-slider-readout,
9
- .sonic-spectrum,
10
- .sonic-waveform,
11
8
  .sonic-waveform-readout,
12
- .sonic-wavestrip,
13
9
  .sonic-wavestrip-readout,
14
- .sonic-xy,
15
10
  .sonic-xy-readout
16
11
  ) {
17
12
  --_sonic-glass-slab: color-mix(in oklab, var(--_sonic-unlit) 45%, #000);
@@ -29,7 +24,7 @@
29
24
  color-mix(
30
25
  in oklab,
31
26
  var(--_sonic-glass) calc(100% - 12% * var(--_sonic-glass-depth, var(--_sonic-relief))),
32
- #fff
27
+ var(--_sonic-shine)
33
28
  ),
34
29
  var(--_sonic-glass)
35
30
  )
@@ -2,9 +2,10 @@
2
2
  :is(.sonic-meter, .sonic-slider) {
3
3
  --_sonic-groove:
4
4
  inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(0.75 * var(--_sonic-unit))
5
- rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))),
6
- inset 0 0 calc(0.5 * var(--_sonic-unit)) rgb(0 0 0 / calc(0.3 * var(--_sonic-relief))),
5
+ rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-relief))),
6
+ inset 0 0 calc(0.5 * var(--_sonic-unit))
7
+ rgb(from var(--_sonic-shade) r g b / calc(0.3 * var(--_sonic-relief))),
7
8
  calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) 0
8
- rgb(255 255 255 / calc(0.06 * var(--_sonic-relief)));
9
+ rgb(from var(--_sonic-shine) r g b / calc(0.06 * var(--_sonic-relief)));
9
10
  }
10
11
  }
@@ -18,11 +18,12 @@
18
18
  );
19
19
  --_sonic-engraving: drop-shadow(
20
20
  calc(-0.4 * var(--_sonic-cast-x)) calc(-0.4 * var(--_sonic-cast-y))
21
- calc(0.4 * var(--_sonic-unit)) rgb(0 0 0 / calc(0.3 * var(--_sonic-relief)))
21
+ calc(0.4 * var(--_sonic-unit))
22
+ rgb(from var(--_sonic-shade) r g b / calc(0.3 * var(--_sonic-relief)))
22
23
  )
23
24
  drop-shadow(
24
25
  calc(0.3 * var(--_sonic-cast-x)) calc(0.3 * var(--_sonic-cast-y)) 0
25
- rgb(255 255 255 / calc(0.07 * var(--_sonic-relief)))
26
+ rgb(from var(--_sonic-shine) r g b / calc(0.07 * var(--_sonic-relief)))
26
27
  );
27
28
  }
28
29
 
@@ -2,7 +2,7 @@
2
2
  :is(.sonic-led, .sonic-meter) {
3
3
  --_sonic-lens-glint: linear-gradient(
4
4
  var(--_sonic-light-fall),
5
- rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))),
5
+ rgb(from var(--_sonic-shine) r g b / calc(0.1 * var(--_sonic-relief))),
6
6
  transparent 60%
7
7
  );
8
8
  --_sonic-lens-glass: var(--sonic-lens, color-mix(in oklab, var(--_sonic-unlit) 60%, #000));
@@ -7,15 +7,7 @@
7
7
  @layer sonic.material {
8
8
  /* A definite cell, so percentage-sized content fills the glass; a canvas sized to its own box would feed back */
9
9
 
10
- :is(
11
- .sonic-envelope,
12
- .sonic-number,
13
- .sonic-screen,
14
- .sonic-spectrum,
15
- .sonic-waveform,
16
- .sonic-wavestrip,
17
- .sonic-xy
18
- ) {
10
+ :is(.sonic-number, .sonic-screen) {
19
11
  --_sonic-glass-depth: var(--sonic-glass-depth, var(--_sonic-relief));
20
12
  --_sonic-glass-texture: var(--sonic-glass-texture, var(--_sonic-relief));
21
13
  --_sonic-glass-pitch: max(2px, round(2 * var(--_sonic-unit), 1px));
@@ -44,24 +36,25 @@
44
36
  background:
45
37
  linear-gradient(
46
38
  var(--_sonic-light-fall),
47
- rgb(255 255 255 / calc(0.07 * var(--_sonic-glass-depth))),
39
+ rgb(from var(--_sonic-shine) r g b / calc(0.07 * var(--_sonic-glass-depth))),
48
40
  transparent 45%
49
41
  ),
50
42
  radial-gradient(
51
43
  farthest-corner,
52
44
  transparent 55%,
53
- rgb(0 0 0 / calc(0.4 * var(--_sonic-glass-texture)))
45
+ rgb(from var(--_sonic-shade) r g b / calc(0.4 * var(--_sonic-glass-texture)))
54
46
  ),
55
47
  repeating-linear-gradient(
56
48
  to bottom,
57
- rgb(0 0 0 / calc(0.025 * var(--_sonic-glass-texture))) 0
49
+ rgb(from var(--_sonic-shade) r g b / calc(0.025 * var(--_sonic-glass-texture))) 0
58
50
  calc(var(--_sonic-glass-pitch) / 2),
59
51
  transparent 0 var(--_sonic-glass-pitch)
60
52
  );
61
53
  border-radius: inherit;
62
54
  box-shadow:
63
55
  var(--_sonic-well),
64
- inset 0 0 calc(3 * var(--_sonic-glass-depth) * var(--_sonic-unit)) rgb(0 0 0 / 45%);
56
+ inset 0 0 calc(3 * var(--_sonic-glass-depth) * var(--_sonic-unit))
57
+ rgb(from var(--_sonic-shade) r g b / 45%);
65
58
  }
66
59
 
67
60
  @media (forced-colors: none) {
@@ -82,6 +75,7 @@
82
75
 
83
76
  @media (prefers-reduced-motion: no-preference) {
84
77
  &:is(:focus-visible, :focus-within)::before,
78
+ &:has(:state(dragging))::before,
85
79
  :state(dragging) > &::before {
86
80
  animation: sonic-glass-breathe 3s ease-in-out infinite alternate;
87
81
  }
@@ -46,16 +46,16 @@
46
46
  border-radius: calc(0.25 * var(--_sonic-readout-size));
47
47
  box-shadow:
48
48
  calc(2 * var(--_sonic-cast-x)) calc(2 * var(--_sonic-cast-y)) calc(6 * var(--_sonic-unit))
49
- rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))),
49
+ rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-relief))),
50
50
  inset 0 0 0 max(1px, round(var(--_sonic-unit), var(--_sonic-snap)))
51
- rgb(255 255 255 / calc(0.08 * var(--_sonic-relief)));
51
+ rgb(from var(--_sonic-shine) r g b / calc(0.08 * var(--_sonic-relief)));
52
52
  opacity: 0;
53
53
  translate: 0 calc(0.15 * var(--_sonic-readout-size));
54
54
  transition:
55
- opacity 120ms ease-out,
56
- translate 120ms ease-out,
57
- display 120ms allow-discrete,
58
- overlay 120ms allow-discrete;
55
+ opacity var(--_sonic-fade-duration) ease-out,
56
+ translate var(--_sonic-fade-duration) ease-out,
57
+ display var(--_sonic-fade-duration) allow-discrete,
58
+ overlay var(--_sonic-fade-duration) allow-discrete;
59
59
 
60
60
  /* Grid only while open; engines keep the flip a closed readout took against a filtered ancestor */
61
61
  &:popover-open {
@@ -1,24 +1,13 @@
1
1
  @layer sonic.material {
2
- :is(
3
- .sonic-envelope,
4
- .sonic-button,
5
- .sonic-number,
6
- .sonic-screen,
7
- .sonic-segmented,
8
- .sonic-spectrum,
9
- .sonic-toggle,
10
- .sonic-waveform,
11
- .sonic-wavestrip,
12
- .sonic-xy
13
- ) {
2
+ :is(.sonic-button, .sonic-number, .sonic-screen, .sonic-segmented, .sonic-toggle) {
14
3
  --_sonic-well-depth: var(--_sonic-glass-depth, 1);
15
4
  --_sonic-well:
16
5
  inset calc(var(--_sonic-well-depth) * var(--_sonic-cast-x))
17
6
  calc(var(--_sonic-well-depth) * var(--_sonic-cast-y))
18
7
  calc(2 * var(--_sonic-well-depth) * var(--_sonic-unit))
19
- rgb(0 0 0 / calc(0.6 * var(--_sonic-relief))),
8
+ rgb(from var(--_sonic-shade) r g b / calc(0.6 * var(--_sonic-relief))),
20
9
  calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-x))
21
10
  calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-y)) 0
22
- rgb(255 255 255 / calc(0.06 * var(--_sonic-relief)));
11
+ rgb(from var(--_sonic-shine) r g b / calc(0.06 * var(--_sonic-relief)));
23
12
  }
24
13
  }
@@ -263,18 +263,13 @@
263
263
  position: absolute;
264
264
  inset: 0;
265
265
  content: '';
266
- background: linear-gradient(
267
- var(--_sonic-light-fall),
268
- rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))),
269
- transparent 60%
270
- )
271
- 0 100% / 100% var(--_sonic-meter-pitch) repeat-y;
266
+ background: var(--_sonic-lens-glint) 0 100% / 100% var(--_sonic-meter-pitch) repeat-y;
272
267
  }
273
268
 
274
269
  :state(ladder) > .sonic-meter > .sonic-meter-bar::after {
275
270
  background: radial-gradient(
276
271
  circle var(--_sonic-meter-ladder-radius),
277
- rgb(255 255 255 / calc(0.45 * var(--_sonic-relief))),
272
+ rgb(from var(--_sonic-shine) r g b / calc(0.45 * var(--_sonic-relief))),
278
273
  transparent
279
274
  )
280
275
  0 100% / 100% var(--_sonic-meter-pitch) repeat-y;
@@ -31,6 +31,7 @@
31
31
 
32
32
  .sonic-number {
33
33
  --_sonic-number-radius-ratio: var(--sonic-number-radius-ratio, 0.15);
34
+ --_sonic-number-radius-own: calc(var(--_sonic-number-size) * var(--sonic-number-radius-ratio));
34
35
  --_sonic-number-inset-ratio: var(--sonic-number-inset-ratio, 0.2);
35
36
  --_sonic-number-text-ratio: var(--sonic-number-text-ratio, 0.45);
36
37
  --_sonic-number-travel: var(--sonic-number-travel, 160px);
@@ -44,7 +45,10 @@
44
45
  line-height: 1;
45
46
  touch-action: pan-x;
46
47
  cursor: ns-resize;
47
- border-radius: calc(var(--_sonic-number-size) * var(--_sonic-number-radius-ratio));
48
+ border-radius: var(
49
+ --_sonic-number-radius-own,
50
+ var(--sonic-radius, calc(var(--_sonic-number-size) * var(--_sonic-number-radius-ratio)))
51
+ );
48
52
  box-shadow: var(--_sonic-focus-shadow);
49
53
  }
50
54
 
@@ -29,13 +29,14 @@
29
29
  box-shadow:
30
30
  inset var(--_sonic-cast-x) var(--_sonic-cast-y)
31
31
  max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth))
32
- rgb(255 255 255 / calc(0.07 * var(--_sonic-relief))),
32
+ rgb(from var(--_sonic-shine) r g b / calc(0.07 * var(--_sonic-relief))),
33
33
  inset calc(-1 * var(--_sonic-cast-x)) calc(-1 * var(--_sonic-cast-y))
34
34
  max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth))
35
- rgb(0 0 0 / calc(0.35 * var(--_sonic-relief))),
35
+ rgb(from var(--_sonic-shade) r g b / calc(0.35 * var(--_sonic-relief))),
36
36
  calc(2 * sin(var(--_sonic-light-tilt)) * max(0px, var(--_sonic-panel-depth)))
37
37
  calc(2 * cos(var(--_sonic-light-tilt)) * max(0px, var(--_sonic-panel-depth)))
38
- calc(3 * max(0px, var(--_sonic-panel-depth))) rgb(0 0 0 / calc(0.45 * var(--_sonic-relief)));
38
+ calc(3 * max(0px, var(--_sonic-panel-depth)))
39
+ rgb(from var(--_sonic-shade) r g b / calc(0.45 * var(--_sonic-relief)));
39
40
  }
40
41
 
41
42
  .sonic-panel-title {
@@ -70,7 +70,7 @@
70
70
  }
71
71
 
72
72
  .sonic-ring > * > .sonic-button {
73
- --_sonic-button-radius-ratio: 0.5;
73
+ --_sonic-button-radius-own: calc(var(--_sonic-button-size) / 2);
74
74
  --_sonic-button-face-radius-ratio: 0.5;
75
75
 
76
76
  inline-size: var(--_sonic-button-size);
@@ -9,14 +9,16 @@
9
9
  @layer sonic.control {
10
10
  .sonic-screen {
11
11
  --_sonic-screen-size: var(--sonic-screen-size, 2.5rem);
12
- --_sonic-screen-aspect-ratio: var(--sonic-screen-aspect-ratio, 3);
13
12
  --_sonic-screen-radius-ratio: var(--sonic-screen-radius-ratio, 0.15);
13
+ --_sonic-screen-radius-own: calc(var(--_sonic-screen-size) * var(--sonic-screen-radius-ratio));
14
14
  --_sonic-screen-inset-ratio: var(--sonic-screen-inset-ratio, 0.1);
15
15
  --_sonic-unit: calc(var(--_sonic-screen-size) / 32);
16
16
 
17
- inline-size: calc(var(--_sonic-screen-size) * var(--_sonic-screen-aspect-ratio));
18
- block-size: var(--_sonic-screen-size);
17
+ min-block-size: var(--_sonic-screen-size);
19
18
  padding: calc(var(--_sonic-screen-size) * var(--_sonic-screen-inset-ratio));
20
- border-radius: calc(var(--_sonic-screen-size) * var(--_sonic-screen-radius-ratio));
19
+ border-radius: var(
20
+ --_sonic-screen-radius-own,
21
+ var(--sonic-radius, calc(var(--_sonic-screen-size) * var(--_sonic-screen-radius-ratio)))
22
+ );
21
23
  }
22
24
  }
@@ -38,11 +38,18 @@
38
38
  var(--_sonic-segmented-press-scale)
39
39
  );
40
40
  --_sonic-segmented-font-ratio: var(--sonic-segmented-font-ratio, 0.34);
41
+ --_sonic-segmented-font-own: calc(
42
+ var(--_sonic-segmented-size) * var(--sonic-segmented-font-ratio)
43
+ );
41
44
  --_sonic-segmented-padding-ratio: var(--sonic-segmented-padding-ratio, 0.25);
42
45
  --_sonic-segmented-icon-ratio: var(--sonic-segmented-icon-ratio, 0.5);
43
46
  --_sonic-unit: calc(var(--_sonic-segmented-size) / 32);
44
- --_sonic-segmented-corner: calc(
45
- var(--_sonic-segmented-size) * var(--_sonic-segmented-radius-ratio)
47
+ --_sonic-segmented-radius-own: calc(
48
+ var(--_sonic-segmented-size) * var(--sonic-segmented-radius-ratio)
49
+ );
50
+ --_sonic-segmented-corner: var(
51
+ --_sonic-segmented-radius-own,
52
+ var(--sonic-radius, calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-radius-ratio)))
46
53
  );
47
54
  --_sonic-keycap-depth: calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-depth-ratio));
48
55
  --_sonic-segmented-gap: calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-gap-ratio));
@@ -75,14 +82,20 @@
75
82
  min-inline-size: calc(var(--_sonic-segmented-size) - 2 * var(--_sonic-segmented-gap));
76
83
  padding: 0;
77
84
  font: inherit;
78
- font-size: calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-font-ratio));
85
+ font-size: var(
86
+ --_sonic-segmented-font-own,
87
+ var(
88
+ --sonic-legend-font-size,
89
+ calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-font-ratio))
90
+ )
91
+ );
79
92
  line-height: 1;
80
93
  color: var(--_sonic-ink);
81
94
  cursor: pointer;
82
95
  background: transparent;
83
96
  border: 0;
84
97
  border-radius: var(--_sonic-segmented-inner-corner);
85
- transition: color 120ms ease-out;
98
+ transition: color var(--_sonic-fade-duration) ease-out;
86
99
  }
87
100
 
88
101
  .sonic-segmented-option:where([data-sonic-pressed]):not(:disabled),
@@ -92,7 +92,7 @@
92
92
  touch-action: var(--sonic-touch-action, pan-y);
93
93
  cursor: var(--_sonic-slider-cursor);
94
94
  user-select: none;
95
- transition: --_sonic-slider-groove-ratio 120ms ease-out;
95
+ transition: --_sonic-slider-groove-ratio var(--_sonic-fade-duration) ease-out;
96
96
 
97
97
  @media (prefers-reduced-motion: reduce) {
98
98
  transition: none;
@@ -424,7 +424,13 @@
424
424
  var(--_sonic-slider-breadth) * var(--_sonic-slider-indicator-ratio)
425
425
  );
426
426
  --_sonic-slider-bevel: calc(var(--_sonic-slider-breadth) * var(--_sonic-slider-bevel-ratio));
427
- --_sonic-slider-corner: calc(var(--_sonic-slider-breadth) * var(--_sonic-slider-radius-ratio));
427
+ --_sonic-slider-radius-own: calc(
428
+ var(--_sonic-slider-breadth) * var(--sonic-slider-radius-ratio)
429
+ );
430
+ --_sonic-slider-corner: var(
431
+ --_sonic-slider-radius-own,
432
+ var(--sonic-radius, calc(var(--_sonic-slider-breadth) * var(--_sonic-slider-radius-ratio)))
433
+ );
428
434
  --_sonic-slider-indicator-inset: calc(
429
435
  var(--_sonic-slider-bevel) + var(--_sonic-slider-breadth) * 0.1
430
436
  );
@@ -460,7 +466,7 @@
460
466
  background: var(--_sonic-slider-indicator);
461
467
  border-radius: calc(var(--_sonic-slider-indicator-width) / 2);
462
468
  box-shadow: inset 0 0 calc(0.75 * var(--_sonic-unit))
463
- rgb(0 0 0 / calc(0.55 * var(--_sonic-relief)));
469
+ rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-relief)));
464
470
  }
465
471
  }
466
472
 
@@ -71,22 +71,21 @@
71
71
  --_sonic-spectrum-lit: var(--_sonic-lit);
72
72
  --_sonic-spectrum-hot: var(--_sonic-lit-warning);
73
73
  --_sonic-spectrum-clip: var(--_sonic-lit-danger);
74
- --_sonic-spectrum-grid: color-mix(in oklab, var(--_sonic-glass-text) 20%, transparent);
74
+ --_sonic-spectrum-grid: color-mix(in oklab, currentcolor 20%, transparent);
75
75
  --_sonic-spectrum-hot-from: var(--sonic-spectrum-hot-from, -12);
76
76
  --_sonic-spectrum-clip-from: var(--sonic-spectrum-clip-from, -3);
77
77
 
78
+ /* fallow-ignore-next-line code-duplication -- a plain box restated, since sheets never import each other */
79
+ position: relative;
80
+ display: grid;
81
+ flex-shrink: 0;
82
+ grid-template: minmax(0, 1fr) / minmax(0, 1fr);
78
83
  inline-size: var(--_sonic-spectrum-length);
79
84
  block-size: var(--_sonic-spectrum-size);
80
- padding: calc(var(--_sonic-spectrum-size) * var(--sonic-spectrum-inset-ratio, 0.06));
81
85
 
82
86
  /* The canvas's backing size would otherwise feed an intrinsically sized parent */
83
87
  contain: size;
84
-
85
- --_sonic-glass-radius: calc(
86
- var(--_sonic-spectrum-size) * var(--sonic-spectrum-radius-ratio, 0.08)
87
- );
88
-
89
- border-radius: var(--_sonic-glass-radius);
88
+ user-select: none;
90
89
  }
91
90
 
92
91
  [fill] > .sonic-spectrum,
@@ -100,7 +99,7 @@
100
99
  block-size: 100%;
101
100
  }
102
101
 
103
- /* Opaque, since a system highlight carries alpha that would blend the bars into the glass */
102
+ /* Opaque, since a system highlight carries alpha that would blend the bars into what is behind them */
104
103
  @media (forced-colors: active) {
105
104
  .sonic-spectrum {
106
105
  --_sonic-spectrum-lit: rgb(from CanvasText r g b / 100%);