@dorsk/tsumikit 0.74.0 → 0.75.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 (127) hide show
  1. package/README.md +38 -1
  2. package/dist/autoresize.d.ts +2 -0
  3. package/dist/autoresize.js +8 -1
  4. package/dist/components/atoms/Artwork.svelte +12 -5
  5. package/dist/components/atoms/Avatar.svelte +1 -1
  6. package/dist/components/atoms/Badge.svelte +59 -23
  7. package/dist/components/atoms/Button.svelte +130 -96
  8. package/dist/components/atoms/Button.svelte.d.ts +2 -0
  9. package/dist/components/atoms/Card.svelte +10 -4
  10. package/dist/components/atoms/Checkbox.svelte +36 -9
  11. package/dist/components/atoms/Checkbox.svelte.d.ts +2 -0
  12. package/dist/components/atoms/Gauge.svelte +20 -14
  13. package/dist/components/atoms/Heading.svelte +1 -1
  14. package/dist/components/atoms/Icon.svelte +1 -0
  15. package/dist/components/atoms/Input.svelte +67 -13
  16. package/dist/components/atoms/Kbd.svelte +3 -3
  17. package/dist/components/atoms/Link.svelte +7 -2
  18. package/dist/components/atoms/Progress.svelte +4 -2
  19. package/dist/components/atoms/Scrim.svelte +3 -8
  20. package/dist/components/atoms/SegmentedProgress.svelte +5 -4
  21. package/dist/components/atoms/Select.svelte +58 -27
  22. package/dist/components/atoms/Slider.svelte +79 -22
  23. package/dist/components/atoms/Slider.svelte.d.ts +2 -0
  24. package/dist/components/atoms/Swatch.svelte +19 -8
  25. package/dist/components/atoms/Switch.svelte +34 -21
  26. package/dist/components/atoms/Switch.svelte.d.ts +2 -0
  27. package/dist/components/atoms/Text.svelte +1 -1
  28. package/dist/components/atoms/Textarea.svelte +34 -12
  29. package/dist/components/atoms/TimeDisplay.svelte +4 -2
  30. package/dist/components/layouts/AppShell.svelte +26 -15
  31. package/dist/components/layouts/MasterDetail.svelte +23 -21
  32. package/dist/components/layouts/NavBar.svelte +11 -8
  33. package/dist/components/layouts/NavItem.svelte +15 -7
  34. package/dist/components/layouts/NavSection.svelte +1 -1
  35. package/dist/components/layouts/ResizablePanel.svelte +37 -16
  36. package/dist/components/layouts/TabBar.svelte +24 -14
  37. package/dist/components/layouts/TabBar.svelte.d.ts +2 -0
  38. package/dist/components/molecules/Accordion.svelte +4 -0
  39. package/dist/components/molecules/Accordion.svelte.d.ts +2 -0
  40. package/dist/components/molecules/AttachmentList.svelte +14 -11
  41. package/dist/components/molecules/Breadcrumb.svelte +13 -9
  42. package/dist/components/molecules/Callout.svelte +3 -3
  43. package/dist/components/molecules/CapBar.svelte +23 -22
  44. package/dist/components/molecules/Carousel.svelte +27 -17
  45. package/dist/components/molecules/ChatBubble.svelte +2 -2
  46. package/dist/components/molecules/CodeBlock.svelte +2 -2
  47. package/dist/components/molecules/Combobox.svelte +30 -1
  48. package/dist/components/molecules/Combobox.svelte.d.ts +4 -0
  49. package/dist/components/molecules/Composer.svelte +2 -2
  50. package/dist/components/molecules/ConfirmModal.svelte +4 -0
  51. package/dist/components/molecules/ConfirmModal.svelte.d.ts +2 -0
  52. package/dist/components/molecules/CopyButton.svelte +46 -2
  53. package/dist/components/molecules/CopyButton.svelte.d.ts +2 -0
  54. package/dist/components/molecules/Disclosure.svelte +23 -12
  55. package/dist/components/molecules/Disclosure.svelte.d.ts +2 -0
  56. package/dist/components/molecules/Drawer.svelte +43 -23
  57. package/dist/components/molecules/Drawer.svelte.d.ts +2 -0
  58. package/dist/components/molecules/Dropzone.svelte +24 -8
  59. package/dist/components/molecules/EmojiPicker.svelte +27 -8
  60. package/dist/components/molecules/EmojiPicker.svelte.d.ts +2 -0
  61. package/dist/components/molecules/EmptyState.svelte +5 -5
  62. package/dist/components/molecules/Fieldset.svelte +8 -13
  63. package/dist/components/molecules/FileButton.svelte +57 -31
  64. package/dist/components/molecules/FileButton.svelte.d.ts +2 -0
  65. package/dist/components/molecules/FilterInput.svelte +51 -11
  66. package/dist/components/molecules/FontScalePicker.svelte +20 -9
  67. package/dist/components/molecules/GitRef.svelte +9 -7
  68. package/dist/components/molecules/GlyphStack.svelte +38 -14
  69. package/dist/components/molecules/IconButton.svelte +6 -3
  70. package/dist/components/molecules/IconButton.svelte.d.ts +2 -0
  71. package/dist/components/molecules/InputGroup.svelte +13 -12
  72. package/dist/components/molecules/LoadMore.svelte +6 -1
  73. package/dist/components/molecules/LoadMore.svelte.d.ts +2 -0
  74. package/dist/components/molecules/Menu.svelte +33 -7
  75. package/dist/components/molecules/Menu.svelte.d.ts +2 -0
  76. package/dist/components/molecules/Metric.svelte +11 -9
  77. package/dist/components/molecules/Modal.svelte +76 -26
  78. package/dist/components/molecules/Modal.svelte.d.ts +2 -0
  79. package/dist/components/molecules/OptionButton.svelte +28 -10
  80. package/dist/components/molecules/OptionButton.svelte.d.ts +2 -0
  81. package/dist/components/molecules/Pagination.svelte +26 -9
  82. package/dist/components/molecules/Pagination.svelte.d.ts +2 -0
  83. package/dist/components/molecules/Popover.svelte +107 -51
  84. package/dist/components/molecules/Popover.svelte.d.ts +2 -0
  85. package/dist/components/molecules/Prose.svelte +1 -1
  86. package/dist/components/molecules/PullToRefresh.svelte +14 -10
  87. package/dist/components/molecules/PullToRefresh.svelte.d.ts +2 -0
  88. package/dist/components/molecules/RadialMenu.svelte +52 -19
  89. package/dist/components/molecules/RadialMenu.svelte.d.ts +2 -0
  90. package/dist/components/molecules/RadioGroup.svelte +38 -23
  91. package/dist/components/molecules/RadioGroup.svelte.d.ts +2 -0
  92. package/dist/components/molecules/SectionHeader.svelte +13 -8
  93. package/dist/components/molecules/SeekSlider.svelte +38 -27
  94. package/dist/components/molecules/SeekSlider.svelte.d.ts +2 -0
  95. package/dist/components/molecules/SegmentedControl.svelte +139 -86
  96. package/dist/components/molecules/SegmentedControl.svelte.d.ts +2 -0
  97. package/dist/components/molecules/SelectButton.svelte +21 -6
  98. package/dist/components/molecules/SelectButton.svelte.d.ts +2 -0
  99. package/dist/components/molecules/SortableList.svelte +10 -11
  100. package/dist/components/molecules/SoundSettings.svelte +161 -0
  101. package/dist/components/molecules/SoundSettings.svelte.d.ts +17 -0
  102. package/dist/components/molecules/SplitButton.svelte +30 -3
  103. package/dist/components/molecules/SplitButton.svelte.d.ts +2 -0
  104. package/dist/components/molecules/SwipeRow.svelte +18 -15
  105. package/dist/components/molecules/SwipeRow.svelte.d.ts +2 -0
  106. package/dist/components/molecules/Tabs.svelte +92 -10
  107. package/dist/components/molecules/Tabs.svelte.d.ts +2 -0
  108. package/dist/components/molecules/ThemePicker.svelte +25 -10
  109. package/dist/components/molecules/Timestamp.svelte +12 -7
  110. package/dist/components/molecules/Toaster.svelte +65 -14
  111. package/dist/components/molecules/Toaster.svelte.d.ts +2 -0
  112. package/dist/components/molecules/Toggle.svelte +36 -13
  113. package/dist/components/molecules/Toggle.svelte.d.ts +2 -0
  114. package/dist/components/molecules/Tooltip.svelte +41 -10
  115. package/dist/components/molecules/Tooltip.svelte.d.ts +1 -1
  116. package/dist/components/molecules/VolumeSlider.svelte +34 -14
  117. package/dist/components/molecules/VolumeSlider.svelte.d.ts +2 -0
  118. package/dist/components/molecules/WorkingDir.svelte +1 -0
  119. package/dist/components/organisms/ConversationFeed.svelte +4 -0
  120. package/dist/components/organisms/DataTable.svelte +37 -14
  121. package/dist/floating.js +26 -0
  122. package/dist/index.d.ts +1 -0
  123. package/dist/index.js +1 -0
  124. package/dist/sound-synth.js +17 -12
  125. package/dist/stores/toast.svelte.d.ts +9 -0
  126. package/dist/stores/toast.svelte.js +45 -9
  127. package/package.json +1 -1
