@tremolo-ui/react 0.0.12 → 0.1.0-alpha.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/cjs/index.js +316 -232
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/components/Knob/index.d.ts +12 -0
  4. package/dist/cjs/types/components/Knob/index.d.ts.map +1 -1
  5. package/dist/cjs/types/components/Piano/KeyLabel.d.ts +1 -3
  6. package/dist/cjs/types/components/Piano/KeyLabel.d.ts.map +1 -1
  7. package/dist/cjs/types/components/Piano/context.d.ts +24 -0
  8. package/dist/cjs/types/components/Piano/context.d.ts.map +1 -0
  9. package/dist/cjs/types/components/Piano/index.d.ts +9 -9
  10. package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
  11. package/dist/cjs/types/components/Piano/key.d.ts +10 -19
  12. package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
  13. package/dist/cjs/types/components/Slider/index.d.ts.map +1 -1
  14. package/dist/cjs/types/components/XYPad/index.d.ts.map +1 -1
  15. package/dist/cjs/types/hooks/useDrag.d.ts.map +1 -1
  16. package/dist/cjs/types/hooks/useDragWithElement.d.ts +16 -0
  17. package/dist/cjs/types/hooks/useDragWithElement.d.ts.map +1 -0
  18. package/dist/esm/index.js +316 -233
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/types/components/Knob/index.d.ts +12 -0
  21. package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
  22. package/dist/esm/types/components/Piano/KeyLabel.d.ts +1 -3
  23. package/dist/esm/types/components/Piano/KeyLabel.d.ts.map +1 -1
  24. package/dist/esm/types/components/Piano/context.d.ts +24 -0
  25. package/dist/esm/types/components/Piano/context.d.ts.map +1 -0
  26. package/dist/esm/types/components/Piano/index.d.ts +9 -9
  27. package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
  28. package/dist/esm/types/components/Piano/key.d.ts +10 -19
  29. package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
  30. package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
  31. package/dist/esm/types/components/XYPad/index.d.ts.map +1 -1
  32. package/dist/esm/types/hooks/useDrag.d.ts.map +1 -1
  33. package/dist/esm/types/hooks/useDragWithElement.d.ts +16 -0
  34. package/dist/esm/types/hooks/useDragWithElement.d.ts.map +1 -0
  35. package/dist/styles/index.css +2 -0
  36. package/package.json +2 -1
  37. package/src/components/Knob/index.tsx +14 -0
  38. package/src/components/Piano/KeyLabel.tsx +9 -5
  39. package/src/components/Piano/context.tsx +108 -0
  40. package/src/components/Piano/index.css +2 -0
  41. package/src/components/Piano/index.tsx +186 -114
  42. package/src/components/Piano/key.tsx +215 -0
  43. package/src/components/Slider/index.tsx +40 -52
  44. package/src/components/XYPad/index.tsx +64 -54
  45. package/src/hooks/useDrag.ts +6 -7
  46. package/src/hooks/useDragWithElement.ts +76 -0
  47. package/dist/cjs/types/components/Piano/BlackKey.d.ts +0 -5
  48. package/dist/cjs/types/components/Piano/BlackKey.d.ts.map +0 -1
  49. package/dist/cjs/types/components/Piano/WhiteKey.d.ts +0 -7
  50. package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +0 -1
  51. package/dist/esm/types/components/Piano/BlackKey.d.ts +0 -5
  52. package/dist/esm/types/components/Piano/BlackKey.d.ts.map +0 -1
  53. package/dist/esm/types/components/Piano/WhiteKey.d.ts +0 -7
  54. package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +0 -1
  55. package/src/components/Piano/BlackKey.tsx +0 -132
  56. package/src/components/Piano/WhiteKey.tsx +0 -134
  57. package/src/components/Piano/key.ts +0 -51
