@xsynaptic/sonic-ui 0.4.0 → 0.6.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 (247) hide show
  1. package/README.md +3 -20
  2. package/dist/default/dat.js +51 -0
  3. package/dist/default/define/button.js +7 -0
  4. package/dist/default/define/envelope.js +7 -0
  5. package/dist/default/define/split.js +7 -0
  6. package/dist/default/define/switch.js +7 -0
  7. package/dist/default/define/waveform.js +7 -0
  8. package/dist/default/define/wavestrip.js +7 -0
  9. package/dist/default/define/xy.js +7 -0
  10. package/dist/default/define.js +7 -1
  11. package/dist/default/elements/button.js +165 -0
  12. package/dist/default/elements/dial.js +16 -22
  13. package/dist/default/elements/envelope.js +383 -0
  14. package/dist/default/elements/meter.js +155 -63
  15. package/dist/default/elements/number.js +22 -9
  16. package/dist/default/elements/radio-group.js +183 -0
  17. package/dist/default/elements/readout-claim.js +81 -0
  18. package/dist/default/elements/readout.js +35 -0
  19. package/dist/default/elements/segmented.js +9 -159
  20. package/dist/default/elements/slider.js +42 -51
  21. package/dist/default/elements/sonic-element.js +69 -31
  22. package/dist/default/elements/split.js +249 -0
  23. package/dist/default/elements/switch.js +273 -0
  24. package/dist/default/elements/value-element.js +694 -0
  25. package/dist/default/elements/{range-entry.js → value-entry.js} +3 -3
  26. package/dist/default/elements/wave-element.js +80 -0
  27. package/dist/default/elements/waveform.js +328 -0
  28. package/dist/default/elements/wavestrip.js +185 -0
  29. package/dist/default/elements/xy.js +487 -0
  30. package/dist/default/index.js +10 -2
  31. package/dist/default/lib/adsr-shape.js +113 -0
  32. package/dist/default/lib/ballistics.js +55 -0
  33. package/dist/default/lib/canvas-surface.js +203 -0
  34. package/dist/default/lib/copy-node.js +32 -2
  35. package/dist/default/lib/crossfade.js +22 -0
  36. package/dist/default/lib/distribute.js +215 -0
  37. package/dist/default/lib/drag-step.js +99 -0
  38. package/dist/default/lib/envelope-curve.js +9 -0
  39. package/dist/default/lib/field.js +94 -0
  40. package/dist/default/lib/focus-by-pointer.js +28 -0
  41. package/dist/default/lib/frame-timeline.js +63 -0
  42. package/dist/default/lib/hold.js +38 -0
  43. package/dist/default/lib/marker-band.js +80 -0
  44. package/dist/default/lib/marker-rider.js +120 -0
  45. package/dist/default/lib/math.js +17 -3
  46. package/dist/default/lib/modifier-press.js +11 -0
  47. package/dist/default/lib/number-list.js +6 -6
  48. package/dist/default/lib/pointer-drag.js +46 -0
  49. package/dist/default/lib/render.js +20 -5
  50. package/dist/default/lib/resample-peaks.js +46 -0
  51. package/dist/default/lib/strip-scene.js +48 -0
  52. package/dist/default/lib/taper.js +23 -17
  53. package/dist/default/lib/time-regions.js +8 -0
  54. package/dist/default/lib/tracking-clock.js +35 -0
  55. package/dist/default/lib/value-mapping.js +115 -0
  56. package/dist/default/lib/waveform-buckets.js +41 -0
  57. package/dist/default/lib/write-attribute.js +1 -0
  58. package/dist/dev/dat.d.ts +19 -0
  59. package/dist/dev/dat.js +52 -0
  60. package/dist/dev/dat.js.map +1 -0
  61. package/dist/dev/define/button.d.ts +2 -0
  62. package/dist/dev/define/button.js +8 -0
  63. package/dist/dev/define/button.js.map +1 -0
  64. package/dist/dev/define/dial.js.map +1 -1
  65. package/dist/dev/define/envelope.d.ts +2 -0
  66. package/dist/dev/define/envelope.js +8 -0
  67. package/dist/dev/define/envelope.js.map +1 -0
  68. package/dist/dev/define/meter.js.map +1 -1
  69. package/dist/dev/define/number.js.map +1 -1
  70. package/dist/dev/define/segmented.js.map +1 -1
  71. package/dist/dev/define/slider.js.map +1 -1
  72. package/dist/dev/define/split.d.ts +2 -0
  73. package/dist/dev/define/split.js +8 -0
  74. package/dist/dev/define/split.js.map +1 -0
  75. package/dist/dev/define/switch.d.ts +2 -0
  76. package/dist/dev/define/switch.js +8 -0
  77. package/dist/dev/define/switch.js.map +1 -0
  78. package/dist/dev/define/waveform.d.ts +2 -0
  79. package/dist/dev/define/waveform.js +8 -0
  80. package/dist/dev/define/waveform.js.map +1 -0
  81. package/dist/dev/define/wavestrip.d.ts +2 -0
  82. package/dist/dev/define/wavestrip.js +8 -0
  83. package/dist/dev/define/wavestrip.js.map +1 -0
  84. package/dist/dev/define/xy.d.ts +2 -0
  85. package/dist/dev/define/xy.js +8 -0
  86. package/dist/dev/define/xy.js.map +1 -0
  87. package/dist/dev/define.d.ts +15 -3
  88. package/dist/dev/define.js +7 -1
  89. package/dist/dev/elements/{key.d.ts → button.d.ts} +8 -6
  90. package/dist/dev/elements/button.js +166 -0
  91. package/dist/dev/elements/button.js.map +1 -0
  92. package/dist/dev/elements/dial.d.ts +6 -4
  93. package/dist/dev/elements/dial.js +16 -22
  94. package/dist/dev/elements/dial.js.map +1 -1
  95. package/dist/dev/elements/envelope.d.ts +36 -0
  96. package/dist/dev/elements/envelope.js +388 -0
  97. package/dist/dev/elements/envelope.js.map +1 -0
  98. package/dist/dev/elements/form-element.d.ts +1 -1
  99. package/dist/dev/elements/form-element.js.map +1 -1
  100. package/dist/dev/elements/meter.d.ts +11 -6
  101. package/dist/dev/elements/meter.js +155 -63
  102. package/dist/dev/elements/meter.js.map +1 -1
  103. package/dist/dev/elements/number.d.ts +7 -3
  104. package/dist/dev/elements/number.js +22 -9
  105. package/dist/dev/elements/number.js.map +1 -1
  106. package/dist/dev/elements/radio-group.d.ts +25 -0
  107. package/dist/dev/elements/radio-group.js +184 -0
  108. package/dist/dev/elements/radio-group.js.map +1 -0
  109. package/dist/dev/elements/readout-claim.js +82 -0
  110. package/dist/dev/elements/readout-claim.js.map +1 -0
  111. package/dist/dev/elements/readout.js +36 -0
  112. package/dist/dev/elements/readout.js.map +1 -0
  113. package/dist/dev/elements/segmented.d.ts +4 -10
  114. package/dist/dev/elements/segmented.js +9 -159
  115. package/dist/dev/elements/segmented.js.map +1 -1
  116. package/dist/dev/elements/slider.d.ts +6 -6
  117. package/dist/dev/elements/slider.js +42 -51
  118. package/dist/dev/elements/slider.js.map +1 -1
  119. package/dist/dev/elements/sonic-element.d.ts +6 -3
  120. package/dist/dev/elements/sonic-element.js +119 -40
  121. package/dist/dev/elements/sonic-element.js.map +1 -1
  122. package/dist/dev/elements/split.d.ts +21 -0
  123. package/dist/dev/elements/split.js +258 -0
  124. package/dist/dev/elements/split.js.map +1 -0
  125. package/dist/dev/elements/switch.d.ts +35 -0
  126. package/dist/dev/elements/switch.js +274 -0
  127. package/dist/dev/elements/switch.js.map +1 -0
  128. package/dist/dev/elements/value-element.d.ts +84 -0
  129. package/dist/dev/elements/value-element.js +695 -0
  130. package/dist/dev/elements/value-element.js.map +1 -0
  131. package/dist/dev/elements/{range-entry.js → value-entry.js} +4 -4
  132. package/dist/dev/elements/value-entry.js.map +1 -0
  133. package/dist/dev/elements/wave-element.d.ts +37 -0
  134. package/dist/dev/elements/wave-element.js +81 -0
  135. package/dist/dev/elements/wave-element.js.map +1 -0
  136. package/dist/dev/elements/waveform.d.ts +55 -0
  137. package/dist/dev/elements/waveform.js +329 -0
  138. package/dist/dev/elements/waveform.js.map +1 -0
  139. package/dist/dev/elements/wavestrip.d.ts +51 -0
  140. package/dist/dev/elements/wavestrip.js +186 -0
  141. package/dist/dev/elements/wavestrip.js.map +1 -0
  142. package/dist/dev/elements/xy.d.ts +62 -0
  143. package/dist/dev/elements/xy.js +488 -0
  144. package/dist/dev/elements/xy.js.map +1 -0
  145. package/dist/dev/index.d.ts +11 -2
  146. package/dist/dev/index.js +10 -2
  147. package/dist/dev/lib/adsr-shape.js +114 -0
  148. package/dist/dev/lib/adsr-shape.js.map +1 -0
  149. package/dist/dev/lib/ballistics.js +56 -0
  150. package/dist/dev/lib/ballistics.js.map +1 -0
  151. package/dist/dev/lib/canvas-surface.d.ts +26 -0
  152. package/dist/dev/lib/canvas-surface.js +204 -0
  153. package/dist/dev/lib/canvas-surface.js.map +1 -0
  154. package/dist/dev/lib/copy-node.js +32 -2
  155. package/dist/dev/lib/copy-node.js.map +1 -1
  156. package/dist/dev/lib/crossfade.d.ts +12 -0
  157. package/dist/dev/lib/crossfade.js +23 -0
  158. package/dist/dev/lib/crossfade.js.map +1 -0
  159. package/dist/dev/lib/distribute.d.ts +4 -0
  160. package/dist/dev/lib/distribute.js +216 -0
  161. package/dist/dev/lib/distribute.js.map +1 -0
  162. package/dist/dev/lib/drag-step.js +100 -0
  163. package/dist/dev/lib/drag-step.js.map +1 -0
  164. package/dist/dev/lib/envelope-curve.d.ts +4 -0
  165. package/dist/dev/lib/envelope-curve.js +10 -0
  166. package/dist/dev/lib/envelope-curve.js.map +1 -0
  167. package/dist/dev/lib/field.d.ts +4 -0
  168. package/dist/dev/lib/field.js +95 -0
  169. package/dist/dev/lib/field.js.map +1 -0
  170. package/dist/dev/lib/focus-by-pointer.js +29 -0
  171. package/dist/dev/lib/focus-by-pointer.js.map +1 -0
  172. package/dist/dev/lib/frame-timeline.js +64 -0
  173. package/dist/dev/lib/frame-timeline.js.map +1 -0
  174. package/dist/dev/lib/hold.js +39 -0
  175. package/dist/dev/lib/hold.js.map +1 -0
  176. package/dist/dev/lib/marker-band.js +81 -0
  177. package/dist/dev/lib/marker-band.js.map +1 -0
  178. package/dist/dev/lib/marker-rider.js +121 -0
  179. package/dist/dev/lib/marker-rider.js.map +1 -0
  180. package/dist/dev/lib/math.js +17 -3
  181. package/dist/dev/lib/math.js.map +1 -1
  182. package/dist/dev/lib/modifier-press.js +12 -0
  183. package/dist/dev/lib/modifier-press.js.map +1 -0
  184. package/dist/dev/lib/number-list.js +6 -6
  185. package/dist/dev/lib/number-list.js.map +1 -1
  186. package/dist/dev/lib/pointer-drag.js +47 -0
  187. package/dist/dev/lib/pointer-drag.js.map +1 -0
  188. package/dist/dev/lib/read-px-property.js.map +1 -1
  189. package/dist/dev/lib/render.js +20 -5
  190. package/dist/dev/lib/render.js.map +1 -1
  191. package/dist/dev/lib/resample-peaks.js +47 -0
  192. package/dist/dev/lib/resample-peaks.js.map +1 -0
  193. package/dist/dev/lib/strip-scene.js +49 -0
  194. package/dist/dev/lib/strip-scene.js.map +1 -0
  195. package/dist/dev/lib/taper.js +23 -17
  196. package/dist/dev/lib/taper.js.map +1 -1
  197. package/dist/dev/lib/time-regions.d.ts +4 -0
  198. package/dist/dev/lib/time-regions.js +9 -0
  199. package/dist/dev/lib/time-regions.js.map +1 -0
  200. package/dist/dev/lib/tracking-clock.js +36 -0
  201. package/dist/dev/lib/tracking-clock.js.map +1 -0
  202. package/dist/dev/lib/value-mapping.d.ts +23 -0
  203. package/dist/dev/lib/value-mapping.js +116 -0
  204. package/dist/dev/lib/value-mapping.js.map +1 -0
  205. package/dist/dev/lib/waveform-buckets.d.ts +9 -0
  206. package/dist/dev/lib/waveform-buckets.js +42 -0
  207. package/dist/dev/lib/waveform-buckets.js.map +1 -0
  208. package/dist/dev/lib/write-attribute.js +1 -0
  209. package/dist/dev/lib/write-attribute.js.map +1 -1
  210. package/dist/skins/amber.css +8 -0
  211. package/dist/skins/flat.css +25 -0
  212. package/dist/skins/ivory.css +2 -2
  213. package/dist/skins/lime.css +2 -0
  214. package/dist/skins/slate.css +2 -0
  215. package/dist/styles/button.css +240 -0
  216. package/dist/styles/controls.css +8 -1
  217. package/dist/styles/dial.css +110 -56
  218. package/dist/styles/envelope.css +204 -0
  219. package/dist/styles/led.css +39 -8
  220. package/dist/styles/material.css +343 -100
  221. package/dist/styles/meter.css +41 -52
  222. package/dist/styles/number.css +5 -1
  223. package/dist/styles/panel.css +61 -0
  224. package/dist/styles/ring.css +74 -0
  225. package/dist/styles/segmented.css +46 -51
  226. package/dist/styles/slider.css +177 -40
  227. package/dist/styles/switch.css +386 -0
  228. package/dist/styles/waveform.css +196 -0
  229. package/dist/styles/wavestrip.css +232 -0
  230. package/dist/styles/xy.css +241 -0
  231. package/package.json +15 -6
  232. package/dist/default/define/key.js +0 -7
  233. package/dist/default/elements/key.js +0 -169
  234. package/dist/default/elements/range-element.js +0 -546
  235. package/dist/default/lib/detent.js +0 -17
  236. package/dist/dev/define/key.d.ts +0 -2
  237. package/dist/dev/define/key.js +0 -8
  238. package/dist/dev/define/key.js.map +0 -1
  239. package/dist/dev/elements/key.js +0 -170
  240. package/dist/dev/elements/key.js.map +0 -1
  241. package/dist/dev/elements/range-element.d.ts +0 -64
  242. package/dist/dev/elements/range-element.js +0 -547
  243. package/dist/dev/elements/range-element.js.map +0 -1
  244. package/dist/dev/elements/range-entry.js.map +0 -1
  245. package/dist/dev/lib/detent.js +0 -18
  246. package/dist/dev/lib/detent.js.map +0 -1
  247. package/dist/styles/key.css +0 -242
