reshaped 3.8.0-canary.0 → 3.8.0-canary.10
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 +101 -8
- package/README.md +2 -2
- 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 +9 -6
- package/dist/components/Flyout/FlyoutContent.js +4 -1
- package/dist/components/Flyout/FlyoutControlled.js +11 -3
- package/dist/components/Flyout/index.d.ts +1 -1
- package/dist/components/Flyout/tests/Flyout.stories.d.ts +12 -0
- package/dist/components/Flyout/tests/Flyout.stories.js +112 -6
- package/dist/components/Flyout/useFlyout.d.ts +1 -6
- package/dist/components/Flyout/useFlyout.js +7 -1
- package/dist/components/Flyout/utilities/calculatePosition.d.ts +3 -2
- package/dist/components/Flyout/utilities/calculatePosition.js +85 -36
- package/dist/components/Flyout/utilities/flyout.js +24 -19
- package/dist/components/Flyout/utilities/getPositionFallbacks.js +3 -3
- package/dist/components/Flyout/utilities/helpers.d.ts +7 -0
- package/dist/components/Flyout/utilities/helpers.js +14 -0
- package/dist/components/Flyout/utilities/isFullyVisible.d.ts +4 -2
- package/dist/components/Flyout/utilities/isFullyVisible.js +6 -8
- 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 +53 -10
- package/dist/components/Modal/tests/Modal.stories.js +367 -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/PinField.module.css +1 -1
- package/dist/components/PinField/tests/PinField.stories.d.ts +24 -3
- package/dist/components/PinField/tests/PinField.stories.js +194 -47
- 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/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/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 +44 -33
- 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/PinField/tests/PinField.test.stories.d.ts +0 -29
- package/dist/components/PinField/tests/PinField.test.stories.js +0 -177
- 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
@@ -1,5 +1,6 @@
|
|
1
1
|
import { Example, Placeholder } from "../../../utilities/storybook/index.js";
|
2
2
|
import Scrim from "../index.js";
|
3
|
+
import { expect } from "storybook/test";
|
3
4
|
export default {
|
4
5
|
title: "Components/Scrim",
|
5
6
|
component: Scrim,
|
@@ -9,39 +10,58 @@ export default {
|
|
9
10
|
},
|
10
11
|
},
|
11
12
|
};
|
12
|
-
export const position =
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
export const position = {
|
14
|
+
name: "position",
|
15
|
+
render: () => (<Example>
|
16
|
+
<Example.Item title="position: center">
|
17
|
+
<Scrim backgroundSlot={<Placeholder h={200}/>}>Scrim</Scrim>
|
18
|
+
</Example.Item>
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
<Example.Item title="position: bottom">
|
21
|
+
<Scrim position="bottom" backgroundSlot={<Placeholder h={200}/>}>
|
22
|
+
Scrim
|
23
|
+
</Scrim>
|
24
|
+
</Example.Item>
|
22
25
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
<Example.Item title="position: top">
|
27
|
+
<Scrim position="top" backgroundSlot={<Placeholder h={200}/>}>
|
28
|
+
Scrim
|
29
|
+
</Scrim>
|
30
|
+
</Example.Item>
|
28
31
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
<Example.Item title="position: start">
|
33
|
+
<Scrim position="start" backgroundSlot={<Placeholder h={200}/>}>
|
34
|
+
Scrim
|
35
|
+
</Scrim>
|
36
|
+
</Example.Item>
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
+
<Example.Item title="position: end">
|
39
|
+
<Scrim position="end" backgroundSlot={<Placeholder h={200}/>}>
|
40
|
+
Scrim
|
41
|
+
</Scrim>
|
42
|
+
</Example.Item>
|
43
|
+
</Example>),
|
44
|
+
};
|
45
|
+
export const className = {
|
46
|
+
name: "className, attributes",
|
47
|
+
render: () => (<div data-testid="root">
|
48
|
+
<Scrim className="test-classname" attributes={{ id: "test-id" }}>
|
49
|
+
Content
|
38
50
|
</Scrim>
|
39
|
-
</
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
51
|
+
</div>),
|
52
|
+
play: async ({ canvas }) => {
|
53
|
+
const root = canvas.getByTestId("root").firstChild;
|
54
|
+
expect(root).toHaveClass("test-classname");
|
55
|
+
expect(root).toHaveAttribute("id", "test-id");
|
56
|
+
},
|
57
|
+
};
|
58
|
+
export const composition = {
|
59
|
+
name: "test: composition",
|
60
|
+
render: () => (<Example>
|
61
|
+
<Example.Item title="without backgroundSlot, size is based on the parent component">
|
62
|
+
<div style={{ height: 300, position: "relative" }}>
|
63
|
+
<Scrim>Text</Scrim>
|
64
|
+
</div>
|
65
|
+
</Example.Item>
|
66
|
+
</Example>),
|
67
|
+
};
|
@@ -1 +1 @@
|
|
1
|
-
.root{--rs-scroll-area-thumb-size:calc(var(--rs-unit-x1) * 1.5);--rs-scroll-area-thumb-offset:calc(var(--rs-unit-x1) / 2);height:100%;overflow:hidden;position:relative}[data-rs-keyboard] .root:has(.scrollable:focus){box-shadow:var(--rs-focus
|
1
|
+
.root{--rs-scroll-area-thumb-size:calc(var(--rs-unit-x1) * 1.5);--rs-scroll-area-thumb-offset:calc(var(--rs-unit-x1) / 2);height:100%;overflow:hidden;position:relative}[data-rs-keyboard] .root:has(.scrollable:focus){box-shadow:var(--rs-shadow-focus)}.scrollable{height:100%;outline:none;overflow:auto;position:relative;scrollbar-width:none;-webkit-overflow-scrolling:touch}.scrollable::-webkit-scrollbar{display:none;height:0;width:0}.content{display:inline-block;min-height:100%;min-width:100%;vertical-align:top}.scrollbar{box-sizing:initial;padding:var(--rs-scroll-area-thumb-offset);position:absolute}.thumb{height:100%;position:relative;width:100%}.thumb:before{background:var(--rs-color-foreground-neutral);border-radius:var(--rs-radius-circular);content:"";display:block;opacity:0;position:absolute;transition:opacity var(--rs-duration-fast) var(--rs-easing-standard)}.--scrollbar-y{inset-block:0;inset-inline-end:0;width:var(--rs-scroll-area-thumb-size)}.--scrollbar-y .thumb:before{height:calc(var(--rs-scroll-area-ratio) * 100%);inset-block-start:calc(var(--rs-scroll-area-position) * 100%);width:100%}.--scrollbar-x{height:var(--rs-scroll-area-thumb-size);inset-block-end:0;inset-inline:0}.--scrollbar-x .thumb:before{height:100%;inset-inline-start:calc(var(--rs-scroll-area-position) * 100%);width:calc(var(--rs-scroll-area-ratio) * 100%)}.--scrollbar-y:not(:last-child){inset-block-end:calc(var(--rs-scroll-area-thumb-size) + var(--rs-scroll-area-thumb-offset) * 2)}.--scrollbar-y~.--scrollbar-x{inset-inline-end:calc(var(--rs-scroll-area-thumb-size) + var(--rs-scroll-area-thumb-offset) * 2)}.--display-hover:hover>.scrollbar .thumb:before,.--display-visible .thumb:before{opacity:.2}.--display-hover:hover .--scrollbar-dragging .thumb:before,.--scrollbar-dragging .thumb:before,.scrollbar:hover .thumb:before{opacity:.32}
|
@@ -1,4 +1,11 @@
|
|
1
1
|
import React from "react";
|
2
2
|
import type * as T from "./Select.types";
|
3
|
-
|
3
|
+
import SelectOption from "./SelectOption";
|
4
|
+
import SelectOptionGroup from "./SelectOptionGroup";
|
5
|
+
import SelectCustom from "./SelectCustom";
|
6
|
+
declare const Select: React.FC<T.NativeProps> & {
|
7
|
+
Custom: typeof SelectCustom;
|
8
|
+
Option: typeof SelectOption;
|
9
|
+
OptionGroup: typeof SelectOptionGroup;
|
10
|
+
};
|
4
11
|
export default Select;
|
@@ -1,53 +1,27 @@
|
|
1
|
-
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
3
2
|
import React from "react";
|
4
|
-
import
|
5
|
-
import
|
6
|
-
import
|
7
|
-
import
|
8
|
-
import
|
9
|
-
import
|
10
|
-
import useElementId from "../../hooks/useElementId.js";
|
11
|
-
import s from "./Select.module.css";
|
3
|
+
import SelectNative from "./SelectNative.js";
|
4
|
+
import SelectRoot from "./SelectRoot.js";
|
5
|
+
import SelectTrigger from "./SelectTrigger.js";
|
6
|
+
import SelectOption from "./SelectOption.js";
|
7
|
+
import SelectOptionGroup from "./SelectOptionGroup.js";
|
8
|
+
import SelectCustom from "./SelectCustom.js";
|
12
9
|
const Select = (props) => {
|
13
|
-
const {
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
if (value === undefined)
|
26
|
-
setEmpty(!nextValue);
|
27
|
-
if (!onChange)
|
28
|
-
return;
|
29
|
-
onChange({ name, value: nextValue, event });
|
30
|
-
};
|
31
|
-
// Controlled placeholder
|
32
|
-
React.useEffect(() => {
|
33
|
-
if (value === undefined)
|
34
|
-
return;
|
35
|
-
setEmpty(!value);
|
36
|
-
}, [value]);
|
37
|
-
const startContent = (startSlot || icon) && (_jsx("div", { className: s.slot, children: icon ? (_jsx(Icon, { size: responsivePropDependency(size, (size) => {
|
38
|
-
if (size === "large")
|
39
|
-
return 5;
|
40
|
-
if (size === "xlarge")
|
41
|
-
return 6;
|
42
|
-
return 4;
|
43
|
-
}), svg: icon })) : (startSlot) }));
|
44
|
-
return (_jsxs("div", { ...attributes, className: rootClassName, children: [options ? (_jsxs(_Fragment, { children: [startContent, _jsxs("select", { ...inputAttributes, onFocus: (onFocus || inputAttributes?.onFocus), onBlur: (onBlur || inputAttributes?.onBlur), className: s.input, disabled: disabled, name: name, value: value, defaultValue: defaultValue, onChange: handleChange, id: inputId, children: [placeholder && _jsx("option", { value: "", children: placeholder }), options.map((option) => (_jsx("option", { value: option.value, disabled: option.disabled, children: option.label }, option.value)))] })] })) : (_jsxs(_Fragment, { children: [_jsxs(Actionable, { className: s.input, disabled: disabled, disableFocusRing: true, onClick: onClick, attributes: {
|
45
|
-
...inputAttributes,
|
46
|
-
onFocus: onFocus || inputAttributes?.onFocus,
|
47
|
-
onBlur: onBlur || inputAttributes?.onBlur,
|
48
|
-
}, children: [startContent, children ? _jsx(Text, { maxLines: 1, children: children }) : null, placeholder && !children ? _jsx(Text, { color: "neutral-faded", children: placeholder }) : null] }), _jsx("input", { type: "hidden", value: value, name: name })] })), _jsx("div", { className: s.arrow, children: _jsx(Icon, { svg: IconArrow, color: disabled ? "disabled" : "neutral-faded", size: responsivePropDependency(size, (size) => {
|
49
|
-
return size === "large" || size === "xlarge" ? 5 : 4;
|
50
|
-
}) }) })] }));
|
10
|
+
const { children } = props;
|
11
|
+
return (_jsx(SelectRoot, { ...props, children: (props) => {
|
12
|
+
const { options } = props;
|
13
|
+
const hasOptionChildren = React.Children.toArray(children).some((child) => {
|
14
|
+
return React.isValidElement(child) && child.type === "option";
|
15
|
+
});
|
16
|
+
const hasOptions = Boolean(options || hasOptionChildren);
|
17
|
+
if (!hasOptions) {
|
18
|
+
return _jsx(SelectTrigger, { ...props, children: children });
|
19
|
+
}
|
20
|
+
return (_jsxs(SelectNative, { ...props, children: [options?.map((option) => (_jsx("option", { value: option.value, disabled: option.disabled, children: option.label }, option.value))), children] }));
|
21
|
+
} }));
|
51
22
|
};
|
52
23
|
Select.displayName = "Select";
|
24
|
+
Select.Custom = SelectCustom;
|
25
|
+
Select.Option = SelectOption;
|
26
|
+
Select.OptionGroup = SelectOptionGroup;
|
53
27
|
export default Select;
|
@@ -1 +1 @@
|
|
1
|
-
.root{background:var(--rs-color-background-elevation-base);
|
1
|
+
.root{background:var(--rs-color-background-elevation-base);display:flex;overflow:hidden;position:relative;z-index:0}.root,.root:after{border-radius:var(--rs-select-radius)}.root:after{box-shadow:0 0 0 1px var(--rs-color-border-neutral) inset;content:"";inset:0;pointer-events:none;position:absolute}[data-rs-keyboard] .root:focus-within:after{box-shadow:0 0 0 2px var(--rs-color-border-primary) inset}.input{align-items:center;-webkit-appearance:none;appearance:none;background:none;border:0;box-sizing:border-box;color:var(--rs-color-foreground-neutral);cursor:pointer;display:flex;flex-grow:1;font-family:var(--rs-font-family-body);font-weight:var(--rs-font-weight-regular);outline:none;padding-inline-end:calc(var(--rs-select-chevron-size) + var(--rs-select-gap) * 2 + var(--rs-unit-x1));padding-inline-start:var(--rs-select-gap);position:relative;text-overflow:ellipsis;width:100%;z-index:1}.input::-ms-expand{display:none}.input.input--placeholder{color:var(--rs-color-foreground-disabled)}.slot{align-items:center;display:flex;flex-shrink:0;padding-inline-start:var(--rs-select-gap);position:relative;z-index:5}.input .slot{padding-inline-end:var(--rs-select-gap);padding-inline-start:0}.arrow{color:var(--rs-color-foreground-neutral-faded);display:flex;inset-block-start:50%;inset-inline-end:var(--rs-select-gap);pointer-events:none;position:absolute;transform:translateY(-50%);z-index:5}.--size-small{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}.root.--variant-faded{background:var(--rs-color-background-neutral-faded)}.root.--variant-faded:after{box-shadow:none}.root.--variant-faded:focus-within{border-color:var(--rs-color-border-primary)}.root.--variant-headless{background:transparent}.root.--variant-headless:after{box-shadow:none}.root.--variant-headless.--status-error,.root.--variant-headless.--status-error:focus-within,.root.--variant-headless:focus-within{border-color:transparent}.root.--variant-headless.--status-error:after,.root.--variant-headless.--status-error:focus-within:after,.root.--variant-headless:focus-within:after{box-shadow:none}.root.--status-error:after{box-shadow:0 0 0 2px var(--rs-color-border-critical) inset}.root.--disabled{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled)}.root.--disabled:after{box-shadow:0 0 0 1px var(--rs-color-border-disabled) inset}.root.--disabled .arrow,.root.--disabled .input{color:var(--rs-color-foreground-disabled);cursor:not-allowed}@media (--rs-viewport-s ) and (hover:none){.input{font-size:var(--rs-font-size-body-2)!important}}@media (--rs-viewport-m ){.--size-small--m{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium--m{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large--m{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge--m{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}}@media (--rs-viewport-l ){.--size-small--l{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium--l{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large--l{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge--l{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}}@media (--rs-viewport-xl ){.--size-small--xl{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium--xl{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large--xl{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge--xl{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}}
|
@@ -1,10 +1,11 @@
|
|
1
1
|
import React from "react";
|
2
2
|
import type * as G from "../../types/global";
|
3
|
-
import type { FormControlProps } from "../FormControl";
|
4
|
-
import type { ActionableProps } from "../Actionable";
|
5
3
|
import type { IconProps } from "../Icon";
|
4
|
+
import type { ActionableProps } from "../Actionable";
|
5
|
+
import type { MenuItemProps } from "../MenuItem";
|
6
|
+
import { DropdownMenuProps } from "../DropdownMenu";
|
6
7
|
type Size = G.Responsive<"small" | "medium" | "large" | "xlarge">;
|
7
|
-
type
|
8
|
+
type NativeOption = {
|
8
9
|
/** Option text label */
|
9
10
|
label: string;
|
10
11
|
/** Option value used in the form submission */
|
@@ -12,40 +13,14 @@ type Option = {
|
|
12
13
|
/** Disable the option from the selection */
|
13
14
|
disabled?: boolean;
|
14
15
|
};
|
15
|
-
export type
|
16
|
-
|
17
|
-
onClick?: () => void;
|
18
|
-
/** Node for inserting children */
|
19
|
-
children?: React.ReactNode;
|
20
|
-
/** Additional attributes for the input element */
|
21
|
-
inputAttributes?: ActionableProps["attributes"];
|
22
|
-
/** Callback when the input is focused */
|
23
|
-
onFocus?: (e: React.FocusEvent<HTMLButtonElement>) => void;
|
24
|
-
/** Callback when the input is blurred */
|
25
|
-
onBlur?: (e: React.FocusEvent<HTMLButtonElement>) => void;
|
26
|
-
/** Options for the select */
|
27
|
-
options?: never;
|
28
|
-
/** Callback when the input value changes */
|
29
|
-
onChange?: never;
|
16
|
+
export type OptionProps = Pick<MenuItemProps, "attributes" | "children" | "className" | "disabled" | "endSlot" | "startSlot" | "icon" | "onClick"> & {
|
17
|
+
value: string;
|
30
18
|
};
|
31
|
-
export type
|
32
|
-
|
33
|
-
|
34
|
-
/** Callback when the input value changes */
|
35
|
-
onChange?: G.ChangeHandler<string, React.ChangeEvent<HTMLSelectElement>>;
|
36
|
-
/** Callback when the input is focused */
|
37
|
-
onFocus?: (e: React.FocusEvent<HTMLSelectElement>) => void;
|
38
|
-
/** Callback when the input is blurred */
|
39
|
-
onBlur?: (e: React.FocusEvent<HTMLSelectElement>) => void;
|
40
|
-
/** Additional attributes for the input element */
|
41
|
-
inputAttributes?: G.Attributes<"select">;
|
42
|
-
/** Callback when the button is clicked */
|
43
|
-
onClick?: never;
|
44
|
-
/** Node for inserting children */
|
45
|
-
children?: never;
|
19
|
+
export type OptionGroupProps = {
|
20
|
+
label: string;
|
21
|
+
children: React.ReactNode;
|
46
22
|
};
|
47
|
-
type
|
48
|
-
/** Unique identifier for the select */
|
23
|
+
type BaseFragment = {
|
49
24
|
id?: string;
|
50
25
|
/** Name of the input element */
|
51
26
|
name: string;
|
@@ -61,18 +36,88 @@ type BaseProps = ((ButtonTriggerProps | SelectTriggerProps) & Pick<FormControlPr
|
|
61
36
|
icon?: IconProps["svg"];
|
62
37
|
/** Node for inserting content before the select value */
|
63
38
|
startSlot?: React.ReactNode;
|
39
|
+
/** Show an error state, automatically inherited when component is used inside FormControl */
|
40
|
+
hasError?: boolean;
|
41
|
+
/** Callback when the trigger is clicked */
|
42
|
+
onClick?: ActionableProps["onClick"];
|
64
43
|
/** Additional classname for the root element */
|
65
44
|
className?: G.ClassName;
|
66
45
|
/** Additional attributes for the root element */
|
67
46
|
attributes?: G.Attributes<"div">;
|
47
|
+
/** Node for inserting children */
|
48
|
+
children?: React.ReactNode;
|
68
49
|
};
|
69
|
-
export type
|
50
|
+
export type CustomFragment = {
|
51
|
+
/** Options for the select */
|
52
|
+
options?: never;
|
53
|
+
/** Callback when the input is focused */
|
54
|
+
onFocus?: (e: React.FocusEvent<HTMLButtonElement>) => void;
|
55
|
+
/** Callback when the input is blurred */
|
56
|
+
onBlur?: (e: React.FocusEvent<HTMLButtonElement>) => void;
|
57
|
+
/** Additional attributes for the trigger element */
|
58
|
+
inputAttributes?: ActionableProps["attributes"];
|
59
|
+
} & Pick<DropdownMenuProps, "position" | "width" | "fallbackPositions">;
|
60
|
+
export type NativeFragment = {
|
61
|
+
/** Options for the select */
|
62
|
+
/** @deprecated Use <option /> children instead */
|
63
|
+
options?: NativeOption[];
|
64
|
+
/** Callback when the input is focused */
|
65
|
+
onFocus?: (e: React.FocusEvent<HTMLSelectElement>) => void;
|
66
|
+
/** Callback when the input is blurred */
|
67
|
+
onBlur?: (e: React.FocusEvent<HTMLSelectElement>) => void;
|
68
|
+
/** Additional attributes for the input element */
|
69
|
+
inputAttributes?: G.Attributes<"select">;
|
70
|
+
};
|
71
|
+
export type NativeControlledFragment = {
|
70
72
|
value: string;
|
71
73
|
defaultValue?: never;
|
74
|
+
/** Callback when the input value changes */
|
75
|
+
onChange?: G.ChangeHandler<string, React.ChangeEvent<HTMLSelectElement>>;
|
72
76
|
};
|
73
|
-
export type
|
77
|
+
export type NativeUncontrolledFragment = {
|
74
78
|
value?: never;
|
75
79
|
defaultValue?: string;
|
80
|
+
/** Callback when the input value changes */
|
81
|
+
onChange?: G.ChangeHandler<string, React.ChangeEvent<HTMLSelectElement>>;
|
82
|
+
};
|
83
|
+
export type CustomControlledFragment = {
|
84
|
+
multiple?: false;
|
85
|
+
value: string;
|
86
|
+
defaultValue?: never;
|
87
|
+
/** Callback when the input value changes */
|
88
|
+
onChange?: G.ChangeHandler<string>;
|
89
|
+
} | {
|
90
|
+
multiple: true;
|
91
|
+
value: string[];
|
92
|
+
defaultValue?: never[];
|
93
|
+
/** Callback when the input value changes */
|
94
|
+
onChange?: G.ChangeHandler<string[]>;
|
95
|
+
};
|
96
|
+
export type CustomUncontrolledFragment = {
|
97
|
+
multiple?: false;
|
98
|
+
value?: never;
|
99
|
+
defaultValue?: string;
|
100
|
+
/** Callback when the input value changes */
|
101
|
+
onChange?: G.ChangeHandler<string>;
|
102
|
+
} | {
|
103
|
+
multiple: true;
|
104
|
+
value?: never[];
|
105
|
+
defaultValue?: string[];
|
106
|
+
/** Callback when the input value changes */
|
107
|
+
onChange?: G.ChangeHandler<string[]>;
|
108
|
+
};
|
109
|
+
export type NativeControlledProps = BaseFragment & NativeFragment & NativeControlledFragment;
|
110
|
+
export type NativeUncontrolledProps = BaseFragment & NativeFragment & NativeUncontrolledFragment;
|
111
|
+
export type CustomControlledProps = BaseFragment & CustomFragment & CustomControlledFragment;
|
112
|
+
export type CustomUncontrolledProps = BaseFragment & CustomFragment & CustomUncontrolledFragment;
|
113
|
+
export type NativeProps = NativeControlledProps | NativeUncontrolledProps;
|
114
|
+
export type CustomProps = CustomControlledProps | CustomUncontrolledProps;
|
115
|
+
export type Props = NativeControlledProps | NativeUncontrolledProps | CustomControlledProps | CustomUncontrolledProps;
|
116
|
+
export type TriggerProps = Pick<CustomControlledProps, "disabled" | "onClick" | "onFocus" | "onBlur" | "inputAttributes" | "startSlot" | "icon" | "size" | "placeholder" | "value" | "name" | "id"> & {
|
117
|
+
children?: React.ReactNode;
|
118
|
+
};
|
119
|
+
export type RootProps = Omit<Props, "children"> & {
|
120
|
+
children: (props: Omit<Props, "children">) => React.ReactNode;
|
76
121
|
};
|
77
|
-
export type
|
122
|
+
export type SelectContextProps = CustomControlledProps;
|
78
123
|
export {};
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
import SelectCustomControlled from "./SelectCustomControlled.js";
|
3
|
+
import SelectCustomUncontrolled from "./SelectCustomUncontrolled.js";
|
4
|
+
const SelectCustom = (props) => {
|
5
|
+
const { value } = props;
|
6
|
+
if (value !== undefined) {
|
7
|
+
return _jsx(SelectCustomControlled, { ...props });
|
8
|
+
}
|
9
|
+
return _jsx(SelectCustomUncontrolled, { ...props });
|
10
|
+
};
|
11
|
+
SelectCustom.displayName = "SelectCustom";
|
12
|
+
export default SelectCustom;
|
@@ -0,0 +1,105 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
|
+
import React from "react";
|
3
|
+
import DropdownMenu from "../DropdownMenu/index.js";
|
4
|
+
import Icon from "../Icon/index.js";
|
5
|
+
import CheckmarkIcon from "../../icons/Checkmark.js";
|
6
|
+
import { responsivePropDependency } from "../../utilities/props.js";
|
7
|
+
import SelectRoot from "./SelectRoot.js";
|
8
|
+
import SelectTrigger from "./SelectTrigger.js";
|
9
|
+
import SelectOption from "./SelectOption.js";
|
10
|
+
import SelectOptionGroup from "./SelectOptionGroup.js";
|
11
|
+
const SelectCustomControlled = (props) => {
|
12
|
+
const { children, value, name, placeholder, size, multiple, width = "trigger", position, fallbackPositions, } = props;
|
13
|
+
const initialFocusRef = React.useRef(null);
|
14
|
+
const searchStringRef = React.useRef("");
|
15
|
+
const searchTimeoutRef = React.useRef(null);
|
16
|
+
const dropdownRef = React.useRef(null);
|
17
|
+
const indexedOptions = [];
|
18
|
+
const selectedOptions = [];
|
19
|
+
const hasValue = multiple ? value.length > 0 : value;
|
20
|
+
const traverseOptionList = (children) => {
|
21
|
+
return React.Children.map(children, (child, index) => {
|
22
|
+
if (!React.isValidElement(child))
|
23
|
+
return null;
|
24
|
+
if (child.type === SelectOption) {
|
25
|
+
const component = child;
|
26
|
+
const option = component.props;
|
27
|
+
const matchingValue = multiple ? value.includes(option.value) : option.value === value;
|
28
|
+
const selected = matchingValue || (!placeholder && !value && index === 0);
|
29
|
+
if (selected)
|
30
|
+
selectedOptions.push(option);
|
31
|
+
indexedOptions.push({
|
32
|
+
value: option.value,
|
33
|
+
text: typeof option.children === "string" ? option.children : option.value,
|
34
|
+
});
|
35
|
+
return React.cloneElement(component, {
|
36
|
+
key: option.value,
|
37
|
+
onClick: (e) => {
|
38
|
+
option.onClick?.(e);
|
39
|
+
if (multiple) {
|
40
|
+
const nextValue = selected
|
41
|
+
? value.filter((v) => v !== option.value)
|
42
|
+
: [...value, option.value];
|
43
|
+
props.onChange?.({ value: nextValue, name });
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
props.onChange?.({ value: option.value, name });
|
47
|
+
}
|
48
|
+
},
|
49
|
+
startSlot: option?.startSlot || (hasValue && _jsx(Icon, { svg: selected ? CheckmarkIcon : null })),
|
50
|
+
attributes: {
|
51
|
+
...component.props.attributes,
|
52
|
+
ref: selected ? initialFocusRef : undefined,
|
53
|
+
},
|
54
|
+
});
|
55
|
+
}
|
56
|
+
if (child.type === SelectOptionGroup) {
|
57
|
+
const component = child;
|
58
|
+
const optionGroup = component.props;
|
59
|
+
return React.cloneElement(component, {
|
60
|
+
key: optionGroup.label,
|
61
|
+
children: traverseOptionList(optionGroup.children),
|
62
|
+
});
|
63
|
+
}
|
64
|
+
return null;
|
65
|
+
});
|
66
|
+
};
|
67
|
+
// eslint-disable-next-line react-hooks/refs
|
68
|
+
const resolvedChildren = traverseOptionList(children);
|
69
|
+
const handleKeyDown = (e) => {
|
70
|
+
const key = e.key;
|
71
|
+
// Only handle alphanumeric and space characters for type-ahead
|
72
|
+
if (key.length !== 1 || !key.match(/[\w\s]/))
|
73
|
+
return;
|
74
|
+
if (searchTimeoutRef.current)
|
75
|
+
clearTimeout(searchTimeoutRef.current);
|
76
|
+
searchStringRef.current += key.toLowerCase();
|
77
|
+
const matchingOption = indexedOptions.find((option) => option.text.toLowerCase().startsWith(searchStringRef.current));
|
78
|
+
if (matchingOption && dropdownRef.current) {
|
79
|
+
const button = dropdownRef.current.querySelector(`[value="${matchingOption.value}"]`);
|
80
|
+
button?.focus();
|
81
|
+
}
|
82
|
+
searchTimeoutRef.current = setTimeout(() => {
|
83
|
+
searchStringRef.current = "";
|
84
|
+
}, 1000);
|
85
|
+
};
|
86
|
+
return (_jsx(SelectRoot, { ...props, children: (props) => {
|
87
|
+
return (_jsxs(DropdownMenu, { width: width, disableHideAnimation: true, position: position ?? "bottom", fallbackPositions: fallbackPositions ?? (position ? undefined : ["bottom", "top"]), fallbackAdjustLayout: true, fallbackMinHeight: "150px", borderRadius: responsivePropDependency(size, (size) => size === "large" || size === "xlarge" ? "medium" : "small"), initialFocusRef: initialFocusRef, children: [_jsx(DropdownMenu.Trigger, { children: (attributes) => {
|
88
|
+
const triggerProps = {
|
89
|
+
...props,
|
90
|
+
inputAttributes: {
|
91
|
+
...props.inputAttributes,
|
92
|
+
...attributes,
|
93
|
+
},
|
94
|
+
};
|
95
|
+
return (_jsx(SelectTrigger, { ...triggerProps, value: value, children: selectedOptions?.map((option) => option.children).join(", ") }));
|
96
|
+
} }), _jsx(DropdownMenu.Content, { attributes: {
|
97
|
+
ref: dropdownRef,
|
98
|
+
onKeyDown: handleKeyDown,
|
99
|
+
// Ignore the default menu role since we're using options
|
100
|
+
role: undefined,
|
101
|
+
}, children: resolvedChildren })] }));
|
102
|
+
} }));
|
103
|
+
};
|
104
|
+
SelectCustomControlled.displayName = "SelectCustomControlled";
|
105
|
+
export default SelectCustomControlled;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use client";
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
3
|
+
import React from "react";
|
4
|
+
import SelectCustomControlled from "./SelectCustomControlled.js";
|
5
|
+
const SelectCustomUncontrolled = (props) => {
|
6
|
+
const { defaultValue, onChange, multiple, ...controlledProps } = props;
|
7
|
+
const [value, setValue] = React.useState(defaultValue || (multiple ? [] : ""));
|
8
|
+
return (
|
9
|
+
// @ts-expect-error -- avoid complicating the types and implementation
|
10
|
+
_jsx(SelectCustomControlled, { ...controlledProps, multiple: multiple, value: value,
|
11
|
+
// @ts-expect-error -- avoid complicating the types and implementation
|
12
|
+
onChange: (args) => {
|
13
|
+
setValue(args.value);
|
14
|
+
onChange?.(args);
|
15
|
+
} }));
|
16
|
+
};
|
17
|
+
SelectCustomUncontrolled.displayName = "SelectCustomUncontrolled";
|
18
|
+
export default SelectCustomUncontrolled;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
import Icon from "../Icon/index.js";
|
3
|
+
import { responsivePropDependency } from "../../utilities/props.js";
|
4
|
+
import IconArrow from "../../icons/ChevronVertical.js";
|
5
|
+
import s from "./Select.module.css";
|
6
|
+
const SelectEndContent = (props) => {
|
7
|
+
const { disabled, size } = props;
|
8
|
+
return (_jsx("div", { className: s.arrow, children: _jsx(Icon, { svg: IconArrow, color: disabled ? "disabled" : "neutral-faded", size: responsivePropDependency(size, (size) => {
|
9
|
+
return size === "large" || size === "xlarge" ? 5 : 4;
|
10
|
+
}) }) }));
|
11
|
+
};
|
12
|
+
export default SelectEndContent;
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"use client";
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
3
|
+
import React from "react";
|
4
|
+
import { classNames } from "../../utilities/props.js";
|
5
|
+
import SelectStartContent from "./SelectStartContent.js";
|
6
|
+
import SelectEndContent from "./SelectEndContent.js";
|
7
|
+
import s from "./Select.module.css";
|
8
|
+
const SelectNative = (props) => {
|
9
|
+
const { startSlot, icon, size, inputAttributes, onFocus, onBlur, disabled, name, value, defaultValue, onChange, onClick, placeholder, id, children, } = props;
|
10
|
+
const [empty, setEmpty] = React.useState(value === undefined ? !defaultValue : !value);
|
11
|
+
const selectClassNames = classNames(s.input, placeholder && empty && s["input--placeholder"]);
|
12
|
+
const handleChange = (event) => {
|
13
|
+
const nextValue = event.target.value;
|
14
|
+
// Uncontrolled placeholder
|
15
|
+
if (value === undefined)
|
16
|
+
setEmpty(!nextValue);
|
17
|
+
if (!onChange)
|
18
|
+
return;
|
19
|
+
onChange({ name, value: nextValue, event });
|
20
|
+
};
|
21
|
+
// Controlled placeholder
|
22
|
+
React.useEffect(() => {
|
23
|
+
if (value === undefined)
|
24
|
+
return;
|
25
|
+
setEmpty(!value);
|
26
|
+
}, [value]);
|
27
|
+
return (_jsxs(_Fragment, { children: [_jsx(SelectStartContent, { startSlot: startSlot, icon: icon, size: size }), _jsxs("select", { ...inputAttributes, onFocus: onFocus || inputAttributes?.onFocus, onBlur: onBlur || inputAttributes?.onBlur, onClick: onClick || inputAttributes?.onClick, className: selectClassNames, disabled: disabled, name: name, value: value, defaultValue: defaultValue, onChange: handleChange, id: id, children: [placeholder && _jsx("option", { value: "", children: placeholder }), children] }), _jsx(SelectEndContent, { disabled: disabled, size: size })] }));
|
28
|
+
};
|
29
|
+
export default SelectNative;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
import DropdownMenu from "../DropdownMenu/index.js";
|
3
|
+
import s from "./Select.module.css";
|
4
|
+
const SelectOption = (props) => {
|
5
|
+
const { value, ...menuItemProps } = props;
|
6
|
+
return (_jsx(DropdownMenu.Item, { ...menuItemProps, className: [menuItemProps.className, s.option], color: "neutral", attributes: {
|
7
|
+
...menuItemProps.attributes,
|
8
|
+
value,
|
9
|
+
role: "option",
|
10
|
+
} }));
|
11
|
+
};
|
12
|
+
SelectOption.displayName = "Select.Option";
|
13
|
+
export default SelectOption;
|