@xsynaptic/sonic-ui 0.24.0 → 0.25.1

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 (111) hide show
  1. package/CHANGELOG.md +34 -2
  2. package/README.md +5 -3
  3. package/dist/default/define/region.js +7 -0
  4. package/dist/default/define.js +1 -0
  5. package/dist/default/elements/envelope.js +11 -11
  6. package/dist/default/elements/form-element.js +10 -0
  7. package/dist/default/elements/readout.js +3 -2
  8. package/dist/default/elements/region-layer.js +251 -0
  9. package/dist/default/elements/region.js +157 -0
  10. package/dist/default/elements/sonic-element.js +26 -4
  11. package/dist/default/elements/split.js +2 -2
  12. package/dist/default/elements/toggle.js +2 -2
  13. package/dist/default/elements/value-element.js +9 -5
  14. package/dist/default/elements/value-gestures.js +7 -5
  15. package/dist/default/elements/wave-element.js +12 -3
  16. package/dist/default/elements/waveform.js +38 -2
  17. package/dist/default/elements/wavestrip.js +90 -17
  18. package/dist/default/elements/xy.js +3 -11
  19. package/dist/default/index.js +2 -1
  20. package/dist/default/lib/clock.js +1 -0
  21. package/dist/default/lib/drag-step.js +1 -1
  22. package/dist/default/lib/marker-band.js +40 -29
  23. package/dist/default/lib/region-drag.js +48 -0
  24. package/dist/default/lib/spoken-duration.js +3 -0
  25. package/dist/dev/define/region.d.ts +2 -0
  26. package/dist/dev/define/region.js +8 -0
  27. package/dist/dev/define/region.js.map +1 -0
  28. package/dist/dev/define.d.ts +3 -1
  29. package/dist/dev/define.js +1 -0
  30. package/dist/dev/elements/envelope.js +11 -11
  31. package/dist/dev/elements/envelope.js.map +1 -1
  32. package/dist/dev/elements/form-element.d.ts +1 -0
  33. package/dist/dev/elements/form-element.js +10 -0
  34. package/dist/dev/elements/form-element.js.map +1 -1
  35. package/dist/dev/elements/readout.js +3 -2
  36. package/dist/dev/elements/readout.js.map +1 -1
  37. package/dist/dev/elements/region-layer.js +252 -0
  38. package/dist/dev/elements/region-layer.js.map +1 -0
  39. package/dist/dev/elements/region.d.ts +29 -0
  40. package/dist/dev/elements/region.js +165 -0
  41. package/dist/dev/elements/region.js.map +1 -0
  42. package/dist/dev/elements/sonic-element.d.ts +1 -0
  43. package/dist/dev/elements/sonic-element.js +27 -5
  44. package/dist/dev/elements/sonic-element.js.map +1 -1
  45. package/dist/dev/elements/split.js +2 -2
  46. package/dist/dev/elements/split.js.map +1 -1
  47. package/dist/dev/elements/toggle.js +2 -2
  48. package/dist/dev/elements/toggle.js.map +1 -1
  49. package/dist/dev/elements/value-element.d.ts +3 -1
  50. package/dist/dev/elements/value-element.js +9 -5
  51. package/dist/dev/elements/value-element.js.map +1 -1
  52. package/dist/dev/elements/value-gestures.js +7 -5
  53. package/dist/dev/elements/value-gestures.js.map +1 -1
  54. package/dist/dev/elements/wave-element.d.ts +7 -1
  55. package/dist/dev/elements/wave-element.js +12 -3
  56. package/dist/dev/elements/wave-element.js.map +1 -1
  57. package/dist/dev/elements/waveform.d.ts +7 -0
  58. package/dist/dev/elements/waveform.js +38 -2
  59. package/dist/dev/elements/waveform.js.map +1 -1
  60. package/dist/dev/elements/wavestrip.d.ts +17 -1
  61. package/dist/dev/elements/wavestrip.js +90 -17
  62. package/dist/dev/elements/wavestrip.js.map +1 -1
  63. package/dist/dev/elements/xy.js +3 -11
  64. package/dist/dev/elements/xy.js.map +1 -1
  65. package/dist/dev/index.d.ts +3 -2
  66. package/dist/dev/index.js +2 -1
  67. package/dist/dev/lib/clock.js +1 -0
  68. package/dist/dev/lib/clock.js.map +1 -1
  69. package/dist/dev/lib/drag-step.js +1 -1
  70. package/dist/dev/lib/drag-step.js.map +1 -1
  71. package/dist/dev/lib/marker-band.d.ts +7 -0
  72. package/dist/dev/lib/marker-band.js +40 -29
  73. package/dist/dev/lib/marker-band.js.map +1 -1
  74. package/dist/dev/lib/region-drag.js +49 -0
  75. package/dist/dev/lib/region-drag.js.map +1 -0
  76. package/dist/dev/lib/spoken-duration.js +3 -0
  77. package/dist/dev/lib/spoken-duration.js.map +1 -1
  78. package/dist/styles/button.css +42 -15
  79. package/dist/styles/controls.css +1 -0
  80. package/dist/styles/dial.css +48 -33
  81. package/dist/styles/envelope.css +7 -6
  82. package/dist/styles/led.css +28 -13
  83. package/dist/styles/material/arc.css +2 -2
  84. package/dist/styles/material/cap.css +25 -15
  85. package/dist/styles/material/core.css +53 -1
  86. package/dist/styles/material/glass.css +12 -2
  87. package/dist/styles/material/groove.css +3 -3
  88. package/dist/styles/material/keycap.css +5 -5
  89. package/dist/styles/material/lens.css +1 -1
  90. package/dist/styles/material/pane.css +21 -11
  91. package/dist/styles/material/readout.css +23 -10
  92. package/dist/styles/material/{bracket.css → reticle.css} +15 -8
  93. package/dist/styles/material/scale.css +4 -4
  94. package/dist/styles/material/value.css +12 -3
  95. package/dist/styles/material/well.css +2 -2
  96. package/dist/styles/material.css +1 -1
  97. package/dist/styles/meter.css +24 -11
  98. package/dist/styles/number.css +2 -1
  99. package/dist/styles/panel.css +5 -6
  100. package/dist/styles/region.css +88 -0
  101. package/dist/styles/ring.css +5 -4
  102. package/dist/styles/screen.css +7 -5
  103. package/dist/styles/segmented.css +8 -7
  104. package/dist/styles/slider.css +40 -32
  105. package/dist/styles/spectrum.css +9 -1
  106. package/dist/styles/switch.css +52 -53
  107. package/dist/styles/toggle.css +33 -38
  108. package/dist/styles/waveform.css +5 -4
  109. package/dist/styles/wavestrip.css +15 -12
  110. package/dist/styles/xy.css +19 -19
  111. package/package.json +3 -2
