@xsynaptic/sonic-ui 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +3 -1
  2. package/dist/default/dat.js +5 -4
  3. package/dist/default/define/button.js +1 -1
  4. package/dist/default/define.js +2 -2
  5. package/dist/default/elements/button.js +6 -5
  6. package/dist/default/elements/dial.js +5 -1
  7. package/dist/default/elements/envelope.js +46 -18
  8. package/dist/default/elements/meter.js +12 -8
  9. package/dist/default/elements/number.js +1 -1
  10. package/dist/default/elements/radio-group.js +46 -47
  11. package/dist/default/elements/readout-claim.js +0 -29
  12. package/dist/default/elements/readout.js +1 -1
  13. package/dist/default/elements/scale.js +43 -0
  14. package/dist/default/elements/slider.js +16 -3
  15. package/dist/default/elements/sonic-element.js +17 -55
  16. package/dist/default/elements/switch.js +33 -39
  17. package/dist/default/elements/value-element.js +142 -187
  18. package/dist/default/elements/wave-element.js +5 -2
  19. package/dist/default/elements/waveform.js +35 -12
  20. package/dist/default/elements/wavestrip.js +59 -18
  21. package/dist/default/elements/xy.js +34 -19
  22. package/dist/default/index.js +2 -2
  23. package/dist/default/lib/adsr-shape.js +5 -0
  24. package/dist/default/lib/ballistics.js +2 -2
  25. package/dist/default/lib/canvas-surface.js +13 -2
  26. package/dist/default/lib/distribute.js +1 -1
  27. package/dist/default/lib/drag-step.js +4 -4
  28. package/dist/default/lib/frame-timeline.js +2 -1
  29. package/dist/default/lib/marker-band.js +54 -10
  30. package/dist/default/lib/marker-rider.js +10 -4
  31. package/dist/default/lib/math.js +6 -1
  32. package/dist/default/lib/mirror-children.js +64 -0
  33. package/dist/default/lib/owned-control.js +10 -0
  34. package/dist/default/lib/pointer-drag.js +8 -5
  35. package/dist/default/lib/resample-peaks.js +11 -1
  36. package/dist/default/lib/time-regions.js +4 -1
  37. package/dist/default/lib/write-attribute.js +1 -0
  38. package/dist/dev/dat.d.ts +2 -2
  39. package/dist/dev/dat.js +5 -4
  40. package/dist/dev/dat.js.map +1 -1
  41. package/dist/dev/define/button.js +1 -1
  42. package/dist/dev/define.d.ts +4 -4
  43. package/dist/dev/define.js +2 -2
  44. package/dist/dev/elements/button.js +6 -5
  45. package/dist/dev/elements/button.js.map +1 -1
  46. package/dist/dev/elements/dial.d.ts +1 -1
  47. package/dist/dev/elements/dial.js +5 -1
  48. package/dist/dev/elements/dial.js.map +1 -1
  49. package/dist/dev/elements/envelope.js +46 -18
  50. package/dist/dev/elements/envelope.js.map +1 -1
  51. package/dist/dev/elements/meter.d.ts +1 -1
  52. package/dist/dev/elements/meter.js +12 -8
  53. package/dist/dev/elements/meter.js.map +1 -1
  54. package/dist/dev/elements/number.js +1 -1
  55. package/dist/dev/elements/number.js.map +1 -1
  56. package/dist/dev/elements/radio-group.js +46 -47
  57. package/dist/dev/elements/radio-group.js.map +1 -1
  58. package/dist/dev/elements/readout-claim.js +0 -29
  59. package/dist/dev/elements/readout-claim.js.map +1 -1
  60. package/dist/dev/elements/readout.js +1 -1
  61. package/dist/dev/elements/readout.js.map +1 -1
  62. package/dist/dev/elements/scale.js +44 -0
  63. package/dist/dev/elements/scale.js.map +1 -0
  64. package/dist/dev/elements/slider.d.ts +4 -1
  65. package/dist/dev/elements/slider.js +16 -3
  66. package/dist/dev/elements/slider.js.map +1 -1
  67. package/dist/dev/elements/sonic-element.d.ts +2 -8
  68. package/dist/dev/elements/sonic-element.js +18 -55
  69. package/dist/dev/elements/sonic-element.js.map +1 -1
  70. package/dist/dev/elements/switch.js +33 -39
  71. package/dist/dev/elements/switch.js.map +1 -1
  72. package/dist/dev/elements/value-element.d.ts +6 -8
  73. package/dist/dev/elements/value-element.js +142 -187
  74. package/dist/dev/elements/value-element.js.map +1 -1
  75. package/dist/dev/elements/wave-element.d.ts +1 -0
  76. package/dist/dev/elements/wave-element.js +5 -2
  77. package/dist/dev/elements/wave-element.js.map +1 -1
  78. package/dist/dev/elements/waveform.d.ts +1 -1
  79. package/dist/dev/elements/waveform.js +35 -12
  80. package/dist/dev/elements/waveform.js.map +1 -1
  81. package/dist/dev/elements/wavestrip.d.ts +4 -0
  82. package/dist/dev/elements/wavestrip.js +59 -18
  83. package/dist/dev/elements/wavestrip.js.map +1 -1
  84. package/dist/dev/elements/xy.d.ts +3 -3
  85. package/dist/dev/elements/xy.js +34 -19
  86. package/dist/dev/elements/xy.js.map +1 -1
  87. package/dist/dev/index.d.ts +2 -2
  88. package/dist/dev/index.js +2 -2
  89. package/dist/dev/lib/adsr-shape.js +5 -0
  90. package/dist/dev/lib/adsr-shape.js.map +1 -1
  91. package/dist/dev/lib/ballistics.js +2 -2
  92. package/dist/dev/lib/ballistics.js.map +1 -1
  93. package/dist/dev/lib/canvas-surface.d.ts +1 -0
  94. package/dist/dev/lib/canvas-surface.js +13 -2
  95. package/dist/dev/lib/canvas-surface.js.map +1 -1
  96. package/dist/dev/lib/distribute.js +1 -1
  97. package/dist/dev/lib/distribute.js.map +1 -1
  98. package/dist/dev/lib/drag-step.js +4 -4
  99. package/dist/dev/lib/drag-step.js.map +1 -1
  100. package/dist/dev/lib/frame-timeline.js +2 -1
  101. package/dist/dev/lib/frame-timeline.js.map +1 -1
  102. package/dist/dev/lib/marker-band.js +54 -10
  103. package/dist/dev/lib/marker-band.js.map +1 -1
  104. package/dist/dev/lib/marker-rider.js +10 -4
  105. package/dist/dev/lib/marker-rider.js.map +1 -1
  106. package/dist/dev/lib/math.js +6 -1
  107. package/dist/dev/lib/math.js.map +1 -1
  108. package/dist/dev/lib/mirror-children.js +80 -0
  109. package/dist/dev/lib/mirror-children.js.map +1 -0
  110. package/dist/dev/lib/owned-control.js +23 -0
  111. package/dist/dev/lib/owned-control.js.map +1 -0
  112. package/dist/dev/lib/pointer-drag.js +8 -5
  113. package/dist/dev/lib/pointer-drag.js.map +1 -1
  114. package/dist/dev/lib/resample-peaks.js +11 -1
  115. package/dist/dev/lib/resample-peaks.js.map +1 -1
  116. package/dist/dev/lib/time-regions.js +4 -1
  117. package/dist/dev/lib/time-regions.js.map +1 -1
  118. package/dist/dev/lib/write-attribute.js +1 -0
  119. package/dist/dev/lib/write-attribute.js.map +1 -1
  120. package/dist/skins/amber.css +8 -0
  121. package/dist/skins/flat.css +26 -0
  122. package/dist/skins/ivory.css +1 -0
  123. package/dist/skins/lime.css +2 -0
  124. package/dist/skins/slate.css +2 -0
  125. package/dist/styles/button.css +59 -10
  126. package/dist/styles/dial.css +24 -16
  127. package/dist/styles/envelope.css +58 -13
  128. package/dist/styles/led.css +20 -4
  129. package/dist/styles/material.css +143 -55
  130. package/dist/styles/meter.css +8 -4
  131. package/dist/styles/panel.css +7 -4
  132. package/dist/styles/segmented.css +27 -5
  133. package/dist/styles/slider.css +2 -1
  134. package/dist/styles/switch.css +65 -23
  135. package/dist/styles/waveform.css +28 -5
  136. package/dist/styles/wavestrip.css +23 -6
  137. package/dist/styles/xy.css +48 -27
  138. package/package.json +2 -5
