rege 0.1.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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "rege",
3
3
  "author": "tseijp",
4
4
  "license": "MIT",
5
- "version": "0.1.0",
5
+ "version": "0.3.0",
6
6
  "private": false,
7
7
  "sideEffect": false,
8
8
  "publishConfig": {
@@ -29,68 +29,94 @@
29
29
  ],
30
30
  "files": [
31
31
  "dist/**/*.{js,ts,mjs,mts,map}",
32
+ "src/**/*.{js,ts,mjs,mts,map}",
32
33
  "packages.json",
33
34
  "README.md"
34
35
  ],
35
36
  "main": "./dist/index.js",
36
- "types": "./dist/index.d.mts",
37
+ "types": "./dist/index.d.ts",
37
38
  "module": "./dist/index.mjs",
38
39
  "exports": {
39
40
  "./packages.json": "./packages.json",
41
+ "./src": {
42
+ "types": "./src/index.ts",
43
+ "import": "./src/index.ts",
44
+ "default": "./src/index.ts"
45
+ },
46
+ "./src/react": {
47
+ "types": "./src/react.ts",
48
+ "import": "./src/react.ts",
49
+ "default": "./src/react.ts"
50
+ },
51
+ "./react": {
52
+ "types": "./dist/react.d.ts",
53
+ "import": {
54
+ "types": "./dist/react.d.ts",
55
+ "default": "./dist/react.mjs"
56
+ },
57
+ "module": {
58
+ "types": "./dist/react.d.ts",
59
+ "default": "./dist/react.mjs"
60
+ },
61
+ "require": "./dist/react.js",
62
+ "default": "./dist/react.js"
63
+ },
40
64
  ".": {
41
- "types": "./dist/index.d.mts",
65
+ "types": "./dist/index.d.ts",
42
66
  "import": {
43
- "types": "./dist/index.d.mts",
67
+ "types": "./dist/index.d.ts",
44
68
  "default": "./dist/index.mjs"
45
69
  },
46
70
  "module": {
47
- "types": "./dist/index.d.mts",
71
+ "types": "./dist/index.d.ts",
48
72
  "default": "./dist/index.mjs"
49
73
  },
50
74
  "require": "./dist/index.js",
51
75
  "default": "./dist/index.js"
52
76
  },
53
77
  "./*": {
54
- "types": "./dist/index.d.mts",
78
+ "types": "./dist/index.d.ts",
55
79
  "import": {
56
- "types": "./dist/index.d.mts",
80
+ "types": "./dist/index.d.ts",
57
81
  "default": "./dist/index.mjs"
58
82
  },
59
83
  "module": {
60
- "types": "./dist/index.d.mts",
84
+ "types": "./dist/index.d.ts",
61
85
  "default": "./dist/index.mjs"
62
86
  },
63
87
  "require": "./dist/index.js",
64
88
  "default": "./dist/index.js"
89
+ }
90
+ },
91
+ "dependencies": {
92
+ "reev": "0.12.0"
93
+ },
94
+ "peerDependencies": {
95
+ "expo": "*",
96
+ "expo-gl": "*",
97
+ "react": ">=16.8",
98
+ "react-dom": ">=16.8",
99
+ "solid-js": "*",
100
+ "vue": "*"
101
+ },
102
+ "peerDependenciesMeta": {
103
+ "expo": {
104
+ "optional": true
65
105
  },
66
- "./react": {
67
- "types": "./dist/react.d.mts",
68
- "import": {
69
- "types": "./dist/react.d.mts",
70
- "default": "./dist/react.mjs"
71
- },
72
- "module": {
73
- "types": "./dist/react.d.mts",
74
- "default": "./dist/react.mjs"
75
- },
76
- "require": "./dist/react.js",
77
- "default": "./dist/react.js"
106
+ "expo-gl": {
107
+ "optional": true
78
108
  },
79
- "./react/*": {
80
- "types": "./dist/react.d.mts",
81
- "import": {
82
- "types": "./dist/react.d.mts",
83
- "default": "./dist/react.mjs"
84
- },
85
- "module": {
86
- "types": "./dist/react.d.mts",
87
- "default": "./dist/react.mjs"
88
- },
89
- "require": "./dist/react.js",
90
- "default": "./dist/react.js"
109
+ "react": {
110
+ "optional": true
111
+ },
112
+ "react-dom": {
113
+ "optional": true
114
+ },
115
+ "solid-js": {
116
+ "optional": true
117
+ },
118
+ "vue": {
119
+ "optional": true
91
120
  }
92
- },
93
- "devDependencies": {
94
- "reev": "*"
95
121
  }
96
122
  }
@@ -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
@@ -0,0 +1,7 @@
1
+ export * from './drag'
2
+ export * from './hover'
3
+ export * from './key'
4
+ export * from './resize'
5
+ export * from './pinch'
6
+ export * from './scroll'
7
+ export * from './wheel'
@@ -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
+ }
@@ -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
+ }
@@ -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']