@xsynaptic/sonic-ui 0.10.4 → 0.12.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 (55) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +5 -16
  3. package/dist/default/define/toggle.js +7 -0
  4. package/dist/default/define.js +1 -0
  5. package/dist/default/elements/button.js +2 -0
  6. package/dist/default/elements/position-group.js +163 -0
  7. package/dist/default/elements/radio-group.js +34 -12
  8. package/dist/default/elements/switch.js +33 -167
  9. package/dist/default/elements/toggle.js +189 -0
  10. package/dist/default/elements/waveform.js +30 -10
  11. package/dist/default/elements/wavestrip.js +4 -0
  12. package/dist/default/index.js +2 -1
  13. package/dist/default/lib/key-press.js +27 -0
  14. package/dist/default/lib/toggle-travel.js +19 -0
  15. package/dist/dev/define/toggle.d.ts +2 -0
  16. package/dist/dev/define/toggle.js +8 -0
  17. package/dist/dev/define/toggle.js.map +1 -0
  18. package/dist/dev/define.d.ts +3 -1
  19. package/dist/dev/define.js +1 -0
  20. package/dist/dev/elements/button.js +2 -0
  21. package/dist/dev/elements/button.js.map +1 -1
  22. package/dist/dev/elements/position-group.d.ts +38 -0
  23. package/dist/dev/elements/position-group.js +164 -0
  24. package/dist/dev/elements/position-group.js.map +1 -0
  25. package/dist/dev/elements/radio-group.d.ts +4 -0
  26. package/dist/dev/elements/radio-group.js +34 -12
  27. package/dist/dev/elements/radio-group.js.map +1 -1
  28. package/dist/dev/elements/switch.d.ts +4 -19
  29. package/dist/dev/elements/switch.js +33 -167
  30. package/dist/dev/elements/switch.js.map +1 -1
  31. package/dist/dev/elements/toggle.d.ts +21 -0
  32. package/dist/dev/elements/toggle.js +197 -0
  33. package/dist/dev/elements/toggle.js.map +1 -0
  34. package/dist/dev/elements/waveform.d.ts +1 -1
  35. package/dist/dev/elements/waveform.js +30 -10
  36. package/dist/dev/elements/waveform.js.map +1 -1
  37. package/dist/dev/elements/wavestrip.d.ts +1 -0
  38. package/dist/dev/elements/wavestrip.js +4 -0
  39. package/dist/dev/elements/wavestrip.js.map +1 -1
  40. package/dist/dev/index.d.ts +3 -2
  41. package/dist/dev/index.js +2 -1
  42. package/dist/dev/lib/key-press.js +28 -0
  43. package/dist/dev/lib/key-press.js.map +1 -0
  44. package/dist/dev/lib/toggle-travel.js +20 -0
  45. package/dist/dev/lib/toggle-travel.js.map +1 -0
  46. package/dist/styles/button.css +2 -2
  47. package/dist/styles/controls.css +1 -0
  48. package/dist/styles/led.css +16 -13
  49. package/dist/styles/material.css +36 -9
  50. package/dist/styles/meter.css +7 -6
  51. package/dist/styles/segmented.css +8 -4
  52. package/dist/styles/spectrum.css +2 -2
  53. package/dist/styles/switch.css +6 -2
  54. package/dist/styles/toggle.css +481 -0
  55. package/package.json +2 -1
@@ -84,7 +84,7 @@
84
84
  transition-delay: var(--sonic-button-busy-delay, 0s);
85
85
  }
86
86
 
87
- .sonic-button:active:where(:not(:disabled, [aria-disabled='true'])),
87
+ .sonic-button:is(:active, [data-sonic-pressed]):where(:not(:disabled, [aria-disabled='true'])),
88
88
  .sonic-button:is([aria-pressed='true'], :where([momentary]:state(pressed)) > *) {
89
89
  --_sonic-keycap-shift: calc(var(--_sonic-keycap-depth) / 2);
90
90
  --_sonic-keycap-scale: var(--_sonic-button-press-scale);
@@ -126,7 +126,7 @@
126
126
  [aria-disabled='true'],
127
127
  :where([momentary]:state(pressed), [armed]) > *,
128
128
  :where([busy]) > :not(:has(.sonic-led))
129
- ):is(:focus-visible, :active) {
129
+ ):is(:focus-visible, :active, [data-sonic-pressed]) {
130
130
  color: var(--_sonic-ink-lift);
131
131
  }
