@tremolo-ui/react 0.0.8 → 0.0.10

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 (148) hide show
  1. package/dist/cjs/index.js +439 -275
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/components/AnimationCanvas/index.d.ts +9 -4
  4. package/dist/cjs/types/components/AnimationCanvas/index.d.ts.map +1 -1
  5. package/dist/cjs/types/components/AnimationKnob/index.d.ts +2 -0
  6. package/dist/cjs/types/components/AnimationKnob/index.d.ts.map +1 -1
  7. package/dist/cjs/types/components/DragObserver/index.d.ts +3 -1
  8. package/dist/cjs/types/components/DragObserver/index.d.ts.map +1 -1
  9. package/dist/cjs/types/components/Knob/index.d.ts +2 -0
  10. package/dist/cjs/types/components/Knob/index.d.ts.map +1 -1
  11. package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts +7 -0
  12. package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts.map +1 -0
  13. package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts +7 -0
  14. package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts.map +1 -0
  15. package/dist/cjs/types/components/NumberInput/Stepper.d.ts +8 -0
  16. package/dist/cjs/types/components/NumberInput/Stepper.d.ts.map +1 -0
  17. package/dist/cjs/types/components/NumberInput/context.d.ts +27 -0
  18. package/dist/cjs/types/components/NumberInput/context.d.ts.map +1 -0
  19. package/dist/cjs/types/components/NumberInput/index.d.ts +31 -16
  20. package/dist/cjs/types/components/NumberInput/index.d.ts.map +1 -1
  21. package/dist/cjs/types/components/Piano/BlackKey.d.ts +1 -0
  22. package/dist/cjs/types/components/Piano/BlackKey.d.ts.map +1 -1
  23. package/dist/cjs/types/components/Piano/KeyLabel.d.ts +2 -0
  24. package/dist/cjs/types/components/Piano/KeyLabel.d.ts.map +1 -1
  25. package/dist/cjs/types/components/Piano/WhiteKey.d.ts +3 -0
  26. package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +1 -1
  27. package/dist/cjs/types/components/Piano/index.d.ts +6 -4
  28. package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
  29. package/dist/cjs/types/components/Piano/key.d.ts +8 -2
  30. package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
  31. package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts +2 -0
  32. package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts.map +1 -1
  33. package/dist/cjs/types/components/Slider/Scale.d.ts +2 -0
  34. package/dist/cjs/types/components/Slider/Scale.d.ts.map +1 -1
  35. package/dist/cjs/types/components/Slider/ScaleOption.d.ts +2 -0
  36. package/dist/cjs/types/components/Slider/ScaleOption.d.ts.map +1 -1
  37. package/dist/cjs/types/components/Slider/Thumb.d.ts +4 -0
  38. package/dist/cjs/types/components/Slider/Thumb.d.ts.map +1 -1
  39. package/dist/cjs/types/components/Slider/Track.d.ts +6 -1
  40. package/dist/cjs/types/components/Slider/Track.d.ts.map +1 -1
  41. package/dist/cjs/types/components/Slider/context.d.ts +15 -12
  42. package/dist/cjs/types/components/Slider/context.d.ts.map +1 -1
  43. package/dist/cjs/types/components/Slider/index.d.ts +8 -5
  44. package/dist/cjs/types/components/Slider/index.d.ts.map +1 -1
  45. package/dist/cjs/types/components/WheelObserver/index.d.ts +1 -0
  46. package/dist/cjs/types/components/WheelObserver/index.d.ts.map +1 -1
  47. package/dist/cjs/types/components/XYPad/Area.d.ts +2 -0
  48. package/dist/cjs/types/components/XYPad/Area.d.ts.map +1 -1
  49. package/dist/cjs/types/components/XYPad/Thumb.d.ts +3 -0
  50. package/dist/cjs/types/components/XYPad/Thumb.d.ts.map +1 -1
  51. package/dist/cjs/types/components/XYPad/index.d.ts +4 -0
  52. package/dist/cjs/types/components/XYPad/index.d.ts.map +1 -1
  53. package/dist/cjs/types/hooks/useAnimationFrame.d.ts +3 -0
  54. package/dist/cjs/types/hooks/useAnimationFrame.d.ts.map +1 -0
  55. package/dist/cjs/types/hooks/useDrag.d.ts +15 -0
  56. package/dist/cjs/types/hooks/useDrag.d.ts.map +1 -0
  57. package/dist/cjs/types/hooks/useRefCallbackEvent.d.ts +1 -4
  58. package/dist/cjs/types/hooks/useRefCallbackEvent.d.ts.map +1 -1
  59. package/dist/esm/index.js +437 -266
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/types/components/AnimationCanvas/index.d.ts +9 -4
  62. package/dist/esm/types/components/AnimationCanvas/index.d.ts.map +1 -1
  63. package/dist/esm/types/components/AnimationKnob/index.d.ts +2 -0
  64. package/dist/esm/types/components/AnimationKnob/index.d.ts.map +1 -1
  65. package/dist/esm/types/components/DragObserver/index.d.ts +3 -1
  66. package/dist/esm/types/components/DragObserver/index.d.ts.map +1 -1
  67. package/dist/esm/types/components/Knob/index.d.ts +2 -0
  68. package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
  69. package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts +7 -0
  70. package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts.map +1 -0
  71. package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts +7 -0
  72. package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts.map +1 -0
  73. package/dist/esm/types/components/NumberInput/Stepper.d.ts +8 -0
  74. package/dist/esm/types/components/NumberInput/Stepper.d.ts.map +1 -0
  75. package/dist/esm/types/components/NumberInput/context.d.ts +27 -0
  76. package/dist/esm/types/components/NumberInput/context.d.ts.map +1 -0
  77. package/dist/esm/types/components/NumberInput/index.d.ts +31 -16
  78. package/dist/esm/types/components/NumberInput/index.d.ts.map +1 -1
  79. package/dist/esm/types/components/Piano/BlackKey.d.ts +1 -0
  80. package/dist/esm/types/components/Piano/BlackKey.d.ts.map +1 -1
  81. package/dist/esm/types/components/Piano/KeyLabel.d.ts +2 -0
  82. package/dist/esm/types/components/Piano/KeyLabel.d.ts.map +1 -1
  83. package/dist/esm/types/components/Piano/WhiteKey.d.ts +3 -0
  84. package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +1 -1
  85. package/dist/esm/types/components/Piano/index.d.ts +6 -4
  86. package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
  87. package/dist/esm/types/components/Piano/key.d.ts +8 -2
  88. package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
  89. package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts +2 -0
  90. package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts.map +1 -1
  91. package/dist/esm/types/components/Slider/Scale.d.ts +2 -0
  92. package/dist/esm/types/components/Slider/Scale.d.ts.map +1 -1
  93. package/dist/esm/types/components/Slider/ScaleOption.d.ts +2 -0
  94. package/dist/esm/types/components/Slider/ScaleOption.d.ts.map +1 -1
  95. package/dist/esm/types/components/Slider/Thumb.d.ts +4 -0
  96. package/dist/esm/types/components/Slider/Thumb.d.ts.map +1 -1
  97. package/dist/esm/types/components/Slider/Track.d.ts +6 -1
  98. package/dist/esm/types/components/Slider/Track.d.ts.map +1 -1
  99. package/dist/esm/types/components/Slider/context.d.ts +15 -12
  100. package/dist/esm/types/components/Slider/context.d.ts.map +1 -1
  101. package/dist/esm/types/components/Slider/index.d.ts +8 -5
  102. package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
  103. package/dist/esm/types/components/WheelObserver/index.d.ts +1 -0
  104. package/dist/esm/types/components/WheelObserver/index.d.ts.map +1 -1
  105. package/dist/esm/types/components/XYPad/Area.d.ts +2 -0
  106. package/dist/esm/types/components/XYPad/Area.d.ts.map +1 -1
  107. package/dist/esm/types/components/XYPad/Thumb.d.ts +3 -0
  108. package/dist/esm/types/components/XYPad/Thumb.d.ts.map +1 -1
  109. package/dist/esm/types/components/XYPad/index.d.ts +4 -0
  110. package/dist/esm/types/components/XYPad/index.d.ts.map +1 -1
  111. package/dist/esm/types/hooks/useAnimationFrame.d.ts +3 -0
  112. package/dist/esm/types/hooks/useAnimationFrame.d.ts.map +1 -0
  113. package/dist/esm/types/hooks/useDrag.d.ts +15 -0
  114. package/dist/esm/types/hooks/useDrag.d.ts.map +1 -0
  115. package/dist/esm/types/hooks/useRefCallbackEvent.d.ts +1 -4
  116. package/dist/esm/types/hooks/useRefCallbackEvent.d.ts.map +1 -1
  117. package/dist/styles/index.css +110 -13
  118. package/package.json +8 -5
  119. package/src/components/AnimationCanvas/index.tsx +13 -4
  120. package/src/components/AnimationKnob/index.tsx +24 -42
  121. package/src/components/DragObserver/index.tsx +14 -52
  122. package/src/components/Knob/index.tsx +23 -40
  123. package/src/components/NumberInput/DecrementStepper.tsx +52 -0
  124. package/src/components/NumberInput/IncrementStepper.tsx +52 -0
  125. package/src/components/NumberInput/Stepper.tsx +25 -0
  126. package/src/components/NumberInput/context.tsx +150 -0
  127. package/src/components/NumberInput/index.css +102 -13
  128. package/src/components/NumberInput/index.tsx +164 -55
  129. package/src/components/Piano/BlackKey.tsx +15 -11
  130. package/src/components/Piano/KeyLabel.tsx +2 -0
  131. package/src/components/Piano/WhiteKey.tsx +17 -11
  132. package/src/components/Piano/index.tsx +16 -14
  133. package/src/components/Piano/key.ts +8 -2
  134. package/src/components/Piano/keyboardShortcuts.ts +2 -0
  135. package/src/components/Slider/Scale.tsx +8 -6
  136. package/src/components/Slider/ScaleOption.tsx +8 -6
  137. package/src/components/Slider/Thumb.tsx +7 -3
  138. package/src/components/Slider/Track.tsx +27 -15
  139. package/src/components/Slider/context.tsx +65 -51
  140. package/src/components/Slider/index.css +8 -0
  141. package/src/components/Slider/index.tsx +19 -10
  142. package/src/components/WheelObserver/index.tsx +1 -0
  143. package/src/components/XYPad/Area.tsx +2 -0
  144. package/src/components/XYPad/Thumb.tsx +3 -0
  145. package/src/components/XYPad/index.tsx +6 -2
  146. package/src/hooks/useAnimationFrame.ts +18 -0
  147. package/src/hooks/useDrag.ts +92 -0
  148. package/src/hooks/useRefCallbackEvent.ts +4 -7