@@ -31,10 +31,22 @@ export interface KnobProps {
31
31
  enableDoubleClickDefault?: boolean;
32
32
  disabled?: boolean;
33
33
  readonly?: boolean;
34
+ /** color */
34
35
  activeLine?: string;
36
+ /** color */
35
37
  inactiveLine?: string;
38
+ /** color */
36
39
  thumb?: string;
40
+ /** color */
37
41
  thumbLine?: string;
42
+ /** percent (0-100) */
43
+ thumbSize?: number;
44
+ /** percent (0-100) */
45
+ thumbLineWeight?: number;
46
+ /** percent (0-100) */
47
+ thumbLineLength?: number;
48
+ /** percent (0-100) */
49
+ lineWeight?: number;
38
50
  classes?: {
39
51
  activeLine?: string;
40
52
  inactiveLine?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Knob/index.tsx"],"names":[],"mappings":"AASA,OAAO,EAEL,gBAAgB,EAKjB,MAAM,uBAAuB,CAAA;AAM9B,qBAAqB;AACrB,MAAM,WAAW,SAAS;IAExB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IAGX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAGnB,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAElC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;IAED,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAID;;;;GAIG;AACH,eAAO,MAAM,IAAI,iLA+NhB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Knob/index.tsx"],"names":[],"mappings":"AASA,OAAO,EAEL,gBAAgB,EAKjB,MAAM,uBAAuB,CAAA;AAM9B,qBAAqB;AACrB,MAAM,WAAW,SAAS;IAExB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IAGX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAGnB,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAElC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB,YAAY;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sBAAsB;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;IAED,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAID;;;;GAIG;AACH,eAAO,MAAM,IAAI,iLAgOhB,CAAA"}
@@ -10,10 +10,8 @@ export interface KeyLabelProps {
10
10
  /** @internal */
11
11
  __note?: number;
12
12
  /** @internal */
13
- __index?: number;
14
- /** @internal */
15
13
  __label?: (note: number, index: number) => ReactNode;
16
14
  }
17
15
  /** @category Piano */
18
- export declare function KeyLabel({ label, className, wrapperClassName, wrapperStyle, __note, __index, __label, ...props }: KeyLabelProps & Omit<ComponentPropsWithoutRef<'div'>, keyof KeyLabelProps>): false | import("react/jsx-runtime").JSX.Element;
16
+ export declare function KeyLabel({ label, className, wrapperClassName, wrapperStyle, __note, __label, ...props }: KeyLabelProps & Omit<ComponentPropsWithoutRef<'div'>, keyof KeyLabelProps>): false | import("react/jsx-runtime").JSX.Element;
19
17
  //# sourceMappingURL=KeyLabel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"KeyLabel.d.ts","sourceRoot":"","sources":["../../../../../src/components/Piano/KeyLabel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1E,sBAAsB;AACtB,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;IAElD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,aAAa,CAAA;IAE5B,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB;IAChB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;CACrD;AAED,sBAAsB;AACtB,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,MAAM,EACN,OAAO,EACP,OAAO,EACP,GAAG,KAAK,EACT,EAAE,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,aAAa,CAAC,mDAiB5E"}
1
+ {"version":3,"file":"KeyLabel.d.ts","sourceRoot":"","sources":["../../../../../src/components/Piano/KeyLabel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAM1E,sBAAsB;AACtB,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;IAElD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,aAAa,CAAA;IAE5B,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB;IAChB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;CACrD;AAED,sBAAsB;AACtB,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,MAAM,EACN,OAAO,EACP,GAAG,KAAK,EACT,EAAE,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,aAAa,CAAC,mDAoB5E"}
@@ -0,0 +1,24 @@
1
+ import { ReactNode } from 'react';
2
+ /** @category Piano */
3
+ export type NoteRange = {
4
+ first: number;
5
+ last: number;
6
+ };
7
+ type State = {
8
+ noteRange: NoteRange;
9
+ glissando: boolean;
10
+ midiMax: number;
11
+ fill: boolean;
12
+ onPlayNote: (noteNumber: number) => void;
13
+ onStopNote: (noteNumber: number) => void;
14
+ label: (note: number, index: number) => ReactNode;
15
+ };
16
+ type Action = {
17
+ notePosition: (note: number) => number;
18
+ };
19
+ type PianoProviderProps = React.PropsWithChildren<Partial<State>>;
20
+ export declare function PianoProvider({ children, ...props }: PianoProviderProps): import("react/jsx-runtime").JSX.Element;
21
+ /** @category Piano */
22
+ export declare function usePianoContext<T>(selector: (state: State & Action) => T): T;
23
+ export {};
24
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../../src/components/Piano/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAiC,MAAM,OAAO,CAAA;AAO/E,sBAAsB;AACtB,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,KAAK,GAAG;IACX,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;CAClD,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CACvC,CAAA;AAsDD,KAAK,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;AAEjE,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,2CAmBvE;AAED,sBAAsB;AACtB,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAI5E"}
@@ -1,4 +1,5 @@
1
1
  import { ComponentPropsWithoutRef, CSSProperties, ReactElement, ReactNode } from 'react';
2
+ import { NoteRange } from './context';
2
3
  import { KeyboardShortcuts } from './keyboardShortcuts';
3
4
  /**
4
5
  * Piano component
@@ -7,16 +8,17 @@ import { KeyboardShortcuts } from './keyboardShortcuts';
7
8
  * - add scale highlight
8
9
  */
9
10
  /** @category Piano */
11
+ export declare function getNoteRangeArray(noteRange: NoteRange): number[];
12
+ /** @category Piano */
10
13
  export interface PianoProps {
11
- noteRange: {
12
- first: number;
13
- last: number;
14
- };
15
- height?: number | string;
14
+ noteRange: NoteRange;
16
15
  glissando?: boolean;
17
16
  midiMax?: number;
18
17
  keyboardShortcuts?: KeyboardShortcuts;
19
18
  fill?: boolean;
19
+ whiteNoteWidth?: number;
20
+ blackNoteWidth?: number;
21
+ height?: number | string;
20
22
  style?: CSSProperties;
21
23
  onPlayNote?: (noteNumber: number) => void;
22
24
  onStopNote?: (noteNumber: number) => void;
@@ -30,10 +32,8 @@ export interface PianoProps {
30
32
  * Customizable piano component.
31
33
  * @category Piano
32
34
  */
33
- export declare function Piano({ noteRange, glissando, midiMax, keyboardShortcuts, fill, height, style, className, onPlayNote, onStopNote, label, children, onPointerUp, onPointerDown, ...props }: PianoProps & Omit<ComponentPropsWithoutRef<'div'>, keyof PianoProps>): import("react/jsx-runtime").JSX.Element;
34
- export * from './key';
35
+ export declare function Piano({ noteRange, glissando, midiMax, keyboardShortcuts, fill, height, whiteNoteWidth: _whiteNoteWidth, style, className, onPlayNote, onStopNote, label, children, onPointerDown, ...props }: PianoProps & Omit<ComponentPropsWithoutRef<'div'>, keyof PianoProps>): import("react/jsx-runtime").JSX.Element;
35
36
  export * from './keyboardShortcuts';
36
- export { WhiteKey } from './WhiteKey';
37
- export { BlackKey } from './BlackKey';
37
+ export { WhiteKey, BlackKey, type KeyProps, type KeyMethods } from './key';
38
38
  export { KeyLabel, type KeyLabelProps } from './KeyLabel';
39
39
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Piano/index.tsx"],"names":[],"mappings":"AACA,OAAc,EACZ,wBAAwB,EAExB,aAAa,EACb,YAAY,EACZ,SAAS,EAKV,MAAM,OAAO,CAAA;AAQd,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGvD;;;;;GAKG;AAEH,sBAAsB;AACtB,MAAM,WAAW,UAAU;IAEzB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAG1C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAExB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd,KAAK,CAAC,EAAE,aAAa,CAAA;IAErB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAEzC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;IAElD;;OAEG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;CACzC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EACpB,SAAS,EACT,SAAgB,EAChB,OAAa,EACb,iBAAiB,EACjB,IAAY,EACZ,MAA4B,EAC5B,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,GAAG,KAAK,EACT,EAAE,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,UAAU,CAAC,2CA4JtE;AAED,cAAc,OAAO,CAAA;AACrB,cAAc,qBAAqB,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Piano/index.tsx"],"names":[],"mappings":"AACA,OAAc,EACZ,wBAAwB,EAExB,aAAa,EACb,YAAY,EACZ,SAAS,EAOV,MAAM,OAAO,CAAA;AAad,OAAO,EAAE,SAAS,EAAiB,MAAM,WAAW,CAAA;AAQpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD;;;;;GAKG;AAEH,sBAAsB;AACtB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,YAKrD;AAED,sBAAsB;AACtB,MAAM,WAAW,UAAU;IAEzB,SAAS,EAAE,SAAS,CAAA;IAGpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAExB,KAAK,CAAC,EAAE,aAAa,CAAA;IAErB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAEzC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;IAElD;;OAEG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;CACzC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EACpB,SAAS,EACT,SAAgB,EAChB,OAAa,EACb,iBAAiB,EACjB,IAAY,EACZ,MAA4B,EAC5B,cAAc,EAAE,eAAsC,EACtD,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,EACL,QAAQ,EACR,aAAa,EACb,GAAG,KAAK,EACT,EAAE,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,UAAU,CAAC,2CA+MtE;AAED,cAAc,qBAAqB,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAA;AAC1E,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA"}
@@ -1,8 +1,9 @@
1
- import { CSSProperties, ReactElement, ReactNode } from 'react';
1
+ import React, { CSSProperties, ReactElement } from 'react';
2
2
  /**
3
3
  * @category Piano
4
4
  */
5
5
  export interface KeyProps {
6
+ noteNumber: number;
6
7
  width?: number;
7
8
  height?: number | `${number}%`;
8
9
  bg?: string;
@@ -15,25 +16,7 @@ export interface KeyProps {
15
16
  */
16
17
  children?: ReactElement;
17
18
  /** @internal */
18
- __glissando?: boolean;
19
- /** @internal */
20
- __position?: number;
21
- /** @internal */
22
- __note?: number;
23
- /** @internal */
24
- __disabled?: boolean;
25
- /** @internal */
26
- __index?: number;
27
- /** @internal */
28
- __fill?: boolean;
29
- /** @internal */
30
19
  __width?: number;
31
- /** @internal */
32
- __onPlayNote?: (noteNumber: number) => void;
33
- /** @internal */
34
- __onStopNote?: (noteNumber: number) => void;
35
- /** @internal */
36
- __label?: (note: number, index: number) => ReactNode;
37
20
  }
38
21
  /**
39
22
  * @category Piano
@@ -43,4 +26,12 @@ export interface KeyMethods {
43
26
  stop: () => void;
44
27
  played: () => boolean;
45
28
  }
29
+ /** @category Piano */
30
+ export declare const defaultWhiteKeyWidth = 40;
31
+ /** @category Piano */
32
+ export declare const defaultBlackKeyWidth = 26;
33
+ /** @category Piano */
34
+ export declare const WhiteKey: React.ForwardRefExoticComponent<KeyProps & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof KeyProps> & React.RefAttributes<KeyMethods>>;
35
+ /** @category Piano */
36
+ export declare const BlackKey: React.ForwardRefExoticComponent<KeyProps & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, keyof KeyProps> & React.RefAttributes<KeyMethods>>;
46
37
  //# sourceMappingURL=key.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../../../../src/components/Piano/key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE9D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAA;IAE9B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,KAAK,CAAC,EAAE,aAAa,CAAA;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;IAEvB,gBAAgB;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,gBAAgB;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB;IAChB,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,gBAAgB;IAChB,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,gBAAgB;IAChB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,MAAM,EAAE,MAAM,OAAO,CAAA;CACtB"}
1
+ {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../../../../src/components/Piano/key.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EACZ,aAAa,EAKb,YAAY,EACb,MAAM,OAAO,CAAA;AAKd;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAA;IAElB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAA;IAE9B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,KAAK,CAAC,EAAE,aAAa,CAAA;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;IAEvB,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,MAAM,EAAE,MAAM,OAAO,CAAA;CACtB;AAKD,sBAAsB;AACtB,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,sBAAsB;AACtB,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAmHtC,sBAAsB;AACtB,eAAO,MAAM,QAAQ,gMAqBpB,CAAA;AAED,sBAAsB;AACtB,eAAO,MAAM,QAAQ,gMAqBpB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Slider/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAEZ,aAAa,EAEb,YAAY,EAKb,MAAM,OAAO,CAAA;AAEd,OAAO,EAML,gBAAgB,EAGjB,MAAM,uBAAuB,CAAA;AAW9B,uBAAuB;AACvB,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IAGX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;CAEzC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAKD;;;GAGG;AACH,eAAO,MAAM,MAAM,yMAiQlB,CAAA;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Slider/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAEZ,aAAa,EAEb,YAAY,EAKb,MAAM,OAAO,CAAA;AAEd,OAAO,EAML,gBAAgB,EAGjB,MAAM,uBAAuB,CAAA;AAW9B,uBAAuB;AACvB,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IAGX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;CAEzC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAKD;;;GAGG;AACH,eAAO,MAAM,MAAM,yMAqPlB,CAAA;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/XYPad/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAGZ,YAAY,EAKb,MAAM,OAAO,CAAA;AAEd,OAAO,EAML,gBAAgB,EAEjB,MAAM,uBAAuB,CAAA;AAS9B;;;GAGG;AACH,MAAM,WAAW,YAAY;IAE3B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IAGX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;CACnC;AAED,sBAAsB;AACtB,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,YAAY,CAAA;IACf,CAAC,EAAE,YAAY,CAAA;IAEf,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACtD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,uCAAuC;IACvC,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;CACzC;AAED,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAaD;;;GAGG;AACH,eAAO,MAAM,KAAK,sMAqPjB,CAAA;AAED,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/XYPad/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAGZ,YAAY,EAKb,MAAM,OAAO,CAAA;AAEd,OAAO,EAML,gBAAgB,EAEjB,MAAM,uBAAuB,CAAA;AAS9B;;;GAGG;AACH,MAAM,WAAW,YAAY;IAE3B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IAGX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;CACnC;AAED,sBAAsB;AACtB,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,YAAY,CAAA;IACf,CAAC,EAAE,YAAY,CAAA;IAEf,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACtD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,uCAAuC;IACvC,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;CACzC;AAED,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAaD;;;GAGG;AACH,eAAO,MAAM,KAAK,sMA+PjB,CAAA;AAED,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDrag.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useDrag.ts"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACtE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,EACzC,SAAa,EACb,MAAM,EACN,WAAW,EACX,SAAS,GACV,EAAE,KAAK,GAAG;IACT,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI;IACjC,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI;CACvC,CAmEA"}
1
+ {"version":3,"file":"useDrag.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useDrag.ts"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACtE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,EACzC,SAAa,EACb,MAAM,EACN,WAAW,EACX,SAAS,GACV,EAAE,KAAK,GAAG;IACT,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI;IACjC,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI;CACvC,CAkEA"}
@@ -0,0 +1,16 @@
1
+ import { RefObject } from 'react';
2
+ interface Props<T extends Element> {
3
+ baseElementRef: RefObject<T | null>;
4
+ onDrag: (normalizedX: number, normalizedY: number) => void;
5
+ onDragStart?: (normalizedX: number, normalizedY: number) => void;
6
+ onDragEnd?: (normalizedX: number, normalizedY: number) => void;
7
+ }
8
+ /**
9
+ * @returns [refCallback, pointerDownHandler]
10
+ */
11
+ export declare function useDragWithElement<T extends Element>({ baseElementRef, onDrag, onDragStart, onDragEnd, }: Props<T>): [
12
+ (div: EventTarget | null) => void,
13
+ (event: React.PointerEvent<T>) => void
14
+ ];
15
+ export {};
16
+ //# sourceMappingURL=useDragWithElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDragWithElement.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useDragWithElement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAE,MAAM,OAAO,CAAA;AAOtD,UAAU,KAAK,CAAC,CAAC,SAAS,OAAO;IAC/B,cAAc,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACnC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAChE,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,OAAO,EAAE,EACpD,cAAc,EACd,MAAM,EACN,WAAW,EACX,SAAS,GACV,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG;IACZ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI;IACjC,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI;CACvC,CAkDA"}
@@ -238,6 +238,7 @@
238
238
  --active-bg: #ccc;
239
239
  --active-color: black;
240
240
 
241
+ box-sizing: border-box;
241
242
  position: absolute;
242
243
  background-color: var(--bg);
243
244
  -webkit-tap-highlight-color: transparent;
@@ -263,6 +264,7 @@
263
264
  --active-color: white;
264
265
  --active-bg: #666;
265
266
 
267
+ box-sizing: border-box;
266
268
  position: absolute;
267
269
  background-color: var(--bg);
268
270
  -webkit-tap-highlight-color: transparent;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tremolo-ui/react",
3
- "version": "0.0.12",
3
+ "version": "0.1.0-alpha.0",
4
4
  "description": "React component library for audio app",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -20,6 +20,7 @@
20
20
  "clean:sb": "rimraf ./storybook-static"
21
21
  },
22
22
  "devDependencies": {
23
+ "@storybook/addon-a11y": "^8.6.7",
23
24
  "@storybook/addon-essentials": "^8.6.7",
24
25
  "@storybook/addon-interactions": "^8.6.7",
25
26
  "@storybook/addon-links": "^8.6.7",
@@ -61,11 +61,24 @@ export interface KnobProps {
61
61
  disabled?: boolean
62
62
  readonly?: boolean
63
63
 
64
+ /** color */
64
65
  activeLine?: string
66
+ /** color */
65
67
  inactiveLine?: string
68
+ /** color */
66
69
  thumb?: string
70
+ /** color */
67
71
  thumbLine?: string
68
72
 
73
+ /** percent (0-100) */
74
+ thumbSize?: number
75
+ /** percent (0-100) */
76
+ thumbLineWeight?: number
77
+ /** percent (0-100) */
78
+ thumbLineLength?: number
79
+ /** percent (0-100) */
80
+ lineWeight?: number
81
+
69
82
  classes?: {
70
83
  activeLine?: string
71
84
  inactiveLine?: string
@@ -233,6 +246,7 @@ export const Knob = forwardRef<KnobMethods, Props>(
233
246
  width={size}
234
247
  height={size}
235
248
  tabIndex={0}
249
+ role="slider"
236
250
  aria-valuenow={value}
237
251
  aria-valuemin={min}
238
252
  aria-valuemax={max}
@@ -1,6 +1,10 @@
1
1
  import clsx from 'clsx'
2
2
  import { ComponentPropsWithoutRef, CSSProperties, ReactNode } from 'react'
3
3
 
4
+ import { usePianoContext } from './context'
5
+
6
+ import { getNoteRangeArray } from '.'
7
+
4
8
  /** @category Piano */
5
9
  export interface KeyLabelProps {
6
10
  /**
@@ -14,8 +18,6 @@ export interface KeyLabelProps {
14
18
  /** @internal */
15
19
  __note?: number
16
20
  /** @internal */
17
- __index?: number
18
- /** @internal */
19
21
  __label?: (note: number, index: number) => ReactNode
20
22
  }
21
23
 
@@ -26,13 +28,15 @@ export function KeyLabel({
26
28
  wrapperClassName,
27
29
  wrapperStyle,
28
30
  __note,
29
- __index,
30
31
  __label,
31
32
  ...props
32
33
  }: KeyLabelProps & Omit<ComponentPropsWithoutRef<'div'>, keyof KeyLabelProps>) {
34
+ const noteRange = usePianoContext((s) => s.noteRange)
35
+ const noteRangeArray = getNoteRangeArray(noteRange)
36
+ const index = noteRangeArray.indexOf(__note!)
33
37
  const content = label
34
- ? label(__note!, __index!)
35
- : __label && __label(__note!, __index!)
38
+ ? label(__note!, index)
39
+ : __label && __label(__note!, index)
36
40
 
37
41
  return (
38
42
  (content != undefined || content != null) && (
@@ -0,0 +1,108 @@
1
+ import { createContext, ReactNode, useContext, useEffect, useRef } from 'react'
2
+ import { createStore, useStore } from 'zustand'
3
+
4
+ import { isBlackKey, noteKey, NoteKey, noteKeys } from '@tremolo-ui/functions'
5
+
6
+ import { defaultBlackKeyWidth, defaultWhiteKeyWidth } from './key'
7
+
8
+ /** @category Piano */
9
+ export type NoteRange = {
10
+ first: number
11
+ last: number
12
+ }
13
+
14
+ type State = {
15
+ noteRange: NoteRange
16
+ glissando: boolean
17
+ midiMax: number
18
+ fill: boolean
19
+ onPlayNote: (noteNumber: number) => void
20
+ onStopNote: (noteNumber: number) => void
21
+ label: (note: number, index: number) => ReactNode
22
+ }
23
+
24
+ type Action = {
25
+ notePosition: (note: number) => number
26
+ }
27
+
28
+ type PianoStore = ReturnType<typeof createPianoStore>
29
+
30
+ const createPianoStore = (initProps?: Partial<State>) => {
31
+ const noteRange = initProps?.noteRange || { first: 0, last: 127 }
32
+ const DEFAULT_PROPS: State = {
33
+ noteRange: { first: 0, last: 127 },
34
+ glissando: true,
35
+ midiMax: 127,
36
+ fill: false,
37
+ label: () => undefined,
38
+ onPlayNote: () => {},
39
+ onStopNote: () => {},
40
+ }
41
+
42
+ return createStore<State & Action>()(() => ({
43
+ ...DEFAULT_PROPS,
44
+ ...initProps,
45
+ notePosition: (note: number) => {
46
+ const pitchPositions: Record<NoteKey, number> = {
47
+ C: 0,
48
+ 'C#': 1,
49
+ D: 1,
50
+ 'D#': 2,
51
+ E: 2,
52
+ F: 3,
53
+ 'F#': 4,
54
+ G: 4,
55
+ 'G#': 5,
56
+ A: 5,
57
+ 'A#': 6,
58
+ B: 6,
59
+ }
60
+
61
+ const whiteNoteWidth = defaultWhiteKeyWidth
62
+ const blackNoteWidth = defaultBlackKeyWidth
63
+ const padding = 1
64
+
65
+ const targetNoteKey = noteKey(note)
66
+ const firstNoteKey = noteKey(noteRange.first)
67
+ const octave = Math.floor((note - noteRange.first) / 12)
68
+ const octaveOffset =
69
+ noteKeys.indexOf(firstNoteKey) > noteKeys.indexOf(targetNoteKey) ? 1 : 0
70
+ const w = whiteNoteWidth + padding
71
+ const pos = pitchPositions[targetNoteKey] - pitchPositions[firstNoteKey]
72
+ const blackKeyOffset = isBlackKey(note) ? blackNoteWidth / 2 : 0
73
+ return pos * w + (octave + octaveOffset) * 7 * w - blackKeyOffset
74
+ },
75
+ }))
76
+ }
77
+
78
+ const PianoContext = createContext<PianoStore | null>(null)
79
+
80
+ type PianoProviderProps = React.PropsWithChildren<Partial<State>>
81
+
82
+ export function PianoProvider({ children, ...props }: PianoProviderProps) {
83
+ const storeRef = useRef<PianoStore>(null)
84
+ if (!storeRef.current) {
85
+ storeRef.current = createPianoStore(props)
86
+ }
87
+
88
+ useEffect(() => {
89
+ if (storeRef.current) {
90
+ storeRef.current.setState(props)
91
+ } else {
92
+ storeRef.current = createPianoStore(props)
93
+ }
94
+ }, [props])
95
+
96
+ return (
97
+ <PianoContext.Provider value={storeRef.current}>
98
+ {children}
99
+ </PianoContext.Provider>
100
+ )
101
+ }
102
+
103
+ /** @category Piano */
104
+ export function usePianoContext<T>(selector: (state: State & Action) => T): T {
105
+ const store = useContext(PianoContext)
106
+ if (!store) throw new Error('Missing PianoContext.Provider in the tree')
107
+ return useStore(store, selector)
108
+ }
@@ -12,6 +12,7 @@
12
12
  --active-bg: #ccc;
13
13
  --active-color: black;
14
14
 
15
+ box-sizing: border-box;
15
16
  position: absolute;
16
17
  background-color: var(--bg);
17
18
  -webkit-tap-highlight-color: transparent;
@@ -37,6 +38,7 @@
37
38
  --active-color: white;
38
39
  --active-bg: #666;
39
40
 
41
+ box-sizing: border-box;
40
42
  position: absolute;
41
43
  background-color: var(--bg);
42
44
  -webkit-tap-highlight-color: transparent;