@@ -19,8 +19,9 @@
19
19
  block-size: var(--_sonic-led-size);
20
20
  background: var(--_sonic-lens-bezel);
21
21
  border-radius: 50%;
22
+ }
22
23
 
23
- &::after {
24
+ .sonic-led::after {
24
25
  position: absolute;
25
26
  inset: calc(var(--_sonic-led-size) * (1 - var(--_sonic-led-lens-ratio)) / 2);
26
27
  content: '';
@@ -29,19 +30,20 @@
29
30
  }
30
31
 
31
32
  @media (forced-colors: active) {
33
+ .sonic-led {
32
34
  --_sonic-lit-ok: Mark;
33
35
  --_sonic-lit-warning: Highlight;
34
36
  --_sonic-lit-danger: Mark;
35
37
 
36
38
  forced-color-adjust: none;
37
39
  background: none;
40
+ }
38
41
 
39
- &::after {
42
+ .sonic-led::after {
40
43
  background: GrayText;
41
44
  box-shadow: 0 0 0 1px CanvasText;
42
45
  }
43
46
  }
44
- }
45
47
 
46
48
  .sonic-led[data-sonic-lit='ok'] {
47
49
  --_sonic-lit: var(--_sonic-lit-ok);
@@ -56,23 +58,18 @@
56
58
  }
57
59
 
58
60
  /* Before the lit rule, which a latched button's LED also matches */
59
- .sonic-led:is(
60
- [data-sonic-lit='idle'],
61
- :where(:is([armed], [busy]) > .sonic-button:not(:disabled, [aria-disabled='true'])) *
62
- ) {
63
- &::after {
61
+ .sonic-led:is([data-sonic-lit='idle'],:where(:is([armed],[busy]) > .sonic-button:not(:disabled,[aria-disabled='true'])) *)::after {
64
62
  background:
65
63
  var(--_sonic-lens-glint),
66
64
  color-mix(in oklab, var(--_sonic-lit) 35%, var(--_sonic-lens-glass));
67
65
  }
68
66
 
69
67
  @media (forced-colors: active) {
70
- &::after {
68
+ .sonic-led:is([data-sonic-lit='idle'],:where(:is([armed],[busy]) > .sonic-button:not(:disabled,[aria-disabled='true'])) *)::after {
71
69
  background: GrayText;
72
70
  box-shadow: 0 0 0 1px var(--_sonic-lit);
73
71
  }
74
72
  }
75
- }
76
73
 
77
74
  .sonic-led:is(
78
75
  [data-sonic-lit]:where(:not([data-sonic-lit='idle'])),
@@ -96,8 +93,10 @@
96
93
  transparent
97
94
  ),
98
95
  var(--_sonic-lens-bezel);
96
+ }
99
97
 
100
- &::after {
98
+ .sonic-led:is([data-sonic-lit]:where(:not([data-sonic-lit='idle'])),:where(.sonic-button:is([aria-pressed='true'],[aria-expanded='true']),[momentary]:state(pressed) > .sonic-button,.sonic-segmented-option[aria-checked='true'],.sonic-toggle:has( > [role='switch'][aria-checked='true'], > [aria-checked='true'] [data-sonic-lit]))
99
+ *,:where(:state(at-origin):not(:disabled) > .sonic-led))::after {
101
100
  background: radial-gradient(
102
101
  closest-side,
103
102
  color-mix(
@@ -110,14 +109,30 @@
110
109
  }
111
110
 
112
111
  @media (forced-colors: active) {
112
+
113
+ .sonic-led:is(
114
+ [data-sonic-lit]:where(:not([data-sonic-lit='idle'])),
115
+ :where(
116
+ .sonic-button:is([aria-pressed='true'], [aria-expanded='true']),
117
+ [momentary]:state(pressed) > .sonic-button,
118
+ .sonic-segmented-option[aria-checked='true'],
119
+ .sonic-toggle:has(
120
+ > [role='switch'][aria-checked='true'],
121
+ > [aria-checked='true'] [data-sonic-lit]
122
+ )
123
+ )
124
+ *,
125
+ :where(:state(at-origin):not(:disabled) > .sonic-led)
126
+ ) {
113
127
  background: none;
128
+ }
114
129
 
115
- &::after {
130
+ .sonic-led:is([data-sonic-lit]:where(:not([data-sonic-lit='idle'])),:where(.sonic-button:is([aria-pressed='true'],[aria-expanded='true']),[momentary]:state(pressed) > .sonic-button,.sonic-segmented-option[aria-checked='true'],.sonic-toggle:has( > [role='switch'][aria-checked='true'], > [aria-checked='true'] [data-sonic-lit]))
131
+ *,:where(:state(at-origin):not(:disabled) > .sonic-led))::after {
116
132
  background: var(--_sonic-lit);
117
133
  box-shadow: 0 0 0 1px CanvasText;
118
134
  }
119
135
  }
120
- }
121
136
 
122
137
  :is(.sonic-button:is(:disabled, [aria-disabled='true']), .sonic-segmented-option:disabled)
123
138
  .sonic-led {
@@ -13,10 +13,10 @@
13
13
  );
14
14
  --_sonic-arc-shade: radial-gradient(
15
15
  closest-side,
16
- rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-relief)))
16
+ color-mix(in srgb, var(--_sonic-shade) calc(55% * var(--_sonic-relief)), transparent)
17
17
  calc(100% - var(--_sonic-arc-width)),
18
18
  transparent calc(100% - var(--_sonic-arc-width) * 0.4),
19
- rgb(from var(--_sonic-shade) r g b / calc(0.25 * var(--_sonic-relief))) 100%
19
+ color-mix(in srgb, var(--_sonic-shade) calc(25% * var(--_sonic-relief)), transparent) 100%
20
20
  );
21
21
  }
22
22
  }
