@tremolo-ui/react 0.6.0 → 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 (57) hide show
  1. package/dist/index.cjs +522 -997
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +601 -329
  4. package/dist/index.d.cts.map +1 -1
  5. package/dist/index.d.ts +601 -329
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +487 -953
  8. package/dist/index.js.map +1 -1
  9. package/package.json +4 -4
  10. package/src/components/DropZone/index.tsx +101 -0
  11. package/src/components/FileInput/Trigger.tsx +39 -0
  12. package/src/components/FileInput/context.tsx +24 -0
  13. package/src/components/FileInput/index.tsx +139 -0
  14. package/src/components/Knob/ActiveLine.tsx +5 -3
  15. package/src/components/Knob/InactiveLine.tsx +6 -4
  16. package/src/components/Knob/SVGRoot.tsx +3 -3
  17. package/src/components/Knob/Thumb.tsx +3 -2
  18. package/src/components/Knob/context.tsx +3 -74
  19. package/src/components/Knob/index.tsx +27 -21
  20. package/src/components/NumberInput/DecrementStepper.tsx +2 -13
  21. package/src/components/NumberInput/IncrementStepper.tsx +2 -14
  22. package/src/components/NumberInput/InputField.tsx +17 -38
  23. package/src/components/NumberInput/Stepper.tsx +44 -107
  24. package/src/components/NumberInput/StepperButton.tsx +16 -12
  25. package/src/components/NumberInput/context.tsx +8 -8
  26. package/src/components/NumberInput/index.tsx +41 -81
  27. package/src/components/Piano/index.tsx +39 -149
  28. package/src/components/PointsEditor/Background.tsx +2 -8
  29. package/src/components/PointsEditor/Container.tsx +17 -34
  30. package/src/components/PointsEditor/Point.tsx +41 -86
  31. package/src/components/PointsEditor/SelectionBox.tsx +2 -8
  32. package/src/components/PointsEditor/context.tsx +10 -61
  33. package/src/components/PointsEditor/index.tsx +31 -315
  34. package/src/components/Slider/Marks.tsx +8 -13
  35. package/src/components/Slider/MarksOption.tsx +11 -17
  36. package/src/components/Slider/Thumb.tsx +9 -15
  37. package/src/components/Slider/Track.tsx +7 -13
  38. package/src/components/Slider/index.tsx +33 -39
  39. package/src/components/XYPad/Area.tsx +26 -53
  40. package/src/components/XYPad/Thumb.tsx +8 -12
  41. package/src/components/XYPad/context.tsx +1 -3
  42. package/src/components/XYPad/index.tsx +35 -50
  43. package/src/components/_util/VisuallyHiddenRangeInput.tsx +3 -15
  44. package/src/css-variables.ts +23 -0
  45. package/src/hooks/_internal/useCheckSteps.ts +9 -147
  46. package/src/hooks/useDrag.ts +13 -4
  47. package/src/hooks/useDragValue.ts +17 -2
  48. package/src/hooks/useDropZone.ts +78 -0
  49. package/src/hooks/useLongPress.ts +35 -51
  50. package/src/hooks/useMIDIAccess.ts +0 -8
  51. package/src/hooks/useMIDIInput.ts +0 -3
  52. package/src/hooks/useWheel.ts +4 -1
  53. package/src/index.ts +14 -36
  54. package/src/components/Piano/keyboard-shortcuts.ts +0 -61
  55. package/src/components/Slider/type.ts +0 -44
  56. package/src/components/_util/css-length.ts +0 -13
  57. package/src/input-event.ts +0 -32
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import React, { AriaAttributes, CSSProperties, ComponentPropsWithoutRef, DependencyList, ReactNode, Ref, RefObject, SVGProps } from "react";
2
- import { AnimationFrame, AxisOptions, DragState, MIDIAccessError, MIDIAccessOptions, MIDIAccessOptions as MIDIAccessOptions$1, MIDIInputHandlers, NOT_SUPPORTED, PERMISSION_DENIED, PITCH_BEND_CENTER, SelectionBoxRect, UNAVAILABLE, WheelOptions, XY, XY as XY$1, XYInput, XYInput as XYInput$1 } from "@tremolo-ui/dom";
3
- import { InputEventOption, ModifierState, ModifierValue, NoteRange, Scale, ValueRange } from "@tremolo-ui/functions";
2
+ import { AnimationFrame, AxisOptions, DragState, DropZoneOptions, InputEventOption, KeyboardShortcuts, KeyboardShortcutsScope, KnobAngles, MIDIAccessOptions, MIDIInputHandlers, MarksOptions, ModifierState, ModifierValue, NoteRange, PointPosition, PointsEditorInstance, SelectionBoxRect, WheelOptions, XY, XYInput } from "@tremolo-ui/dom";
3
+ import { Scale, ValueRange } from "@tremolo-ui/functions";
4
4
  //#region src/components/AnimationCanvas/index.d.ts