132
132
 
@@ -4,6 +4,7 @@
4
4
  @import './button.css';
5
5
  @import './led.css';
6
6
  @import './switch.css';
7
+ @import './toggle.css';
7
8
  @import './meter.css';
8
9
  @import './number.css';
9
10
  @import './panel.css';
@@ -8,7 +8,6 @@
8
8
  .sonic-led {
9
9
  --_sonic-led-size: var(--sonic-led-size, 0.5rem);
10
10
  --_sonic-led-lens-ratio: var(--sonic-led-lens-ratio, calc(0.8 - 0.175 * var(--_sonic-relief)));
11
- --_sonic-lit-alt: var(--sonic-lit-alt, oklch(79% 0.2 150deg));
12
11
  --_sonic-unit: calc(var(--_sonic-led-size) / 8);
13
12
  --_sonic-led-modelled: calc(100% * var(--_sonic-relief));
14
13
  --_sonic-led-bezel: var(
@@ -45,9 +44,9 @@
45
44
  }
46
45
 
47
46
  @media (forced-colors: active) {
48
- --_sonic-lit-alt: Mark;
49
- --_sonic-hot: Highlight;
50
- --_sonic-clip: Mark;
47
+ --_sonic-lit-ok: Mark;
48
+ --_sonic-lit-warning: Highlight;
49
+ --_sonic-lit-danger: Mark;
51
50
 
52
51
  forced-color-adjust: none;
53
52
  background: none;
@@ -59,21 +58,21 @@
59
58
  }
60
59
  }
61
60
 