@@ -50,9 +50,9 @@
50
50
  --_sonic-sheen: linear-gradient(
51
51
  calc(var(--_sonic-light-fall) - 58deg),
52
52
  transparent 20%,
53
- rgb(from var(--_sonic-shine) r g b / calc(0.1 * var(--_sonic-relief))) 45%,
53
+ color-mix(in srgb, var(--_sonic-shine) calc(10% * var(--_sonic-relief)), transparent) 45%,
54
54
  transparent 55%,
55
- rgb(from var(--_sonic-shade) r g b / calc(0.06 * var(--_sonic-relief))) 80%
55
+ color-mix(in srgb, var(--_sonic-shade) calc(6% * var(--_sonic-relief)), transparent) 80%
56
56
  );
57
57
  --_sonic-press-transition:
58
58
  scale var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1),
@@ -60,9 +60,9 @@
60
60
  box-shadow var(--_sonic-press-duration) cubic-bezier(0.4, 0, 0.2, 1);
61
61
  --_sonic-face-shadow:
62
62
  inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(1.5 * var(--_sonic-unit))
63
- rgb(from var(--_sonic-shade) r g b / calc(0.35 * var(--_sonic-relief))),
63
+ color-mix(in srgb, var(--_sonic-shade) calc(35% * var(--_sonic-relief)), transparent),
64
64
  calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) var(--_sonic-unit)
65
- rgb(from var(--_sonic-shine) r g b / calc(0.12 * var(--_sonic-relief)));
65
+ color-mix(in srgb, var(--_sonic-shine) calc(12% * var(--_sonic-relief)), transparent);
66
66
  --_sonic-rim-width: max(1px, round(0.75 * var(--_sonic-unit), var(--_sonic-snap)));
67
67
  --_sonic-rim: 0 0 0 var(--_sonic-rim-width)
68
68
  var(
@@ -73,7 +73,11 @@
73
73
  var(--_sonic-shade)
74
74
  )
