@servicetitan/design-system 13.3.2 → 14.0.0-react18.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/components/ActionMenu/ActionMenu.css +29 -21
- package/dist/components/ActionMenu/ActionMenu.css.map +1 -1
- package/dist/components/ActionMenu/ActionMenu.d.ts +7 -3
- package/dist/components/ActionMenu/ActionMenu.js +46 -3
- package/dist/components/ActionMenu/ActionMenu.js.map +1 -1
- package/dist/components/ActionMenu/ActionMenu.stories.d.ts +41 -0
- package/dist/components/ActionMenu/ActionMenu.stories.js +250 -0
- package/dist/components/ActionMenu/ActionMenu.stories.js.map +1 -0
- package/dist/components/ActionMenu/ActionMenuItem.js +2 -5
- package/dist/components/ActionMenu/ActionMenuItem.js.map +1 -1
- package/dist/components/ActionMenu/index.css +29 -21
- package/dist/components/ActionMenu/index.css.map +1 -1
- package/dist/components/ActionMenu/useLatestEvent.d.ts +2 -0
- package/dist/components/ActionMenu/useLatestEvent.js +20 -0
- package/dist/components/ActionMenu/useLatestEvent.js.map +1 -0
- package/dist/components/AnvilSelect/AnvilSelect.d.ts +2 -1
- package/dist/components/AnvilSelect/AnvilSelect.js +17 -41
- package/dist/components/AnvilSelect/AnvilSelect.js.map +1 -1
- package/dist/components/AnvilSelect/components/FocusProvider.d.ts +2 -1
- package/dist/components/AnvilSelect/components/FocusProvider.js.map +1 -1
- package/dist/components/AnvilSelect/components/SelectFooter.js +6 -6
- package/dist/components/AnvilSelect/components/SelectFooter.js.map +1 -1
- package/dist/components/AnvilSelect/components/Trigger.js +2 -0
- package/dist/components/AnvilSelect/components/Trigger.js.map +1 -1
- package/dist/components/AnvilSelect/utils/focus-utils.d.ts +0 -3
- package/dist/components/AnvilSelect/utils/focus-utils.js +1 -19
- package/dist/components/AnvilSelect/utils/focus-utils.js.map +1 -1
- package/dist/components/BodyText/BodyText.js +2 -2
- package/dist/components/BodyText/BodyText.js.map +1 -1
- package/dist/components/BreakPoint/BreakPoint.d.ts +2 -1
- package/dist/components/BreakPoint/BreakPoint.js.map +1 -1
- package/dist/components/Button/Button.js +2 -10
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/ButtonToggle/ButtonToggle.d.ts +1 -1
- package/dist/components/ButtonToggle/ButtonToggle.js +11 -1
- package/dist/components/ButtonToggle/ButtonToggle.js.map +1 -1
- package/dist/components/ButtonToggle/ButtonToggleItem.js +1 -1
- package/dist/components/ButtonToggle/ButtonToggleItem.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.js +1 -1
- package/dist/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/components/ColorPicker/ColorPicker.css +6 -4
- package/dist/components/ColorPicker/ColorPicker.css.map +1 -1
- package/dist/components/ColorPicker/ColorPicker.d.ts +1 -7
- package/dist/components/ColorPicker/ColorPicker.js +14 -27
- package/dist/components/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/components/ColorPicker/index.css +6 -4
- package/dist/components/ColorPicker/index.css.map +1 -1
- package/dist/components/DataList/DataList.js +1 -1
- package/dist/components/DataList/DataList.js.map +1 -1
- package/dist/components/DataList/DataListCell.d.ts +1 -1
- package/dist/components/DataList/DataListCell.js +2 -3
- package/dist/components/DataList/DataListCell.js.map +1 -1
- package/dist/components/DataList/DataListHeaderCell.d.ts +1 -0
- package/dist/components/DataList/DataListHeaderCell.js.map +1 -1
- package/dist/components/DatePicker/InputDateMask.js +2 -2
- package/dist/components/DatePicker/InputDateMask.js.map +1 -1
- package/dist/components/DateRangePicker/components/DateRangeInput.js +1 -1
- package/dist/components/DateRangePicker/components/DateRangeInput.js.map +1 -1
- package/dist/components/Dialog/Dialog.d.ts +1 -0
- package/dist/components/Dialog/Dialog.js.map +1 -1
- package/dist/components/Drawer/Drawer.d.ts +1 -0
- package/dist/components/Drawer/Drawer.js.map +1 -1
- package/dist/components/Dropdown/Dropdown.d.ts +2 -1
- package/dist/components/Dropdown/Dropdown.js.map +1 -1
- package/dist/components/FlowCard/FlowCard.d.ts +2 -1
- package/dist/components/FlowCard/FlowCard.js.map +1 -1
- package/dist/components/FormControls/FormInput.d.ts +1 -1
- package/dist/components/FormField/FormField.js +4 -5
- package/dist/components/FormField/FormField.js.map +1 -1
- package/dist/components/Input/Input.d.ts +1 -0
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Modal/Modal.js +4 -5
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/components.d.ts +1 -0
- package/dist/components/Modal/components.js.map +1 -1
- package/dist/components/OptionList/OptionList.d.ts +2 -0
- package/dist/components/OptionList/OptionList.js +6 -2
- package/dist/components/OptionList/OptionList.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +2 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/components.d.ts +2 -0
- package/dist/components/Popover/components.js.map +1 -1
- package/dist/components/SideNav/SideNav.d.ts +1 -0
- package/dist/components/SideNav/SideNav.js +20 -5
- package/dist/components/SideNav/SideNav.js.map +1 -1
- package/dist/components/SideNav/SideNavItem.css +4 -2
- package/dist/components/SideNav/SideNavItem.css.map +1 -1
- package/dist/components/SideNav/SideNavItem.d.ts +1 -0
- package/dist/components/SideNav/SideNavItem.js +13 -51
- package/dist/components/SideNav/SideNavItem.js.map +1 -1
- package/dist/components/SideNav/index.css +4 -2
- package/dist/components/SideNav/index.css.map +1 -1
- package/dist/components/Snackbar/Snackbar.d.ts +1 -0
- package/dist/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/components/Tab/Tab.js +1 -1
- package/dist/components/Tab/Tab.js.map +1 -1
- package/dist/components/TabGroup/TabGroup.js +8 -1
- package/dist/components/TabGroup/TabGroup.js.map +1 -1
- package/dist/components/TabGroup/components.d.ts +4 -2
- package/dist/components/TabGroup/components.js.map +1 -1
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/TextArea/TextArea.d.ts +2 -1
- package/dist/components/TextArea/TextArea.js +1 -1
- package/dist/components/TextArea/TextArea.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +5 -6
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.test.js +13 -4
- package/dist/components/TimePicker/TimePicker.test.js.map +1 -1
- package/dist/components/TimePicker/components/TimePickerOptionList.d.ts +1 -1
- package/dist/components/TimePicker/components/TimePickerOptionList.js +21 -25
- package/dist/components/TimePicker/components/TimePickerOptionList.js.map +1 -1
- package/dist/components/TimePicker/utils/filterOptions.js +7 -5
- package/dist/components/TimePicker/utils/filterOptions.js.map +1 -1
- package/dist/components/TimePicker/utils/utils.js +10 -12
- package/dist/components/TimePicker/utils/utils.js.map +1 -1
- package/dist/components/Toast/Toast.d.ts +2 -1
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Toast/ToastGroup.d.ts +1 -1
- package/dist/components/ToggleSwitch/ToggleSwitch.js +8 -7
- package/dist/components/ToggleSwitch/ToggleSwitch.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +3 -4
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +2 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.js +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
- package/dist/components/index.css +39 -27
- package/dist/components/index.css.map +1 -1
- package/dist/global/index.css +1 -1
- package/dist/global/version.css +1 -1
- package/dist/hooks/useArrowNav/index.d.ts +1 -0
- package/dist/hooks/useArrowNav/index.js +2 -0
- package/dist/hooks/useArrowNav/index.js.map +1 -0
- package/dist/hooks/useArrowNav/useArrowNav.d.ts +27 -0
- package/dist/hooks/useArrowNav/useArrowNav.js +65 -0
- package/dist/hooks/useArrowNav/useArrowNav.js.map +1 -0
- package/dist/hooks/useArrowNav/utils/index.d.ts +3 -0
- package/dist/hooks/useArrowNav/utils/index.js +4 -0
- package/dist/hooks/useArrowNav/utils/index.js.map +1 -0
- package/dist/hooks/useArrowNav/utils/keys.d.ts +3 -0
- package/dist/hooks/useArrowNav/utils/keys.js +12 -0
- package/dist/hooks/useArrowNav/utils/keys.js.map +1 -0
- package/dist/hooks/useArrowNav/utils/tabIndex.d.ts +2 -0
- package/dist/hooks/useArrowNav/utils/tabIndex.js +53 -0
- package/dist/hooks/useArrowNav/utils/tabIndex.js.map +1 -0
- package/dist/hooks/useArrowNav/utils/utils.d.ts +14 -0
- package/dist/hooks/useArrowNav/utils/utils.js +111 -0
- package/dist/hooks/useArrowNav/utils/utils.js.map +1 -0
- package/dist/hooks/useFocusTrap/internal/useAutoFocus.js +12 -13
- package/dist/hooks/useFocusTrap/internal/useAutoFocus.js.map +1 -1
- package/dist/hooks/useFocusTrap/internal/useDisableClickOutside.js +5 -5
- package/dist/hooks/useFocusTrap/internal/useDisableClickOutside.js.map +1 -1
- package/dist/hooks/useFocusTrap/internal/useFocusLock.js +4 -5
- package/dist/hooks/useFocusTrap/internal/useFocusLock.js.map +1 -1
- package/dist/hooks/useFocusTrap/internal/useRestoreFocus.js +4 -1
- package/dist/hooks/useFocusTrap/internal/useRestoreFocus.js.map +1 -1
- package/dist/hooks/useFocusTrap/internal/utils.d.ts +6 -2
- package/dist/hooks/useFocusTrap/internal/utils.js +27 -12
- package/dist/hooks/useFocusTrap/internal/utils.js.map +1 -1
- package/dist/hooks/useFocusVisible.js +9 -11
- package/dist/hooks/useFocusVisible.js.map +1 -1
- package/dist/internal/CollapsibleList/CollapsibleList.d.ts +2 -1
- package/dist/internal/CollapsibleList/CollapsibleList.js.map +1 -1
- package/dist/internal/CollapsibleList/CollapsibleListItem.d.ts +2 -1
- package/dist/internal/CollapsibleList/CollapsibleListItem.js +20 -2
- package/dist/internal/CollapsibleList/CollapsibleListItem.js.map +1 -1
- package/dist/internal/Overlay/Overlay.d.ts +2 -1
- package/dist/internal/Overlay/Overlay.js.map +1 -1
- package/dist/internal/Popper/Popper.css +4 -2
- package/dist/internal/Popper/Popper.css.map +1 -1
- package/dist/internal/Popper/Popper.d.ts +1 -1
- package/dist/internal/Popper/Popper.js +3 -3
- package/dist/internal/Popper/Popper.js.map +1 -1
- package/dist/internal/Popper/index.css +4 -2
- package/dist/internal/Popper/index.css.map +1 -1
- package/dist/internal/Portal/Portal.d.ts +2 -1
- package/dist/internal/Portal/Portal.js.map +1 -1
- package/dist/internal/index.css +4 -2
- package/dist/internal/index.css.map +1 -1
- package/dist/system-light.css +5 -3
- package/dist/system-light.css.map +1 -1
- package/dist/system-light.min.css +1 -1
- package/dist/system.css +75 -96
- package/dist/system.css.map +1 -1
- package/dist/system.min.css +2 -2
- package/dist/themes/index.css.map +1 -1
- package/dist/themes/kendo/index.css.map +1 -1
- package/dist/utilities/KeyboardAccessTests/KeyboardAccess.test.js +143 -32
- package/dist/utilities/KeyboardAccessTests/KeyboardAccess.test.js.map +1 -1
- package/dist/utilities/KeyboardAccessTests/components/components.d.ts +1 -0
- package/dist/utilities/KeyboardAccessTests/components/components.js +78 -39
- package/dist/utilities/KeyboardAccessTests/components/components.js.map +1 -1
- package/dist/utilities/KeyboardAccessTests/utils/jestUtils.d.ts +1 -0
- package/dist/utilities/KeyboardAccessTests/utils/jestUtils.js +18 -0
- package/dist/utilities/KeyboardAccessTests/utils/jestUtils.js.map +1 -1
- package/dist/utilities/KeyboardAccessTests/utils/utils.d.ts +0 -1
- package/dist/utilities/KeyboardAccessTests/utils/utils.js +0 -16
- package/dist/utilities/KeyboardAccessTests/utils/utils.js.map +1 -1
- package/dist/utilities/wrapWithComponent.d.ts +1 -1
- package/package.json +28 -34
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { queryOnScope, getSelector, isInsideSameKeynav, active } from './utils';
|
|
2
|
+
export const initTabIndexes = (scopeElements, selectorOptions, keynavId) => {
|
|
3
|
+
const getFocusables = (scope) => {
|
|
4
|
+
var _a;
|
|
5
|
+
const selector = getSelector(selectorOptions);
|
|
6
|
+
const focusables = (_a = queryOnScope(scope, selector)) === null || _a === void 0 ? void 0 : _a.filter((el) => isInsideSameKeynav(el, keynavId));
|
|
7
|
+
if (!focusables || focusables.length < 1)
|
|
8
|
+
return null;
|
|
9
|
+
return focusables;
|
|
10
|
+
};
|
|
11
|
+
scopeElements.forEach((el) => setTabIndex(getFocusables(el)));
|
|
12
|
+
const handleFocus = () => scopeElements.forEach((el) => setTabIndex(getFocusables(el)));
|
|
13
|
+
const allFocusables = getFocusables(scopeElements);
|
|
14
|
+
allFocusables === null || allFocusables === void 0 ? void 0 : allFocusables.forEach((el) => {
|
|
15
|
+
el === null || el === void 0 ? void 0 : el.addEventListener('focusin', handleFocus);
|
|
16
|
+
el === null || el === void 0 ? void 0 : el.addEventListener('focusout', handleFocus);
|
|
17
|
+
});
|
|
18
|
+
return allFocusables === null || allFocusables === void 0 ? void 0 : allFocusables.map((el) => () => {
|
|
19
|
+
el === null || el === void 0 ? void 0 : el.removeEventListener('focusout', handleFocus);
|
|
20
|
+
el === null || el === void 0 ? void 0 : el.removeEventListener('focusin', handleFocus);
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
const setTabIndex = (els) => {
|
|
24
|
+
if (!els || (els === null || els === void 0 ? void 0 : els.length) < 1)
|
|
25
|
+
return;
|
|
26
|
+
// One element should always be focusable, having `tabIndex=0`
|
|
27
|
+
const keepFocusable = findActive(els) || findSelected(els) || findLastFocused(els) || els[0];
|
|
28
|
+
els.forEach((el) => (el.tabIndex = -1));
|
|
29
|
+
keepFocusable.tabIndex = 0;
|
|
30
|
+
};
|
|
31
|
+
const findLastFocused = (els) => {
|
|
32
|
+
const result = els === null || els === void 0 ? void 0 : els.filter((el) => (el === null || el === void 0 ? void 0 : el.hasAttribute('tabIndex')) && el.tabIndex >= 0);
|
|
33
|
+
if ((result === null || result === void 0 ? void 0 : result.length) === 1)
|
|
34
|
+
return result[0];
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
const findSelected = (els) => {
|
|
38
|
+
const result = els === null || els === void 0 ? void 0 : els.find((el) => el === null || el === void 0 ? void 0 : el.matches([
|
|
39
|
+
'[aria-current]:not([aria-current=false])',
|
|
40
|
+
'[aria-checked]:not([aria-checked=false])',
|
|
41
|
+
'[aria-selected]:not([aria-selected=false])',
|
|
42
|
+
'[aria-pressed]:not([aria-pressed=false])',
|
|
43
|
+
].join(':not([aria-disabled=true]),')));
|
|
44
|
+
if (result)
|
|
45
|
+
return result;
|
|
46
|
+
return null;
|
|
47
|
+
};
|
|
48
|
+
const findActive = (els) => {
|
|
49
|
+
if (els === null || els === void 0 ? void 0 : els.includes(active()))
|
|
50
|
+
return active();
|
|
51
|
+
return null;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=tabIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabIndex.js","sourceRoot":"","sources":["../../../../src/hooks/useArrowNav/utils/tabIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { UseArrowNavProps, SelectorOptions } from '../useArrowNav';
|
|
2
|
+
import { queryOnScope, active } from '../../useFocusTrap/internal/utils';
|
|
3
|
+
export declare const focusableSelector: string;
|
|
4
|
+
export { active, queryOnScope };
|
|
5
|
+
export declare const getScope: (scope: UseArrowNavProps['scope']) => HTMLElement[];
|
|
6
|
+
export declare const isInsideScope: (scope: HTMLElement[], el: HTMLElement | Element, keynavId: string) => boolean;
|
|
7
|
+
export interface IFocusables {
|
|
8
|
+
active: HTMLElement;
|
|
9
|
+
next: HTMLElement;
|
|
10
|
+
}
|
|
11
|
+
export declare const getFocusables: (scope: HTMLElement[], selectorOptions: SelectorOptions, tabLoop: boolean, key: string, keynavId: string) => IFocusables;
|
|
12
|
+
export declare const getSelector: (selectorOptions: any) => string;
|
|
13
|
+
export declare const createId: () => string;
|
|
14
|
+
export declare const isInsideSameKeynav: (el: HTMLElement, keynavId: string) => boolean;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { keys } from '../../../utilities';
|
|
2
|
+
import { queryOnScope, active, toArray, } from '../../useFocusTrap/internal/utils';
|
|
3
|
+
// Excluded: input[type=text], select, textarea, [contenteditable]
|
|
4
|
+
const focusableElements = [
|
|
5
|
+
'input[type=button]:not([disabled])',
|
|
6
|
+
'input[type=checkbox]:not([disabled])',
|
|
7
|
+
'input[type=radio]:not([disabled])',
|
|
8
|
+
'input[type=file]:not([disabled])',
|
|
9
|
+
'input[type=reset]:not([disabled])',
|
|
10
|
+
'input[type=submit]:not([disabled])',
|
|
11
|
+
'button:not([disabled])',
|
|
12
|
+
'a[href]',
|
|
13
|
+
'area[href]',
|
|
14
|
+
'summary',
|
|
15
|
+
'object',
|
|
16
|
+
'embed',
|
|
17
|
+
'audio[controls]',
|
|
18
|
+
'video[controls]',
|
|
19
|
+
'[tabindex]:not([disabled]):not([aria-disabled=true]):not(input):not(textarea):not(select)',
|
|
20
|
+
];
|
|
21
|
+
export const focusableSelector = focusableElements
|
|
22
|
+
.map((s) => s + ':not([hidden]):not([contenteditable])')
|
|
23
|
+
.join(',');
|
|
24
|
+
export { active, queryOnScope };
|
|
25
|
+
export const getScope = (scope) => {
|
|
26
|
+
if (!scope)
|
|
27
|
+
return null;
|
|
28
|
+
return toArray(scope)
|
|
29
|
+
.map((el) => { var _a; return (_a = el.current) !== null && _a !== void 0 ? _a : el; })
|
|
30
|
+
.filter((el) => el instanceof HTMLElement);
|
|
31
|
+
};
|
|
32
|
+
export const isInsideScope = (scope, el, keynavId) => {
|
|
33
|
+
const scopeElement = scope.find((item) => (item === null || item === void 0 ? void 0 : item.contains(el)) &&
|
|
34
|
+
isInsideSameKeynav(el, keynavId));
|
|
35
|
+
return !!scopeElement;
|
|
36
|
+
};
|
|
37
|
+
export const getFocusables = (scope, selectorOptions, tabLoop, key, keynavId) => {
|
|
38
|
+
const selector = getSelector(selectorOptions);
|
|
39
|
+
const focusables = queryOnScope(scope, selector).filter((el) => isInsideSameKeynav(el, keynavId));
|
|
40
|
+
const result = {
|
|
41
|
+
active: null,
|
|
42
|
+
next: null,
|
|
43
|
+
};
|
|
44
|
+
const current = focusables === null || focusables === void 0 ? void 0 : focusables.indexOf(active());
|
|
45
|
+
if (!focusables || current < 0)
|
|
46
|
+
return result;
|
|
47
|
+
result.active = focusables[current];
|
|
48
|
+
result.next = focusables[nextIdx(focusables, tabLoop, key)];
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
// Trims commas and whitespaces
|
|
52
|
+
const trim = (str) => {
|
|
53
|
+
let result = str, prevResult = '';
|
|
54
|
+
do {
|
|
55
|
+
prevResult = result;
|
|
56
|
+
result = result.trim().replace(/(^,)|(,$)/, '');
|
|
57
|
+
} while (result !== prevResult);
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
const isSelectorValid = (selector) => {
|
|
61
|
+
const queryCheck = (s) => document.createDocumentFragment().querySelector(s);
|
|
62
|
+
try {
|
|
63
|
+
queryCheck(selector);
|
|
64
|
+
}
|
|
65
|
+
catch (_a) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
};
|
|
70
|
+
export const getSelector = (selectorOptions) => {
|
|
71
|
+
const { selector, extendSelector = '' } = selectorOptions;
|
|
72
|
+
let result;
|
|
73
|
+
if (selector) {
|
|
74
|
+
result = trim(selector);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
result = trim(focusableSelector + ',' + trim(extendSelector));
|
|
78
|
+
}
|
|
79
|
+
if (isSelectorValid(result))
|
|
80
|
+
return result;
|
|
81
|
+
console.warn('@servicetitan/design-system: useKeyNav() provided with invalid `selectorOptions`', result);
|
|
82
|
+
return focusableSelector;
|
|
83
|
+
};
|
|
84
|
+
const nextIdx = (focusables, loop, key) => {
|
|
85
|
+
const current = focusables === null || focusables === void 0 ? void 0 : focusables.indexOf(active());
|
|
86
|
+
const last = (focusables === null || focusables === void 0 ? void 0 : focusables.length) - 1;
|
|
87
|
+
if (key === keys.home)
|
|
88
|
+
return 0;
|
|
89
|
+
if (key === keys.end)
|
|
90
|
+
return last;
|
|
91
|
+
if ([keys.down, keys.right].includes(key)) {
|
|
92
|
+
if (current === last)
|
|
93
|
+
return loop ? 0 : last;
|
|
94
|
+
return current + 1;
|
|
95
|
+
}
|
|
96
|
+
if ([keys.up, keys.left].includes(key)) {
|
|
97
|
+
if (current === 0)
|
|
98
|
+
return loop ? last : 0;
|
|
99
|
+
return current - 1;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
export const createId = () => {
|
|
103
|
+
const res = Math.round(Math.random() * 0xffffff).toString(16);
|
|
104
|
+
return res;
|
|
105
|
+
};
|
|
106
|
+
export const isInsideSameKeynav = (el, keynavId) => {
|
|
107
|
+
var _a;
|
|
108
|
+
const closest = el.closest('[data-keynav]');
|
|
109
|
+
return keynavId === ((_a = closest === null || closest === void 0 ? void 0 : closest.dataset) === null || _a === void 0 ? void 0 : _a.keynav);
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/hooks/useArrowNav/utils/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { useEffect, useCallback } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { getScopeElements, getFocusables, priorityFocusableSelector, } from './utils';
|
|
3
3
|
export const useAutoFocus = (props) => {
|
|
4
|
-
const { scope
|
|
4
|
+
const { scope, enabled = true } = props;
|
|
5
5
|
const autoFocus = useCallback(() => {
|
|
6
|
-
var _a, _b
|
|
6
|
+
var _a, _b;
|
|
7
7
|
if (!enabled)
|
|
8
8
|
return;
|
|
9
|
-
const
|
|
10
|
-
if (
|
|
9
|
+
const elements = getScopeElements(scope);
|
|
10
|
+
if (elements.length === 0)
|
|
11
11
|
return;
|
|
12
12
|
// Do not auto focus on wrappers, buttons and so on, if input exist
|
|
13
|
-
const priorityFocusable = (_a = getFocusables(
|
|
14
|
-
priorityFocusable
|
|
15
|
-
? priorityFocusable
|
|
16
|
-
: (
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}, [enabled, initialScope]); // eslint-disable-line
|
|
13
|
+
const priorityFocusable = (_a = getFocusables(elements, priorityFocusableSelector)) === null || _a === void 0 ? void 0 : _a.first;
|
|
14
|
+
const focusElement = priorityFocusable
|
|
15
|
+
? priorityFocusable
|
|
16
|
+
: (_b = getFocusables(elements)) === null || _b === void 0 ? void 0 : _b.first;
|
|
17
|
+
focusElement === null || focusElement === void 0 ? void 0 : focusElement.focus(preventScroll);
|
|
18
|
+
}, [enabled, scope]);
|
|
19
|
+
useEffect(autoFocus, [enabled, scope]); // eslint-disable-line
|
|
21
20
|
};
|
|
22
21
|
const preventScroll = { preventScroll: true };
|
|
23
22
|
//# sourceMappingURL=useAutoFocus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAutoFocus.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useAutoFocus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"useAutoFocus.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useAutoFocus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EACN,gBAAgB,EAChB,aAAa,EACb,yBAAyB,GACzB,MAAM,SAAS,CAAC;AAQjB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAwB,EAAE,EAAE;IACxD,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAExC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;;QAClC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,mEAAmE;QACnE,MAAM,iBAAiB,GAAG,MAAA,aAAa,CACtC,QAAQ,EACR,yBAAyB,CACzB,0CAAE,KAAK,CAAC;QAET,MAAM,YAAY,GAAG,iBAAiB;YACrC,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,MAAA,aAAa,CAAC,QAAQ,CAAC,0CAAE,KAAK,CAAC;QAElC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAErB,SAAS,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,sBAAsB;AAC/D,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { useEffect } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { getScopeElements, isInside } from './utils';
|
|
3
3
|
export const useDisableClickOutside = (props) => {
|
|
4
|
-
const { scope
|
|
4
|
+
const { scope, enabled = true, onClickOutside } = props;
|
|
5
5
|
useEffect(() => {
|
|
6
6
|
function handleClick(event) {
|
|
7
7
|
var _a, _b;
|
|
8
8
|
if (!enabled)
|
|
9
9
|
return;
|
|
10
10
|
const target = (_b = (_a = event.composedPath) === null || _a === void 0 ? void 0 : _a.call(event)[0]) !== null && _b !== void 0 ? _b : event.target;
|
|
11
|
-
const
|
|
11
|
+
const elements = getScopeElements(scope);
|
|
12
12
|
// Suppress if inside current scope
|
|
13
|
-
if (isInside(
|
|
13
|
+
if (isInside(elements, target))
|
|
14
14
|
return; // How to prevent disabling on popovers?
|
|
15
15
|
event.stopPropagation();
|
|
16
16
|
event.preventDefault();
|
|
@@ -23,6 +23,6 @@ export const useDisableClickOutside = (props) => {
|
|
|
23
23
|
document === null || document === void 0 ? void 0 : document.removeEventListener('mousedown', handleClick);
|
|
24
24
|
document === null || document === void 0 ? void 0 : document.removeEventListener('touchstart', handleClick);
|
|
25
25
|
};
|
|
26
|
-
}, [
|
|
26
|
+
}, [enabled, scope, onClickOutside]);
|
|
27
27
|
};
|
|
28
28
|
//# sourceMappingURL=useDisableClickOutside.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDisableClickOutside.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useDisableClickOutside.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useDisableClickOutside.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useDisableClickOutside.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AASrD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAkC,EAAE,EAAE;IAC5E,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACd,SAAS,WAAW,CAAC,KAAU;;YAC9B,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,MAAM,MAAM,GAAG,MAAA,MAAA,KAAK,CAAC,YAAY,+CAAlB,KAAK,EAAkB,CAAC,CAAC,mCAAI,KAAK,CAAC,MAAM,CAAC;YACzD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAEzC,mCAAmC;YACnC,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAAE,OAAO,CAAC,wCAAwC;YAEhF,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,cAAc;gBAAE,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACrD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACtD,OAAO,GAAG,EAAE;YACX,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACxD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC1D,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { useEffect } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
// More proper name to be useTabLoop
|
|
2
|
+
import { getScopeElements, isInside, tabIndexInside, focusNext, focusPrev, handleFocusablesUnmount, cleanFocusLockMarkers, setFocusLockMarkers, } from './utils';
|
|
4
3
|
export const useFocusLock = (props) => {
|
|
5
4
|
const { scope: initialScope, enabled = true } = props;
|
|
6
5
|
useEffect(() => {
|
|
7
6
|
if (!enabled) {
|
|
8
|
-
cleanFocusLockMarkers(
|
|
7
|
+
cleanFocusLockMarkers(getScopeElements(initialScope));
|
|
9
8
|
return;
|
|
10
9
|
}
|
|
11
|
-
setFocusLockMarkers(
|
|
10
|
+
setFocusLockMarkers(getScopeElements(initialScope));
|
|
12
11
|
// Warning in case tabIndex was set inside FocusLock
|
|
13
12
|
if (tabIndexInside(initialScope))
|
|
14
13
|
console.warn('@servicetitan/design-system: (FocusTrap) Avoid using tabIndex values greater than 0. Instead put elements in a logical sequence.');
|
|
@@ -17,7 +16,7 @@ export const useFocusLock = (props) => {
|
|
|
17
16
|
const shift = event.shiftKey;
|
|
18
17
|
if (!tab)
|
|
19
18
|
return; // Exit fast if no Tab key was pressed
|
|
20
|
-
const scope =
|
|
19
|
+
const scope = getScopeElements(initialScope);
|
|
21
20
|
if (scope.length === 0)
|
|
22
21
|
return;
|
|
23
22
|
// Prevent focus management if Tab happens outside or over nested useFocusLock
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFocusLock.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useFocusLock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlC,OAAO,EACN,
|
|
1
|
+
{"version":3,"file":"useFocusLock.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useFocusLock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlC,OAAO,EACN,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,GACnB,MAAM,SAAS,CAAC;AAOjB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAqB,EAAE,EAAE;IACrD,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,OAAO,EAAE;YACb,qBAAqB,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;YACtD,OAAO;SACP;QAED,mBAAmB,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;QAEpD,oDAAoD;QACpD,IAAI,cAAc,CAAC,YAAY,CAAC;YAC/B,OAAO,CAAC,IAAI,CACX,kIAAkI,CAClI,CAAC;QAEH,MAAM,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;YAChC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;YAE7B,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,sCAAsC;YAExD,MAAM,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAE7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAE/B,8EAA8E;YAC9E,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;gBAAE,OAAO;YAE3C,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,6FAA6F;YAE7H,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;gBAClB,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACxB,OAAO;aACP;YACD,IAAI,GAAG,IAAI,KAAK,EAAE;gBACjB,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aACxB;QACF,CAAC,CAAC;QAEF,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjD,OAAO,GAAG,EAAE,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { active } from './utils';
|
|
2
3
|
export const useRestoreFocus = ({ enabled = true }) => {
|
|
3
4
|
const prevActiveRef = useRef(null);
|
|
4
5
|
useEffect(() => {
|
|
5
6
|
if (!enabled)
|
|
6
7
|
return;
|
|
7
|
-
|
|
8
|
+
if (active() !== (document === null || document === void 0 ? void 0 : document.body))
|
|
9
|
+
prevActiveRef.current = active();
|
|
10
|
+
// Focus previously active element on unmount
|
|
8
11
|
return () => { var _a; return (_a = prevActiveRef.current) === null || _a === void 0 ? void 0 : _a.focus(preventScroll); };
|
|
9
12
|
}, [enabled]);
|
|
10
13
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRestoreFocus.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useRestoreFocus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useRestoreFocus.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/useRestoreFocus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,EAAE,EAAE;IACrD,MAAM,aAAa,GAAG,MAAM,CAAM,IAAI,CAAC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,MAAM,EAAE,MAAK,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAA;YAAE,aAAa,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;QAElE,6CAA6C;QAC7C,OAAO,GAAG,EAAE,WAAC,OAAA,MAAA,aAAa,CAAC,OAAO,0CAAE,KAAK,CAAC,aAAa,CAAC,CAAA,EAAA,CAAC;IAC1D,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { FocusTrapShards } from '../';
|
|
2
|
-
export declare const focusableSelector
|
|
2
|
+
export declare const focusableSelector: string;
|
|
3
3
|
export declare const priorityFocusableSelector = "input, textarea";
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const active: () => HTMLElement;
|
|
5
|
+
export declare const getScopeElements: (shards: FocusTrapShards) => HTMLElement[];
|
|
5
6
|
export declare const queryOnScope: (scope: HTMLElement | HTMLElement[], selector: string) => HTMLElement[];
|
|
6
7
|
export declare const getFocusables: (scope: HTMLElement | HTMLElement[], selector?: string) => {
|
|
7
8
|
focusables: HTMLElement[];
|
|
@@ -18,6 +19,9 @@ export declare const shardsUtils: (initialScope: HTMLElement | HTMLElement[]) =>
|
|
|
18
19
|
};
|
|
19
20
|
export declare const focusNext: (scope: HTMLElement | HTMLElement[], event?: React.KeyboardEvent<HTMLElement>) => void;
|
|
20
21
|
export declare const focusPrev: (scope: HTMLElement | HTMLElement[], event?: React.KeyboardEvent<HTMLElement>) => void;
|
|
22
|
+
export declare const toArray: (obj: any) => any[];
|
|
23
|
+
export declare const prevIdx: (array: any[], current: number) => number;
|
|
24
|
+
export declare const nextIdx: (array: any[], current: number) => number;
|
|
21
25
|
export declare const handleFocusablesUnmount: (scope: HTMLElement[]) => void;
|
|
22
26
|
export declare const setFocusLockMarkers: (scope: HTMLElement[]) => void;
|
|
23
27
|
export declare const cleanFocusLockMarkers: (scope: HTMLElement[]) => void;
|
|
@@ -1,7 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
const focusableElements = [
|
|
2
|
+
'input:not([disabled]):not([type=hidden])',
|
|
3
|
+
'select:not([disabled])',
|
|
4
|
+
'textarea:not([disabled])',
|
|
5
|
+
'button:not([disabled])',
|
|
6
|
+
'a[href]',
|
|
7
|
+
'area[href]',
|
|
8
|
+
'summary',
|
|
9
|
+
'iframe',
|
|
10
|
+
'object',
|
|
11
|
+
'embed',
|
|
12
|
+
'audio[controls]',
|
|
13
|
+
'video[controls]',
|
|
14
|
+
'[contenteditable]',
|
|
15
|
+
'[tabindex]:not([disabled]):not([tabindex="-1"])',
|
|
16
|
+
];
|
|
17
|
+
export const focusableSelector = focusableElements.join(':not([hidden]):not([tabindex="-1"]),');
|
|
2
18
|
export const priorityFocusableSelector = 'input, textarea';
|
|
3
|
-
const active = () => document === null || document === void 0 ? void 0 : document.activeElement;
|
|
4
|
-
export const
|
|
19
|
+
export const active = () => document === null || document === void 0 ? void 0 : document.activeElement;
|
|
20
|
+
export const getScopeElements = (shards) => {
|
|
5
21
|
if (!shards)
|
|
6
22
|
return [];
|
|
7
23
|
return toArray(shards)
|
|
@@ -17,17 +33,16 @@ const queryOnElement = (el, selector) => {
|
|
|
17
33
|
result = result.concat(Array.from(nodeList));
|
|
18
34
|
return result.length > 0 ? result : null;
|
|
19
35
|
};
|
|
36
|
+
// True if `display: none`, etc.
|
|
37
|
+
const isHidden = (el) => !(el === null || el === void 0 ? void 0 : el.offsetWidth) || !(el === null || el === void 0 ? void 0 : el.offsetHeight);
|
|
20
38
|
export const queryOnScope = (scope, selector) => {
|
|
21
|
-
let targetElements =
|
|
22
|
-
scope instanceof Array
|
|
23
|
-
? (targetElements = scope)
|
|
24
|
-
: (targetElements = [scope]);
|
|
39
|
+
let targetElements = toArray(scope);
|
|
25
40
|
if (targetElements.length === 0)
|
|
26
41
|
return null;
|
|
27
42
|
targetElements = targetElements
|
|
28
43
|
.map((el) => queryOnElement(el, selector))
|
|
29
44
|
.flat()
|
|
30
|
-
.filter((el) => el);
|
|
45
|
+
.filter((el) => !isHidden(el));
|
|
31
46
|
if (targetElements.length === 0)
|
|
32
47
|
return null;
|
|
33
48
|
return targetElements;
|
|
@@ -64,7 +79,7 @@ const isInsideNestedTrap = (scopeElement, target) => {
|
|
|
64
79
|
return found;
|
|
65
80
|
};
|
|
66
81
|
export const tabIndexInside = (scope) => {
|
|
67
|
-
return
|
|
82
|
+
return getScopeElements(scope).some((el) => getFocusables(el).focusables.some((e) => getTabIndex(e) > 0));
|
|
68
83
|
};
|
|
69
84
|
export const shardsUtils = (initialScope) => {
|
|
70
85
|
let currentShardIdx = 0;
|
|
@@ -111,13 +126,13 @@ export const focusPrev = (scope, event) => {
|
|
|
111
126
|
shards.lastPrevShard.focus();
|
|
112
127
|
}
|
|
113
128
|
};
|
|
114
|
-
const toArray = (obj) => (obj instanceof Array ? obj : [obj]);
|
|
115
|
-
const prevIdx = (array, current) => {
|
|
129
|
+
export const toArray = (obj) => (obj instanceof Array ? obj : [obj]);
|
|
130
|
+
export const prevIdx = (array, current) => {
|
|
116
131
|
if (current < 0)
|
|
117
132
|
return current;
|
|
118
133
|
return current === 0 ? array.length - 1 : current - 1;
|
|
119
134
|
};
|
|
120
|
-
const nextIdx = (array, current) => {
|
|
135
|
+
export const nextIdx = (array, current) => {
|
|
121
136
|
if (current < 0)
|
|
122
137
|
return current;
|
|
123
138
|
return current === array.length - 1 ? 0 : current + 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/hooks/useFocusTrap/internal/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,34 @@
|
|
|
1
1
|
import { useEffect, useState, useCallback } from 'react';
|
|
2
2
|
export const useFocusVisible = (target, onBlur, onFocus) => {
|
|
3
3
|
const [isFocusVisible, setIsFocusVisible] = useState(true);
|
|
4
|
-
const [
|
|
4
|
+
const [keyboardUser, setKeyboardUser] = useState(true);
|
|
5
5
|
const [focused, setFocused] = useState(false);
|
|
6
6
|
const focusFunction = (event) => {
|
|
7
|
-
|
|
8
|
-
onFocus(event);
|
|
7
|
+
onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
|
|
9
8
|
setIsFocusVisible(true);
|
|
10
9
|
setFocused(true);
|
|
11
10
|
};
|
|
12
11
|
const blurFunction = (event) => {
|
|
13
|
-
|
|
14
|
-
onBlur(event);
|
|
12
|
+
onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
|
|
15
13
|
setIsFocusVisible(false);
|
|
16
14
|
setFocused(false);
|
|
17
15
|
};
|
|
18
16
|
useEffect(() => {
|
|
19
|
-
setIsFocusVisible(
|
|
20
|
-
}, [focused,
|
|
17
|
+
setIsFocusVisible(keyboardUser);
|
|
18
|
+
}, [focused, keyboardUser]);
|
|
21
19
|
// KeyboardEvent
|
|
22
20
|
const keyboardEventHandler = useCallback(() => {
|
|
23
|
-
|
|
21
|
+
setKeyboardUser(true);
|
|
24
22
|
}, []);
|
|
25
23
|
// MouseEvent
|
|
26
24
|
const mouseEventHandler = useCallback(() => {
|
|
27
|
-
|
|
25
|
+
setKeyboardUser(false);
|
|
28
26
|
}, []);
|
|
29
27
|
const useEvent = (event, callback) => {
|
|
30
28
|
useEffect(() => {
|
|
31
29
|
const { current } = target;
|
|
32
|
-
current.addEventListener(event, callback);
|
|
33
|
-
return () => current.removeEventListener(event, callback);
|
|
30
|
+
current === null || current === void 0 ? void 0 : current.addEventListener(event, callback);
|
|
31
|
+
return () => current === null || current === void 0 ? void 0 : current.removeEventListener(event, callback);
|
|
34
32
|
}, [event, callback]);
|
|
35
33
|
};
|
|
36
34
|
useEvent('mousedown', mouseEventHandler);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFocusVisible.js","sourceRoot":"","sources":["../../src/hooks/useFocusVisible.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,MAA4B,EAC5B,MAAuD,EACvD,OAAwD,EACvD,EAAE;IACH,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,aAAa,GAAG,CAAC,KAAoC,EAAE,EAAE;QAC9D,
|
|
1
|
+
{"version":3,"file":"useFocusVisible.js","sourceRoot":"","sources":["../../src/hooks/useFocusVisible.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,MAA4B,EAC5B,MAAuD,EACvD,OAAwD,EACvD,EAAE;IACH,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,aAAa,GAAG,CAAC,KAAoC,EAAE,EAAE;QAC9D,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,KAAK,CAAC,CAAC;QACjB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,KAAoC,EAAE,EAAE;QAC7D,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,KAAK,CAAC,CAAC;QAChB,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzB,UAAU,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAE5B,gBAAgB;IAChB,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7C,eAAe,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,aAAa;IACb,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,eAAe,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,QAAoB,EAAE,EAAE;QACxD,SAAS,CAAC,GAAG,EAAE;YACd,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC3B,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,GAAG,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAExC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACxD,CAAC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { FC } from 'react';
|
|
1
|
+
import React, { FC } from 'react';
|
|
2
2
|
import { CollapsibleListItem } from './CollapsibleListItem';
|
|
3
3
|
export interface CollapsibleListProps {
|
|
4
4
|
className?: string;
|
|
5
|
+
children?: React.ReactNode;
|
|
5
6
|
el?: any;
|
|
6
7
|
}
|
|
7
8
|
export interface CollapsibleList extends FC<CollapsibleListProps> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsibleList.js","sourceRoot":"","sources":["../../../src/internal/CollapsibleList/CollapsibleList.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAa,MAAM,OAAO,CAAC;AAClC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"CollapsibleList.js","sourceRoot":"","sources":["../../../src/internal/CollapsibleList/CollapsibleList.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAa,MAAM,OAAO,CAAC;AAClC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAavE,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,EAKhD,EAAE,EAAE;QAL4C,EAChD,QAAQ,EACR,SAAS,EACT,EAAE,EAAE,OAAO,GAAG,IAAI,OAElB,EADG,IAAI,cAJyC,+BAKhD,CADO;IAEP,MAAM,WAAW,GAAG,UAAU,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,CACnB,oBAAC,OAAO,kBACP,SAAS,EAAE,WAAW,0BACD,iBAAiB,IAClC,IAAI,GAEP,QAAQ,CACA,CACV,CAAC;IAEF,IAAI,OAAO;QACV,OAAO,CACN,oBAAC,WAAW,IACX,IAAI,EAAE,OAAO,CAAC,QAAQ,EACtB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,GAAG,EAAE,OAAO,CAAC,cAAc,IAE1B,WAAW,CACC,CACd,CAAC;IAEH,OAAO,WAAW,CAAC;AACpB,CAAC,CAAC;AAEF,eAAe,CAAC,IAAI,GAAG,mBAAmB,CAAC"}
|
|
@@ -19,25 +19,43 @@ export const CollapsibleListItem = (_a) => {
|
|
|
19
19
|
const collapsibleListRef = React.useRef(null);
|
|
20
20
|
const [expanded, setExpanded] = React.useState((collapsible === null || collapsible === void 0 ? void 0 : collapsible.expanded) || false);
|
|
21
21
|
const ListItemClasses = classnames('CollapsibleListItem', className, {
|
|
22
|
+
'CollapsibleListItem--expanded': collapsible && expanded,
|
|
23
|
+
'CollapsibleListItem--collapsed': collapsible && !expanded,
|
|
22
24
|
'cursor-pointer': collapsible,
|
|
23
25
|
});
|
|
24
26
|
const handleClick = (e) => {
|
|
25
27
|
var _a;
|
|
26
28
|
if ((_a = collapsibleListRef === null || collapsibleListRef === void 0 ? void 0 : collapsibleListRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))
|
|
27
|
-
return; // Prevent exapand/collapse on
|
|
29
|
+
return; // Prevent exapand/collapse on nested list items
|
|
30
|
+
e.preventDefault();
|
|
28
31
|
const { onClick } = rest;
|
|
29
32
|
if (collapsible)
|
|
30
33
|
setExpanded(!expanded);
|
|
31
34
|
if (onClick)
|
|
32
35
|
onClick(e);
|
|
33
36
|
};
|
|
37
|
+
const handleArrowKeypress = (e) => {
|
|
38
|
+
var _a;
|
|
39
|
+
if ((_a = collapsibleListRef === null || collapsibleListRef === void 0 ? void 0 : collapsibleListRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))
|
|
40
|
+
return;
|
|
41
|
+
if (collapsible) {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
if (e.key === keys.left && expanded)
|
|
44
|
+
setExpanded(false);
|
|
45
|
+
if (e.key === keys.right && !expanded)
|
|
46
|
+
setExpanded(true);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
34
49
|
const handleKeyDown = (e) => {
|
|
35
50
|
switch (e.key) {
|
|
36
51
|
case keys.space:
|
|
37
52
|
case keys.enter:
|
|
38
|
-
e.preventDefault();
|
|
39
53
|
handleClick(e);
|
|
40
54
|
break;
|
|
55
|
+
case keys.left: // Collapse
|
|
56
|
+
case keys.right: // Expand
|
|
57
|
+
handleArrowKeypress(e);
|
|
58
|
+
break;
|
|
41
59
|
}
|
|
42
60
|
};
|
|
43
61
|
// Appends CollapsibleList as a last element if CollapsibleItem
|