@tremolo-ui/react 0.0.12 → 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +320 -233
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/components/Knob/index.d.ts +12 -0
- package/dist/cjs/types/components/Knob/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/KeyLabel.d.ts +1 -3
- package/dist/cjs/types/components/Piano/KeyLabel.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/context.d.ts +24 -0
- package/dist/cjs/types/components/Piano/context.d.ts.map +1 -0
- package/dist/cjs/types/components/Piano/index.d.ts +9 -9
- package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/key.d.ts +10 -19
- package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/index.d.ts.map +1 -1
- package/dist/cjs/types/components/XYPad/index.d.ts.map +1 -1
- package/dist/cjs/types/hooks/useDrag.d.ts.map +1 -1
- package/dist/cjs/types/hooks/useDragWithElement.d.ts +16 -0
- package/dist/cjs/types/hooks/useDragWithElement.d.ts.map +1 -0
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/esm/index.js +319 -234
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/Knob/index.d.ts +12 -0
- package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/KeyLabel.d.ts +1 -3
- package/dist/esm/types/components/Piano/KeyLabel.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/context.d.ts +24 -0
- package/dist/esm/types/components/Piano/context.d.ts.map +1 -0
- package/dist/esm/types/components/Piano/index.d.ts +9 -9
- package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/key.d.ts +10 -19
- package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
- package/dist/esm/types/components/XYPad/index.d.ts.map +1 -1
- package/dist/esm/types/hooks/useDrag.d.ts.map +1 -1
- package/dist/esm/types/hooks/useDragWithElement.d.ts +16 -0
- package/dist/esm/types/hooks/useDragWithElement.d.ts.map +1 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/index.d.ts.map +1 -1
- package/dist/styles/index.css +2 -0
- package/package.json +2 -1
- package/src/components/AnimationCanvas/index.tsx +3 -1
- package/src/components/Knob/index.tsx +14 -0
- package/src/components/Piano/KeyLabel.tsx +9 -5
- package/src/components/Piano/context.tsx +108 -0
- package/src/components/Piano/index.css +2 -0
- package/src/components/Piano/index.tsx +186 -114
- package/src/components/Piano/key.tsx +215 -0
- package/src/components/Slider/index.tsx +40 -52
- package/src/components/XYPad/index.tsx +64 -54
- package/src/hooks/useDrag.ts +6 -7
- package/src/hooks/useDragWithElement.ts +76 -0
- package/src/index.ts +1 -0
- package/dist/cjs/types/components/Piano/BlackKey.d.ts +0 -5
- package/dist/cjs/types/components/Piano/BlackKey.d.ts.map +0 -1
- package/dist/cjs/types/components/Piano/WhiteKey.d.ts +0 -7
- package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +0 -1
- package/dist/esm/types/components/Piano/BlackKey.d.ts +0 -5
- package/dist/esm/types/components/Piano/BlackKey.d.ts.map +0 -1
- package/dist/esm/types/components/Piano/WhiteKey.d.ts +0 -7
- package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +0 -1
- package/src/components/Piano/BlackKey.tsx +0 -132
- package/src/components/Piano/WhiteKey.tsx +0 -134
- 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,
|
|
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,
|
|
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;
|
|
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,
|
|
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 './
|
|
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,
|
|
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
|
|
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.
|
|
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,
|
|
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,
|
|
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,
|
|
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"}
|
|
@@ -15,6 +15,7 @@ export * from './components/WheelObserver';
|
|
|
15
15
|
export * from './components/XYPad';
|
|
16
16
|
export * from './hooks/useAnimationFrame';
|
|
17
17
|
export * from './hooks/useDrag';
|
|
18
|
+
export * from './hooks/useDragWithElement';
|
|
18
19
|
export * from './hooks/useEventListener';
|
|
19
20
|
export * from './hooks/useInterval';
|
|
20
21
|
export * from './hooks/useLongPress';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,6BAA6B,CAAA;AACpC,OAAO,oCAAoC,CAAA;AAC3C,OAAO,8BAA8B,CAAA;AACrC,OAAO,+BAA+B,CAAA;AACtC,OAAO,8BAA8B,CAAA;AAErC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAElC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,6BAA6B,CAAA;AACpC,OAAO,oCAAoC,CAAA;AAC3C,OAAO,8BAA8B,CAAA;AACrC,OAAO,+BAA+B,CAAA;AACtC,OAAO,8BAA8B,CAAA;AAErC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAElC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA"}
|
package/dist/styles/index.css
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
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",
|
|
@@ -144,7 +144,9 @@ export function AnimationCanvas({
|
|
|
144
144
|
memoCanvas.width = w * dpr
|
|
145
145
|
memoCanvas.height = h * dpr
|
|
146
146
|
memoContext.scale(1 / dpr, 1 / dpr)
|
|
147
|
-
|
|
147
|
+
if (canvas.width > 0 && canvas.height > 0) {
|
|
148
|
+
memoContext.drawImage(canvas, 0, 0)
|
|
149
|
+
}
|
|
148
150
|
}
|
|
149
151
|
|
|
150
152
|
setDprConfig(canvas, context, w, h, dpr)
|
|
@@ -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!,
|
|
35
|
-
: __label && __label(__note!,
|
|
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;
|