75
75
  );
76
- --_sonic-drop-shade: rgb(from var(--_sonic-shade) r g b / calc(0.65 * var(--_sonic-relief)));
76
+ --_sonic-drop-shade: color-mix(
77
+ in srgb,
78
+ var(--_sonic-shade) calc(65% * var(--_sonic-relief)),
79
+ transparent
80
+ );
77
81
  --_sonic-focus-shadow: 0 0 transparent;
78
82
  --_sonic-focus-glow: 0 0 max(4px, 3 * var(--_sonic-unit)) max(1px, 0.5 * var(--_sonic-unit))
79
83
  color-mix(in oklab, var(--_sonic-focus) calc(60% * var(--_sonic-focus-strength)), transparent);
@@ -84,7 +88,13 @@
84
88
  }
85
89
 
86
90
  /* A plain box has no corner of its own, so its focus outline and glow take this one */
87
- :is(.sonic-number, .sonic-slider, .sonic-switch-position, .sonic-waveform, .sonic-wavestrip) {
91
+ :is(
92
+ .sonic-number,
93
+ .sonic-slider,
94
+ .sonic-switch-position,
95
+ .sonic-waveform,
96
+ .sonic-wavestrip-canvas
97
+ ) {
88
98
  border-radius: var(--sonic-focus-radius, 0);
89
99
  }
90
100
 
@@ -97,13 +107,13 @@
97
107
 
98
108
  :is(.sonic-button, .sonic-segmented-option, .sonic-switch-position, .sonic-toggle-position) {
99
109
  --_sonic-target-outset: min(0px, calc((100% - var(--sonic-target-size, 100%)) / 2));
110
+ }
100
111
 
101
- &::after {
112
+ :is(.sonic-button,.sonic-segmented-option,.sonic-switch-position,.sonic-toggle-position)::after {
102
113
  position: absolute;
103
114
  inset: var(--_sonic-target-outset);
104
115
  content: '';
105
116
  }
106
- }
107
117
 
108
118
  @media not (forced-colors: active) {
109
119
  :is(
@@ -141,23 +151,23 @@
141
151
  .sonic-segmented-option,
142
152
  .sonic-slider,
143
153
  .sonic-waveform,
144
- .sonic-wavestrip,
154
+ .sonic-wavestrip-canvas,
145
155
  .sonic-xy-axis
146
156
  ):focus-visible {
147
157
  outline: 2px solid transparent;
148
158
  outline-offset: var(--sonic-focus-outline-offset, -2px);
159
+ }
149
160
 
150
- &:not([data-sonic-pointer-focus]) {
161
+ :is(.sonic-dial,.sonic-button,.sonic-number,.sonic-segmented-option,.sonic-slider,.sonic-waveform,.sonic-wavestrip-canvas,.sonic-xy-axis):focus-visible:not([data-sonic-pointer-focus]) {
151
162
  --_sonic-cap: var(--_sonic-cap-hover);
152
163
  --_sonic-focus-shadow: var(--_sonic-focus-glow);
153
164
  }
154
- }
155
165
 
156
166
  :is(
157
167
  .sonic-number,
158
168
  .sonic-slider,
159
169
  .sonic-waveform,
160
- .sonic-wavestrip,
170
+ .sonic-wavestrip-canvas,
161
171
  .sonic-xy-axis
162
172
  ):focus-visible:not([data-sonic-pointer-focus]) {
163
173
  outline: var(--sonic-focus-outline, 2px solid transparent);
@@ -226,14 +236,14 @@
226
236
  .sonic-segmented-option,
227
237
  .sonic-slider,
228
238
  .sonic-waveform,
229
- .sonic-wavestrip
239
+ .sonic-wavestrip-canvas
230
240
  ):focus-visible {
231
241
  outline-offset: 2px;
242
+ }
232
243
 
233
- &[data-sonic-pointer-focus] {
244
+ [data-sonic-pointer-focus]:is(.sonic-dial,.sonic-button,.sonic-number,.sonic-segmented-option,.sonic-slider,.sonic-waveform,.sonic-wavestrip-canvas):focus-visible {
234
245
  outline-style: none;
235
246
  }
236
- }
237
247
 
238
248
  :is(
239
249
  .sonic-dial-cap,
@@ -49,15 +49,67 @@
49
49
  --_sonic-cast-x: calc(sin(var(--_sonic-light-tilt)) * var(--_sonic-unit));
50
50
  --_sonic-cast-y: calc(cos(var(--_sonic-light-tilt)) * var(--_sonic-unit));
51
51
  --_sonic-snap: 1px;
52
+ }
52
53
 
53
54
  @media (resolution >= 2dppx) {
55
+ :is(
56
+ .sonic-dial,
57
+ .sonic-dial-readout,
58
+ .sonic-envelope,
59
+ .sonic-envelope-readout,
60
+ .sonic-button,
61
+ .sonic-led,
62
+ .sonic-switch,
63
+ .sonic-toggle,
64
+ .sonic-meter,
65
+ .sonic-number,
66
+ .sonic-panel,
67
+ .sonic-ring,
68
+ .sonic-screen,
69
+ .sonic-segmented,
70
+ .sonic-slider,
71
+ .sonic-slider-readout,
72
+ .sonic-spectrum,
73
+ .sonic-waveform,
74
+ .sonic-waveform-readout,
75
+ .sonic-wavestrip,
76
+ .sonic-wavestrip-readout,
77
+ .sonic-xy,
78
+ .sonic-xy-readout
79
+ ) {
54
80
  --_sonic-snap: 0.5px;
81
+ }
55
82
  }
56
83
 
57
84
  @media (resolution >= 3dppx) {
85
+ :is(
86
+ .sonic-dial,
87
+ .sonic-dial-readout,
88
+ .sonic-envelope,
89
+ .sonic-envelope-readout,
90
+ .sonic-button,
91
+ .sonic-led,
92
+ .sonic-switch,
93
+ .sonic-toggle,
94
+ .sonic-meter,
95
+ .sonic-number,
96
+ .sonic-panel,
97
+ .sonic-ring,
98
+ .sonic-screen,
99
+ .sonic-segmented,
100
+ .sonic-slider,
101
+ .sonic-slider-readout,
102
+ .sonic-spectrum,
103
+ .sonic-waveform,
104
+ .sonic-waveform-readout,
105
+ .sonic-wavestrip,
106
+ .sonic-wavestrip-readout,
107
+ .sonic-xy,
108
+ .sonic-xy-readout
109
+ ) {
58
110
  --_sonic-snap: calc(1px / 3);
59
- }
60
111
  }
112
+ }
61
113
 
62
114
  :is(
63
115
  .sonic-dial,
@@ -14,7 +14,7 @@
14
14
  color-mix(
15
15
  in oklab,
16
16
  var(--_sonic-glass-slab) calc(100% * var(--_sonic-relief)),
17
- light-dark(oklch(97% 0.003 286deg), var(--_sonic-glass-slab))
17
+ color-mix(in oklab, Canvas 97%, #000)
18
18
  )
19
19
  );
20
20
  --_sonic-glass: var(--_sonic-glass-own, var(--_sonic-glass-base));
@@ -49,8 +49,18 @@
49
49
  );
50
50
 
51
51
  /* Glass is forced to Canvas like the page, so only a border shows its edge */
52
+ }
52
53
  @media (forced-colors: active) {
54
+ :is(
55
+ .sonic-dial-readout,
56
+ .sonic-envelope-readout,
57
+ .sonic-screen,
58
+ .sonic-slider-readout,
59
+ .sonic-waveform-readout,
60
+ .sonic-wavestrip-readout,
61
+ .sonic-xy-readout
62
+ ) {
53
63
  --_sonic-glass-edge: 1px solid CanvasText;
54
- }
55
64
  }
