@xsynaptic/sonic-ui 0.5.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 (118) 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 +3 -3
  6. package/dist/default/elements/envelope.js +32 -16
  7. package/dist/default/elements/meter.js +11 -7
  8. package/dist/default/elements/number.js +1 -1
  9. package/dist/default/elements/radio-group.js +43 -45
  10. package/dist/default/elements/readout.js +1 -1
  11. package/dist/default/elements/sonic-element.js +56 -29
  12. package/dist/default/elements/switch.js +32 -38
  13. package/dist/default/elements/value-element.js +111 -108
  14. package/dist/default/elements/wave-element.js +5 -2
  15. package/dist/default/elements/waveform.js +35 -12
  16. package/dist/default/elements/wavestrip.js +18 -15
  17. package/dist/default/elements/xy.js +32 -18
  18. package/dist/default/index.js +2 -2
  19. package/dist/default/lib/adsr-shape.js +5 -0
  20. package/dist/default/lib/ballistics.js +2 -2
  21. package/dist/default/lib/canvas-surface.js +13 -2
  22. package/dist/default/lib/distribute.js +1 -1
  23. package/dist/default/lib/drag-step.js +4 -4
  24. package/dist/default/lib/frame-timeline.js +2 -1
  25. package/dist/default/lib/marker-band.js +54 -10
  26. package/dist/default/lib/marker-rider.js +10 -4
  27. package/dist/default/lib/math.js +6 -1
  28. package/dist/default/lib/pointer-drag.js +8 -5
  29. package/dist/default/lib/resample-peaks.js +11 -1
  30. package/dist/default/lib/write-attribute.js +1 -0
  31. package/dist/dev/dat.d.ts +2 -2
  32. package/dist/dev/dat.js +5 -4
  33. package/dist/dev/dat.js.map +1 -1
  34. package/dist/dev/define/button.js +1 -1
  35. package/dist/dev/define.d.ts +4 -4
  36. package/dist/dev/define.js +2 -2
  37. package/dist/dev/elements/button.js +3 -3
  38. package/dist/dev/elements/button.js.map +1 -1
  39. package/dist/dev/elements/dial.d.ts +1 -1
  40. package/dist/dev/elements/dial.js.map +1 -1
  41. package/dist/dev/elements/envelope.js +32 -16
  42. package/dist/dev/elements/envelope.js.map +1 -1
  43. package/dist/dev/elements/meter.d.ts +1 -1
  44. package/dist/dev/elements/meter.js +11 -7
  45. package/dist/dev/elements/meter.js.map +1 -1
  46. package/dist/dev/elements/number.js +1 -1
  47. package/dist/dev/elements/number.js.map +1 -1
  48. package/dist/dev/elements/radio-group.js +43 -45
  49. package/dist/dev/elements/radio-group.js.map +1 -1
  50. package/dist/dev/elements/readout.js +1 -1
  51. package/dist/dev/elements/readout.js.map +1 -1
  52. package/dist/dev/elements/slider.d.ts +1 -1
  53. package/dist/dev/elements/slider.js.map +1 -1
  54. package/dist/dev/elements/sonic-element.d.ts +4 -2
  55. package/dist/dev/elements/sonic-element.js +79 -29
  56. package/dist/dev/elements/sonic-element.js.map +1 -1
  57. package/dist/dev/elements/switch.js +32 -38
  58. package/dist/dev/elements/switch.js.map +1 -1
  59. package/dist/dev/elements/value-element.d.ts +3 -3
  60. package/dist/dev/elements/value-element.js +111 -108
  61. package/dist/dev/elements/value-element.js.map +1 -1
  62. package/dist/dev/elements/wave-element.d.ts +1 -0
  63. package/dist/dev/elements/wave-element.js +5 -2
  64. package/dist/dev/elements/wave-element.js.map +1 -1
  65. package/dist/dev/elements/waveform.d.ts +1 -1
  66. package/dist/dev/elements/waveform.js +35 -12
  67. package/dist/dev/elements/waveform.js.map +1 -1
  68. package/dist/dev/elements/wavestrip.js +18 -15
  69. package/dist/dev/elements/wavestrip.js.map +1 -1
  70. package/dist/dev/elements/xy.d.ts +3 -3
  71. package/dist/dev/elements/xy.js +32 -18
  72. package/dist/dev/elements/xy.js.map +1 -1
  73. package/dist/dev/index.d.ts +2 -2
  74. package/dist/dev/index.js +2 -2
  75. package/dist/dev/lib/adsr-shape.js +5 -0
  76. package/dist/dev/lib/adsr-shape.js.map +1 -1
  77. package/dist/dev/lib/ballistics.js +2 -2
  78. package/dist/dev/lib/ballistics.js.map +1 -1
  79. package/dist/dev/lib/canvas-surface.d.ts +1 -0
  80. package/dist/dev/lib/canvas-surface.js +13 -2
  81. package/dist/dev/lib/canvas-surface.js.map +1 -1
  82. package/dist/dev/lib/distribute.js +1 -1
  83. package/dist/dev/lib/distribute.js.map +1 -1
  84. package/dist/dev/lib/drag-step.js +4 -4
  85. package/dist/dev/lib/drag-step.js.map +1 -1
  86. package/dist/dev/lib/frame-timeline.js +2 -1
  87. package/dist/dev/lib/frame-timeline.js.map +1 -1
  88. package/dist/dev/lib/marker-band.js +54 -10
  89. package/dist/dev/lib/marker-band.js.map +1 -1
  90. package/dist/dev/lib/marker-rider.js +10 -4
  91. package/dist/dev/lib/marker-rider.js.map +1 -1
  92. package/dist/dev/lib/math.js +6 -1
  93. package/dist/dev/lib/math.js.map +1 -1
  94. package/dist/dev/lib/pointer-drag.js +8 -5
  95. package/dist/dev/lib/pointer-drag.js.map +1 -1
  96. package/dist/dev/lib/resample-peaks.js +11 -1
  97. package/dist/dev/lib/resample-peaks.js.map +1 -1
  98. package/dist/dev/lib/write-attribute.js +1 -0
  99. package/dist/dev/lib/write-attribute.js.map +1 -1
  100. package/dist/skins/amber.css +8 -0
  101. package/dist/skins/flat.css +25 -0
  102. package/dist/skins/ivory.css +1 -0
  103. package/dist/skins/lime.css +2 -0
  104. package/dist/skins/slate.css +2 -0
  105. package/dist/styles/button.css +38 -10
  106. package/dist/styles/dial.css +24 -16
  107. package/dist/styles/envelope.css +56 -11
  108. package/dist/styles/led.css +3 -3
  109. package/dist/styles/material.css +83 -41
  110. package/dist/styles/meter.css +8 -4
  111. package/dist/styles/panel.css +5 -3
  112. package/dist/styles/segmented.css +27 -5
  113. package/dist/styles/slider.css +2 -1
  114. package/dist/styles/switch.css +59 -20
  115. package/dist/styles/waveform.css +28 -5
  116. package/dist/styles/wavestrip.css +23 -6
  117. package/dist/styles/xy.css +61 -24
  118. package/package.json +2 -5