@@ -30,26 +30,55 @@
30
30
  --_sonic-envelope-curve-ratio: var(--sonic-envelope-curve-ratio, 0.08);
31
31
  --_sonic-unit: calc(var(--_sonic-envelope-size) / 64);
32
32
  --_sonic-envelope-inset: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-inset-ratio));
33
+ --_sonic-glass-radius: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-radius-ratio));
33
34
 
34
35
  inline-size: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-aspect-ratio));
35
36
  block-size: var(--_sonic-envelope-size);
36
37
  container-type: size;
37
- border-radius: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-radius-ratio));
38
+ border-radius: var(--_sonic-glass-radius);
39
+ isolation: isolate;
38
40
  }
39
41
 
40
42
  .sonic-envelope-graph {
41
43
  position: absolute;
42
44
  inset: var(--_sonic-envelope-inset);
45
+ z-index: 1;
43
46
  inline-size: calc(100% - 2 * var(--_sonic-envelope-inset));
44
47
  block-size: calc(100% - 2 * var(--_sonic-envelope-inset));
45
48
  overflow: visible;
46
49
  pointer-events: none;
50
+ clip-path: inset(calc(-1 * var(--_sonic-envelope-inset)));
51
+ }
52
+
53
+ .sonic-envelope-bracket {
54
+ --_sonic-point-size: calc(
55
+ 2 * var(--_sonic-envelope-size) * var(--_sonic-envelope-handle-ratio)
56
+ );
57
+ --_sonic-bracket-size: var(--_sonic-point-size);
58
+
59
+ position: absolute;
60
+ inset: 0;
61
+ overflow: clip;
62
+ pointer-events: none;
63
+ border-radius: inherit;
64
+
65
+ &[data-sonic-part='curve'] {
66
+ --_sonic-point-size: calc(
67
+ 2 * var(--_sonic-envelope-size) * var(--_sonic-envelope-curve-ratio)
68
+ );
69
+ }
47
70
  }
48
71
 
49
72
  .sonic-envelope-fill {
50
73
  fill: color-mix(in oklab, var(--_sonic-lit) 18%, transparent);
51
74
  }
52
75
 
76
+ .sonic-envelope-floor {
77
+ height: calc(
78
+ 1px * var(--_sonic-envelope-inset-ratio) / (1 - 2 * var(--_sonic-envelope-inset-ratio))
79
+ );
80
+ }
81
+
53
82
  .sonic-envelope-line {
54
83
  fill: none;
55
84
  stroke: var(--_sonic-lit);
@@ -59,13 +88,8 @@
59
88
  vector-effect: non-scaling-stroke;
60
89
  }
61
90
 