65
+ }
56
66
  }
@@ -2,10 +2,10 @@
2
2
  :is(.sonic-meter, .sonic-slider) {
3
3
  --_sonic-groove:
4
4
  inset var(--_sonic-cast-x) var(--_sonic-cast-y) calc(0.75 * var(--_sonic-unit))
5
- rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-relief))),
5
+ color-mix(in srgb, var(--_sonic-shade) calc(55% * var(--_sonic-relief)), transparent),
6
6
  inset 0 0 calc(0.5 * var(--_sonic-unit))
7
- rgb(from var(--_sonic-shade) r g b / calc(0.3 * var(--_sonic-relief))),
7
+ color-mix(in srgb, var(--_sonic-shade) calc(30% * var(--_sonic-relief)), transparent),
8
8
  calc(0.5 * var(--_sonic-cast-x)) calc(0.5 * var(--_sonic-cast-y)) 0
9
- rgb(from var(--_sonic-shine) r g b / calc(0.06 * var(--_sonic-relief)));
9
+ color-mix(in srgb, var(--_sonic-shine) calc(6% * var(--_sonic-relief)), transparent);
10
10
  }
11
11
  }
@@ -19,11 +19,11 @@
19
19
  --_sonic-engraving: drop-shadow(
20
20
  calc(-0.4 * var(--_sonic-cast-x)) calc(-0.4 * var(--_sonic-cast-y))
21
21
  calc(0.4 * var(--_sonic-unit))
22
- rgb(from var(--_sonic-shade) r g b / calc(0.3 * var(--_sonic-relief)))
22
+ color-mix(in srgb, var(--_sonic-shade) calc(30% * var(--_sonic-relief)), transparent)
23
23
  )