@@ -25,11 +25,12 @@ import { useEventListener } from '../../hooks/useEventListener'
25
25
  import { useRefCallbackEvent } from '../../hooks/useRefCallbackEvent'
26
26
  import { addNoSelect, removeNoSelect } from '../_util'
27
27
 
28
- import { SliderValuesProvider } from './context'
28
+ import { SliderProvider } from './context'
29
29
  import { Scale } from './Scale'
30
30
  import { SliderThumb, SliderThumbMethods, SliderThumbProps } from './Thumb'
31
31
  import { SliderTrack, SliderTrackProps } from './Track'
32
32
 
33
+ /** @category Slider */
33
34
  export interface SliderProps {
34
35
  // required
35
36
  value: number
@@ -67,6 +68,7 @@ export interface SliderProps {
67
68
  // ReactElement<typeof SliderThumb, typeof SliderTrack>[]
68
69
  }
69
70
 
71
+ /** @category Slider */
70
72
  export interface SliderMethods {
71
73
  focus: () => void
72
74
  blur: () => void
@@ -77,6 +79,7 @@ type Props = SliderProps &
77
79
 
78
80
  /**
79
81
  * Customizable slider
82
+ * @category Slider
80
83
  */
81
84
  export const Slider = forwardRef<SliderMethods, Props>(
82
85
  (
@@ -229,11 +232,11 @@ export const Slider = forwardRef<SliderMethods, Props>(
229
232
  [wheel, value, min, max, skew, step],
230
233
  )
231
234
 
232
- useEventListener(window, 'mousemove', (event) => {
235
+ useEventListener(globalThis.window, 'mousemove', (event) => {
233
236
  handleValue(event)
234
237
  })
235
238
 
236
- useEventListener(window, 'mouseup', () => {
239
+ useEventListener(globalThis.window, 'mouseup', () => {
237
240
  thumbDragged.current = false
238
241
  if (bodyNoSelect) removeNoSelect()
239
242
  })
@@ -250,7 +253,7 @@ export const Slider = forwardRef<SliderMethods, Props>(
250
253
  }, [])
251
254
 
252
255
  return (
253
- <SliderValuesProvider
256
+ <SliderProvider
254
257
  min={min}
255
258
  max={max}
256
259
  step={step}
@@ -290,6 +293,8 @@ export const Slider = forwardRef<SliderMethods, Props>(
290
293
  style={{
291
294
  display: 'flex',
292
295
  flexDirection: vertical ? 'row' : 'column',
296
+ width: !vertical ? '100%' : undefined,
297
+ height: vertical ? '100%' : undefined,
293
298
  }}
294
299
  >
295
300
  <div className="tremolo-slider-track-wrapper" ref={trackElementRef}>
@@ -308,13 +313,17 @@ export const Slider = forwardRef<SliderMethods, Props>(
308
313
  {scaleComponent}
309
314
  </div>
310
315
  </div>
311
- </SliderValuesProvider>
316
+ </SliderProvider>
312
317
  )
313
318
  },
314
319
  )
315
320
 
316
- export * from './context'
317
- export * from './Thumb'
318
- export * from './Track'
319
- export * from './Scale'
320
- export * from './ScaleOption'
321
+ export { useSliderContext } from './context'
322
+ export {
323
+ SliderThumb,
324
+ type SliderThumbMethods,
325
+ type SliderThumbProps,
326
+ } from './Thumb'
327
+ export { SliderTrack, type SliderTrackProps } from './Track'
328
+ export { Scale, type ScaleProps } from './Scale'
329
+ export { ScaleOption, type ScaleOptionProps } from './ScaleOption'
@@ -25,6 +25,7 @@ interface Props<T extends ElementType> {
25
25
  onWheel?: (event: WheelEvent) => void
26
26
  }
27
27
 
28
+ /** @category WheelObserver */
28
29
  export function WheelObserver<T extends ElementType = 'div'>(
29
30
  props: Props<T> & Omit<ComponentPropsWithoutRef<T>, keyof Props<T>>,
30
31
  ) {
@@ -1,6 +1,7 @@
1
1
  import clsx from 'clsx'
2
2
  import { CSSProperties, ReactElement } from 'react'
3
3
 
4
+ /** @category XYPad */
4
5
  export interface AreaProps {
5
6
  width?: number | string
6
7
  height?: number | string
@@ -13,6 +14,7 @@ export interface AreaProps {
13
14
  __thumb?: ReactElement
14
15
  }
15
16
 
17
+ /** @category XYPad */
16
18
  export function XYPadArea({
17
19
  width = 120,
18
20
  height = 120,
@@ -8,6 +8,7 @@ import {
8
8
  useRef,
9
9
  } from 'react'
10
10
 
11
+ /** @category XYPad */
11
12
  export interface ThumbProps {
12
13
  size?: number | string
13
14
  width?: number | string
@@ -24,6 +25,7 @@ export interface ThumbProps {
24
25
  __css?: CSSProperties
25
26
  }
26
27
 
28
+ /** @category XYPad */
27
29
  export interface XYPadThumbMethods {
28
30
  focus: () => void
29
31
  blur: () => void
@@ -32,6 +34,7 @@ export interface XYPadThumbMethods {
32
34
  type Props = ThumbProps &
33
35
  Omit<ComponentPropsWithoutRef<'div'>, keyof ThumbProps>
34
36
 
37
+ /** @category XYPad */
35
38
  export const XYPadThumb = forwardRef<XYPadThumbMethods, Props>(
36
39
  (
37
40
  {
@@ -26,6 +26,7 @@ import { addNoSelect, removeNoSelect } from '../_util'
26
26
  import { XYPadArea, AreaProps } from './Area'
27
27
  import { XYPadThumb, XYPadThumbMethods, ThumbProps } from './Thumb'
28
28
 
29
+ /** @category XYPad */
29
30
  export interface ValueOptions {
30
31
  // required
31
32
  value: number
@@ -46,6 +47,7 @@ export interface ValueOptions {
46
47
  keyboard?: InputEventOption | null
47
48
  }
48
49
 
50
+ /** @category XYPad */
49
51
  export interface XYPadProps {
50
52
  x: ValueOptions
51
53
  y: ValueOptions
@@ -58,6 +60,7 @@ export interface XYPadProps {
58
60
  children?: ReactElement | ReactElement[]
59
61
  }
60
62
 
63
+ /** @category XYPad */
61
64
  export interface XYPadMethods {
62
65
  focus: () => void
63
66
  blur: () => void
@@ -76,6 +79,7 @@ type Props = XYPadProps &
76
79
 
77
80
  /**
78
81
  * Simple XYPad
82
+ * @category XYPad
79
83
  */
80
84
  export const XYPad = forwardRef<XYPadMethods, Props>(
81
85
  (
@@ -246,11 +250,11 @@ export const XYPad = forwardRef<XYPadMethods, Props>(
246
250
  [x, y],
247
251
  )
248
252
 
249
- useEventListener(window, 'mousemove', (event) => {
253
+ useEventListener(globalThis.window, 'mousemove', (event) => {
250
254
  handleValue(event)
251
255
  })
252
256
 
253
- useEventListener(window, 'mouseup', () => {
257
+ useEventListener(globalThis.window, 'mouseup', () => {
254
258
  thumbDragged.current = false
255
259
  if (bodyNoSelect) removeNoSelect()
256
260
  })
@@ -0,0 +1,18 @@
1
+ import { DependencyList, useCallback, useEffect, useRef } from 'react'
2
+
3
+ export const useAnimationFrame = (
4
+ callback = () => {},
5
+ deps: DependencyList = [],
6
+ ) => {
7
+ const reqIdRef = useRef(-1)
8
+ const loop = useCallback(() => {
9
+ reqIdRef.current = requestAnimationFrame(loop)
10
+ callback()
11
+ // eslint-disable-next-line react-hooks/exhaustive-deps
12
+ }, [callback, ...deps])
13
+
14
+ useEffect(() => {
15
+ reqIdRef.current = requestAnimationFrame(loop)
16
+ return () => cancelAnimationFrame(reqIdRef.current)
17
+ }, [loop])
18
+ }
@@ -0,0 +1,92 @@
1
+ import { useRef, useCallback } from 'react'
2
+
3
+ import { useEventListener } from './useEventListener'
4
+ import { useRefCallbackEvent } from './useRefCallbackEvent'
5
+
6
+ interface Props {
7
+ threshold?: number
8
+
9
+ onDrag: (x: number, y: number, deltaX: number, deltaY: number) => void
10
+ onDragStart?: () => void
11
+ onDragEnd?: () => void
12
+ }
13
+
14
+ /**
15
+ * @returns [refCallback, pointerDownHandler]
16
+ */
17
+ export function useDrag<T extends Element>({
18
+ threshold = 1,
19
+ onDrag,
20
+ onDragStart,
21
+ onDragEnd,
22
+ }: Props): [
23
+ (div: EventTarget | null) => void,
24
+ (event: React.PointerEvent<T>) => void,
25
+ ] {
26
+ const dragOffsetX = useRef<number | undefined>(undefined)
27
+ const dragOffsetY = useRef<number | undefined>(undefined)
28
+ const dragStartX = useRef(0)
29
+ const dragStartY = useRef(0)
30
+
31
+ const handleDrag = useCallback(
32
+ (
33
+ event: MouseEvent | React.MouseEvent<T, MouseEvent> | TouchEvent,
34
+ first = false,
35
+ ) => {
36
+ const isTouch = event instanceof TouchEvent
37
+ if (isTouch && event.cancelable) event.preventDefault()
38
+ const screenX = isTouch ? event.touches[0].screenX : event.screenX
39
+ const screenY = isTouch ? event.touches[0].screenY : event.screenY
40
+ let deltaX = 0
41
+ let deltaY = 0
42
+ if (first) {
43
+ dragStartX.current = screenX
44
+ dragStartY.current = screenY
45
+ }
46
+ if (dragOffsetX.current) {
47
+ deltaX = screenX - dragOffsetX.current
48
+ dragOffsetX.current = screenX
49
+ }
50
+ if (dragOffsetY.current) {
51
+ deltaY = screenY - dragOffsetY.current
52
+ dragOffsetY.current = screenY
53
+ }
54
+ if (Math.abs(deltaX) < threshold && Math.abs(deltaY) < threshold) return
55
+ if (onDrag)
56
+ onDrag(
57
+ screenX - dragStartX.current,
58
+ screenY - dragStartY.current,
59
+ deltaX,
60
+ deltaY,
61
+ )
62
+ },
63
+ [threshold, onDrag],
64
+ )
65
+
66
+ const refHandler = useRefCallbackEvent(
67
+ 'touchmove',
68
+ handleDrag,
69
+ { passive: false },
70
+ [onDrag],
71
+ )
72
+
73
+ const pointerDownHandler = useCallback(
74
+ (event: React.PointerEvent<T>) => {
75
+ dragOffsetX.current = event.screenX
76
+ dragOffsetY.current = event.screenY
77
+ handleDrag(event, true)
78
+ onDragStart?.()
79
+ },
80
+ [handleDrag, onDragStart],
81
+ )
82
+
83
+ useEventListener(globalThis.window, 'mousemove', handleDrag)
84
+
85
+ useEventListener(globalThis.window, 'pointerup', () => {
86
+ dragOffsetX.current = undefined
87
+ dragOffsetY.current = undefined
88
+ onDragEnd?.()
89
+ })
90
+
91
+ return [refHandler, pointerDownHandler]
92
+ }
@@ -1,20 +1,17 @@
1
1
  import { useMemo } from 'react'
2
2
 
3
- type Options = boolean | AddEventListenerOptions
4
- type CallbackFunc = (div: EventTarget | null) => void
5
-
6
3
  export function useRefCallbackEvent<K extends keyof DocumentEventMap>(
7
4
  event: K,
8
5
  handler: (event: DocumentEventMap[K]) => void,
9
- options?: Options,
6
+ options?: boolean | AddEventListenerOptions,
10
7
  deps?: React.DependencyList,
11
- ): CallbackFunc
8
+ ): (div: EventTarget | null) => void
12
9
  export function useRefCallbackEvent(
13
10
  event: string,
14
11
  handler: (event: Event) => void,
15
- options?: Options,
12
+ options?: boolean | AddEventListenerOptions,
16
13
  deps: React.DependencyList = [],
17
- ): CallbackFunc {
14
+ ): (div: EventTarget | null) => void {
18
15
  return useMemo(() => {
19
16
  let cleanup: (() => void) | undefined
20
17
  return (node: EventTarget | null) => {