@xsynaptic/sonic-ui 0.6.1 → 0.8.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 (84) hide show
  1. package/README.md +4 -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/display-element.js +77 -0
  6. package/dist/default/elements/envelope.js +1 -1
  7. package/dist/default/elements/slider.js +67 -1
  8. package/dist/default/elements/spectrum.js +230 -0
  9. package/dist/default/elements/value-element.js +49 -11
  10. package/dist/default/elements/wave-element.js +59 -9
  11. package/dist/default/elements/waveform.js +56 -10
  12. package/dist/default/elements/wavestrip.js +31 -45
  13. package/dist/default/elements/xy.js +1 -1
  14. package/dist/default/index.js +2 -1
  15. package/dist/default/lib/canvas-surface.js +7 -4
  16. package/dist/default/lib/frame-timeline.js +2 -2
  17. package/dist/default/lib/hover-preview.js +46 -0
  18. package/dist/default/lib/marker-rider.js +7 -4
  19. package/dist/default/lib/pointer-drag.js +7 -2
  20. package/dist/default/lib/spectrum-columns.js +74 -0
  21. package/dist/default/lib/spectrum-levels.js +55 -0
  22. package/dist/default/lib/strip-scene.js +12 -1
  23. package/dist/default/lib/time-regions.js +5 -1
  24. package/dist/dev/define/spectrum.d.ts +2 -0
  25. package/dist/dev/define/spectrum.js +8 -0
  26. package/dist/dev/define/spectrum.js.map +1 -0
  27. package/dist/dev/define.d.ts +3 -1
  28. package/dist/dev/define.js +1 -0
  29. package/dist/dev/elements/button.d.ts +2 -0
  30. package/dist/dev/elements/button.js +30 -2
  31. package/dist/dev/elements/button.js.map +1 -1
  32. package/dist/dev/elements/display-element.d.ts +29 -0
  33. package/dist/dev/elements/display-element.js +78 -0
  34. package/dist/dev/elements/display-element.js.map +1 -0
  35. package/dist/dev/elements/envelope.js +1 -1
  36. package/dist/dev/elements/slider.d.ts +6 -0
  37. package/dist/dev/elements/slider.js +67 -1
  38. package/dist/dev/elements/slider.js.map +1 -1
  39. package/dist/dev/elements/spectrum.d.ts +59 -0
  40. package/dist/dev/elements/spectrum.js +231 -0
  41. package/dist/dev/elements/spectrum.js.map +1 -0
  42. package/dist/dev/elements/value-element.d.ts +5 -1
  43. package/dist/dev/elements/value-element.js +49 -11
  44. package/dist/dev/elements/value-element.js.map +1 -1
  45. package/dist/dev/elements/wave-element.d.ts +8 -2
  46. package/dist/dev/elements/wave-element.js +59 -9
  47. package/dist/dev/elements/wave-element.js.map +1 -1
  48. package/dist/dev/elements/waveform.d.ts +12 -4
  49. package/dist/dev/elements/waveform.js +56 -10
  50. package/dist/dev/elements/waveform.js.map +1 -1
  51. package/dist/dev/elements/wavestrip.d.ts +3 -0
  52. package/dist/dev/elements/wavestrip.js +31 -45
  53. package/dist/dev/elements/wavestrip.js.map +1 -1
  54. package/dist/dev/elements/xy.js +1 -1
  55. package/dist/dev/index.d.ts +4 -1
  56. package/dist/dev/index.js +2 -1
  57. package/dist/dev/lib/canvas-surface.d.ts +4 -3
  58. package/dist/dev/lib/canvas-surface.js +7 -4
  59. package/dist/dev/lib/canvas-surface.js.map +1 -1
  60. package/dist/dev/lib/frame-timeline.js +2 -2
  61. package/dist/dev/lib/frame-timeline.js.map +1 -1
  62. package/dist/dev/lib/hover-preview.js +47 -0
  63. package/dist/dev/lib/hover-preview.js.map +1 -0
  64. package/dist/dev/lib/marker-rider.js +7 -4
  65. package/dist/dev/lib/marker-rider.js.map +1 -1
  66. package/dist/dev/lib/pointer-drag.js +7 -2
  67. package/dist/dev/lib/pointer-drag.js.map +1 -1
  68. package/dist/dev/lib/spectrum-columns.js +75 -0
  69. package/dist/dev/lib/spectrum-columns.js.map +1 -0
  70. package/dist/dev/lib/spectrum-levels.js +56 -0
  71. package/dist/dev/lib/spectrum-levels.js.map +1 -0
  72. package/dist/dev/lib/strip-scene.js +12 -1
  73. package/dist/dev/lib/strip-scene.js.map +1 -1
  74. package/dist/dev/lib/time-regions.js +5 -1
  75. package/dist/dev/lib/time-regions.js.map +1 -1
  76. package/dist/styles/button.css +7 -1
  77. package/dist/styles/controls.css +1 -0
  78. package/dist/styles/material.css +18 -3
  79. package/dist/styles/meter.css +22 -18
  80. package/dist/styles/slider.css +42 -5
  81. package/dist/styles/spectrum.css +105 -0
  82. package/dist/styles/waveform.css +38 -16
  83. package/dist/styles/wavestrip.css +22 -4
  84. package/package.json +2 -1