24
24
  drop-shadow(
25
25
  calc(0.3 * var(--_sonic-cast-x)) calc(0.3 * var(--_sonic-cast-y)) 0
26
- rgb(from var(--_sonic-shine) r g b / calc(0.07 * var(--_sonic-relief)))
26
+ color-mix(in srgb, var(--_sonic-shine) calc(7% * var(--_sonic-relief)), transparent)
27
27
  );
28
28
  }
29
29
 
@@ -77,8 +77,9 @@
77
77
  scale: var(--_sonic-keycap-scale);
78
78
  translate: 0 var(--_sonic-keycap-shift);
79
79
  transition: var(--_sonic-press-transition);
80
+ }
80
81
 
81
- &::before {
82
+ :is(.sonic-button-cap,.sonic-segmented-cap,.sonic-toggle-cap)::before {
82
83
  position: absolute;
83
84
  inset: var(--_sonic-keycap-bevel);
84
85
  content: '';
@@ -89,8 +90,7 @@
89
90
  box-shadow: var(--_sonic-face-shadow);
90
91
  }
91
92
 
92
- & > * {
93
+ :is(.sonic-button-cap,.sonic-segmented-cap,.sonic-toggle-cap) > * {
93
94
  position: relative;
94
95
  }
95
- }
96
96
  }
@@ -2,7 +2,7 @@
2
2
  :is(.sonic-led, .sonic-meter) {
3
3
  --_sonic-lens-glint: linear-gradient(
4
4
  var(--_sonic-light-fall),
5
- rgb(from var(--_sonic-shine) r g b / calc(0.1 * var(--_sonic-relief))),
5
+ color-mix(in srgb, var(--_sonic-shine) calc(10% * var(--_sonic-relief)), transparent),
6
6
  transparent 60%
7
7
  );
8
8
  --_sonic-lens-modelled: calc(100% * var(--_sonic-relief));
@@ -21,12 +21,16 @@
21
21
  color: var(--_sonic-glass-text);
22
22
  background: var(--_sonic-glass-fill);
23
23
  border: var(--_sonic-glass-edge);
24
+ }
24
25
 
25
26
  @media (forced-colors: active) {
27
+
28
+ .sonic-screen {
26
29
  --_sonic-glass-texture: 0;
30
+ }
27
31
  }
28
32
 
