Skip to content

Commit 60aae21

Browse files
markjaniczakMark Janiczak
and
Mark Janiczak
authoredJan 28, 2023
Feature: Option to configure keyboard displacement in the drag gesture (#577)
* Added option to configure keyboard displacement in the drag gesture * Updated options doc * Moved computation of the key delta map * Added default values to factor * chore: update deps + add changeset --------- Co-authored-by: Mark Janiczak <janiczak.mark@abc.net.au>
1 parent 6b53f77 commit 60aae21

File tree

12 files changed

+8197
-5041
lines changed

12 files changed

+8197
-5041
lines changed
 

‎.changeset/big-wombats-count.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@use-gesture/core': patch
3+
---
4+
5+
feat: Added option to configure keyboard displacement in the drag gesture

‎demo/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"@types/three": "^0.140.0",
3232
"@vitejs/plugin-react": "^1.3.2",
3333
"typescript": "^4.8.4",
34-
"typescript-plugin-css-modules": "^3.4.0",
35-
"vite": "2.9.9"
34+
"typescript-plugin-css-modules": "^4.1.1",
35+
"vite": "^4.0.3"
3636
}
3737
}

‎documentation/pages/docs/options.mdx

+1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ Here are all options that can be applied to gestures.
127127
| [`swipe.distance`](#swipedistance) | **drag** | The minimum distance per axis (in `pixels`) the drag gesture needs to travel to trigger a swipe. |
128128
| [`swipe.velocity`](#swipevelocity) | **drag** | The minimum velocity per axis (in `pixels / ms`) the drag gesture needs to reach before the pointer is released. |
129129
| [`swipe.duration`](#swipeduration) | **drag** | The maximum duration in milliseconds that a swipe is detected. |
130+
| `keyboardDisplacement` | **drag** | The distance (in `pixels`) emulated by arrow keys. Default is `10`. |
130131
| `mouseOnly` | **hover, move** | Set to `false` if you want your `hover` or `move` handlers to be triggered on non-mouse events. This is a useful option in case you want to perform logic on touch-enabled devices. |
131132

132133
## Options explained

‎package.json

+19-22
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
"license": "MIT",
66
"private": true,
77
"preconstruct": {
8-
"___experimentalFlags_WILL_CHANGE_IN_PATCH": {
9-
"exports": true
10-
},
118
"packages": [
129
"packages/*"
1310
]
@@ -75,39 +72,39 @@
7572
]
7673
},
7774
"devDependencies": {
78-
"@babel/core": "^7.19.6",
75+
"@babel/core": "^7.20.12",
7976
"@babel/plugin-syntax-flow": "^7.18.6",
80-
"@babel/plugin-transform-react-jsx": "^7.19.0",
81-
"@babel/preset-env": "^7.19.4",
77+
"@babel/plugin-transform-react-jsx": "^7.20.13",
78+
"@babel/preset-env": "^7.20.2",
8279
"@babel/preset-react": "^7.18.6",
8380
"@babel/preset-typescript": "^7.18.6",
84-
"@changesets/cli": "^2.25.1",
85-
"@preconstruct/cli": "^2.2.2",
81+
"@changesets/cli": "^2.26.0",
82+
"@preconstruct/cli": "^2.3.0",
8683
"@size-limit/preset-small-lib": "^7.0.8",
8784
"@testing-library/jest-dom": "^5.16.5",
8885
"@testing-library/react": "^13.2.0",
8986
"@types/jest": "^27.5.1",
90-
"@types/node": "^18.11.7",
91-
"@types/react": "^18.0.24",
92-
"@types/react-dom": "^18.0.8",
93-
"@typescript-eslint/eslint-plugin": "^5.41.0",
94-
"@typescript-eslint/parser": "^5.41.0",
95-
"babel-jest": "^27.5.1",
96-
"eslint": "^8.26.0",
87+
"@types/node": "^18.11.18",
88+
"@types/react": "^18.0.27",
89+
"@types/react-dom": "^18.0.10",
90+
"@typescript-eslint/eslint-plugin": "^5.49.0",
91+
"@typescript-eslint/parser": "^5.49.0",
92+
"babel-jest": "^29.4.1",
93+
"eslint": "^8.32.0",
9794
"eslint-config-react-app": "^7.0.1",
98-
"eslint-plugin-jest-dom": "^4.0.2",
95+
"eslint-plugin-jest-dom": "^4.0.3",
9996
"eslint-plugin-react-hooks": "^4.6.0",
100-
"eslint-plugin-testing-library": "^5.9.1",
101-
"husky": "^8.0.1",
97+
"eslint-plugin-testing-library": "^5.10.0",
98+
"husky": "^8.0.3",
10299
"jest": "^27.5.1",
103-
"pnpm": "^7.14.1",
100+
"pnpm": "^7.26.1",
104101
"postinstall-postinstall": "^2.1.0",
105-
"prettier": "^2.7.1",
102+
"prettier": "^2.8.3",
106103
"pretty-quick": "^3.1.3",
107104
"react": "^18.2.0",
108105
"react-dom": "^18.2.0",
109106
"size-limit": "^7.0.8",
110-
"tsd": "^0.24.1",
111-
"typescript": "^4.8.4"
107+
"tsd": "^0.25.0",
108+
"typescript": "^4.9.4"
112109
}
113110
}

‎packages/core/src/config/dragConfigResolver.ts

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const DEFAULT_DRAG_DELAY = 180
99
export const DEFAULT_SWIPE_VELOCITY = 0.5
1010
export const DEFAULT_SWIPE_DISTANCE = 50
1111
export const DEFAULT_SWIPE_DURATION = 250
12+
export const DEFAULT_KEYBOARD_DISPLACEMENT = 10
1213

1314
const DEFAULT_DRAG_AXIS_THRESHOLD: Record<PointerType, number> = { mouse: 0, touch: 0, pen: 8 }
1415

@@ -82,6 +83,9 @@ export const dragConfigResolver = {
8283
axisThreshold(value: Record<PointerType, number>) {
8384
if (!value) return DEFAULT_DRAG_AXIS_THRESHOLD
8485
return { ...DEFAULT_DRAG_AXIS_THRESHOLD, ...value }
86+
},
87+
keyboardDisplacement(value: number = DEFAULT_KEYBOARD_DISPLACEMENT) {
88+
return value
8589
}
8690
}
8791

‎packages/core/src/engines/DragEngine.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@ import { pointerId, getPointerType, pointerValues } from '../utils/events'
44
import { V } from '../utils/maths'
55
import { Vector2 } from '../types'
66

7-
const DISPLACEMENT = 10
8-
97
const KEYS_DELTA_MAP = {
10-
ArrowRight: (factor = 1) => [DISPLACEMENT * factor, 0],
11-
ArrowLeft: (factor = 1) => [-DISPLACEMENT * factor, 0],
12-
ArrowUp: (factor = 1) => [0, -DISPLACEMENT * factor],
13-
ArrowDown: (factor = 1) => [0, DISPLACEMENT * factor]
8+
ArrowRight: (displacement: number, factor: number = 1) => [displacement * factor, 0],
9+
ArrowLeft: (displacement: number, factor: number = 1) => [-1 * displacement * factor, 0],
10+
ArrowUp: (displacement: number, factor: number = 1) => [0, -1 * displacement * factor],
11+
ArrowDown: (displacement: number, factor: number = 1) => [0, displacement * factor]
1412
}
1513

1614
export class DragEngine extends CoordinatesEngine<'drag'> {
@@ -341,7 +339,7 @@ export class DragEngine extends CoordinatesEngine<'drag'> {
341339

342340
this.start(event)
343341

344-
state._delta = deltaFn(factor)
342+
state._delta = deltaFn(this.config.keyboardDisplacement, factor)
345343
state._keyboardActive = true
346344
V.addTo(state._movement, state._delta)
347345

‎packages/core/src/engines/Engine.ts

+1
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ export abstract class Engine<Key extends GestureKey> {
303303

304304
if (event) {
305305
if (state.first) {
306+
// @ts-expect-error (4.9 regression https://github.com/microsoft/TypeScript/issues/51501)
306307
if ('bounds' in config) state._bounds = call(config.bounds, state)
307308
if (this.setup) this.setup()
308309
}

‎packages/core/src/types/config.ts

+4
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ export type DragConfig = Omit<CoordinatesConfig<'drag'>, 'axisThreshold' | 'boun
227227
* be calculated.
228228
*/
229229
axisThreshold?: Partial<Record<PointerType, number>>
230+
/**
231+
* The distance (in pixels) emulated by arrow keys.
232+
*/
233+
keyboardDisplacement?: number
230234
}
231235

232236
export type UserDragConfig = GenericOptions & DragConfig

‎packages/core/src/types/internalConfig.ts

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export type InternalDragOptions = Omit<InternalCoordinatesOptions<'drag'>, 'axis
4646
}
4747
delay: number
4848
axisThreshold: Record<PointerType, number>
49+
keyboardDisplacement: number
4950
}
5051

5152
export type InternalPinchOptions = InternalGestureOptions<'pinch'> & {

0 commit comments

Comments
 (0)
Please sign in to comment.