@@ -14,6 +14,7 @@
14
14
 
15
15
  <script lang="ts">
16
16
  import type { Snippet } from 'svelte';
17
+ import { playSound } from '../../sound';
17
18
 
18
19
  // Native <input type="radio"> sharing one `name`: the browser handles
19
20
  // single-selection, arrow keys and form participation. `variant="rows"`
@@ -28,6 +29,7 @@
28
29
  action,
29
30
  below,
30
31
  onfocuschange,
32
+ sound = true,
31
33
  class: klass = ''
32
34
  }: {
33
35
  options: RadioOption[];
@@ -41,6 +43,8 @@
41
43
  /** Fires once each time a different option becomes active — by keyboard
42
44
  * focus or by pointer hover — so a consumer can drive a preview pane. */
43
45
  onfocuschange?: (value: string) => void;
46
+ /** Play UI sounds when enabled globally; false silences this instance. */
47
+ sound?: boolean;
44
48
  class?: string;
45
49
  } = $props();
46
50
 
@@ -53,6 +57,7 @@
53
57
  active = v;
54
58
  onfocuschange?.(v);
55
59
  }
60
+ const onchange = () => playSound('click', sound);
56
61
  </script>
57
62
 
58
63
  <div
@@ -76,6 +81,7 @@
76
81
  aria-label={o.label}