29
- &::after {
33
+ .sonic-screen::after {
30
34
  position: absolute;
31
35
  inset: 0;
32
36
  pointer-events: none;
@@ -34,30 +38,38 @@
34
38
  background:
35
39
  linear-gradient(
36
40
  var(--_sonic-light-fall),
37
- rgb(from var(--_sonic-shine) r g b / calc(0.07 * var(--_sonic-glass-depth))),
41
+ color-mix(in srgb, var(--_sonic-shine) calc(7% * var(--_sonic-glass-depth)), transparent),
38
42
  transparent 45%
39
43
  ),
40
44
  radial-gradient(
41
45
  farthest-corner,
42
46
  transparent 55%,
43
- rgb(from var(--_sonic-shade) r g b / calc(0.4 * var(--_sonic-glass-texture)))
47
+ color-mix(
48
+ in srgb,
49
+ var(--_sonic-shade) calc(40% * var(--_sonic-glass-texture)),
50
+ transparent
51
+ )
44
52
  ),
45
53
  repeating-linear-gradient(
46
54
  to bottom,
47
- rgb(from var(--_sonic-shade) r g b / calc(0.025 * var(--_sonic-glass-texture))) 0
48
- calc(var(--_sonic-glass-pitch) / 2),
55
+ color-mix(
56
+ in srgb,
57
+ var(--_sonic-shade) calc(2.5% * var(--_sonic-glass-texture)),
58
+ transparent
59
+ )
60
+ 0 calc(var(--_sonic-glass-pitch) / 2),
49
61
  transparent 0 var(--_sonic-glass-pitch)
50
62
  );
51
63
  border-radius: inherit;
52
64
  box-shadow:
53
65
  var(--_sonic-well),
54
66
  inset 0 0 calc(3 * var(--_sonic-glass-depth) * var(--_sonic-unit))
55
- rgb(from var(--_sonic-shade) r g b / 45%);
67
+ color-mix(in srgb, var(--_sonic-shade) 45%, transparent);
56
68
  }
57
69
 
58
70
  @media (forced-colors: none) {
59
71
  /* No var() beside the tile, which would parse the url() again on every style recalculation */
60
- &::before {
72
+ .sonic-screen::before {
61
73
  position: absolute;
62
74
  inset: 0;
63
75
  color: color-mix(in oklab, var(--_sonic-glass-text) 7.5%, transparent);
@@ -72,17 +84,15 @@
72
84
  }
73
85
 
74
86
  @media (prefers-reduced-motion: no-preference) {
75
- &:is(:focus-visible, :focus-within)::before,
76
- &:has(:state(dragging))::before {
87
+ .sonic-screen:is(:focus-visible,:focus-within)::before,.sonic-screen:has(:state(dragging))::before {
77
88
  animation: sonic-glass-breathe 3s ease-in-out infinite alternate;
78
89
  }
79
90
 
80
91
  @media (hover: hover) {
81
- &:hover::before {
92
+ .sonic-screen:hover::before {
82
93
  animation: sonic-glass-breathe 3s ease-in-out infinite alternate;
83
94
  }
84
95
  }
85
96
  }
86
97
  }
87
- }
88
98
  }
@@ -45,7 +45,8 @@
45
45
  white-space: nowrap;
46
46
  pointer-events: none;
47
47
  cursor: default;
48
- user-select: none;
48
+ -webkit-user-select: none;
49
+ user-select: none;
49
50
  background: var(--_sonic-glass-fill);
50
51
  border: var(--_sonic-glass-edge);
51
52
  border-radius: var(
@@ -54,9 +55,9 @@
54
55
  );
55
56
  box-shadow:
56
57
  calc(2 * var(--_sonic-cast-x)) calc(2 * var(--_sonic-cast-y)) calc(6 * var(--_sonic-unit))
57
- rgb(from var(--_sonic-shade) r g b / calc(0.55 * var(--_sonic-readout-depth))),
58
+ color-mix(in srgb, var(--_sonic-shade) calc(55% * var(--_sonic-readout-depth)), transparent),
58
59
  inset 0 0 0 max(1px, round(var(--_sonic-unit), var(--_sonic-snap)))
59
- rgb(from var(--_sonic-shine) r g b / calc(0.08 * var(--_sonic-readout-depth)));
60
+ color-mix(in srgb, var(--_sonic-shine) calc(8% * var(--_sonic-readout-depth)), transparent);
60
61
  opacity: 0;
61
62
  translate: 0 calc(0.15 * var(--_sonic-readout-size));
62
63
  transition:
@@ -66,30 +67,42 @@
66
67
  overlay var(--_sonic-fade-duration) allow-discrete;
67
68
 
68
69
  /* Grid only while open; engines keep the flip a closed readout took against a filtered ancestor */
69
- &:popover-open {
70
+ }
71
+ :is(.sonic-dial-readout,.sonic-envelope-readout,.sonic-slider-readout,.sonic-waveform-readout,.sonic-wavestrip-readout,.sonic-xy-readout):popover-open {
70
72
  display: grid;
71
73
  opacity: 1;
72
74
  translate: 0;
75
+ }
73
76
 
74
77
  @starting-style {
78
+ :is(.sonic-dial-readout,.sonic-envelope-readout,.sonic-slider-readout,.sonic-waveform-readout,.sonic-wavestrip-readout,.sonic-xy-readout):popover-open {
75
79
  opacity: 0;
76
80
  translate: 0 calc(0.15 * var(--_sonic-readout-size));
77
- }
78
81
  }
82
+ }
79
83
 
80
84
  @media (prefers-reduced-motion: reduce) {
81
- translate: 0;
82
85
 
83
- &:popover-open {
86
+ :is(
87
+ .sonic-dial-readout,
88
+ .sonic-envelope-readout,
89
+ .sonic-slider-readout,
90
+ .sonic-waveform-readout,
91
+ .sonic-wavestrip-readout,
92
+ .sonic-xy-readout
93
+ ) {
94
+ translate: 0;
95
+ }
84
96
  @starting-style {
97
+
98
+ :is(.sonic-dial-readout,.sonic-envelope-readout,.sonic-slider-readout,.sonic-waveform-readout,.sonic-wavestrip-readout,.sonic-xy-readout):popover-open {
85
99
  translate: 0;
86
- }
87
100
  }
101
+ }
88
102
  }
89
103
 
90
- :state(editing) > :is(.sonic-dial, .sonic-slider, .sonic-waveform, .sonic-wavestrip) > & {
104
+ :state(editing) > :is(.sonic-dial,.sonic-slider,.sonic-waveform,.sonic-wavestrip) > :is(.sonic-dial-readout,.sonic-envelope-readout,.sonic-slider-readout,.sonic-waveform-readout,.sonic-wavestrip-readout,.sonic-xy-readout) {
91
105
  pointer-events: auto;
92
106
  cursor: text;
93
107
  }
94
- }
95
108
  }
