@xsynaptic/sonic-ui 0.19.0 → 0.21.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 (79) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +27 -112
  3. package/dist/default/elements/button.js +2 -1
  4. package/dist/default/elements/field-gesture.js +3 -0
  5. package/dist/default/elements/sonic-element.js +1 -1
  6. package/dist/default/elements/split.js +3 -1
  7. package/dist/default/elements/switch.js +5 -3
  8. package/dist/default/elements/toggle.js +10 -5
  9. package/dist/default/elements/value-entry.js +5 -18
  10. package/dist/default/elements/waveform.js +15 -4
  11. package/dist/default/elements/xy.js +33 -5
  12. package/dist/default/lib/canvas-surface.js +5 -1
  13. package/dist/default/lib/double-press.js +30 -0
  14. package/dist/dev/elements/button.js +5 -11
  15. package/dist/dev/elements/button.js.map +1 -1
  16. package/dist/dev/elements/dial.js +2 -12
  17. package/dist/dev/elements/dial.js.map +1 -1
  18. package/dist/dev/elements/display-element.js +1 -5
  19. package/dist/dev/elements/display-element.js.map +1 -1
  20. package/dist/dev/elements/envelope.js +2 -15
  21. package/dist/dev/elements/envelope.js.map +1 -1
  22. package/dist/dev/elements/field-gesture.js +3 -0
  23. package/dist/dev/elements/field-gesture.js.map +1 -1
  24. package/dist/dev/elements/meter.js +1 -1
  25. package/dist/dev/elements/meter.js.map +1 -1
  26. package/dist/dev/elements/number.js +1 -13
  27. package/dist/dev/elements/number.js.map +1 -1
  28. package/dist/dev/elements/segmented.js +3 -10
  29. package/dist/dev/elements/segmented.js.map +1 -1
  30. package/dist/dev/elements/slider.js +2 -12
  31. package/dist/dev/elements/slider.js.map +1 -1
  32. package/dist/dev/elements/sonic-element.d.ts +1 -22
  33. package/dist/dev/elements/sonic-element.js +7 -34
  34. package/dist/dev/elements/sonic-element.js.map +1 -1
  35. package/dist/dev/elements/split.js +3 -1
  36. package/dist/dev/elements/split.js.map +1 -1
  37. package/dist/dev/elements/switch.js +7 -8
  38. package/dist/dev/elements/switch.js.map +1 -1
  39. package/dist/dev/elements/toggle.js +13 -15
  40. package/dist/dev/elements/toggle.js.map +1 -1
  41. package/dist/dev/elements/value-entry.js +5 -18
  42. package/dist/dev/elements/value-entry.js.map +1 -1
  43. package/dist/dev/elements/wave-element.js +2 -12
  44. package/dist/dev/elements/wave-element.js.map +1 -1
  45. package/dist/dev/elements/waveform.d.ts +2 -0
  46. package/dist/dev/elements/waveform.js +15 -4
  47. package/dist/dev/elements/waveform.js.map +1 -1
  48. package/dist/dev/elements/xy.d.ts +4 -0
  49. package/dist/dev/elements/xy.js +35 -17
  50. package/dist/dev/elements/xy.js.map +1 -1
  51. package/dist/dev/lib/canvas-surface.js +5 -1
  52. package/dist/dev/lib/canvas-surface.js.map +1 -1
  53. package/dist/dev/lib/double-press.js +31 -0
  54. package/dist/dev/lib/double-press.js.map +1 -0
  55. package/dist/skins/amber.css +0 -1
  56. package/dist/skins/ivory.css +0 -1
  57. package/dist/skins/lime.css +0 -1
  58. package/dist/skins/slate.css +0 -1
  59. package/dist/styles/button.css +1 -0
  60. package/dist/styles/dial.css +1 -1
  61. package/dist/styles/envelope.css +16 -14
  62. package/dist/styles/led.css +7 -19
  63. package/dist/styles/material/bracket.css +1 -1
  64. package/dist/styles/material/cap.css +27 -4
  65. package/dist/styles/material/core.css +9 -1
  66. package/dist/styles/material/glass.css +1 -7
  67. package/dist/styles/material/lens.css +18 -1
  68. package/dist/styles/material/pane.css +2 -12
  69. package/dist/styles/material/readout.css +7 -1
  70. package/dist/styles/material/well.css +8 -12
  71. package/dist/styles/meter.css +6 -4
  72. package/dist/styles/number.css +8 -9
  73. package/dist/styles/screen.css +1 -3
  74. package/dist/styles/spectrum.css +8 -22
  75. package/dist/styles/toggle.css +4 -0
  76. package/dist/styles/waveform.css +12 -24
  77. package/dist/styles/wavestrip.css +12 -33
  78. package/dist/styles/xy.css +30 -28
  79. package/package.json +1 -1