77
82
  aria-describedby={descId(o)}
78
83
  onfocus={() => activate(o.value)}
84
+ {onchange}
79
85
  />
80
86
  {#if o.description}<span class="sr-only" id={descId(o)}>{o.description}</span>{/if}
81
87
  <span class="swatch-chip" aria-hidden="true" style="--swatch: {o.color ?? 'var(--accent)'}"></span>
@@ -92,6 +98,7 @@
92
98
  disabled={o.disabled}
93
99
  aria-describedby={descId(o)}
94
100
  onfocus={() => activate(o.value)}
101
+ {onchange}
95
102
  />
96
103
  <span class="dot-ctl" aria-hidden="true"></span>
97
104
  <span class="texts">
@@ -117,6 +124,7 @@
117
124
  disabled={o.disabled}
118
125
  aria-describedby={descId(o)}
119
126
  onfocus={() => activate(o.value)}
127
+ {onchange}
120
128
  />
121
129
  <span class="dot-ctl" aria-hidden="true"></span>
122
130
  <span class="texts">
@@ -149,7 +157,7 @@
149
157
  }
150
158
  .radio.disabled,
151
159
  .row.disabled {
152
- opacity: 0.45;
160
+ opacity: var(--disabled-opacity);
153
161
  }
154
162
  input {
155
163
  position: absolute;
@@ -161,40 +169,47 @@
161
169
  .dot-ctl {
162
170
  position: relative;
163
171
  flex: none;
164
- width: 1.15rem;
165
- height: 1.15rem;
166
- margin-top: 0.1rem;
172
+ width: var(--chip-sm);
173
+ height: var(--chip-sm);
174
+ margin-top: var(--sp-px);
167
175
  border: 1px solid var(--border-strong);
168
176
  border-radius: var(--r-pill);
169
177
  background: var(--bg);
170
- transition: border-color 0.12s var(--ease);
178
+ transition: border-color var(--dur-fast) var(--ease);
171
179
  }
172
180
  .dot-ctl::after {
173
181
  content: '';
174
182
  position: absolute;
175
- inset: 50%;
176
- width: 0.55rem;
177
- height: 0.55rem;
178
- margin: -0.275rem 0 0 -0.275rem;
183
+ inset: 0;
184
+ width: var(--sp-2);
185
+ height: var(--sp-2);
186
+ margin: auto;
179
187
  border-radius: var(--r-pill);
180
188
  background: var(--accent);
181
- transform: scale(0);
182
- transition: transform 0.1s var(--ease);
189
+ opacity: 0;
190
+ scale: 0.5;
191
+ transition:
192
+ opacity var(--dur-exit-fast) var(--ease-out),
193
+ scale var(--dur-exit-fast) var(--ease-out);
183
194
  }
184
195
  input:checked + .dot-ctl {
185
196
  border-color: var(--accent);
186
197
  }
187
198
  input:checked + .dot-ctl::after {
188
- transform: scale(1);
199
+ opacity: 1;
200
+ scale: 1;
201
+ transition:
202
+ opacity var(--dur-spring) var(--ease-spring),
203
+ scale var(--dur-spring) var(--ease-spring);
189
204
  }
190
205
  input:focus-visible + .dot-ctl {
191
- outline: 2px solid var(--accent);
192
- outline-offset: 2px;
206
+ outline: var(--focus-ring);
207
+ outline-offset: var(--focus-ring-offset);
193
208
  }
194
209
  .texts {
195
210
  display: flex;
196
211
  flex-direction: column;
197
- gap: 1px;
212
+ gap: var(--sp-px);
198
213
  min-width: 0;
199
214
  }
200
215
  .hint {
@@ -218,8 +233,8 @@
218
233
  border: 1px solid var(--border);
219
234
  border-radius: var(--r-md);
220
235
  transition:
221
- border-color 0.12s var(--ease),
222
- background-color 0.12s var(--ease);
236
+ border-color var(--dur-fast) var(--ease),
237
+ background-color var(--dur-fast) var(--ease);
223
238
  }
224
239
  .row.selected {
225
240
  border-color: var(--accent-dim);
@@ -240,7 +255,7 @@
240
255
  min-width: 0;
241
256
  }
242
257
  .row .label-text {
243
- font-weight: 600;
258
+ font-weight: var(--fw-semibold);
244
259
  }
245
260
  .note {
246
261
  font-size: var(--fs-xs);
@@ -287,17 +302,17 @@
287
302
  cursor: pointer;
288
303
  }
289
304
  .swatch.disabled {
290
- opacity: 0.45;
305
+ opacity: var(--disabled-opacity);
291
306
  cursor: not-allowed;
292
307
  }
293
308
  .swatch-chip {
294
- width: 1.6rem;
295
- height: 1.6rem;
309
+ width: var(--chip-md);
310
+ height: var(--chip-md);
296
311
  border-radius: var(--r-pill);
297
312
  background: var(--swatch);
298
313
  border: 2px solid transparent;
299
314
  box-shadow: 0 0 0 1px var(--border-strong);
300
- transition: box-shadow 0.12s var(--ease);
315
+ transition: box-shadow var(--dur-fast) var(--ease);
301
316
  }
302
317
  .swatch input:checked + .swatch-chip {
303
318
  border-color: var(--bg);
@@ -305,6 +320,6 @@
305
320
  }
306
321
  .swatch input:focus-visible + .swatch-chip {
307
322
  outline: var(--focus-ring);
308
- outline-offset: 2px;
323
+ outline-offset: var(--focus-ring-offset);
309
324
  }
310
325
  </style>
@@ -22,6 +22,8 @@ type $$ComponentProps = {
22
22
  /** Fires once each time a different option becomes active — by keyboard
23
23
  * focus or by pointer hover — so a consumer can drive a preview pane. */
24
24
  onfocuschange?: (value: string) => void;
25
+ /** Play UI sounds when enabled globally; false silences this instance. */
26
+ sound?: boolean;
25
27
  class?: string;
26
28
  };
27
29
  declare const RadioGroup: import("svelte").Component<$$ComponentProps, {}, "value">;
@@ -86,6 +86,7 @@
86
86
  class:sh-sticky={sticky}
87
87
  class:sh-uppercase={uppercase}
88
88
  class:sh-open={open}
89
+ class:sh-collapsible={collapsible}
89
90
  {...rest}
90
91
  >
91
92
  <div class="sh-row">
@@ -221,7 +222,7 @@
221
222
  display: inline-flex;
222
223
  flex: none;
223
224
  color: var(--sh-tone);
224
- line-height: 1;
225
+ line-height: var(--lh-none);
225
226
  }
