-
Notifications
You must be signed in to change notification settings - Fork 240
/
control.ts
57 lines (53 loc) 路 1.54 KB
/
control.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**
* This file should contain behavior for arrow keys as described here:
* https://w3c.github.io/uievents-code/#key-controlpad-section
*/
import {behaviorPlugin} from '../types'
import {
calculateNewValue,
getValue,
isContentEditable,
isCursorAtEnd,
isEditable,
isElementType,
setSelectionRange,
} from '../../utils'
import {carryValue, fireInputEvent} from '../shared'
export const keydownBehavior: behaviorPlugin[] = [
{
matches: (keyDef, element) =>
(keyDef.key === 'Home' || keyDef.key === 'End') &&
(isElementType(element, ['input', 'textarea']) ||
isContentEditable(element)),
handle: (keyDef, element) => {
// This could probably been improved by collapsing a selection range
if (keyDef.key === 'Home') {
setSelectionRange(element, 0, 0)
} else {
const newPos = getValue(element)?.length ?? /* istanbul ignore next */ 0
setSelectionRange(element, newPos, newPos)
}
},
},
{
matches: (keyDef, element) =>
keyDef.key === 'Delete' && isEditable(element) && !isCursorAtEnd(element),
handle: (keDef, element, options, state) => {
const {newValue, newSelectionStart} = calculateNewValue(
'',
element as HTMLElement,
state.carryValue,
undefined,
'forward',
)
fireInputEvent(element as HTMLElement, {
newValue,
newSelectionStart,
eventOverrides: {
inputType: 'deleteContentForward',
},
})
carryValue(element, state, newValue)
},
},
]