@@ -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
 
@@ -34,8 +34,17 @@
34
34
  --_sonic-switch-along-x: 0;
35
35
  --_sonic-switch-along-y: 1;
36
36
  --_sonic-switch-pan: pan-x;
37
- --_sonic-switch-metal: color-mix(in oklab, var(--_sonic-cap) 45%, #fff);
38
- --_sonic-switch-metal-shade: color-mix(in oklab, var(--_sonic-cap) 80%, #000);
37
+ --_sonic-switch-cap: var(--sonic-cap, var(--_sonic-ink));
38
+ --_sonic-switch-metal: color-mix(
39
+ in oklab,
40
+ var(--_sonic-switch-cap) calc(100% - 55% * var(--_sonic-relief)),
41
+ #fff
42
+ );
43
+ --_sonic-switch-metal-shade: color-mix(
44
+ in oklab,
45
+ var(--_sonic-switch-cap) calc(100% - 20% * var(--_sonic-relief)),
46
+ #000
47
+ );
39
48
 
40
49
  display: inline-grid;
41
50
  flex-shrink: 0;
@@ -56,6 +65,7 @@
56
65
  }
57
66
 
58
67
  .sonic-switch-position {
68
+ position: relative;
59
69
  display: grid;
60
70
  place-items: center;
61
71
  place-self: stretch;
@@ -84,6 +94,17 @@
84
94
  }
85
95
  }
