rege 0.2.0 → 0.3.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.
- package/dist/index.d.ts +12 -12
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.ts +24 -23
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +1 -1
- package/dist/react.mjs.map +1 -1
- package/dist/{types-dbd32c09.d.ts → types-372314b9.d.ts} +81 -66
- package/package.json +54 -28
- package/src/drag/index.ts +126 -0
- package/src/drag/react.ts +22 -0
- package/src/drag/types.ts +29 -0
- package/src/hover/index.ts +121 -0
- package/src/hover/react.ts +22 -0
- package/src/hover/types.ts +25 -0
- package/src/index.ts +7 -0
- package/src/key/index.ts +37 -0
- package/src/key/react.ts +20 -0
- package/src/key/types.ts +12 -0
- package/src/pinch/index.ts +447 -0
- package/src/pinch/react.ts +22 -0
- package/src/pinch/types.ts +63 -0
- package/src/pinch/utils.ts +106 -0
- package/src/react.ts +7 -0
- package/src/resize/index.ts +49 -0
- package/src/resize/react.ts +22 -0
- package/src/resize/types.ts +10 -0
- package/src/scroll/index.ts +101 -0
- package/src/scroll/react.ts +22 -0
- package/src/scroll/types.ts +29 -0
- package/src/scroll/utils.ts +7 -0
- package/src/utils.ts +109 -0
- package/src/wheel/index.ts +98 -0
- package/src/wheel/react.ts +22 -0
- package/src/wheel/types.ts +29 -0
- package/src/wheel/utils.ts +19 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { EventState, event } from 'reev/src'
|
|
2
|
+
import { DragState } from './types'
|
|
3
|
+
import { vec2, addV, subV, cpV, getDevice, getClientVec2 } from '../utils'
|
|
4
|
+
|
|
5
|
+
export * from './types'
|
|
6
|
+
|
|
7
|
+
export const EVENT_FOR_DRAG = {
|
|
8
|
+
touch: {
|
|
9
|
+
start: 'touchstart',
|
|
10
|
+
move: 'touchmove',
|
|
11
|
+
end: 'touchend',
|
|
12
|
+
up: 'touchcancel',
|
|
13
|
+
},
|
|
14
|
+
pointer: {
|
|
15
|
+
start: 'pointerdown',
|
|
16
|
+
move: 'pointermove',
|
|
17
|
+
end: 'pointerup',
|
|
18
|
+
up: 'pointercancel',
|
|
19
|
+
},
|
|
20
|
+
mouse: {
|
|
21
|
+
start: 'mousedown',
|
|
22
|
+
move: 'mousemove',
|
|
23
|
+
end: 'mouseup',
|
|
24
|
+
up: 'mousecancel',
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const dragEvent = <El extends Element = Element>(state: Partial<DragState<El>> = {}) => {
|
|
29
|
+
const initValues = () => {
|
|
30
|
+
vec2(0, 0, self.value)
|
|
31
|
+
vec2(0, 0, self._value)
|
|
32
|
+
vec2(0, 0, self.delta)
|
|
33
|
+
vec2(0, 0, self.movement)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const drag = () => {
|
|
37
|
+
self.isDragStart = self.active && !self._active
|
|
38
|
+
self.isDragging = self.active && self._active
|
|
39
|
+
self.isDragEnd = !self.active && self._active
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const dragStart = (e: Event) => {
|
|
43
|
+
self.event = e
|
|
44
|
+
self.active = true
|
|
45
|
+
getClientVec2(e, self.device, self.value)
|
|
46
|
+
if (self.target.setPointerCapture && 'pointerId' in e)
|
|
47
|
+
// @ts-ignore
|
|
48
|
+
self.target.setPointerCapture(e.pointerId)
|
|
49
|
+
self.drag(self)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const dragging = (e: Event) => {
|
|
53
|
+
self.event = e
|
|
54
|
+
self._active = self.active
|
|
55
|
+
cpV(self.value, self._value)
|
|
56
|
+
getClientVec2(e, self.device, self.value)
|
|
57
|
+
if (self._active) {
|
|
58
|
+
subV(self.value, self._value, self.delta)
|
|
59
|
+
addV(self.offset, self.delta, self.offset)
|
|
60
|
+
addV(self.movement, self.delta, self.movement)
|
|
61
|
+
}
|
|
62
|
+
self.drag(self)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const dragEnd = (e: Event) => {
|
|
66
|
+
self.event = e
|
|
67
|
+
self.active = false
|
|
68
|
+
initValues()
|
|
69
|
+
if (self.target.releasePointerCapture && 'pointerId' in e)
|
|
70
|
+
// @ts-ignore
|
|
71
|
+
self.target.releasePointerCapture(e.pointerId)
|
|
72
|
+
self.drag(self)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const mount = (target: El) => {
|
|
76
|
+
self.target = target
|
|
77
|
+
const { start, move, end, up } = EVENT_FOR_DRAG[self.device]
|
|
78
|
+
target.addEventListener(start, self.dragStart)
|
|
79
|
+
target.addEventListener(move, self.dragging)
|
|
80
|
+
target.addEventListener(end, self.dragEnd)
|
|
81
|
+
target.addEventListener(up, self.dragEnd)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const clean = () => {
|
|
85
|
+
const target = self.target
|
|
86
|
+
if (!target) return
|
|
87
|
+
const { start, move, end, up } = EVENT_FOR_DRAG[self.device]
|
|
88
|
+
target.removeEventListener(start, self.dragStart)
|
|
89
|
+
target.removeEventListener(move, self.dragging)
|
|
90
|
+
target.removeEventListener(end, self.dragEnd)
|
|
91
|
+
target.removeEventListener(up, self.dragEnd)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const ref = (el: El) => {
|
|
95
|
+
self(state as DragState<El>)
|
|
96
|
+
if (el) {
|
|
97
|
+
self.mount(el)
|
|
98
|
+
} else self.clean()
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const self = event({
|
|
102
|
+
_active: false,
|
|
103
|
+
active: false,
|
|
104
|
+
device: getDevice(),
|
|
105
|
+
_value: vec2(0, 0),
|
|
106
|
+
value: vec2(0, 0),
|
|
107
|
+
delta: vec2(0, 0),
|
|
108
|
+
offset: vec2(0, 0),
|
|
109
|
+
movement: vec2(0, 0),
|
|
110
|
+
target: null,
|
|
111
|
+
event: null,
|
|
112
|
+
memo: {},
|
|
113
|
+
isDragStart: false,
|
|
114
|
+
isDragging: false,
|
|
115
|
+
isDragEnd: false,
|
|
116
|
+
drag,
|
|
117
|
+
dragStart,
|
|
118
|
+
dragging,
|
|
119
|
+
dragEnd,
|
|
120
|
+
mount,
|
|
121
|
+
clean,
|
|
122
|
+
ref,
|
|
123
|
+
}) as EventState<DragState<El>>
|
|
124
|
+
|
|
125
|
+
return self
|
|
126
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useOnce, useMutable } from 'reev/src/react'
|
|
2
|
+
import { DragArg, DragState } from './types'
|
|
3
|
+
import { dragEvent } from './index'
|
|
4
|
+
import { isF } from '../utils'
|
|
5
|
+
import type { ReactNode } from 'react'
|
|
6
|
+
|
|
7
|
+
export const useDrag = <El extends Element = Element>(arg: DragArg<El>) => {
|
|
8
|
+
if (isF(arg)) arg = { drag: arg }
|
|
9
|
+
const memo = useMutable(arg)
|
|
10
|
+
return useOnce(() => dragEvent<El>(memo as any))
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default useDrag
|
|
14
|
+
|
|
15
|
+
export interface DragProps<El extends Element = Element> extends Partial<DragState<El>> {
|
|
16
|
+
children(self: DragState<El>): ReactNode
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const Drag = <El extends Element = Element>(props: DragProps<El>) => {
|
|
20
|
+
const { children, ...other } = props
|
|
21
|
+
return children(useDrag(other))
|
|
22
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Vec2 } from '../utils'
|
|
2
|
+
|
|
3
|
+
export type DragDevice = 'mouse' | 'touch' | 'pointer'
|
|
4
|
+
|
|
5
|
+
export interface DragState<El extends Element = Element> {
|
|
6
|
+
_active: boolean
|
|
7
|
+
active: boolean
|
|
8
|
+
device: DragDevice
|
|
9
|
+
_value: Vec2
|
|
10
|
+
value: Vec2
|
|
11
|
+
delta: Vec2
|
|
12
|
+
offset: Vec2
|
|
13
|
+
movement: Vec2
|
|
14
|
+
target: El
|
|
15
|
+
event: Event
|
|
16
|
+
memo: any
|
|
17
|
+
isDragStart: boolean
|
|
18
|
+
isDragging: boolean
|
|
19
|
+
isDragEnd: boolean
|
|
20
|
+
drag(self: DragState<El>): void
|
|
21
|
+
dragStart(e: Event): void
|
|
22
|
+
dragging(e: Event): void
|
|
23
|
+
dragEnd(e: Event): void
|
|
24
|
+
mount(target: Element): void
|
|
25
|
+
clean(): void
|
|
26
|
+
ref(traget: Element): void
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type DragArg<El extends Element> = Partial<DragState<El>> | DragState<El>['drag']
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { HoverState } from './types'
|
|
2
|
+
import { EventState, event } from 'reev/src'
|
|
3
|
+
import { vec2, addV, subV, getDevice, getClientVec2, cpV } from '../utils'
|
|
4
|
+
|
|
5
|
+
export * from './types'
|
|
6
|
+
|
|
7
|
+
export const EVENT_FOR_HOVER = {
|
|
8
|
+
touch: {
|
|
9
|
+
start: 'touchstart',
|
|
10
|
+
move: 'touchmove',
|
|
11
|
+
end: 'touchend',
|
|
12
|
+
up: 'touchcancel',
|
|
13
|
+
},
|
|
14
|
+
pointer: {
|
|
15
|
+
start: 'pointerenter',
|
|
16
|
+
move: 'pointermove',
|
|
17
|
+
end: 'pointerleave',
|
|
18
|
+
up: 'pointercancel',
|
|
19
|
+
},
|
|
20
|
+
mouse: {
|
|
21
|
+
start: 'mouseenter',
|
|
22
|
+
move: 'mousemove',
|
|
23
|
+
end: 'mouseleave',
|
|
24
|
+
up: 'mousecancel',
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const hoverEvent = <El extends Element = Element>(state: Partial<HoverState<El>> = {}) => {
|
|
29
|
+
const initValues = () => {
|
|
30
|
+
vec2(0, 0, self.value)
|
|
31
|
+
vec2(0, 0, self._value)
|
|
32
|
+
vec2(0, 0, self.delta)
|
|
33
|
+
vec2(0, 0, self.movement)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const hover = () => {
|
|
37
|
+
self.isHoverStart = !self._active && self.active
|
|
38
|
+
self.isHovering = self._active && self.active
|
|
39
|
+
self.isHoverEnd = self._active && !self.active
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const hoverStart = (e: Event) => {
|
|
43
|
+
self.event = e
|
|
44
|
+
self.active = true
|
|
45
|
+
getClientVec2(e, self.device, self.value)
|
|
46
|
+
self.hover(self)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const hovering = (e: Event) => {
|
|
50
|
+
self.event = e
|
|
51
|
+
self._active = self.active
|
|
52
|
+
cpV(self.value, self._value)
|
|
53
|
+
getClientVec2(e, self.device, self.value)
|
|
54
|
+
if (self._active) {
|
|
55
|
+
subV(self.value, self._value, self.delta)
|
|
56
|
+
addV(self.offset, self.delta, self.offset)
|
|
57
|
+
addV(self.movement, self.delta, self.movement)
|
|
58
|
+
}
|
|
59
|
+
self.hover(self)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const hoverEnd = (e: Event) => {
|
|
63
|
+
self.event = e
|
|
64
|
+
self._active = true
|
|
65
|
+
self.active = false
|
|
66
|
+
initValues()
|
|
67
|
+
self.hover(self)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const mount = (target: El) => {
|
|
71
|
+
self.target = target
|
|
72
|
+
const { start, move, end, up } = EVENT_FOR_HOVER[self.device]
|
|
73
|
+
target.addEventListener(start, self.hoverStart)
|
|
74
|
+
target.addEventListener(move, self.hovering)
|
|
75
|
+
target.addEventListener(end, self.hoverEnd)
|
|
76
|
+
target.addEventListener(up, self.hoverEnd)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const clean = () => {
|
|
80
|
+
const target = self.target
|
|
81
|
+
if (!target) return
|
|
82
|
+
const { start, move, end, up } = EVENT_FOR_HOVER[self.device]
|
|
83
|
+
target.removeEventListener(start, self.hoverStart)
|
|
84
|
+
target.removeEventListener(move, self.hovering)
|
|
85
|
+
target.removeEventListener(end, self.hoverEnd)
|
|
86
|
+
target.removeEventListener(up, self.hoverEnd)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const ref = (target: El | null) => {
|
|
90
|
+
self(state as HoverState<El>)
|
|
91
|
+
if (target) {
|
|
92
|
+
self.mount(target)
|
|
93
|
+
} else self.clean()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const self = event({
|
|
97
|
+
_active: false,
|
|
98
|
+
active: false,
|
|
99
|
+
device: getDevice(),
|
|
100
|
+
_value: vec2(0, 0),
|
|
101
|
+
value: vec2(0, 0),
|
|
102
|
+
delta: vec2(0, 0),
|
|
103
|
+
offset: vec2(0, 0),
|
|
104
|
+
movement: vec2(0, 0),
|
|
105
|
+
target: null,
|
|
106
|
+
event: null,
|
|
107
|
+
memo: {},
|
|
108
|
+
isHoverStart: false,
|
|
109
|
+
isHovering: false,
|
|
110
|
+
isHoverEnd: false,
|
|
111
|
+
hover,
|
|
112
|
+
hoverStart,
|
|
113
|
+
hovering,
|
|
114
|
+
hoverEnd,
|
|
115
|
+
mount,
|
|
116
|
+
clean,
|
|
117
|
+
ref,
|
|
118
|
+
}) as EventState<HoverState<El>>
|
|
119
|
+
|
|
120
|
+
return self
|
|
121
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useOnce, useMutable } from 'reev/src/react'
|
|
2
|
+
import { hoverEvent } from '.'
|
|
3
|
+
import { HoverArg, HoverState } from './types'
|
|
4
|
+
import { isF } from '../utils'
|
|
5
|
+
import type { ReactNode } from 'react'
|
|
6
|
+
|
|
7
|
+
export const useHover = <El extends Element = Element>(arg?: HoverArg) => {
|
|
8
|
+
if (isF(arg)) arg = { hover: arg }
|
|
9
|
+
const memo = useMutable(arg)
|
|
10
|
+
return useOnce(() => hoverEvent<El>(memo as any))
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default useHover
|
|
14
|
+
|
|
15
|
+
export interface HoverProps<El extends Element = Element> extends Partial<HoverState<El>> {
|
|
16
|
+
children: (state: HoverState<El>) => ReactNode
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const Hover = (props: HoverProps) => {
|
|
20
|
+
const { children, ...other } = props
|
|
21
|
+
return children(useHover(other))
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Vec2 } from '../utils'
|
|
2
|
+
export interface HoverState<El extends Element = Element> {
|
|
3
|
+
_active: boolean
|
|
4
|
+
active: boolean
|
|
5
|
+
device: 'mouse' | 'pointer' | 'touch'
|
|
6
|
+
_value: Vec2
|
|
7
|
+
value: Vec2
|
|
8
|
+
delta: Vec2
|
|
9
|
+
offset: Vec2
|
|
10
|
+
movement: Vec2
|
|
11
|
+
event: Event
|
|
12
|
+
target: El
|
|
13
|
+
isHoverStart: boolean
|
|
14
|
+
isHovering: boolean
|
|
15
|
+
isHoverEnd: boolean
|
|
16
|
+
hover: (self: HoverState) => void
|
|
17
|
+
hoverStart(e: Event): void
|
|
18
|
+
hovering(e: Event): void
|
|
19
|
+
hoverEnd(e: Event): void
|
|
20
|
+
mount(target: El): void
|
|
21
|
+
clean(target?: El): void
|
|
22
|
+
ref(target: El | null): void
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type HoverArg<El extends Element = Element> = Partial<HoverState<El>> | HoverState<El>['hover']
|
package/src/index.ts
ADDED
package/src/key/index.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { event } from 'reev/src'
|
|
2
|
+
import { KeyState } from './types'
|
|
3
|
+
|
|
4
|
+
export * from './types'
|
|
5
|
+
|
|
6
|
+
export const keyEvent = <El extends Element = Element>(state: Partial<KeyState<El>> = {}) => {
|
|
7
|
+
const keydown = (e: KeyboardEvent) => {
|
|
8
|
+
self.event = e
|
|
9
|
+
self.pressedKey = e.key
|
|
10
|
+
self.code = e.code
|
|
11
|
+
self.key?.(self)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const mount = (el: El | Window) => {
|
|
15
|
+
if (!el) el = el || window
|
|
16
|
+
self.target = el
|
|
17
|
+
|
|
18
|
+
// @ts-ignore set tabindex to make element focusable
|
|
19
|
+
el.setAttribute('tabindex', '1') // @ts-ignore
|
|
20
|
+
el.addEventListener('keydown', self.keydown)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const clean = () => {
|
|
24
|
+
const el = self.target
|
|
25
|
+
if (!el) return // @ts-ignore
|
|
26
|
+
el.removeEventListener('keydown', self.keydown)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const ref = (el: Element | null) => {
|
|
30
|
+
self(state)
|
|
31
|
+
if (el) self.mount(el as El)
|
|
32
|
+
else self.clean()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const self = event<KeyState<El>>({ keydown, mount, clean, ref })
|
|
36
|
+
return self
|
|
37
|
+
}
|
package/src/key/react.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useMutable, useOnce } from 'reev/src/react'
|
|
2
|
+
import { keyEvent } from '.'
|
|
3
|
+
import { KeyArg, KeyState } from './types'
|
|
4
|
+
import { isF } from '../utils'
|
|
5
|
+
import type { ReactNode } from 'react'
|
|
6
|
+
|
|
7
|
+
export const useKey = <El extends Element = Element>(arg: KeyArg<El>) => {
|
|
8
|
+
if (isF(arg)) arg = { key: arg }
|
|
9
|
+
const memo = useMutable(arg)
|
|
10
|
+
return useOnce(() => keyEvent<El>(memo as any))
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface KeyProps<El extends Element = Element> extends Partial<KeyState<El>> {
|
|
14
|
+
children: (state: KeyState<El>) => ReactNode
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const Key = <El extends Element = Element>(props: KeyProps<El>) => {
|
|
18
|
+
const { children, ...other } = props
|
|
19
|
+
return children(useKey(other))
|
|
20
|
+
}
|
package/src/key/types.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface KeyState<El extends Element = Element> {
|
|
2
|
+
target: El | Window
|
|
3
|
+
pressedKey: string
|
|
4
|
+
code: string
|
|
5
|
+
event: KeyboardEvent
|
|
6
|
+
key(e: KeyState): void
|
|
7
|
+
keydown(e: KeyboardEvent): void
|
|
8
|
+
mount(el: El): void
|
|
9
|
+
clean(): void
|
|
10
|
+
ref(el: Element | null): void
|
|
11
|
+
}
|
|
12
|
+
export type KeyArg<El extends Element = Element> = Partial<KeyState<El>> | KeyState<El>['key']
|