62
- .sonic-led[data-sonic-lit='alt'] {
63
- --_sonic-lit: var(--_sonic-lit-alt);
61
+ .sonic-led[data-sonic-lit='ok'] {
62
+ --_sonic-lit: var(--_sonic-lit-ok);
64
63
  }
65
64
 
66
- .sonic-led[data-sonic-lit='hot'] {
67
- --_sonic-lit: var(--_sonic-hot);
65
+ .sonic-led[data-sonic-lit='warning'] {
66
+ --_sonic-lit: var(--_sonic-lit-warning);
68
67
  }
69
68
 
70
- .sonic-led[data-sonic-lit='clip'] {
71
- --_sonic-lit: var(--_sonic-clip);
69
+ .sonic-led[data-sonic-lit='danger'] {
70
+ --_sonic-lit: var(--_sonic-lit-danger);
72
71
  }
73
72
 
74
73
  /* Before the lit rule, which a latched button's LED also matches */
75
74
  .sonic-led:is(
76
- [data-sonic-lit='dim'],
75
+ [data-sonic-lit='idle'],
77
76
  :where(:is([armed], [busy]) > .sonic-button:not(:disabled, [aria-disabled='true'])) *
78
77
  ) {
79
78
  &::after {
@@ -91,11 +90,15 @@
91
90
  }
92
91
 
93
92
  .sonic-led:is(
94
- [data-sonic-lit]:where(:not([data-sonic-lit='dim'])),
93
+ [data-sonic-lit]:where(:not([data-sonic-lit='idle'])),
95
94
  :where(
96
95
  .sonic-button[aria-pressed='true'],
97
96
  [momentary]:state(pressed) > .sonic-button,
98
- .sonic-segmented-option[aria-checked='true']
97
+ .sonic-segmented-option[aria-checked='true'],
98
+ .sonic-toggle:has(
99
+ > [role='switch'][aria-checked='true'],
100
+ > [aria-checked='true'] [data-sonic-lit]
101
+ )
99
102
  )
100
103
  *,
101
104
  :where(:state(at-origin):not(:disabled) > .sonic-led)
@@ -31,6 +31,7 @@
31
31
  .sonic-button,
32
32
  .sonic-led,
33
33
  .sonic-switch,
34
+ .sonic-toggle,
34
35
  .sonic-meter,
35
36
  .sonic-number,
36
37
  .sonic-panel,
@@ -75,6 +76,7 @@
75
76
  .sonic-segmented-option,
76
77
  .sonic-slider,
77
78
  .sonic-spectrum,
79
+ .sonic-toggle,
78
80
  .sonic-waveform,
79
81
  .sonic-wavestrip,
80
82
  .sonic-xy
@@ -111,15 +113,17 @@
111
113
  --_sonic-lens: var(--_sonic-lens-glint), var(--_sonic-lens-glass);
112
114
  }
113
115
 
114
- :is(.sonic-led, .sonic-meter, .sonic-spectrum) {
115
- --_sonic-hot: var(--sonic-hot, oklch(70.5% 0.187 48deg));
116
- --_sonic-clip: var(--sonic-clip, oklch(63.7% 0.208 25deg));
116
+ :is(.sonic-led, .sonic-meter, .sonic-spectrum, .sonic-toggle) {
117
+ --_sonic-lit-ok: var(--sonic-lit-ok, oklch(79% 0.2 150deg));
118
+ --_sonic-lit-warning: var(--sonic-lit-warning, oklch(70.5% 0.187 48deg));
119
+ --_sonic-lit-danger: var(--sonic-lit-danger, oklch(63.7% 0.208 25deg));
117
120
  }
118
121
 
119
122
  :is(
120
123
  .sonic-dial,
121
124
  .sonic-button,
122
125
  .sonic-switch,
126
+ .sonic-toggle,
123
127
  .sonic-number,
124
128
  .sonic-segmented-option,
125
129
  .sonic-slider,
@@ -359,6 +363,7 @@
359
363
  .sonic-screen,
360
364
  .sonic-segmented,
361
365
  .sonic-spectrum,
366
+ .sonic-toggle,
362
367
  .sonic-waveform,
363
368
  .sonic-wavestrip,
364
369
  .sonic-xy
@@ -374,7 +379,7 @@
374
379
  rgb(255 255 255 / calc(0.06 * var(--_sonic-relief)));
375
380
  }
376
381
 
377
- :is(.sonic-button, .sonic-segmented) {
382
+ :is(.sonic-button, .sonic-segmented, .sonic-toggle) {
378
383
  --_sonic-well-floor: var(
379
384
  --sonic-well,
380
385
  linear-gradient(
@@ -402,7 +407,7 @@
402
407
  }
403
408
 
404
409
  /* On the option rather than the strip, where forced colours clear the drop shade */
405
- :is(.sonic-button, .sonic-segmented-option) {
410
+ :is(.sonic-button, .sonic-segmented-option, .sonic-toggle) {
406
411
  --_sonic-press-drop: calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y))
407
412
  var(--_sonic-unit) var(--_sonic-drop-shade);
408
413
  --_sonic-keycap-shift: calc(var(--_sonic-keycap-depth) / -2);
@@ -419,9 +424,23 @@
419
424
  0 0 var(--_sonic-unit)
420
425
  color-mix(in oklab, var(--_sonic-lit) calc(24% * var(--_sonic-relief)), transparent)
421
426
  );
427
+ --_sonic-legend-lit-from: var(--_sonic-lit);
428
+ --_sonic-legend-lit: color-mix(
429
+ in oklab,
430
+ var(--sonic-cap) 0%,
431
+ oklch(
432
+ from
433
+ color-mix(
434
+ in oklab,
435
+ oklch(from var(--_sonic-ink) l c h / clamp(0, (0.6 - l) * 1000, 1)),
436
+ oklch(from var(--_sonic-legend-lit-from) l c h / 0.1%)
437
+ )
438
+ l c h / 100%
439
+ )
440
+ );
422
441
  }
423
442
 
424
- :is(.sonic-button, .sonic-segmented-option, .sonic-switch-position) {
443
+ :is(.sonic-button, .sonic-segmented-option, .sonic-switch-position, .sonic-toggle-position) {
425
444
  --_sonic-target-outset: min(0px, calc((100% - var(--sonic-target-size, 100%)) / 2));
426
445
 
427
446
  &::after {
@@ -432,7 +451,7 @@
432
451
  }
433
452
 
434
453
  /* Each sheet maps its own depth, corner, bevel and face corner onto the `keycap` tokens */
435
- :is(.sonic-button-cap, .sonic-segmented-cap) {
454
+ :is(.sonic-button-cap, .sonic-segmented-cap, .sonic-toggle-cap) {
436
455
  display: grid;
437
456
  place-items: center;
438
457
  background: var(--_sonic-skirt);
@@ -679,7 +698,8 @@
679
698
  .sonic-number,
680
699
  .sonic-ring,
681
700
  .sonic-segmented-option,
682
- .sonic-slider
701
+ .sonic-slider,
702
+ .sonic-toggle
683
703
  ) {
684
704
  --_sonic-lit: Highlight;
685
705
  --_sonic-unlit: GrayText;
@@ -692,6 +712,7 @@
692
712
  .sonic-number,
693
713
  .sonic-segmented-option,
694
714
  .sonic-slider,
715
+ .sonic-toggle,
695
716
  .sonic-waveform,
696
717
  .sonic-wavestrip,
697
718
  .sonic-xy
@@ -737,7 +758,13 @@
737
758
  }
738
759
  }
739
760
 
740
- :is(.sonic-dial-cap, .sonic-button-cap, .sonic-segmented-cap, .sonic-slider-cap) {
761
+ :is(
762
+ .sonic-dial-cap,
763
+ .sonic-button-cap,
764
+ .sonic-segmented-cap,
765
+ .sonic-slider-cap,
766
+ .sonic-toggle-cap
767
+ ) {
741
768
  color: var(--_sonic-ink);
742
769
  forced-color-adjust: none;
743
770
  }
@@ -290,8 +290,9 @@
290
290
  background: linear-gradient(
291
291
  var(--_sonic-meter-toward),
292
292
  color-mix(in oklab, var(--_sonic-lit) 12%, var(--_sonic-unlit)) 0 var(--_sonic-meter-hot-at),
293
- color-mix(in oklab, var(--_sonic-hot) 12%, var(--_sonic-unlit)) 0 var(--_sonic-meter-clip-at),
294
- color-mix(in oklab, var(--_sonic-clip) 12%, var(--_sonic-unlit)) 0
293
+ color-mix(in oklab, var(--_sonic-lit-warning) 12%, var(--_sonic-unlit)) 0
294
+ var(--_sonic-meter-clip-at),
295
+ color-mix(in oklab, var(--_sonic-lit-danger) 12%, var(--_sonic-unlit)) 0
295
296
  );
296
297
  }
297
298
 
@@ -318,8 +319,8 @@
318
319
  background: linear-gradient(
319
320
  var(--_sonic-meter-toward),
320
321
  var(--_sonic-lit) 0 var(--_sonic-meter-hot-at),
321
- var(--_sonic-hot) 0 var(--_sonic-meter-clip-at),
322
- var(--_sonic-clip) 0
322
+ var(--_sonic-lit-warning) 0 var(--_sonic-meter-clip-at),
323
+ var(--_sonic-lit-danger) 0
323
324
  );
324
325
  mask:
325
326
  linear-gradient(
@@ -347,8 +348,8 @@
347
348
  content: '';
348
349
  background: radial-gradient(
349
350
  closest-side,
350
- color-mix(in oklab, var(--_sonic-clip) 55%, #fff),
351
- var(--_sonic-clip)
351
+ color-mix(in oklab, var(--_sonic-lit-danger) 55%, #fff),
352
+ var(--_sonic-lit-danger)
352
353
  );
353
354
  border-radius: inherit;
354
355
  opacity: var(--_sonic-meter-clipped, 0);
@@ -78,7 +78,7 @@
78
78
  transition: color 120ms ease-out;
79
79
  }
80
80
 
81
- .sonic-segmented-option:where([data-sonic-pressed], :focus-visible:active):not(:disabled),
81
+ .sonic-segmented-option:where([data-sonic-pressed]):not(:disabled),
82
82
  .sonic-segmented-option[aria-checked='true'] {
83
83
  --_sonic-keycap-shift: calc(var(--_sonic-keycap-depth) / 2);
84
84
  --_sonic-keycap-scale: var(--_sonic-segmented-press-scale);
@@ -88,7 +88,7 @@
88
88
  .sonic-segmented-option[aria-checked='true'] {
89
89
  --_sonic-keycap-glow: var(--_sonic-keycap-lit-glow);
90
90
 
91
- color: var(--_sonic-lit);
91
+ color: var(--_sonic-legend-lit, var(--_sonic-lit));
92
92
  background: var(--_sonic-segmented-well-lit);
93
93
  box-shadow: var(--_sonic-well);
94
94
  }
@@ -115,12 +115,16 @@
115
115
  }
116
116
 
117
117
  .sonic-segmented-option[aria-checked='true']:not(:disabled):focus-visible {
118
- color: var(--sonic-lit-hover, var(--_sonic-lit));
118
+ --_sonic-legend-lit-from: var(--sonic-lit-hover, var(--_sonic-lit));
119
+
120
+ color: var(--_sonic-legend-lit, var(--_sonic-legend-lit-from));
119
121
  }
120
122
 
121
123
  @media (hover: hover) {
122
124
  .sonic-segmented-option[aria-checked='true']:not(:disabled):hover {
123
- color: var(--sonic-lit-hover, var(--_sonic-lit));
125
+ --_sonic-legend-lit-from: var(--sonic-lit-hover, var(--_sonic-lit));
126
+
127
+ color: var(--_sonic-legend-lit, var(--_sonic-legend-lit-from));
124
128
  }
125
129
  }
126
130
 
@@ -67,8 +67,8 @@
67
67
  .sonic-spectrum {
68
68
  --_sonic-unit: calc(var(--_sonic-spectrum-size) / 48);
69
69
  --_sonic-spectrum-lit: var(--_sonic-lit);
70
- --_sonic-spectrum-hot: var(--_sonic-hot);
71
- --_sonic-spectrum-clip: var(--_sonic-clip);
70
+ --_sonic-spectrum-hot: var(--_sonic-lit-warning);
71
+ --_sonic-spectrum-clip: var(--_sonic-lit-danger);
72
72
  --_sonic-spectrum-grid: color-mix(in oklab, var(--_sonic-glass-text) 20%, transparent);
73
73
  --_sonic-spectrum-hot-from: var(--sonic-spectrum-hot-from, -12);
74
74
  --_sonic-spectrum-clip-from: var(--sonic-spectrum-clip-from, -3);
@@ -127,6 +127,10 @@
127
127
  }
128
128
  }
129
129
 
130
+ .sonic-switch-position:disabled > .sonic-switch-label {
131
+ color: color-mix(in oklab, currentcolor 30%, transparent);
132
+ }
133
+
130
134
  .sonic-switch[data-sonic-position-count] {
131
135
  & > :is(.sonic-switch-bushing, .sonic-switch-bat) {
132
136
  grid-area: 2 / 1 / -2 / 2;
@@ -350,7 +354,7 @@
350
354
  --_sonic-focus-shadow: var(--_sonic-focus-glow);
351
355
  }
352
356
 
353
- .sonic-switch:has(> .sonic-switch-position:disabled) {
357
+ .sonic-switch:not(:has(> .sonic-switch-position:not(:disabled))) {
354
358
  --_sonic-switch-disabled: color-mix(
355
359
  in oklab,
356
360
  var(--_sonic-ink) 30%,
@@ -371,7 +375,7 @@
371
375
  --_sonic-switch-metal-shade: CanvasText;
372
376
  }
373
377
 
374
- .sonic-switch:has(> .sonic-switch-position:disabled) {
378
+ .sonic-switch:not(:has(> .sonic-switch-position:not(:disabled))) {
375
379
  --_sonic-switch-metal: GrayText;
376
380
  --_sonic-switch-metal-shade: GrayText;
377
381
  }