5
5
  type InitFunction = (context: CanvasRenderingContext2D, option: {
6
6
  /** current canvas width */
@@ -82,7 +82,120 @@ type Props = AnimationCanvasProps & Omit<ComponentPropsWithoutRef<'canvas'>, key
82
82
  /**
83
83
  * A simple animatable canvas with requestAnimationFrame()
84
84
  */
85
- declare const AnimationCanvas: import("react").ForwardRefExoticComponent<Props & import("react").RefAttributes<HTMLCanvasElement>>;
85
+ export declare const AnimationCanvas: import("react").ForwardRefExoticComponent<Props & import("react").RefAttributes<HTMLCanvasElement>>;
86
+ //#endregion
87
+ //#region src/components/DropZone/index.d.ts
88
+ interface DropZoneProps {
89
+ /**
90
+ * Which files to take, written the way the `accept` attribute of a file
91
+ * input is: a comma separated list of extensions (`.wav`), MIME types
92
+ * (`audio/wav`) and type groups (`audio/*`).
93
+ *
94
+ * What does not match goes to `onReject` rather than `onDrop`. While the
95
+ * drag is still in the air the element is marked `[data-invalid]`, as far as
96
+ * the browser lets it be told apart — a rule written as an extension cannot
97
+ * be decided until the drop.
98
+ */
99
+ accept?: string;
100
+ /**
101
+ * Take more than one file from a single drop. With it off, only the first
102
+ * accepted file is reported, as a file input without `multiple` does.
103
+ *
104
+ * @default false
105
+ */
106
+ multiple?: boolean;
107
+ /**
108
+ * Refuse the drop. The drag is still swallowed rather than let through: an
109
+ * unhandled drop makes the browser leave the page and open the file.
110
+ *
111
+ * @default false
112
+ */
113
+ disabled?: boolean;
114
+ /**
115
+ * Called with the dropped files that match `accept`.
116
+ *
117
+ * @param event the drop, for anything the files leave out — where on the
118
+ * element it landed, most of all.
119
+ */
120
+ onDrop?: (files: File[], event: DragEvent) => void;
121
+ /**
122
+ * Called with the dropped files that do not match `accept`, so that the
123
+ * reason can be shown. It comes after `onDrop` for the same drop, so a list
124
+ * of rejected files can be cleared in `onDrop` and filled here.
125
+ */
126
+ onReject?: (files: File[], event: DragEvent) => void;
127
+ /** What the zone shows. */
128
+ children: ReactNode;
129
+ }
130
+ /**
131
+ * An area that takes files dropped onto it.
132
+ */
133
+ export declare const DropZone: {
134
+ Root: import("react").ForwardRefExoticComponent<DropZoneProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof DropZoneProps> & import("react").RefAttributes<HTMLDivElement>>;
135
+ };
136
+ //#endregion
137
+ //#region src/components/FileInput/Trigger.d.ts
138
+ interface FileInputTriggerProps {
139
+ /** What the trigger reads. It is the accessible name of the file input. */
140
+ children: ReactNode;
141
+ }
142
+ //#endregion
143
+ //#region src/components/FileInput/context.d.ts
144
+ type FileInputContextValue = {
145
+ /** The id of the hidden `<input type="file">`, for `Trigger`'s `htmlFor`. */
146
+ inputId: string;
147
+ disabled: boolean;
148
+ };
149
+ export declare function useFileInputContext(): FileInputContextValue;
150
+ export declare function useFileInputContext<T>(selector: (state: FileInputContextValue) => T): T;
151
+ //#endregion
152
+ //#region src/components/FileInput/index.d.ts
153
+ interface FileInputProps {
154
+ /**
155
+ * Which files to take, written the way the HTML attribute is: a comma
156
+ * separated list of extensions (`.wav`), MIME types (`audio/wav`) and type
157
+ * groups (`audio/*`).
158
+ *
159
+ * **The browser treats it as a hint to the picker, not a rule.** A person
160
+ * can switch the picker to "All Files", so what arrives is checked again
161
+ * here, and anything that does not match goes to `onReject` instead.
162
+ */
163
+ accept?: string;
164
+ /**
165
+ * Let more than one file be picked at a time.
166
+ * @default false
167
+ */
168
+ multiple?: boolean;
169
+ /**
170
+ * Refuse to open the picker, and mark every part with `[data-disabled]`.
171
+ * @default false
172
+ */
173
+ disabled?: boolean;
174
+ /**
175
+ * Called with the files that were picked and match `accept`.
176
+ *
177
+ * It is not called at all when the picker is dismissed, or when every file
178
+ * picked was rejected — an empty array never arrives, so there is no need to
179
+ * tell "nothing was chosen" from "the choice was cleared".
180
+ */
181
+ onChange?: (files: File[]) => void;
182
+ /**
183
+ * Called with the files that were picked and do not match `accept`, so that
184
+ * the reason can be shown. Given alongside `onChange` when a selection held
185
+ * both, and after it, so a list of rejected files can be cleared in
186
+ * `onChange` and filled here.
187
+ */
188
+ onReject?: (files: File[]) => void;
189
+ /** Normally a `FileInput.Trigger`, and whatever shows what was picked. */
190
+ children: ReactNode;
191
+ }
192
+ /**
193
+ * Picks files, and hands them over as `File`s.
194
+ */
195
+ export declare const FileInput: {
196
+ Root: import("react").ForwardRefExoticComponent<FileInputProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof FileInputProps> & import("react").RefAttributes<HTMLDivElement>>;
197
+ Trigger: import("react").ForwardRefExoticComponent<FileInputTriggerProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").LabelHTMLAttributes<HTMLLabelElement>, HTMLLabelElement>, "ref">, "children" | "htmlFor"> & import("react").RefAttributes<HTMLLabelElement>>;
198
+ };
86
199
  //#endregion
87
200
  //#region src/components/Knob/ActiveLine.d.ts
88
201
  declare function ActiveLine({ stroke, strokeWidth, className, ...props }: Omit<SVGProps<SVGPathElement>, 'd'>): import("react").JSX.Element;
@@ -138,6 +251,27 @@ interface KnobThumbProps {
138
251
  }
139
252
  declare function Thumb({ className, thumb, thumbLine, thumbSize, thumbLineWeight, thumbLineLength, classes, ...props }: KnobThumbProps & Omit<SVGProps<SVGSVGElement>, 'd' | keyof KnobThumbProps>): import("react").JSX.Element;
140
253
  //#endregion
254
+ //#region src/css-variables.d.ts
255
+ /**
256
+ * CSS custom properties, for a `style` object.
257
+ *
258
+ * React's `CSSProperties` has no key starting with `--`, so
259
+ * `style={{ '--color': 'red' }}` is refused as an unknown property even though
260
+ * the browser takes it. Every part accepts this alongside `CSSProperties`,
261
+ * which is how a variable the component or a theme reads is set inline.
262
+ *
263
+ * `T` names the custom properties the part itself writes or reads, without the
264
+ * leading `--`, so that an editor can suggest them. Any other `--` name is
265
+ * still accepted — a theme reads variables of its own, such as the colours of
266
+ * each kind of key.
267
+ *
268
+ * @example
269
+ * CSSVariables<'thickness' | 'length'>
270
+ * // { '--thickness'?: string | number, '--length'?: string | number,
271
+ * // [name: `--${string}`]: string | number | undefined }
272
+ */
273
+ type CSSVariables<T extends string = never> = { [K in T as `--${K}`]?: string | number; } & { [K in `--${string}`]?: string | number; };
274
+ //#endregion
141
275
  //#region src/components/Knob/context.d.ts
142
276
  type KnobConfig = {
143
277
  value: number;
@@ -149,24 +283,13 @@ type KnobConfig = {
149
283
  /** angle range [degree] */
150
284
  angleRange: number;
151
285
  };
152
- type KnobContextValue = KnobConfig & {
153
- /** normalized value */
154
- p: number;
155
- /** ロータリー開始位置 */
156
- r1: number;
157
- /** activeLine の開始位置 */
158
- r2: number;
159
- /** activeLine の終了位置 */
160
- r3: number;
161
- /** ロータリー終了位置 */
162
- r4: number;
163
- };
286
+ type KnobContextValue = KnobConfig & KnobAngles;
164
287
  /**
165
288
  * Everything here is derived during render, so there is no state to keep in
166
289
  * sync: `value` comes from the props of `Root` and the rest follows from it.
167
290
  */
168
- declare function useKnobContext(): KnobContextValue;
169
- declare function useKnobContext<T>(selector: (state: KnobContextValue) => T): T;
291
+ export declare function useKnobContext(): KnobContextValue;
292
+ export declare function useKnobContext<T>(selector: (state: KnobContextValue) => T): T;
170
293
  //#endregion
171
294
  //#region src/components/Knob/index.d.ts
172
295
  interface KnobProps {
@@ -318,6 +441,7 @@ interface KnobProps {
318
441
  * </Knob.Root>
319
442
  */
320
443
  children: ReactNode;
444
+ style?: CSSProperties & CSSVariables<'knob-size'>;
321
445
  }
322
446
  interface KnobMethods {
323
447
  focus: () => void;
@@ -326,7 +450,7 @@ interface KnobMethods {
326
450
  /**
327
451
  * Interactive rotary knob component implemented in SVG.
328
452
  */
329
- declare const Knob: {
453
+ export declare const Knob: {
330
454
  Root: import("react").ForwardRefExoticComponent<KnobProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof KnobProps> & import("react").RefAttributes<KnobMethods>>;
331
455
  SVGRoot: typeof SVGRoot;
332
456
  InactiveLine: typeof InactiveLine;
@@ -334,37 +458,22 @@ declare const Knob: {
334
458
  Thumb: typeof Thumb;
335
459
  };
336
460
  //#endregion
337
- //#region src/components/NumberInput/InputField.d.ts
338
- interface NumberInputInputFieldProps {
339
- className?: string;
340
- style?: CSSProperties;
341
- }
342
- //#endregion
343
- //#region src/components/NumberInput/Stepper.d.ts
344
- interface NumberInputStepperProps {
345
- className?: string;
346
- style?: CSSProperties;
347
- /** `<NumberInput.IncrementStepper />` and `<NumberInput.DecrementStepper />` go here. */
348
- children?: ReactNode;
349
- }
350
- //#endregion
351
461
  //#region src/components/NumberInput/StepperButton.d.ts
352
- interface StepperButtonProps {
353
- className?: string;
354
- style?: CSSProperties;
355
- /** Replaces the default arrow. Size it with the `--stepper-icon-size` variable. */
356
- children?: ReactNode;
357
- }
462
+ /**
463
+ * `--stepper-icon-size` is read by the default arrow inside, and set on the
464
+ * button so that it inherits there.
465
+ */
466
+ type StepperButtonProps = Omit<ComponentPropsWithoutRef<'div'>, 'style'> & {
467
+ style?: CSSProperties & CSSVariables<'stepper-icon-size'>;
468
+ };
358
469
  //#endregion
359
470
  //#region src/components/NumberInput/DecrementStepper.d.ts
360
- interface NumberInputDecrementStepperProps extends StepperButtonProps {}
361
471
  /** Lowers the value by one `step`, repeating while held. */
362
- declare function DecrementStepper(props: NumberInputDecrementStepperProps & Omit<ComponentPropsWithoutRef<'div'>, keyof NumberInputDecrementStepperProps>): import("react").JSX.Element;
472
+ declare function DecrementStepper(props: StepperButtonProps): import("react").JSX.Element;
363
473
  //#endregion
364
474
  //#region src/components/NumberInput/IncrementStepper.d.ts
365
- interface NumberInputIncrementStepperProps extends StepperButtonProps {}
366
475
  /** Raises the value by one `step`, repeating while held. */
367
- declare function IncrementStepper(props: NumberInputIncrementStepperProps & Omit<ComponentPropsWithoutRef<'div'>, keyof NumberInputIncrementStepperProps>): import("react").JSX.Element;
476
+ declare function IncrementStepper(props: StepperButtonProps): import("react").JSX.Element;
368
477
  //#endregion
369
478
  //#region src/components/NumberInput/context.d.ts
370
479
  type NumberInputContextValue = {
@@ -429,8 +538,8 @@ type NumberInputContextValue = {
429
538
  * The only state behind this is the editing draft; `value` comes from the props
430
539
  * of `Root` and everything else is derived during render.
431
540
  */
432
- declare function useNumberInputContext(): NumberInputContextValue;
433
- declare function useNumberInputContext<T>(selector: (state: NumberInputContextValue) => T): T;
541
+ export declare function useNumberInputContext(): NumberInputContextValue;
542
+ export declare function useNumberInputContext<T>(selector: (state: NumberInputContextValue) => T): T;
434
543
  //#endregion
435
544
  //#region src/components/NumberInput/index.d.ts
436
545
  interface NumberInputProps {
@@ -482,6 +591,9 @@ interface NumberInputProps {
482
591
  * Read a value back out of the text. Has to undo `format`.
483
592
  *
484
593
  * Text with no number in it reads as `NaN`, which leaves the value alone.
594
+ * The default, `parseNumberText` from `@tremolo-ui/dom`, reads the number
595
+ * with the unit around it left out, and is `NaN` for one it cannot read
596
+ * whole: `1,000`, `1:30`, or a number with a unit in front, such as `L 30`.
485
597
  */
486
598
  parse?: (text: string) => number;
487
599
  /**
@@ -554,7 +666,7 @@ interface NumberInputProps {
554
666
  pointerLock?: boolean;
555
667
  /**
556
668
  * Select the text when `InputField` takes focus: `'all'` selects all of it,
557
- * `'number'` only the leading number, leaving whatever the format appended,
669
+ * `'number'` only the number, leaving the unit the format put around it,
558
670
  * and `'none'` leaves the caret where the click put it.
559
671
  * @default 'none'
560
672
  */
@@ -608,8 +720,6 @@ interface NumberInputProps {
608
720
  * The parts carry `data-readonly` while it is set.
609
721
  */
610
722
  readonly?: boolean;
611
- className?: string;
612
- style?: CSSProperties;
613
723
  /**
614
724
  * Called with the new value. While the user types, it is called for every
615
725
  * entry that reads as a number, unclamped; committing the entry calls it
@@ -638,47 +748,324 @@ interface NumberInputMethods {
638
748
  /**
639
749
  * Input with some useful functions for entering numerical values.
640
750
  */
641
- declare const NumberInput: {
751
+ export declare const NumberInput: {
642
752
  Root: import("react").ForwardRefExoticComponent<NumberInputProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof NumberInputProps> & import("react").RefAttributes<NumberInputMethods>>;
643
- InputField: import("react").ForwardRefExoticComponent<NumberInputInputFieldProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "defaultValue" | "value" | "type" | keyof NumberInputInputFieldProps> & import("react").RefAttributes<HTMLInputElement>>;
644
- Stepper: import("react").ForwardRefExoticComponent<NumberInputStepperProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof NumberInputStepperProps> & import("react").RefAttributes<HTMLDivElement>>;
753
+ InputField: import("react").ForwardRefExoticComponent<{
754
+ form?: string | undefined | undefined;
755
+ slot?: string | undefined | undefined;
756
+ style?: import("react").CSSProperties | undefined;
757
+ title?: string | undefined | undefined;
758
+ pattern?: string | undefined | undefined;
759
+ key?: import("react").Key | null | undefined;
760
+ defaultChecked?: boolean | undefined | undefined;
761
+ suppressContentEditableWarning?: boolean | undefined | undefined;
762
+ suppressHydrationWarning?: boolean | undefined | undefined;
763
+ accessKey?: string | undefined | undefined;
764
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
765
+ autoFocus?: boolean | undefined | undefined;
766
+ className?: string | undefined | undefined;
767
+ contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
768
+ contextMenu?: string | undefined | undefined;
769
+ dir?: string | undefined | undefined;
770
+ draggable?: (boolean | "true" | "false") | undefined;
771
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
772
+ hidden?: boolean | undefined | undefined;
773
+ id?: string | undefined | undefined;
774
+ lang?: string | undefined | undefined;
775
+ nonce?: string | undefined | undefined;
776
+ spellCheck?: (boolean | "true" | "false") | undefined;
777
+ tabIndex?: number | undefined | undefined;
778
+ translate?: "yes" | "no" | undefined | undefined;
779
+ radioGroup?: string | undefined | undefined;
780
+ role?: import("react").AriaRole | undefined;
781
+ about?: string | undefined | undefined;
782
+ content?: string | undefined | undefined;
783
+ datatype?: string | undefined | undefined;
784
+ inlist?: any;
785
+ prefix?: string | undefined | undefined;
786
+ property?: string | undefined | undefined;
787
+ rel?: string | undefined | undefined;
788
+ resource?: string | undefined | undefined;
789
+ rev?: string | undefined | undefined;
790
+ typeof?: string | undefined | undefined;
791
+ vocab?: string | undefined | undefined;
792
+ autoCorrect?: string | undefined | undefined;
793
+ autoSave?: string | undefined | undefined;
794
+ color?: string | undefined | undefined;
795
+ itemProp?: string | undefined | undefined;
796
+ itemScope?: boolean | undefined | undefined;
797
+ itemType?: string | undefined | undefined;
798
+ itemID?: string | undefined | undefined;
799
+ itemRef?: string | undefined | undefined;
800
+ results?: number | undefined | undefined;
801
+ security?: string | undefined | undefined;
802
+ unselectable?: "on" | "off" | undefined | undefined;
803
+ popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
804
+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
805
+ popoverTarget?: string | undefined | undefined;
806
+ inert?: boolean | undefined | undefined;
807
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
808
+ is?: string | undefined | undefined;
809
+ exportparts?: string | undefined | undefined;
810
+ part?: string | undefined | undefined;
811
+ "aria-activedescendant"?: string | undefined | undefined;
812
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
813
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
814
+ "aria-braillelabel"?: string | undefined | undefined;
815
+ "aria-brailleroledescription"?: string | undefined | undefined;
816
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
817
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
818
+ "aria-colcount"?: number | undefined | undefined;
819
+ "aria-colindex"?: number | undefined | undefined;
820
+ "aria-colindextext"?: string | undefined | undefined;
821
+ "aria-colspan"?: number | undefined | undefined;
822
+ "aria-controls"?: string | undefined | undefined;
823
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
824
+ "aria-describedby"?: string | undefined | undefined;
825
+ "aria-description"?: string | undefined | undefined;
826
+ "aria-details"?: string | undefined | undefined;
827
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
828
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
829
+ "aria-errormessage"?: string | undefined | undefined;
830
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
831
+ "aria-flowto"?: string | undefined | undefined;
832
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
833
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
834
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
835
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
836
+ "aria-keyshortcuts"?: string | undefined | undefined;
837
+ "aria-label"?: string | undefined | undefined;
838
+ "aria-labelledby"?: string | undefined | undefined;
839
+ "aria-level"?: number | undefined | undefined;
840
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
841
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
842
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
843
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
844
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
845
+ "aria-owns"?: string | undefined | undefined;
846
+ "aria-placeholder"?: string | undefined | undefined;
847
+ "aria-posinset"?: number | undefined | undefined;
848
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
849
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
850
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
851
+ "aria-required"?: (boolean | "true" | "false") | undefined;
852
+ "aria-roledescription"?: string | undefined | undefined;
853
+ "aria-rowcount"?: number | undefined | undefined;
854
+ "aria-rowindex"?: number | undefined | undefined;
855
+ "aria-rowindextext"?: string | undefined | undefined;
856
+ "aria-rowspan"?: number | undefined | undefined;
857
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
858
+ "aria-setsize"?: number | undefined | undefined;
859
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
860
+ "aria-valuemax"?: number | undefined | undefined;
861
+ "aria-valuemin"?: number | undefined | undefined;
862
+ "aria-valuenow"?: number | undefined | undefined;
863
+ "aria-valuetext"?: string | undefined | undefined;
864
+ children?: ReactNode;
865
+ dangerouslySetInnerHTML?: {
866
+ __html: string | TrustedHTML;
867
+ } | undefined | undefined;
868
+ onCopy?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
869
+ onCopyCapture?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
870
+ onCut?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
871
+ onCutCapture?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
872
+ onPaste?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
873
+ onPasteCapture?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
874
+ onCompositionEnd?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
875
+ onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
876
+ onCompositionStart?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
877
+ onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
878
+ onCompositionUpdate?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
879
+ onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
880
+ onFocus?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
881
+ onFocusCapture?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
882
+ onBlur?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
883
+ onBlurCapture?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
884
+ onChange?: import("react").ChangeEventHandler<HTMLInputElement, HTMLInputElement> | undefined;
885
+ onChangeCapture?: import("react").ChangeEventHandler<HTMLInputElement, Element> | undefined;
886
+ onBeforeInput?: import("react").InputEventHandler<HTMLInputElement> | undefined;
887
+ onBeforeInputCapture?: import("react").InputEventHandler<HTMLInputElement> | undefined;
888
+ onInput?: import("react").InputEventHandler<HTMLInputElement> | undefined;
889
+ onInputCapture?: import("react").InputEventHandler<HTMLInputElement> | undefined;
890
+ onReset?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
891
+ onResetCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
892
+ onSubmit?: import("react").SubmitEventHandler<HTMLInputElement> | undefined;
893
+ onSubmitCapture?: import("react").SubmitEventHandler<HTMLInputElement> | undefined;
894
+ onInvalid?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
895
+ onInvalidCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
896
+ onLoad?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
897
+ onLoadCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
898
+ onError?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
899
+ onErrorCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
900
+ onKeyDown?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
901
+ onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
902
+ onKeyPress?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
903
+ onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
904
+ onKeyUp?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
905
+ onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
906
+ onAbort?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
907
+ onAbortCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
908
+ onCanPlay?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
909
+ onCanPlayCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
910
+ onCanPlayThrough?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
911
+ onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
912
+ onDurationChange?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
913
+ onDurationChangeCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
914
+ onEmptied?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
915
+ onEmptiedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
916
+ onEncrypted?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
917
+ onEncryptedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
918
+ onEnded?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
919
+ onEndedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
920
+ onLoadedData?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
921
+ onLoadedDataCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
922
+ onLoadedMetadata?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
923
+ onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
924
+ onLoadStart?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
925
+ onLoadStartCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
926
+ onPause?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
927
+ onPauseCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
928
+ onPlay?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
929
+ onPlayCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
930
+ onPlaying?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
931
+ onPlayingCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
932
+ onProgress?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
933
+ onProgressCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
934
+ onRateChange?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
935
+ onRateChangeCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
936
+ onSeeked?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
937
+ onSeekedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
938
+ onSeeking?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
939
+ onSeekingCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
940
+ onStalled?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
941
+ onStalledCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
942
+ onSuspend?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
943
+ onSuspendCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
944
+ onTimeUpdate?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
945
+ onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
946
+ onVolumeChange?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
947
+ onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
948
+ onWaiting?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
949
+ onWaitingCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
950
+ onAuxClick?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
951
+ onAuxClickCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
952
+ onClick?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
953
+ onClickCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
954
+ onContextMenu?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
955
+ onContextMenuCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
956
+ onDoubleClick?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
957
+ onDoubleClickCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
958
+ onDrag?: import("react").DragEventHandler<HTMLInputElement> | undefined;
959
+ onDragCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
960
+ onDragEnd?: import("react").DragEventHandler<HTMLInputElement> | undefined;
961
+ onDragEndCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
962
+ onDragEnter?: import("react").DragEventHandler<HTMLInputElement> | undefined;
963
+ onDragEnterCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
964
+ onDragExit?: import("react").DragEventHandler<HTMLInputElement> | undefined;
965
+ onDragExitCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
966
+ onDragLeave?: import("react").DragEventHandler<HTMLInputElement> | undefined;
967
+ onDragLeaveCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
968
+ onDragOver?: import("react").DragEventHandler<HTMLInputElement> | undefined;
969
+ onDragOverCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
970
+ onDragStart?: import("react").DragEventHandler<HTMLInputElement> | undefined;
971
+ onDragStartCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
972
+ onDrop?: import("react").DragEventHandler<HTMLInputElement> | undefined;
973
+ onDropCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
974
+ onMouseDown?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
975
+ onMouseDownCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
976
+ onMouseEnter?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
977
+ onMouseLeave?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
978
+ onMouseMove?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
979
+ onMouseMoveCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
980
+ onMouseOut?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
981
+ onMouseOutCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
982
+ onMouseOver?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
983
+ onMouseOverCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
984
+ onMouseUp?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
985
+ onMouseUpCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
986
+ onSelect?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
987
+ onSelectCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
988
+ onTouchCancel?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
989
+ onTouchCancelCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
990
+ onTouchEnd?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
991
+ onTouchEndCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
992
+ onTouchMove?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
993
+ onTouchMoveCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
994
+ onTouchStart?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
995
+ onTouchStartCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
996
+ onPointerDown?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
997
+ onPointerDownCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
998
+ onPointerMove?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
999
+ onPointerMoveCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1000
+ onPointerUp?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1001
+ onPointerUpCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1002
+ onPointerCancel?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1003
+ onPointerCancelCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1004
+ onPointerEnter?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1005
+ onPointerLeave?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1006
+ onPointerOver?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1007
+ onPointerOverCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1008
+ onPointerOut?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1009
+ onPointerOutCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1010
+ onGotPointerCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1011
+ onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1012
+ onLostPointerCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1013
+ onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
1014
+ onScroll?: import("react").UIEventHandler<HTMLInputElement> | undefined;
1015
+ onScrollCapture?: import("react").UIEventHandler<HTMLInputElement> | undefined;
1016
+ onScrollEnd?: import("react").UIEventHandler<HTMLInputElement> | undefined;
1017
+ onScrollEndCapture?: import("react").UIEventHandler<HTMLInputElement> | undefined;
1018
+ onWheel?: import("react").WheelEventHandler<HTMLInputElement> | undefined;
1019
+ onWheelCapture?: import("react").WheelEventHandler<HTMLInputElement> | undefined;
1020
+ onAnimationStart?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
1021
+ onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
1022
+ onAnimationEnd?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
1023
+ onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
1024
+ onAnimationIteration?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
1025
+ onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
1026
+ onToggle?: import("react").ToggleEventHandler<HTMLInputElement> | undefined;
1027
+ onBeforeToggle?: import("react").ToggleEventHandler<HTMLInputElement> | undefined;
1028
+ onTransitionCancel?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1029
+ onTransitionCancelCapture?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1030
+ onTransitionEnd?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1031
+ onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1032
+ onTransitionRun?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1033
+ onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1034
+ onTransitionStart?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1035
+ onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
1036
+ accept?: string | undefined | undefined;
1037
+ multiple?: boolean | undefined | undefined;
1038
+ disabled?: boolean | undefined | undefined;
1039
+ height?: number | string | undefined | undefined;
1040
+ width?: number | string | undefined | undefined;
1041
+ min?: number | string | undefined | undefined;
1042
+ max?: number | string | undefined | undefined;
1043
+ step?: number | string | undefined | undefined;
1044
+ alt?: string | undefined | undefined;
1045
+ autoComplete?: import("react").HTMLInputAutoCompleteAttribute | undefined;
1046
+ capture?: boolean | "user" | "environment" | undefined | undefined;
1047
+ checked?: boolean | undefined | undefined;
1048
+ formAction?: string | ((formData: FormData) => void | Promise<void>) | undefined;
1049
+ formEncType?: string | undefined | undefined;
1050
+ formMethod?: string | undefined | undefined;
1051
+ formNoValidate?: boolean | undefined | undefined;
1052
+ formTarget?: string | undefined | undefined;
1053
+ list?: string | undefined | undefined;
1054
+ maxLength?: number | undefined | undefined;
1055
+ minLength?: number | undefined | undefined;
1056
+ name?: string | undefined | undefined;
1057
+ placeholder?: string | undefined | undefined;
1058
+ readOnly?: boolean | undefined | undefined;
1059
+ required?: boolean | undefined | undefined;
1060
+ size?: number | undefined | undefined;
1061
+ src?: string | undefined | undefined;
1062
+ } & import("react").RefAttributes<HTMLInputElement>>;
1063
+ Stepper: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
645
1064
  IncrementStepper: typeof IncrementStepper;
646
1065
  DecrementStepper: typeof DecrementStepper;
647
1066
  };
648
1067
  //#endregion
649
- //#region src/components/Piano/keyboard-shortcuts.d.ts
650
- type KeyboardShortcuts = {
651
- /**
652
- * Keys laid out from `noteRange.first`, one entry per semitone.
653
- *
654
- * An empty string leaves that note without a shortcut: `KeyboardEvent.key` is
655
- * never empty, so the entry can never match. Use it to skip the black keys
656
- * (see {@link SHORTCUTS.HOME_ROW_NATURAL}) and keep the remaining entries
657
- * lined up with the notes.
658
- */
659
- keys: string[];
660
- };
661
- /**
662
- * Ready-made keyboard layouts. Both assume `noteRange.first` is a C.
663
- */
664
- declare const SHORTCUTS: {
665
- /** Every semitone from C, over the two rows of a QWERTY keyboard. */
666
- HOME_ROW: {
667
- keys: string[];
668
- };
669
- /** The white keys only, on the home row. Black keys have no shortcut. */
670
- HOME_ROW_NATURAL: {
671
- keys: string[];
672
- };
673
- };
674
- //#endregion
675
1068
  //#region src/components/Piano/index.d.ts
676
- type KeyboardShortcutsScope = 'root' | 'window';
677
- /**
678
- * `style` that also takes CSS custom properties, which is how a key's colours
679
- * are set: see `index.css` for the ones each key type reads.
680
- */
681
- type CSSVariables = Record<`--${string}`, string | number | undefined>;
682
1069
  /**
683
1070
  * What {@link PianoProps.keyProps} may return for one key.
684
1071
  *
@@ -686,9 +1073,7 @@ type CSSVariables = Record<`--${string}`, string | number | undefined>;
686
1073
  * JSX syntax, not on an object type, and selecting on one is the usual way to
687
1074
  * mark a key out.
688
1075
  */
689
- type KeyAttributes = Omit<ComponentPropsWithoutRef<'div'>, 'style'> & {
690
- style?: CSSProperties & CSSVariables;
691
- } & Record<`data-${string}`, string | number | boolean | undefined>;
1076
+ type KeyAttributes = ComponentPropsWithoutRef<'div'> & Record<`data-${string}`, string | number | boolean | undefined>;
692
1077
  /** What a key is, when {@link PianoProps.label} or `keyProps` is asked about it. */
693
1078
  interface KeyState {
694
1079
  /** Position in the note range, counting from `noteRange.first`. */
@@ -769,16 +1154,9 @@ interface PianoProps {
769
1154
  * @default 0.6
770
1155
  */
771
1156
  blackKeyHeightRatio?: number;
772
- /**
773
- * Height of the keyboard. Sets `--height`; when it is omitted, the height
774
- * the theme gives stands, and the theme can tell `resizable` apart through
775
- * `data-resizable`.
776
- */
777
- height?: number | string;
778
- style?: CSSProperties & CSSVariables;
779
1157
  /**
780
1158
  * What to draw inside a key. `''`, `null` and `undefined` leave it bare, so
781
- * a layout with gaps — {@link SHORTCUTS.HOME_ROW_NATURAL}, say — needs no
1159
+ * a layout with gaps — `SHORTCUTS.HOME_ROW_NATURAL`, say — needs no
782
1160
  * special casing.
783
1161
  */
784
1162
  label?: (note: number, state: KeyState) => ReactNode;
@@ -813,40 +1191,20 @@ interface PianoMethods {
813
1191
  /**
814
1192
  * Customizable piano component.
815
1193
  */
816
- declare const Piano: {
1194
+ export declare const Piano: {
817
1195
  Root: import("react").ForwardRefExoticComponent<PianoProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof PianoProps> & import("react").RefAttributes<PianoMethods>>;
818
1196
  };
819
1197
  //#endregion
820
- //#region src/components/PointsEditor/Container.d.ts
821
- interface PointsEditorContainerProps {
822
- /** `<PointsEditor.Point />` goes here. */
823
- children?: ReactNode;
824
- }
825
- //#endregion
826
1198
  //#region src/components/PointsEditor/Background.d.ts
827
- interface PointsEditorBackgroundProps {
828
- /** Whatever the points are placed over: a graph, a canvas, an image. */
829
- children?: ReactNode;
830
- }
831
- declare function Background({ className, children, style, ...props }: PointsEditorBackgroundProps & Omit<ComponentPropsWithoutRef<'div'>, keyof PointsEditorBackgroundProps>): import("react").JSX.Element;
1199
+ declare function Background({ className, children, style, ...props }: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
832
1200
  //#endregion
833
1201
  //#region src/components/PointsEditor/Point.d.ts
834
- type PointBaseType = {
835
- x: number;
836
- y: number;
837
- };
838
- declare function clampPoint(point: PointBaseType, min?: Partial<PointBaseType>, max?: Partial<PointBaseType>): {
839
- x: number;
840
- y: number;
841
- };
842
- interface PointsEditorPointProps<T extends PointBaseType> {
1202
+ interface PointsEditorPointProps<T extends PointPosition> {
843
1203
  /**
844
1204
  * Where the point is, as `{ x, y }` from 0 to 1 on each axis, with `y`
845
1205
  * growing downwards.
846
1206
  */
847
1207
  value: T;
848
- /** Drawn inside the point: the theme's own dot stands when it is left out. */
849
- children?: ReactNode;
850
1208
  /**
851
1209
  * How the selection refers to this point. One is generated when it is left
852
1210
  * out, which lasts as long as the point is mounted — give your own if the
@@ -854,15 +1212,9 @@ interface PointsEditorPointProps<T extends PointBaseType> {
854
1212
  */
855
1213
  id?: string;
856
1214
  /** The lowest position the point can take, per axis. An axis left out is 0. */
857
- min?: Partial<PointBaseType>;
1215
+ min?: Partial<PointPosition>;
858
1216
  /** The highest position the point can take, per axis. An axis left out is 1. */
859
- max?: Partial<PointBaseType>;
860
- /** Width and height at once. Sets both `--width` and `--height`. */
861
- size?: number | string;
862
- /** Sets `--width`; the size the theme gives it stands when omitted. */
863
- width?: number | string;
864
- /** Sets `--height`; the size the theme gives it stands when omitted. */
865
- height?: number | string;
1217
+ max?: Partial<PointPosition>;
866
1218
  /** Sets `--color`, for the theme to colour the point with. */
867
1219
  color?: string;
868
1220
  /** Overrides the `disabled` of `PointsEditor.Root`. */
@@ -884,46 +1236,25 @@ interface PointsEditorPointProps<T extends PointBaseType> {
884
1236
  * Called with the new position when the point is dragged or moved by the
885
1237
  * arrow keys or the wheel, including when it moves along with a selection.
886
1238
  */
887
- onChange?: (value: PointBaseType) => void;
1239
+ onChange?: (value: PointPosition) => void;
888
1240
  /** Called when a drag on this point starts, with where the point is. */
889
- onDragStart?: (value: PointBaseType) => void;
1241
+ onDragStart?: (value: PointPosition) => void;
890
1242
  /** Called when that drag ends, with where the point is. */
891
- onDragEnd?: (value: PointBaseType) => void;
1243
+ onDragEnd?: (value: PointPosition) => void;
1244
+ style?: CSSProperties & CSSVariables<'color' | 'translate'>;
892
1245
  }
893
- declare function Point<T extends PointBaseType>({ value, children, id: idProp, min, max, size, width, height, color, disabled: _disabled, readonly: _readonly, wheel: _wheel, keyboard: _keyboard, 'aria-label': ariaLabel, 'aria-valuetext': ariaValuetext, onChange, onDragStart, onDragEnd, className, style, onPointerDown, onKeyDown, onFocus, ...props }: PointsEditorPointProps<T> & Omit<ComponentPropsWithoutRef<'div'>, keyof PointsEditorPointProps<T>>): import("react").JSX.Element;
1246
+ declare function Point<T extends PointPosition>({ value, children, id: idProp, min, max, color, disabled: _disabled, readonly: _readonly, wheel: _wheel, keyboard: _keyboard, 'aria-label': ariaLabel, 'aria-valuetext': ariaValuetext, onChange, onDragStart, onDragEnd, className, style, onPointerDown, onKeyDown, onFocus, ...props }: PointsEditorPointProps<T> & Omit<ComponentPropsWithoutRef<'div'>, keyof PointsEditorPointProps<T>>): import("react").JSX.Element;
894
1247
  //#endregion
895
1248
  //#region src/components/PointsEditor/SelectionBox.d.ts
896
- interface PointsEditorSelectionBoxProps {
897
- /** Drawn inside the box, which is only there while a drag is running. */
898
- children?: ReactNode;
899
- }
900
1249
  /**
901
1250
  * The box a drag on empty space draws, and what it covers is selected.
902
1251
  *
903
1252
  * Nothing is rendered while no drag is running, and leaving it out leaves the
904
1253
  * editor without one — the selection still works, it just cannot be seen.
905
1254
  */
906
- declare function SelectionBox({ children, className, style, ...props }: PointsEditorSelectionBoxProps & Omit<ComponentPropsWithoutRef<'div'>, keyof PointsEditorSelectionBoxProps>): import("react").JSX.Element | null;
1255
+ declare function SelectionBox({ children, className, style, ...props }: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element | null;
907
1256
  //#endregion
908
1257
  //#region src/components/PointsEditor/context.d.ts
909
- /**
910
- * What a `Point` tells the editor about itself, so that a selection can be
911
- * moved without the editor knowing how the points are stored.
912
- *
913
- * Held behind a ref and rewritten on every render: the value changes on every
914
- * frame of a drag, and a registry keyed on it would be rebuilt just as often.
915
- */
916
- interface PointRegistration {
917
- value: PointBaseType;
918
- min?: Partial<PointBaseType>;
919
- max?: Partial<PointBaseType>;
920
- readonly: boolean;
921
- onChange?: (value: PointBaseType) => void;
922
- /** The point's own element, to match the focus against. */
923
- element: HTMLElement | null;
924
- /** The wheel option this point resolved, root inheritance applied. */
925
- wheel: ModifierValue<InputEventOption> | null;
926
- }
927
1258
  type PointsEditorContextValue = {
928
1259
  disabled: boolean;
929
1260
  readonly: boolean;
@@ -945,52 +1276,25 @@ type PointsEditorContextValue = {
945
1276
  selectable: boolean;
946
1277
  /** Ids of the points currently selected. Always empty while `selectable` is off. */
947
1278
  selection: readonly string[];
948
- /** Register a point so that a selection can move it with the rest. */
949
- registerPoint: (id: string, entry: RefObject<PointRegistration>) => () => void;
950
1279
  /**
951
- * Whether the element is a point, or inside one. The registry knows which
952
- * elements the points are, so nothing has to be recognised by a class name.
1280
+ * The selection and the moves, from `createPointsEditor` in
1281
+ * `@tremolo-ui/dom`: every `Point` registers with it, and a press, a drag,
1282
+ * a key or the wheel goes through it so that a selection moves as one.
953
1283
  */
954
- isPointElement: (element: Element | null | undefined) => boolean;
955
- /**
956
- * A pointer went down on a point: works out the new selection and takes the
957
- * snapshot the move will be measured against.
958
- */
959
- beginPointDrag: (id: string, modifiers: ModifierState) => void;
960
- /** Move everything the drag picked up, by one amount, clamped as one. */
961
- movePointDrag: (delta: PointBaseType) => void;
962
- /**
963
- * Move the selection by an amount that did not come from a drag — an arrow
964
- * key or a wheel notch. The current values are the starting point.
965
- */
966
- nudgeSelection: (id: string, delta: PointBaseType) => void;
967
- /**
968
- * Move the point that currently holds focus by one notch. The wheel listener
969
- * belongs to `Container` rather than to every `Point`, so the lookup of who
970
- * has focus happens here, where the registry is. Returns whether a point
971
- * took it, so the caller knows whether to consume the event.
972
- */
973
- nudgeFocusedPoint: (axis: 'x' | 'y', direction: number, modifiers: ModifierState) => boolean;
1284
+ editor: PointsEditorInstance;
974
1285
  /** The selection box, while one is being dragged. */
975
1286
  selectionBox: SelectionBoxRect | null;
976
- beginSelectionBox: (at: PointBaseType, modifiers: ModifierState) => void;
977
- moveSelectionBox: (to: PointBaseType) => void;
978
- endSelectionBox: () => void;
979
1287
  };
980
1288
  /**
981
1289
  * The settings `Root` was given, for the subcomponents to read. A point's
982
1290
  * value still belongs to the `Point` that draws it; what the root keeps is
983
1291
  * which points are selected, and a registry of who they are.
984
1292
  */
985
- declare function usePointsEditorContext(): PointsEditorContextValue;
986
- declare function usePointsEditorContext<T>(selector: (state: PointsEditorContextValue) => T): T;
1293
+ export declare function usePointsEditorContext(): PointsEditorContextValue;
1294
+ export declare function usePointsEditorContext<T>(selector: (state: PointsEditorContextValue) => T): T;
987
1295
  //#endregion
988
1296
  //#region src/components/PointsEditor/index.d.ts
989
1297
  interface PointsEditorProps {
990
- /** Sets `--width`; the size the theme gives it stands when omitted. */
991
- width?: number | string;
992
- /** Sets `--height`; the size the theme gives it stands when omitted. */
993
- height?: number | string;
994
1298
  /**
995
1299
  * Make the points unchangeable and remove them from the tab order.
996
1300
  * The parts carry `data-disabled` while it is set.
@@ -1106,10 +1410,10 @@ interface PointsEditorProps {
1106
1410
  /**
1107
1411
  * Multiple Point Controller
1108
1412
  */
1109
- declare const PointsEditor: {
1413
+ export declare const PointsEditor: {
1110
1414
  Root: import("react").ForwardRefExoticComponent<PointsEditorProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof PointsEditorProps> & import("react").RefAttributes<HTMLDivElement>>;
1111
1415
  Background: typeof Background;
1112
- Container: import("react").ForwardRefExoticComponent<PointsEditorContainerProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "children"> & import("react").RefAttributes<HTMLDivElement>>;
1416
+ Container: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
1113
1417
  Point: typeof Point;
1114
1418
  SelectionBox: typeof SelectionBox;
1115
1419
  };
@@ -1122,18 +1426,7 @@ interface SliderThumbProps {
1122
1426
  * leave the matching room around the track.
1123
1427
  */
1124
1428
  color?: string;
1125
- className?: string;
1126
- style?: CSSProperties;
1127
- /**
1128
- * Rendered inside the thumb. The thumb is one element either way, so what
1129
- * is passed here is decoration on top of it rather than a replacement for
1130
- * it — `className` and `style` are how its own appearance is changed.
1131
- */
1132
- children?: ReactNode;
1133
- 'aria-label'?: AriaAttributes['aria-label'];
1134
- 'aria-labelledby'?: AriaAttributes['aria-labelledby'];
1135
- 'aria-describedby'?: AriaAttributes['aria-describedby'];
1136
- 'aria-valuetext'?: AriaAttributes['aria-valuetext'];
1429
+ style?: CSSProperties & CSSVariables<'color' | 'translate'>;
1137
1430
  }
1138
1431
  interface SliderThumbMethods {
1139
1432
  focus: () => void;
@@ -1153,25 +1446,9 @@ interface SliderTrackProps {
1153
1446
  active?: string;
1154
1447
  /** Colour of the rest of the track. Sets `--inactive`. */
1155
1448
  inactive?: string;
1156
- className?: string;
1157
- style?: CSSProperties;
1158
- /** `<Slider.Thumb />` goes here. */
1159
- children?: ReactNode;
1449
+ style?: CSSProperties & CSSVariables<'length' | 'thickness' | 'active' | 'inactive' | 'percent'>;
1160
1450
  }
1161
1451
  //#endregion
1162
- //#region src/components/Slider/type.d.ts
1163
- /**
1164
- * How `Slider.Marks` fills itself in when it is given no children: one option
1165
- * every `per`, or every `step` of the slider. The object form turns off the
1166
- * mark or the label for the whole set; a single option is customized by
1167
- * writing `Slider.MarksOption` out instead.
1168
- */
1169
- type MarksOptions = 'step' | number | {
1170
- per: 'step' | number;
1171
- mark?: boolean;
1172
- label?: boolean;
1173
- };
1174
- //#endregion
1175
1452
  //#region src/components/Slider/Marks.d.ts
1176
1453
  interface SliderMarksProps {
1177
1454
  /**
@@ -1188,11 +1465,7 @@ interface SliderMarksProps {
1188
1465
  * `'step'` makes one per step, which is a great many for a fine `step`.
1189
1466
  */
1190
1467
  options?: MarksOptions;
1191
- /**
1192
- * `<Slider.MarksOption />` goes here, one per mark. Ignored while `options`
1193
- * is set.
1194
- */
1195
- children?: ReactNode;
1468
+ style?: CSSProperties & CSSVariables<'gap'>;
1196
1469
  }
1197
1470
  declare function Marks({ gap, options, children, className, style, ...props }: SliderMarksProps & Omit<ComponentPropsWithoutRef<'div'>, keyof SliderMarksProps>): import("react").JSX.Element;
1198
1471
  //#endregion
@@ -1216,8 +1489,6 @@ interface SliderMarksOptionProps {
1216
1489
  length?: number | string;
1217
1490
  /** Space between the mark and the label. Sets `--gap`. */
1218
1491
  gap?: number | string;
1219
- /** Width of the label. Sets `--label-width`. */
1220
- labelWidth?: number | string;
1221
1492
  /** Classes for the mark and the label inside the option. */
1222
1493
  classes?: {
1223
1494
  mark?: string;
@@ -1228,8 +1499,9 @@ interface SliderMarksOptionProps {
1228
1499
  mark?: CSSProperties;
1229
1500
  label?: CSSProperties;
1230
1501
  };
1502
+ style?: CSSProperties & CSSVariables<'thickness' | 'length' | 'gap' | 'translate'>;
1231
1503
  }
1232
- declare function MarksOption({ value, mark, label, thickness, length, gap, labelWidth, classes, styles, className, style, ...props }: SliderMarksOptionProps & Omit<ComponentPropsWithoutRef<'div'>, keyof SliderMarksOptionProps>): import("react").JSX.Element;
1504
+ declare function MarksOption({ value, mark, label, thickness, length, gap, classes, styles, className, style, ...props }: SliderMarksOptionProps & Omit<ComponentPropsWithoutRef<'div'>, keyof SliderMarksOptionProps>): import("react").JSX.Element;
1233
1505
  //#endregion
1234
1506
  //#region src/components/Slider/context.d.ts
1235
1507
  type SliderContextValue = {
@@ -1258,8 +1530,8 @@ type SliderContextValue = {
1258
1530
  * Everything here is derived during render, so there is no state to keep in
1259
1531
  * sync: `value` comes from the props of `Root` and the rest follows from it.
1260
1532
  */
1261
- declare function useSliderContext(): SliderContextValue;
1262
- declare function useSliderContext<T>(selector: (state: SliderContextValue) => T): T;
1533
+ export declare function useSliderContext(): SliderContextValue;
1534
+ export declare function useSliderContext<T>(selector: (state: SliderContextValue) => T): T;
1263
1535
  //#endregion
1264
1536
  //#region src/components/Slider/index.d.ts
1265
1537
  interface SliderProps {
@@ -1364,8 +1636,6 @@ interface SliderProps {
1364
1636
  * The parts carry `data-readonly` while it is set.
1365
1637
  */
1366
1638
  readonly?: boolean;
1367
- className?: string;
1368
- style?: CSSProperties;
1369
1639
  /** Called with the new value when a drag, the wheel or an arrow key moves it. */
1370
1640
  onChange?: (value: number) => void;
1371
1641
  /** Called when a drag starts, with the value where the track was pressed. */
@@ -1392,7 +1662,7 @@ interface SliderMethods {
1392
1662
  /**
1393
1663
  * Customizable slider
1394
1664
  */
1395
- declare const Slider: {
1665
+ export declare const Slider: {
1396
1666
  Root: React.ForwardRefExoticComponent<SliderProps & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof SliderProps> & React.RefAttributes<SliderMethods>>;
1397
1667
  Thumb: React.ForwardRefExoticComponent<SliderThumbProps & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof SliderThumbProps> & React.RefAttributes<SliderThumbMethods>>;
1398
1668
  Track: React.ForwardRefExoticComponent<SliderTrackProps & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof SliderTrackProps> & React.RefAttributes<HTMLDivElement>>;
@@ -1400,34 +1670,6 @@ declare const Slider: {
1400
1670
  MarksOption: typeof MarksOption;
1401
1671
  };
1402
1672
  //#endregion
1403
- //#region src/components/XYPad/context.d.ts
1404
- type XYPadContextValue = {
1405
- value: XY<number>;
1406
- min: XY<number>;
1407
- max: XY<number>;
1408
- step: XY<number>;
1409
- /** How the value of each axis is distributed across the travel. */
1410
- scale: XY<Scale>;
1411
- reverse: XY<boolean>;
1412
- disabled: boolean;
1413
- readonly: boolean;
1414
- onChange?: (value: XY<number>) => void;
1415
- /**
1416
- * Position of the thumb, 0-100 per axis, already accounting for `reverse`.
1417
- */
1418
- percent: XY<number>;
1419
- /** `Area` registers its element here; `Root` normalizes the pointer against it. */
1420
- areaRef: RefObject<HTMLDivElement | null>;
1421
- /** `Thumb` registers itself here; `Root` focuses it when a drag starts. */
1422
- thumbRef: RefObject<XYPadThumbMethods | null>;
1423
- };
1424
- /**
1425
- * Everything here is derived during render, so there is no state to keep in
1426
- * sync: `value` comes from the props of `Root` and the rest follows from it.
1427
- */
1428
- declare function useXYPadContext(): XYPadContextValue;
1429
- declare function useXYPadContext<T>(selector: (state: XYPadContextValue) => T): T;
1430
- //#endregion
1431
1673
  //#region src/components/XYPad/Thumb.d.ts
1432
1674
  interface XYPadThumbProps {
1433
1675
  /**
@@ -1436,14 +1678,6 @@ interface XYPadThumbProps {
1436
1678
  * the matching room around the area.
1437
1679
  */
1438
1680
  color?: string;
1439
- className?: string;
1440
- style?: CSSProperties;
1441
- /**
1442
- * Rendered inside the thumb. The thumb is one element either way, so what
1443
- * is passed here is decoration on top of it rather than a replacement for
1444
- * it — `className` and `style` are how its own appearance is changed.
1445
- */
1446
- children?: ReactNode;
1447
1681
  /**
1448
1682
  * The accessible name of each axis, as `[x, y]`. There are two range inputs
1449
1683
  * inside the thumb, so each takes a name of its own; a single string names
@@ -1459,25 +1693,40 @@ interface XYPadThumbProps {
1459
1693
  * `[x, y]` or one for both.
1460
1694
  */
1461
1695
  'aria-valuetext'?: XYInput<AriaAttributes['aria-valuetext']>;
1696
+ style?: CSSProperties & CSSVariables<'color' | 'translate'>;
1462
1697
  }
1463
1698
  interface XYPadThumbMethods {
1464
1699
  focus: () => void;
1465
1700
  blur: () => void;
1466
1701
  }
1467
1702
  //#endregion
1468
- //#region src/components/XYPad/Area.d.ts
1469
- interface XYPadAreaProps {
1470
- /** Sets `--width`; the size the theme gives it stands when omitted. */
1471
- width?: number | string;
1472
- /** Sets `--height`; the size the theme gives it stands when omitted. */
1473
- height?: number | string;
1474
- /** Sets `--color`, for the theme to colour the area with. */
1475
- color?: string;
1476
- className?: string;
1477
- style?: CSSProperties;
1478
- /** `<XYPad.Thumb />` goes here. */
1479
- children?: ReactNode;
1480
- }
1703
+ //#region src/components/XYPad/context.d.ts
1704
+ type XYPadContextValue = {
1705
+ value: XY<number>;
1706
+ min: XY<number>;
1707
+ max: XY<number>;
1708
+ step: XY<number>;
1709
+ /** How the value of each axis is distributed across the travel. */
1710
+ scale: XY<Scale>;
1711
+ reverse: XY<boolean>;
1712
+ disabled: boolean;
1713
+ readonly: boolean;
1714
+ onChange?: (value: XY<number>) => void;
1715
+ /**
1716
+ * Position of the thumb, 0-100 per axis, already accounting for `reverse`.
1717
+ */
1718
+ percent: XY<number>;
1719
+ /** `Area` registers its element here; `Root` normalizes the pointer against it. */
1720
+ areaRef: RefObject<HTMLDivElement | null>;
1721
+ /** `Thumb` registers itself here; `Root` focuses it when a drag starts. */
1722
+ thumbRef: RefObject<XYPadThumbMethods | null>;
1723
+ };
1724
+ /**
1725
+ * Everything here is derived during render, so there is no state to keep in
1726
+ * sync: `value` comes from the props of `Root` and the rest follows from it.
1727
+ */
1728
+ export declare function useXYPadContext(): XYPadContextValue;
1729
+ export declare function useXYPadContext<T>(selector: (state: XYPadContextValue) => T): T;
1481
1730
  //#endregion
1482
1731
  //#region src/components/XYPad/index.d.ts
1483
1732
  /**
@@ -1610,20 +1859,24 @@ interface XYPadMethods {
1610
1859
  /**
1611
1860
  * Simple XYPad
1612
1861
  */
1613
- declare const XYPad: {
1862
+ export declare const XYPad: {
1614
1863
  Root: import("react").ForwardRefExoticComponent<XYPadProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof XYPadProps> & import("react").RefAttributes<XYPadMethods>>;
1615
1864
  Thumb: import("react").ForwardRefExoticComponent<XYPadThumbProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof XYPadThumbProps> & import("react").RefAttributes<XYPadThumbMethods>>;
1616
- Area: import("react").ForwardRefExoticComponent<XYPadAreaProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof XYPadAreaProps> & import("react").RefAttributes<HTMLDivElement>>;
1865
+ Area: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
1617
1866
  };
1618
1867
  //#endregion
1619
1868
  //#region src/hooks/useAnimationFrame.d.ts
1620
- declare function useAnimationFrame(callback?: () => void, deps?: DependencyList): void;
1869
+ export declare function useAnimationFrame(callback?: () => void, deps?: DependencyList): void;
1621
1870
  //#endregion
1622
1871
  //#region src/hooks/useDrag.d.ts
1623
- interface UseDragProps {
1872
+ interface UseDragOptions {
1624
1873
  /**
1625
- * Threshold at which the onDrag event fires.
1626
- * Prevents onDrag events from firing, for example, when double-clicking.
1874
+ * Pixels the pointer has to travel before the drag counts as one.
1875
+ *
1876
+ * A click moves the pointer by a pixel or two, so without a threshold a
1877
+ * double click reports a drag between the two presses.
1878
+ *
1879
+ * @default 1
1627
1880
  */
1628
1881
  threshold?: number;
1629
1882
  /** CSS cursor to show while dragging. Applied to the element itself. */
@@ -1637,11 +1890,16 @@ interface UseDragProps {
1637
1890
  */
1638
1891
  pointerLock?: boolean;
1639
1892
  /**
1893
+ * Called on every move once the drag has started, with the pointer position
1894
+ * relative to the element and how far it moved since the last call.
1895
+ *
1640
1896
  * @param state the whole drag, for anything the four numbers leave out —
1641
1897
  * the pointer event and its modifier keys, most of all.
1642
1898
  */
1643
1899
  onDrag?: (x: number, y: number, deltaX: number, deltaY: number, state: DragState) => void;
1900
+ /** Called once the pointer has moved past `threshold`, not on pointerdown. */
1644
1901
  onDragStart?: (state: DragState) => void;
1902
+ /** Called when the pointer is released, only if the drag ever started. */
1645
1903
  onDragEnd?: (state: DragState) => void;
1646
1904
  }
1647
1905
  /**
@@ -1649,12 +1907,12 @@ interface UseDragProps {
1649
1907
  *
1650
1908
  * @returns a ref callback to attach to the element being dragged
1651
1909
  */
1652
- declare function useDrag<T extends Element>({ threshold, cursor, pointerLock, onDrag, onDragStart, onDragEnd }: UseDragProps): (node: T | null) => void;
1910
+ export declare function useDrag<T extends Element>({ threshold, cursor, pointerLock, onDrag, onDragStart, onDragEnd }: UseDragOptions): (node: T | null) => void;
1653
1911
  //#endregion
1654
1912
  //#region src/hooks/useDragValue.d.ts
1655
1913
  interface UseDragValueOptions {
1656
1914
  /** Scaling of each axis; a single value applies to both. */
1657
- axis: XYInput$1<AxisOptions>;
1915
+ axis: XYInput<AxisOptions>;
1658
1916
  /**
1659
1917
  * Normalize the pointer against the bounding rect of this element, so that
1660
1918
  * the value *is* the position pointed at.
@@ -1668,12 +1926,12 @@ interface UseDragValueOptions {
1668
1926
  *
1669
1927
  * Give either this or `baseElementRef`.
1670
1928
  */
1671
- getValue?: () => XY$1<number>;
1929
+ getValue?: () => XY<number>;
1672
1930
  /**
1673
1931
  * Pixels of movement that span the whole range, with `getValue`.
1674
1932
  * @default 100
1675
1933
  */
1676
- pixelRange?: XYInput$1<number>;
1934
+ pixelRange?: XYInput<number>;
1677
1935
  /**
1678
1936
  * How much the movement counts, read on every move. `0.1` makes the same
1679
1937
  * movement cover a tenth of the range, which is what a fine-adjustment
@@ -1687,9 +1945,19 @@ interface UseDragValueOptions {
1687
1945
  * @see elementMapping
1688
1946
  */
1689
1947
  sensitivity?: (state: DragState) => number;
1690
- /** @see DragValueOptions.updateOnPointerDown */
1948
+ /**
1949
+ * Move the value on pointerdown, before the pointer has moved at all. With
1950
+ * `baseElementRef` that makes a press jump the value to where it landed.
1951
+ *
1952
+ * @see DragValueOptions.updateOnPointerDown
1953
+ */
1691
1954
  updateOnPointerDown?: boolean;
1692
- /** @default 0 */
1955
+ /**
1956
+ * Pixels the pointer has to travel before the drag counts as one. The
1957
+ * default is 0, so the value follows the very first move.
1958
+ *
1959
+ * @default 0
1960
+ */
1693
1961
  threshold?: number;
1694
1962
  /** CSS cursor to show while dragging. Applied to the element itself. */
1695
1963
  cursor?: string;
@@ -1710,35 +1978,63 @@ interface UseDragValueOptions {
1710
1978
  */
1711
1979
  shouldStart?: (event: PointerEvent) => boolean;
1712
1980
  /**
1981
+ * Called with the new value whenever the drag moves it. The hook holds no
1982
+ * value of its own, so this is where it is stored.
1983
+ *
1713
1984
  * @param state the whole drag, for anything the value leaves out — the
1714
1985
  * pointer event and its modifier keys, most of all.
1715
1986
  */
1716
- onChange?: (value: XY$1<number>, state: DragState) => void;
1717
- onDragStart?: (value: XY$1<number>, state: DragState) => void;
1718
- onDragEnd?: (value: XY$1<number>, state: DragState) => void;
1987
+ onChange?: (value: XY<number>, state: DragState) => void;
1988
+ /** Called once the drag starts, with the value it starts from. */
1989
+ onDragStart?: (value: XY<number>, state: DragState) => void;
1990
+ /** Called when the pointer is released, with the value it ends on. */
1991
+ onDragEnd?: (value: XY<number>, state: DragState) => void;
1719
1992
  }
1720
1993
  /**
1721
1994
  * Drive a value with a pointer drag.
1722
1995
  *
1723
1996
  * @returns a ref callback for the element that starts the drag, and whether a drag is in progress
1724
1997
  */
1725
- declare function useDragValue<T extends Element>(options: UseDragValueOptions): {
1998
+ export declare function useDragValue<T extends Element>(options: UseDragValueOptions): {
1726
1999
  refCallback: (node: T | null) => void;
1727
2000
  dragging: boolean;
1728
2001
  };
1729
2002
  //#endregion
2003
+ //#region src/hooks/useDropZone.d.ts
2004
+ interface UseDropZoneOptions extends Omit<DropZoneOptions, 'onStateChange'> {}
2005
+ /**
2006
+ * Take files dropped onto an element.
2007
+ *
2008
+ * Any element can become a drop target this way — a waveform display, a track
2009
+ * lane, a canvas — without wrapping it in anything.
2010
+ *
2011
+ * @returns a ref callback for the element, and whether a drag is over it
2012
+ */
2013
+ export declare function useDropZone<T extends Element>({ accept, multiple, disabled, onDrop, onReject }?: UseDropZoneOptions): {
2014
+ refCallback: (node: T | null) => void;
2015
+ over: boolean;
2016
+ invalid: boolean;
2017
+ };
2018
+ //#endregion
1730
2019
  //#region src/hooks/useEventListener.d.ts
1731
2020
  type Target = EventTarget | null | (() => EventTarget | null);
1732
2021
  type Options = boolean | AddEventListenerOptions;
1733
- declare function useEventListener<K extends keyof DocumentEventMap>(target: Target, event: K, handler: (event: DocumentEventMap[K]) => void, options?: Options): VoidFunction;
1734
- declare function useEventListener<K extends keyof WindowEventMap>(target: Target, event: K, handler: (event: WindowEventMap[K]) => void, options?: Options): VoidFunction;
1735
- declare function useEventListener<K extends keyof GlobalEventHandlersEventMap>(target: Target, event: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, options?: Options): VoidFunction;
2022
+ export declare function useEventListener<K extends keyof DocumentEventMap>(target: Target, event: K, handler: (event: DocumentEventMap[K]) => void, options?: Options): VoidFunction;
2023
+ export declare function useEventListener<K extends keyof WindowEventMap>(target: Target, event: K, handler: (event: WindowEventMap[K]) => void, options?: Options): VoidFunction;
2024
+ export declare function useEventListener<K extends keyof GlobalEventHandlersEventMap>(target: Target, event: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, options?: Options): VoidFunction;
1736
2025
  //#endregion
1737
2026
  //#region src/hooks/useInterval.d.ts
1738
- declare function useInterval(callback: () => void, delay: number | null): void;
2027
+ export declare function useInterval(callback: () => void, delay: number | null): void;
1739
2028
  //#endregion
1740
2029
  //#region src/hooks/useLongPress.d.ts
1741
- declare function useLongPress(callback: () => void, initialDelay?: number, interval?: number): (event?: Pick<PointerEvent, "button" | "pointerId">) => void;
2030
+ /**
2031
+ * Repeat `callback` while a pointer is held down: once on the press, then
2032
+ * every `interval` after `initialDelay`. The repeat itself is
2033
+ * `createLongPress` in `@tremolo-ui/dom`.
2034
+ *
2035
+ * Returns the function that starts a press, for an `onPointerDown`.
2036
+ */
2037
+ export declare function useLongPress(callback: () => void, initialDelay?: number, interval?: number): (event?: Pick<PointerEvent, "button" | "pointerId">) => void | undefined;
1742
2038
  //#endregion
1743
2039
  //#region src/hooks/useMIDIAccess.d.ts
1744
2040
  /**
@@ -1751,8 +2047,8 @@ declare function useLongPress(callback: () => void, initialDelay?: number, inter
1751
2047
  * messages. Browsers treat that as a separate, more sensitive permission, so
1752
2048
  * ask for it only when it is actually used.
1753
2049
  */
1754
- declare function useMIDIAccess(requestOnMount?: boolean): {
1755
- request: (options?: MIDIAccessOptions$1) => void;
2050
+ export declare function useMIDIAccess(requestOnMount?: boolean): {
2051
+ request: (options?: MIDIAccessOptions) => void;
1756
2052
  midiAccess: MIDIAccess | null;
1757
2053
  error: import("@tremolo-ui/dom").MIDIAccessError | null;
1758
2054
  inputs: readonly MIDIInput[];
@@ -1776,7 +2072,7 @@ declare function useMIDIAccess(requestOnMount?: boolean): {
1776
2072
  * },
1777
2073
  * })
1778
2074
  */
1779
- declare function useMIDIInput(midiAccess: MIDIAccess | null, handlers: MIDIInputHandlers): void;
2075
+ export declare function useMIDIInput(midiAccess: MIDIAccess | null, handlers: MIDIInputHandlers): void;
1780
2076
  //#endregion
1781
2077
  //#region src/hooks/useMIDIMessage.d.ts
1782
2078
  /**
@@ -1786,10 +2082,10 @@ declare function useMIDIInput(midiAccess: MIDIAccess | null, handlers: MIDIInput
1786
2082
  * listeners are attached once per `midiAccess` and stay attached, and devices
1787
2083
  * plugged in later are picked up.
1788
2084
  */
1789
- declare function useMIDIMessage(midiAccess: MIDIAccess | null, onMIDIMessage: (event: MIDIMessageEvent) => void): void;
2085
+ export declare function useMIDIMessage(midiAccess: MIDIAccess | null, onMIDIMessage: (event: MIDIMessageEvent) => void): void;
1790
2086
  //#endregion
1791
2087
  //#region src/hooks/useWheel.d.ts
1792
- interface UseWheelOptions extends WheelOptions {
2088
+ interface UseWheelOptions extends Omit<WheelOptions, 'onWheel'> {
1793
2089
  /**
1794
2090
  * Listen on this element rather than on the one the returned ref callback is
1795
2091
  * attached to, and ignore that callback.
@@ -1811,31 +2107,7 @@ interface UseWheelOptions extends WheelOptions {
1811
2107
  *
1812
2108
  * @returns a ref callback to attach to the element, unused when `target` is given
1813
2109
  */
1814
- declare function useWheel<T extends Element>(onWheel: (event: WheelEvent) => void, { requireFocus, target }?: UseWheelOptions): (node: T | null) => void;
1815
- //#endregion
1816
- //#region src/input-event.d.ts
1817
- /**
1818
- * The keyboard amount used by Knob, NumberInput, Slider, and XYPad by default:
1819
- * 1 per press in the units of the value, and 0.1 with shift held. That is one
1820
- * `step` only while `step` is 1; a coarser `step` rounds 1 straight back, which
1821
- * `useCheckSteps` warns about.
1822
- *
1823
- * A modifier entry is not snapped to `step`, which is what lets the finer
1824
- * amount move at all — see `applyDelta` in `@tremolo-ui/functions`.
1825
- */
1826
- declare const DEFAULT_KEYBOARD_OPTIONS: ModifierValue<InputEventOption>;
1827
- /**
1828
- * The wheel amount used by Knob, NumberInput, Slider, and XYPad by default.
1829
- *
1830
- * Browsers turn shift+wheel into horizontal scrolling, which empties `deltaY`
1831
- * and fills `deltaX`, so no modifier is bound here.
1832
- */
1833
- declare const DEFAULT_WHEEL_OPTIONS: ModifierValue<InputEventOption>;
1834
- /**
1835
- * The drag sensitivity used by value controls by default. Shift makes the
1836
- * same movement cover a tenth of the range, matching the arrow keys.
1837
- */
1838
- declare const DEFAULT_DRAG_SENSITIVITY: ModifierValue<number>;
2110
+ export declare function useWheel<T extends Element>(onWheel: (event: WheelEvent) => void, { requireFocus, target }?: UseWheelOptions): (node: T | null) => void;
1839
2111
  //#endregion
1840
- export { AnimationCanvas, type AnimationCanvasCommonProps, type AnimationCanvasFixedProps, type AnimationCanvasProps, type AnimationCanvasResizableProps, type CSSVariables, DEFAULT_DRAG_SENSITIVITY, DEFAULT_KEYBOARD_OPTIONS, DEFAULT_WHEEL_OPTIONS, type DrawFunction, type InitFunction, type KeyAttributes, type KeyState, type KeyboardShortcuts, Knob, type KnobContextValue, type KnobMethods, type KnobProps, type KnobSVGRootProps, type KnobThumbProps, type MIDIAccessError, type MIDIAccessOptions, type MIDIInputHandlers, type MarksOptions, NOT_SUPPORTED, NumberInput, type NumberInputContextValue, type NumberInputDecrementStepperProps, type NumberInputIncrementStepperProps, type NumberInputInputFieldProps, type NumberInputMethods, type NumberInputProps, type NumberInputStepperProps, PERMISSION_DENIED, PITCH_BEND_CENTER, Piano, type PianoMethods, type PianoProps, type PointBaseType, PointsEditor, type PointsEditorBackgroundProps, type PointsEditorContainerProps, type PointsEditorContextValue, type PointsEditorPointProps, type PointsEditorProps, type PointsEditorSelectionBoxProps, SHORTCUTS, Slider, type SliderContextValue, type SliderMarksOptionProps, type SliderMarksProps, type SliderMethods, type SliderProps, type SliderThumbMethods, type SliderThumbProps, type SliderTrackProps, UNAVAILABLE, type UseDragValueOptions, type UseWheelOptions, type XY, type XYInput, XYPad, type XYPadAreaProps, type XYPadContextValue, type XYPadMethods, type XYPadProps, type XYPadThumbMethods, type XYPadThumbProps, clampPoint, useAnimationFrame, useDrag, useDragValue, useEventListener, useInterval, useKnobContext, useLongPress, useMIDIAccess, useMIDIInput, useMIDIMessage, useNumberInputContext, usePointsEditorContext, useSliderContext, useWheel, useXYPadContext };
2112
+ export type { AnimationCanvasCommonProps, AnimationCanvasFixedProps, AnimationCanvasProps, AnimationCanvasResizableProps, CSSVariables, DrawFunction, DropZoneProps, FileInputContextValue, FileInputProps, FileInputTriggerProps, InitFunction, KeyAttributes, KeyState, KnobContextValue, KnobMethods, KnobProps, KnobSVGRootProps, KnobThumbProps, NumberInputContextValue, NumberInputMethods, NumberInputProps, PianoMethods, PianoProps, PointsEditorContextValue, PointsEditorPointProps, PointsEditorProps, SliderContextValue, SliderMarksOptionProps, SliderMarksProps, SliderMethods, SliderProps, SliderThumbMethods, SliderThumbProps, SliderTrackProps, UseDragOptions, UseDragValueOptions, UseDropZoneOptions, UseWheelOptions, XYPadContextValue, XYPadMethods, XYPadProps, XYPadThumbMethods, XYPadThumbProps };
1841
2113
  //# sourceMappingURL=index.d.ts.map