@@ -33,6 +33,7 @@
33
33
  .sonic-segmented,
34
34
  .sonic-slider,
35
35
  .sonic-slider-readout,
36
+ .sonic-spectrum,
36
37
  .sonic-waveform,
37
38
  .sonic-waveform-readout,
38
39
  .sonic-wavestrip,
@@ -58,6 +59,7 @@
58
59
  .sonic-ring,
59
60
  .sonic-segmented-option,
60
61
  .sonic-slider,
62
+ .sonic-spectrum,
61
63
  .sonic-waveform,
62
64
  .sonic-wavestrip,
63
65
  .sonic-xy
@@ -92,6 +94,9 @@
92
94
  );
93
95
  --_sonic-lens-glass: var(--sonic-lens, color-mix(in oklab, var(--_sonic-unlit) 60%, #000));
94
96
  --_sonic-lens: var(--_sonic-lens-glint), var(--_sonic-lens-glass);
97
+ }
98
+
99
+ :is(.sonic-led, .sonic-meter, .sonic-spectrum) {
95
100
  --_sonic-hot: var(--sonic-hot, oklch(70.5% 0.187 48deg));
96
101
  --_sonic-clip: var(--sonic-clip, oklch(63.7% 0.208 25deg));
97
102
  }
@@ -176,6 +181,7 @@
176
181
  .sonic-number,
177
182
  .sonic-screen,
178
183
  .sonic-slider-readout,
184
+ .sonic-spectrum,
179
185
  .sonic-waveform,
180
186
  .sonic-waveform-readout,
181
187
  .sonic-wavestrip,
@@ -227,7 +233,15 @@
227
233
  }
228
234
 