@@ -37,20 +37,14 @@
37
37
  .sonic-dial {
38
38
  --_sonic-dial-ring-ratio: var(--sonic-dial-ring-ratio, 0.075);
39
39
  --_sonic-dial-gap-ratio: var(--sonic-dial-gap-ratio, 0.05);
40
- --_sonic-dial-pointer-ratio: var(--sonic-dial-pointer-ratio, 0.06);
41
-
42
- /* 0 for a straight bar */
43
- --_sonic-dial-pointer-taper: var(--sonic-dial-pointer-taper, 0.5);
44
-
45
- /* A fraction of the knob's angle */
40
+ --_sonic-dial-indicator-ratio: var(--sonic-dial-indicator-ratio, 0.06);
41
+ --_sonic-dial-indicator-taper: var(--sonic-dial-indicator-taper, 0.5);
46
42
  --_sonic-dial-face-drift: var(--sonic-dial-face-drift, 0.1);
47
43
  --_sonic-dial-notch-ratio: var(--sonic-dial-notch-ratio, 0.1);
48
44
  --_sonic-dial-scale-ratio: var(--sonic-dial-scale-ratio, 0.2);
49
45
  --_sonic-dial-scale-font-ratio: var(--sonic-dial-scale-font-ratio, 0.175);
50
-
51
- /* Centred on six o'clock */
52
46
  --_sonic-dial-sweep: var(--sonic-dial-sweep, 300deg);
53
- --_sonic-dial-segment: var(--sonic-dial-segment, 30deg);
47
+ --_sonic-dial-dot: var(--sonic-dial-dot, 30deg);
54
48
  --_sonic-dial-ridge-pitch: var(--sonic-dial-ridge-pitch, 4px);
55
49
  --_sonic-dial-travel: var(--sonic-dial-travel, 160px);
56
50
  --_sonic-unit: calc(var(--_sonic-dial-size) / 40);
@@ -85,7 +79,7 @@
85
79
  flex-shrink: 0;
86
80
  inline-size: var(--_sonic-dial-size);
87
81
  block-size: var(--_sonic-dial-size);
88
- touch-action: none;
82
+ touch-action: pan-x;
89
83
  cursor: ns-resize;
90
84
  user-select: none;
91
85
  border-radius: 50%;
@@ -122,7 +116,8 @@
122
116
  .sonic-dial-notches {
123
117
  --_sonic-dial-notch-width: atan2(var(--_sonic-unit), var(--_sonic-dial-size) / 2);
124
118
  --_sonic-dial-notch-pitch: calc(
125
- var(--_sonic-dial-sweep) / (var(--_sonic-dial-positions, 2) - var(--_sonic-dial-notch-ends))
119
+ var(--_sonic-dial-sweep) /
120
+ (var(--_sonic-dial-position-count, 2) - var(--_sonic-dial-notch-ends))
126
121
  );
127
122
 
128
123
  position: absolute;
@@ -150,8 +145,8 @@
150
145
 
151
146
  .sonic-dial-scale {
152
147
  font-size: calc(var(--_sonic-dial-size) * var(--_sonic-dial-scale-font-ratio));
148
+ line-height: 1cap;
153
149
 
154
- /* The near edge hugs the band's inner edge, and each mark grows outward along its angle */
155
150
  & > * {
156
151
  --_sonic-dial-scale-angle: calc(
157
152
  var(--_sonic-dial-start) + var(--_sonic-scale-at, 0) * var(--_sonic-dial-sweep)
@@ -164,8 +159,8 @@
164
159
 
165
160
  inset: calc(50% - var(--_sonic-dial-scale-cos) * var(--_sonic-dial-scale-radius)) auto auto
166
161
  calc(50% + var(--_sonic-dial-scale-sin) * var(--_sonic-dial-scale-radius));
167
- translate: calc(-50% + var(--_sonic-dial-scale-sin) * 50%)
168
- calc(-50% - var(--_sonic-dial-scale-cos) * 50%);
162
+ translate: calc(-50% + var(--_sonic-dial-scale-sin) * (50% + 0.15cap))
163
+ calc(-50% - var(--_sonic-dial-scale-cos) * (50% + 0.15cap));
169
164
  }
170
165
 
171
166
  & > .sonic-scale-tick {
@@ -180,35 +175,25 @@
180
175
  }
181
176
 
182
177
  :is(.sonic-dial-ring, .sonic-dial-modulation) {
178
+ --_sonic-arc-width: var(--_sonic-dial-ring-width);
179
+
183
180
  position: absolute;
184
181
  inset: calc(var(--_sonic-dial-scale-band) + var(--_sonic-dial-notch-band));
185
182
  border-radius: 50%;
186
- mask: radial-gradient(
187
- closest-side,
188
- transparent calc(100% - var(--_sonic-dial-ring-width) - 0.5px),
189
- #000 calc(100% - var(--_sonic-dial-ring-width)),
190
- #000 calc(100% - var(--_sonic-dial-band-inset) - 0.5px),
191
- transparent calc(100% - var(--_sonic-dial-band-inset))
192
- );
183
+ mask: var(--_sonic-arc-mask);
193
184
  }
194
185
 
195
186
  .sonic-dial-ring {
196
- --_sonic-dial-band-inset: 0px;
187
+ --_sonic-arc-inset: 0px;
197
188
  --_sonic-dial-lit-from: calc(
198
189
  min(var(--_sonic-dial-origin, 0), var(--_sonic-dial-value, 0)) * var(--_sonic-dial-sweep)
199
190
  );
200
191
  --_sonic-dial-lit-to: calc(
201
192
  max(var(--_sonic-dial-origin, 0), var(--_sonic-dial-value, 0)) * var(--_sonic-dial-sweep)
202
193
  );
203
- --_sonic-dial-ring-shade: radial-gradient(
204
- closest-side,
205
- rgb(0 0 0 / 55%) calc(100% - var(--_sonic-dial-ring-width)),
206
- transparent calc(100% - var(--_sonic-dial-ring-width) * 0.4),
207
- rgb(0 0 0 / 25%) 100%
208
- );
209
194
 
210
195
  background:
211
- var(--_sonic-dial-ring-shade),
196
+ var(--_sonic-arc-shade),
212
197
  conic-gradient(
213
198
  from var(--_sonic-dial-start),
214
199
  var(--_sonic-unlit) var(--_sonic-dial-lit-from),
@@ -220,11 +205,10 @@
220
205
 
221
206
  [endless] > .sonic-dial > .sonic-dial-ring {
222
207
  background:
223
- var(--_sonic-dial-ring-shade),
208
+ var(--_sonic-arc-shade),
224
209
  conic-gradient(
225
- from
226
- calc(var(--_sonic-dial-start) + var(--_sonic-dial-angle) - var(--_sonic-dial-segment) / 2),
227
- var(--_sonic-dial-lit) var(--_sonic-dial-segment),
210
+ from calc(var(--_sonic-dial-start) + var(--_sonic-dial-angle) - var(--_sonic-dial-dot) / 2),
211
+ var(--_sonic-dial-lit) var(--_sonic-dial-dot),
228
212
  var(--_sonic-unlit) 0
229
213
  );
230
214
  }
@@ -234,7 +218,7 @@
234
218
  --sonic-modulation,
235
219
  color-mix(in oklab, var(--_sonic-dial-lit) 60%, #000)
236
220
  );
237
- --_sonic-dial-band-inset: calc(var(--_sonic-dial-ring-width) * 0.55);
221
+ --_sonic-arc-inset: calc(var(--_sonic-dial-ring-width) * 0.55);
238
222
 
239
223
  background: conic-gradient(
240
224
  from var(--_sonic-dial-start),
@@ -250,6 +234,62 @@
250
234
  display: none;
251
235
  }
252
236
 
237
+ :state(modulated) > .sonic-dial > .sonic-dial-modulation {
238
+ --_sonic-dial-modulation-value-angle: calc(
239
+ var(--_sonic-dial-modulation-value, 0) * var(--_sonic-dial-sweep)
240
+ );
241
+ --_sonic-dial-modulation-range: color-mix(
242
+ in oklab,
243
+ var(--_sonic-dial-modulation) 50%,
244
+ transparent
245
+ );
246
+ --_sonic-dial-modulation-tick: color-mix(
247
+ in oklab,
248
+ var(--sonic-modulation, var(--_sonic-dial-lit)) 55%,
249
+ #fff
250
+ );
251
+
252
+ display: block;
253
+ background: none;
254
+ mask: none;
255
+
256
+ &::before,
257
+ &::after {
258
+ position: absolute;
259
+ inset: 0;
260
+ content: '';
261
+ border-radius: 50%;
262
+ }
263
+
264
+ &::before {
265
+ background:
266
+ conic-gradient(
267
+ from var(--_sonic-dial-start),
268
+ transparent min(var(--_sonic-dial-angle), var(--_sonic-dial-modulation-value-angle)),
269
+ var(--_sonic-dial-modulation) 0
270
+ max(var(--_sonic-dial-angle), var(--_sonic-dial-modulation-value-angle)),
271
+ transparent 0
272
+ ),
273
+ conic-gradient(
274
+ from var(--_sonic-dial-start),
275
+ transparent calc(var(--_sonic-dial-modulation-from, 0) * var(--_sonic-dial-sweep)),
276
+ var(--_sonic-dial-modulation-range) 0
277
+ calc(var(--_sonic-dial-modulation-to, 0) * var(--_sonic-dial-sweep)),
278
+ transparent 0
279
+ );
280
+ mask: var(--_sonic-arc-mask);
281
+ }
282
+
283
+ &::after {
284
+ background: linear-gradient(
285
+ var(--_sonic-dial-modulation-tick),
286
+ var(--_sonic-dial-modulation-tick)
287
+ )
288
+ 50% 0 / var(--_sonic-unit) var(--_sonic-dial-ring-width) no-repeat;
289
+ rotate: calc(var(--_sonic-dial-start) + var(--_sonic-dial-modulation-value-angle));
290
+ }
291
+ }
292
+
253
293
  .sonic-dial-cap {
254
294
  position: absolute;
255
295
  inset: var(--_sonic-dial-cap-inset);
@@ -271,9 +311,10 @@
271
311
  &::before {
272
312
  inset: 0;
273
313
  background: repeating-conic-gradient(
274
- rgb(0 0 0 / 30%) 0,
275
- rgb(255 255 255 / 12%) calc(var(--_sonic-dial-ridge-angle) / 2),
276
- rgb(0 0 0 / 30%) var(--_sonic-dial-ridge-angle)
314
+ rgb(0 0 0 / calc(0.3 * var(--_sonic-relief))) 0,
315
+ rgb(255 255 255 / calc(0.12 * var(--_sonic-relief)))
316
+ calc(var(--_sonic-dial-ridge-angle) / 2),
317
+ rgb(0 0 0 / calc(0.3 * var(--_sonic-relief))) var(--_sonic-dial-ridge-angle)
277
318
  );
278
319
  rotate: var(--_sonic-dial-angle);
279
320
  }
@@ -286,22 +327,22 @@
286
327
  calc(
287
328
  var(--_sonic-dial-face-drift) * var(--_sonic-dial-angle) - var(--_sonic-light-tilt)
288
329
  ),
289
- rgb(255 255 255 / 16%),
330
+ rgb(255 255 255 / calc(0.16 * var(--_sonic-relief))),
290
331
  transparent 12%,
291
- rgb(0 0 0 / 10%) 25%,
332
+ rgb(0 0 0 / calc(0.1 * var(--_sonic-relief))) 25%,
292
333
  transparent 38%,
293
- rgb(255 255 255 / 12%) 50%,
334
+ rgb(255 255 255 / calc(0.12 * var(--_sonic-relief))) 50%,
294
335
  transparent 62%,
295
- rgb(0 0 0 / 10%) 75%,
336
+ rgb(0 0 0 / calc(0.1 * var(--_sonic-relief))) 75%,
296
337
  transparent 88%,
297
- rgb(255 255 255 / 16%)
338
+ rgb(255 255 255 / calc(0.16 * var(--_sonic-relief)))
298
339
  ),
299
340
  var(--_sonic-face);
300
341
  box-shadow: var(--_sonic-face-shadow);
301
342
  }
302
343
  }
303
344
 
304
- .sonic-dial-pointer {
345
+ .sonic-dial-indicator {
305
346
  position: absolute;
306
347
  inset: var(--_sonic-dial-cap-inset);
307
348
  pointer-events: none;
@@ -309,50 +350,63 @@
309
350
  rotate: calc(var(--_sonic-dial-start) + var(--_sonic-dial-angle));
310
351
 
311
352
  &::before {
312
- --_sonic-dial-pointer-width: calc(var(--_sonic-dial-size) * var(--_sonic-dial-pointer-ratio));
353
+ --_sonic-dial-indicator-width: calc(
354
+ var(--_sonic-dial-size) * var(--_sonic-dial-indicator-ratio)
355
+ );
356
+ --_sonic-dial-indicator-tip: calc(
357
+ var(--_sonic-dial-indicator-width) * (1 - var(--_sonic-dial-indicator-taper)) / 2
358
+ );
313
359
 
314
360
  position: absolute;
315
361
  inset-block-start: 6%;
316
362
  inset-inline-start: 50%;
317
- inline-size: var(--_sonic-dial-pointer-width);
363
+ inline-size: var(--_sonic-dial-indicator-width);
318
364
  block-size: 34%;
319
365
  content: '';
320
366
  background: var(--_sonic-ink);
321
- border-radius: calc(var(--_sonic-dial-pointer-width) / 2);
322
- box-shadow: inset 0 0 calc(0.75 * var(--_sonic-unit)) rgb(0 0 0 / 55%);
323
- clip-path: polygon(
324
- calc(50% * var(--_sonic-dial-pointer-taper)) 0,
325
- calc(100% - 50% * var(--_sonic-dial-pointer-taper)) 0,
326
- 100% 100%,
327
- 0 100%
367
+ border-radius: calc(var(--_sonic-dial-indicator-width) / 2);
368
+ box-shadow: inset 0 0 calc(0.75 * var(--_sonic-unit))
369
+ rgb(0 0 0 / calc(0.55 * var(--_sonic-relief)));
370
+ clip-path: shape(
371
+ from 0 100%,
372
+ line to calc(50% - var(--_sonic-dial-indicator-tip)) var(--_sonic-dial-indicator-tip),
373
+ arc to calc(50% + var(--_sonic-dial-indicator-tip)) var(--_sonic-dial-indicator-tip) of
374
+ var(--_sonic-dial-indicator-tip) cw,
375
+ line to 100% 100%,
376
+ close
328
377
  );
329
378
  translate: -50% 0;
330
379
  }
331
380
  }
332
381
 
333
- :disabled > .sonic-dial > .sonic-dial-pointer::before {
382
+ :disabled > .sonic-dial > .sonic-dial-indicator::before {
334
383
  background: var(--_sonic-etch);
335
384
  }
336
385
 
337
386
  @media (forced-colors: active) {
338
- :is(.sonic-dial-notches, .sonic-dial-ring, .sonic-dial-modulation, .sonic-dial-pointer) {
387
+ :is(.sonic-dial-notches, .sonic-dial-ring, .sonic-dial-modulation, .sonic-dial-indicator) {
339
388
  forced-color-adjust: none;
340
389
  }
341
390
 
342
391
  .sonic-dial-ring {
343
- --_sonic-dial-ring-shade: none;
392
+ --_sonic-arc-shade: none;
344
393
  }
345
394
 
346
395
  .sonic-dial-modulation {
347
396
  --_sonic-dial-modulation: CanvasText;
348
397
  }
349
398
 
399
+ :state(modulated) > .sonic-dial > .sonic-dial-modulation {
400
+ --_sonic-dial-modulation-range: GrayText;
401
+ --_sonic-dial-modulation-tick: CanvasText;
402
+ }
403
+
350
404
  .sonic-dial-cap::before,
351
405
  .sonic-dial-cap::after {
352
406
  display: none;
353
407
  }
354
408
 
355
- .sonic-dial-pointer::before {
409
+ .sonic-dial-indicator::before {
356
410
  box-shadow: none;
357
411
  }
358
412
  }
@@ -0,0 +1,204 @@
1
+ @property --_sonic-envelope-size {
2
+ syntax: '<length>';
3
+ inherits: true;
4
+ initial-value: 80px;
5
+ }
6
+
7
+ @layer sonic {
8
+ :is(sonic-envelope, .sonic-envelope) {
9
+ --_sonic-envelope-size: var(--sonic-envelope-size, 5rem);
10
+ --_sonic-envelope-aspect-ratio: var(--sonic-envelope-aspect-ratio, 3);
11
+ }
12
+
13
+ :has(> .sonic-envelope):not([hidden]) {
14
+ display: contents;
15
+ }
16
+
17
+ sonic-envelope:not(:defined, [hidden]) {
18
+ display: block;
19
+ flex-shrink: 0;
20
+ inline-size: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-aspect-ratio));
21
+ block-size: var(--_sonic-envelope-size);
22
+ }
23
+
24
+ .sonic-envelope {
25
+ --_sonic-envelope-radius-ratio: var(--sonic-envelope-radius-ratio, 0.08);
26
+ --_sonic-envelope-inset-ratio: var(--sonic-envelope-inset-ratio, 0.1);
27
+ --_sonic-envelope-handle-ratio: var(--sonic-envelope-handle-ratio, 0.14);
28
+ --_sonic-envelope-handle-stroke-ratio: var(--sonic-envelope-handle-stroke-ratio, 0.025);
29
+ --_sonic-envelope-line-ratio: var(--sonic-envelope-line-ratio, 0.03);
30
+ --_sonic-envelope-curve-ratio: var(--sonic-envelope-curve-ratio, 0.08);
31
+ --_sonic-unit: calc(var(--_sonic-envelope-size) / 64);
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));
34
+
35
+ inline-size: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-aspect-ratio));
36
+ block-size: var(--_sonic-envelope-size);
37
+ container-type: size;
38
+ border-radius: var(--_sonic-glass-radius);
39
+ isolation: isolate;
40
+ }
41
+
42
+ .sonic-envelope-graph {
43
+ position: absolute;
44
+ inset: var(--_sonic-envelope-inset);
45
+ z-index: 1;
46
+ inline-size: calc(100% - 2 * var(--_sonic-envelope-inset));
47
+ block-size: calc(100% - 2 * var(--_sonic-envelope-inset));
48
+ overflow: visible;
49
+ pointer-events: none;
50
+ clip-path: inset(calc(-1 * var(--_sonic-envelope-inset)));
51
+ }
52
+
53
+ .sonic-envelope-fill {
54
+ fill: color-mix(in oklab, var(--_sonic-lit) 18%, transparent);
55
+ }
56
+
57
+ .sonic-envelope-floor {
58
+ height: calc(
59
+ 1px * var(--_sonic-envelope-inset-ratio) / (1 - 2 * var(--_sonic-envelope-inset-ratio))
60
+ );
61
+ }
62
+
63
+ .sonic-envelope-line {
64
+ fill: none;
65
+ stroke: var(--_sonic-lit);
66
+ stroke-width: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-line-ratio));
67
+ stroke-linecap: round;
68
+ stroke-linejoin: round;
69
+ vector-effect: non-scaling-stroke;
70
+ }
71
+
72
+ :is(.sonic-envelope-handle, .sonic-envelope-curve) {
73
+ --_sonic-point-ring: var(--_sonic-lit);
74
+ --_sonic-point-core: var(--_sonic-lit);
75
+ --_sonic-point-lift: color-mix(in oklab, var(--_sonic-lit) 85%, #fff);
76
+ --_sonic-point-edge: max(1px, var(--_sonic-point-stroke, 0px));
77
+ --_sonic-point-halo: transparent;
78
+ --_sonic-point-bracket: transparent;
79
+ --_sonic-point-bracket-scale: 0.6;
80
+
81
+ position: absolute;
82
+ inset: auto auto
83
+ calc(
84
+ var(--_sonic-envelope-inset) + var(--_sonic-envelope-y, 0) *
85
+ (100cqb - 2 * var(--_sonic-envelope-inset)) - var(--_sonic-point-size) / 2
86
+ )
87
+ calc(
88
+ var(--_sonic-envelope-inset) + var(--_sonic-envelope-x, 0) *
89
+ (100cqi - 2 * var(--_sonic-envelope-inset)) - var(--_sonic-point-size) / 2
90
+ );
91
+ z-index: 1;
92
+ box-sizing: border-box;
93
+ inline-size: var(--_sonic-point-size);
94
+ block-size: var(--_sonic-point-size);
95
+ touch-action: none;
96
+ background: var(--_sonic-point-core);
97
+ border: var(--_sonic-point-edge) solid var(--_sonic-point-ring);
98
+ border-radius: 50%;
99
+ box-shadow:
100
+ 0 0 calc(0.5 * var(--_sonic-point-size)) calc(0.05 * var(--_sonic-point-size))
101
+ var(--_sonic-point-halo),
102
+ var(--_sonic-focus-shadow, 0 0 transparent);
103
+ transition:
104
+ background-color 120ms ease-out,
105
+ border-color 120ms ease-out,
106
+ box-shadow 120ms ease-out;
107
+
108
+ &::after {
109
+ position: absolute;
110
+ inset: calc(-0.4 * var(--_sonic-point-size) - 2 * var(--_sonic-point-edge));
111
+ pointer-events: none;
112
+ content: '';
113
+ border: var(--_sonic-point-edge) solid var(--_sonic-point-bracket);
114
+ border-block-start-color: transparent;
115
+ border-radius: 50%;
116
+ rotate: 45deg;
117
+ scale: var(--_sonic-point-bracket-scale);
118
+ transition:
119
+ border-color 120ms ease-out,
120
+ scale 120ms ease-out;
121
+ }
122
+ }
123
+
124
+ .sonic-envelope-handle {
125
+ --_sonic-point-size: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-handle-ratio));
126
+ --_sonic-point-stroke: calc(
127
+ var(--_sonic-envelope-size) * var(--_sonic-envelope-handle-stroke-ratio)
128
+ );
129
+
130
+ cursor: grab;
131
+ }
132
+
133
+ .sonic-envelope-curve {
134
+ --_sonic-point-size: calc(var(--_sonic-envelope-size) * var(--_sonic-envelope-curve-ratio));
135
+ --_sonic-point-core: var(--_sonic-point-ring);
136
+
137
+ cursor: ns-resize;
138
+ }
139
+
140
+ .sonic-envelope-handle[data-sonic-axes='x'] {
141
+ cursor: ew-resize;
142
+ }
143
+
144
+ .sonic-envelope-handle[data-sonic-axes='y'] {
145
+ cursor: ns-resize;
146
+ }
147
+
148
+ :is(.sonic-envelope-curve, .sonic-envelope-handle)[data-sonic-disabled] {
149
+ --_sonic-point-ring: var(--_sonic-unlit);
150
+ --_sonic-point-core: var(--_sonic-glass);
151
+
152
+ cursor: default;
153
+ }
154
+
155
+ @media (hover: hover) {
156
+ :is(.sonic-envelope-curve, .sonic-envelope-handle):not([data-sonic-disabled]):hover {
157
+ --_sonic-point-ring: var(--_sonic-point-lift);
158
+ --_sonic-point-core: var(--_sonic-point-lift);
159
+ }
160
+ }
161
+
162
+ :is(.sonic-envelope-curve, .sonic-envelope-handle):not([data-sonic-disabled]):active {
163
+ --_sonic-point-ring: var(--_sonic-lit);
164
+ --_sonic-point-core: var(--_sonic-glass);
165
+ --_sonic-point-halo: color-mix(
166
+ in oklab,
167
+ var(--_sonic-lit) calc(50% * var(--_sonic-relief)),
168
+ transparent
169
+ );
170
+ --_sonic-point-bracket: color-mix(
171
+ in oklab,
172
+ var(--_sonic-lit) calc(100% * (1 - var(--_sonic-relief))),
173
+ transparent
174
+ );
175
+ --_sonic-point-bracket-scale: 1;
176
+ }
177
+
178
+ @media (forced-colors: active) {
179
+ .sonic-envelope {
180
+ --_sonic-lit: Highlight;
181
+ --_sonic-unlit: GrayText;
182
+ --_sonic-glass: Canvas;
183
+ }
184
+
185
+ .sonic-envelope-graph {
186
+ forced-color-adjust: none;
187
+ }
188
+
189
+ :is(.sonic-envelope-curve, .sonic-envelope-handle) {
190
+ --_sonic-point-ring: CanvasText;
191
+ --_sonic-point-lift: Highlight;
192
+
193
+ forced-color-adjust: none;
194
+ }
195
+
196
+ .sonic-envelope-handle {
197
+ --_sonic-point-core: Canvas;
198
+ }
199
+
200
+ .sonic-envelope-fill {
201
+ fill: none;
202
+ }
203
+ }
204
+ }
@@ -10,7 +10,7 @@
10
10
  --_sonic-led-lens-ratio: var(--sonic-led-lens-ratio, 0.625);
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-bezel: var(--sonic-bezel, color-mix(in oklab, var(--_sonic-unlit) 55%, #000));
14
14
 
15
15
  position: relative;
16
16
  display: inline-block;
@@ -30,6 +30,8 @@
30
30
 
31
31
  @media (forced-colors: active) {
32
32
  --_sonic-lit-alt: Mark;
33
+ --_sonic-hot: Highlight;
34
+ --_sonic-clip: Mark;
33
35
 
34
36
  forced-color-adjust: none;
35
37
  background: none;
@@ -45,19 +47,47 @@
45
47
  --_sonic-lit: var(--_sonic-lit-alt);
46
48
  }
47
49
 
50
+ .sonic-led[data-sonic-lit='hot'] {
51
+ --_sonic-lit: var(--_sonic-hot);
52
+ }
53
+
54
+ .sonic-led[data-sonic-lit='clip'] {
55
+ --_sonic-lit: var(--_sonic-clip);
56
+ }
57
+
58
+ /* Before the lit rule, which a latched button's LED also matches */
48
59
  .sonic-led:is(
49
- [data-sonic-lit],
60
+ [data-sonic-lit='dim'],
61
+ :where(:is([armed], [busy]) > .sonic-button:not(:disabled, [aria-disabled='true'])) *
62
+ ) {
63
+ &::after {
64
+ background:
65
+ var(--_sonic-lens-glint),
66
+ color-mix(in oklab, var(--_sonic-lit) 35%, var(--_sonic-lens-glass));
67
+ }
68
+
69
+ @media (forced-colors: active) {
70
+ &::after {
71
+ background: GrayText;
72
+ box-shadow: 0 0 0 1px var(--_sonic-lit);
73
+ }
74
+ }
75
+ }
76
+
77
+ .sonic-led:is(
78
+ [data-sonic-lit]:where(:not([data-sonic-lit='dim'])),
50
79
  :where(
51
- .sonic-key[aria-pressed='true'],
52
- [momentary]:state(pressed) > .sonic-key,
53
- .sonic-segmented-segment[aria-checked='true']
80
+ .sonic-button[aria-pressed='true'],
81
+ [momentary]:state(pressed) > .sonic-button,
82
+ .sonic-segmented-option[aria-checked='true']
54
83
  )
55
- *
84
+ *,
85
+ :where(:state(at-origin):not(:disabled) > .sonic-led)
56
86
  ) {
57
87
  background:
58
88
  radial-gradient(
59
89
  closest-side,
60
- color-mix(in oklab, var(--_sonic-lit) 60%, transparent)
90
+ color-mix(in oklab, var(--_sonic-lit) calc(60% * var(--_sonic-relief)), transparent)
61
91
  calc(var(--_sonic-led-lens-ratio) * 100%),
62
92
  transparent
63
93
  ),
@@ -66,7 +96,7 @@
66
96
  &::after {
67
97
  background: radial-gradient(
68
98
  closest-side,
69
- color-mix(in oklab, var(--_sonic-lit) 55%, #fff),
99
+ color-mix(in oklab, var(--_sonic-lit) calc(100% - 45% * var(--_sonic-relief)), #fff),
70
100
  var(--_sonic-lit)
71
101
  );
72
102
  }
@@ -76,6 +106,7 @@
76
106
 
77
107
  &::after {
78
108
  background: var(--_sonic-lit);
109
+ box-shadow: 0 0 0 1px CanvasText;
79
110
  }
80
111
  }
81
112
  }