@react-md/core 6.2.1 → 6.3.1
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/_base.scss +1 -1
- package/dist/app-bar/styles.d.ts +0 -2
- package/dist/app-bar/styles.js.map +1 -1
- package/dist/autocomplete/types.d.ts +12 -0
- package/dist/autocomplete/types.js.map +1 -1
- package/dist/avatar/Avatar.d.ts +0 -10
- package/dist/avatar/Avatar.js.map +1 -1
- package/dist/avatar/styles.d.ts +10 -0
- package/dist/avatar/styles.js.map +1 -1
- package/dist/badge/Badge.d.ts +11 -0
- package/dist/badge/Badge.js.map +1 -1
- package/dist/badge/styles.d.ts +0 -8
- package/dist/badge/styles.js.map +1 -1
- package/dist/box/_box.scss +8 -8
- package/dist/box/styles.d.ts +9 -0
- package/dist/box/styles.js.map +1 -1
- package/dist/button/_button.scss +4 -0
- package/dist/button/styles.d.ts +5 -1
- package/dist/button/styles.js.map +1 -1
- package/dist/card/Card.d.ts +0 -7
- package/dist/card/Card.js.map +1 -1
- package/dist/card/styles.d.ts +6 -0
- package/dist/card/styles.js +8 -8
- package/dist/card/styles.js.map +1 -1
- package/dist/chip/Chip.d.ts +6 -13
- package/dist/chip/Chip.js.map +1 -1
- package/dist/chip/styles.d.ts +26 -1
- package/dist/chip/styles.js.map +1 -1
- package/dist/datetime/NativeDateField.d.ts +24 -0
- package/dist/datetime/NativeDateField.js +63 -0
- package/dist/datetime/NativeDateField.js.map +1 -0
- package/dist/datetime/NativeTimeField.d.ts +26 -0
- package/dist/datetime/NativeTimeField.js +63 -0
- package/dist/datetime/NativeTimeField.js.map +1 -0
- package/dist/datetime/useDateField.d.ts +120 -0
- package/dist/datetime/useDateField.js +35 -0
- package/dist/datetime/useDateField.js.map +1 -0
- package/dist/datetime/useTimeField.d.ts +124 -0
- package/dist/datetime/useTimeField.js +65 -0
- package/dist/datetime/useTimeField.js.map +1 -0
- package/dist/datetime/utils.d.ts +34 -0
- package/dist/datetime/utils.js +27 -0
- package/dist/datetime/utils.js.map +1 -0
- package/dist/dialog/styles.d.ts +5 -2
- package/dist/dialog/styles.js.map +1 -1
- package/dist/divider/styles.d.ts +1 -1
- package/dist/divider/styles.js.map +1 -1
- package/dist/draggable/utils.d.ts +3 -6
- package/dist/draggable/utils.js.map +1 -1
- package/dist/error-boundary/ErrorBoundary.js.map +1 -1
- package/dist/expansion-panel/ExpansionList.js +1 -1
- package/dist/expansion-panel/ExpansionList.js.map +1 -1
- package/dist/expansion-panel/useExpansionList.d.ts +2 -7
- package/dist/expansion-panel/useExpansionList.js.map +1 -1
- package/dist/files/validation.js.map +1 -1
- package/dist/form/FormMessage.js +3 -1
- package/dist/form/FormMessage.js.map +1 -1
- package/dist/form/FormMessageContainer.d.ts +2 -1
- package/dist/form/FormMessageContainer.js +3 -2
- package/dist/form/FormMessageContainer.js.map +1 -1
- package/dist/form/FormMessageCounter.d.ts +3 -2
- package/dist/form/FormMessageCounter.js +5 -2
- package/dist/form/FormMessageCounter.js.map +1 -1
- package/dist/form/InputToggle.js.map +1 -1
- package/dist/form/Label.d.ts +0 -10
- package/dist/form/Label.js.map +1 -1
- package/dist/form/Listbox.d.ts +3 -10
- package/dist/form/Listbox.js +8 -27
- package/dist/form/Listbox.js.map +1 -1
- package/dist/form/ListboxProvider.d.ts +17 -0
- package/dist/form/ListboxProvider.js +33 -1
- package/dist/form/ListboxProvider.js.map +1 -1
- package/dist/form/NativeSelect.js +1 -0
- package/dist/form/NativeSelect.js.map +1 -1
- package/dist/form/Slider.d.ts +4 -0
- package/dist/form/Slider.js.map +1 -1
- package/dist/form/Switch.js.map +1 -1
- package/dist/form/TextArea.js +1 -0
- package/dist/form/TextArea.js.map +1 -1
- package/dist/form/TextField.js +1 -0
- package/dist/form/TextField.js.map +1 -1
- package/dist/form/TextFieldContainer.d.ts +0 -13
- package/dist/form/TextFieldContainer.js.map +1 -1
- package/dist/form/_form-message.scss +13 -0
- package/dist/form/_select.scss +5 -1
- package/dist/form/_text-area.scss +2 -1
- package/dist/form/_text-field.scss +13 -3
- package/dist/form/formMessageContainerStyles.d.ts +7 -0
- package/dist/form/formMessageContainerStyles.js +4 -2
- package/dist/form/formMessageContainerStyles.js.map +1 -1
- package/dist/form/sliderUtils.d.ts +3 -7
- package/dist/form/sliderUtils.js.map +1 -1
- package/dist/form/types.d.ts +33 -0
- package/dist/form/types.js.map +1 -1
- package/dist/form/useCombobox.d.ts +6 -2
- package/dist/form/useCombobox.js +8 -9
- package/dist/form/useCombobox.js.map +1 -1
- package/dist/form/useFormReset.d.ts +4 -1
- package/dist/form/useFormReset.js +9 -4
- package/dist/form/useFormReset.js.map +1 -1
- package/dist/form/useNumberField.d.ts +5 -5
- package/dist/form/useNumberField.js +10 -2
- package/dist/form/useNumberField.js.map +1 -1
- package/dist/form/useSelectCombobox.js +2 -2
- package/dist/form/useSelectCombobox.js.map +1 -1
- package/dist/form/useTextField.d.ts +76 -59
- package/dist/form/useTextField.js +7 -1
- package/dist/form/useTextField.js.map +1 -1
- package/dist/interaction/types.d.ts +5 -1
- package/dist/interaction/types.js.map +1 -1
- package/dist/interaction/utils.d.ts +14 -0
- package/dist/interaction/utils.js +23 -12
- package/dist/interaction/utils.js.map +1 -1
- package/dist/link/Link.d.ts +0 -7
- package/dist/link/Link.js.map +1 -1
- package/dist/link/styles.d.ts +7 -0
- package/dist/link/styles.js.map +1 -1
- package/dist/list/List.d.ts +5 -20
- package/dist/list/List.js.map +1 -1
- package/dist/list/ListItem.d.ts +4 -38
- package/dist/list/ListItem.js.map +1 -1
- package/dist/list/listItemStyles.d.ts +24 -2
- package/dist/list/listItemStyles.js.map +1 -1
- package/dist/list/listStyles.d.ts +17 -2
- package/dist/list/listStyles.js.map +1 -1
- package/dist/menu/Menu.js.map +1 -1
- package/dist/menu/MenuBar.js +1 -1
- package/dist/menu/MenuBar.js.map +1 -1
- package/dist/menu/MenuItemTextField.d.ts +1 -2
- package/dist/menu/MenuItemTextField.js.map +1 -1
- package/dist/menu/MenuWidget.js +3 -2
- package/dist/menu/MenuWidget.js.map +1 -1
- package/dist/movement/constants.d.ts +10 -0
- package/dist/movement/constants.js +20 -4
- package/dist/movement/constants.js.map +1 -1
- package/dist/movement/types.d.ts +59 -10
- package/dist/movement/types.js.map +1 -1
- package/dist/movement/useKeyboardMovementProvider.d.ts +5 -1
- package/dist/movement/useKeyboardMovementProvider.js +171 -73
- package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
- package/dist/navigation/NavItem.d.ts +4 -1
- package/dist/navigation/NavItem.js.map +1 -1
- package/dist/navigation/navItemStyles.d.ts +7 -0
- package/dist/navigation/navItemStyles.js.map +1 -1
- package/dist/overlay/Overlay.d.ts +4 -23
- package/dist/overlay/Overlay.js.map +1 -1
- package/dist/overlay/styles.d.ts +26 -8
- package/dist/overlay/styles.js.map +1 -1
- package/dist/progress/LinearProgress.d.ts +4 -9
- package/dist/progress/LinearProgress.js.map +1 -1
- package/dist/progress/circularProgressStyles.d.ts +6 -0
- package/dist/progress/circularProgressStyles.js.map +1 -1
- package/dist/progress/linearProgressStyles.d.ts +20 -5
- package/dist/progress/linearProgressStyles.js.map +1 -1
- package/dist/progress/types.d.ts +0 -9
- package/dist/progress/types.js.map +1 -1
- package/dist/segmented-button/SegmentedButton.d.ts +7 -12
- package/dist/segmented-button/SegmentedButton.js.map +1 -1
- package/dist/segmented-button/segmentedButtonStyles.d.ts +26 -3
- package/dist/segmented-button/segmentedButtonStyles.js.map +1 -1
- package/dist/sheet/Sheet.d.ts +0 -12
- package/dist/sheet/Sheet.js.map +1 -1
- package/dist/sheet/styles.d.ts +12 -0
- package/dist/sheet/styles.js.map +1 -1
- package/dist/snackbar/Toast.d.ts +2 -13
- package/dist/snackbar/Toast.js.map +1 -1
- package/dist/snackbar/ToastManager.js.map +1 -1
- package/dist/snackbar/toastStyles.d.ts +17 -2
- package/dist/snackbar/toastStyles.js.map +1 -1
- package/dist/tabs/Tab.d.ts +2 -41
- package/dist/tabs/Tab.js.map +1 -1
- package/dist/tabs/tabStyles.d.ts +45 -4
- package/dist/tabs/tabStyles.js.map +1 -1
- package/dist/tabs/useTabList.js +1 -1
- package/dist/tabs/useTabList.js.map +1 -1
- package/dist/test-utils/drag.d.ts +6 -9
- package/dist/test-utils/mocks/IntersectionObserver.js.map +1 -1
- package/dist/test-utils/mocks/ResizeObserver.js.map +1 -1
- package/dist/test-utils/utils/createFileList.js.map +1 -1
- package/dist/theme/_theme.scss +0 -1
- package/dist/theme/getDerivedTheme.d.ts +0 -24
- package/dist/theme/getDerivedTheme.js.map +1 -1
- package/dist/theme/types.d.ts +25 -0
- package/dist/theme/types.js.map +1 -1
- package/dist/tooltip/Tooltip.d.ts +4 -32
- package/dist/tooltip/Tooltip.js.map +1 -1
- package/dist/tooltip/styles.d.ts +38 -1
- package/dist/tooltip/styles.js +1 -1
- package/dist/tooltip/styles.js.map +1 -1
- package/dist/transition/SkeletonPlaceholder.d.ts +0 -7
- package/dist/transition/SkeletonPlaceholder.js.map +1 -1
- package/dist/transition/Slide.js.map +1 -1
- package/dist/transition/skeletonPlaceholderUtils.d.ts +7 -0
- package/dist/transition/skeletonPlaceholderUtils.js.map +1 -1
- package/dist/transition/useCarousel.d.ts +2 -2
- package/dist/transition/useCarousel.js.map +1 -1
- package/dist/transition/useMaxWidthTransition.d.ts +14 -2
- package/dist/transition/useMaxWidthTransition.js.map +1 -1
- package/dist/transition/useSlideTransition.d.ts +5 -0
- package/dist/transition/useSlideTransition.js.map +1 -1
- package/dist/tree/Tree.d.ts +5 -9
- package/dist/tree/Tree.js +1 -1
- package/dist/tree/Tree.js.map +1 -1
- package/dist/tree/styles.d.ts +9 -1
- package/dist/tree/styles.js.map +1 -1
- package/dist/tree/useTreeMovement.d.ts +2 -1
- package/dist/tree/useTreeMovement.js +2 -1
- package/dist/tree/useTreeMovement.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.js.map +1 -1
- package/dist/typography/Mark.d.ts +4 -1
- package/dist/typography/Mark.js.map +1 -1
- package/dist/typography/TextContainer.d.ts +0 -6
- package/dist/typography/TextContainer.js.map +1 -1
- package/dist/typography/markStyles.d.ts +5 -0
- package/dist/typography/markStyles.js.map +1 -1
- package/dist/typography/textContainerStyles.d.ts +6 -0
- package/dist/typography/textContainerStyles.js.map +1 -1
- package/dist/typography/typographyStyles.d.ts +9 -0
- package/dist/typography/typographyStyles.js.map +1 -1
- package/dist/useResizeObserver.js.map +1 -1
- package/dist/utils/getMiddleOfRange.d.ts +2 -3
- package/dist/utils/getMiddleOfRange.js.map +1 -1
- package/dist/utils/getPercentage.d.ts +2 -9
- package/dist/utils/getPercentage.js +1 -1
- package/dist/utils/getPercentage.js.map +1 -1
- package/dist/utils/getRangeSteps.d.ts +2 -3
- package/dist/utils/getRangeSteps.js +0 -3
- package/dist/utils/getRangeSteps.js.map +1 -1
- package/dist/utils/nearest.d.ts +2 -3
- package/dist/utils/nearest.js +0 -3
- package/dist/utils/nearest.js.map +1 -1
- package/dist/utils/trigonometry.d.ts +31 -0
- package/dist/utils/trigonometry.js +25 -0
- package/dist/utils/trigonometry.js.map +1 -0
- package/dist/window-splitter/WindowSplitter.d.ts +5 -19
- package/dist/window-splitter/WindowSplitter.js.map +1 -1
- package/dist/window-splitter/styles.d.ts +27 -3
- package/dist/window-splitter/styles.js.map +1 -1
- package/dist/window-splitter/useWindowSplitter.d.ts +1 -1
- package/dist/window-splitter/useWindowSplitter.js.map +1 -1
- package/package.json +8 -8
- package/src/app-bar/styles.ts +0 -2
- package/src/autocomplete/types.ts +17 -0
- package/src/avatar/Avatar.tsx +0 -11
- package/src/avatar/styles.ts +11 -0
- package/src/badge/Badge.tsx +12 -0
- package/src/badge/styles.ts +0 -9
- package/src/box/styles.ts +9 -0
- package/src/button/styles.ts +5 -1
- package/src/card/Card.tsx +0 -8
- package/src/card/styles.ts +15 -8
- package/src/chip/Chip.tsx +9 -15
- package/src/chip/styles.ts +29 -1
- package/src/datetime/NativeDateField.tsx +92 -0
- package/src/datetime/NativeTimeField.tsx +94 -0
- package/src/datetime/useDateField.ts +193 -0
- package/src/datetime/useTimeField.ts +233 -0
- package/src/datetime/utils.ts +48 -0
- package/src/dialog/styles.ts +5 -2
- package/src/divider/styles.ts +1 -1
- package/src/draggable/utils.ts +3 -6
- package/src/expansion-panel/ExpansionList.tsx +2 -1
- package/src/expansion-panel/useExpansionList.ts +6 -12
- package/src/form/FormMessage.tsx +4 -0
- package/src/form/FormMessageContainer.tsx +8 -4
- package/src/form/FormMessageCounter.tsx +17 -6
- package/src/form/InputToggle.tsx +2 -0
- package/src/form/Label.tsx +0 -11
- package/src/form/Listbox.tsx +18 -46
- package/src/form/ListboxProvider.ts +61 -1
- package/src/form/NativeSelect.tsx +1 -0
- package/src/form/Slider.tsx +6 -0
- package/src/form/Switch.tsx +2 -0
- package/src/form/TextArea.tsx +3 -0
- package/src/form/TextField.tsx +1 -0
- package/src/form/TextFieldContainer.tsx +0 -14
- package/src/form/formMessageContainerStyles.ts +10 -2
- package/src/form/sliderUtils.ts +3 -7
- package/src/form/types.ts +44 -0
- package/src/form/useCombobox.ts +15 -10
- package/src/form/useFormReset.ts +12 -5
- package/src/form/useNumberField.ts +17 -14
- package/src/form/useSelectCombobox.ts +2 -2
- package/src/form/useTextField.ts +102 -69
- package/src/interaction/types.ts +5 -1
- package/src/interaction/utils.ts +18 -20
- package/src/link/Link.tsx +0 -8
- package/src/link/styles.ts +8 -0
- package/src/list/List.tsx +7 -24
- package/src/list/ListItem.tsx +7 -43
- package/src/list/listItemStyles.ts +26 -2
- package/src/list/listStyles.ts +18 -2
- package/src/menu/Menu.tsx +2 -0
- package/src/menu/MenuBar.tsx +1 -1
- package/src/menu/MenuItemTextField.tsx +1 -3
- package/src/menu/MenuWidget.tsx +4 -2
- package/src/movement/constants.ts +26 -4
- package/src/movement/types.ts +84 -19
- package/src/movement/useKeyboardMovementProvider.ts +209 -95
- package/src/navigation/NavItem.tsx +6 -2
- package/src/navigation/navItemStyles.ts +8 -0
- package/src/overlay/Overlay.tsx +4 -26
- package/src/overlay/styles.ts +29 -10
- package/src/progress/LinearProgress.tsx +8 -10
- package/src/progress/circularProgressStyles.ts +7 -0
- package/src/progress/linearProgressStyles.ts +22 -5
- package/src/progress/types.ts +0 -10
- package/src/segmented-button/SegmentedButton.tsx +14 -15
- package/src/segmented-button/segmentedButtonStyles.ts +28 -3
- package/src/sheet/Sheet.tsx +0 -13
- package/src/sheet/styles.ts +13 -0
- package/src/snackbar/Toast.tsx +2 -15
- package/src/snackbar/toastStyles.ts +20 -2
- package/src/tabs/Tab.tsx +4 -49
- package/src/tabs/tabStyles.ts +52 -4
- package/src/tabs/useTabList.ts +1 -1
- package/src/test-utils/drag.ts +8 -12
- package/src/theme/getDerivedTheme.ts +0 -26
- package/src/theme/types.ts +26 -0
- package/src/tooltip/Tooltip.tsx +4 -36
- package/src/tooltip/styles.ts +43 -2
- package/src/transition/SkeletonPlaceholder.tsx +0 -8
- package/src/transition/Slide.tsx +2 -0
- package/src/transition/skeletonPlaceholderUtils.ts +8 -0
- package/src/transition/useCarousel.ts +2 -2
- package/src/transition/useMaxWidthTransition.ts +17 -2
- package/src/transition/useSlideTransition.ts +8 -0
- package/src/tree/Tree.tsx +6 -11
- package/src/tree/styles.ts +10 -1
- package/src/tree/useTreeMovement.ts +4 -0
- package/src/types.ts +16 -0
- package/src/typography/Mark.tsx +6 -2
- package/src/typography/TextContainer.tsx +0 -7
- package/src/typography/markStyles.ts +6 -0
- package/src/typography/textContainerStyles.ts +7 -0
- package/src/typography/typographyStyles.ts +10 -0
- package/src/utils/getMiddleOfRange.ts +2 -3
- package/src/utils/getPercentage.ts +3 -11
- package/src/utils/getRangeSteps.ts +3 -3
- package/src/utils/nearest.ts +3 -3
- package/src/utils/trigonometry.ts +46 -0
- package/src/window-splitter/WindowSplitter.tsx +9 -22
- package/src/window-splitter/styles.ts +31 -3
- package/src/window-splitter/useWindowSplitter.ts +3 -2
|
@@ -18,15 +18,23 @@
|
|
|
18
18
|
]
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
|
-
* @since
|
|
21
|
+
* @since 6.3.0
|
|
22
22
|
* @internal
|
|
23
|
-
*/ export const
|
|
23
|
+
*/ export const DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP = {
|
|
24
24
|
incrementKeys: [
|
|
25
25
|
"ArrowRight"
|
|
26
26
|
],
|
|
27
27
|
decrementKeys: [
|
|
28
28
|
"ArrowLeft"
|
|
29
29
|
],
|
|
30
|
+
jumpToFirstKeys: [],
|
|
31
|
+
jumpToLastKeys: []
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* @since 5.1.2
|
|
35
|
+
* @internal
|
|
36
|
+
*/ export const DEFAULT_LTR_KEYBOARD_MOVEMENT = {
|
|
37
|
+
...DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP,
|
|
30
38
|
jumpToFirstKeys: [
|
|
31
39
|
"Home"
|
|
32
40
|
],
|
|
@@ -35,15 +43,23 @@
|
|
|
35
43
|
]
|
|
36
44
|
};
|
|
37
45
|
/**
|
|
38
|
-
* @since
|
|
46
|
+
* @since 6.3.0
|
|
39
47
|
* @internal
|
|
40
|
-
*/ export const
|
|
48
|
+
*/ export const DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP = {
|
|
41
49
|
incrementKeys: [
|
|
42
50
|
"ArrowLeft"
|
|
43
51
|
],
|
|
44
52
|
decrementKeys: [
|
|
45
53
|
"ArrowRight"
|
|
46
54
|
],
|
|
55
|
+
jumpToFirstKeys: [],
|
|
56
|
+
jumpToLastKeys: []
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* @since 5.1.2
|
|
60
|
+
* @internal
|
|
61
|
+
*/ export const DEFAULT_RTL_KEYBOARD_MOVEMENT = {
|
|
62
|
+
...DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP,
|
|
47
63
|
jumpToFirstKeys: [
|
|
48
64
|
"Home"
|
|
49
65
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/movement/constants.ts"],"sourcesContent":["import type { KeyboardMovementConfig } from \"./types.js\";\n\n/**\n * Most custom keyboard functionality use these keys.\n *\n * @since 5.0.0\n * @internal\n */\nexport const DEFAULT_KEYBOARD_MOVEMENT: Readonly<KeyboardMovementConfig> = {\n incrementKeys: [\"ArrowDown\"],\n decrementKeys: [\"ArrowUp\"],\n jumpToFirstKeys: [\"Home\"],\n jumpToLastKeys: [\"End\"],\n};\n\n/**\n * @since
|
|
1
|
+
{"version":3,"sources":["../../src/movement/constants.ts"],"sourcesContent":["import type { KeyboardMovementConfig } from \"./types.js\";\n\n/**\n * Most custom keyboard functionality use these keys.\n *\n * @since 5.0.0\n * @internal\n */\nexport const DEFAULT_KEYBOARD_MOVEMENT: Readonly<KeyboardMovementConfig> = {\n incrementKeys: [\"ArrowDown\"],\n decrementKeys: [\"ArrowUp\"],\n jumpToFirstKeys: [\"Home\"],\n jumpToLastKeys: [\"End\"],\n};\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport const DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP: Readonly<KeyboardMovementConfig> =\n {\n incrementKeys: [\"ArrowRight\"],\n decrementKeys: [\"ArrowLeft\"],\n jumpToFirstKeys: [],\n jumpToLastKeys: [],\n };\n\n/**\n * @since 5.1.2\n * @internal\n */\nexport const DEFAULT_LTR_KEYBOARD_MOVEMENT: Readonly<KeyboardMovementConfig> = {\n ...DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP,\n jumpToFirstKeys: [\"Home\"],\n jumpToLastKeys: [\"End\"],\n};\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport const DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP: Readonly<KeyboardMovementConfig> =\n {\n incrementKeys: [\"ArrowLeft\"],\n decrementKeys: [\"ArrowRight\"],\n jumpToFirstKeys: [],\n jumpToLastKeys: [],\n };\n\n/**\n * @since 5.1.2\n * @internal\n */\nexport const DEFAULT_RTL_KEYBOARD_MOVEMENT: Readonly<KeyboardMovementConfig> = {\n ...DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP,\n jumpToFirstKeys: [\"Home\"],\n jumpToLastKeys: [\"End\"],\n};\n"],"names":["DEFAULT_KEYBOARD_MOVEMENT","incrementKeys","decrementKeys","jumpToFirstKeys","jumpToLastKeys","DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP","DEFAULT_LTR_KEYBOARD_MOVEMENT","DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP","DEFAULT_RTL_KEYBOARD_MOVEMENT"],"mappings":"AAEA;;;;;CAKC,GACD,OAAO,MAAMA,4BAA8D;IACzEC,eAAe;QAAC;KAAY;IAC5BC,eAAe;QAAC;KAAU;IAC1BC,iBAAiB;QAAC;KAAO;IACzBC,gBAAgB;QAAC;KAAM;AACzB,EAAE;AAEF;;;CAGC,GACD,OAAO,MAAMC,6CACX;IACEJ,eAAe;QAAC;KAAa;IAC7BC,eAAe;QAAC;KAAY;IAC5BC,iBAAiB,EAAE;IACnBC,gBAAgB,EAAE;AACpB,EAAE;AAEJ;;;CAGC,GACD,OAAO,MAAME,gCAAkE;IAC7E,GAAGD,0CAA0C;IAC7CF,iBAAiB;QAAC;KAAO;IACzBC,gBAAgB;QAAC;KAAM;AACzB,EAAE;AAEF;;;CAGC,GACD,OAAO,MAAMG,6CACX;IACEN,eAAe;QAAC;KAAY;IAC5BC,eAAe;QAAC;KAAa;IAC7BC,iBAAiB,EAAE;IACnBC,gBAAgB,EAAE;AACpB,EAAE;AAEJ;;;CAGC,GACD,OAAO,MAAMI,gCAAkE;IAC7E,GAAGD,0CAA0C;IAC7CJ,iBAAiB;QAAC;KAAO;IACzBC,gBAAgB;QAAC;KAAM;AACzB,EAAE"}
|
package/dist/movement/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type
|
|
1
|
+
import { type HTMLAttributes, type KeyboardEvent, type Ref, type RefCallback, type RefObject } from "react";
|
|
2
|
+
import { type NonNullMutableRef, type NonNullRef, type UseStateSetter } from "../types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Set this to `"roving"` when:
|
|
5
5
|
* - there are a group of focusable elements that have a `tabIndex={-1}`
|
|
@@ -109,6 +109,20 @@ export interface KeyboardMovementBehavior {
|
|
|
109
109
|
*/
|
|
110
110
|
horizontal?: boolean;
|
|
111
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* @since 6.3.0
|
|
114
|
+
*/
|
|
115
|
+
export interface KeyboardFocusFromKeyOptions {
|
|
116
|
+
key: string;
|
|
117
|
+
/** @defaultValue `false` */
|
|
118
|
+
reversed?: boolean;
|
|
119
|
+
/** @defaultValue `getFocusableElementsFromRef()` */
|
|
120
|
+
focusables?: readonly HTMLElement[];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* @since 6.3.0
|
|
124
|
+
*/
|
|
125
|
+
export type KeyboardFocusAction = (focusables?: readonly HTMLElement[]) => void;
|
|
112
126
|
/**
|
|
113
127
|
* @since 5.0.0
|
|
114
128
|
* @since 6.0.0 Removed `attach`, `detach` and `watching`
|
|
@@ -124,6 +138,26 @@ export interface KeyboardMovementContext extends Required<KeyboardMovementBehavi
|
|
|
124
138
|
* has been set to `"roving"` or `"virtual"`.
|
|
125
139
|
*/
|
|
126
140
|
activeDescendantId: string;
|
|
141
|
+
/**
|
|
142
|
+
* @since 6.3.0
|
|
143
|
+
*/
|
|
144
|
+
focusFirst: KeyboardFocusAction;
|
|
145
|
+
/**
|
|
146
|
+
* @since 6.3.0
|
|
147
|
+
*/
|
|
148
|
+
focusLast: KeyboardFocusAction;
|
|
149
|
+
/**
|
|
150
|
+
* @since 6.3.0
|
|
151
|
+
*/
|
|
152
|
+
focusNext: KeyboardFocusAction;
|
|
153
|
+
/**
|
|
154
|
+
* @since 6.3.0
|
|
155
|
+
*/
|
|
156
|
+
focusPrevious: KeyboardFocusAction;
|
|
157
|
+
/**
|
|
158
|
+
* @since 6.3.0
|
|
159
|
+
*/
|
|
160
|
+
focusFromKey: (options: KeyboardFocusFromKeyOptions) => void;
|
|
127
161
|
}
|
|
128
162
|
/**
|
|
129
163
|
* @since 6.0.0
|
|
@@ -166,16 +200,23 @@ export interface KeyboardMovementExtensionData<E extends HTMLElement> extends Ke
|
|
|
166
200
|
setFocusIndex: (index: number, focusables: readonly HTMLElement[]) => void;
|
|
167
201
|
setActiveDescendantId: (id: string) => void;
|
|
168
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* @since 6.3.0
|
|
205
|
+
*/
|
|
206
|
+
export type KeyboardMovementEventHandlers<E extends HTMLElement> = Pick<HTMLAttributes<E>, "onClick" | "onFocus" | "onKeyDown">;
|
|
207
|
+
/**
|
|
208
|
+
* @since 6.3.0
|
|
209
|
+
*/
|
|
210
|
+
export interface SimpleKeyboardMovementWrapperOptions<E extends HTMLElement> extends KeyboardMovementEventHandlers<E> {
|
|
211
|
+
ref?: Ref<E>;
|
|
212
|
+
}
|
|
169
213
|
/**
|
|
170
214
|
* @since 6.0.0
|
|
171
215
|
* @internal
|
|
172
216
|
*/
|
|
173
|
-
export interface KeyboardMovementProviderOptions<E extends HTMLElement> extends KeyboardMovementBehavior, KeyboardMovementConfiguration {
|
|
217
|
+
export interface KeyboardMovementProviderOptions<E extends HTMLElement> extends KeyboardMovementBehavior, SimpleKeyboardMovementWrapperOptions<E>, KeyboardMovementConfiguration {
|
|
174
218
|
/** @see {@link TabIndexBehavior} */
|
|
175
219
|
tabIndexBehavior?: TabIndexBehavior;
|
|
176
|
-
onClick?: (event: MouseEvent<E>) => void;
|
|
177
|
-
onFocus?: (event: FocusEvent<E>) => void;
|
|
178
|
-
onKeyDown?: (event: KeyboardEvent<E>) => void;
|
|
179
220
|
/** @defaultValue `false` */
|
|
180
221
|
disabled?: boolean;
|
|
181
222
|
/**
|
|
@@ -210,12 +251,21 @@ export interface KeyboardMovementProviderOptions<E extends HTMLElement> extends
|
|
|
210
251
|
* @defaultValue `false`
|
|
211
252
|
*/
|
|
212
253
|
isNegativeOneAllowed?: boolean;
|
|
254
|
+
/**
|
|
255
|
+
* This was added to support spinbutton groups so the user can either use the
|
|
256
|
+
* ArrowLeft, ArrowRight, or Tab keys to move. Without this, switching
|
|
257
|
+
* between tab and the arrow keys would have the wrong tab index.
|
|
258
|
+
*
|
|
259
|
+
* @since 6.3.0
|
|
260
|
+
* @defaultValue `false`
|
|
261
|
+
*/
|
|
262
|
+
trackTabKeys?: boolean;
|
|
213
263
|
}
|
|
214
264
|
/**
|
|
215
265
|
* @since 6.0.0
|
|
216
266
|
* @internal
|
|
217
267
|
*/
|
|
218
|
-
export interface KeyboardMovementProps<E extends HTMLElement> {
|
|
268
|
+
export interface KeyboardMovementProps<E extends HTMLElement> extends Required<KeyboardMovementEventHandlers<E>> {
|
|
219
269
|
/**
|
|
220
270
|
* This will only be provided if the {@link KeyboardMovementContext.tabIndexBehavior}
|
|
221
271
|
* is set to `"virtual"`.
|
|
@@ -231,15 +281,14 @@ export interface KeyboardMovementProps<E extends HTMLElement> {
|
|
|
231
281
|
* - a child element **should** have a `tabIndex={0}` instead
|
|
232
282
|
*/
|
|
233
283
|
tabIndex?: number;
|
|
234
|
-
|
|
235
|
-
onFocus: FocusEventHandler<E>;
|
|
236
|
-
onKeyDown: KeyboardEventHandler<E>;
|
|
284
|
+
ref: RefCallback<E>;
|
|
237
285
|
}
|
|
238
286
|
/**
|
|
239
287
|
* @since 6.0.0
|
|
240
288
|
* @internal
|
|
241
289
|
*/
|
|
242
290
|
export interface KeyboardMovementProviderImplementation<E extends HTMLElement> {
|
|
291
|
+
nodeRef: RefObject<E>;
|
|
243
292
|
movementProps: Readonly<KeyboardMovementProps<E>>;
|
|
244
293
|
movementContext: Readonly<KeyboardMovementContext>;
|
|
245
294
|
currentFocusIndex: NonNullMutableRef<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/movement/types.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/movement/types.ts"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type Ref,\n type RefCallback,\n type RefObject,\n} from \"react\";\n\nimport {\n type NonNullMutableRef,\n type NonNullRef,\n type UseStateSetter,\n} from \"../types.js\";\n\n/**\n * Set this to `\"roving\"` when:\n * - there are a group of focusable elements that have a `tabIndex={-1}`\n * - the container element defaults to having a `tabIndex={0}`\n * - if the container is focused, it should no longer be included in the normal\n * tab flow. Instead, the current focused element should be included instead\n * by changing its `tabIndex` from `-1` to `0`\n *\n * Set this to `\"virtual\"` when:\n * - the container element should never lose focus\n * - the \"focused\" element only gains focus styles instead of being focused\n * - the container element specifies an `aria-activedescendant` pointing to one\n * of the ids for the child \"focusable\" elements\n *\n * @since 6.0.0\n */\nexport type TabIndexBehavior = \"roving\" | \"virtual\";\n\n/**\n * This should be used for specific widgets that should not include all\n * focusable elements and instead only specific elements.\n *\n * @example\n * ```ts\n * const getExpansionPanelsOnly: GetFocusableElements = (container) =>\n * [...container.querySelectorAll(\".rmd-expansion-panel__button\")];\n *\n * const getTreeItemsOnly: GetFocusableElements = (container) =>\n * [...container.querySelectorAll(\"[role='treeitem']\")];\n * ```\n *\n * @defaultValue `getFocusableElements`\n * @see the default `getFocusableElements` function.\n */\nexport type GetFocusableElements = (\n container: HTMLElement,\n programmatic: boolean\n) => readonly HTMLElement[];\n\n/**\n * @since 5.0.0\n */\nexport interface KeyboardMovementConfiguration {\n /**\n * A list of keys that will attempt to increment the focus index by 1.\n *\n * @defaultValue `[\"ArrowDown\"]`\n */\n incrementKeys?: readonly string[];\n\n /**\n * A list of keys that will attempt to decrement the focus index by 1.\n *\n * @defaultValue `[\"ArrowUp\"]`\n */\n decrementKeys?: readonly string[];\n\n /**\n * A list of keys that will set the focus index to `0`.\n *\n * @defaultValue `[\"Home\"]`\n */\n jumpToFirstKeys?: readonly string[];\n\n /**\n * A list of keys that will set the focus index to the last focusable index.\n *\n * @defaultValue `[\"End\"]`\n */\n jumpToLastKeys?: readonly string[];\n}\n\n/**\n * The defined {@link KeyboardMovementConfiguration} that should be used for\n * custom keyboard focus behavior.\n *\n * @since 5.0.0\n */\nexport type KeyboardMovementConfig = Required<KeyboardMovementConfiguration>;\n\n/**\n * @since 5.0.0\n */\nexport interface KeyboardMovementBehavior {\n /**\n * Boolean if pressing a letter will focus the next item in the\n * {@link KeyboardMovementProvider} that starts with the same letter.\n *\n * @defaultValue `false`\n */\n searchable?: boolean;\n\n /**\n * Boolean if the {@link KeyboardMovementProvider} should allow the focus behavior\n * to loop from the first to last or last to first item instead of preventing\n * any new focus behavior. In other words... if the last item is focused and\n * the user presses a key that should advance the focus to the next focusable\n * element, should the focus stay on the current element or loop back and\n * focus the first focusable item.\n *\n * @defaultValue `false`\n */\n loopable?: boolean;\n\n /**\n * Boolean if elements that are `aria-disabled` or `disabled` should still be\n * able to gain focus.\n *\n * @defaultValue `false`\n */\n includeDisabled?: boolean;\n\n /**\n * Boolean if the keyboard movement is horizontal instead of vertical. This\n * updates the default keyboard config to use `ArrowRight` and `ArrowLeft`\n * instead of `ArrowDown` and `ArrowUp`,\n *\n * @since 5.1.2\n * @defaultValue `false`\n */\n horizontal?: boolean;\n}\n\n/**\n * @since 6.3.0\n */\nexport interface KeyboardFocusFromKeyOptions {\n key: string;\n /** @defaultValue `false` */\n reversed?: boolean;\n\n /** @defaultValue `getFocusableElementsFromRef()` */\n focusables?: readonly HTMLElement[];\n}\n\n/**\n * @since 6.3.0\n */\nexport type KeyboardFocusAction = (focusables?: readonly HTMLElement[]) => void;\n\n/**\n * @since 5.0.0\n * @since 6.0.0 Removed `attach`, `detach` and `watching`\n * @internal\n */\nexport interface KeyboardMovementContext\n extends Required<KeyboardMovementBehavior> {\n /** {@inheritDoc KeyboardMovementConfig} */\n config: NonNullRef<KeyboardMovementConfig>;\n\n /** @see {@link TabIndexBehavior} */\n tabIndexBehavior: TabIndexBehavior | undefined;\n\n /**\n * Note: This will only update if the {@link KeyboardMovementProviderOptions.tabIndexBehavior}\n * has been set to `\"roving\"` or `\"virtual\"`.\n */\n activeDescendantId: string;\n\n /**\n * @since 6.3.0\n */\n focusFirst: KeyboardFocusAction;\n\n /**\n * @since 6.3.0\n */\n focusLast: KeyboardFocusAction;\n\n /**\n * @since 6.3.0\n */\n focusNext: KeyboardFocusAction;\n\n /**\n * @since 6.3.0\n */\n focusPrevious: KeyboardFocusAction;\n\n /**\n * @since 6.3.0\n */\n focusFromKey: (options: KeyboardFocusFromKeyOptions) => void;\n}\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport interface FocusableIndexOptions {\n focusables: readonly HTMLElement[];\n includeDisabled: boolean;\n}\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport type GetDefaultFocusedIndex = (options: FocusableIndexOptions) => number;\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport type ExtendKeyDown<E extends HTMLElement> = (\n movementData: KeyboardMovementExtensionData<E>\n) => void;\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport interface KeyboardMovementFocusChangeEvent {\n index: number;\n element: HTMLElement;\n}\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport type KeyboardMovementFocusChangeEventHandler = (\n event: KeyboardMovementFocusChangeEvent\n) => void;\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport interface KeyboardMovementExtensionData<E extends HTMLElement>\n extends KeyboardMovementContext {\n event: KeyboardEvent<E>;\n currentFocusIndex: NonNullMutableRef<number>;\n setFocusIndex: (index: number, focusables: readonly HTMLElement[]) => void;\n setActiveDescendantId: (id: string) => void;\n}\n\n/**\n * @since 6.3.0\n */\nexport type KeyboardMovementEventHandlers<E extends HTMLElement> = Pick<\n HTMLAttributes<E>,\n \"onClick\" | \"onFocus\" | \"onKeyDown\"\n>;\n\n/**\n * @since 6.3.0\n */\nexport interface SimpleKeyboardMovementWrapperOptions<E extends HTMLElement>\n extends KeyboardMovementEventHandlers<E> {\n ref?: Ref<E>;\n}\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport interface KeyboardMovementProviderOptions<E extends HTMLElement>\n extends KeyboardMovementBehavior,\n SimpleKeyboardMovementWrapperOptions<E>,\n KeyboardMovementConfiguration {\n /** @see {@link TabIndexBehavior} */\n tabIndexBehavior?: TabIndexBehavior;\n\n /** @defaultValue `false` */\n disabled?: boolean;\n\n /**\n * This is used to implement custom keyboard movement for the `keydown` event.\n */\n extendKeyDown?: ExtendKeyDown<E>;\n\n /**\n * Triggered whenever the focus changes.\n */\n onFocusChange?: KeyboardMovementFocusChangeEventHandler;\n\n /**\n * From what I've understood so far, programmatically focusable elements\n * should only be included when disabled elements via `aria-disabled` are\n * allowed.\n *\n * @defaultValue `includeDisabled`\n */\n programmatic?: boolean;\n\n /** @see {@link GetFocusableElements} */\n getFocusableElements?: GetFocusableElements;\n\n /**\n * This can be used to set the initial focus index whenever the container\n * element is first focused or the focus index is `-1` on other focus events.\n */\n getDefaultFocusedIndex?: GetDefaultFocusedIndex;\n\n /**\n * This was added to support editable combobox behavior. As the user types or\n * uses native input keyboard behavior, the focus index should be reset to\n * `-1` so that the next \"ArrowDown\" event focuses the first option again\n * instead of the last selected one.\n *\n * @defaultValue `false`\n */\n isNegativeOneAllowed?: boolean;\n\n /**\n * This was added to support spinbutton groups so the user can either use the\n * ArrowLeft, ArrowRight, or Tab keys to move. Without this, switching\n * between tab and the arrow keys would have the wrong tab index.\n *\n * @since 6.3.0\n * @defaultValue `false`\n */\n trackTabKeys?: boolean;\n}\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport interface KeyboardMovementProps<E extends HTMLElement>\n extends Required<KeyboardMovementEventHandlers<E>> {\n /**\n * This will only be provided if the {@link KeyboardMovementContext.tabIndexBehavior}\n * is set to `\"virtual\"`.\n */\n \"aria-activedescendant\"?: string;\n\n /**\n * This will not be provided if the {@link KeyboardMovementContext.tabIndexBehavior}\n * is `undefined`. Otherwise:\n * - `0` when `\"virtual\"`\n * - `0` when `\"roving\"` and the container element has not been focused at\n * least once\n * - `-1` when `\"roving\"` and the container has been focused at least once\n * - a child element **should** have a `tabIndex={0}` instead\n */\n tabIndex?: number;\n\n ref: RefCallback<E>;\n}\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport interface KeyboardMovementProviderImplementation<E extends HTMLElement> {\n nodeRef: RefObject<E>;\n movementProps: Readonly<KeyboardMovementProps<E>>;\n movementContext: Readonly<KeyboardMovementContext>;\n currentFocusIndex: NonNullMutableRef<number>;\n activeDescendantId: string;\n setActiveDescendantId: UseStateSetter<string>;\n}\n"],"names":[],"mappings":"AAoWA;;;CAGC,GACD,WAOC"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type KeyboardMovementContext, type KeyboardMovementProviderImplementation, type KeyboardMovementProviderOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @since 6.3.0
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_KEYBOARD_MOVEMENT_CONTEXT: Readonly<KeyboardMovementContext>;
|
|
2
6
|
export declare const KeyboardMovementProvider: import("react").Provider<KeyboardMovementContext>;
|
|
3
7
|
/**
|
|
4
8
|
* @since 5.0.0
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { createContext, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { getFocusableElements as defaultGetFocusableElements } from "../focus/utils.js";
|
|
4
4
|
import { useUserInteractionMode } from "../interaction/UserInteractionModeProvider.js";
|
|
5
5
|
import { useDir } from "../typography/WritingDirectionProvider.js";
|
|
6
|
+
import { useEnsuredRef } from "../useEnsuredRef.js";
|
|
6
7
|
import { useIsomorphicLayoutEffect } from "../useIsomorphicLayoutEffect.js";
|
|
7
8
|
import { DEFAULT_KEYBOARD_MOVEMENT, DEFAULT_LTR_KEYBOARD_MOVEMENT, DEFAULT_RTL_KEYBOARD_MOVEMENT } from "./constants.js";
|
|
8
9
|
import { findMatchIndex } from "./findMatchIndex.js";
|
|
9
10
|
import { getFirstFocusableIndex, getLastFocusableIndex, getNextFocusableIndex, getSearchText, getVirtualFocusDefaultIndex, isElementDisabled, isNotFocusable, isSearchableEvent, recalculateFocusIndex } from "./utils.js";
|
|
11
|
+
const noop = ()=>{
|
|
12
|
+
// do nothing
|
|
13
|
+
};
|
|
10
14
|
/**
|
|
11
|
-
* @since
|
|
12
|
-
|
|
13
|
-
*/ const context = createContext({
|
|
15
|
+
* @since 6.3.0
|
|
16
|
+
*/ export const DEFAULT_KEYBOARD_MOVEMENT_CONTEXT = {
|
|
14
17
|
config: {
|
|
15
18
|
current: DEFAULT_KEYBOARD_MOVEMENT
|
|
16
19
|
},
|
|
@@ -19,8 +22,17 @@ import { getFirstFocusableIndex, getLastFocusableIndex, getNextFocusableIndex, g
|
|
|
19
22
|
horizontal: false,
|
|
20
23
|
includeDisabled: false,
|
|
21
24
|
tabIndexBehavior: undefined,
|
|
22
|
-
activeDescendantId: ""
|
|
23
|
-
|
|
25
|
+
activeDescendantId: "",
|
|
26
|
+
focusFirst: noop,
|
|
27
|
+
focusLast: noop,
|
|
28
|
+
focusNext: noop,
|
|
29
|
+
focusPrevious: noop,
|
|
30
|
+
focusFromKey: noop
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* @since 5.0.0
|
|
34
|
+
* @internal
|
|
35
|
+
*/ const context = createContext(DEFAULT_KEYBOARD_MOVEMENT_CONTEXT);
|
|
24
36
|
context.displayName = "KeyboardMovement";
|
|
25
37
|
export const { Provider: KeyboardMovementProvider } = context;
|
|
26
38
|
/**
|
|
@@ -29,9 +41,6 @@ export const { Provider: KeyboardMovementProvider } = context;
|
|
|
29
41
|
*/ export function useKeyboardMovementContext() {
|
|
30
42
|
return useContext(context);
|
|
31
43
|
}
|
|
32
|
-
const noop = ()=>{
|
|
33
|
-
// do nothing
|
|
34
|
-
};
|
|
35
44
|
const returnNegative1 = ()=>-1;
|
|
36
45
|
/**
|
|
37
46
|
* Implements the custom keyboard movement behavior throughout react-md. Using
|
|
@@ -154,7 +163,8 @@ const returnNegative1 = ()=>-1;
|
|
|
154
163
|
* @since 6.0.0
|
|
155
164
|
* @internal
|
|
156
165
|
*/ export function useKeyboardMovementProvider(options = {}) {
|
|
157
|
-
const { onClick = noop, onFocus = noop, onKeyDown = noop, loopable = false, disabled, searchable = false, horizontal = false, includeDisabled = false, tabIndexBehavior, extendKeyDown = noop, onFocusChange = noop, programmatic = includeDisabled, incrementKeys: propIncrementKeys, decrementKeys: propDecrementKeys, jumpToFirstKeys: propJumpToFirstKeys, jumpToLastKeys: propJumpToLastKeys, getFocusableElements = defaultGetFocusableElements, getDefaultFocusedIndex = returnNegative1, isNegativeOneAllowed = false } = options;
|
|
166
|
+
const { ref: propRef, onClick = noop, onFocus = noop, onKeyDown = noop, loopable = false, disabled, searchable = false, horizontal = false, trackTabKeys = false, includeDisabled = false, tabIndexBehavior, extendKeyDown = noop, onFocusChange = noop, programmatic = includeDisabled, incrementKeys: propIncrementKeys, decrementKeys: propDecrementKeys, jumpToFirstKeys: propJumpToFirstKeys, jumpToLastKeys: propJumpToLastKeys, getFocusableElements = defaultGetFocusableElements, getDefaultFocusedIndex = returnNegative1, isNegativeOneAllowed = false } = options;
|
|
167
|
+
const [nodeRef, nodeRefCallback] = useEnsuredRef(propRef);
|
|
158
168
|
const isRTL = useDir().dir === "rtl";
|
|
159
169
|
let defaults;
|
|
160
170
|
if (horizontal) {
|
|
@@ -176,42 +186,153 @@ const returnNegative1 = ()=>-1;
|
|
|
176
186
|
useIsomorphicLayoutEffect(()=>{
|
|
177
187
|
config.current = configuration;
|
|
178
188
|
});
|
|
189
|
+
const mode = useUserInteractionMode();
|
|
190
|
+
const refocus = useRef(false);
|
|
191
|
+
const currentFocusIndex = useRef(-1);
|
|
179
192
|
const [activeDescendantId, setActiveDescendantId] = useState("");
|
|
193
|
+
if (process.env.NODE_ENV !== "production") {
|
|
194
|
+
// this fixes issues during hot reloading and using the `useId()` hook
|
|
195
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
196
|
+
useEffect(()=>{
|
|
197
|
+
return ()=>{
|
|
198
|
+
setActiveDescendantId("");
|
|
199
|
+
};
|
|
200
|
+
}, []);
|
|
201
|
+
}
|
|
202
|
+
let tabIndex;
|
|
203
|
+
if (tabIndexBehavior) {
|
|
204
|
+
tabIndex = disabled || tabIndexBehavior === "roving" && activeDescendantId ? -1 : 0;
|
|
205
|
+
}
|
|
206
|
+
const getFocusableElementsFromRef = useCallback(()=>{
|
|
207
|
+
const container = nodeRef.current;
|
|
208
|
+
if (!container) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
return getFocusableElements(container, programmatic);
|
|
212
|
+
}, [
|
|
213
|
+
getFocusableElements,
|
|
214
|
+
nodeRef,
|
|
215
|
+
programmatic
|
|
216
|
+
]);
|
|
217
|
+
const updateFocusIndex = useCallback((index, focusables = getFocusableElementsFromRef())=>{
|
|
218
|
+
if (currentFocusIndex.current === index || index === -1) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
currentFocusIndex.current = index;
|
|
222
|
+
const focused = focusables[index];
|
|
223
|
+
if (tabIndexBehavior) {
|
|
224
|
+
focused.scrollIntoView({
|
|
225
|
+
block: "nearest",
|
|
226
|
+
inline: "nearest"
|
|
227
|
+
});
|
|
228
|
+
setActiveDescendantId(focused.id);
|
|
229
|
+
}
|
|
230
|
+
if (tabIndexBehavior !== "virtual") {
|
|
231
|
+
focused.focus();
|
|
232
|
+
}
|
|
233
|
+
onFocusChange({
|
|
234
|
+
index,
|
|
235
|
+
element: focused
|
|
236
|
+
});
|
|
237
|
+
}, [
|
|
238
|
+
getFocusableElementsFromRef,
|
|
239
|
+
onFocusChange,
|
|
240
|
+
tabIndexBehavior
|
|
241
|
+
]);
|
|
242
|
+
const focusNext = useCallback((focusables = getFocusableElementsFromRef())=>{
|
|
243
|
+
updateFocusIndex(getNextFocusableIndex({
|
|
244
|
+
loopable,
|
|
245
|
+
increment: true,
|
|
246
|
+
focusables,
|
|
247
|
+
includeDisabled: true,
|
|
248
|
+
currentFocusIndex: currentFocusIndex.current
|
|
249
|
+
}), focusables);
|
|
250
|
+
}, [
|
|
251
|
+
getFocusableElementsFromRef,
|
|
252
|
+
loopable,
|
|
253
|
+
updateFocusIndex
|
|
254
|
+
]);
|
|
255
|
+
const focusPrevious = useCallback((focusables = getFocusableElementsFromRef())=>{
|
|
256
|
+
updateFocusIndex(getNextFocusableIndex({
|
|
257
|
+
loopable,
|
|
258
|
+
increment: false,
|
|
259
|
+
focusables,
|
|
260
|
+
includeDisabled: true,
|
|
261
|
+
currentFocusIndex: currentFocusIndex.current
|
|
262
|
+
}), focusables);
|
|
263
|
+
}, [
|
|
264
|
+
getFocusableElementsFromRef,
|
|
265
|
+
loopable,
|
|
266
|
+
updateFocusIndex
|
|
267
|
+
]);
|
|
268
|
+
const focusFirst = useCallback((focusables = getFocusableElementsFromRef())=>{
|
|
269
|
+
updateFocusIndex(getFirstFocusableIndex({
|
|
270
|
+
focusables,
|
|
271
|
+
includeDisabled
|
|
272
|
+
}), focusables);
|
|
273
|
+
}, [
|
|
274
|
+
getFocusableElementsFromRef,
|
|
275
|
+
includeDisabled,
|
|
276
|
+
updateFocusIndex
|
|
277
|
+
]);
|
|
278
|
+
const focusLast = useCallback((focusables = getFocusableElementsFromRef())=>{
|
|
279
|
+
updateFocusIndex(getLastFocusableIndex({
|
|
280
|
+
focusables,
|
|
281
|
+
includeDisabled
|
|
282
|
+
}), focusables);
|
|
283
|
+
}, [
|
|
284
|
+
getFocusableElementsFromRef,
|
|
285
|
+
includeDisabled,
|
|
286
|
+
updateFocusIndex
|
|
287
|
+
]);
|
|
288
|
+
const focusFromKey = useCallback((options)=>{
|
|
289
|
+
const { key, reversed, focusables = getFocusableElementsFromRef() } = options;
|
|
290
|
+
if (!searchable) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const index = findMatchIndex({
|
|
294
|
+
value: key,
|
|
295
|
+
values: focusables.map((element)=>getSearchText(element, !isNotFocusable(element, includeDisabled))),
|
|
296
|
+
startIndex: reversed ? -1 : currentFocusIndex.current
|
|
297
|
+
});
|
|
298
|
+
updateFocusIndex(index, focusables);
|
|
299
|
+
}, [
|
|
300
|
+
getFocusableElementsFromRef,
|
|
301
|
+
includeDisabled,
|
|
302
|
+
searchable,
|
|
303
|
+
updateFocusIndex
|
|
304
|
+
]);
|
|
180
305
|
const movementContext = useMemo(()=>({
|
|
181
306
|
config,
|
|
182
307
|
loopable,
|
|
183
308
|
searchable,
|
|
184
309
|
horizontal,
|
|
310
|
+
focusFirst,
|
|
311
|
+
focusLast,
|
|
312
|
+
focusNext,
|
|
313
|
+
focusPrevious,
|
|
314
|
+
focusFromKey,
|
|
185
315
|
includeDisabled,
|
|
186
316
|
tabIndexBehavior,
|
|
187
317
|
activeDescendantId
|
|
188
318
|
}), [
|
|
189
319
|
activeDescendantId,
|
|
320
|
+
focusFirst,
|
|
321
|
+
focusFromKey,
|
|
322
|
+
focusLast,
|
|
323
|
+
focusNext,
|
|
324
|
+
focusPrevious,
|
|
190
325
|
horizontal,
|
|
191
326
|
includeDisabled,
|
|
192
327
|
loopable,
|
|
193
328
|
searchable,
|
|
194
329
|
tabIndexBehavior
|
|
195
330
|
]);
|
|
196
|
-
const currentFocusIndex = useRef(-1);
|
|
197
|
-
const mode = useUserInteractionMode();
|
|
198
|
-
const refocus = useRef(false);
|
|
199
|
-
if (process.env.NODE_ENV !== "production") {
|
|
200
|
-
// this fixes issues during hot reloading and using the `useId()` hook
|
|
201
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
202
|
-
useEffect(()=>{
|
|
203
|
-
return ()=>{
|
|
204
|
-
setActiveDescendantId("");
|
|
205
|
-
};
|
|
206
|
-
}, []);
|
|
207
|
-
}
|
|
208
|
-
let tabIndex;
|
|
209
|
-
if (tabIndexBehavior) {
|
|
210
|
-
tabIndex = disabled || tabIndexBehavior === "roving" && activeDescendantId ? -1 : 0;
|
|
211
|
-
}
|
|
212
331
|
return {
|
|
332
|
+
nodeRef,
|
|
213
333
|
movementProps: {
|
|
214
334
|
"aria-activedescendant": tabIndexBehavior === "virtual" ? activeDescendantId : undefined,
|
|
335
|
+
ref: nodeRefCallback,
|
|
215
336
|
tabIndex,
|
|
216
337
|
// Note: This used to be on the `onFocus` event, but this causes issues in
|
|
217
338
|
// Chromium browsers for drag and drop behavior
|
|
@@ -312,25 +433,7 @@ const returnNegative1 = ()=>-1;
|
|
|
312
433
|
const setFocusIndex = (index, focusables)=>{
|
|
313
434
|
event.preventDefault();
|
|
314
435
|
event.stopPropagation();
|
|
315
|
-
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
currentFocusIndex.current = index;
|
|
319
|
-
const focused = focusables[index];
|
|
320
|
-
if (tabIndexBehavior) {
|
|
321
|
-
focused.scrollIntoView({
|
|
322
|
-
block: "nearest",
|
|
323
|
-
inline: "nearest"
|
|
324
|
-
});
|
|
325
|
-
setActiveDescendantId(focused.id);
|
|
326
|
-
}
|
|
327
|
-
if (tabIndexBehavior !== "virtual") {
|
|
328
|
-
focused.focus();
|
|
329
|
-
}
|
|
330
|
-
onFocusChange({
|
|
331
|
-
index,
|
|
332
|
-
element: focused
|
|
333
|
-
});
|
|
436
|
+
updateFocusIndex(index, focusables);
|
|
334
437
|
};
|
|
335
438
|
extendKeyDown({
|
|
336
439
|
event,
|
|
@@ -368,44 +471,39 @@ const returnNegative1 = ()=>-1;
|
|
|
368
471
|
}
|
|
369
472
|
const { incrementKeys, decrementKeys, jumpToFirstKeys, jumpToLastKeys } = config.current;
|
|
370
473
|
if (searchable && isSearchableEvent(event)) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
474
|
+
event.preventDefault();
|
|
475
|
+
event.stopPropagation();
|
|
476
|
+
focusFromKey({
|
|
477
|
+
key,
|
|
478
|
+
reversed: shiftKey
|
|
376
479
|
});
|
|
377
|
-
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
if (trackTabKeys && key === "Tab") {
|
|
483
|
+
currentFocusIndex.current += event.shiftKey ? -1 : 1;
|
|
378
484
|
return;
|
|
379
485
|
}
|
|
380
486
|
const jumpToFirst = jumpToFirstKeys.includes(key);
|
|
381
487
|
const jumpToLast = !jumpToFirst && jumpToLastKeys.includes(key);
|
|
382
488
|
const increment = !jumpToFirst && !jumpToLast && incrementKeys.includes(key);
|
|
383
489
|
const decrement = !jumpToFirst && !jumpToLast && !increment && decrementKeys.includes(key);
|
|
384
|
-
if (!jumpToFirst && !jumpToLast && !increment && !decrement) {
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
const focusables = getFocusableElements(currentTarget, programmatic);
|
|
388
|
-
let index;
|
|
389
490
|
if (jumpToFirst) {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
});
|
|
491
|
+
event.preventDefault();
|
|
492
|
+
event.stopPropagation();
|
|
493
|
+
focusFirst();
|
|
394
494
|
} else if (jumpToLast) {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
});
|
|
495
|
+
event.preventDefault();
|
|
496
|
+
event.stopPropagation();
|
|
497
|
+
focusLast();
|
|
498
|
+
} else if (increment) {
|
|
499
|
+
event.preventDefault();
|
|
500
|
+
event.stopPropagation();
|
|
501
|
+
focusNext();
|
|
502
|
+
} else if (decrement) {
|
|
503
|
+
event.preventDefault();
|
|
504
|
+
event.stopPropagation();
|
|
505
|
+
focusPrevious();
|
|
407
506
|
}
|
|
408
|
-
setFocusIndex(index, focusables);
|
|
409
507
|
}
|
|
410
508
|
},
|
|
411
509
|
movementContext,
|