229
235
  /* 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) {
236
+ :is(
237
+ .sonic-envelope,
238
+ .sonic-number,
239
+ .sonic-screen,
240
+ .sonic-spectrum,
241
+ .sonic-waveform,
242
+ .sonic-wavestrip,
243
+ .sonic-xy
244
+ ) {
231
245
  --_sonic-glass-depth: var(--sonic-glass-depth, var(--_sonic-relief));
232
246
  --_sonic-glass-texture: var(--sonic-glass-texture, var(--_sonic-relief));
233
247
  --_sonic-glass-pitch: max(2px, round(2 * var(--_sonic-unit), 1px));
@@ -266,7 +280,7 @@
266
280
  ),
267
281
  repeating-linear-gradient(
268
282
  to bottom,
269
- rgb(0 0 0 / calc(0.04 * var(--_sonic-glass-texture))) 0
283
+ rgb(0 0 0 / calc(0.025 * var(--_sonic-glass-texture))) 0
270
284
  calc(var(--_sonic-glass-pitch) / 2),
271
285
  transparent 0 var(--_sonic-glass-pitch)
272
286
  );
@@ -313,6 +327,7 @@
313
327
  .sonic-number,
314
328
  .sonic-screen,
315
329
  .sonic-segmented,
330
+ .sonic-spectrum,
316
331
  .sonic-waveform,
317
332
  .sonic-wavestrip,
318
333
  .sonic-xy
@@ -514,7 +529,7 @@
514
529
  font-size: calc(0.5 * var(--_sonic-readout-size));
515
530
  font-variant-numeric: tabular-nums;
516
531
  line-height: 1;
517
- color: var(--_sonic-glass-text);
532
+ color: var(--sonic-readout-text, var(--_sonic-glass-text));
518
533
  white-space: nowrap;
519
534
  pointer-events: none;
520
535
  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
+ }
@@ -34,12 +34,24 @@
34
34
  initial-value: rgb(96 96 104);
35
35
  }
36
36
 
37
- @property --_sonic-waveform-hatch {
37
+ @property --_sonic-waveform-ends {
38
38
  syntax: '<color>';
39
39
  inherits: true;
40
40
  initial-value: rgb(96 96 104);
41
41
  }
42
42
 
43
+ @property --_sonic-waveform-placeholder {
44
+ syntax: '<color>';
45
+ inherits: true;
46
+ initial-value: rgb(96 96 104);
47
+ }
48
+
49
+ @property --_sonic-waveform-label-fade {
50
+ syntax: '<number>';
51
+ inherits: true;
52
+ initial-value: 0.25;
53
+ }
54
+
43
55
  @property --_sonic-waveform-marker {
44
56
  syntax: '<color>';
45
57
  inherits: true;
@@ -69,18 +81,21 @@
69
81
  var(--_sonic-waveform-size) * var(--sonic-waveform-inset-ratio, 0.06)
70
82
  );
71
83
  --_sonic-unit: calc(var(--_sonic-waveform-size) / 48);
72
- --_sonic-waveform-line: max(1px, var(--_sonic-unit));
84
+ --_sonic-waveform-line: var(--sonic-waveform-playhead-width, max(1px, var(--_sonic-unit)));
73
85
  --_sonic-waveform-lit: var(--_sonic-lit);
74
86
  --_sonic-waveform-wave: var(--_sonic-waveform-lit);
75
87
  --_sonic-waveform-wave-edge: var(
76
88
  --sonic-waveform-edge,
77
- color-mix(in oklab, var(--_sonic-waveform-lit) 45%, #000)
89
+ color-mix(in oklab, var(--_sonic-waveform-lit) calc(100% - 55% * var(--_sonic-relief)), #000)
78
90
  );
79
- --_sonic-waveform-grid: var(--_sonic-etch);
80
- --_sonic-waveform-hatch: var(--_sonic-etch);
91
+ --_sonic-waveform-grid: var(--sonic-waveform-grid, var(--_sonic-etch));
92
+ --_sonic-waveform-ends: var(--sonic-waveform-ends, var(--_sonic-etch));
93
+ --_sonic-waveform-placeholder: var(--sonic-waveform-placeholder, var(--_sonic-etch));
81
94
  --_sonic-waveform-marker: var(--sonic-marker, var(--_sonic-ink));
95
+ --_sonic-waveform-label: var(--sonic-waveform-label, var(--_sonic-waveform-marker));
96
+ --_sonic-waveform-label-fade: var(--sonic-waveform-label-fade-ratio, 0.25);
82
97
  --_sonic-waveform-label-inset: calc(
83
- var(--_sonic-waveform-size) * var(--sonic-waveform-label-inset-ratio, 0.08)
98
+ var(--_sonic-waveform-size) * var(--sonic-waveform-label-inset-ratio, 0.04)
84
99
  );
85
100
 
86
101
  inline-size: var(--_sonic-waveform-length);
@@ -90,7 +105,7 @@
90
105
 
91
106
  /* A label riding in from the far side would otherwise widen the page */
92
107
  overflow: hidden;
93
- touch-action: pan-y;
108
+ touch-action: var(--sonic-touch-action, pan-y);
94
109
  cursor: grab;
95
110
 
96
111
  --_sonic-glass-radius: calc(
@@ -101,6 +116,11 @@
101
116
  box-shadow: var(--_sonic-focus-shadow);
102
117
  }
103
118
 
119
+ [fill] > .sonic-waveform,
120
+ sonic-waveform[fill]:not(:defined, [hidden]) {
121
+ block-size: 100%;
122
+ }
123
+
104
124
  :state(dragging) > .sonic-waveform {
105
125
  cursor: grabbing;
106
126
  }