226
227
  .sh-swatch {
227
228
  flex: none;
@@ -263,23 +264,27 @@
263
264
  border-radius: var(--r-sm);
264
265
  }
265
266
  .sh-toggle:focus-visible {
266
- outline: 2px solid var(--accent);
267
- outline-offset: 2px;
267
+ outline: var(--focus-ring);
268
+ outline-offset: var(--focus-ring-offset);
268
269
  }
269
270
  .section-header :global(.sh-chevron) {
270
271
  flex: none;
271
272
  color: var(--text-muted);
272
- transition: transform 0.15s var(--ease);
273
+ transition: rotate var(--dur-base) var(--ease-out);
273
274
  }
274
275
  .sh-open :global(.sh-chevron) {
275
- transform: rotate(90deg);
276
+ rotate: 90deg;
276
277
  }
277
278
  .sh-panel {
278
279
  margin-top: var(--sp-3);
280
+ transition:
281
+ opacity var(--dur-base) var(--ease-out),
282
+ translate var(--dur-base) var(--ease-out);
279
283
  }
280
- @media (prefers-reduced-motion: reduce) {
281
- .section-header :global(.sh-chevron) {
282
- transition: none;
284
+ @starting-style {
285
+ .sh-collapsible.sh-open .sh-panel {
286
+ opacity: 0;
287
+ translate: 0 calc(-1 * var(--shift-xs));
283
288
  }
284
289
  }
285
290
  </style>
@@ -7,6 +7,7 @@
7
7
  import type { Snippet } from 'svelte';
8
8
  import type { HTMLAttributes } from 'svelte/elements';
9
9
  import { describeMediaTime, formatMediaTime, isLiveDuration } from '../../media-time';
10
+ import { playSound } from '../../sound';
10
11
 
11
12
  type Own = {
12
13
  /** Position in seconds. Updated only on commit, never while dragging. */
@@ -22,6 +23,8 @@
22
23
  disabled?: boolean;
23
24
  size?: 'sm' | 'md';
24
25
  label?: string;
26
+ /** Play UI sounds when enabled globally; false silences this instance. */
27
+ sound?: boolean;
25
28
  formatTime?: (seconds: number, ref?: number) => string;
26
29
  /** Fired on every pointer move while scrubbing with the previewed time. */
27
30
  oninput?: (seconds: number) => void;
@@ -44,6 +47,7 @@
44
47
  disabled = false,
45
48
  size = 'md',
46
49
  label = 'Seek',
50
+ sound = true,
47
51
  formatTime = formatMediaTime,
48
52
  oninput,
49
53
  onchange,
@@ -77,6 +81,7 @@
77
81
  .filter(([a, b]) => b > a)
78
82
  );
79
83
  const valueText = $derived(describeMediaTime(shown, live ? null : duration, formatTime));
84
+ const discrete = $derived(duration > 0 && duration / step <= 20);
80
85
 
81
86
  function fracAt(el: HTMLElement, clientX: number) {
82
87
  const r = el.getBoundingClientRect();
@@ -125,6 +130,7 @@
125
130
  const el = e.currentTarget as HTMLElement;
126
131
  if (pointerId === e.pointerId) {
127
132
  preview = fracAt(el, e.clientX) * duration;
133
+ if (discrete) playSound('tick', sound);
128
134
  oninput?.(preview);
129
135
  return;
130
136
  }
@@ -182,6 +188,7 @@
182
188
  }
183
189
  if (next === null) return;
184
190
  e.preventDefault();
191
+ playSound('tick', sound);
185
192
  commit(next);
186
193
  }
187
194
  </script>
@@ -233,8 +240,9 @@
233
240
  <style>
234
241
  .seek {
235
242
  --seek-track: 3px;
236
- --seek-track-active: 5px;
243
+ --seek-track-grow: 1.6;
237
244
  --seek-thumb: 12px;
245
+ --seek-halo: 0 0 0 4px color-mix(in srgb, var(--seek-accent) 20%, transparent);
238
246
  --seek-slab: 1.25rem;
239
247
  --seek-accent: var(--slider-accent, var(--accent));
240
248
  position: relative;
@@ -249,7 +257,6 @@
249
257
  }
250
258
  .seek--md {
251
259
  --seek-track: 4px;
252
- --seek-track-active: 6px;
253
260
  --seek-thumb: 14px;
254
261
  --seek-slab: 1.5rem;
255
262
  }
@@ -259,8 +266,8 @@
259
266
  }
