@tremolo-ui/react 0.0.9 → 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.
- package/dist/cjs/index.js +432 -269
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/components/AnimationCanvas/index.d.ts +9 -4
- package/dist/cjs/types/components/AnimationCanvas/index.d.ts.map +1 -1
- package/dist/cjs/types/components/AnimationKnob/index.d.ts +2 -0
- package/dist/cjs/types/components/AnimationKnob/index.d.ts.map +1 -1
- package/dist/cjs/types/components/DragObserver/index.d.ts +3 -1
- package/dist/cjs/types/components/DragObserver/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Knob/index.d.ts +2 -0
- package/dist/cjs/types/components/Knob/index.d.ts.map +1 -1
- package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts +7 -0
- package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts.map +1 -0
- package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts +7 -0
- package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts.map +1 -0
- package/dist/cjs/types/components/NumberInput/Stepper.d.ts +8 -0
- package/dist/cjs/types/components/NumberInput/Stepper.d.ts.map +1 -0
- package/dist/cjs/types/components/NumberInput/context.d.ts +27 -0
- package/dist/cjs/types/components/NumberInput/context.d.ts.map +1 -0
- package/dist/cjs/types/components/NumberInput/index.d.ts +31 -16
- package/dist/cjs/types/components/NumberInput/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/BlackKey.d.ts +1 -0
- package/dist/cjs/types/components/Piano/BlackKey.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/KeyLabel.d.ts +2 -0
- package/dist/cjs/types/components/Piano/KeyLabel.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/WhiteKey.d.ts +2 -0
- package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/index.d.ts +6 -4
- package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/key.d.ts +8 -2
- package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts +2 -0
- package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/Scale.d.ts +2 -0
- package/dist/cjs/types/components/Slider/Scale.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/ScaleOption.d.ts +2 -0
- package/dist/cjs/types/components/Slider/ScaleOption.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/Thumb.d.ts +4 -0
- package/dist/cjs/types/components/Slider/Thumb.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/Track.d.ts +6 -1
- package/dist/cjs/types/components/Slider/Track.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/context.d.ts +15 -12
- package/dist/cjs/types/components/Slider/context.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/index.d.ts +8 -5
- package/dist/cjs/types/components/Slider/index.d.ts.map +1 -1
- package/dist/cjs/types/components/WheelObserver/index.d.ts +1 -0
- package/dist/cjs/types/components/WheelObserver/index.d.ts.map +1 -1
- package/dist/cjs/types/components/XYPad/Area.d.ts +2 -0
- package/dist/cjs/types/components/XYPad/Area.d.ts.map +1 -1
- package/dist/cjs/types/components/XYPad/Thumb.d.ts +3 -0
- package/dist/cjs/types/components/XYPad/Thumb.d.ts.map +1 -1
- package/dist/cjs/types/components/XYPad/index.d.ts +4 -0
- package/dist/cjs/types/components/XYPad/index.d.ts.map +1 -1
- package/dist/cjs/types/hooks/useAnimationFrame.d.ts +3 -0
- package/dist/cjs/types/hooks/useAnimationFrame.d.ts.map +1 -0
- package/dist/cjs/types/hooks/useDrag.d.ts +15 -0
- package/dist/cjs/types/hooks/useDrag.d.ts.map +1 -0
- package/dist/cjs/types/hooks/useRefCallbackEvent.d.ts +1 -4
- package/dist/cjs/types/hooks/useRefCallbackEvent.d.ts.map +1 -1
- package/dist/esm/index.js +430 -260
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/AnimationCanvas/index.d.ts +9 -4
- package/dist/esm/types/components/AnimationCanvas/index.d.ts.map +1 -1
- package/dist/esm/types/components/AnimationKnob/index.d.ts +2 -0
- package/dist/esm/types/components/AnimationKnob/index.d.ts.map +1 -1
- package/dist/esm/types/components/DragObserver/index.d.ts +3 -1
- package/dist/esm/types/components/DragObserver/index.d.ts.map +1 -1
- package/dist/esm/types/components/Knob/index.d.ts +2 -0
- package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
- package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts +7 -0
- package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts.map +1 -0
- package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts +7 -0
- package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts.map +1 -0
- package/dist/esm/types/components/NumberInput/Stepper.d.ts +8 -0
- package/dist/esm/types/components/NumberInput/Stepper.d.ts.map +1 -0
- package/dist/esm/types/components/NumberInput/context.d.ts +27 -0
- package/dist/esm/types/components/NumberInput/context.d.ts.map +1 -0
- package/dist/esm/types/components/NumberInput/index.d.ts +31 -16
- package/dist/esm/types/components/NumberInput/index.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/BlackKey.d.ts +1 -0
- package/dist/esm/types/components/Piano/BlackKey.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/KeyLabel.d.ts +2 -0
- package/dist/esm/types/components/Piano/KeyLabel.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/WhiteKey.d.ts +2 -0
- package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/index.d.ts +6 -4
- package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/key.d.ts +8 -2
- package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts +2 -0
- package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/Scale.d.ts +2 -0
- package/dist/esm/types/components/Slider/Scale.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/ScaleOption.d.ts +2 -0
- package/dist/esm/types/components/Slider/ScaleOption.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/Thumb.d.ts +4 -0
- package/dist/esm/types/components/Slider/Thumb.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/Track.d.ts +6 -1
- package/dist/esm/types/components/Slider/Track.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/context.d.ts +15 -12
- package/dist/esm/types/components/Slider/context.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/index.d.ts +8 -5
- package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
- package/dist/esm/types/components/WheelObserver/index.d.ts +1 -0
- package/dist/esm/types/components/WheelObserver/index.d.ts.map +1 -1
- package/dist/esm/types/components/XYPad/Area.d.ts +2 -0
- package/dist/esm/types/components/XYPad/Area.d.ts.map +1 -1
- package/dist/esm/types/components/XYPad/Thumb.d.ts +3 -0
- package/dist/esm/types/components/XYPad/Thumb.d.ts.map +1 -1
- package/dist/esm/types/components/XYPad/index.d.ts +4 -0
- package/dist/esm/types/components/XYPad/index.d.ts.map +1 -1
- package/dist/esm/types/hooks/useAnimationFrame.d.ts +3 -0
- package/dist/esm/types/hooks/useAnimationFrame.d.ts.map +1 -0
- package/dist/esm/types/hooks/useDrag.d.ts +15 -0
- package/dist/esm/types/hooks/useDrag.d.ts.map +1 -0
- package/dist/esm/types/hooks/useRefCallbackEvent.d.ts +1 -4
- package/dist/esm/types/hooks/useRefCallbackEvent.d.ts.map +1 -1
- package/dist/styles/index.css +110 -14
- package/package.json +5 -2
- package/src/components/AnimationCanvas/index.tsx +13 -4
- package/src/components/AnimationKnob/index.tsx +24 -42
- package/src/components/DragObserver/index.tsx +14 -52
- package/src/components/Knob/index.tsx +23 -40
- package/src/components/NumberInput/DecrementStepper.tsx +52 -0
- package/src/components/NumberInput/IncrementStepper.tsx +52 -0
- package/src/components/NumberInput/Stepper.tsx +25 -0
- package/src/components/NumberInput/context.tsx +150 -0
- package/src/components/NumberInput/index.css +102 -14
- package/src/components/NumberInput/index.tsx +164 -55
- package/src/components/Piano/BlackKey.tsx +13 -10
- package/src/components/Piano/KeyLabel.tsx +2 -0
- package/src/components/Piano/WhiteKey.tsx +14 -10
- package/src/components/Piano/index.tsx +13 -11
- package/src/components/Piano/key.ts +8 -2
- package/src/components/Piano/keyboardShortcuts.ts +2 -0
- package/src/components/Slider/Scale.tsx +8 -6
- package/src/components/Slider/ScaleOption.tsx +8 -6
- package/src/components/Slider/Thumb.tsx +7 -3
- package/src/components/Slider/Track.tsx +27 -15
- package/src/components/Slider/context.tsx +65 -51
- package/src/components/Slider/index.css +8 -0
- package/src/components/Slider/index.tsx +19 -10
- package/src/components/WheelObserver/index.tsx +1 -0
- package/src/components/XYPad/Area.tsx +2 -0
- package/src/components/XYPad/Thumb.tsx +3 -0
- package/src/components/XYPad/index.tsx +6 -2
- package/src/hooks/useAnimationFrame.ts +18 -0
- package/src/hooks/useDrag.ts +92 -0
- 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 {
|
|
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
|
-
<
|
|
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
|
-
</
|
|
316
|
+
</SliderProvider>
|
|
312
317
|
)
|
|
313
318
|
},
|
|
314
319
|
)
|
|
315
320
|
|
|
316
|
-
export
|
|
317
|
-
export
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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?:
|
|
6
|
+
options?: boolean | AddEventListenerOptions,
|
|
10
7
|
deps?: React.DependencyList,
|
|
11
|
-
):
|
|
8
|
+
): (div: EventTarget | null) => void
|
|
12
9
|
export function useRefCallbackEvent(
|
|
13
10
|
event: string,
|
|
14
11
|
handler: (event: Event) => void,
|
|
15
|
-
options?:
|
|
12
|
+
options?: boolean | AddEventListenerOptions,
|
|
16
13
|
deps: React.DependencyList = [],
|
|
17
|
-
):
|
|
14
|
+
): (div: EventTarget | null) => void {
|
|
18
15
|
return useMemo(() => {
|
|
19
16
|
let cleanup: (() => void) | undefined
|
|
20
17
|
return (node: EventTarget | null) => {
|