@@ -1,16 +1,23 @@
1
1
  @layer sonic.material {
2
- .sonic-xy-bracket,
3
- .sonic-envelope-bracket::before {
2
+ .sonic-xy-reticle,
3
+ .sonic-envelope-reticle::before {
4
4
  box-sizing: border-box;
5
- inline-size: var(--_sonic-bracket-size);
6
- block-size: var(--_sonic-bracket-size);
5
+ inline-size: var(--_sonic-reticle-size);
6
+ block-size: var(--_sonic-reticle-size);
7
7
  pointer-events: none;
8
8
  content: '';
9
- border: max(1px, 0.06 * var(--_sonic-bracket-size)) solid
9
+ border: max(1px, 0.06 * var(--_sonic-reticle-size)) solid
10
10
  color-mix(in oklab, currentcolor 45%, transparent);
11
11
  border-radius: 50%;
12
12
  opacity: 0;
13
- mask: conic-gradient(
13
+ -webkit-mask: conic-gradient(
14
+ from 10deg,
15
+ #000 0 70deg,
16
+ transparent 0 180deg,
17
+ #000 0 250deg,
18
+ transparent 0
19
+ );
20
+ mask: conic-gradient(
14
21
  from 10deg,
15
22
  #000 0 70deg,
16
23
  transparent 0 180deg,
@@ -23,8 +30,8 @@
23
30
  scale var(--_sonic-fade-duration) ease-out;
24
31
  }
25
32
 
26
- :state(dragging) > * > .sonic-xy-bracket,
27
- :state(dragging) > * > .sonic-envelope-bracket::before {
33
+ :state(dragging) > * > .sonic-xy-reticle,
34
+ :state(dragging) > * > .sonic-envelope-reticle::before {
28
35
  opacity: calc(1 - var(--_sonic-relief));
29
36
  scale: 1;
30
37
  }
@@ -5,21 +5,21 @@
5
5
  line-height: 1;
6
6
  white-space: nowrap;
7
7
  pointer-events: none;
8
+ }
8
9
 
9
- & > * {
10
+ :is(.sonic-dial-scale,.sonic-slider-scale) > * {
10
11
  position: absolute;
11
12
  }
12
13
 
13
- & svg {
14
+ :is(.sonic-dial-scale,.sonic-slider-scale) svg {
14
15
  display: block;
15
16
  inline-size: 1em;
16
17
  block-size: 1em;
17
18
  }
18
19
 
19
- & > .sonic-scale-tick {
20
+ :is(.sonic-dial-scale,.sonic-slider-scale) > .sonic-scale-tick {
20
21
  background: var(--sonic-scale, var(--_sonic-etch));
21
22
  }
22
- }
23
23
 
24
24
  @media (forced-colors: active) {
25
25
  :is(.sonic-dial-scale, .sonic-slider-scale) > .sonic-scale-tick {
@@ -23,21 +23,30 @@
23
23
  text-align: center;
24
24
  background: transparent;
25
25
  border: 0;
26
+ }
26
27
 
27
- &::selection {
28
+ :is(.sonic-dial-entry,.sonic-number-entry,.sonic-slider-entry,.sonic-waveform-entry,.sonic-wavestrip-entry)::selection {
28
29
  color: var(--sonic-entry-selection, var(--_sonic-lit));
29
30
  background: transparent;
30
31
  }
31
32
 
32
- &:focus-visible {
33
+ :is(.sonic-dial-entry,.sonic-number-entry,.sonic-slider-entry,.sonic-waveform-entry,.sonic-wavestrip-entry):focus-visible {
33
34
  outline: 2px solid transparent;
34
35
  outline-offset: -2px;
35
36
  }
36
37
 
37
38
  @supports (field-sizing: content) {
39
+
40
+ :is(
41
+ .sonic-dial-entry,
42
+ .sonic-number-entry,
43
+ .sonic-slider-entry,
44
+ .sonic-waveform-entry,
45
+ .sonic-wavestrip-entry
46
+ ) {
38
47
  inline-size: auto;
39
48
  min-inline-size: 3ch;
40
49
  field-sizing: content;
41
- }
42
50
  }
51
+ }
43
52
  }
@@ -12,9 +12,9 @@
12
12
  inset calc(var(--_sonic-well-depth) * var(--_sonic-cast-x))
13
13
  calc(var(--_sonic-well-depth) * var(--_sonic-cast-y))
14
14
  calc(2 * var(--_sonic-well-depth) * var(--_sonic-unit))
15
- rgb(from var(--_sonic-shade) r g b / calc(0.6 * var(--_sonic-relief))),
15
+ color-mix(in srgb, var(--_sonic-shade) calc(60% * var(--_sonic-relief)), transparent),
16
16
  calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-x))
17
17
  calc(0.5 * var(--_sonic-well-depth) * var(--_sonic-cast-y)) 0
18
- rgb(from var(--_sonic-shine) r g b / calc(0.06 * var(--_sonic-relief)));
18
+ color-mix(in srgb, var(--_sonic-shine) calc(6% * var(--_sonic-relief)), transparent);
19
19
  }
20
20
  }
@@ -10,6 +10,6 @@
10
10
  @import './material/keycap.css';
11
11
  @import './material/arc.css';
12
12
  @import './material/lens.css';
13
- @import './material/bracket.css';
13
+ @import './material/reticle.css';
14
14
  @import './material/groove.css';
15
15
  @import './material/scale.css';