260
267
  }
261
268
  .seek--inert {
262
- cursor: default;
263
- opacity: 0.45;
269
+ cursor: not-allowed;
270
+ opacity: var(--disabled-opacity);
264
271
  }
265
272
  .seek-track {
266
273
  position: absolute;
@@ -271,19 +278,12 @@
271
278
  border-radius: var(--r-pill);
272
279
  background: var(--bg-elevated-2);
273
280
  overflow: hidden;
274
- transition:
275
- height 120ms var(--ease),
276
- margin-top 120ms var(--ease);
281
+ transform-origin: center;
282
+ transition: scale var(--dur-fast) var(--ease);
277
283
  }
278
- .seek:hover .seek-track,
279
284
  .seek:focus-visible .seek-track,
280
285
  .seek--dragging .seek-track {
281
- height: var(--seek-track-active);
282
- margin-top: calc(var(--seek-track-active) / -2);
283
- }
284
- .seek--inert:hover .seek-track {
285
- height: var(--seek-track);
286
- margin-top: calc(var(--seek-track) / -2);
286
+ scale: 1 var(--seek-track-grow);
287
287
  }
288
288
  .seek-buffered,
289
289
  .seek-played {
@@ -319,28 +319,45 @@
319
319
  top: 0;
320
320
  width: var(--seek-thumb);
321
321
  height: var(--seek-thumb);
322
- border-radius: 50%;
322
+ border-radius: var(--r-pill);
323
323
  background: var(--seek-accent);
324
324
  border: 2px solid var(--bg);
325
325
  box-shadow: var(--shadow-sm);
326
- transform: translate(-50%, -50%) scale(0.6);
326
+ transform: translate(-50%, -50%);
327
+ scale: 0.6;
327
328
  opacity: 0;
328
329
  transition:
329
- opacity 120ms var(--ease),
330
- transform 120ms var(--ease);
330
+ opacity var(--dur-fast) var(--ease),
331
+ scale var(--dur-press) var(--ease-out),
332
+ box-shadow var(--dur-fast) var(--ease);
331
333
  }