62
- :is(.sonic-envelope-handle, .sonic-envelope-curve) {
63
- --_sonic-point-ring: var(--_sonic-glass-text);
64
- --_sonic-point-core: var(--_sonic-glass);
65
- --_sonic-point-halo: 0 0 transparent;
66
- --_sonic-point-held-halo: 0 0 calc(0.5 * var(--_sonic-point-size))
67
- calc(0.05 * var(--_sonic-point-size)) color-mix(in oklab, var(--_sonic-lit) 50%, transparent);
68
-
91
+ :is(.sonic-envelope-handle, .sonic-envelope-curve),
92
+ .sonic-envelope-bracket::before {
69
93
  position: absolute;
70
94
  inset: auto auto
71
95
  calc(
@@ -76,14 +100,27 @@
76
100
  var(--_sonic-envelope-inset) + var(--_sonic-envelope-x, 0) *
77
101
  (100cqi - 2 * var(--_sonic-envelope-inset)) - var(--_sonic-point-size) / 2
78
102
  );
103
+ }
104
+
105
+ :is(.sonic-envelope-handle, .sonic-envelope-curve) {
106
+ --_sonic-point-ring: var(--_sonic-lit);
107
+ --_sonic-point-core: var(--_sonic-lit);
108
+ --_sonic-point-lift: color-mix(in oklab, var(--_sonic-lit) 85%, #fff);
109
+ --_sonic-point-edge: max(1px, var(--_sonic-point-stroke, 0px));
110
+ --_sonic-point-halo: transparent;
111
+
112
+ z-index: 1;
79
113
  box-sizing: border-box;
80
114
  inline-size: var(--_sonic-point-size);
81
115
  block-size: var(--_sonic-point-size);
82
116
  touch-action: none;
83
117
  background: var(--_sonic-point-core);
84
- border: max(1px, var(--_sonic-point-stroke, 0px)) solid var(--_sonic-point-ring);
118
+ border: var(--_sonic-point-edge) solid var(--_sonic-point-ring);
85
119
  border-radius: 50%;
86
- box-shadow: var(--_sonic-point-halo), var(--_sonic-focus-shadow, 0 0 transparent);
120
+ box-shadow:
121
+ 0 0 calc(0.5 * var(--_sonic-point-size)) calc(0.05 * var(--_sonic-point-size))
122
+ var(--_sonic-point-halo),
123
+ var(--_sonic-focus-shadow, 0 0 transparent);
87
124
  transition:
88
125
  background-color 120ms ease-out,
89
126
  border-color 120ms ease-out,
@@ -116,26 +153,33 @@
116
153
 
117
154
  :is(.sonic-envelope-curve, .sonic-envelope-handle)[data-sonic-disabled] {
118
155
  --_sonic-point-ring: var(--_sonic-unlit);
156
+ --_sonic-point-core: var(--_sonic-glass);
119
157
 
120
158
  cursor: default;
121
159
  }
122
160
 
123
161
  @media (hover: hover) {
124
162
  :is(.sonic-envelope-curve, .sonic-envelope-handle):not([data-sonic-disabled]):hover {
125
- --_sonic-point-ring: var(--_sonic-lit);
163
+ --_sonic-point-ring: var(--_sonic-point-lift);
164
+ --_sonic-point-core: var(--_sonic-point-lift);
126
165
  }
127
166
  }
128
167
 
129
168
  :is(.sonic-envelope-curve, .sonic-envelope-handle):not([data-sonic-disabled]):active {
130
169
  --_sonic-point-ring: var(--_sonic-lit);
131
- --_sonic-point-core: var(--_sonic-lit);
132
- --_sonic-point-halo: var(--_sonic-point-held-halo);
170
+ --_sonic-point-core: var(--_sonic-glass);
171
+ --_sonic-point-halo: color-mix(
172
+ in oklab,
173
+ var(--_sonic-lit) calc(50% * var(--_sonic-relief)),
174
+ transparent
175
+ );
133
176
  }
134
177
 
135
178
  @media (forced-colors: active) {
136
179
  .sonic-envelope {
137
180
  --_sonic-lit: Highlight;
138
181
  --_sonic-unlit: GrayText;
182
+ --_sonic-glass: Canvas;
139
183
  }
140
184
 
141
185
  .sonic-envelope-graph {
@@ -144,6 +188,7 @@
144
188
 
145
189
  :is(.sonic-envelope-curve, .sonic-envelope-handle) {
146
190
  --_sonic-point-ring: CanvasText;
191
+ --_sonic-point-lift: Highlight;
147
192
 
148
193
  forced-color-adjust: none;
149
194
  }
@@ -7,10 +7,26 @@
7
7
  @layer sonic {
8
8
  .sonic-led {
9
9
  --_sonic-led-size: var(--sonic-led-size, 0.5rem);
10
- --_sonic-led-lens-ratio: var(--sonic-led-lens-ratio, 0.625);
10
+ --_sonic-led-lens-ratio: var(--sonic-led-lens-ratio, calc(0.8 - 0.175 * var(--_sonic-relief)));
11
11
  --_sonic-lit-alt: var(--sonic-lit-alt, oklch(79% 0.2 150deg));
12
12
  --_sonic-unit: calc(var(--_sonic-led-size) / 8);
13
- --_sonic-led-bezel: color-mix(in oklab, var(--_sonic-unlit) 55%, #000);
13
+ --_sonic-led-modelled: calc(100% * var(--_sonic-relief));
14
+ --_sonic-led-bezel: var(
15
+ --sonic-bezel,
16
+ color-mix(
17
+ in oklab,
18
+ color-mix(in oklab, var(--_sonic-unlit) 55%, #000) var(--_sonic-led-modelled),
19
+ transparent
20
+ )
21
+ );
22
+ --_sonic-lens-glass: var(
23
+ --sonic-lens,
24
+ color-mix(
25
+ in oklab,
26
+ color-mix(in oklab, var(--_sonic-unlit) 60%, #000) var(--_sonic-led-modelled),
27
+ color-mix(in oklab, currentcolor 30%, transparent)
28
+ )
29
+ );
14
30
 
15
31
  position: relative;
16
32
  display: inline-block;
@@ -87,7 +103,7 @@
87
103
  background:
88
104
  radial-gradient(
89
105
  closest-side,
90
- color-mix(in oklab, var(--_sonic-lit) 60%, transparent)
106
+ color-mix(in oklab, var(--_sonic-lit) calc(60% * var(--_sonic-relief)), transparent)
91
107
  calc(var(--_sonic-led-lens-ratio) * 100%),
92
108
  transparent
93
109
  ),
@@ -96,7 +112,7 @@
96
112
  &::after {
97
113
  background: radial-gradient(
98
114
  closest-side,
99
- color-mix(in oklab, var(--_sonic-lit) 55%, #fff),
115
+ color-mix(in oklab, var(--_sonic-lit) calc(100% - 45% * var(--_sonic-relief)), #fff),
100
116
  var(--_sonic-lit)
101
117
  );
102
118
  }
@@ -41,6 +41,7 @@
41
41
  .sonic-xy-readout
42
42
  ) {
43
43
  --_sonic-unlit: var(--sonic-unlit, oklch(27.4% 0.005 286deg));
44
+ --_sonic-relief: var(--sonic-relief, 0);
44
45
  --_sonic-light-tilt: var(--sonic-light-tilt, 17deg);
45
46
  --_sonic-light-fall: calc(180deg - var(--_sonic-light-tilt));
46
47
  --_sonic-cast-x: calc(sin(var(--_sonic-light-tilt)) * var(--_sonic-unit));
@@ -77,19 +78,19 @@
77
78
  );
78
79
  --_sonic-arc-shade: radial-gradient(
79
80
  closest-side,
80
- rgb(0 0 0 / 55%) calc(100% - var(--_sonic-arc-width)),
81
+ rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))) calc(100% - var(--_sonic-arc-width)),
81
82
  transparent calc(100% - var(--_sonic-arc-width) * 0.4),
82
- rgb(0 0 0 / 25%) 100%
83
+ rgb(0 0 0 / calc(0.25 * var(--_sonic-relief))) 100%
83
84
  );
84
85
  }
85
86
 
86
87
  :is(.sonic-led, .sonic-meter) {
87
88
  --_sonic-lens-glint: linear-gradient(
88
89
  var(--_sonic-light-fall),
89
- rgb(255 255 255 / 10%),
90
+ rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))),
90
91
  transparent 60%
91
92
  );
92
- --_sonic-lens-glass: color-mix(in oklab, var(--_sonic-unlit) 60%, #000);
93
+ --_sonic-lens-glass: var(--sonic-lens, color-mix(in oklab, var(--_sonic-unlit) 60%, #000));
93
94
  --_sonic-lens: var(--_sonic-lens-glint), var(--_sonic-lens-glass);
94
95
  --_sonic-hot: var(--sonic-hot, oklch(70.5% 0.187 48deg));
95
96
  --_sonic-clip: var(--sonic-clip, oklch(63.7% 0.208 25deg));
@@ -106,46 +107,53 @@
106
107
  .sonic-wavestrip,
107
108
  .sonic-xy
108
109
  ) {
109
- --_sonic-cap: var(--sonic-cap, oklch(37% 0.012 286deg));
110
- --_sonic-cap-hover: var(--sonic-cap-hover, oklch(44.2% 0.015 286deg));
110
+ --_sonic-cap: var(--sonic-cap, transparent);
111
+ --_sonic-cap-hover: var(--sonic-cap-hover, transparent);
111
112
  --_sonic-focus: var(--sonic-focus, oklch(90% 0.23 128deg));
112
- --_sonic-ink: var(--sonic-ink, color-mix(in oklab, var(--_sonic-cap) 30%, #fff));
113
+ --_sonic-ink: var(--sonic-ink, currentcolor);
113
114
  --_sonic-etch: color-mix(in oklab, var(--_sonic-ink) 30%, transparent);
114
- --_sonic-ink-lift: color-mix(in oklab, var(--_sonic-ink) 60%, #fff);
115
+ --_sonic-ink-lift: var(--sonic-ink-hover, color-mix(in oklab, var(--_sonic-ink) 60%, #fff));
115
116
  --_sonic-lit-disabled: color-mix(in oklab, var(--_sonic-ink) 25%, var(--_sonic-unlit));
116
117
  --_sonic-skirt: linear-gradient(
117
118
  var(--_sonic-light-fall),
118
- color-mix(in oklab, var(--_sonic-cap) 70%, #fff),
119
- color-mix(in oklab, var(--_sonic-cap) 55%, #000)
119
+ color-mix(in oklab, var(--_sonic-cap) calc(100% - 30% * var(--_sonic-relief)), #fff),
120
+ color-mix(in oklab, var(--_sonic-cap) calc(100% - 45% * var(--_sonic-relief)), #000)
120
121
  );
121
122
  --_sonic-face: linear-gradient(
122
123
  var(--_sonic-light-fall),
123
- color-mix(in oklab, var(--_sonic-cap) 85%, #000),
124
- color-mix(in oklab, var(--_sonic-cap) 90%, #fff)
124
+ color-mix(in oklab, var(--_sonic-cap) calc(100% - 15% * var(--_sonic-relief)), #000),
125
+ color-mix(in oklab, var(--_sonic-cap) calc(100% - 10% * var(--_sonic-relief)), #fff)
125
126
  );
126
127
  --_sonic-sheen: linear-gradient(
127
128
  105deg,
128
129
  transparent 20%,
129
- rgb(255 255 255 / 10%) 45%,
130
+ rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))) 45%,
130
131
  transparent 55%,
131
- rgb(0 0 0 / 6%) 80%
132
+ rgb(0 0 0 / calc(0.06 * var(--_sonic-relief))) 80%
132
133
  );
133
134
  --_sonic-press-transition:
134
135
  scale 60ms cubic-bezier(0.4, 0, 0.2, 1), translate 60ms cubic-bezier(0.4, 0, 0.2, 1),
135
136
  box-shadow 60ms cubic-bezier(0.4, 0, 0.2, 1);
136
137
  --_sonic-face-shadow:
137
138
  inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(1.5 * var(--_sonic-unit))
138
- rgb(0 0 0 / 35%),
139
+ rgb(0 0 0 / calc(0.35 * var(--_sonic-relief))),
139
140
  calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) var(--_sonic-unit)
140
- rgb(255 255 255 / 12%);
141
+ rgb(255 255 255 / calc(0.12 * var(--_sonic-relief)));
141
142
  --_sonic-rim: 0 0 0 max(1px, 0.75 * var(--_sonic-unit))
142
- color-mix(in oklab, var(--_sonic-cap) 40%, #000);
143
- --_sonic-drop-shade: rgb(0 0 0 / 65%);
143
+ var(
144
+ --sonic-cap-edge,
145
+ color-mix(in oklab, var(--_sonic-cap) calc(100% - 60% * var(--_sonic-relief)), #000)
146
+ );
147
+ --_sonic-drop-shade: rgb(0 0 0 / calc(0.65 * var(--_sonic-relief)));
144
148
  --_sonic-focus-shadow: 0 0 transparent;
145
149
  --_sonic-focus-glow: 0 0 max(4px, 3 * var(--_sonic-unit)) max(1px, 0.5 * var(--_sonic-unit))
146
150
  color-mix(in oklab, var(--_sonic-focus) 60%, transparent);
147
151
  }
148
152
 
153
+ :is(.sonic-number, .sonic-waveform, .sonic-wavestrip, .sonic-xy) {
154
+ --_sonic-ink: var(--_sonic-glass-text);
155
+ }
156
+
149
157
  :is(.sonic-dial, .sonic-number, .sonic-slider, .sonic-waveform, .sonic-wavestrip) {
150
158
  --_sonic-detent-zone: var(--sonic-detent-zone, 8px);
151
159
  }
@@ -175,18 +183,42 @@
175
183
  .sonic-xy,
176
184
  .sonic-xy-readout
177
185
  ) {
178
- --_sonic-glass: var(--sonic-glass, color-mix(in oklab, var(--_sonic-unlit) 45%, #000));
186
+ --_sonic-glass-slab: color-mix(in oklab, var(--_sonic-unlit) 45%, #000);
187
+ --_sonic-glass-base: var(
188
+ --sonic-glass,
189
+ color-mix(
190
+ in oklab,
191
+ var(--_sonic-glass-slab) calc(100% * var(--_sonic-relief)),
192
+ light-dark(oklch(97% 0.003 286deg), var(--_sonic-glass-slab))
193
+ )
194
+ );
195
+ --_sonic-glass: var(--_sonic-glass-base);
179
196
  --_sonic-glass-fill: radial-gradient(
180
197
  closest-side,
181
- color-mix(in oklab, var(--_sonic-glass) 88%, #fff),
198
+ color-mix(
199
+ in oklab,
200
+ var(--_sonic-glass) calc(100% - 12% * var(--_sonic-glass-depth, var(--_sonic-relief))),
201
+ #fff
202
+ ),
182
203
  var(--_sonic-glass)
183
204
  )
184
205
  var(--_sonic-glass);
185
206
  --_sonic-glass-text: var(
186
207
  --sonic-glass-text,
187
- color-mix(in oklab, var(--_sonic-glass) 20%, #fff)
208
+ color-mix(
209
+ in oklab,
210
+ var(--_sonic-glass) 20%,
211
+ oklch(from var(--_sonic-glass) clamp(0, (0.6 - l) * 1000, 1) 0 0deg / 100%)
212
+ )
213
+ );
214
+
215
+ /* Invalid with the token unset, so the default takes over */
216
+ --_sonic-glass-edge-set: 1px solid var(--sonic-glass-edge);
217
+ --_sonic-glass-edge: var(
218
+ --_sonic-glass-edge-set,
219
+ calc(1px * (1 - var(--_sonic-relief))) solid
220
+ color-mix(in oklab, currentcolor 35%, transparent)
188
221
  );
189
- --_sonic-glass-edge: 0 none;
190
222
 
191
223
  /* Glass is forced to Canvas like the page, so only a border shows its edge */
192
224
  @media (forced-colors: active) {
@@ -196,8 +228,8 @@
196
228
 
197
229
  /* A definite cell, so percentage-sized content fills the glass; a canvas sized to its own box would feed back */
198
230
  :is(.sonic-envelope, .sonic-number, .sonic-screen, .sonic-waveform, .sonic-wavestrip, .sonic-xy) {
199
- --_sonic-glass-depth: var(--sonic-glass-depth, 1);
200
- --_sonic-glass-texture: var(--sonic-glass-texture, 1);
231
+ --_sonic-glass-depth: var(--sonic-glass-depth, var(--_sonic-relief));
232
+ --_sonic-glass-texture: var(--sonic-glass-texture, var(--_sonic-relief));
201
233
  --_sonic-glass-pitch: max(2px, round(2 * var(--_sonic-unit), 1px));
202
234
 
203
235
  position: relative;
@@ -275,21 +307,6 @@
275
307
  }
276
308
  }
277
309
 
278
- @media (forced-colors: none) {
279
- :is(.sonic-number, .sonic-screen),
280
- :is(.sonic-envelope, .sonic-waveform, .sonic-wavestrip, .sonic-xy)::after {
281
- filter: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='w' x='-0.3' y='-0.3' width='1.6' height='1.6' primitiveUnits='objectBoundingBox' color-interpolation-filters='sRGB'%3E%3CfeFlood x='0' y='0' width='1' height='1' flood-color='%23000'/%3E%3CfeFlood x='.5' y='0' width='.5' height='1' flood-color='%23f00' result='r'/%3E%3CfeFlood x='0' y='.5' width='1' height='.5' flood-color='%230f0' result='g'/%3E%3CfeFlood x='0' y='0' width='1' height='1' flood-color='%23000' result='k'/%3E%3CfeComposite in='r' in2='g' operator='arithmetic' k2='1' k3='1' result='h'/%3E%3CfeMerge x='0' y='0' width='1' height='1'%3E%3CfeMergeNode in='k'/%3E%3CfeMergeNode in='h'/%3E%3C/feMerge%3E%3CfeGaussianBlur x='0' y='0' width='1' height='1' stdDeviation='0.25'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1'/%3E%3CfeComponentTransfer result='a'%3E%3CfeFuncR type='table' tableValues='0 0.052 0.172 0.25 0.312 0.364 0.412 0.457 0.5 0.543 0.588 0.636 0.688 0.75 0.828 0.948 1'/%3E%3CfeFuncG type='table' tableValues='0 0.052 0.172 0.25 0.312 0.364 0.412 0.457 0.5 0.543 0.588 0.636 0.688 0.75 0.828 0.948 1'/%3E%3C/feComponentTransfer%3E%3CfeComponentTransfer%3E%3CfeFuncR type='table' tableValues='1 0.563 0.25 0.063 0 0.063 0.25 0.563 1'/%3E%3CfeFuncG type='table' tableValues='1 0.563 0.25 0.063 0 0.063 0.25 0.563 1'/%3E%3C/feComponentTransfer%3E%3CfeColorMatrix values='.5 .5 0 0 0 .5 .5 0 0 0 0 0 0 0 0 0 0 0 0 1'/%3E%3CfeComponentTransfer result='f'%3E%3CfeFuncR type='gamma' amplitude='0.333' exponent='2'/%3E%3CfeFuncG type='gamma' exponent='2'/%3E%3C/feComponentTransfer%3E%3CfeComposite in='a' in2='f' operator='arithmetic' k1='1' k3='-.5' k4='.5' result='m'/%3E%3CfeFlood flood-color='%23808080'/%3E%3CfeMerge result='n'%3E%3CfeMergeNode/%3E%3CfeMergeNode in='m'/%3E%3C/feMerge%3E%3CfeDisplacementMap in='SourceGraphic' in2='n' scale='0.04' xChannelSelector='R' yChannelSelector='G'/%3E%3C/filter%3E%3C/svg%3E#w");
282
- }
283
-
284
- /* A query reads the parent, or a pseudo-element's own element: on a readout itself, 0 leaves the warp on */
285
- @container style(--sonic-glass-texture: 0) {
286
- :is(.sonic-number, .sonic-screen),
287
- :is(.sonic-envelope, .sonic-waveform, .sonic-wavestrip, .sonic-xy)::after {
288
- filter: none;
289
- }
290
- }
291
- }
292
-
293
310
  :is(
294
311
  .sonic-envelope,
295
312
  .sonic-button,
@@ -304,23 +321,37 @@
304
321
  --_sonic-well:
305
322
  inset calc(var(--_sonic-well-depth) * var(--_sonic-cast-x))
306
323
  calc(var(--_sonic-well-depth) * var(--_sonic-cast-y))
307
- calc(2 * var(--_sonic-well-depth) * var(--_sonic-unit)) rgb(0 0 0 / 60%),
324
+ calc(2 * var(--_sonic-well-depth) * var(--_sonic-unit))
325
+ rgb(0 0 0 / calc(0.6 * var(--_sonic-relief))),
308
326
  calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-x))
309
- calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-y)) 0 rgb(255 255 255 / 6%);
327
+ calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-y)) 0
328
+ rgb(255 255 255 / calc(0.06 * var(--_sonic-relief)));
310
329
  }
311
330
 
312
331
  :is(.sonic-button, .sonic-segmented) {
313
- --_sonic-well-floor: linear-gradient(
314
- var(--_sonic-light-fall),
315
- color-mix(in oklab, var(--_sonic-unlit) 55%, #000),
316
- color-mix(in oklab, var(--_sonic-unlit) 85%, #000)
332
+ --_sonic-well-floor: var(
333
+ --sonic-well,
334
+ linear-gradient(
335
+ var(--_sonic-light-fall),
336
+ color-mix(
337
+ in oklab,
338
+ color-mix(in oklab, var(--_sonic-unlit) 55%, #000) calc(100% * var(--_sonic-relief)),
339
+ transparent
340
+ ),
341
+ color-mix(
342
+ in oklab,
343
+ color-mix(in oklab, var(--_sonic-unlit) 85%, #000) calc(100% * var(--_sonic-relief)),
344
+ transparent
345
+ )
346
+ )
317
347
  );
318
348
  --_sonic-engraving: drop-shadow(
319
349
  calc(-0.4 * var(--_sonic-cast-x)) calc(-0.4 * var(--_sonic-cast-y))
320
- calc(0.4 * var(--_sonic-unit)) rgb(0 0 0 / 30%)
350
+ calc(0.4 * var(--_sonic-unit)) rgb(0 0 0 / calc(0.3 * var(--_sonic-relief)))
321
351
  )
322
352
  drop-shadow(
323
- calc(0.3 * var(--_sonic-cast-x)) calc(0.3 * var(--_sonic-cast-y)) 0 rgb(255 255 255 / 7%)
353
+ calc(0.3 * var(--_sonic-cast-x)) calc(0.3 * var(--_sonic-cast-y)) 0
354
+ rgb(255 255 255 / calc(0.07 * var(--_sonic-relief)))
324
355
  );
325
356
  }
326
357
 
@@ -333,6 +364,25 @@
333
364
  --_sonic-keycap-drop: calc(1.5 * var(--_sonic-cast-x)) calc(1.5 * var(--_sonic-cast-y))
334
365
  calc(2 * var(--_sonic-unit)) var(--_sonic-drop-shade);
335
366
  --_sonic-keycap-glow: transparent;
367
+ --_sonic-keycap-lit-glow: color-mix(
368
+ in oklab,
369
+ var(--_sonic-lit) calc(22% * var(--_sonic-relief)),
370
+ transparent
371
+ );
372
+ --_sonic-legend-glow: drop-shadow(
373
+ 0 0 var(--_sonic-unit)
374
+ color-mix(in oklab, var(--_sonic-lit) calc(35% * var(--_sonic-relief)), transparent)
375
+ );
376
+ }
377
+
378
+ :is(.sonic-button, .sonic-segmented-option, .sonic-switch-position) {
379
+ --_sonic-target-outset: min(0px, calc((100% - var(--sonic-target-size, 100%)) / 2));
380
+
381
+ &::after {
382
+ position: absolute;
383
+ inset: var(--_sonic-target-outset);
384
+ content: '';
385
+ }
336
386
  }
337
387
 
338
388
  /* Each sheet maps its own depth, corner, bevel and face corner onto the `keycap` tokens */
@@ -341,7 +391,11 @@
341
391
  place-items: center;
342
392
  background: var(--_sonic-skirt);
343
393
  border-radius: var(--_sonic-keycap-corner);
344
- box-shadow: var(--_sonic-keycap-drop), var(--_sonic-rim), var(--_sonic-focus-shadow);
394
+ box-shadow:
395
+ var(--_sonic-keycap-drop),
396
+ var(--_sonic-rim),
397
+ 0 0 0 max(1px, 0.75 * var(--_sonic-unit)) var(--_sonic-blank-edge, transparent),
398
+ var(--_sonic-focus-shadow);
345
399
  scale: var(--_sonic-keycap-scale);
346
400
  translate: 0 var(--_sonic-keycap-shift);
347
401
  transition: var(--_sonic-press-transition);
@@ -362,12 +416,43 @@
362
416
  }
363
417
  }
364
418
 
419
+ .sonic-xy-bracket,
420
+ .sonic-envelope-bracket::before {
421
+ box-sizing: border-box;
422
+ inline-size: var(--_sonic-bracket-size);
423
+ block-size: var(--_sonic-bracket-size);
424
+ pointer-events: none;
425
+ content: '';
426
+ border: max(1px, 0.06 * var(--_sonic-bracket-size)) solid
427
+ color-mix(in oklab, var(--_sonic-glass-text) 45%, transparent);
428
+ border-radius: 50%;
429
+ opacity: 0;
430
+ mask: conic-gradient(
431
+ from 10deg,
432
+ #000 0 70deg,
433
+ transparent 0 180deg,
434
+ #000 0 250deg,
435
+ transparent 0
436
+ );
437
+ scale: 0.6;
438
+ transition:
439
+ opacity 120ms ease-out,
440
+ scale 120ms ease-out;
441
+ }
442
+
443
+ :state(dragging) > * > .sonic-xy-bracket,
444
+ :state(dragging) > * > .sonic-envelope-bracket::before {
445
+ opacity: calc(1 - var(--_sonic-relief));
446
+ scale: 1;
447
+ }
448
+
365
449
  :is(.sonic-meter, .sonic-slider) {
366
450
  --_sonic-groove:
367
451
  inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(0.75 * var(--_sonic-unit))
368
- rgb(0 0 0 / 55%),
369
- inset 0 0 calc(0.5 * var(--_sonic-unit)) rgb(0 0 0 / 30%),
370
- calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) 0 rgb(255 255 255 / 6%);
452
+ rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))),
453
+ inset 0 0 calc(0.5 * var(--_sonic-unit)) rgb(0 0 0 / calc(0.3 * var(--_sonic-relief))),
454
+ calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) 0
455
+ rgb(255 255 255 / calc(0.06 * var(--_sonic-relief)));
371
456
  }
372
457
 
373
458
  @media (hover: hover) {
@@ -413,6 +498,7 @@
413
498
  .sonic-xy-readout
414
499
  ) {
415
500
  --_sonic-unit: calc(var(--_sonic-readout-size) / 32);
501
+ --_sonic-glass: var(--sonic-readout-glass, var(--_sonic-glass-base));
416
502
 
417
503
  box-sizing: border-box;
418
504
  place-items: center;
@@ -429,6 +515,7 @@
429
515
  font-variant-numeric: tabular-nums;
430
516
  line-height: 1;
431
517
  color: var(--_sonic-glass-text);
518
+ white-space: nowrap;
432
519
  pointer-events: none;
433
520
  cursor: default;
434
521
  user-select: none;
@@ -437,8 +524,8 @@
437
524
  border-radius: calc(0.25 * var(--_sonic-readout-size));
438
525
  box-shadow:
439
526
  calc(2 * var(--_sonic-cast-x)) calc(2 * var(--_sonic-cast-y)) calc(6 * var(--_sonic-unit))
440
- rgb(0 0 0 / 55%),
441
- inset 0 0 0 max(1px, var(--_sonic-unit)) rgb(255 255 255 / 8%);
527
+ rgb(0 0 0 / calc(0.55 * var(--_sonic-relief))),
528
+ inset 0 0 0 max(1px, var(--_sonic-unit)) rgb(255 255 255 / calc(0.08 * var(--_sonic-relief)));
442
529
  opacity: 0;
443
530
  translate: 0 calc(0.15 * var(--_sonic-readout-size));
444
531
  transition:
@@ -525,13 +612,14 @@
525
612
  }
526
613
 
527
614
  & > .sonic-scale-tick {
528
- background: var(--_sonic-etch);
615
+ background: var(--sonic-scale, var(--_sonic-etch));
529
616
  }
530
617
  }
531
618
 
532
619
  @media (forced-colors: active) {
533
- .sonic-scale-tick {
620
+ :is(.sonic-dial-scale, .sonic-slider-scale) > .sonic-scale-tick {
534
621
  forced-color-adjust: none;
622
+ background: var(--_sonic-etch);
535
623
  }
536
624
 
537
625
  :is(
@@ -66,7 +66,7 @@
66
66
  flex-shrink: 0;
67
67
  inline-size: var(--_sonic-meter-size);
68
68
  block-size: var(--_sonic-meter-length);
69
- background: color-mix(in oklab, var(--_sonic-unlit) 55%, #000);
69
+ background: var(--sonic-bezel, color-mix(in oklab, var(--_sonic-unlit) 55%, #000));
70
70
  border-radius: calc(var(--_sonic-meter-size) * var(--_sonic-meter-radius-ratio));
71
71
 
72
72
  &::after {
@@ -257,14 +257,18 @@
257
257
  position: absolute;
258
258
  inset: 0;
259
259
  content: '';
260
- background: linear-gradient(var(--_sonic-light-fall), rgb(255 255 255 / 10%), transparent 60%) 0
261
- 100% / 100% var(--_sonic-meter-pitch) repeat-y;
260
+ background: linear-gradient(
261
+ var(--_sonic-light-fall),
262
+ rgb(255 255 255 / calc(0.1 * var(--_sonic-relief))),
263
+ transparent 60%
264
+ )
265
+ 0 100% / 100% var(--_sonic-meter-pitch) repeat-y;
262
266
  }
263
267
 
264
268
  :state(ladder) > .sonic-meter > .sonic-meter-bar::after {
265
269
  background: radial-gradient(
266
270
  circle var(--_sonic-meter-ladder-radius),
267
- rgb(255 255 255 / 45%),
271
+ rgb(255 255 255 / calc(0.45 * var(--_sonic-relief))),
268
272
  transparent
269
273
  )
270
274
  0 100% / 100% var(--_sonic-meter-pitch) repeat-y;
@@ -20,17 +20,20 @@
20
20
  --_sonic-panel-radius: var(--sonic-panel-radius, 0.75rem);
21
21
  --_sonic-unit: var(--_sonic-panel-depth);
22
22
 
23
- background: var(--sonic-panel, rgb(255 255 255 / 3%));
23
+ color: var(--sonic-panel-text, inherit);
24
+ background: var(--sonic-panel, color-mix(in oklab, currentcolor 3%, transparent));
24
25
  border: 1px solid var(--_sonic-panel-line);
25
26
  border-radius: var(--_sonic-panel-radius);
26
27
  box-shadow:
27
28
  inset var(--_sonic-cast-x) var(--_sonic-cast-y)
28
- max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth)) rgb(255 255 255 / 7%),
29
+ max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth))
30
+ rgb(255 255 255 / calc(0.07 * var(--_sonic-relief))),
29
31
  inset calc(-1 * var(--_sonic-cast-x)) calc(-1 * var(--_sonic-cast-y))
30
- max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth)) rgb(0 0 0 / 35%),
32
+ max(var(--_sonic-panel-depth), -1 * var(--_sonic-panel-depth))
33
+ rgb(0 0 0 / calc(0.35 * var(--_sonic-relief))),
31
34
  calc(2 * sin(var(--_sonic-light-tilt)) * max(0px, var(--_sonic-panel-depth)))
32
35
  calc(2 * cos(var(--_sonic-light-tilt)) * max(0px, var(--_sonic-panel-depth)))
33
- calc(3 * max(0px, var(--_sonic-panel-depth))) rgb(0 0 0 / 45%);
36
+ calc(3 * max(0px, var(--_sonic-panel-depth))) rgb(0 0 0 / calc(0.45 * var(--_sonic-relief)));
34
37
  }
35
38
 
36
39
  .sonic-panel-title {
@@ -26,7 +26,10 @@
26
26
  --_sonic-segmented-gap-ratio: var(--sonic-segmented-gap-ratio, 0.06);
27
27
  --_sonic-segmented-radius-ratio: var(--sonic-segmented-radius-ratio, 0.2);
28
28
  --_sonic-segmented-bevel-ratio: var(--sonic-segmented-bevel-ratio, 0.075);
29
- --_sonic-segmented-depth-ratio: var(--sonic-segmented-depth-ratio, 0.03);
29
+ --_sonic-segmented-depth-ratio: var(
30
+ --sonic-segmented-depth-ratio,
31
+ calc(0.03 * var(--_sonic-relief))
32
+ );
30
33
  --_sonic-segmented-press-scale: var(--sonic-segmented-press-scale, 0.985);
31
34
  --_sonic-segmented-font-ratio: var(--sonic-segmented-font-ratio, 0.34);
32
35
  --_sonic-segmented-icon-ratio: var(--sonic-segmented-icon-ratio, 0.5);
@@ -55,6 +58,12 @@
55
58
  }
56
59
 
57
60
  .sonic-segmented-option {
61
+ --_sonic-segmented-well-lit: var(
62
+ --sonic-well-lit,
63
+ color-mix(in oklab, var(--_sonic-lit) calc(100% * var(--_sonic-relief)), transparent)
64
+ );
65
+
66
+ position: relative;
58
67
  display: grid;
59
68
  min-inline-size: calc(var(--_sonic-segmented-size) - 2 * var(--_sonic-segmented-gap));
60
69
  padding: 0;
@@ -77,10 +86,10 @@
77
86
  }
78
87
 
79
88
  .sonic-segmented-option[aria-checked='true'] {
80
- --_sonic-keycap-glow: color-mix(in oklab, var(--_sonic-lit) 22%, transparent);
89
+ --_sonic-keycap-glow: var(--_sonic-keycap-lit-glow);
81
90
 
82
91
  color: var(--_sonic-lit);
83
- background: var(--_sonic-lit);
92
+ background: var(--_sonic-segmented-well-lit);
84
93
  box-shadow: var(--_sonic-well);
85
94
  }
86
95
 
@@ -105,6 +114,20 @@
105
114
  }
106
115
  }
107
116
 
117
+ .sonic-segmented-option[aria-checked='true']:not(:disabled):focus-visible {
118
+ color: var(--sonic-lit-hover, var(--_sonic-lit));
119
+ }
120
+
121
+ @media (hover: hover) {
122
+ .sonic-segmented-option[aria-checked='true']:not(:disabled):hover {
123
+ color: var(--sonic-lit-hover, var(--_sonic-lit));
124
+ }
125
+ }
126
+
127
+ .sonic-segmented-option::after {
128
+ inset-inline: 0;
129
+ }
130
+
108
131
  .sonic-segmented-cap {
109
132
  --_sonic-keycap-corner: var(--_sonic-segmented-inner-corner);
110
133
  --_sonic-keycap-bevel: calc(var(--_sonic-segmented-size) * var(--_sonic-segmented-bevel-ratio));
@@ -127,8 +150,7 @@
127
150
  }
128
151
 
129
152
  .sonic-segmented-option[aria-checked='true'] .sonic-segmented-cap > * {
130
- filter: var(--_sonic-engraving)
131
- drop-shadow(0 0 var(--_sonic-unit) color-mix(in oklab, var(--_sonic-lit) 35%, transparent));
153
+ filter: var(--_sonic-engraving) var(--_sonic-legend-glow);
132
154
  }
133
155
 
134
156
  @media (forced-colors: active) {
@@ -403,7 +403,8 @@
403
403
  calc(50% - var(--_sonic-slider-indicator-width) / 2);
404
404
  background: var(--_sonic-ink);
405
405
  border-radius: calc(var(--_sonic-slider-indicator-width) / 2);
406
- box-shadow: inset 0 0 calc(0.75 * var(--_sonic-unit)) rgb(0 0 0 / 55%);
406
+ box-shadow: inset 0 0 calc(0.75 * var(--_sonic-unit))
407
+ rgb(0 0 0 / calc(0.55 * var(--_sonic-relief)));
407
408
  }
408
409
  }
409
410