@@ -131,31 +151,32 @@
131
151
  }
132
152
 
133
153
  .sonic-waveform-playhead {
134
- background: var(--_sonic-ink);
154
+ background: var(--sonic-waveform-playhead, var(--_sonic-ink));
135
155
  }
136
156
 
137
157
  .sonic-waveform-ghost {
138
- background: var(--_sonic-etch);
158
+ background: var(--sonic-waveform-ghost, var(--_sonic-etch));
139
159
  }
140
160
 
141
161
  .sonic-waveform-label {
142
162
  position: absolute;
143
163
  inset-block-end: calc(var(--_sonic-waveform-inset) + var(--_sonic-waveform-label-inset));
144
164
  inset-inline-start: var(--_sonic-waveform-inset);
165
+ padding: 0.2em 0.35em;
166
+ margin: -0.2em -0.35em;
167
+ font-family: var(--sonic-waveform-label-font, inherit);
145
168
  font-size: calc(var(--_sonic-waveform-size) * var(--sonic-waveform-label-font-ratio, 0.13));
146
169
  line-height: 1;
147
- color: var(--_sonic-marker, var(--_sonic-waveform-marker));
170
+ color: var(--_sonic-marker, var(--_sonic-waveform-label));
148
171
  white-space: nowrap;
149
172
  text-shadow: var(--sonic-waveform-label-shadow, none);
150
173
  pointer-events: none;
174
+ background: var(--sonic-waveform-label-scrim, none);
175
+ border-radius: 0.2em;
151
176
  }
152
177
 
153
178
  .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
- );
179
+ color: color-mix(in oklab, var(--_sonic-marker, var(--_sonic-waveform-label)) 50%, transparent);
159
180
  }
160
181
 
161
182
  /* Opaque, since a system highlight carries alpha that would blend the wave into the glass */
@@ -164,7 +185,8 @@
164
185
  --_sonic-waveform-wave: rgb(from CanvasText r g b / 100%);
165
186
  --_sonic-waveform-wave-edge: rgb(from CanvasText r g b / 100%);
166
187
  --_sonic-waveform-grid: rgb(from GrayText r g b / 100%);
167
- --_sonic-waveform-hatch: rgb(from GrayText r g b / 100%);
188
+ --_sonic-waveform-ends: rgb(from GrayText r g b / 100%);
189
+ --_sonic-waveform-placeholder: rgb(from GrayText r g b / 100%);
168
190
  --_sonic-waveform-marker: rgb(from CanvasText r g b / 100%);
169
191
  }
170
192
 
@@ -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,6 +99,7 @@
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)
@@ -118,7 +125,7 @@
118
125
  block-size: var(--_sonic-wavestrip-size);
119
126
  padding: var(--_sonic-wavestrip-inset);
120
127
  container-type: size;
121
- touch-action: pan-y;
128
+ touch-action: var(--sonic-touch-action, pan-y);
122
129
  cursor: ew-resize;
123
130
 
124
131
  --_sonic-glass-radius: calc(
@@ -129,6 +136,11 @@
129
136
  box-shadow: var(--_sonic-focus-shadow);
130
137
  }
131
138
 
139
+ [fill] > .sonic-wavestrip,
140
+ sonic-wavestrip[fill]:not(:defined, [hidden]) {
141
+ block-size: 100%;
142
+ }
143
+
132
144
  [dimmed] > .sonic-wavestrip {
133
145
  --_sonic-wavestrip-lit: var(--_sonic-lit-off);
134
146
  }
@@ -191,10 +203,16 @@
191
203
  var(--_sonic-wavestrip-inset) + var(--_sonic-wavestrip-readout-at, 0) * 100cqi
192
204
  );
193
205
 
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;
206
+ inset-inline: 0;
207
+ justify-self: start;
197
208
  position-area: block-start center;
209
+ transform: translateX(
210
+ clamp(
211
+ 0px,
212
+ var(--_sonic-wavestrip-readout-inset) - 50%,
213
+ 100cqi + 2 * var(--_sonic-wavestrip-inset) - 100%
214
+ )
215
+ );
198
216
  }
199
217
 
200
218
  /* 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.8.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",