332
- .seek:hover .seek-thumb,
333
334
  .seek:focus-visible .seek-thumb,
334
335
  .seek--dragging .seek-thumb {
335
336
  opacity: 1;
336
- transform: translate(-50%, -50%) scale(1);
337
+ scale: 1;
338
+ }
339
+ .seek--dragging .seek-thumb {
340
+ scale: 1.15;
341
+ }
342
+ @media (hover: hover) and (pointer: fine) {
343
+ .seek:not(.seek--inert):hover .seek-track {
344
+ scale: 1 var(--seek-track-grow);
345
+ }
346
+ .seek:not(.seek--inert):hover .seek-thumb {
347
+ opacity: 1;
348
+ scale: 1;
349
+ box-shadow: var(--shadow-sm), var(--seek-halo);
350
+ }
351
+ .seek--dragging .seek-thumb {
352
+ scale: 1.15;
353
+ }
337
354
  }
338
355
  .seek--inert .seek-thumb {
339
356
  opacity: 0;
340
357
  }
341
358
  .seek:focus-visible .seek-thumb {
342
359
  outline: var(--focus-ring);
343
- outline-offset: 2px;
360
+ outline-offset: var(--focus-ring-offset);
344
361
  }
345
362
  .seek-tip {
346
363
  position: absolute;
@@ -361,10 +378,4 @@
361
378
  font-variant-numeric: tabular-nums;
362
379
  white-space: nowrap;
363
380
  }
364
- @media (prefers-reduced-motion: reduce) {
365
- .seek-track,
366
- .seek-thumb {
367
- transition: none;
368
- }
369
- }
370
381
  </style>
@@ -19,6 +19,8 @@ type Own = {
19
19
  disabled?: boolean;
20
20
  size?: 'sm' | 'md';
21
21
  label?: string;
22
+ /** Play UI sounds when enabled globally; false silences this instance. */
23
+ sound?: boolean;
22
24
  formatTime?: (seconds: number, ref?: number) => string;
23
25
  /** Fired on every pointer move while scrubbing with the previewed time. */
24
26
  oninput?: (seconds: number) => void;