@@ -261,6 +261,7 @@
261
261
  .sonic-toggle-position:focus-visible {
262
262
  outline: var(--sonic-focus-outline, 2px solid transparent);
263
263
  outline-offset: var(--sonic-focus-outline-offset, -2px);
264
+ border-radius: var(--_sonic-toggle-corner);
264
265
  }
265
266
 
266
267
  .sonic-toggle-position:disabled {
@@ -452,6 +453,9 @@
452
453
 
453
454
  @media (forced-colors: active) {
454
455
  .sonic-toggle {
456
+ --_sonic-lit-ok: Mark;
457
+ --_sonic-lit-warning: Highlight;
458
+ --_sonic-lit-danger: Mark;
455
459
  --_sonic-skirt: CanvasText;
456
460
  --_sonic-face: CanvasText;
457
461
  --_sonic-rim: 0 0 0 var(--_sonic-rim-width) Canvas;
@@ -91,11 +91,7 @@
91
91
  }
92
92
 
93
93
  .sonic-waveform {
94
- --_sonic-waveform-inset: calc(
95
- var(--_sonic-waveform-size) * var(--sonic-waveform-inset-ratio, 0)
96
- );
97
94
  --_sonic-unit: calc(var(--_sonic-waveform-size) / 48);
98
- --_sonic-glass-depth: var(--sonic-glass-depth, calc(0.6 * var(--_sonic-relief)));
99
95
  --_sonic-waveform-line: var(
100
96
  --sonic-waveform-playhead-width,
101
97
  max(1px, round(var(--_sonic-unit), var(--_sonic-snap)))
@@ -129,28 +125,20 @@
129
125
  var(--_sonic-waveform-label-inset)
130
126
  );
131
127
 
128
+ /* fallow-ignore-next-line code-duplication -- a plain box restated, since sheets never import each other */
129
+ position: relative;
130
+ display: grid;
131
+ flex-shrink: 0;
132
+ grid-template: minmax(0, 1fr) / minmax(0, 1fr);
132
133
  inline-size: var(--_sonic-waveform-length);
133
134
  block-size: var(--_sonic-waveform-size);
134
- padding: var(--_sonic-waveform-inset);
135
135
  container-type: size;
136
136
 
137
137
  /* A label riding in from the far side would otherwise widen the page */
138
138
  overflow: hidden;
139
139
  touch-action: var(--sonic-touch-action, pan-y);
140
140
  cursor: grab;
141
-
142
- --_sonic-waveform-radius-own: calc(
143
- var(--_sonic-waveform-size) * var(--sonic-waveform-radius-ratio)
144
- );
145
- --_sonic-glass-radius: var(
146
- --_sonic-waveform-radius-own,
147
- var(
148
- --sonic-radius,
149
- calc(var(--_sonic-waveform-size) * var(--sonic-waveform-radius-ratio, 0.08))
150
- )
151
- );
152
-
153
- border-radius: var(--_sonic-glass-radius);
141
+ user-select: none;
154
142
  box-shadow: var(--_sonic-focus-shadow);
155
143
  }
156
144
 
@@ -181,15 +169,15 @@
181
169
 
182
170
  .sonic-waveform-scrim {
183
171
  position: absolute;
184
- inset: var(--_sonic-waveform-inset);
172
+ inset: 0;
185
173
  pointer-events: none;
186
174
  background: var(--sonic-waveform-scrim, none);
187
175
  }
188
176
 
189
177
  :is(.sonic-waveform-playhead, .sonic-waveform-ghost) {
190
178
  position: absolute;
191
- inset-block: var(--_sonic-waveform-inset);
192
- inset-inline-start: calc(var(--_sonic-waveform-inset) - var(--_sonic-waveform-line) / 2);
179
+ inset-block: 0;
180
+ inset-inline-start: calc(var(--_sonic-waveform-line) / -2);
193
181
  inline-size: var(--_sonic-waveform-line);
194
182
  pointer-events: none;
195
183
  translate: 50cqi;
@@ -205,8 +193,8 @@
205
193
 
206
194
  .sonic-waveform-label {
207
195
  position: absolute;
208
- inset-block-end: calc(var(--_sonic-waveform-inset) + var(--_sonic-waveform-label-lift));
209
- inset-inline-start: var(--_sonic-waveform-inset);
196
+ inset-block-end: var(--_sonic-waveform-label-lift);
197
+ inset-inline-start: 0;
210
198
  padding: 0.2em 0.35em;
211
199
  margin: -0.2em -0.35em;
212
200
  font-family: var(--sonic-waveform-label-font, inherit);
@@ -227,7 +215,7 @@
227
215
  filter: opacity(0.5);
228
216
  }
229
217
 
230
- /* Opaque, since a system highlight carries alpha that would blend the wave into the glass */
218
+ /* Opaque, since a system highlight carries alpha that would blend the wave into what is behind it */
231
219
  @media (forced-colors: active) {
232
220
  .sonic-waveform {
233
221
  --_sonic-waveform-wave: rgb(from CanvasText r g b / 100%);
@@ -110,9 +110,6 @@
110
110
  --_sonic-wavestrip-groove-ratio: var(--sonic-wavestrip-groove-ratio, 0.15);
111
111
  --_sonic-wavestrip-groove-size: var(--sonic-wavestrip-groove-size, 0px);
112
112
  --_sonic-wavestrip-marker-ratio: var(--sonic-wavestrip-marker-ratio, 0.065);
113
- --_sonic-wavestrip-inset: calc(
114
- var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-inset-ratio, 0)
115
- );
116
113
  --_sonic-unit: calc(var(--_sonic-wavestrip-size) / 32);
117
114
  --_sonic-wavestrip-lit: var(--_sonic-lit);
118
115
  --_sonic-marker-size: var(
@@ -136,25 +133,17 @@
136
133
  --_sonic-wavestrip-played: var(--_sonic-wavestrip-lit);
137
134
  --_sonic-wavestrip-scrub: var(--sonic-scrub, color-mix(in oklab, var(--_sonic-lit) 55%, #fff));
138
135
 
136
+ /* fallow-ignore-next-line code-duplication -- a plain box restated, since sheets never import each other */
137
+ position: relative;
138
+ display: grid;
139
+ flex-shrink: 0;
140
+ grid-template: minmax(0, 1fr) / minmax(0, 1fr);
139
141
  inline-size: var(--_sonic-wavestrip-length);
140
142
  block-size: var(--_sonic-wavestrip-size);
141
- padding: var(--_sonic-wavestrip-inset);
142
143
  container-type: size;
143
144
  touch-action: var(--sonic-touch-action, pan-y);
144
145
  cursor: ew-resize;
145
-
146
- --_sonic-wavestrip-radius-own: calc(
147
- var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-radius-ratio)
148
- );
149
- --_sonic-glass-radius: var(
150
- --_sonic-wavestrip-radius-own,
151
- var(
152
- --sonic-radius,
153
- calc(var(--_sonic-wavestrip-size) * var(--sonic-wavestrip-radius-ratio, 0.15))
154
- )
155
- );
156
-
157
- border-radius: var(--_sonic-glass-radius);
146
+ user-select: none;
158
147
  box-shadow: var(--_sonic-focus-shadow);
159
148
  }
160
149
 
@@ -177,12 +166,11 @@
177
166
  display: block;
178
167
  inline-size: 100%;
179
168
  block-size: 100%;
180
- border-radius: max(0px, var(--_sonic-glass-radius) - var(--_sonic-wavestrip-inset));
181
169
  }
182
170
 
183
171
  .sonic-wavestrip-markers {
184
172
  position: absolute;
185
- inset: var(--_sonic-wavestrip-inset);
173
+ inset: 0;
186
174
  pointer-events: none;
187
175
  }
188
176
 
@@ -195,7 +183,7 @@
195
183
  --_sonic-marker-colour: color-mix(
196
184
  in oklab,
197
185
  var(--_sonic-marker, var(--_sonic-marker-default)) 45%,
198
- var(--_sonic-glass)
186
+ transparent
199
187
  );
200
188
  }
201
189
  }
@@ -207,12 +195,11 @@
207
195
  block-size: var(--_sonic-marker-size);
208
196
  background: var(--_sonic-marker-colour);
209
197
  border-radius: 50%;
210
- box-shadow: 0 0 0 var(--_sonic-marker-edge) var(--_sonic-glass);
198
+ box-shadow: 0 0 0 var(--_sonic-marker-edge) var(--sonic-wavestrip-marker-edge, transparent);
211
199
  }
212
200
 
213
201
  .sonic-wavestrip-region {
214
- inset: calc(-1 * var(--_sonic-wavestrip-inset)) auto calc(-1 * var(--_sonic-wavestrip-inset))
215
- calc(var(--_sonic-marker-from, 0) * 100%);
202
+ inset: 0 auto 0 calc(var(--_sonic-marker-from, 0) * 100%);
216
203
  box-sizing: border-box;
217
204
  inline-size: calc((var(--_sonic-marker-to, 0) - var(--_sonic-marker-from, 0)) * 100%);
218
205
  background: color-mix(in oklab, var(--_sonic-marker-colour) 16%, transparent);
@@ -222,23 +209,15 @@
222
209
 
223
210
  /* Bare `block-start` spans the viewport; `translate` belongs to the open transition */
224
211
  .sonic-wavestrip-readout {
225
- --_sonic-wavestrip-readout-inset: calc(
226
- var(--_sonic-wavestrip-inset) + var(--_sonic-wavestrip-readout-at, 0) * 100cqi
227
- );
228
-
229
212
  inset-inline: 0;
230
213
  justify-self: start;
231
214
  position-area: block-start center;
232
215
  transform: translateX(
233
- clamp(
234
- 0px,
235
- var(--_sonic-wavestrip-readout-inset) - 50%,
236
- 100cqi + 2 * var(--_sonic-wavestrip-inset) - 100%
237
- )
216
+ clamp(0px, var(--_sonic-wavestrip-readout-at, 0) * 100cqi - 50%, 100cqi - 100%)
238
217
  );
239
218
  }
240
219
 
241
- /* Opaque, since a system highlight carries alpha that would blend the bars into the glass */
220
+ /* Opaque, since a system highlight carries alpha that would blend the bars into what is behind them */
242
221
  @media (forced-colors: active) {
243
222
  .sonic-wavestrip {
244
223
  --_sonic-wavestrip-lit: Highlight;
@@ -25,33 +25,30 @@
25
25
 
26
26
  .sonic-xy {
27
27
  --_sonic-xy-puck-ratio: var(--sonic-xy-puck-ratio, 0.2);
28
- --_sonic-xy-radius-ratio: var(--sonic-xy-radius-ratio, 0.06);
29
- --_sonic-xy-inset-ratio: var(--sonic-xy-inset-ratio, 0.04);
30
28
  --_sonic-unit: calc(var(--_sonic-xy-size) / 96);
31
29
  --_sonic-xy-lit: var(--_sonic-lit);
30
+ --_sonic-xy-puck-core: var(--_sonic-xy-lit);
32
31
  --_sonic-xy-cursor: grab;
33
32
  --_sonic-xy-puck: calc(var(--_sonic-xy-size) * var(--_sonic-xy-puck-ratio));
34
- --_sonic-xy-inset: calc(var(--_sonic-xy-size) * var(--_sonic-xy-inset-ratio));
35
- --_sonic-xy-travel-x: calc(100cqi - 2 * var(--_sonic-xy-inset) - var(--_sonic-xy-puck));
36
- --_sonic-xy-travel-y: calc(100cqb - 2 * var(--_sonic-xy-inset) - var(--_sonic-xy-puck));
33
+ --_sonic-xy-travel-x: calc(100cqi - var(--_sonic-xy-puck));
34
+ --_sonic-xy-travel-y: calc(100cqb - var(--_sonic-xy-puck));
37
35
 
36
+ /* fallow-ignore-next-line code-duplication -- a plain box restated, since sheets never import each other */
37
+ position: relative;
38
+ display: grid;
39
+ flex-shrink: 0;
40
+ grid-template: minmax(0, 1fr) / minmax(0, 1fr);
38
41
  inline-size: calc(var(--_sonic-xy-size) * var(--_sonic-xy-aspect-ratio));
39
42
  block-size: var(--_sonic-xy-size);
40
43
  container-type: size;
41
44
  touch-action: none;
42
45
  cursor: crosshair;
43
-
44
- --_sonic-xy-radius-own: calc(var(--_sonic-xy-size) * var(--sonic-xy-radius-ratio));
45
- --_sonic-glass-radius: var(
46
- --_sonic-xy-radius-own,
47
- var(--sonic-radius, calc(var(--_sonic-xy-size) * var(--_sonic-xy-radius-ratio)))
48
- );
49
-
50
- border-radius: var(--_sonic-glass-radius);
46
+ user-select: none;
51
47
  }
52
48
 
53
49
  :disabled > .sonic-xy {
54
50
  --_sonic-xy-lit: var(--_sonic-lit-disabled);
51
+ --_sonic-xy-puck-core: color-mix(in oklab, var(--_sonic-ink) 25%, var(--_sonic-unlit-solid));
55
52
  --_sonic-xy-cursor: default;
56
53
 
57
54
  cursor: default;
@@ -65,7 +62,7 @@
65
62
  --_sonic-xy-y-high: max(var(--_sonic-xy-y-origin, 0), var(--_sonic-xy-y, 0));
66
63
 
67
64
  position: absolute;
68
- inset: var(--_sonic-xy-inset);
65
+ inset: 0;
69
66
  pointer-events: none;
70
67
 
71
68
  &::before,
@@ -127,9 +124,8 @@
127
124
 
128
125
  :is(.sonic-xy-bracket, .sonic-xy-puck) {
129
126
  position: absolute;
130
- inset: auto auto
131
- calc(var(--_sonic-xy-inset) + var(--_sonic-xy-y, 0) * var(--_sonic-xy-travel-y))
132
- calc(var(--_sonic-xy-inset) + var(--_sonic-xy-x, 0) * var(--_sonic-xy-travel-x));
127
+ inset: auto auto calc(var(--_sonic-xy-y, 0) * var(--_sonic-xy-travel-y))
128
+ calc(var(--_sonic-xy-x, 0) * var(--_sonic-xy-travel-x));
133
129
  inline-size: var(--_sonic-xy-puck);
134
130
  block-size: var(--_sonic-xy-puck);
135
131
  border-radius: 50%;
@@ -140,11 +136,12 @@
140
136
  }
141
137
 
142
138
  .sonic-xy-puck {
143
- --_sonic-xy-puck-fill: var(--_sonic-xy-lit);
139
+ --_sonic-xy-puck-fill: var(--_sonic-xy-puck-core);
144
140
  --_sonic-xy-puck-edge: var(--_sonic-xy-puck-fill);
145
141
  --_sonic-xy-puck-lift: color-mix(in oklab, var(--_sonic-xy-lit) 85%, #fff);
146
142
  --_sonic-xy-puck-glow: transparent;
147
- --_sonic-xy-puck-ring: 0 0 transparent;
143
+ --_sonic-xy-puck-ring: transparent;
144
+ --_sonic-xy-puck-ring-width: max(2px, round(0.08 * var(--_sonic-xy-puck), var(--_sonic-snap)));
148
145
 
149
146
  cursor: var(--_sonic-xy-cursor);
150
147
  filter: drop-shadow(0 0 calc(0.15 * var(--_sonic-xy-puck)) var(--_sonic-xy-puck-glow));
@@ -154,15 +151,16 @@
154
151
  position: absolute;
155
152
  inset: 25%;
156
153
  pointer-events: none;
154
+ outline: var(--_sonic-xy-puck-ring-width) solid var(--_sonic-xy-puck-ring);
155
+ outline-offset: var(--_sonic-xy-puck-ring-width);
157
156
  content: '';
158
157
  background: var(--_sonic-xy-puck-fill);
159
158
  border: max(1px, 0.08 * var(--_sonic-xy-puck)) solid var(--_sonic-xy-puck-edge);
160
159
  border-radius: 50%;
161
- box-shadow: var(--_sonic-xy-puck-ring);
162
160
  transition:
163
161
  background-color var(--_sonic-fade-duration) ease-out,
164
162
  border-color var(--_sonic-fade-duration) ease-out,
165
- box-shadow var(--_sonic-fade-duration) ease-out;
163
+ outline-color var(--_sonic-fade-duration) ease-out;
166
164
  }
167
165
  }
168
166
 
@@ -174,14 +172,10 @@
174
172
 
175
173
  .sonic-xy-puck:has(> :focus-visible:not([data-sonic-pointer-focus])) {
176
174
  --_sonic-xy-puck-fill: var(--_sonic-xy-puck-lift);
177
- --_sonic-xy-puck-ring:
178
- 0 0 0 max(2px, round(0.08 * var(--_sonic-xy-puck), var(--_sonic-snap))) var(--_sonic-glass),
179
- 0 0 0 max(4px, round(0.16 * var(--_sonic-xy-puck), var(--_sonic-snap))) var(--_sonic-focus);
175
+ --_sonic-xy-puck-ring: var(--_sonic-focus);
180
176
  }
181
177
 
182
178
  :state(dragging) > .sonic-xy > .sonic-xy-puck {
183
- --_sonic-xy-puck-fill: var(--_sonic-glass);
184
- --_sonic-xy-puck-edge: var(--_sonic-xy-lit);
185
179
  --_sonic-xy-puck-glow: color-mix(
186
180
  in oklab,
187
181
  var(--_sonic-xy-lit) calc(30% * var(--_sonic-relief)),
@@ -200,7 +194,6 @@
200
194
  .sonic-xy {
201
195
  --_sonic-lit: Highlight;
202
196
  --_sonic-unlit: GrayText;
203
- --_sonic-glass: Canvas;
204
197
  }
205
198
 
206
199
  .sonic-xy-field {
@@ -211,9 +204,18 @@
211
204
  --_sonic-xy-puck-fill: CanvasText;
212
205
  --_sonic-xy-puck-lift: CanvasText;
213
206
  --_sonic-xy-puck-glow: transparent;
214
- --_sonic-xy-puck-ring: 0 0 transparent;
215
207
 
216
208
  forced-color-adjust: none;
209
+
210
+ /* The axis's own outline is the focus here */
211
+ &::before {
212
+ outline-style: none;
213
+ }
214
+ }
215
+
216
+ :state(dragging) > .sonic-xy > .sonic-xy-puck {
217
+ --_sonic-xy-puck-fill: Canvas;
218
+ --_sonic-xy-puck-edge: var(--_sonic-xy-lit);
217
219
  }
218
220
 
219
221
  .sonic-xy-axis {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsynaptic/sonic-ui",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "description": "Native custom elements for audio interfaces, skinned with CSS custom properties",
5
5
  "keywords": [
6
6
  "custom-elements",