@xsynaptic/sonic-ui 0.6.1 → 0.9.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 (105) hide show
  1. package/README.md +2 -0
  2. package/dist/default/define/spectrum.js +7 -0
  3. package/dist/default/define.js +1 -0
  4. package/dist/default/elements/button.js +30 -2
  5. package/dist/default/elements/dial.js +12 -3
  6. package/dist/default/elements/display-element.js +77 -0
  7. package/dist/default/elements/envelope.js +3 -3
  8. package/dist/default/elements/modulation.js +45 -0
  9. package/dist/default/elements/readout-claim.js +8 -3
  10. package/dist/default/elements/slider.js +68 -4
  11. package/dist/default/elements/spectrum.js +230 -0
  12. package/dist/default/elements/value-element.js +114 -317
  13. package/dist/default/elements/value-gestures.js +301 -0
  14. package/dist/default/elements/wave-element.js +59 -9
  15. package/dist/default/elements/waveform.js +61 -12
  16. package/dist/default/elements/wavestrip.js +25 -49
  17. package/dist/default/elements/xy.js +10 -21
  18. package/dist/default/index.js +2 -1
  19. package/dist/default/lib/asked-value.js +21 -0
  20. package/dist/default/lib/canvas-surface.js +10 -4
  21. package/dist/default/lib/frame-timeline.js +2 -2
  22. package/dist/default/lib/hover-preview.js +46 -0
  23. package/dist/default/lib/marker-rider.js +12 -6
  24. package/dist/default/lib/pointer-drag.js +7 -2
  25. package/dist/default/lib/read-ms-property.js +10 -0
  26. package/dist/default/lib/spectrum-columns.js +74 -0
  27. package/dist/default/lib/spectrum-levels.js +55 -0
  28. package/dist/default/lib/strip-scene.js +12 -1
  29. package/dist/default/lib/time-regions.js +5 -1
  30. package/dist/dev/define/spectrum.d.ts +2 -0
  31. package/dist/dev/define/spectrum.js +8 -0
  32. package/dist/dev/define/spectrum.js.map +1 -0
  33. package/dist/dev/define.d.ts +3 -1
  34. package/dist/dev/define.js +1 -0
  35. package/dist/dev/elements/button.d.ts +2 -0
  36. package/dist/dev/elements/button.js +30 -2
  37. package/dist/dev/elements/button.js.map +1 -1
  38. package/dist/dev/elements/dial.js +12 -3
  39. package/dist/dev/elements/dial.js.map +1 -1
  40. package/dist/dev/elements/display-element.d.ts +29 -0
  41. package/dist/dev/elements/display-element.js +78 -0
  42. package/dist/dev/elements/display-element.js.map +1 -0
  43. package/dist/dev/elements/envelope.js +3 -3
  44. package/dist/dev/elements/envelope.js.map +1 -1
  45. package/dist/dev/elements/modulation.js +46 -0
  46. package/dist/dev/elements/modulation.js.map +1 -0
  47. package/dist/dev/elements/readout-claim.js +8 -3
  48. package/dist/dev/elements/readout-claim.js.map +1 -1
  49. package/dist/dev/elements/slider.d.ts +5 -0
  50. package/dist/dev/elements/slider.js +68 -4
  51. package/dist/dev/elements/slider.js.map +1 -1
  52. package/dist/dev/elements/spectrum.d.ts +59 -0
  53. package/dist/dev/elements/spectrum.js +231 -0
  54. package/dist/dev/elements/spectrum.js.map +1 -0
  55. package/dist/dev/elements/value-element.d.ts +13 -14
  56. package/dist/dev/elements/value-element.js +114 -317
  57. package/dist/dev/elements/value-element.js.map +1 -1
  58. package/dist/dev/elements/value-gestures.d.ts +10 -0
  59. package/dist/dev/elements/value-gestures.js +302 -0
  60. package/dist/dev/elements/value-gestures.js.map +1 -0
  61. package/dist/dev/elements/wave-element.d.ts +8 -2
  62. package/dist/dev/elements/wave-element.js +59 -9
  63. package/dist/dev/elements/wave-element.js.map +1 -1
  64. package/dist/dev/elements/waveform.d.ts +12 -4
  65. package/dist/dev/elements/waveform.js +61 -12
  66. package/dist/dev/elements/waveform.js.map +1 -1
  67. package/dist/dev/elements/wavestrip.d.ts +3 -1
  68. package/dist/dev/elements/wavestrip.js +25 -49
  69. package/dist/dev/elements/wavestrip.js.map +1 -1
  70. package/dist/dev/elements/xy.js +10 -21
  71. package/dist/dev/elements/xy.js.map +1 -1
  72. package/dist/dev/index.d.ts +4 -1
  73. package/dist/dev/index.js +2 -1
  74. package/dist/dev/lib/asked-value.js +22 -0
  75. package/dist/dev/lib/asked-value.js.map +1 -0
  76. package/dist/dev/lib/canvas-surface.d.ts +5 -3
  77. package/dist/dev/lib/canvas-surface.js +10 -4
  78. package/dist/dev/lib/canvas-surface.js.map +1 -1
  79. package/dist/dev/lib/frame-timeline.js +2 -2
  80. package/dist/dev/lib/frame-timeline.js.map +1 -1
  81. package/dist/dev/lib/hover-preview.js +47 -0
  82. package/dist/dev/lib/hover-preview.js.map +1 -0
  83. package/dist/dev/lib/marker-rider.js +12 -6
  84. package/dist/dev/lib/marker-rider.js.map +1 -1
  85. package/dist/dev/lib/pointer-drag.js +7 -2
  86. package/dist/dev/lib/pointer-drag.js.map +1 -1
  87. package/dist/dev/lib/read-ms-property.js +11 -0
  88. package/dist/dev/lib/read-ms-property.js.map +1 -0
  89. package/dist/dev/lib/spectrum-columns.js +75 -0
  90. package/dist/dev/lib/spectrum-columns.js.map +1 -0
  91. package/dist/dev/lib/spectrum-levels.js +56 -0
  92. package/dist/dev/lib/spectrum-levels.js.map +1 -0
  93. package/dist/dev/lib/strip-scene.js +12 -1
  94. package/dist/dev/lib/strip-scene.js.map +1 -1
  95. package/dist/dev/lib/time-regions.js +5 -1
  96. package/dist/dev/lib/time-regions.js.map +1 -1
  97. package/dist/styles/button.css +7 -1
  98. package/dist/styles/controls.css +1 -0
  99. package/dist/styles/material.css +36 -3
  100. package/dist/styles/meter.css +22 -18
  101. package/dist/styles/slider.css +42 -5
  102. package/dist/styles/spectrum.css +105 -0
  103. package/dist/styles/waveform.css +48 -16
  104. package/dist/styles/wavestrip.css +26 -5
  105. package/package.json +2 -1