86
96
 
97
+ .sonic-switch[data-sonic-position-count] > .sonic-switch-position::after {
98
+ inset-block: 0;
99
+ }
100
+
101
+ [orientation='horizontal']
102
+ > .sonic-switch[data-sonic-position-count]
103
+ > .sonic-switch-position::after {
104
+ inset-block: var(--_sonic-target-outset);
105
+ inset-inline: 0;
106
+ }
107
+
87
108
  .sonic-switch-label {
88
109
  padding: calc(var(--_sonic-switch-size) * 0.12);
89
110
  white-space: nowrap;
@@ -200,20 +221,34 @@
200
221
  }
201
222
 
202
223
  .sonic-switch-bushing {
224
+ --_sonic-switch-bushing-shade: color-mix(
225
+ in oklab,
226
+ var(--_sonic-cap) calc(100% - 20% * var(--_sonic-relief)),
227
+ #000
228
+ );
229
+
203
230
  inline-size: calc(var(--_sonic-switch-size) * var(--_sonic-switch-bushing-ratio));
204
231
  aspect-ratio: 1;
205
232
  pointer-events: none;
206
233
  background: radial-gradient(
207
234
  closest-side,
208
- color-mix(in oklab, var(--_sonic-cap) 30%, #000) 0 42%,
209
- var(--_sonic-switch-metal-shade) 48%,
235
+ color-mix(in oklab, var(--_sonic-cap) calc(100% - 70% * var(--_sonic-relief)), #000) 0 42%,
236
+ var(--_sonic-switch-bushing-shade) 48%,
210
237
  var(--_sonic-cap) 70%,
211
- color-mix(in oklab, var(--_sonic-cap) 75%, #fff) 88%,
212
- var(--_sonic-switch-metal-shade)
238
+ color-mix(in oklab, var(--_sonic-cap) calc(100% - 25% * var(--_sonic-relief)), #fff) 88%,
239
+ var(--_sonic-switch-bushing-shade)
213
240
  );
214
241
  border-radius: 50%;
215
242
  box-shadow:
216
- var(--_sonic-rim),
243
+ 0 0 0 max(1px, 0.75 * var(--_sonic-unit))
244
+ var(
245
+ --sonic-cap-edge,
246
+ color-mix(
247
+ in oklab,
248
+ var(--_sonic-switch-cap) calc(100% - 60% * var(--_sonic-relief)),
249
+ #000
250
+ )
251
+ ),
217
252
  calc(1.5 * var(--_sonic-cast-x)) calc(1.5 * var(--_sonic-cast-y)) calc(2 * var(--_sonic-unit))
218
253
  var(--_sonic-drop-shade);
219
254
  }
@@ -226,27 +261,27 @@
226
261
  background-position 90ms cubic-bezier(0.4, 0, 0.2, 1);
227
262
  --_sonic-switch-sheen: linear-gradient(
228
263
  var(--_sonic-light-fall),
229
- color-mix(in oklab, var(--_sonic-switch-metal) 55%, #fff) 12%,
264
+ color-mix(in oklab, var(--_sonic-switch-metal) calc(100% - 45% * var(--_sonic-relief)), #fff)
265
+ 12%,
230
266
  var(--_sonic-switch-metal) 45%,
231
267
  var(--_sonic-switch-metal-shade) 88%
232
268
  );
233
- --_sonic-switch-outline: max(0.5px, 0.4 * var(--_sonic-unit));
234
- --_sonic-switch-rim: color-mix(in oklab, var(--_sonic-cap) 70%, #000);
269
+ --_sonic-switch-outline: max(1px, 0.4 * var(--_sonic-unit));
270
+ --_sonic-switch-rim: var(
271
+ --sonic-cap-edge,
272
+ color-mix(in oklab, var(--_sonic-switch-cap) calc(100% - 30% * var(--_sonic-relief)), #000)
273
+ );
235
274
 
236
275
  position: relative;
237
276
  z-index: 1;
238
277
  inline-size: var(--_sonic-switch-size);
239
278
  block-size: var(--_sonic-switch-size);
240
279
  pointer-events: none;
241
- filter: drop-shadow(var(--_sonic-switch-outline) 0 0 var(--_sonic-switch-rim))
242
- drop-shadow(calc(-1 * var(--_sonic-switch-outline)) 0 0 var(--_sonic-switch-rim))
243
- drop-shadow(0 var(--_sonic-switch-outline) 0 var(--_sonic-switch-rim))
244
- drop-shadow(0 calc(-1 * var(--_sonic-switch-outline)) 0 var(--_sonic-switch-rim))
245
- drop-shadow(
246
- calc((1 + var(--_sonic-switch-lean)) * var(--_sonic-cast-x))
247
- calc((1 + var(--_sonic-switch-lean)) * var(--_sonic-cast-y))
248
- calc(1.5 * var(--_sonic-unit)) var(--_sonic-drop-shade)
249
- );
280
+ filter: drop-shadow(
281
+ calc((1 + var(--_sonic-switch-lean)) * var(--_sonic-cast-x))
282
+ calc((1 + var(--_sonic-switch-lean)) * var(--_sonic-cast-y)) calc(1.5 * var(--_sonic-unit))
283
+ var(--_sonic-drop-shade)
284
+ );
250
285
 
251
286
  @media (prefers-reduced-motion: reduce) {
252
287
  --_sonic-switch-transition: none;
@@ -261,6 +296,7 @@
261
296
  background: var(--_sonic-switch-sheen);
262
297
  background-size: var(--_sonic-switch-size) var(--_sonic-switch-size);
263
298
  border-radius: 999px;
299
+ box-shadow: 0 0 0 var(--_sonic-switch-outline) var(--_sonic-switch-rim);
264
300
  transition: var(--_sonic-switch-transition);
265
301
  }
266
302
 
@@ -292,7 +328,9 @@
292
328
  background-position: calc((var(--_sonic-switch-ball) - var(--_sonic-switch-size)) / 2)
293
329
  calc((var(--_sonic-switch-ball) - var(--_sonic-switch-size)) / 2);
294
330
  box-shadow:
295
- inset 0 0 calc(1.5 * var(--_sonic-unit)) calc(0.4 * var(--_sonic-unit)) rgb(0 0 0 / 30%),
331
+ inset 0 0 calc(1.5 * var(--_sonic-unit)) calc(0.4 * var(--_sonic-unit))
332
+ rgb(0 0 0 / calc(0.3 * var(--_sonic-relief))),
333
+ 0 0 0 var(--_sonic-switch-outline) var(--_sonic-switch-rim),
296
334
  var(--_sonic-focus-shadow);
297
335
  translate: calc(
298
336
  var(--_sonic-switch-along-x) * var(--_sonic-switch-at, 0) * var(--_sonic-switch-reach)
@@ -306,6 +344,7 @@
306
344
  }
307
345
 
308
346
  .sonic-switch:has(> .sonic-switch-position:disabled) {
347
+ --_sonic-switch-cap: var(--sonic-cap, var(--_sonic-etch));
309
348
  --_sonic-switch-metal: var(--_sonic-etch);
310
349
  --_sonic-switch-metal-shade: var(--_sonic-etch);
311
350
  }
@@ -65,12 +65,17 @@
65
65
  }
66
66
 
67
67
  .sonic-waveform {
68
- --_sonic-waveform-inset: calc(var(--_sonic-waveform-size) * 0.06);
68
+ --_sonic-waveform-inset: calc(
69
+ var(--_sonic-waveform-size) * var(--sonic-waveform-inset-ratio, 0.06)
70
+ );
69
71
  --_sonic-unit: calc(var(--_sonic-waveform-size) / 48);
70
72
  --_sonic-waveform-line: max(1px, var(--_sonic-unit));
71
73
  --_sonic-waveform-lit: var(--_sonic-lit);
72
74
  --_sonic-waveform-wave: var(--_sonic-waveform-lit);
73
- --_sonic-waveform-wave-edge: color-mix(in oklab, var(--_sonic-waveform-lit) 45%, #000);
75
+ --_sonic-waveform-wave-edge: var(
76
+ --sonic-waveform-edge,
77
+ color-mix(in oklab, var(--_sonic-waveform-lit) 45%, #000)
78
+ );
74
79
  --_sonic-waveform-grid: var(--_sonic-etch);
75
80
  --_sonic-waveform-hatch: var(--_sonic-etch);
76
81
  --_sonic-waveform-marker: var(--sonic-marker, var(--_sonic-ink));
@@ -87,7 +92,12 @@
87
92
  overflow: hidden;
88
93
  touch-action: pan-y;
89
94
  cursor: grab;
90
- border-radius: calc(var(--_sonic-waveform-size) * 0.08);
95
+
96
+ --_sonic-glass-radius: calc(
97
+ var(--_sonic-waveform-size) * var(--sonic-waveform-radius-ratio, 0.08)
98
+ );
99
+
100
+ border-radius: var(--_sonic-glass-radius);
91
101
  box-shadow: var(--_sonic-focus-shadow);
92
102
  }
93
103
 
@@ -134,13 +144,18 @@
134
144
  inset-inline-start: var(--_sonic-waveform-inset);
135
145
  font-size: calc(var(--_sonic-waveform-size) * var(--sonic-waveform-label-font-ratio, 0.13));
136
146
  line-height: 1;
137
- color: var(--_sonic-waveform-marker);
147
+ color: var(--_sonic-marker, var(--_sonic-waveform-marker));
138
148
  white-space: nowrap;
149
+ text-shadow: var(--sonic-waveform-label-shadow, none);
139
150
  pointer-events: none;
140
151
  }
141
152
 
142
153
  .sonic-waveform-label[data-sonic-dimmed] {
143
- color: color-mix(in oklab, var(--_sonic-waveform-marker) 50%, transparent);
154
+ color: color-mix(
155
+ in oklab,
156
+ var(--_sonic-marker, var(--_sonic-waveform-marker)) 50%,
157
+ transparent
158
+ );
144
159
  }
145
160
 
146
161
  /* Opaque, since a system highlight carries alpha that would blend the wave into the glass */
@@ -162,6 +177,14 @@
162
177
  forced-color-adjust: none;
163
178
  }
164
179
 
180
+ .sonic-waveform-label {
181
+ color: CanvasText;
182
+
183
+ &[data-sonic-dimmed] {
184
+ color: GrayText;
185
+ }
186
+ }
187
+
165
188
  .sonic-waveform-playhead {
166
189
  background: CanvasText;
167
190
  }
@@ -58,6 +58,12 @@
58
58
  initial-value: 0;
59
59
  }
60
60
 
61
+ @property --_sonic-marker-step {
62
+ syntax: '<length>';
63
+ inherits: true;
64
+ initial-value: 0;
65
+ }
66
+
61
67
  @property --_sonic-cancel-zone {
62
68
  syntax: '<length>';
63
69
  inherits: true;
@@ -88,10 +94,14 @@
88
94
  --_sonic-wavestrip-bar-gap-ratio: var(--sonic-wavestrip-bar-gap-ratio, 0.33);
89
95
  --_sonic-wavestrip-bar-radius-ratio: var(--sonic-wavestrip-bar-radius-ratio, 0.5);
90
96
  --_sonic-wavestrip-marker-ratio: var(--sonic-wavestrip-marker-ratio, 0.065);
91
- --_sonic-wavestrip-inset: calc(var(--_sonic-wavestrip-size) * 0.1);
97
+ --_sonic-wavestrip-inset: calc(
98
+ var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-inset-ratio, 0.1)
99
+ );
92
100
  --_sonic-unit: calc(var(--_sonic-wavestrip-size) / 32);
93
101
  --_sonic-wavestrip-lit: var(--_sonic-lit);
94
102
  --_sonic-marker-size: calc(var(--_sonic-wavestrip-size) * var(--_sonic-wavestrip-marker-ratio));
103
+ --_sonic-marker-ring: max(1px, 0.5 * var(--_sonic-unit));
104
+ --_sonic-marker-step: calc(var(--_sonic-marker-size) + var(--_sonic-marker-ring));
95
105
  --_sonic-marker-default: var(--sonic-marker, var(--_sonic-ink));
96
106
  --_sonic-wavestrip-wave: var(
97
107
  --sonic-wave,
@@ -110,7 +120,12 @@
110
120
  container-type: size;
111
121
  touch-action: pan-y;
112
122
  cursor: ew-resize;
113
- border-radius: calc(var(--_sonic-wavestrip-size) * 0.15);
123
+
124
+ --_sonic-glass-radius: calc(
125
+ var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-radius-ratio, 0.15)
126
+ );
127
+
128
+ border-radius: var(--_sonic-glass-radius);
114
129
  box-shadow: var(--_sonic-focus-shadow);
115
130
  }
116
131
 
@@ -151,16 +166,18 @@
151
166
  }
152
167
 
153
168
  .sonic-wavestrip-marker {
154
- inset: 0 auto auto calc(var(--_sonic-marker-from, 0) * 100% - var(--_sonic-marker-size) / 2);
169
+ inset: calc(var(--_sonic-marker-lane, 0) * var(--_sonic-marker-step)) auto auto
170
+ calc(var(--_sonic-marker-from, 0) * 100% - var(--_sonic-marker-size) / 2);
155
171
  inline-size: var(--_sonic-marker-size);
156
172
  block-size: var(--_sonic-marker-size);
157
173
  background: color-mix(in oklab, var(--_sonic-marker-colour) 85%, transparent);
158
174
  border-radius: 50%;
159
- box-shadow: 0 0 0 max(1px, 0.5 * var(--_sonic-unit)) var(--_sonic-glass);
175
+ box-shadow: 0 0 0 var(--_sonic-marker-ring) var(--_sonic-glass);
160
176
  }
161
177
 
162
178
  .sonic-wavestrip-region {
163
- inset: 0 auto 0 calc(var(--_sonic-marker-from, 0) * 100%);
179
+ inset: calc(-1 * var(--_sonic-wavestrip-inset)) auto calc(-1 * var(--_sonic-wavestrip-inset))
180
+ calc(var(--_sonic-marker-from, 0) * 100%);
164
181
  box-sizing: border-box;
165
182
  inline-size: calc((var(--_sonic-marker-to, 0) - var(--_sonic-marker-from, 0)) * 100%);
166
183
  background: color-mix(in oklab, var(--_sonic-marker-colour) 16%, transparent);
@@ -204,7 +221,7 @@
204
221
 
205
222
  .sonic-wavestrip-marker {
206
223
  background: var(--_sonic-marker-colour);
207
- box-shadow: 0 0 0 max(1px, 0.5 * var(--_sonic-unit)) Canvas;
224
+ box-shadow: 0 0 0 var(--_sonic-marker-ring) Canvas;
208
225
  }
209
226
 
210
227
  .sonic-wavestrip-region {
@@ -38,7 +38,10 @@
38
38
  container-type: size;
39
39
  touch-action: none;
40
40
  cursor: crosshair;
41
- border-radius: calc(var(--_sonic-xy-size) * var(--_sonic-xy-radius-ratio));
41
+
42
+ --_sonic-glass-radius: calc(var(--_sonic-xy-size) * var(--_sonic-xy-radius-ratio));
43
+
44
+ border-radius: var(--_sonic-glass-radius);
42
45
  }
43
46
 
44
47
  :disabled > .sonic-xy {
@@ -117,9 +120,13 @@
117
120
  }
118
121
 
119
122
  .sonic-xy-puck {
120
- --_sonic-xy-star: var(--_sonic-xy-lit);
121
- --_sonic-xy-star-lift: color-mix(in oklab, var(--_sonic-xy-lit) 85%, #fff);
122
- --_sonic-xy-star-glow: transparent;
123
+ --_sonic-xy-puck-fill: var(--_sonic-xy-lit);
124
+ --_sonic-xy-puck-edge: var(--_sonic-xy-puck-fill);
125
+ --_sonic-xy-puck-bracket: transparent;
126
+ --_sonic-xy-puck-bracket-scale: 0.6;
127
+ --_sonic-xy-puck-lift: color-mix(in oklab, var(--_sonic-xy-lit) 85%, #fff);
128
+ --_sonic-xy-puck-glow: transparent;
129
+ --_sonic-xy-puck-ring: 0 0 transparent;
123
130
 
124
131
  position: absolute;
125
132
  inset: auto auto
@@ -129,39 +136,67 @@
129
136
  block-size: var(--_sonic-xy-puck);
130
137
  cursor: var(--_sonic-xy-cursor);
131
138
  border-radius: 50%;
132
- box-shadow: var(--_sonic-focus-shadow);
133
- filter: drop-shadow(0 0 calc(0.1 * var(--_sonic-xy-puck)) var(--_sonic-xy-star-glow));
134
- transition:
135
- box-shadow 120ms ease-out,
136
- filter 120ms ease-out;
139
+ filter: drop-shadow(0 0 calc(0.15 * var(--_sonic-xy-puck)) var(--_sonic-xy-puck-glow));
140
+ transition: filter 120ms ease-out;
137
141
 
138
142
  &::before {
139
143
  position: absolute;
140
- inset: 0;
144
+ inset: 25%;
145
+ pointer-events: none;
146
+ content: '';
147
+ background: var(--_sonic-xy-puck-fill);
148
+ border: max(1px, 0.08 * var(--_sonic-xy-puck)) solid var(--_sonic-xy-puck-edge);
149
+ border-radius: 50%;
150
+ box-shadow: var(--_sonic-xy-puck-ring);
151
+ transition:
152
+ background-color 120ms ease-out,
153
+ border-color 120ms ease-out,
154
+ box-shadow 120ms ease-out;
155
+ }
156
+
157
+ &::after {
158
+ position: absolute;
159
+ inset: 4%;
141
160
  pointer-events: none;
142
161
  content: '';
143
- background: var(--_sonic-xy-star);
144
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 108 108'%3E%3Cpath d='M50 0C52 38 62 48 100 50C62 52 52 62 50 100C48 62 38 52 0 50C38 48 48 38 50 0Z'/%3E%3C/svg%3E")
145
- center / 100% 100% no-repeat;
146
- transition: background-color 120ms ease-out;
162
+ border: max(1px, 0.08 * var(--_sonic-xy-puck)) solid var(--_sonic-xy-puck-bracket);
163
+ border-block-start-color: transparent;
164
+ border-radius: 50%;
165
+ rotate: 45deg;
166
+ scale: var(--_sonic-xy-puck-bracket-scale);
167
+ transition:
168
+ border-color 120ms ease-out,
169
+ scale 120ms ease-out;
147
170
  }
148
171
  }
149
172
 
150
173
  @media (hover: hover) {
151
- :not(:disabled) > .sonic-xy > .sonic-xy-puck:hover {
152
- --_sonic-xy-star: var(--_sonic-xy-star-lift);
174
+ :not(:disabled, :state(dragging)) > .sonic-xy > .sonic-xy-puck:hover {
175
+ --_sonic-xy-puck-fill: var(--_sonic-xy-puck-lift);
153
176
  }
154
177
  }
155
178
 
156
- /* The glow goes on the puck, since a custom property cannot travel up from the part */
157
179
  .sonic-xy-puck:has(> :focus-visible:not([data-sonic-pointer-focus])) {
158
- --_sonic-xy-star: var(--_sonic-xy-star-lift);
159
- --_sonic-focus-shadow: var(--_sonic-focus-glow);
180
+ --_sonic-xy-puck-fill: var(--_sonic-xy-puck-lift);
181
+ --_sonic-xy-puck-ring:
182
+ 0 0 0 max(2px, 0.08 * var(--_sonic-xy-puck)) var(--_sonic-glass),
183
+ 0 0 0 max(4px, 0.16 * var(--_sonic-xy-puck)) var(--_sonic-focus);
160
184
  }
161
185
 
162
186
  :state(dragging) > .sonic-xy > .sonic-xy-puck {
163
- --_sonic-xy-star: var(--_sonic-xy-star-lift);
164
- --_sonic-xy-star-glow: color-mix(in oklab, var(--_sonic-xy-lit) 25%, transparent);
187
+ --_sonic-xy-puck-fill: var(--_sonic-glass);
188
+ --_sonic-xy-puck-edge: var(--_sonic-xy-lit);
189
+ --_sonic-xy-puck-glow: color-mix(
190
+ in oklab,
191
+ var(--_sonic-xy-lit) calc(45% * var(--_sonic-relief)),
192
+ transparent
193
+ );
194
+ --_sonic-xy-puck-bracket: color-mix(
195
+ in oklab,
196
+ var(--_sonic-xy-lit) calc(100% * (1 - var(--_sonic-relief))),
197
+ transparent
198
+ );
199
+ --_sonic-xy-puck-bracket-scale: 1;
165
200
  }
166
201
 
167
202
  .sonic-xy-axis {
@@ -175,6 +210,7 @@
175
210
  .sonic-xy {
176
211
  --_sonic-lit: Highlight;
177
212
  --_sonic-unlit: GrayText;
213
+ --_sonic-glass: Canvas;
178
214
  }
179
215
 
180
216
  .sonic-xy-field {
@@ -182,9 +218,10 @@
182
218
  }
183
219
 
184
220
  .sonic-xy-puck {
185
- --_sonic-xy-star: CanvasText;
186
- --_sonic-xy-star-lift: CanvasText;
187
- --_sonic-xy-star-glow: transparent;
221
+ --_sonic-xy-puck-fill: CanvasText;
222
+ --_sonic-xy-puck-lift: CanvasText;
223
+ --_sonic-xy-puck-glow: transparent;
224
+ --_sonic-xy-puck-ring: 0 0 transparent;
188
225
 
189
226
  forced-color-adjust: none;
190
227
  }
package/package.json CHANGED
@@ -1,15 +1,13 @@
1
1
  {
2
2
  "name": "@xsynaptic/sonic-ui",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Native custom elements for audio interfaces, skinned with CSS custom properties",
5
5
  "keywords": [
6
6
  "custom-elements",
7
7
  "web-components",
8
8
  "audio",
9
- "knob",
10
9
  "dial",
11
10
  "slider",
12
- "fader",
13
11
  "synth"
14
12
  ],
15
13
  "homepage": "https://github.com/xsynaptic/sonic-ui#readme",
@@ -79,13 +77,12 @@
79
77
  "dist"
80
78
  ],
81
79
  "devDependencies": {
82
- "publint": "^0.3.24",
80
+ "publint": "^0.3.25",
83
81
  "tsdown": "^0.23.0",
84
82
  "typescript": "^6.0.3"
85
83
  },
86
84
  "scripts": {
87
85
  "build": "tsdown",
88
- "dev": "tsdown --watch",
89
86
  "check-types": "tsc --noEmit"
90
87
  }
91
88
  }