@openedx/paragon 22.12.0 → 22.14.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/Alert/_variables.scss +2 -1
- package/dist/Annotation/index.js.map +1 -1
- package/dist/Annotation/index.scss +6 -5
- package/dist/Avatar/index.js.map +1 -1
- package/dist/AvatarButton/index.js.map +1 -1
- package/dist/Breadcrumb/index.js.map +1 -1
- package/dist/Bubble/index.js +1 -0
- package/dist/Bubble/index.js.map +1 -1
- package/dist/Bubble/index.scss +3 -2
- package/dist/Button/deprecated/index.js.map +1 -1
- package/dist/Button/index.scss +19 -18
- package/dist/Card/CardCarousel/CardCarouselHeader.js +2 -2
- package/dist/Card/CardCarousel/CardCarouselHeader.js.map +1 -1
- package/dist/Card/CardFooter.js.map +1 -1
- package/dist/Card/CardHeader.js +1 -1
- package/dist/Card/CardHeader.js.map +1 -1
- package/dist/Card/CardImageCap.js.map +1 -1
- package/dist/Card/CardStatus.js.map +1 -1
- package/dist/Card/_variables.scss +3 -2
- package/dist/Card/index.js.map +1 -1
- package/dist/Card/index.scss +10 -9
- package/dist/Chip/ChipIcon.d.ts +1 -1
- package/dist/Chip/index.js +1 -0
- package/dist/Chip/index.js.map +1 -1
- package/dist/ChipCarousel/index.js.map +1 -1
- package/dist/Collapsible/index.js.map +1 -1
- package/dist/ColorPicker/index.js +1 -1
- package/dist/ColorPicker/index.js.map +1 -1
- package/dist/ColorPicker/index.scss +2 -1
- package/dist/DataTable/CollapsibleButtonGroup.js +2 -2
- package/dist/DataTable/CollapsibleButtonGroup.js.map +1 -1
- package/dist/DataTable/DropdownFilters.js +1 -1
- package/dist/DataTable/DropdownFilters.js.map +1 -1
- package/dist/DataTable/TableRow.js.map +1 -1
- package/dist/DataTable/filters/CheckboxFilter.js.map +1 -1
- package/dist/DataTable/filters/DropdownFilter.js.map +1 -1
- package/dist/DataTable/filters/MultiSelectDropdownFilter.js.map +1 -1
- package/dist/DataTable/filters/TextFilter.js.map +1 -1
- package/dist/DataTable/index.scss +14 -13
- package/dist/DataTable/utils/getVisibleColumns.js +1 -1
- package/dist/DataTable/utils/getVisibleColumns.js.map +1 -1
- package/dist/Dropdown/_variables.scss +2 -1
- package/dist/Dropdown/deprecated/DropdownMenu.js +15 -19
- package/dist/Dropdown/deprecated/DropdownMenu.js.map +1 -1
- package/dist/Dropdown/deprecated/index.js +1 -1
- package/dist/Dropdown/deprecated/index.js.map +1 -1
- package/dist/Dropdown/index.js.map +1 -1
- package/dist/Dropzone/DefaultContent.js.map +1 -1
- package/dist/Dropzone/UploadProgress.js.map +1 -1
- package/dist/Dropzone/index.scss +3 -2
- package/dist/Fieldset/index.js.map +1 -1
- package/dist/Form/FormAutosuggest.js +1 -1
- package/dist/Form/FormAutosuggest.js.map +1 -1
- package/dist/Form/FormControl.js.map +1 -1
- package/dist/Form/FormControlDecorator.js.map +1 -1
- package/dist/Form/FormGroupContext.d.ts +1 -1
- package/dist/Form/FormGroupContext.js.map +1 -1
- package/dist/Form/FormText.js.map +1 -1
- package/dist/Form/_index.scss +9 -7
- package/dist/Form/_variables.scss +4 -2
- package/dist/Form/fieldUtils.js.map +1 -1
- package/dist/Hyperlink/index.js +1 -0
- package/dist/Hyperlink/index.js.map +1 -1
- package/dist/Hyperlink/index.scss +3 -1
- package/dist/Icon/index.js.map +1 -1
- package/dist/IconButton/index.d.ts +13 -8
- package/dist/IconButton/index.js.map +1 -1
- package/dist/IconButtonToggle/index.js.map +1 -1
- package/dist/IconButtonToggle/index.scss +3 -1
- package/dist/Input/index.js.map +1 -1
- package/dist/InputSelect/index.js.map +1 -1
- package/dist/Layout/index.js.map +1 -1
- package/dist/ListBox/index.js.map +1 -1
- package/dist/ListBoxOption/index.js.map +1 -1
- package/dist/Menu/SelectMenu.js +1 -1
- package/dist/Menu/SelectMenu.js.map +1 -1
- package/dist/Menu/index.js +1 -1
- package/dist/Menu/index.js.map +1 -1
- package/dist/Modal/ModalContext.d.ts +1 -1
- package/dist/Modal/ModalDialog.d.ts +1 -1
- package/dist/Modal/ModalDialog.js.map +1 -1
- package/dist/Modal/ModalDialogBody.js +1 -1
- package/dist/Modal/ModalDialogBody.js.map +1 -1
- package/dist/Modal/ModalDialogHeroBackground.js.map +1 -1
- package/dist/Modal/ModalLayer.d.ts +3 -3
- package/dist/Modal/ModalLayer.js.map +1 -1
- package/dist/Modal/ModalPopup.js.map +1 -1
- package/dist/Modal/_ModalDialog.scss +3 -1
- package/dist/Modal/index.js +3 -1
- package/dist/Modal/index.js.map +1 -1
- package/dist/Modal/index.scss +3 -5
- package/dist/Nav/_mixins.scss +3 -1
- package/dist/Overlay/index.d.ts +2 -2
- package/dist/PageBanner/index.js.map +1 -1
- package/dist/PageBanner/index.scss +2 -1
- package/dist/Pagination/PaginationContext.js.map +1 -1
- package/dist/Pagination/index.js.map +1 -1
- package/dist/Popover/_variables.scss +2 -1
- package/dist/Popover/index.js.map +1 -1
- package/dist/ProductTour/Checkpoint.scss +9 -8
- package/dist/ProductTour/index.js +1 -1
- package/dist/ProductTour/index.js.map +1 -1
- package/dist/ProgressBar/index.js.map +1 -1
- package/dist/Scrollable/index.js +1 -1
- package/dist/Scrollable/index.js.map +1 -1
- package/dist/SearchField/SearchFieldAdvanced.js.map +1 -1
- package/dist/SearchField/index.scss +2 -1
- package/dist/SelectableBox/SelectableBoxSet.js.map +1 -1
- package/dist/Sheet/index.js.map +1 -1
- package/dist/Stack/index.js.map +1 -1
- package/dist/StatefulButton/index.js.map +1 -1
- package/dist/StatusAlert/index.js.map +1 -1
- package/dist/Stepper/StepperHeader.js +1 -1
- package/dist/Stepper/StepperHeader.js.map +1 -1
- package/dist/Stepper/StepperHeaderStep.js.map +1 -1
- package/dist/Sticky/index.js.map +1 -1
- package/dist/Table/_variables.scss +2 -1
- package/dist/Tabs/deprecated/index.js.map +1 -1
- package/dist/Tabs/index.js +1 -1
- package/dist/Tabs/index.js.map +1 -1
- package/dist/Toast/ToastContainer.scss +1 -1
- package/dist/Toast/index.scss +2 -2
- package/dist/Truncate/index.js +1 -1
- package/dist/Truncate/index.js.map +1 -1
- package/dist/ValidationFormGroup/index.js.map +1 -1
- package/dist/asInput/index.js.map +1 -1
- package/dist/hooks/useArrowKeyNavigationHook.d.ts +10 -0
- package/dist/hooks/{useArrowKeyNavigation.js → useArrowKeyNavigationHook.js} +13 -11
- package/dist/hooks/useArrowKeyNavigationHook.js.map +1 -0
- package/dist/hooks/useIndexOfLastVisibleChildHook.d.ts +12 -0
- package/dist/hooks/{useIndexOfLastVisibleChild.js → useIndexOfLastVisibleChildHook.js} +16 -12
- package/dist/hooks/useIndexOfLastVisibleChildHook.js.map +1 -0
- package/dist/hooks/useIsVisibleHook.d.ts +3 -0
- package/dist/hooks/{useIsVisible.js → useIsVisibleHook.js} +2 -2
- package/dist/hooks/useIsVisibleHook.js.map +1 -0
- package/dist/hooks/useToggleHook.d.ts +12 -0
- package/dist/hooks/useToggleHook.js +31 -0
- package/dist/hooks/useToggleHook.js.map +1 -0
- package/dist/hooks/useWindowSizeHook.d.ts +6 -0
- package/dist/hooks/{useWindowSize.js → useWindowSizeHook.js} +1 -1
- package/dist/hooks/useWindowSizeHook.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/paragon.css +1 -45
- package/dist/utils/newId.js.map +1 -1
- package/dist/withDeprecatedProps.js.map +1 -1
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/CHANGELOG.md +50 -0
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/LICENSE +7 -0
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/README.md +37 -0
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/dist/index.d.ts +20 -0
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/dist/index.js +79 -0
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/dist/index.js.map +1 -0
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/package.json +40 -0
- package/icons/node_modules/@svgr/babel-plugin-add-jsx-attribute/tsconfig.json +4 -0
- package/icons/package.json +1 -1
- package/package.json +12 -19
- package/scss/core/_exports.module.scss +7 -6
- package/scss/core/_functions.scss +9 -7
- package/scss/core/_typography.scss +2 -1
- package/scss/core/_utilities.scss +2 -1
- package/scss/core/_variables.scss +98 -95
- package/src/Alert/_variables.scss +2 -1
- package/src/Annotation/index.scss +6 -5
- package/src/Breadcrumb/Breadcrumb.test.jsx +3 -2
- package/src/Bubble/index.scss +3 -2
- package/src/Bubble/index.tsx +1 -0
- package/src/Button/deprecated/Button.test.jsx +6 -4
- package/src/Button/index.scss +19 -18
- package/src/Card/CardCarousel/tests/CardCarouselControls.test.jsx +6 -4
- package/src/Card/_variables.scss +3 -2
- package/src/Card/index.scss +10 -9
- package/src/Chip/index.tsx +1 -0
- package/src/Collapsible/Collapsible.test.jsx +15 -7
- package/src/ColorPicker/ColorPicker.test.jsx +9 -16
- package/src/ColorPicker/index.jsx +1 -1
- package/src/ColorPicker/index.scss +2 -1
- package/src/DataTable/CollapsibleButtonGroup.jsx +2 -2
- package/src/DataTable/DropdownFilters.jsx +1 -1
- package/src/DataTable/dataviews.mdx +1 -8
- package/src/DataTable/index.scss +14 -13
- package/src/DataTable/selection/tests/ControlledSelectHeader.test.jsx +6 -4
- package/src/DataTable/tests/BulkActions.test.jsx +2 -4
- package/src/DataTable/tests/DataViewToggle.test.jsx +3 -7
- package/src/DataTable/tests/DropdownFilters.test.jsx +1 -1
- package/src/DataTable/tests/TableActions.test.jsx +1 -1
- package/src/Dropdown/_variables.scss +2 -1
- package/src/Dropdown/deprecated/Dropdown.test.jsx +43 -27
- package/src/Dropzone/README.md +3 -3
- package/src/Dropzone/index.scss +3 -2
- package/src/Dropzone/tests/__snapshots__/Dropzone.test.jsx.snap +10 -1
- package/src/Form/FormAutosuggest.jsx +1 -1
- package/src/Form/FormGroupContext.tsx +1 -1
- package/src/Form/_index.scss +9 -7
- package/src/Form/_variables.scss +4 -2
- package/src/Form/tests/FormAutosuggest.test.jsx +76 -57
- package/src/Form/tests/FormCheckboxSet.test.jsx +3 -2
- package/src/Form/tests/FormControl.test.jsx +9 -6
- package/src/Form/tests/FormRadioSet.test.jsx +3 -2
- package/src/Hyperlink/index.scss +3 -1
- package/src/Hyperlink/index.tsx +1 -0
- package/src/IconButtonToggle/IconButtonToggle.test.jsx +3 -2
- package/src/IconButtonToggle/index.scss +3 -1
- package/src/ListBox/ListBox.test.jsx +8 -4
- package/src/Menu/Menu.test.jsx +15 -10
- package/src/Menu/SelectMenu.jsx +1 -1
- package/src/Menu/index.jsx +1 -1
- package/src/Modal/ModalDialogBody.jsx +1 -1
- package/src/Modal/_ModalDialog.scss +3 -1
- package/src/Modal/index.jsx +2 -0
- package/src/Modal/index.scss +3 -5
- package/src/Modal/tests/ModalLayer.test.tsx +3 -2
- package/src/Nav/_mixins.scss +3 -1
- package/src/OverflowScroll/data/tests/useOverflowScroll.test.jsx +1 -2
- package/src/OverflowScroll/data/tests/useOverflowScrollActions.test.jsx +1 -1
- package/src/OverflowScroll/data/tests/useOverflowScrollElementAttributes.test.jsx +1 -1
- package/src/OverflowScroll/data/tests/useOverflowScrollEventListeners.test.jsx +1 -2
- package/src/PageBanner/index.scss +2 -1
- package/src/Pagination/Pagination.test.jsx +36 -28
- package/src/Popover/_variables.scss +2 -1
- package/src/ProductTour/Checkpoint.scss +9 -8
- package/src/ProductTour/Checkpoint.test.jsx +3 -2
- package/src/ProductTour/ProductTour.test.jsx +11 -24
- package/src/ProductTour/index.jsx +1 -1
- package/src/Scrollable/Scrollable.test.jsx +2 -2
- package/src/Scrollable/index.jsx +1 -1
- package/src/SearchField/index.scss +2 -1
- package/src/SelectableBox/tests/SelectableBox.test.jsx +3 -2
- package/src/StatusAlert/StatusAlert.test.jsx +6 -2
- package/src/Stepper/StepperHeader.jsx +1 -1
- package/src/Stepper/tests/Stepper.test.jsx +1 -1
- package/src/Table/_variables.scss +2 -1
- package/src/Tabs/Tabs.test.jsx +1 -1
- package/src/Tabs/deprecated/Tabs.test.jsx +6 -4
- package/src/Tabs/index.jsx +1 -1
- package/src/Toast/ToastContainer.scss +1 -1
- package/src/Toast/index.scss +2 -2
- package/src/Truncate/index.jsx +1 -1
- package/src/hooks/tests/{useIndexOfLastVisibleChild.test.jsx → useIndexOfLastVisibleChild.test.tsx} +2 -2
- package/src/hooks/tests/{useToggle.test.jsx → useToggle.test.tsx} +2 -1
- package/src/hooks/{useArrowKeyNavigation.jsx → useArrowKeyNavigationHook.tsx} +41 -13
- package/src/hooks/{useIndexOfLastVisibleChild.jsx → useIndexOfLastVisibleChildHook.tsx} +22 -16
- package/src/hooks/{useIsVisible.jsx → useIsVisibleHook.tsx} +6 -3
- package/src/hooks/useToggleHook.tsx +42 -0
- package/src/hooks/{useWindowSize.jsx → useWindowSizeHook.tsx} +7 -2
- package/src/index.d.ts +5 -5
- package/src/index.js +5 -5
- package/dist/hooks/useArrowKeyNavigation.js.map +0 -1
- package/dist/hooks/useIndexOfLastVisibleChild.js.map +0 -1
- package/dist/hooks/useIsVisible.js.map +0 -1
- package/dist/hooks/useToggle.js +0 -38
- package/dist/hooks/useToggle.js.map +0 -1
- package/dist/hooks/useWindowSize.js.map +0 -1
- package/src/DataTable/tests/utils.js +0 -9
- package/src/hooks/useToggle.jsx +0 -37
- /package/src/hooks/tests/{useWindowSize.test.jsx → useWindowSize.test.tsx} +0 -0
package/src/Tabs/Tabs.test.jsx
CHANGED
|
@@ -6,7 +6,7 @@ import userEvent from '@testing-library/user-event';
|
|
|
6
6
|
import Tabs, { MORE_TAB_TEXT } from '.';
|
|
7
7
|
import Tab from './Tab';
|
|
8
8
|
|
|
9
|
-
jest.mock('../hooks/
|
|
9
|
+
jest.mock('../hooks/useIndexOfLastVisibleChildHook', () => ({
|
|
10
10
|
__esModule: true,
|
|
11
11
|
default: () => 0,
|
|
12
12
|
}));
|
|
@@ -37,14 +37,16 @@ describe('<Tabs />', () => {
|
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
describe('switches tab selection', () => {
|
|
40
|
-
it('on click', () => {
|
|
40
|
+
it('on click', async () => {
|
|
41
|
+
const user = userEvent.setup();
|
|
41
42
|
const { container } = render(<Tabs {...props} />);
|
|
42
43
|
const tabButtons = container.querySelectorAll('button');
|
|
43
44
|
|
|
44
|
-
tabButtons.
|
|
45
|
-
|
|
45
|
+
for (const [i, node] of tabButtons.entries()) {
|
|
46
|
+
// eslint-disable-next-line no-await-in-loop
|
|
47
|
+
await user.click(node);
|
|
46
48
|
tabSelectedAtIndex(i, container);
|
|
47
|
-
}
|
|
49
|
+
}
|
|
48
50
|
});
|
|
49
51
|
});
|
|
50
52
|
});
|
package/src/Tabs/index.jsx
CHANGED
|
@@ -11,7 +11,7 @@ import BaseTabs from 'react-bootstrap/Tabs';
|
|
|
11
11
|
import TabsDeprecated from './deprecated';
|
|
12
12
|
import Bubble from '../Bubble';
|
|
13
13
|
import Dropdown from '../Dropdown';
|
|
14
|
-
import useIndexOfLastVisibleChild from '../hooks/
|
|
14
|
+
import useIndexOfLastVisibleChild from '../hooks/useIndexOfLastVisibleChildHook';
|
|
15
15
|
import Tab from './Tab';
|
|
16
16
|
|
|
17
17
|
export const MORE_TAB_TEXT = 'More...';
|
package/src/Toast/index.scss
CHANGED
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
@media only screen and (
|
|
45
|
+
@media only screen and (width <= 768px) {
|
|
46
46
|
max-width: 100%;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
@media only screen and (
|
|
49
|
+
@media only screen and (width >= 768px) {
|
|
50
50
|
min-width: $toast-max-width;
|
|
51
51
|
max-width: $toast-max-width;
|
|
52
52
|
}
|
package/src/Truncate/index.jsx
CHANGED
|
@@ -3,7 +3,7 @@ import React, {
|
|
|
3
3
|
} from 'react';
|
|
4
4
|
import PropTypes from 'prop-types';
|
|
5
5
|
import { truncateLines } from './utils';
|
|
6
|
-
import useWindowSize from '../hooks/
|
|
6
|
+
import useWindowSize from '../hooks/useWindowSizeHook';
|
|
7
7
|
|
|
8
8
|
const DEFAULT_TRUNCATE_LINES = 1;
|
|
9
9
|
const DEFAULT_TRUNCATE_ELLIPSIS = '...';
|
package/src/hooks/tests/{useIndexOfLastVisibleChild.test.jsx → useIndexOfLastVisibleChild.test.tsx}
RENAMED
|
@@ -12,8 +12,8 @@ window.ResizeObserver = window.ResizeObserver
|
|
|
12
12
|
}));
|
|
13
13
|
|
|
14
14
|
function TestComponent() {
|
|
15
|
-
const [containerElementRef, setContainerElementRef] = React.useState(null);
|
|
16
|
-
const overflowElementRef = React.useRef(null);
|
|
15
|
+
const [containerElementRef, setContainerElementRef] = React.useState<HTMLDivElement | null>(null);
|
|
16
|
+
const overflowElementRef = React.useRef<HTMLDivElement>(null);
|
|
17
17
|
const indexOfLastVisibleChild = useIndexOfLastVisibleChild(containerElementRef, overflowElementRef.current);
|
|
18
18
|
|
|
19
19
|
return (
|
|
@@ -4,6 +4,7 @@ import { render, screen } from '@testing-library/react';
|
|
|
4
4
|
import userEvent from '@testing-library/user-event';
|
|
5
5
|
|
|
6
6
|
import { useToggle } from '../..';
|
|
7
|
+
import { ToggleHandlers } from '../useToggleHook';
|
|
7
8
|
|
|
8
9
|
const TOGGLE_IS_ON = 'on';
|
|
9
10
|
const TOGGLE_IS_OFF = 'off';
|
|
@@ -19,7 +20,7 @@ const resetHandlerMocks = () => {
|
|
|
19
20
|
};
|
|
20
21
|
|
|
21
22
|
// eslint-disable-next-line react/prop-types
|
|
22
|
-
function FakeComponent({ defaultIsOn, handlers }) {
|
|
23
|
+
function FakeComponent({ defaultIsOn, handlers }: { defaultIsOn: boolean, handlers: ToggleHandlers }) {
|
|
23
24
|
const [isOn, setOn, setOff, toggle] = useToggle(defaultIsOn, handlers);
|
|
24
25
|
|
|
25
26
|
return (
|
|
@@ -1,16 +1,28 @@
|
|
|
1
|
+
// Note: this file was renamed from 'useArrowKeyNavigation.tsx' to 'useArrowKeyNavigationHook.tsx' to fix
|
|
2
|
+
// some bugs in the Gatsby www site, where Webpack was getting the .tsx and .mdx
|
|
3
|
+
// files confused. Renaming this file allows us to keep the URLs of the docs site
|
|
4
|
+
// unchanged.
|
|
1
5
|
import { useRef, useEffect } from 'react';
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
7
|
+
interface HandleEnterArgs {
|
|
8
|
+
event: KeyboardEvent;
|
|
9
|
+
currentIndex: number;
|
|
10
|
+
activeElement: HTMLElement;
|
|
11
|
+
}
|
|
6
12
|
|
|
7
|
-
function handleEnter({ event, currentIndex, activeElement }) {
|
|
13
|
+
function handleEnter({ event, currentIndex, activeElement }: HandleEnterArgs) {
|
|
8
14
|
if (currentIndex === -1) { return; }
|
|
9
15
|
activeElement.click();
|
|
10
16
|
event.preventDefault();
|
|
11
17
|
}
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
interface HandleArrowKeyArgs {
|
|
20
|
+
event: KeyboardEvent;
|
|
21
|
+
currentIndex: number;
|
|
22
|
+
availableElements: NodeListOf<HTMLElement>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function handleArrowKey({ event, currentIndex, availableElements }: HandleArrowKeyArgs) {
|
|
14
26
|
// If the focus isn't in the container, focus on the first thing
|
|
15
27
|
if (currentIndex === -1) { availableElements[0].focus(); }
|
|
16
28
|
|
|
@@ -36,6 +48,13 @@ function handleArrowKey({ event, currentIndex, availableElements }) {
|
|
|
36
48
|
event.preventDefault();
|
|
37
49
|
}
|
|
38
50
|
|
|
51
|
+
interface HandleEventsArgs {
|
|
52
|
+
event: KeyboardEvent;
|
|
53
|
+
ignoredKeys?: string[];
|
|
54
|
+
parentNode: HTMLElement | undefined;
|
|
55
|
+
selectors?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
39
58
|
/**
|
|
40
59
|
* Implement arrow key navigation for the given parentNode
|
|
41
60
|
*/
|
|
@@ -44,7 +63,7 @@ function handleEvents({
|
|
|
44
63
|
ignoredKeys = [],
|
|
45
64
|
parentNode,
|
|
46
65
|
selectors = 'a,button,input',
|
|
47
|
-
}) {
|
|
66
|
+
}: HandleEventsArgs) {
|
|
48
67
|
if (!parentNode) { return; }
|
|
49
68
|
|
|
50
69
|
const { key } = event;
|
|
@@ -60,7 +79,7 @@ function handleEvents({
|
|
|
60
79
|
if (!parentNode.contains(activeElement)) { return; }
|
|
61
80
|
|
|
62
81
|
// Get the list of elements we're allowed to scroll through
|
|
63
|
-
const availableElements = parentNode.querySelectorAll(selectors);
|
|
82
|
+
const availableElements = parentNode.querySelectorAll<HTMLElement>(selectors);
|
|
64
83
|
|
|
65
84
|
// No elements are available to loop through.
|
|
66
85
|
if (!availableElements.length) { return; }
|
|
@@ -70,18 +89,27 @@ function handleEvents({
|
|
|
70
89
|
(availableElement) => availableElement === activeElement,
|
|
71
90
|
);
|
|
72
91
|
|
|
73
|
-
if (key === 'Enter') {
|
|
74
|
-
handleEnter({ event, currentIndex, activeElement });
|
|
92
|
+
if (key === 'Enter' && activeElement) {
|
|
93
|
+
handleEnter({ event, currentIndex, activeElement: activeElement as HTMLElement });
|
|
75
94
|
}
|
|
76
95
|
handleArrowKey({ event, currentIndex, availableElements });
|
|
77
96
|
}
|
|
78
97
|
|
|
79
|
-
export
|
|
80
|
-
|
|
81
|
-
|
|
98
|
+
export interface ArrowKeyNavProps {
|
|
99
|
+
/** e.g. 'a,button,input' */
|
|
100
|
+
selectors?: string;
|
|
101
|
+
ignoredKeys?: string[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* A React hook to enable arrow key navigation on a component.
|
|
106
|
+
*/
|
|
107
|
+
export default function useArrowKeyNavigation(props: ArrowKeyNavProps = {}) {
|
|
108
|
+
const { selectors, ignoredKeys } = props;
|
|
109
|
+
const parentNode = useRef<HTMLElement>();
|
|
82
110
|
|
|
83
111
|
useEffect(() => {
|
|
84
|
-
const eventHandler = (event) => {
|
|
112
|
+
const eventHandler = (event: KeyboardEvent) => {
|
|
85
113
|
handleEvents({
|
|
86
114
|
event, ignoredKeys, parentNode: parentNode.current, selectors,
|
|
87
115
|
});
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
// Note: this file was renamed from 'useIndexOfLastVisibleChild.tsx' to 'useIndexOfLastVisibleChildHook.tsx' to fix
|
|
2
|
+
// some bugs in the Gatsby www site, where Webpack was getting the .tsx and .mdx
|
|
3
|
+
// files confused. Renaming this file allows us to keep the URLs of the docs site
|
|
4
|
+
// unchanged.
|
|
1
5
|
import { useLayoutEffect, useState } from 'react';
|
|
2
6
|
|
|
3
7
|
/**
|
|
@@ -5,25 +9,32 @@ import { useLayoutEffect, useState } from 'react';
|
|
|
5
9
|
* that fits within its bounding rectangle. This is done by summing the widths
|
|
6
10
|
* of the children until they exceed the width of the container.
|
|
7
11
|
*
|
|
8
|
-
* @param {Element} containerElementRef - container element
|
|
9
|
-
* @param {Element} overflowElementRef - overflow element
|
|
10
|
-
*
|
|
11
12
|
* The hook returns the index of the last visible child.
|
|
13
|
+
*
|
|
14
|
+
* @param containerElementRef - container element
|
|
15
|
+
* @param overflowElementRef - overflow element
|
|
12
16
|
*/
|
|
13
|
-
const useIndexOfLastVisibleChild = (
|
|
17
|
+
const useIndexOfLastVisibleChild = (
|
|
18
|
+
containerElementRef: HTMLElement | null,
|
|
19
|
+
overflowElementRef: HTMLElement | null,
|
|
20
|
+
): number => {
|
|
14
21
|
const [indexOfLastVisibleChild, setIndexOfLastVisibleChild] = useState(-1);
|
|
15
22
|
|
|
16
23
|
useLayoutEffect(() => {
|
|
24
|
+
if (!containerElementRef) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
17
28
|
function updateLastVisibleChildIndex() {
|
|
18
29
|
// Get array of child nodes from NodeList form
|
|
19
|
-
const childNodesArr = Array.prototype.slice.call(containerElementRef
|
|
30
|
+
const childNodesArr = Array.prototype.slice.call(containerElementRef!.children);
|
|
20
31
|
const { nextIndexOfLastVisibleChild } = childNodesArr
|
|
21
32
|
// filter out the overflow element
|
|
22
33
|
.filter(childNode => childNode !== overflowElementRef)
|
|
23
34
|
// sum the widths to find the last visible element's index
|
|
24
35
|
.reduce((acc, childNode, index) => {
|
|
25
36
|
acc.sumWidth += childNode.getBoundingClientRect().width;
|
|
26
|
-
if (acc.sumWidth <= containerElementRef
|
|
37
|
+
if (acc.sumWidth <= containerElementRef!.getBoundingClientRect().width) {
|
|
27
38
|
acc.nextIndexOfLastVisibleChild = index;
|
|
28
39
|
}
|
|
29
40
|
return acc;
|
|
@@ -32,23 +43,18 @@ const useIndexOfLastVisibleChild = (containerElementRef, overflowElementRef) =>
|
|
|
32
43
|
// sometimes we'll show a dropdown with one item in it when it would fit,
|
|
33
44
|
// but allowing this case dramatically simplifies the calculations we need
|
|
34
45
|
// to do above.
|
|
35
|
-
sumWidth: overflowElementRef
|
|
46
|
+
sumWidth: overflowElementRef?.getBoundingClientRect().width ?? 0,
|
|
36
47
|
nextIndexOfLastVisibleChild: -1,
|
|
37
48
|
});
|
|
38
49
|
|
|
39
50
|
setIndexOfLastVisibleChild(nextIndexOfLastVisibleChild);
|
|
40
51
|
}
|
|
41
52
|
|
|
42
|
-
|
|
43
|
-
updateLastVisibleChildIndex();
|
|
44
|
-
|
|
45
|
-
const resizeObserver = new ResizeObserver(() => updateLastVisibleChildIndex());
|
|
46
|
-
resizeObserver.observe(containerElementRef);
|
|
47
|
-
|
|
48
|
-
return () => resizeObserver.disconnect();
|
|
49
|
-
}
|
|
53
|
+
updateLastVisibleChildIndex();
|
|
50
54
|
|
|
51
|
-
|
|
55
|
+
const resizeObserver = new ResizeObserver(() => updateLastVisibleChildIndex());
|
|
56
|
+
resizeObserver.observe(containerElementRef);
|
|
57
|
+
return () => resizeObserver.disconnect();
|
|
52
58
|
}, [containerElementRef, overflowElementRef]);
|
|
53
59
|
|
|
54
60
|
return indexOfLastVisibleChild;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { useRef, useState, useEffect } from 'react';
|
|
1
|
+
import React, { useRef, useState, useEffect } from 'react';
|
|
2
2
|
|
|
3
|
-
const useIsVisible = (defaultIsVisible = true)
|
|
4
|
-
|
|
3
|
+
const useIsVisible = (defaultIsVisible = true): [
|
|
4
|
+
isVisible: boolean,
|
|
5
|
+
sentinelRef: React.MutableRefObject<HTMLElement | null>,
|
|
6
|
+
] => {
|
|
7
|
+
const sentinelRef = useRef<HTMLElement | null>(null);
|
|
5
8
|
const [isVisible, setIsVisible] = useState(defaultIsVisible);
|
|
6
9
|
|
|
7
10
|
useEffect(() => {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Note: this file was renamed from 'useToggle.tsx' to 'useToggleHook.tsx' to fix
|
|
2
|
+
// some bugs in the Gatsby www site, where Webpack was getting the .tsx and .mdx
|
|
3
|
+
// files confused. Renaming this file allows us to keep the URLs of the docs site
|
|
4
|
+
// unchanged.
|
|
5
|
+
import { useState, useCallback } from 'react';
|
|
6
|
+
|
|
7
|
+
export type Toggler = [
|
|
8
|
+
isOn: boolean,
|
|
9
|
+
setOn: () => void,
|
|
10
|
+
setOff: () => void,
|
|
11
|
+
toggle: () => void,
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export interface ToggleHandlers {
|
|
15
|
+
handleToggleOn?: () => void;
|
|
16
|
+
handleToggleOff?: () => void;
|
|
17
|
+
handleToggle?: (newStatus: boolean) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default function useToggle(defaultIsOn = false, handlers: ToggleHandlers = {}): Toggler {
|
|
21
|
+
const { handleToggleOn, handleToggleOff, handleToggle } = handlers;
|
|
22
|
+
const [isOn, setIsOn] = useState(defaultIsOn);
|
|
23
|
+
|
|
24
|
+
const setOn = useCallback(() => {
|
|
25
|
+
setIsOn(true);
|
|
26
|
+
handleToggleOn?.();
|
|
27
|
+
handleToggle?.(true);
|
|
28
|
+
}, [handleToggleOn, handleToggle]);
|
|
29
|
+
|
|
30
|
+
const setOff = useCallback(() => {
|
|
31
|
+
setIsOn(false);
|
|
32
|
+
handleToggleOff?.();
|
|
33
|
+
handleToggle?.(false);
|
|
34
|
+
}, [handleToggleOff, handleToggle]);
|
|
35
|
+
|
|
36
|
+
const toggle = useCallback(() => {
|
|
37
|
+
const doToggle = isOn ? setOff : setOn;
|
|
38
|
+
doToggle();
|
|
39
|
+
}, [isOn, setOn, setOff]);
|
|
40
|
+
|
|
41
|
+
return [isOn, setOn, setOff, toggle];
|
|
42
|
+
}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { useState, useLayoutEffect } from 'react';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
export interface WindowSizeData {
|
|
4
|
+
width: number | undefined;
|
|
5
|
+
height: number | undefined;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function useWindowSize(): WindowSizeData {
|
|
4
9
|
// Initialize state with undefined width/height so server and client renders match
|
|
5
10
|
// Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
|
|
6
|
-
const [windowSize, setWindowSize] = useState({
|
|
11
|
+
const [windowSize, setWindowSize] = useState<WindowSizeData>({
|
|
7
12
|
width: undefined,
|
|
8
13
|
height: undefined,
|
|
9
14
|
});
|
package/src/index.d.ts
CHANGED
|
@@ -40,6 +40,11 @@ export { default as ModalLayer } from './Modal/ModalLayer';
|
|
|
40
40
|
export { default as Overlay, OverlayTrigger } from './Overlay';
|
|
41
41
|
export { default as Portal } from './Modal/Portal';
|
|
42
42
|
export { default as Tooltip } from './Tooltip';
|
|
43
|
+
export { default as useWindowSize, type WindowSizeData } from './hooks/useWindowSizeHook';
|
|
44
|
+
export { default as useToggle, type Toggler, type ToggleHandlers } from './hooks/useToggleHook';
|
|
45
|
+
export { default as useArrowKeyNavigation, type ArrowKeyNavProps } from './hooks/useArrowKeyNavigationHook';
|
|
46
|
+
export { default as useIndexOfLastVisibleChild } from './hooks/useIndexOfLastVisibleChildHook';
|
|
47
|
+
export { default as useIsVisible } from './hooks/useIsVisibleHook';
|
|
43
48
|
|
|
44
49
|
// // // // // // // // // // // // // // // // // // // // // // // // // // //
|
|
45
50
|
// Things that don't have types
|
|
@@ -187,11 +192,6 @@ export const Sticky: any; // from './Sticky';
|
|
|
187
192
|
export const SelectableBox: any; // from './SelectableBox';
|
|
188
193
|
export const breakpoints: any; // from './utils/breakpoints';
|
|
189
194
|
export const Variant: any; // from './utils/constants';
|
|
190
|
-
export const useWindowSize: any; // from './hooks/useWindowSize';
|
|
191
|
-
export const useToggle: any; // from './hooks/useToggle';
|
|
192
|
-
export const useArrowKeyNavigation: any; // from './hooks/useArrowKeyNavigation';
|
|
193
|
-
export const useIndexOfLastVisibleChild: any; // from './hooks/useIndexOfLastVisibleChild';
|
|
194
|
-
export const useIsVisible: any; // from './hooks/useIsVisible';
|
|
195
195
|
export const
|
|
196
196
|
OverflowScrollContext: any,
|
|
197
197
|
OverflowScroll: any,
|
package/src/index.js
CHANGED
|
@@ -40,6 +40,11 @@ export { default as ModalLayer } from './Modal/ModalLayer';
|
|
|
40
40
|
export { default as Overlay, OverlayTrigger } from './Overlay';
|
|
41
41
|
export { default as Portal } from './Modal/Portal';
|
|
42
42
|
export { default as Tooltip } from './Tooltip';
|
|
43
|
+
export { default as useWindowSize } from './hooks/useWindowSizeHook';
|
|
44
|
+
export { default as useToggle } from './hooks/useToggleHook';
|
|
45
|
+
export { default as useArrowKeyNavigation } from './hooks/useArrowKeyNavigationHook';
|
|
46
|
+
export { default as useIndexOfLastVisibleChild } from './hooks/useIndexOfLastVisibleChildHook';
|
|
47
|
+
export { default as useIsVisible } from './hooks/useIsVisibleHook';
|
|
43
48
|
|
|
44
49
|
// // // // // // // // // // // // // // // // // // // // // // // // // // //
|
|
45
50
|
// Things that don't have types
|
|
@@ -187,11 +192,6 @@ export { default as Sticky } from './Sticky';
|
|
|
187
192
|
export { default as SelectableBox } from './SelectableBox';
|
|
188
193
|
export { default as breakpoints } from './utils/breakpoints';
|
|
189
194
|
export { default as Variant } from './utils/constants';
|
|
190
|
-
export { default as useWindowSize } from './hooks/useWindowSize';
|
|
191
|
-
export { default as useToggle } from './hooks/useToggle';
|
|
192
|
-
export { default as useArrowKeyNavigation } from './hooks/useArrowKeyNavigation';
|
|
193
|
-
export { default as useIndexOfLastVisibleChild } from './hooks/useIndexOfLastVisibleChild';
|
|
194
|
-
export { default as useIsVisible } from './hooks/useIsVisible';
|
|
195
195
|
export {
|
|
196
196
|
OverflowScrollContext,
|
|
197
197
|
OverflowScroll,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useArrowKeyNavigation.js","names":["useRef","useEffect","handleEnter","_ref","event","currentIndex","activeElement","click","preventDefault","handleArrowKey","_ref2","availableElements","focus","nextElement","key","length","handleEvents","_ref3","ignoredKeys","parentNode","selectors","includes","document","contains","querySelectorAll","Array","from","findIndex","availableElement","useArrowKeyNavigation","props","eventHandler","current","addEventListener","removeEventListener"],"sources":["../../src/hooks/useArrowKeyNavigation.jsx"],"sourcesContent":["import { useRef, useEffect } from 'react';\n\n/**\n * A React hook to enable arrow key navigation on a component.\n */\n\nfunction handleEnter({ event, currentIndex, activeElement }) {\n if (currentIndex === -1) { return; }\n activeElement.click();\n event.preventDefault();\n}\n\nfunction handleArrowKey({ event, currentIndex, availableElements }) {\n // If the focus isn't in the container, focus on the first thing\n if (currentIndex === -1) { availableElements[0].focus(); }\n\n // Move the focus up or down. Wrap around ends of list.\n let nextElement;\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n nextElement = availableElements[(currentIndex + 1) % availableElements.length];\n }\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {\n nextElement = currentIndex - 1 < 0\n ? availableElements[currentIndex - 1 + availableElements.length]\n : availableElements[currentIndex - 1];\n }\n if (event.key === 'End') {\n nextElement = availableElements[availableElements.length - 1];\n }\n if (event.key === 'Home') {\n [nextElement] = availableElements;\n }\n\n nextElement?.focus();\n event.preventDefault();\n}\n\n/**\n * Implement arrow key navigation for the given parentNode\n */\nfunction handleEvents({\n event,\n ignoredKeys = [],\n parentNode,\n selectors = 'a,button,input',\n}) {\n if (!parentNode) { return; }\n\n const { key } = event;\n\n if (!['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft', 'Enter', 'Home', 'End'].includes(key)\n || ignoredKeys.includes(key)) {\n return;\n }\n\n const { activeElement } = document;\n\n // If we're not inside the container, don't do anything\n if (!parentNode.contains(activeElement)) { return; }\n\n // Get the list of elements we're allowed to scroll through\n const availableElements = parentNode.querySelectorAll(selectors);\n\n // No elements are available to loop through.\n if (!availableElements.length) { return; }\n\n // Which index is currently selected\n const currentIndex = Array.from(availableElements).findIndex(\n (availableElement) => availableElement === activeElement,\n );\n\n if (key === 'Enter') {\n handleEnter({ event, currentIndex, activeElement });\n }\n handleArrowKey({ event, currentIndex, availableElements });\n}\n\nexport default function useArrowKeyNavigation(props) {\n const { selectors, ignoredKeys } = props || {};\n const parentNode = useRef();\n\n useEffect(() => {\n const eventHandler = (event) => {\n handleEvents({\n event, ignoredKeys, parentNode: parentNode.current, selectors,\n });\n };\n\n document.addEventListener('keydown', eventHandler);\n\n return () => document.removeEventListener('keydown', eventHandler);\n }, [ignoredKeys, selectors]);\n\n return parentNode;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useIndexOfLastVisibleChild.js","names":["useLayoutEffect","useState","useIndexOfLastVisibleChild","containerElementRef","overflowElementRef","indexOfLastVisibleChild","setIndexOfLastVisibleChild","updateLastVisibleChildIndex","childNodesArr","Array","prototype","slice","call","children","nextIndexOfLastVisibleChild","filter","childNode","reduce","acc","index","sumWidth","getBoundingClientRect","width","resizeObserver","ResizeObserver","observe","disconnect","undefined"],"sources":["../../src/hooks/useIndexOfLastVisibleChild.jsx"],"sourcesContent":["import { useLayoutEffect, useState } from 'react';\n\n/**\n * This hook will find the index of the last child of a containing element\n * that fits within its bounding rectangle. This is done by summing the widths\n * of the children until they exceed the width of the container.\n *\n * @param {Element} containerElementRef - container element\n * @param {Element} overflowElementRef - overflow element\n *\n * The hook returns the index of the last visible child.\n */\nconst useIndexOfLastVisibleChild = (containerElementRef, overflowElementRef) => {\n const [indexOfLastVisibleChild, setIndexOfLastVisibleChild] = useState(-1);\n\n useLayoutEffect(() => {\n function updateLastVisibleChildIndex() {\n // Get array of child nodes from NodeList form\n const childNodesArr = Array.prototype.slice.call(containerElementRef.children);\n const { nextIndexOfLastVisibleChild } = childNodesArr\n // filter out the overflow element\n .filter(childNode => childNode !== overflowElementRef)\n // sum the widths to find the last visible element's index\n .reduce((acc, childNode, index) => {\n acc.sumWidth += childNode.getBoundingClientRect().width;\n if (acc.sumWidth <= containerElementRef.getBoundingClientRect().width) {\n acc.nextIndexOfLastVisibleChild = index;\n }\n return acc;\n }, {\n // Include the overflow element's width to begin with. Doing this means\n // sometimes we'll show a dropdown with one item in it when it would fit,\n // but allowing this case dramatically simplifies the calculations we need\n // to do above.\n sumWidth: overflowElementRef ? overflowElementRef.getBoundingClientRect().width : 0,\n nextIndexOfLastVisibleChild: -1,\n });\n\n setIndexOfLastVisibleChild(nextIndexOfLastVisibleChild);\n }\n\n if (containerElementRef) {\n updateLastVisibleChildIndex();\n\n const resizeObserver = new ResizeObserver(() => updateLastVisibleChildIndex());\n resizeObserver.observe(containerElementRef);\n\n return () => resizeObserver.disconnect();\n }\n\n return undefined;\n }, [containerElementRef, overflowElementRef]);\n\n return indexOfLastVisibleChild;\n};\n\nexport default useIndexOfLastVisibleChild;\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,QAAQ,QAAQ,OAAO;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,0BAA0B,GAAGA,CAACC,mBAAmB,EAAEC,kBAAkB,KAAK;EAC9E,MAAM,CAACC,uBAAuB,EAAEC,0BAA0B,CAAC,GAAGL,QAAQ,CAAC,CAAC,CAAC,CAAC;EAE1ED,eAAe,CAAC,MAAM;IACpB,SAASO,2BAA2BA,CAAA,EAAG;MACrC;MACA,MAAMC,aAAa,GAAGC,KAAK,CAACC,SAAS,CAACC,KAAK,CAACC,IAAI,CAACT,mBAAmB,CAACU,QAAQ,CAAC;MAC9E,MAAM;QAAEC;MAA4B,CAAC,GAAGN;MACtC;MAAA,CACCO,MAAM,CAACC,SAAS,IAAIA,SAAS,KAAKZ,kBAAkB;MACrD;MAAA,CACCa,MAAM,CAAC,CAACC,GAAG,EAAEF,SAAS,EAAEG,KAAK,KAAK;QACjCD,GAAG,CAACE,QAAQ,IAAIJ,SAAS,CAACK,qBAAqB,CAAC,CAAC,CAACC,KAAK;QACvD,IAAIJ,GAAG,CAACE,QAAQ,IAAIjB,mBAAmB,CAACkB,qBAAqB,CAAC,CAAC,CAACC,KAAK,EAAE;UACrEJ,GAAG,CAACJ,2BAA2B,GAAGK,KAAK;QACzC;QACA,OAAOD,GAAG;MACZ,CAAC,EAAE;QACD;QACA;QACA;QACA;QACAE,QAAQ,EAAEhB,kBAAkB,GAAGA,kBAAkB,CAACiB,qBAAqB,CAAC,CAAC,CAACC,KAAK,GAAG,CAAC;QACnFR,2BAA2B,EAAE,CAAC;MAChC,CAAC,CAAC;MAEJR,0BAA0B,CAACQ,2BAA2B,CAAC;IACzD;IAEA,IAAIX,mBAAmB,EAAE;MACvBI,2BAA2B,CAAC,CAAC;MAE7B,MAAMgB,cAAc,GAAG,IAAIC,cAAc,CAAC,MAAMjB,2BAA2B,CAAC,CAAC,CAAC;MAC9EgB,cAAc,CAACE,OAAO,CAACtB,mBAAmB,CAAC;MAE3C,OAAO,MAAMoB,cAAc,CAACG,UAAU,CAAC,CAAC;IAC1C;IAEA,OAAOC,SAAS;EAClB,CAAC,EAAE,CAACxB,mBAAmB,EAAEC,kBAAkB,CAAC,CAAC;EAE7C,OAAOC,uBAAuB;AAChC,CAAC;AAED,eAAeH,0BAA0B","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useIsVisible.js","names":["useRef","useState","useEffect","useIsVisible","defaultIsVisible","arguments","length","undefined","sentinelRef","isVisible","setIsVisible","current","observer","IntersectionObserver","entries","forEach","_ref","isIntersecting","observe","disconnect","e","isReferenceError","ReferenceError"],"sources":["../../src/hooks/useIsVisible.jsx"],"sourcesContent":["import { useRef, useState, useEffect } from 'react';\n\nconst useIsVisible = (defaultIsVisible = true) => {\n const sentinelRef = useRef();\n const [isVisible, setIsVisible] = useState(defaultIsVisible);\n\n useEffect(() => {\n try {\n if (sentinelRef.current) {\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(({ isIntersecting }) => {\n setIsVisible(isIntersecting);\n });\n }, {});\n observer.observe(sentinelRef.current);\n return () => {\n observer.disconnect();\n };\n }\n } catch (e) {\n const isReferenceError = e instanceof ReferenceError;\n if (!isReferenceError) {\n throw e;\n }\n // Do nothing if an intersection observer can't be created.\n }\n return () => {};\n }, []);\n\n return [isVisible, sentinelRef];\n};\n\nexport default useIsVisible;\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AAEnD,MAAMC,YAAY,GAAG,SAAAA,CAAA,EAA6B;EAAA,IAA5BC,gBAAgB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;EAC3C,MAAMG,WAAW,GAAGR,MAAM,CAAC,CAAC;EAC5B,MAAM,CAACS,SAAS,EAAEC,YAAY,CAAC,GAAGT,QAAQ,CAACG,gBAAgB,CAAC;EAE5DF,SAAS,CAAC,MAAM;IACd,IAAI;MACF,IAAIM,WAAW,CAACG,OAAO,EAAE;QACvB,MAAMC,QAAQ,GAAG,IAAIC,oBAAoB,CAAEC,OAAO,IAAK;UACrDA,OAAO,CAACC,OAAO,CAACC,IAAA,IAAwB;YAAA,IAAvB;cAAEC;YAAe,CAAC,GAAAD,IAAA;YACjCN,YAAY,CAACO,cAAc,CAAC;UAC9B,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,CAAC,CAAC;QACNL,QAAQ,CAACM,OAAO,CAACV,WAAW,CAACG,OAAO,CAAC;QACrC,OAAO,MAAM;UACXC,QAAQ,CAACO,UAAU,CAAC,CAAC;QACvB,CAAC;MACH;IACF,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV,MAAMC,gBAAgB,GAAGD,CAAC,YAAYE,cAAc;MACpD,IAAI,CAACD,gBAAgB,EAAE;QACrB,MAAMD,CAAC;MACT;MACA;IACF;IACA,OAAO,MAAM,CAAC,CAAC;EACjB,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO,CAACX,SAAS,EAAED,WAAW,CAAC;AACjC,CAAC;AAED,eAAeL,YAAY","ignoreList":[]}
|
package/dist/hooks/useToggle.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback } from 'react';
|
|
2
|
-
export default function useToggle(defaultIsOn) {
|
|
3
|
-
let handlers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
4
|
-
const {
|
|
5
|
-
handleToggleOn,
|
|
6
|
-
handleToggleOff,
|
|
7
|
-
handleToggle
|
|
8
|
-
} = handlers;
|
|
9
|
-
const [isOn, setIsOn] = useState(defaultIsOn || false);
|
|
10
|
-
const setOn = useCallback(() => {
|
|
11
|
-
setIsOn(true);
|
|
12
|
-
// istanbul ignore else
|
|
13
|
-
if (handleToggleOn) {
|
|
14
|
-
handleToggleOn();
|
|
15
|
-
}
|
|
16
|
-
// istanbul ignore else
|
|
17
|
-
if (handleToggle) {
|
|
18
|
-
handleToggle(true);
|
|
19
|
-
}
|
|
20
|
-
}, [handleToggleOn, handleToggle]);
|
|
21
|
-
const setOff = useCallback(() => {
|
|
22
|
-
setIsOn(false);
|
|
23
|
-
// istanbul ignore else
|
|
24
|
-
if (handleToggleOff) {
|
|
25
|
-
handleToggleOff();
|
|
26
|
-
}
|
|
27
|
-
// istanbul ignore else
|
|
28
|
-
if (handleToggle) {
|
|
29
|
-
handleToggle(false);
|
|
30
|
-
}
|
|
31
|
-
}, [handleToggleOff, handleToggle]);
|
|
32
|
-
const toggle = useCallback(() => {
|
|
33
|
-
const doToggle = isOn ? setOff : setOn;
|
|
34
|
-
doToggle();
|
|
35
|
-
}, [isOn, setOn, setOff]);
|
|
36
|
-
return [isOn, setOn, setOff, toggle];
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=useToggle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useToggle.js","names":["useState","useCallback","useToggle","defaultIsOn","handlers","arguments","length","undefined","handleToggleOn","handleToggleOff","handleToggle","isOn","setIsOn","setOn","setOff","toggle","doToggle"],"sources":["../../src/hooks/useToggle.jsx"],"sourcesContent":["import { useState, useCallback } from 'react';\n\nexport default function useToggle(defaultIsOn, handlers = {}) {\n const { handleToggleOn, handleToggleOff, handleToggle } = handlers;\n const [isOn, setIsOn] = useState(defaultIsOn || false);\n\n const setOn = useCallback(() => {\n setIsOn(true);\n // istanbul ignore else\n if (handleToggleOn) {\n handleToggleOn();\n }\n // istanbul ignore else\n if (handleToggle) {\n handleToggle(true);\n }\n }, [handleToggleOn, handleToggle]);\n\n const setOff = useCallback(() => {\n setIsOn(false);\n // istanbul ignore else\n if (handleToggleOff) {\n handleToggleOff();\n }\n // istanbul ignore else\n if (handleToggle) {\n handleToggle(false);\n }\n }, [handleToggleOff, handleToggle]);\n\n const toggle = useCallback(() => {\n const doToggle = isOn ? setOff : setOn;\n doToggle();\n }, [isOn, setOn, setOff]);\n\n return [isOn, setOn, setOff, toggle];\n}\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,WAAW,QAAQ,OAAO;AAE7C,eAAe,SAASC,SAASA,CAACC,WAAW,EAAiB;EAAA,IAAfC,QAAQ,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAC1D,MAAM;IAAEG,cAAc;IAAEC,eAAe;IAAEC;EAAa,CAAC,GAAGN,QAAQ;EAClE,MAAM,CAACO,IAAI,EAAEC,OAAO,CAAC,GAAGZ,QAAQ,CAACG,WAAW,IAAI,KAAK,CAAC;EAEtD,MAAMU,KAAK,GAAGZ,WAAW,CAAC,MAAM;IAC9BW,OAAO,CAAC,IAAI,CAAC;IACb;IACA,IAAIJ,cAAc,EAAE;MAClBA,cAAc,CAAC,CAAC;IAClB;IACA;IACA,IAAIE,YAAY,EAAE;MAChBA,YAAY,CAAC,IAAI,CAAC;IACpB;EACF,CAAC,EAAE,CAACF,cAAc,EAAEE,YAAY,CAAC,CAAC;EAElC,MAAMI,MAAM,GAAGb,WAAW,CAAC,MAAM;IAC/BW,OAAO,CAAC,KAAK,CAAC;IACd;IACA,IAAIH,eAAe,EAAE;MACnBA,eAAe,CAAC,CAAC;IACnB;IACA;IACA,IAAIC,YAAY,EAAE;MAChBA,YAAY,CAAC,KAAK,CAAC;IACrB;EACF,CAAC,EAAE,CAACD,eAAe,EAAEC,YAAY,CAAC,CAAC;EAEnC,MAAMK,MAAM,GAAGd,WAAW,CAAC,MAAM;IAC/B,MAAMe,QAAQ,GAAGL,IAAI,GAAGG,MAAM,GAAGD,KAAK;IACtCG,QAAQ,CAAC,CAAC;EACZ,CAAC,EAAE,CAACL,IAAI,EAAEE,KAAK,EAAEC,MAAM,CAAC,CAAC;EAEzB,OAAO,CAACH,IAAI,EAAEE,KAAK,EAAEC,MAAM,EAAEC,MAAM,CAAC;AACtC","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useWindowSize.js","names":["useState","useLayoutEffect","useWindowSize","windowSize","setWindowSize","width","undefined","height","handleResize","global","innerWidth","innerHeight","addEventListener","removeEventListener"],"sources":["../../src/hooks/useWindowSize.jsx"],"sourcesContent":["import { useState, useLayoutEffect } from 'react';\n\nfunction useWindowSize() {\n // Initialize state with undefined width/height so server and client renders match\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\n const [windowSize, setWindowSize] = useState({\n width: undefined,\n height: undefined,\n });\n\n useLayoutEffect(() => {\n // Handler to call on window resize\n function handleResize() {\n // Set window width/height to state\n setWindowSize({\n width: global.innerWidth,\n height: global.innerHeight,\n });\n }\n\n // Add event listener\n global.addEventListener('resize', handleResize);\n\n // Call handler right away so state gets updated with initial window size\n handleResize();\n\n // Remove event listener on cleanup\n return () => global.removeEventListener('resize', handleResize);\n }, []); // Empty array ensures that effect is only run on mount\n\n return windowSize;\n}\n\nexport default useWindowSize;\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,eAAe,QAAQ,OAAO;AAEjD,SAASC,aAAaA,CAAA,EAAG;EACvB;EACA;EACA,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGJ,QAAQ,CAAC;IAC3CK,KAAK,EAAEC,SAAS;IAChBC,MAAM,EAAED;EACV,CAAC,CAAC;EAEFL,eAAe,CAAC,MAAM;IACpB;IACA,SAASO,YAAYA,CAAA,EAAG;MACtB;MACAJ,aAAa,CAAC;QACZC,KAAK,EAAEI,MAAM,CAACC,UAAU;QACxBH,MAAM,EAAEE,MAAM,CAACE;MACjB,CAAC,CAAC;IACJ;;IAEA;IACAF,MAAM,CAACG,gBAAgB,CAAC,QAAQ,EAAEJ,YAAY,CAAC;;IAE/C;IACAA,YAAY,CAAC,CAAC;;IAEd;IACA,OAAO,MAAMC,MAAM,CAACI,mBAAmB,CAAC,QAAQ,EAAEL,YAAY,CAAC;EACjE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;;EAER,OAAOL,UAAU;AACnB;AAEA,eAAeD,aAAa","ignoreList":[]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { act } from 'react-dom/test-utils';
|
|
2
|
-
|
|
3
|
-
// eslint-disable-next-line import/prefer-default-export
|
|
4
|
-
export const waitForComponentToPaint = async (wrapper) => {
|
|
5
|
-
await act(async () => {
|
|
6
|
-
await new Promise(resolve => { setTimeout(resolve); });
|
|
7
|
-
wrapper.update();
|
|
8
|
-
});
|
|
9
|
-
};
|
package/src/hooks/useToggle.jsx
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback } from 'react';
|
|
2
|
-
|
|
3
|
-
export default function useToggle(defaultIsOn, handlers = {}) {
|
|
4
|
-
const { handleToggleOn, handleToggleOff, handleToggle } = handlers;
|
|
5
|
-
const [isOn, setIsOn] = useState(defaultIsOn || false);
|
|
6
|
-
|
|
7
|
-
const setOn = useCallback(() => {
|
|
8
|
-
setIsOn(true);
|
|
9
|
-
// istanbul ignore else
|
|
10
|
-
if (handleToggleOn) {
|
|
11
|
-
handleToggleOn();
|
|
12
|
-
}
|
|
13
|
-
// istanbul ignore else
|
|
14
|
-
if (handleToggle) {
|
|
15
|
-
handleToggle(true);
|
|
16
|
-
}
|
|
17
|
-
}, [handleToggleOn, handleToggle]);
|
|
18
|
-
|
|
19
|
-
const setOff = useCallback(() => {
|
|
20
|
-
setIsOn(false);
|
|
21
|
-
// istanbul ignore else
|
|
22
|
-
if (handleToggleOff) {
|
|
23
|
-
handleToggleOff();
|
|
24
|
-
}
|
|
25
|
-
// istanbul ignore else
|
|
26
|
-
if (handleToggle) {
|
|
27
|
-
handleToggle(false);
|
|
28
|
-
}
|
|
29
|
-
}, [handleToggleOff, handleToggle]);
|
|
30
|
-
|
|
31
|
-
const toggle = useCallback(() => {
|
|
32
|
-
const doToggle = isOn ? setOff : setOn;
|
|
33
|
-
doToggle();
|
|
34
|
-
}, [isOn, setOn, setOff]);
|
|
35
|
-
|
|
36
|
-
return [isOn, setOn, setOff, toggle];
|
|
37
|
-
}
|
|
File without changes
|