reshaped 3.8.0-canary.1 → 3.8.0-canary.11
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/CHANGELOG.md +97 -18
- package/dist/bundle.css +1 -1
- package/dist/bundle.d.ts +1 -1
- package/dist/bundle.js +11 -11
- package/dist/components/Accordion/AccordionControlled.js +1 -0
- package/dist/components/Actionable/Actionable.js +17 -3
- package/dist/components/Actionable/Actionable.module.css +1 -1
- package/dist/components/Actionable/Actionable.types.d.ts +15 -3
- package/dist/components/Actionable/tests/Actionable.stories.d.ts +13 -1
- package/dist/components/Actionable/tests/Actionable.stories.js +127 -7
- package/dist/components/Alert/tests/Alert.stories.d.ts +6 -5
- package/dist/components/Alert/tests/Alert.stories.js +15 -2
- package/dist/components/Autocomplete/Autocomplete.js +2 -2
- package/dist/components/Autocomplete/Autocomplete.types.d.ts +1 -1
- package/dist/components/Badge/Badge.module.css +1 -1
- package/dist/components/Badge/tests/Badge.stories.d.ts +5 -0
- package/dist/components/Badge/tests/Badge.stories.js +34 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.js +1 -0
- package/dist/components/Breadcrumbs/tests/Breadcrumbs.stories.d.ts +8 -4
- package/dist/components/Breadcrumbs/tests/Breadcrumbs.stories.js +57 -1
- package/dist/components/Button/Button.js +2 -2
- package/dist/components/Button/Button.types.d.ts +1 -1
- package/dist/components/Button/tests/Button.stories.d.ts +54 -12
- package/dist/components/Button/tests/Button.stories.js +725 -588
- package/dist/components/Calendar/CalendarMonth.js +1 -0
- package/dist/components/Card/Card.d.ts +1 -1
- package/dist/components/Card/Card.module.css +1 -1
- package/dist/components/Card/tests/Card.stories.d.ts +29 -7
- package/dist/components/Card/tests/Card.stories.js +110 -65
- package/dist/components/Carousel/Carousel.js +1 -0
- package/dist/components/Carousel/Carousel.module.css +1 -1
- package/dist/components/Checkbox/Checkbox.module.css +1 -1
- package/dist/components/Checkbox/tests/Checkbox.stories.d.ts +20 -4
- package/dist/components/Checkbox/tests/Checkbox.stories.js +150 -79
- package/dist/components/CheckboxGroup/tests/CheckboxGroup.stories.d.ts +9 -2
- package/dist/components/CheckboxGroup/tests/CheckboxGroup.stories.js +67 -35
- package/dist/components/Container/tests/Container.stories.d.ts +2 -0
- package/dist/components/Container/tests/Container.stories.js +14 -0
- package/dist/components/ContextMenu/tests/ContextMenu.stories.d.ts +10 -1
- package/dist/components/ContextMenu/tests/ContextMenu.stories.js +57 -13
- package/dist/components/Dismissible/tests/Dismissible.stories.d.ts +5 -0
- package/dist/components/Dismissible/tests/Dismissible.stories.js +30 -1
- package/dist/components/Divider/tests/Divider.stories.d.ts +8 -3
- package/dist/components/Divider/tests/Divider.stories.js +71 -41
- package/dist/components/DropdownMenu/DropdownMenu.js +4 -4
- package/dist/components/DropdownMenu/DropdownMenu.types.d.ts +2 -2
- package/dist/components/DropdownMenu/tests/DropdownMenu.stories.d.ts +35 -6
- package/dist/components/DropdownMenu/tests/DropdownMenu.stories.js +222 -115
- package/dist/components/DropdownMenu/tests/DropdownMenu.test.stories.d.ts +0 -15
- package/dist/components/DropdownMenu/tests/DropdownMenu.test.stories.js +0 -106
- package/dist/components/FileUpload/FileUpload.module.css +1 -1
- package/dist/components/Flyout/Flyout.module.css +1 -1
- package/dist/components/Flyout/Flyout.types.d.ts +7 -7
- package/dist/components/Flyout/FlyoutContent.js +4 -1
- package/dist/components/Flyout/FlyoutControlled.js +10 -3
- package/dist/components/Flyout/index.d.ts +1 -1
- package/dist/components/Flyout/tests/Flyout.stories.d.ts +8 -0
- package/dist/components/Flyout/tests/Flyout.stories.js +81 -33
- package/dist/components/Flyout/useFlyout.d.ts +1 -7
- package/dist/components/Flyout/useFlyout.js +5 -1
- package/dist/components/Flyout/utilities/calculatePosition.d.ts +3 -2
- package/dist/components/Flyout/utilities/calculatePosition.js +47 -22
- package/dist/components/Flyout/utilities/flyout.js +3 -2
- package/dist/components/Flyout/utilities/getPositionFallbacks.js +3 -3
- package/dist/components/Flyout/utilities/isFullyVisible.d.ts +0 -2
- package/dist/components/Flyout/utilities/isFullyVisible.js +5 -7
- package/dist/components/FormControl/FormControl.context.d.ts +1 -1
- package/dist/components/FormControl/tests/FormControl.stories.d.ts +2 -0
- package/dist/components/FormControl/tests/FormControl.stories.js +35 -0
- package/dist/components/Hidden/tests/Hidden.stories.d.ts +2 -0
- package/dist/components/Hidden/tests/Hidden.stories.js +9 -0
- package/dist/components/HiddenVisually/tests/HiddenVisually.stories.d.ts +2 -0
- package/dist/components/HiddenVisually/tests/HiddenVisually.stories.js +9 -0
- package/dist/components/Hotkey/tests/Hotkey.stories.d.ts +2 -0
- package/dist/components/Hotkey/tests/Hotkey.stories.js +15 -0
- package/dist/components/Icon/Icon.js +2 -2
- package/dist/components/Icon/Icon.types.d.ts +1 -1
- package/dist/components/Icon/tests/Icon.stories.d.ts +3 -0
- package/dist/components/Icon/tests/Icon.stories.js +29 -1
- package/dist/components/Link/Link.d.ts +1 -1
- package/dist/components/Link/Link.js +2 -2
- package/dist/components/Link/Link.types.d.ts +1 -1
- package/dist/components/Link/tests/Link.stories.d.ts +29 -6
- package/dist/components/Link/tests/Link.stories.js +141 -58
- package/dist/components/Link/tests/Link.test.stories.d.ts +1 -13
- package/dist/components/Link/tests/Link.test.stories.js +0 -76
- package/dist/components/Loader/tests/Loader.stories.d.ts +11 -2
- package/dist/components/Loader/tests/Loader.stories.js +52 -25
- package/dist/components/Loader/tests/Loader.test.stories.d.ts +0 -3
- package/dist/components/Loader/tests/Loader.test.stories.js +0 -21
- package/dist/components/MenuItem/MenuItem.js +2 -2
- package/dist/components/MenuItem/MenuItem.module.css +1 -1
- package/dist/components/MenuItem/MenuItem.types.d.ts +1 -1
- package/dist/components/MenuItem/tests/MenuItem.stories.d.ts +37 -7
- package/dist/components/MenuItem/tests/MenuItem.stories.js +218 -112
- package/dist/components/Modal/Modal.js +1 -1
- package/dist/components/Modal/Modal.module.css +1 -1
- package/dist/components/Modal/tests/Modal.stories.d.ts +49 -10
- package/dist/components/Modal/tests/Modal.stories.js +350 -210
- package/dist/components/Overlay/Overlay.js +2 -1
- package/dist/components/Overlay/tests/Overlay.stories.d.ts +15 -1
- package/dist/components/Overlay/tests/Overlay.stories.js +135 -1
- package/dist/components/Pagination/tests/Pagination.stories.d.ts +14 -1
- package/dist/components/Pagination/tests/Pagination.stories.js +93 -15
- package/dist/components/PinField/tests/PinField.stories.d.ts +1 -1
- package/dist/components/PinField/tests/PinField.stories.js +1 -1
- package/dist/components/Popover/Popover.js +2 -2
- package/dist/components/Popover/Popover.module.css +1 -1
- package/dist/components/Popover/Popover.types.d.ts +3 -1
- package/dist/components/Progress/tests/Progress.stories.d.ts +19 -4
- package/dist/components/Progress/tests/Progress.stories.js +85 -49
- package/dist/components/Radio/Radio.module.css +1 -1
- package/dist/components/Radio/tests/Radio.stories.d.ts +25 -4
- package/dist/components/Radio/tests/Radio.stories.js +147 -65
- package/dist/components/RadioGroup/tests/RadioGroup.stories.d.ts +9 -2
- package/dist/components/RadioGroup/tests/RadioGroup.stories.js +64 -38
- package/dist/components/Reshaped/Reshaped.css +1 -1
- package/dist/components/Scrim/tests/Scrim.stories.d.ts +10 -2
- package/dist/components/Scrim/tests/Scrim.stories.js +51 -31
- package/dist/components/ScrollArea/ScrollArea.module.css +1 -1
- package/dist/components/Select/Select.d.ts +8 -1
- package/dist/components/Select/Select.js +22 -48
- package/dist/components/Select/Select.module.css +1 -1
- package/dist/components/Select/Select.types.d.ts +83 -38
- package/dist/components/Select/SelectCustom.d.ts +3 -0
- package/dist/components/Select/SelectCustom.js +12 -0
- package/dist/components/Select/SelectCustomControlled.d.ts +4 -0
- package/dist/components/Select/SelectCustomControlled.js +105 -0
- package/dist/components/Select/SelectCustomUncontrolled.d.ts +4 -0
- package/dist/components/Select/SelectCustomUncontrolled.js +18 -0
- package/dist/components/Select/SelectEndContent.d.ts +3 -0
- package/dist/components/Select/SelectEndContent.js +12 -0
- package/dist/components/Select/SelectNative.d.ts +4 -0
- package/dist/components/Select/SelectNative.js +29 -0
- package/dist/components/Select/SelectOption.d.ts +4 -0
- package/dist/components/Select/SelectOption.js +13 -0
- package/dist/components/Select/SelectOptionGroup.d.ts +4 -0
- package/dist/components/Select/SelectOptionGroup.js +9 -0
- package/dist/components/Select/SelectRoot.d.ts +4 -0
- package/dist/components/Select/SelectRoot.js +21 -0
- package/dist/components/Select/SelectStartContent.d.ts +3 -0
- package/dist/components/Select/SelectStartContent.js +20 -0
- package/dist/components/Select/SelectTrigger.d.ts +4 -0
- package/dist/components/Select/SelectTrigger.js +16 -0
- package/dist/components/Select/tests/Select.stories.d.ts +38 -10
- package/dist/components/Select/tests/Select.stories.js +504 -175
- package/dist/components/Skeleton/tests/Skeleton.stories.d.ts +10 -2
- package/dist/components/Skeleton/tests/Skeleton.stories.js +46 -28
- package/dist/components/Slider/Slider.module.css +1 -1
- package/dist/components/Stepper/Stepper.js +2 -2
- package/dist/components/Stepper/Stepper.types.d.ts +2 -0
- package/dist/components/Stepper/tests/Stepper.stories.d.ts +18 -3
- package/dist/components/Stepper/tests/Stepper.stories.js +99 -47
- package/dist/components/Switch/Switch.module.css +1 -1
- package/dist/components/Switch/tests/Switch.stories.d.ts +10 -2
- package/dist/components/Switch/tests/Switch.stories.js +77 -23
- package/dist/components/Switch/tests/Switch.test.stories.d.ts +0 -10
- package/dist/components/Switch/tests/Switch.test.stories.js +0 -68
- package/dist/components/Table/Table.js +5 -3
- package/dist/components/Table/Table.module.css +1 -1
- package/dist/components/Table/tests/Table.stories.d.ts +25 -5
- package/dist/components/Table/tests/Table.stories.js +274 -177
- package/dist/components/Table/tests/Table.test.stories.d.ts +0 -5
- package/dist/components/Table/tests/Table.test.stories.js +0 -82
- package/dist/components/Tabs/Tabs.module.css +1 -1
- package/dist/components/Tabs/TabsControlled.js +1 -0
- package/dist/components/Text/Text.module.css +1 -1
- package/dist/components/TextArea/TextArea.module.css +1 -1
- package/dist/components/TextArea/tests/TextArea.stories.d.ts +41 -9
- package/dist/components/TextArea/tests/TextArea.stories.js +179 -93
- package/dist/components/TextField/TextField.js +1 -1
- package/dist/components/TextField/TextField.module.css +1 -1
- package/dist/components/TextField/tests/TextField.stories.d.ts +41 -11
- package/dist/components/TextField/tests/TextField.stories.js +206 -132
- package/dist/components/TextField/tests/TextField.test.stories.d.ts +0 -13
- package/dist/components/TextField/tests/TextField.test.stories.js +0 -88
- package/dist/components/Theme/Theme.module.css +1 -1
- package/dist/components/Timeline/Timeline.js +2 -2
- package/dist/components/Timeline/tests/Timeline.stories.d.ts +10 -2
- package/dist/components/Timeline/tests/Timeline.stories.js +69 -45
- package/dist/components/Timeline/tests/Timeline.test.stories.d.ts +0 -2
- package/dist/components/Timeline/tests/Timeline.test.stories.js +0 -21
- package/dist/components/Toast/ToastContainer.js +1 -0
- package/dist/components/Toast/ToastRegion.js +1 -0
- package/dist/components/Toast/tests/Toast.stories.d.ts +32 -8
- package/dist/components/Toast/tests/Toast.stories.js +111 -37
- package/dist/components/ToggleButton/ToggleButton.types.d.ts +1 -1
- package/dist/components/ToggleButtonGroup/ToggleButtonGroupControlled.js +1 -0
- package/dist/components/Tooltip/Tooltip.js +1 -1
- package/dist/components/Tooltip/Tooltip.types.d.ts +2 -2
- package/dist/components/Tooltip/tests/Tooltip.stories.d.ts +18 -4
- package/dist/components/Tooltip/tests/Tooltip.stories.js +139 -107
- package/dist/components/Tooltip/tests/Tooltip.test.stories.d.ts +0 -6
- package/dist/components/Tooltip/tests/Tooltip.test.stories.js +0 -29
- package/dist/components/View/View.js +11 -4
- package/dist/components/View/tests/View.stories.d.ts +4 -0
- package/dist/components/View/tests/View.stories.js +39 -0
- package/dist/components/_private/Expandable/Expandable.js +3 -1
- package/dist/components/_private/Portal/Portal.js +4 -1
- package/dist/hooks/_private/useIsDismissible.d.ts +1 -0
- package/dist/hooks/_private/useIsDismissible.js +6 -6
- package/dist/hooks/_private/usePrevious.js +1 -0
- package/dist/hooks/tests/useDrag.stories.js +1 -1
- package/dist/hooks/useOnClickOutside.js +0 -2
- package/dist/hooks/useScrollLock.js +5 -3
- package/dist/index.d.ts +1 -1
- package/dist/styles/resolvers/align/align.css +1 -1
- package/dist/styles/resolvers/aspectRatio/aspectRatio.css +1 -1
- package/dist/styles/resolvers/bleed/bleed.module.css +1 -1
- package/dist/styles/resolvers/justify/justify.css +1 -1
- package/dist/styles/resolvers/maxHeight/maxHeight.module.css +1 -1
- package/dist/styles/resolvers/maxWidth/maxWidth.module.css +1 -1
- package/dist/styles/resolvers/minHeight/minHeight.module.css +1 -1
- package/dist/styles/resolvers/minWidth/minWidth.module.css +1 -1
- package/dist/styles/resolvers/position/position.css +1 -1
- package/dist/styles/resolvers/textAlign/textAlign.css +1 -1
- package/dist/styles/resolvers/width/width.module.css +1 -1
- package/dist/utilities/scroll/disable.js +2 -2
- package/dist/utilities/scroll/index.d.ts +1 -1
- package/dist/utilities/scroll/index.js +1 -1
- package/dist/utilities/scroll/lock.d.ts +1 -2
- package/dist/utilities/scroll/lock.js +16 -15
- package/dist/utilities/scroll/lockSafari.js +1 -0
- package/package.json +23 -23
- package/dist/components/Actionable/tests/Actionable.test.stories.d.ts +0 -32
- package/dist/components/Actionable/tests/Actionable.test.stories.js +0 -130
- package/dist/components/Alert/tests/Alert.test.stories.d.ts +0 -15
- package/dist/components/Alert/tests/Alert.test.stories.js +0 -26
- package/dist/components/Badge/tests/Badge.test.stories.d.ts +0 -20
- package/dist/components/Badge/tests/Badge.test.stories.js +0 -46
- package/dist/components/Breadcrumbs/tests/Breadcrumbs.test.stories.d.ts +0 -23
- package/dist/components/Breadcrumbs/tests/Breadcrumbs.test.stories.js +0 -76
- package/dist/components/Button/tests/Button.test.stories.d.ts +0 -27
- package/dist/components/Button/tests/Button.test.stories.js +0 -112
- package/dist/components/Card/tests/Card.test.stories.d.ts +0 -35
- package/dist/components/Card/tests/Card.test.stories.js +0 -54
- package/dist/components/Checkbox/tests/Checkbox.test.stories.d.ts +0 -25
- package/dist/components/Checkbox/tests/Checkbox.test.stories.js +0 -104
- package/dist/components/CheckboxGroup/tests/CheckboxGroup.test.stories.d.ts +0 -22
- package/dist/components/CheckboxGroup/tests/CheckboxGroup.test.stories.js +0 -78
- package/dist/components/Container/tests/Container.test.stories.d.ts +0 -15
- package/dist/components/Container/tests/Container.test.stories.js +0 -26
- package/dist/components/ContextMenu/tests/ContextMenu.test.stories.d.ts +0 -25
- package/dist/components/ContextMenu/tests/ContextMenu.test.stories.js +0 -53
- package/dist/components/Dismissible/tests/Dismissible.test.stories.d.ts +0 -19
- package/dist/components/Dismissible/tests/Dismissible.test.stories.js +0 -42
- package/dist/components/Divider/tests/Divider.test.stories.d.ts +0 -18
- package/dist/components/Divider/tests/Divider.test.stories.js +0 -47
- package/dist/components/FormControl/tests/FormControl.test.stories.d.ts +0 -20
- package/dist/components/FormControl/tests/FormControl.test.stories.js +0 -49
- package/dist/components/Hidden/tests/Hidden.test.stories.d.ts +0 -15
- package/dist/components/Hidden/tests/Hidden.test.stories.js +0 -20
- package/dist/components/HiddenVisually/tests/HiddenVisually.test.stories.d.ts +0 -15
- package/dist/components/HiddenVisually/tests/HiddenVisually.test.stories.js +0 -20
- package/dist/components/Hotkey/tests/Hotkey.test.stories.d.ts +0 -15
- package/dist/components/Hotkey/tests/Hotkey.test.stories.js +0 -26
- package/dist/components/Icon/tests/Icon.test.stories.d.ts +0 -16
- package/dist/components/Icon/tests/Icon.test.stories.js +0 -35
- package/dist/components/MenuItem/tests/MenuItem.test.stories.d.ts +0 -26
- package/dist/components/MenuItem/tests/MenuItem.test.stories.js +0 -100
- package/dist/components/Modal/tests/Modal.test.stories.d.ts +0 -31
- package/dist/components/Modal/tests/Modal.test.stories.js +0 -149
- package/dist/components/Overlay/tests/Overlay.test.stories.d.ts +0 -28
- package/dist/components/Overlay/tests/Overlay.test.stories.js +0 -148
- package/dist/components/Pagination/tests/Pagination.test.stories.d.ts +0 -23
- package/dist/components/Pagination/tests/Pagination.test.stories.js +0 -86
- package/dist/components/Progress/tests/Progress.test.stories.d.ts +0 -16
- package/dist/components/Progress/tests/Progress.test.stories.js +0 -35
- package/dist/components/Radio/tests/Radio.test.stories.d.ts +0 -30
- package/dist/components/Radio/tests/Radio.test.stories.js +0 -118
- package/dist/components/RadioGroup/tests/RadioGroup.test.stories.d.ts +0 -22
- package/dist/components/RadioGroup/tests/RadioGroup.test.stories.js +0 -78
- package/dist/components/Scrim/tests/Scrim.test.stories.d.ts +0 -15
- package/dist/components/Scrim/tests/Scrim.test.stories.js +0 -25
- package/dist/components/Select/tests/Select.test.stories.d.ts +0 -27
- package/dist/components/Select/tests/Select.test.stories.js +0 -132
- package/dist/components/Skeleton/tests/Skeleton.test.stories.d.ts +0 -15
- package/dist/components/Skeleton/tests/Skeleton.test.stories.js +0 -23
- package/dist/components/Stepper/tests/Stepper.test.stories.d.ts +0 -20
- package/dist/components/Stepper/tests/Stepper.test.stories.js +0 -28
- package/dist/components/TextArea/tests/TextArea.test.stories.d.ts +0 -28
- package/dist/components/TextArea/tests/TextArea.test.stories.js +0 -99
- package/dist/components/Toast/tests/Toast.test.stories.d.ts +0 -16
- package/dist/components/Toast/tests/Toast.test.stories.js +0 -101
- package/dist/components/View/tests/View.test.stories.d.ts +0 -24
- package/dist/components/View/tests/View.test.stories.js +0 -50
@@ -4,6 +4,8 @@ import DropdownMenu from "../index.js";
|
|
4
4
|
import View from "../../View/index.js";
|
5
5
|
import { useTheme } from "../../Theme/useTheme.js";
|
6
6
|
import IconCheckmark from "../../../icons/Checkmark.js";
|
7
|
+
import { expect, fn, userEvent, waitFor, within } from "storybook/test";
|
8
|
+
import { sleep } from "../../../utilities/helpers.js";
|
7
9
|
export default {
|
8
10
|
title: "Components/DropdownMenu",
|
9
11
|
component: DropdownMenu,
|
@@ -13,125 +15,227 @@ export default {
|
|
13
15
|
},
|
14
16
|
},
|
15
17
|
};
|
16
|
-
export const position =
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<DropdownMenu.
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
export const position = {
|
19
|
+
name: "position",
|
20
|
+
render: () => (<Example>
|
21
|
+
<Example.Item title="position: default">
|
22
|
+
<DropdownMenu>
|
23
|
+
<DropdownMenu.Trigger>
|
24
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
25
|
+
</DropdownMenu.Trigger>
|
26
|
+
<DropdownMenu.Content>
|
27
|
+
<DropdownMenu.Item icon={IconCheckmark}>Item 1</DropdownMenu.Item>
|
28
|
+
<DropdownMenu.Item icon={IconCheckmark}>Item 2</DropdownMenu.Item>
|
29
|
+
</DropdownMenu.Content>
|
30
|
+
</DropdownMenu>
|
31
|
+
</Example.Item>
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
<Example.Item title="position: end">
|
34
|
+
<DropdownMenu position="end">
|
35
|
+
<DropdownMenu.Trigger>
|
36
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
37
|
+
</DropdownMenu.Trigger>
|
38
|
+
<DropdownMenu.Content>
|
39
|
+
<DropdownMenu.Item icon={IconCheckmark}>Item 1</DropdownMenu.Item>
|
40
|
+
<DropdownMenu.Item icon={IconCheckmark}>Item 2</DropdownMenu.Item>
|
41
|
+
</DropdownMenu.Content>
|
42
|
+
</DropdownMenu>
|
43
|
+
</Example.Item>
|
40
44
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
45
|
+
<Example.Item title={["position: top-start", "should change to top-start to fit viewport"]}>
|
46
|
+
<DropdownMenu position="top-end">
|
47
|
+
<DropdownMenu.Trigger>
|
48
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
49
|
+
</DropdownMenu.Trigger>
|
50
|
+
<DropdownMenu.Content>
|
51
|
+
<DropdownMenu.Item icon={IconCheckmark}>Item 1</DropdownMenu.Item>
|
52
|
+
<DropdownMenu.Item icon={IconCheckmark}>Item 2</DropdownMenu.Item>
|
53
|
+
</DropdownMenu.Content>
|
54
|
+
</DropdownMenu>
|
55
|
+
</Example.Item>
|
56
|
+
<div style={{ height: 2000 }}/>
|
57
|
+
</Example>),
|
58
|
+
};
|
59
|
+
export const sections = {
|
60
|
+
name: "sections",
|
61
|
+
render: () => (<Example>
|
62
|
+
<Example.Item title="2 sections">
|
63
|
+
<DropdownMenu>
|
64
|
+
<DropdownMenu.Trigger>
|
65
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
66
|
+
</DropdownMenu.Trigger>
|
67
|
+
<DropdownMenu.Content>
|
68
|
+
<DropdownMenu.Section>
|
69
|
+
<DropdownMenu.Item>Item 1</DropdownMenu.Item>
|
70
|
+
<DropdownMenu.Item>Item 2</DropdownMenu.Item>
|
71
|
+
</DropdownMenu.Section>
|
65
72
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
<DropdownMenu.
|
85
|
-
|
86
|
-
<DropdownMenu.Item
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
<DropdownMenu.Item
|
94
|
-
|
95
|
-
|
73
|
+
<DropdownMenu.Section>
|
74
|
+
<DropdownMenu.Item>Item 3</DropdownMenu.Item>
|
75
|
+
<DropdownMenu.Item>Item 4</DropdownMenu.Item>
|
76
|
+
</DropdownMenu.Section>
|
77
|
+
</DropdownMenu.Content>
|
78
|
+
</DropdownMenu>
|
79
|
+
</Example.Item>
|
80
|
+
</Example>),
|
81
|
+
};
|
82
|
+
export const submenu = {
|
83
|
+
name: "submenu",
|
84
|
+
render: () => (<Example>
|
85
|
+
<Example.Item title="submenu">
|
86
|
+
<DropdownMenu>
|
87
|
+
<DropdownMenu.Trigger>
|
88
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
89
|
+
</DropdownMenu.Trigger>
|
90
|
+
<DropdownMenu.Content>
|
91
|
+
<DropdownMenu.Item onClick={() => { }}>Item 1</DropdownMenu.Item>
|
92
|
+
<DropdownMenu.SubMenu>
|
93
|
+
<DropdownMenu.SubTrigger>Item 2</DropdownMenu.SubTrigger>
|
94
|
+
<DropdownMenu.Content>
|
95
|
+
<DropdownMenu.Item onClick={() => { }}>SubItem 1</DropdownMenu.Item>
|
96
|
+
<DropdownMenu.Item onClick={() => { }}>SubItem 2</DropdownMenu.Item>
|
97
|
+
</DropdownMenu.Content>
|
98
|
+
</DropdownMenu.SubMenu>
|
99
|
+
<DropdownMenu.SubMenu>
|
100
|
+
<DropdownMenu.SubTrigger>Item 3</DropdownMenu.SubTrigger>
|
101
|
+
<DropdownMenu.Content>
|
102
|
+
<DropdownMenu.Item onClick={() => { }}>SubItem 2-1</DropdownMenu.Item>
|
103
|
+
<DropdownMenu.Item onClick={() => { }}>SubItem 2-2</DropdownMenu.Item>
|
104
|
+
</DropdownMenu.Content>
|
105
|
+
</DropdownMenu.SubMenu>
|
96
106
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
</
|
118
|
-
</DropdownMenu>
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
107
|
+
<DropdownMenu.SubMenu>
|
108
|
+
<DropdownMenu.SubTrigger disabled>Item 4, disabled</DropdownMenu.SubTrigger>
|
109
|
+
<DropdownMenu.Content>
|
110
|
+
<DropdownMenu.Item onClick={() => { }}>SubItem 3-1</DropdownMenu.Item>
|
111
|
+
<DropdownMenu.Item onClick={() => { }}>SubItem 3-2</DropdownMenu.Item>
|
112
|
+
</DropdownMenu.Content>
|
113
|
+
</DropdownMenu.SubMenu>
|
114
|
+
</DropdownMenu.Content>
|
115
|
+
</DropdownMenu>
|
116
|
+
</Example.Item>
|
117
|
+
</Example>),
|
118
|
+
};
|
119
|
+
export const defaultActive = {
|
120
|
+
name: "defaultActive, uncontrolled",
|
121
|
+
args: {
|
122
|
+
handleOpen: fn(),
|
123
|
+
handleClose: fn(),
|
124
|
+
},
|
125
|
+
render: (args) => (<DropdownMenu onOpen={args.handleOpen} onClose={args.handleClose} defaultActive>
|
126
|
+
<DropdownMenu.Trigger>
|
127
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
128
|
+
</DropdownMenu.Trigger>
|
129
|
+
<DropdownMenu.Content>
|
130
|
+
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
131
|
+
</DropdownMenu.Content>
|
132
|
+
</DropdownMenu>),
|
133
|
+
play: async ({ canvasElement, args }) => {
|
134
|
+
const canvas = within(canvasElement.ownerDocument.body);
|
135
|
+
const trigger = canvas.getAllByRole("button")[0];
|
136
|
+
let item = canvas.getByText("Item");
|
137
|
+
await sleep(500);
|
138
|
+
await userEvent.click(document.body);
|
139
|
+
await waitFor(() => {
|
140
|
+
expect(args.handleClose).toHaveBeenCalledTimes(1);
|
141
|
+
expect(args.handleClose).toHaveBeenCalledWith({ reason: "outside-click" });
|
142
|
+
expect(item).not.toBeInTheDocument();
|
143
|
+
});
|
144
|
+
await userEvent.click(trigger);
|
145
|
+
item = canvas.getByText("Item");
|
146
|
+
await waitFor(() => {
|
147
|
+
expect(args.handleOpen).toHaveBeenCalledTimes(1);
|
148
|
+
expect(args.handleOpen).toHaveBeenCalledWith();
|
149
|
+
expect(item).toBeInTheDocument();
|
150
|
+
});
|
151
|
+
},
|
152
|
+
};
|
153
|
+
export const active = {
|
154
|
+
name: "active, controlled",
|
155
|
+
args: {
|
156
|
+
handleOpen: fn(),
|
157
|
+
handleClose: fn(),
|
158
|
+
},
|
159
|
+
render: (args) => (<DropdownMenu onOpen={args.handleOpen} onClose={args.handleClose} active>
|
160
|
+
<DropdownMenu.Trigger>
|
161
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
162
|
+
</DropdownMenu.Trigger>
|
163
|
+
<DropdownMenu.Content>
|
164
|
+
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
165
|
+
</DropdownMenu.Content>
|
166
|
+
</DropdownMenu>),
|
167
|
+
play: async ({ canvasElement, args }) => {
|
168
|
+
const canvas = within(canvasElement.ownerDocument.body);
|
169
|
+
const item = canvas.getByText("Item");
|
170
|
+
await userEvent.click(document.body);
|
171
|
+
await waitFor(() => {
|
172
|
+
expect(args.handleClose).toHaveBeenCalledTimes(1);
|
173
|
+
expect(args.handleClose).toHaveBeenCalledWith({ reason: "outside-click" });
|
174
|
+
});
|
175
|
+
expect(item).toBeInTheDocument();
|
176
|
+
},
|
177
|
+
};
|
178
|
+
export const activeFalse = {
|
179
|
+
name: "active false, controlled",
|
180
|
+
args: {
|
181
|
+
handleOpen: fn(),
|
182
|
+
handleClose: fn(),
|
183
|
+
},
|
184
|
+
render: (args) => (<DropdownMenu onOpen={args.handleOpen} onClose={args.handleClose} active={false}>
|
185
|
+
<DropdownMenu.Trigger>
|
186
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
187
|
+
</DropdownMenu.Trigger>
|
188
|
+
<DropdownMenu.Content>
|
189
|
+
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
190
|
+
</DropdownMenu.Content>
|
191
|
+
</DropdownMenu>),
|
192
|
+
play: async ({ canvasElement, args }) => {
|
193
|
+
const canvas = within(canvasElement.ownerDocument.body);
|
194
|
+
const trigger = canvas.getAllByRole("button")[0];
|
195
|
+
await userEvent.click(trigger);
|
196
|
+
await waitFor(() => {
|
197
|
+
expect(args.handleOpen).toHaveBeenCalledTimes(1);
|
198
|
+
expect(args.handleOpen).toHaveBeenCalledWith();
|
199
|
+
});
|
200
|
+
const item = canvas.queryByText("Item");
|
201
|
+
expect(item).not.toBeInTheDocument();
|
202
|
+
},
|
203
|
+
};
|
204
|
+
export const className = {
|
205
|
+
name: "className, attributes",
|
206
|
+
render: () => (<div data-testid="root">
|
207
|
+
<DropdownMenu active>
|
125
208
|
<DropdownMenu.Trigger>
|
126
209
|
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
127
210
|
</DropdownMenu.Trigger>
|
128
|
-
<DropdownMenu.Content>
|
129
|
-
<DropdownMenu.Item>Item
|
130
|
-
<DropdownMenu.Item>Item 2</DropdownMenu.Item>
|
211
|
+
<DropdownMenu.Content className="test-classname" attributes={{ "data-testid": "test-id" }}>
|
212
|
+
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
131
213
|
</DropdownMenu.Content>
|
132
214
|
</DropdownMenu>
|
133
|
-
</
|
134
|
-
|
215
|
+
</div>),
|
216
|
+
play: async ({ canvasElement }) => {
|
217
|
+
const canvas = within(canvasElement.ownerDocument.body);
|
218
|
+
const menu = await canvas.findByTestId("test-id");
|
219
|
+
expect(menu).toHaveClass("test-classname");
|
220
|
+
},
|
221
|
+
};
|
222
|
+
export const testScroll = {
|
223
|
+
name: "test: scroll",
|
224
|
+
render: () => (<Example>
|
225
|
+
<Example.Item title="Scrolls on page mount to the dropdown">
|
226
|
+
<div style={{ height: 1000 }}/>
|
227
|
+
<DropdownMenu position="end" key="scroll" defaultActive>
|
228
|
+
<DropdownMenu.Trigger>
|
229
|
+
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
230
|
+
</DropdownMenu.Trigger>
|
231
|
+
<DropdownMenu.Content>
|
232
|
+
<DropdownMenu.Item>Item 1</DropdownMenu.Item>
|
233
|
+
<DropdownMenu.Item>Item 2</DropdownMenu.Item>
|
234
|
+
</DropdownMenu.Content>
|
235
|
+
</DropdownMenu>
|
236
|
+
</Example.Item>
|
237
|
+
</Example>),
|
238
|
+
};
|
135
239
|
const ThemeSwitching = () => {
|
136
240
|
const { invertColorMode } = useTheme();
|
137
241
|
return (<View gap={3} direction="row">
|
@@ -147,8 +251,11 @@ const ThemeSwitching = () => {
|
|
147
251
|
<Button onClick={() => invertColorMode()}>Switch color mode</Button>
|
148
252
|
</View>);
|
149
253
|
};
|
150
|
-
export const testThemeSwitching =
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
254
|
+
export const testThemeSwitching = {
|
255
|
+
name: "test: theme switching",
|
256
|
+
render: () => (<Example>
|
257
|
+
<Example.Item title="Switch color mode while dropdown is active and check that it still works">
|
258
|
+
<ThemeSwitching />
|
259
|
+
</Example.Item>
|
260
|
+
</Example>),
|
261
|
+
};
|
@@ -1,5 +1,3 @@
|
|
1
|
-
import { StoryObj } from "@storybook/react-vite";
|
2
|
-
import { fn } from "storybook/test";
|
3
1
|
declare const _default: {
|
4
2
|
title: string;
|
5
3
|
component: import("react").FC<import("./..").DropdownMenuProps> & {
|
@@ -21,16 +19,3 @@ declare const _default: {
|
|
21
19
|
};
|
22
20
|
};
|
23
21
|
export default _default;
|
24
|
-
export declare const defaultActive: StoryObj<{
|
25
|
-
handleOpen: ReturnType<typeof fn>;
|
26
|
-
handleClose: ReturnType<typeof fn>;
|
27
|
-
}>;
|
28
|
-
export declare const active: StoryObj<{
|
29
|
-
handleOpen: ReturnType<typeof fn>;
|
30
|
-
handleClose: ReturnType<typeof fn>;
|
31
|
-
}>;
|
32
|
-
export declare const activeFalse: StoryObj<{
|
33
|
-
handleOpen: ReturnType<typeof fn>;
|
34
|
-
handleClose: ReturnType<typeof fn>;
|
35
|
-
}>;
|
36
|
-
export declare const className: StoryObj;
|
@@ -1,7 +1,4 @@
|
|
1
|
-
import { expect, fn, userEvent, waitFor, within } from "storybook/test";
|
2
|
-
import Button from "../../Button/index.js";
|
3
1
|
import DropdownMenu from "../index.js";
|
4
|
-
import { sleep } from "../../../utilities/helpers.js";
|
5
2
|
export default {
|
6
3
|
title: "Components/DropdownMenu/tests",
|
7
4
|
component: DropdownMenu,
|
@@ -12,106 +9,3 @@ export default {
|
|
12
9
|
chromatic: { disableSnapshot: true },
|
13
10
|
},
|
14
11
|
};
|
15
|
-
export const defaultActive = {
|
16
|
-
name: "defaultActive, uncontrolled",
|
17
|
-
args: {
|
18
|
-
handleOpen: fn(),
|
19
|
-
handleClose: fn(),
|
20
|
-
},
|
21
|
-
render: (args) => (<DropdownMenu onOpen={args.handleOpen} onClose={args.handleClose} defaultActive>
|
22
|
-
<DropdownMenu.Trigger>
|
23
|
-
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
24
|
-
</DropdownMenu.Trigger>
|
25
|
-
<DropdownMenu.Content>
|
26
|
-
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
27
|
-
</DropdownMenu.Content>
|
28
|
-
</DropdownMenu>),
|
29
|
-
play: async ({ canvasElement, args }) => {
|
30
|
-
const canvas = within(canvasElement.ownerDocument.body);
|
31
|
-
const trigger = canvas.getAllByRole("button")[0];
|
32
|
-
let item = canvas.getByText("Item");
|
33
|
-
await sleep(500);
|
34
|
-
await userEvent.click(document.body);
|
35
|
-
await waitFor(() => {
|
36
|
-
expect(args.handleClose).toHaveBeenCalledTimes(1);
|
37
|
-
expect(args.handleClose).toHaveBeenCalledWith({ reason: "outside-click" });
|
38
|
-
expect(item).not.toBeInTheDocument();
|
39
|
-
});
|
40
|
-
await userEvent.click(trigger);
|
41
|
-
item = canvas.getByText("Item");
|
42
|
-
await waitFor(() => {
|
43
|
-
expect(args.handleOpen).toHaveBeenCalledTimes(1);
|
44
|
-
expect(args.handleOpen).toHaveBeenCalledWith();
|
45
|
-
expect(item).toBeInTheDocument();
|
46
|
-
});
|
47
|
-
},
|
48
|
-
};
|
49
|
-
export const active = {
|
50
|
-
name: "active, controlled",
|
51
|
-
args: {
|
52
|
-
handleOpen: fn(),
|
53
|
-
handleClose: fn(),
|
54
|
-
},
|
55
|
-
render: (args) => (<DropdownMenu onOpen={args.handleOpen} onClose={args.handleClose} active>
|
56
|
-
<DropdownMenu.Trigger>
|
57
|
-
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
58
|
-
</DropdownMenu.Trigger>
|
59
|
-
<DropdownMenu.Content>
|
60
|
-
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
61
|
-
</DropdownMenu.Content>
|
62
|
-
</DropdownMenu>),
|
63
|
-
play: async ({ canvasElement, args }) => {
|
64
|
-
const canvas = within(canvasElement.ownerDocument.body);
|
65
|
-
const item = canvas.getByText("Item");
|
66
|
-
await userEvent.click(document.body);
|
67
|
-
await waitFor(() => {
|
68
|
-
expect(args.handleClose).toHaveBeenCalledTimes(1);
|
69
|
-
expect(args.handleClose).toHaveBeenCalledWith({ reason: "outside-click" });
|
70
|
-
});
|
71
|
-
expect(item).toBeInTheDocument();
|
72
|
-
},
|
73
|
-
};
|
74
|
-
export const activeFalse = {
|
75
|
-
name: "active false, controlled",
|
76
|
-
args: {
|
77
|
-
handleOpen: fn(),
|
78
|
-
handleClose: fn(),
|
79
|
-
},
|
80
|
-
render: (args) => (<DropdownMenu onOpen={args.handleOpen} onClose={args.handleClose} active={false}>
|
81
|
-
<DropdownMenu.Trigger>
|
82
|
-
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
83
|
-
</DropdownMenu.Trigger>
|
84
|
-
<DropdownMenu.Content>
|
85
|
-
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
86
|
-
</DropdownMenu.Content>
|
87
|
-
</DropdownMenu>),
|
88
|
-
play: async ({ canvasElement, args }) => {
|
89
|
-
const canvas = within(canvasElement.ownerDocument.body);
|
90
|
-
const trigger = canvas.getAllByRole("button")[0];
|
91
|
-
await userEvent.click(trigger);
|
92
|
-
await waitFor(() => {
|
93
|
-
expect(args.handleOpen).toHaveBeenCalledTimes(1);
|
94
|
-
expect(args.handleOpen).toHaveBeenCalledWith();
|
95
|
-
});
|
96
|
-
const item = canvas.queryByText("Item");
|
97
|
-
expect(item).not.toBeInTheDocument();
|
98
|
-
},
|
99
|
-
};
|
100
|
-
export const className = {
|
101
|
-
name: "className, attributes",
|
102
|
-
render: () => (<div data-testid="root">
|
103
|
-
<DropdownMenu active>
|
104
|
-
<DropdownMenu.Trigger>
|
105
|
-
{(attributes) => <Button attributes={attributes}>Open</Button>}
|
106
|
-
</DropdownMenu.Trigger>
|
107
|
-
<DropdownMenu.Content className="test-classname" attributes={{ "data-testid": "test-id" }}>
|
108
|
-
<DropdownMenu.Item>Item</DropdownMenu.Item>
|
109
|
-
</DropdownMenu.Content>
|
110
|
-
</DropdownMenu>
|
111
|
-
</div>),
|
112
|
-
play: async ({ canvasElement }) => {
|
113
|
-
const canvas = within(canvasElement.ownerDocument.body);
|
114
|
-
const menu = await canvas.findByTestId("test-id");
|
115
|
-
expect(menu).toHaveClass("test-classname");
|
116
|
-
},
|
117
|
-
};
|
@@ -1 +1 @@
|
|
1
|
-
.root{--rs-file-upload-radius:var(--rs-radius-medium);display:block}[data-rs-keyboard] .root:focus-within{box-shadow:var(--rs-focus
|
1
|
+
.root{--rs-file-upload-radius:var(--rs-radius-medium);display:block}[data-rs-keyboard] .root:focus-within{box-shadow:var(--rs-shadow-focus)}.--inline{--rs-file-upload-radius:var(--rs-radius-small)}.--inline,.--inline .triggerLayer{display:inline-block;vertical-align:top}[data-rs-keyboard] .--inline:focus-within{box-shadow:none}[data-rs-keyboard] .--inline:focus-within .triggerLayer>*{box-shadow:var(--rs-shadow-focus)}.--variant-outline .triggerLayer{border:1px dashed var(--rs-color-border-neutral);border-radius:var(--rs-file-upload-radius)}.--highlighted.--variant-outline .triggerLayer{background:rgba(var(--rs-color-rgb-background-primary),.08);border-color:var(--rs-color-border-primary)}@media (hover:hover) and (pointer:fine){.--variant-outline .triggerLayer:hover:not(:has(.trigger)){background:rgba(var(--rs-color-rgb-background-neutral),.16)}}.triggerLayer:has(.trigger){pointer-events:none}.triggerLayer:has(.trigger) .trigger{pointer-events:all}.trigger{display:contents}
|
@@ -1 +1 @@
|
|
1
|
-
.content{--rs-flyout-gap:0;--rs-flyout-origin-x:50%;--rs-flyout-origin-y:50%;isolation:isolate;pointer-events:none;position:absolute}.content.--hover{pointer-events:all}.content.--hover-disabled,.content.--hover-disabled .inner{pointer-events:none}.inner{opacity:0;outline:none;pointer-events:all;transform:scale(.
|
1
|
+
.content{--rs-flyout-gap:0;--rs-flyout-origin-x:50%;--rs-flyout-origin-y:50%;isolation:isolate;pointer-events:none;position:absolute}.content.--hover{pointer-events:all}.content.--hover-disabled,.content.--hover-disabled .inner{pointer-events:none}.inner{backface-visibility:hidden;height:100%;max-height:100%;max-width:100%;opacity:0;outline:none;overflow:auto;pointer-events:all;transform:scale(.92) translateY(0);transform-origin:var(--rs-flyout-origin-x) var(--rs-flyout-origin-y);transition:1ms var(--rs-easing-accelerate)}[data-rs-keyboard] .inner:focus{box-shadow:var(--rs-shadow-focus)}.content.--width-trigger .inner{transform:scale(1) translateY(var(--rs-unit-x2))}.content.--position-top,.content.--position-top-end,.content.--position-top-start{--rs-flyout-origin-y:100%;padding-bottom:calc(var(--rs-unit-x1) * var(--rs-flyout-gap))}.content.--position-bottom,.content.--position-bottom-end,.content.--position-bottom-start{--rs-flyout-origin-y:0%;padding-top:calc(var(--rs-unit-x1) * var(--rs-flyout-gap))}.content.--position-bottom-start,.content.--position-top-start{--rs-flyout-origin-x:0%}.content.--position-bottom-end,.content.--position-top-end{--rs-flyout-origin-x:100%}.content.--position-start,.content.--position-start-bottom,.content.--position-start-top{--rs-flyout-origin-x:100%;padding-right:calc(var(--rs-unit-x1) * var(--rs-flyout-gap))}.content.--position-end,.content.--position-end-bottom,.content.--position-end-top{--rs-flyout-origin-x:0%;padding-left:calc(var(--rs-unit-x1) * var(--rs-flyout-gap))}.content.--position-end-top,.content.--position-start-top{--rs-flyout-origin-y:0%}.content.--position-end-bottom,.content.--position-start-bottom{--rs-flyout-origin-y:100%}.content.--visible .inner{opacity:1;transform:scale(1) translateY(0)}.content.--animated .inner{transition-duration:var(--rs-duration-rapid);transition-property:opacity,transform}.content.--animated.--visible .inner{transition-duration:var(--rs-duration-fast);transition-timing-function:var(--rs-easing-decelerate)}
|
@@ -15,17 +15,13 @@ export type CloseReason = "escape-key" | "outside-click"
|
|
15
15
|
| "item-selection" | "close-button";
|
16
16
|
export type Position = `${YSide}` | `${YSide}-${XSide}` | `${XSide}` | `${XSide}-${YSide}`;
|
17
17
|
export type Width = "trigger" | string;
|
18
|
-
export type Options = {
|
19
|
-
width?: Width;
|
18
|
+
export type Options = Pick<BaseProps, "width" | "fallbackAdjustLayout" | "fallbackMinWidth" | "fallbackMinHeight" | "contentGap" | "contentShift"> & {
|
20
19
|
position: Position;
|
20
|
+
fallbackPositions?: Position[];
|
21
21
|
container?: HTMLElement | null;
|
22
22
|
rtl: boolean;
|
23
|
-
fallbackPositions?: Position[];
|
24
|
-
fallbackAdjustLayout?: boolean;
|
25
23
|
lastUsedPosition: Position;
|
26
24
|
onPositionChoose: (position: Position) => void;
|
27
|
-
contentGap?: number;
|
28
|
-
contentShift?: number;
|
29
25
|
};
|
30
26
|
export type Styles = React.CSSProperties;
|
31
27
|
export type State = {
|
@@ -102,6 +98,10 @@ type BaseProps = {
|
|
102
98
|
fallbackPositions?: Position[] | false;
|
103
99
|
/** Adjust the content size and shift its position to fit into the container when none of the fallback positions work */
|
104
100
|
fallbackAdjustLayout?: boolean;
|
101
|
+
/** Minimum width for the content when fallbackAdjustLayout is true */
|
102
|
+
fallbackMinWidth?: string;
|
103
|
+
/** Minimum height for the content when fallbackAdjustLayout is true */
|
104
|
+
fallbackMinHeight?: string;
|
105
105
|
/** Change component trap focus keyboard behavior and shortcuts */
|
106
106
|
trapFocusMode?: TrapMode | false;
|
107
107
|
/** Disable the flyout content interactivity */
|
@@ -187,7 +187,7 @@ export type ContextProps = {
|
|
187
187
|
handleContentMouseDown: () => void;
|
188
188
|
handleContentMouseUp: () => void;
|
189
189
|
isSubmenu: boolean;
|
190
|
-
} & Pick<Props, "triggerType" | "contentClassName" | "contentAttributes" | "
|
190
|
+
} & Pick<Props, "triggerType" | "contentClassName" | "contentAttributes" | "contentGap" | "trapFocusMode" | "containerRef" | "disableContentHover" | "autoFocus">;
|
191
191
|
export type TriggerContextProps = {
|
192
192
|
elRef?: ContextProps["triggerElRef"];
|
193
193
|
};
|
@@ -11,7 +11,7 @@ import { useFlyoutContext, ContentProvider } from "./Flyout.context.js";
|
|
11
11
|
import s from "./Flyout.module.css";
|
12
12
|
const FlyoutContent = (props) => {
|
13
13
|
const { children, className, attributes } = props;
|
14
|
-
const { flyout, id, flyoutElRef, triggerElRef, handleClose, handleTransitionEnd, handleTransitionStart, triggerType, handleMouseEnter, handleMouseLeave, handleContentMouseDown, handleContentMouseUp,
|
14
|
+
const { flyout, id, flyoutElRef, triggerElRef, handleClose, handleTransitionEnd, handleTransitionStart, triggerType, handleMouseEnter, handleMouseLeave, handleContentMouseDown, handleContentMouseUp, contentClassName, contentAttributes, contentGap, trapFocusMode, disableContentHover, autoFocus, width, containerRef: passedContainerRef, isSubmenu, } = useFlyoutContext();
|
15
15
|
const { styles, status, position } = flyout;
|
16
16
|
const [mounted, setMounted] = React.useState(false);
|
17
17
|
const closestFixedContainer = React.useMemo(() => {
|
@@ -19,13 +19,16 @@ const FlyoutContent = (props) => {
|
|
19
19
|
return null;
|
20
20
|
if (!triggerElRef)
|
21
21
|
return null;
|
22
|
+
// eslint-disable-next-line react-hooks/refs
|
22
23
|
return findClosestPositionContainer({ el: triggerElRef.current });
|
23
24
|
}, [mounted, triggerElRef]);
|
24
25
|
const closestScrollableContainer = React.useMemo(() => {
|
25
26
|
if (!mounted)
|
26
27
|
return;
|
28
|
+
// eslint-disable-next-line react-hooks/refs
|
27
29
|
if (!triggerElRef?.current)
|
28
30
|
return;
|
31
|
+
// eslint-disable-next-line react-hooks/refs
|
29
32
|
return findClosestScrollableContainer({ el: triggerElRef.current });
|
30
33
|
}, [mounted, triggerElRef]);
|
31
34
|
const containerRef = passedContainerRef || { current: closestFixedContainer };
|
@@ -15,7 +15,7 @@ import cooldown from "./utilities/cooldown.js";
|
|
15
15
|
import { Provider, useFlyoutTriggerContext, useFlyoutContext, useFlyoutContentContext, } from "./Flyout.context.js";
|
16
16
|
import useHandlerRef from "../../hooks/useHandlerRef.js";
|
17
17
|
const FlyoutControlled = (props) => {
|
18
|
-
const { triggerType = "click", groupTimeouts, onOpen, onClose, children, disabled, forcePosition, fallbackAdjustLayout, trapFocusMode = "dialog", width, disableHideAnimation, disableContentHover, disableCloseOnOutsideClick, autoFocus = true, originCoordinates, contentGap = 2, contentShift, contentClassName, contentAttributes, position: passedPosition, active: passedActive, id: passedId, instanceRef, containerRef, initialFocusRef, } = props;
|
18
|
+
const { triggerType = "click", groupTimeouts, onOpen, onClose, children, disabled, forcePosition, fallbackAdjustLayout, fallbackMinWidth, fallbackMinHeight, trapFocusMode = "dialog", width, disableHideAnimation, disableContentHover, disableCloseOnOutsideClick, autoFocus = true, originCoordinates, contentGap = 2, contentShift, contentClassName, contentAttributes, position: passedPosition, active: passedActive, id: passedId, instanceRef, containerRef, initialFocusRef, } = props;
|
19
19
|
const fallbackPositions = props.fallbackPositions === false || forcePosition ? [] : props.fallbackPositions;
|
20
20
|
const onOpenRef = useHandlerRef(onOpen);
|
21
21
|
const onCloseRef = useHandlerRef(onClose);
|
@@ -34,7 +34,9 @@ const FlyoutControlled = (props) => {
|
|
34
34
|
* Resolving the same inside another Flyout.Content should reset the inheritance
|
35
35
|
* For example, if you have a tooltip -> popover inside another popover.content, tooltip shouldn't use its parent context anymore
|
36
36
|
*/
|
37
|
-
const isParentTriggerInsideFlyout =
|
37
|
+
const isParentTriggerInsideFlyout =
|
38
|
+
// eslint-disable-next-line react-hooks/refs
|
39
|
+
!!parentTriggerRef?.current && parentContentRef?.current?.contains(parentTriggerRef.current);
|
38
40
|
const tryParentTrigger = !parentContentRef || isParentTriggerInsideFlyout;
|
39
41
|
const triggerElRef = (tryParentTrigger && parentTriggerRef) || internalTriggerElRef;
|
40
42
|
const triggerBoundsRef = React.useRef(null);
|
@@ -53,16 +55,21 @@ const FlyoutControlled = (props) => {
|
|
53
55
|
// Touch devices trigger onMouseEnter but we don't need to apply regular hover timeouts
|
54
56
|
// So we're saving a flag on touch start and then change the mouse enter behavior
|
55
57
|
const hoverTriggeredWithTouchEventRef = React.useRef(false);
|
58
|
+
// eslint-disable-next-line react-hooks/refs
|
56
59
|
const flyout = useFlyout({
|
57
60
|
triggerElRef,
|
58
61
|
flyoutElRef,
|
62
|
+
// eslint-disable-next-line react-hooks/refs
|
59
63
|
triggerBounds: originCoordinates ?? triggerBoundsRef.current,
|
60
64
|
width,
|
61
65
|
position: passedPosition,
|
62
66
|
defaultActive: resolvedActive,
|
67
|
+
// eslint-disable-next-line react-hooks/refs
|
63
68
|
container: containerRef?.current,
|
64
69
|
fallbackPositions,
|
65
70
|
fallbackAdjustLayout,
|
71
|
+
fallbackMinWidth,
|
72
|
+
fallbackMinHeight,
|
66
73
|
contentGap,
|
67
74
|
contentShift,
|
68
75
|
});
|
@@ -322,9 +329,9 @@ const FlyoutControlled = (props) => {
|
|
322
329
|
handleContentMouseUp,
|
323
330
|
triggerType,
|
324
331
|
trapFocusMode,
|
325
|
-
contentGap,
|
326
332
|
contentClassName,
|
327
333
|
contentAttributes,
|
334
|
+
contentGap,
|
328
335
|
containerRef,
|
329
336
|
disableContentHover,
|
330
337
|
autoFocus,
|
@@ -1,3 +1,3 @@
|
|
1
1
|
export { default } from "./Flyout";
|
2
2
|
export { useFlyoutContext } from "./Flyout.context";
|
3
|
-
export type { Props as FlyoutProps, Instance as FlyoutInstance, TriggerProps as FlyoutTriggerProps, ContentProps as FlyoutContentProps, CloseReason as FlyoutCloseReason, } from "./Flyout.types";
|
3
|
+
export type { Props as FlyoutProps, Instance as FlyoutInstance, TriggerProps as FlyoutTriggerProps, ContentProps as FlyoutContentProps, CloseReason as FlyoutCloseReason, TriggerAttributes as FlyoutTriggerAttributes, } from "./Flyout.types";
|