@@ -10,6 +10,12 @@
10
10
  initial-value: 8px;
11
11
  }
12
12
 
13
+ @property --_sonic-reveal-delay {
14
+ syntax: '<time>';
15
+ inherits: true;
16
+ initial-value: 250ms;
17
+ }
18
+
13
19
  @keyframes sonic-glass-breathe {
14
20
  to {
15
21
  opacity: calc(0.4 * min(1, var(--_sonic-glass-texture)));
@@ -33,6 +39,7 @@
33
39
  .sonic-segmented,
34
40
  .sonic-slider,
35
41
  .sonic-slider-readout,
42
+ .sonic-spectrum,
36
43
  .sonic-waveform,
37
44
  .sonic-waveform-readout,
38
45
  .sonic-wavestrip,
@@ -58,6 +65,7 @@
58
65
  .sonic-ring,
59
66
  .sonic-segmented-option,
60
67
  .sonic-slider,
68
+ .sonic-spectrum,
61
69
  .sonic-waveform,
62
70
  .sonic-wavestrip,
63
71
  .sonic-xy
@@ -92,6 +100,9 @@
92
100
  );
93
101
  --_sonic-lens-glass: var(--sonic-lens, color-mix(in oklab, var(--_sonic-unlit) 60%, #000));
94
102
  --_sonic-lens: var(--_sonic-lens-glint), var(--_sonic-lens-glass);
103
+ }
104
+
105
+ :is(.sonic-led, .sonic-meter, .sonic-spectrum) {
95
106
  --_sonic-hot: var(--sonic-hot, oklch(70.5% 0.187 48deg));
96
107
  --_sonic-clip: var(--sonic-clip, oklch(63.7% 0.208 25deg));
97
108
  }
@@ -162,6 +173,18 @@
162
173
  --_sonic-readout-size: var(--sonic-readout-size, 1.5rem);
163
174
  }
164
175
 
176
+ :is(
177
+ .sonic-dial,
178
+ .sonic-envelope,
179
+ .sonic-number,
180
+ .sonic-slider,
181
+ .sonic-waveform,
182
+ .sonic-wavestrip,
183
+ .sonic-xy
184
+ ) {
185
+ --_sonic-reveal-delay: var(--sonic-reveal-delay, 250ms);
186
+ }
187
+
165
188
  :is(.sonic-dial, .sonic-slider, .sonic-waveform, .sonic-wavestrip) {
166
189
  --_sonic-lit-off: var(
167
190
  --sonic-dimmed,
@@ -176,6 +199,7 @@
176
199
  .sonic-number,
177
200
  .sonic-screen,
178
201
  .sonic-slider-readout,
202
+ .sonic-spectrum,
179
203
  .sonic-waveform,
180
204
  .sonic-waveform-readout,
181
205
  .sonic-wavestrip,
@@ -227,7 +251,15 @@
227
251
  }
228
252
 
229
253
  /* A definite cell, so percentage-sized content fills the glass; a canvas sized to its own box would feed back */
230
- :is(.sonic-envelope, .sonic-number, .sonic-screen, .sonic-waveform, .sonic-wavestrip, .sonic-xy) {
254
+ :is(
255
+ .sonic-envelope,
256
+ .sonic-number,
257
+ .sonic-screen,
258
+ .sonic-spectrum,
259
+ .sonic-waveform,
260
+ .sonic-wavestrip,
261
+ .sonic-xy
262
+ ) {
231
263
  --_sonic-glass-depth: var(--sonic-glass-depth, var(--_sonic-relief));
232
264
  --_sonic-glass-texture: var(--sonic-glass-texture, var(--_sonic-relief));
233
265
  --_sonic-glass-pitch: max(2px, round(2 * var(--_sonic-unit), 1px));
@@ -266,7 +298,7 @@
266
298
  ),
267
299
  repeating-linear-gradient(
268
300
  to bottom,
269
- rgb(0 0 0 / calc(0.04 * var(--_sonic-glass-texture))) 0
301
+ rgb(0 0 0 / calc(0.025 * var(--_sonic-glass-texture))) 0
270
302
  calc(var(--_sonic-glass-pitch) / 2),
271
303
  transparent 0 var(--_sonic-glass-pitch)
272
304
  );
@@ -313,6 +345,7 @@
313
345
  .sonic-number,
314
346
  .sonic-screen,
315
347
  .sonic-segmented,
348
+ .sonic-spectrum,
316
349
  .sonic-waveform,
317
350
  .sonic-wavestrip,
318
351
  .sonic-xy
@@ -514,7 +547,7 @@
514
547
  font-size: calc(0.5 * var(--_sonic-readout-size));
515
548
  font-variant-numeric: tabular-nums;
516
549
  line-height: 1;
517
- color: var(--_sonic-glass-text);
550
+ color: var(--sonic-readout-text, var(--_sonic-glass-text));
518
551
  white-space: nowrap;
519
552
  pointer-events: none;
520
553
  cursor: default;
@@ -5,7 +5,7 @@
5
5
  }
6
6
 
7
7
  @property --_sonic-meter-length {
8
- syntax: '<length>';
8
+ syntax: '<length-percentage>';
9
9
  inherits: true;
10
10
  initial-value: 128px;
11
11
  }
@@ -55,17 +55,12 @@
55
55
  --_sonic-meter-segment-radius: calc(
56
56
  var(--_sonic-meter-segment) * var(--_sonic-meter-segment-radius-ratio)
57
57
  );
58
- --_sonic-meter-segments: round(
59
- down,
60
- var(--_sonic-meter-length) - 2 * var(--_sonic-meter-inset) - var(--_sonic-meter-clip-space) +
61
- var(--_sonic-meter-gap),
62
- var(--_sonic-meter-pitch)
63
- );
64
58
 
65
59
  position: relative;
66
60
  flex-shrink: 0;
67
61
  inline-size: var(--_sonic-meter-size);
68
62
  block-size: var(--_sonic-meter-length);
63
+ container-type: size;
69
64
  background: var(--sonic-bezel, color-mix(in oklab, var(--_sonic-unlit) 55%, #000));
70
65
  border-radius: calc(var(--_sonic-meter-size) * var(--_sonic-meter-radius-ratio));
71
66
 
@@ -91,21 +86,18 @@
91
86
  }
92
87
 
93
88
  :state(ladder) > .sonic-meter {
94
- --_sonic-meter-pitch: calc(
95
- (var(--_sonic-meter-length) - 2 * var(--_sonic-meter-inset)) / var(--_sonic-meter-count, 1)
96
- );
97
89
  --_sonic-meter-gap: 0px;
98
- --_sonic-meter-segments: calc(var(--_sonic-meter-length) - 2 * var(--_sonic-meter-inset));
99
- --_sonic-meter-ladder-radius: calc(
100
- min(
101
- var(--_sonic-meter-lens),
102
- var(--_sonic-meter-pitch) * (1 - var(--_sonic-meter-gap-ratio))
103
- ) /
104
- 2
105
- );
106
90
  }
107
91
 
92
+ /* A percentage length means the parent only on the meter's own box; its parts measure the box */
108
93
  :is(.sonic-meter-segments, .sonic-meter-bar) {
94
+ --_sonic-meter-length: 100cqb;
95
+ --_sonic-meter-segments: round(
96
+ down,
97
+ var(--_sonic-meter-length) - 2 * var(--_sonic-meter-inset) - var(--_sonic-meter-clip-space) +
98
+ var(--_sonic-meter-gap),
99
+ var(--_sonic-meter-pitch)
100
+ );
109
101
  --_sonic-meter-span: calc(var(--_sonic-meter-max, 0) - var(--_sonic-meter-min, -60));
110
102
  --_sonic-meter-hot-at: round(
111
103
  clamp(
@@ -177,6 +169,17 @@
177
169
  }
178
170
 
179
171
  :state(ladder) > .sonic-meter > :is(.sonic-meter-segments, .sonic-meter-bar) {
172
+ --_sonic-meter-pitch: calc(
173
+ (var(--_sonic-meter-length) - 2 * var(--_sonic-meter-inset)) / var(--_sonic-meter-count, 1)
174
+ );
175
+ --_sonic-meter-segments: calc(var(--_sonic-meter-length) - 2 * var(--_sonic-meter-inset));
176
+ --_sonic-meter-ladder-radius: calc(
177
+ min(
178
+ var(--_sonic-meter-lens),
179
+ var(--_sonic-meter-pitch) * (1 - var(--_sonic-meter-gap-ratio))
180
+ ) /
181
+ 2
182
+ );
180
183
  --_sonic-meter-hot-at: calc(var(--_sonic-meter-hot-segments, 0) * var(--_sonic-meter-pitch));
181
184
  --_sonic-meter-clip-at: calc(var(--_sonic-meter-clip-segments, 0) * var(--_sonic-meter-pitch));
182
185
  --_sonic-meter-segment-mask: radial-gradient(
@@ -193,6 +196,7 @@
193
196
  }
194
197
 
195
198
  [orientation='horizontal'] > .sonic-meter > :is(.sonic-meter-segments, .sonic-meter-bar) {
199
+ --_sonic-meter-length: 100cqi;
196
200
  --_sonic-meter-segment-mask:
197
201
  linear-gradient(to right, #000 var(--_sonic-meter-segment), transparent 0) 0
198
202
  var(--_sonic-meter-segment-radius) / var(--_sonic-meter-pitch)
@@ -10,6 +10,12 @@
10
10
  initial-value: 128px;
11
11
  }
12
12
 
13
+ @property --_sonic-slider-groove-ratio {
14
+ syntax: '<number>';
15
+ inherits: true;
16
+ initial-value: 0.15;
17
+ }
18
+
13
19
  @property --_sonic-slider-value {
14
20
  syntax: '<number>';
15
21
  inherits: true;
@@ -56,6 +62,7 @@
56
62
  --sonic-buffered,
57
63
  color-mix(in oklab, var(--_sonic-ink) 18%, var(--_sonic-unlit))
58
64
  );
65
+ --_sonic-slider-scrub: var(--sonic-scrub, color-mix(in oklab, var(--_sonic-lit) 55%, #fff));
59
66
  --_sonic-slider-toward: to right;
60
67
  --_sonic-slider-across: to bottom;
61
68
  --_sonic-slider-cursor: ew-resize;
@@ -69,9 +76,32 @@
69
76
  inline-size: var(--_sonic-slider-length);
70
77
  block-size: var(--_sonic-slider-size);
71
78
  container-type: size;
72
- touch-action: pan-y;
79
+ touch-action: var(--sonic-touch-action, pan-y);
73
80
  cursor: var(--_sonic-slider-cursor);
74
81
  user-select: none;
82
+ transition: --_sonic-slider-groove-ratio 120ms ease-out;
83
+
84
+ @media (prefers-reduced-motion: reduce) {
85
+ transition: none;
86
+ }
87
+ }
88
+
89
+ :where(:not(:disabled)) > .sonic-slider:focus-visible,
90
+ :state(dragging) > .sonic-slider {
91
+ --_sonic-slider-groove-ratio: var(
92
+ --sonic-slider-groove-hover-ratio,
93
+ var(--sonic-slider-groove-ratio, 0.15)
94
+ );
95
+ }
96
+
97
+ @media (hover: hover) {
98
+ /* fallow-ignore-next-line code-duplication -- `:hover` and `:focus-visible` split by `(hover: hover)` */
99
+ :where(:not(:disabled)) > .sonic-slider:hover {
100
+ --_sonic-slider-groove-ratio: var(
101
+ --sonic-slider-groove-hover-ratio,
102
+ var(--sonic-slider-groove-ratio, 0.15)
103
+ );
104
+ }
75
105
  }
76
106
 
77
107
  [orientation='vertical'] > .sonic-slider {
@@ -82,7 +112,7 @@
82
112
 
83
113
  inline-size: var(--_sonic-slider-size);
84
114
  block-size: var(--_sonic-slider-length);
85
- touch-action: pan-x;
115
+ touch-action: var(--sonic-touch-action, pan-x);
86
116
  }
87
117
 
88
118
  :state(dragging) > .sonic-slider {
@@ -225,14 +255,16 @@
225
255
  }
226
256
 
227
257
  .sonic-slider-groove {
228
- --_sonic-slider-lit-low: min(var(--_sonic-slider-origin, 0), var(--_sonic-slider-value, 0));
229
- --_sonic-slider-lit-high: max(var(--_sonic-slider-origin, 0), var(--_sonic-slider-value, 0));
258
+ --_sonic-slider-lit-to: var(--_sonic-slider-played, var(--_sonic-slider-value, 0));
259
+ --_sonic-slider-lit-low: min(var(--_sonic-slider-origin, 0), var(--_sonic-slider-lit-to));
260
+ --_sonic-slider-lit-high: max(var(--_sonic-slider-origin, 0), var(--_sonic-slider-lit-to));
230
261
 
231
262
  position: absolute;
232
263
  inset: calc(50% + var(--_sonic-slider-scale-band) / 2 - var(--_sonic-slider-groove) / 2)
233
264
  calc((var(--_sonic-slider-cap) - var(--_sonic-slider-groove)) / 2)
234
265
  calc(50% - var(--_sonic-slider-scale-band) / 2 - var(--_sonic-slider-groove) / 2);
235
266
  background:
267
+ var(--_sonic-slider-scrub-region, none),
236
268
  linear-gradient(
237
269
  var(--_sonic-slider-toward),
238
270
  transparent
@@ -430,7 +462,11 @@
430
462
 
431
463
  /* Bare `block-start` spans the viewport; `translate` belongs to the open transition */
432
464
  :not([orientation='vertical']) > .sonic-slider > .sonic-slider-readout {
433
- --_sonic-slider-readout-at: calc(var(--_sonic-slider-cap) / 2 + var(--_sonic-slider-offset));
465
+ --_sonic-slider-readout-at: calc(
466
+ var(--_sonic-slider-cap) / 2 +
467
+ var(--_sonic-slider-readout-value, var(--_sonic-slider-value, 0)) *
468
+ var(--_sonic-slider-travel)
469
+ );
434
470
 
435
471
  inset-inline: var(--_sonic-slider-readout-at) calc(100cqi - var(--_sonic-slider-readout-at));
436
472
  justify-self: center;
@@ -454,6 +490,7 @@
454
490
 
455
491
  .sonic-slider {
456
492
  --_sonic-slider-buffered: color-mix(in srgb, CanvasText 50%, GrayText);
493
+ --_sonic-slider-scrub: CanvasText;
457
494
  }
458
495
 
459
496
  .sonic-slider-groove {
@@ -0,0 +1,105 @@
1
+ @property --_sonic-spectrum-size {
2
+ syntax: '<length>';
3
+ inherits: true;
4
+ initial-value: 96px;
5
+ }
6
+
7
+ @property --_sonic-spectrum-length {
8
+ syntax: '<length-percentage>';
9
+ inherits: true;
10
+ initial-value: 320px;
11
+ }
12
+
13
+ @property --_sonic-spectrum-lit {
14
+ syntax: '<color>';
15
+ inherits: true;
16
+ initial-value: rgb(245 158 10);
17
+ }
18
+
19
+ @property --_sonic-spectrum-hot {
20
+ syntax: '<color>';
21
+ inherits: true;
22
+ initial-value: rgb(250 115 20);
23
+ }
24
+
25
+ @property --_sonic-spectrum-clip {
26
+ syntax: '<color>';
27
+ inherits: true;
28
+ initial-value: rgb(240 70 70);
29
+ }
30
+
31
+ @property --_sonic-spectrum-grid {
32
+ syntax: '<color>';
33
+ inherits: true;
34
+ initial-value: rgb(96 96 104);
35
+ }
36
+
37
+ @property --_sonic-spectrum-hot-from {
38
+ syntax: '<number>';
39
+ inherits: true;
40
+ initial-value: -12;
41
+ }
42
+
43
+ @property --_sonic-spectrum-clip-from {
44
+ syntax: '<number>';
45
+ inherits: true;
46
+ initial-value: -3;
47
+ }
48
+
49
+ @layer sonic {
50
+ :is(sonic-spectrum, .sonic-spectrum) {
51
+ --_sonic-spectrum-size: var(--sonic-spectrum-size, 6rem);
52
+ --_sonic-spectrum-length: var(--sonic-spectrum-length, 20rem);
53
+ }
54
+
55
+ :has(> .sonic-spectrum):not([hidden]) {
56
+ display: contents;
57
+ }
58
+
59
+ sonic-spectrum:not(:defined, [hidden]) {
60
+ display: block;
61
+ visibility: hidden;
62
+ flex-shrink: 0;
63
+ inline-size: var(--_sonic-spectrum-length);
64
+ block-size: var(--_sonic-spectrum-size);
65
+ }
66
+
67
+ .sonic-spectrum {
68
+ --_sonic-unit: calc(var(--_sonic-spectrum-size) / 48);
69
+ --_sonic-spectrum-lit: var(--_sonic-lit);
70
+ --_sonic-spectrum-hot: var(--_sonic-hot);
71
+ --_sonic-spectrum-clip: var(--_sonic-clip);
72
+ --_sonic-spectrum-grid: color-mix(in oklab, var(--_sonic-glass-text) 20%, transparent);
73
+ --_sonic-spectrum-hot-from: var(--sonic-spectrum-hot-from, -12);
74
+ --_sonic-spectrum-clip-from: var(--sonic-spectrum-clip-from, -3);
75
+
76
+ inline-size: var(--_sonic-spectrum-length);
77
+ block-size: var(--_sonic-spectrum-size);
78
+ padding: calc(var(--_sonic-spectrum-size) * var(--sonic-spectrum-inset-ratio, 0.06));
79
+
80
+ /* The canvas's backing size would otherwise feed an intrinsically sized parent */
81
+ contain: size;
82
+
83
+ --_sonic-glass-radius: calc(
84
+ var(--_sonic-spectrum-size) * var(--sonic-spectrum-radius-ratio, 0.08)
85
+ );
86
+
87
+ border-radius: var(--_sonic-glass-radius);
88
+ }
89
+
90
+ .sonic-spectrum-canvas {
91
+ display: block;
92
+ inline-size: 100%;
93
+ block-size: 100%;
94
+ }
95
+
96
+ /* Opaque, since a system highlight carries alpha that would blend the bars into the glass */
97
+ @media (forced-colors: active) {
98
+ .sonic-spectrum {
99
+ --_sonic-spectrum-lit: rgb(from CanvasText r g b / 100%);
100
+ --_sonic-spectrum-hot: rgb(from Highlight r g b / 100%);
101
+ --_sonic-spectrum-clip: rgb(from Highlight r g b / 100%);
102
+ --_sonic-spectrum-grid: rgb(from GrayText r g b / 100%);
103
+ }
104
+ }
105
+ }
@@ -16,6 +16,12 @@
16
16
  initial-value: 0;
17
17
  }
18
18
 
19
+ @property --_sonic-waveform-label-park {
20
+ syntax: '<length>';
21
+ inherits: true;
22
+ initial-value: 0;
23
+ }
24
+
19
25
  @property --_sonic-waveform-wave {
20
26
  syntax: '<color>';
21
27
  inherits: true;
@@ -34,12 +40,24 @@
34
40
  initial-value: rgb(96 96 104);
35
41
  }
36
42
 
37
- @property --_sonic-waveform-hatch {
43
+ @property --_sonic-waveform-ends {
44
+ syntax: '<color>';
45
+ inherits: true;
46
+ initial-value: rgb(96 96 104);
47
+ }
48
+
49
+ @property --_sonic-waveform-placeholder {
38
50
  syntax: '<color>';
39
51
  inherits: true;
40
52
  initial-value: rgb(96 96 104);
41
53
  }
42
54
 
55
+ @property --_sonic-waveform-label-fade {
56
+ syntax: '<number>';
57
+ inherits: true;
58
+ initial-value: 0.25;
59
+ }
60
+
43
61
  @property --_sonic-waveform-marker {
44
62
  syntax: '<color>';
45
63
  inherits: true;
@@ -69,18 +87,25 @@
69
87
  var(--_sonic-waveform-size) * var(--sonic-waveform-inset-ratio, 0.06)
70
88
  );
71
89
  --_sonic-unit: calc(var(--_sonic-waveform-size) / 48);
72
- --_sonic-waveform-line: max(1px, var(--_sonic-unit));
90
+ --_sonic-waveform-line: var(--sonic-waveform-playhead-width, max(1px, var(--_sonic-unit)));
73
91
  --_sonic-waveform-lit: var(--_sonic-lit);
74
92
  --_sonic-waveform-wave: var(--_sonic-waveform-lit);
75
93
  --_sonic-waveform-wave-edge: var(
76
94
  --sonic-waveform-edge,
77
- color-mix(in oklab, var(--_sonic-waveform-lit) 45%, #000)
95
+ color-mix(in oklab, var(--_sonic-waveform-lit) calc(100% - 55% * var(--_sonic-relief)), #000)
78
96
  );
79
- --_sonic-waveform-grid: var(--_sonic-etch);
80
- --_sonic-waveform-hatch: var(--_sonic-etch);
97
+ --_sonic-waveform-grid: var(--sonic-waveform-grid, var(--_sonic-etch));
98
+ --_sonic-waveform-ends: var(--sonic-waveform-ends, var(--_sonic-etch));
99
+ --_sonic-waveform-placeholder: var(--sonic-waveform-placeholder, var(--_sonic-etch));
81
100
  --_sonic-waveform-marker: var(--sonic-marker, var(--_sonic-ink));
101
+ --_sonic-waveform-label: var(--sonic-waveform-label, var(--_sonic-waveform-marker));
102
+ --_sonic-waveform-label-fade: var(--sonic-waveform-label-fade-ratio, 0.25);
82
103
  --_sonic-waveform-label-inset: calc(
83
- var(--_sonic-waveform-size) * var(--sonic-waveform-label-inset-ratio, 0.08)
104
+ var(--_sonic-waveform-size) * var(--sonic-waveform-label-inset-ratio, 0.04)
105
+ );
106
+ --_sonic-waveform-label-park: var(
107
+ --sonic-waveform-label-inset-inline,
108
+ var(--_sonic-waveform-label-inset)
84
109
  );
85
110
 
86
111
  inline-size: var(--_sonic-waveform-length);
@@ -90,7 +115,7 @@
90
115
 
91
116
  /* A label riding in from the far side would otherwise widen the page */
92
117
  overflow: hidden;
93
- touch-action: pan-y;
118
+ touch-action: var(--sonic-touch-action, pan-y);
94
119
  cursor: grab;
95
120
 
96
121
  --_sonic-glass-radius: calc(
@@ -101,6 +126,11 @@
101
126
  box-shadow: var(--_sonic-focus-shadow);
102
127
  }
103
128
 
129
+ [fill] > .sonic-waveform,
130
+ sonic-waveform[fill]:not(:defined, [hidden]) {
131
+ block-size: 100%;
132
+ }
133
+
104
134
  :state(dragging) > .sonic-waveform {
105
135
  cursor: grabbing;
106
136
  }
@@ -131,31 +161,32 @@
131
161
  }
132
162
 
133
163
  .sonic-waveform-playhead {
134
- background: var(--_sonic-ink);
164
+ background: var(--sonic-waveform-playhead, var(--_sonic-ink));
135
165
  }
136
166
 
137
167
  .sonic-waveform-ghost {
138
- background: var(--_sonic-etch);
168
+ background: var(--sonic-waveform-ghost, var(--_sonic-etch));
139
169
  }
140
170
 
141
171
  .sonic-waveform-label {
142
172
  position: absolute;
143
173
  inset-block-end: calc(var(--_sonic-waveform-inset) + var(--_sonic-waveform-label-inset));
144
174
  inset-inline-start: var(--_sonic-waveform-inset);
175
+ padding: 0.2em 0.35em;
176
+ margin: -0.2em -0.35em;
177
+ font-family: var(--sonic-waveform-label-font, inherit);
145
178
  font-size: calc(var(--_sonic-waveform-size) * var(--sonic-waveform-label-font-ratio, 0.13));
146
179
  line-height: 1;
147
- color: var(--_sonic-marker, var(--_sonic-waveform-marker));
180
+ color: var(--_sonic-marker, var(--_sonic-waveform-label));
148
181
  white-space: nowrap;
149
182
  text-shadow: var(--sonic-waveform-label-shadow, none);
150
183
  pointer-events: none;
184
+ background: var(--sonic-waveform-label-scrim, none);
185
+ border-radius: 0.2em;
151
186
  }
152
187
 
153
188
  .sonic-waveform-label[data-sonic-dimmed] {
154
- color: color-mix(
155
- in oklab,
156
- var(--_sonic-marker, var(--_sonic-waveform-marker)) 50%,
157
- transparent
158
- );
189
+ color: color-mix(in oklab, var(--_sonic-marker, var(--_sonic-waveform-label)) 50%, transparent);
159
190
  }
160
191
 
161
192
  /* Opaque, since a system highlight carries alpha that would blend the wave into the glass */
@@ -164,7 +195,8 @@
164
195
  --_sonic-waveform-wave: rgb(from CanvasText r g b / 100%);
165
196
  --_sonic-waveform-wave-edge: rgb(from CanvasText r g b / 100%);
166
197
  --_sonic-waveform-grid: rgb(from GrayText r g b / 100%);
167
- --_sonic-waveform-hatch: rgb(from GrayText r g b / 100%);
198
+ --_sonic-waveform-ends: rgb(from GrayText r g b / 100%);
199
+ --_sonic-waveform-placeholder: rgb(from GrayText r g b / 100%);
168
200
  --_sonic-waveform-marker: rgb(from CanvasText r g b / 100%);
169
201
  }
170
202
 
@@ -28,6 +28,12 @@
28
28
  initial-value: 0.5;
29
29
  }
30
30
 
31
+ @property --_sonic-wavestrip-groove-ratio {
32
+ syntax: '<number>';
33
+ inherits: true;
34
+ initial-value: 0.15;
35
+ }
36
+
31
37
  @property --_sonic-wavestrip-wave {
32
38
  syntax: '<color>';
33
39
  inherits: true;
@@ -93,13 +99,17 @@
93
99
  --_sonic-wavestrip-bar-pitch: var(--sonic-wavestrip-bar-pitch, 3px);
94
100
  --_sonic-wavestrip-bar-gap-ratio: var(--sonic-wavestrip-bar-gap-ratio, 0.33);
95
101
  --_sonic-wavestrip-bar-radius-ratio: var(--sonic-wavestrip-bar-radius-ratio, 0.5);
102
+ --_sonic-wavestrip-groove-ratio: var(--sonic-wavestrip-groove-ratio, 0.15);
96
103
  --_sonic-wavestrip-marker-ratio: var(--sonic-wavestrip-marker-ratio, 0.065);
97
104
  --_sonic-wavestrip-inset: calc(
98
105
  var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-inset-ratio, 0.1)
99
106
  );
100
107
  --_sonic-unit: calc(var(--_sonic-wavestrip-size) / 32);
101
108
  --_sonic-wavestrip-lit: var(--_sonic-lit);
102
- --_sonic-marker-size: calc(var(--_sonic-wavestrip-size) * var(--_sonic-wavestrip-marker-ratio));
109
+ --_sonic-marker-size: var(
110
+ --sonic-wavestrip-marker-size,
111
+ calc(var(--_sonic-wavestrip-size) * var(--_sonic-wavestrip-marker-ratio))
112
+ );
103
113
  --_sonic-marker-ring: max(1px, 0.5 * var(--_sonic-unit));
104
114
  --_sonic-marker-step: calc(var(--_sonic-marker-size) + var(--_sonic-marker-ring));
105
115
  --_sonic-marker-default: var(--sonic-marker, var(--_sonic-ink));
@@ -118,7 +128,7 @@
118
128
  block-size: var(--_sonic-wavestrip-size);
119
129
  padding: var(--_sonic-wavestrip-inset);
120
130
  container-type: size;
121
- touch-action: pan-y;
131
+ touch-action: var(--sonic-touch-action, pan-y);
122
132
  cursor: ew-resize;
123
133
 
124
134
  --_sonic-glass-radius: calc(
@@ -129,6 +139,11 @@
129
139
  box-shadow: var(--_sonic-focus-shadow);
130
140
  }
131
141
 
142
+ [fill] > .sonic-wavestrip,
143
+ sonic-wavestrip[fill]:not(:defined, [hidden]) {
144
+ block-size: 100%;
145
+ }
146
+
132
147
  [dimmed] > .sonic-wavestrip {
133
148
  --_sonic-wavestrip-lit: var(--_sonic-lit-off);
134
149
  }
@@ -191,10 +206,16 @@
191
206
  var(--_sonic-wavestrip-inset) + var(--_sonic-wavestrip-readout-at, 0) * 100cqi
192
207
  );
193
208
 
194
- inset-inline: var(--_sonic-wavestrip-readout-inset)
195
- calc(100cqi + 2 * var(--_sonic-wavestrip-inset) - var(--_sonic-wavestrip-readout-inset));
196
- justify-self: center;
209
+ inset-inline: 0;
210
+ justify-self: start;
197
211
  position-area: block-start center;
212
+ transform: translateX(
213
+ clamp(
214
+ 0px,
215
+ var(--_sonic-wavestrip-readout-inset) - 50%,
216
+ 100cqi + 2 * var(--_sonic-wavestrip-inset) - 100%
217
+ )
218
+ );
198
219
  }
199
220
 
200
221
  /* Opaque, since a system highlight carries alpha that would blend the bars into the glass */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsynaptic/sonic-ui",
3
- "version": "0.6.1",
3
+ "version": "0.9.0",
4
4
  "description": "Native custom elements for audio interfaces, skinned with CSS custom properties",
5
5
  "keywords": [
6
6
  "custom-elements",
@@ -66,6 +66,7 @@
66
66
  "./screen.css": "./dist/styles/screen.css",
67
67
  "./segmented.css": "./dist/styles/segmented.css",
68
68
  "./slider.css": "./dist/styles/slider.css",
69
+ "./spectrum.css": "./dist/styles/spectrum.css",
69
70
  "./switch.css": "./dist/styles/switch.css",
70
71
  "./waveform.css": "./dist/styles/waveform.css",
71
72
  "./wavestrip.css": "./dist/styles/wavestrip.css",