@refraktor/core 0.0.4 → 0.0.5
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/build/components/progress-circle/progress-circle.d.ts.map +1 -1
- package/build/components/progress-circle/progress-circle.js +6 -6
- package/build/components/progress-circle/progress-circle.styles.d.ts +2 -7
- package/build/components/progress-circle/progress-circle.styles.d.ts.map +1 -1
- package/build/components/progress-circle/progress-circle.styles.js +2 -23
- package/build/components/progress-circle/progress-circle.types.d.ts +4 -3
- package/build/components/progress-circle/progress-circle.types.d.ts.map +1 -1
- package/build/components/slider/slider.d.ts.map +1 -1
- package/build/components/slider/slider.js +69 -20
- package/build/components/tooltip/tooltip.js +1 -1
- package/build/style.css +2 -2
- package/package.json +30 -3
- package/.turbo/turbo-build.log +0 -4
- package/refraktor-core-0.0.1-alpha.0.tgz +0 -0
- package/src/components/accordion/accordion-control/accordion-control.tsx +0 -156
- package/src/components/accordion/accordion-control/index.ts +0 -1
- package/src/components/accordion/accordion-item/accordion-item.tsx +0 -40
- package/src/components/accordion/accordion-item/index.ts +0 -1
- package/src/components/accordion/accordion-panel/accordion-panel.tsx +0 -58
- package/src/components/accordion/accordion-panel/index.ts +0 -1
- package/src/components/accordion/accordion.context.ts +0 -93
- package/src/components/accordion/accordion.styles.ts +0 -60
- package/src/components/accordion/accordion.test.tsx +0 -174
- package/src/components/accordion/accordion.tsx +0 -203
- package/src/components/accordion/accordion.types.ts +0 -126
- package/src/components/accordion/index.ts +0 -17
- package/src/components/avatar/avatar-group/avatar-group.tsx +0 -73
- package/src/components/avatar/avatar-group/index.ts +0 -1
- package/src/components/avatar/avatar.styles.ts +0 -11
- package/src/components/avatar/avatar.tsx +0 -142
- package/src/components/avatar/avatar.types.ts +0 -86
- package/src/components/avatar/index.ts +0 -8
- package/src/components/badge/badge.styles.ts +0 -21
- package/src/components/badge/badge.tsx +0 -62
- package/src/components/badge/badge.types.ts +0 -40
- package/src/components/badge/index.ts +0 -2
- package/src/components/breadcrumbs/breadcrumbs.styles.ts +0 -55
- package/src/components/breadcrumbs/breadcrumbs.test.tsx +0 -136
- package/src/components/breadcrumbs/breadcrumbs.tsx +0 -199
- package/src/components/breadcrumbs/breadcrumbs.types.ts +0 -78
- package/src/components/breadcrumbs/breadcrumbs.utils.ts +0 -70
- package/src/components/breadcrumbs/index.ts +0 -6
- package/src/components/button/button.styles.ts +0 -28
- package/src/components/button/button.test.tsx +0 -57
- package/src/components/button/button.tsx +0 -110
- package/src/components/button/button.types.ts +0 -69
- package/src/components/button/index.ts +0 -2
- package/src/components/checkbox/checkbox-group/checkbox-group.tsx +0 -93
- package/src/components/checkbox/checkbox-group/index.ts +0 -1
- package/src/components/checkbox/checkbox.context.ts +0 -14
- package/src/components/checkbox/checkbox.styles.ts +0 -49
- package/src/components/checkbox/checkbox.test.tsx +0 -80
- package/src/components/checkbox/checkbox.tsx +0 -192
- package/src/components/checkbox/checkbox.types.ts +0 -125
- package/src/components/checkbox/index.ts +0 -10
- package/src/components/chip/chip-group/chip-group.tsx +0 -107
- package/src/components/chip/chip-group/index.ts +0 -1
- package/src/components/chip/chip.context.ts +0 -15
- package/src/components/chip/chip.styles.ts +0 -36
- package/src/components/chip/chip.test.tsx +0 -197
- package/src/components/chip/chip.tsx +0 -208
- package/src/components/chip/chip.types.ts +0 -134
- package/src/components/chip/index.ts +0 -10
- package/src/components/color-swatch/color-swatch.styles.ts +0 -11
- package/src/components/color-swatch/color-swatch.test.tsx +0 -80
- package/src/components/color-swatch/color-swatch.tsx +0 -84
- package/src/components/color-swatch/color-swatch.types.ts +0 -46
- package/src/components/color-swatch/index.ts +0 -2
- package/src/components/drawer/drawer-body/drawer-body.tsx +0 -29
- package/src/components/drawer/drawer-body/index.ts +0 -1
- package/src/components/drawer/drawer-close/drawer-close.tsx +0 -43
- package/src/components/drawer/drawer-close/index.ts +0 -1
- package/src/components/drawer/drawer-content/drawer-content.tsx +0 -135
- package/src/components/drawer/drawer-content/index.ts +0 -1
- package/src/components/drawer/drawer-header/drawer-header.tsx +0 -40
- package/src/components/drawer/drawer-header/index.ts +0 -1
- package/src/components/drawer/drawer-overlay/drawer-overlay.tsx +0 -87
- package/src/components/drawer/drawer-overlay/index.ts +0 -1
- package/src/components/drawer/drawer-root/drawer-root.tsx +0 -93
- package/src/components/drawer/drawer-root/index.ts +0 -1
- package/src/components/drawer/drawer.context.ts +0 -26
- package/src/components/drawer/drawer.styles.ts +0 -32
- package/src/components/drawer/drawer.test.tsx +0 -274
- package/src/components/drawer/drawer.tsx +0 -58
- package/src/components/drawer/drawer.types.ts +0 -192
- package/src/components/drawer/index.ts +0 -18
- package/src/components/drawer/use-drawer.ts +0 -94
- package/src/components/file-input/file-input.test.tsx +0 -134
- package/src/components/file-input/file-input.tsx +0 -224
- package/src/components/file-input/file-input.types.ts +0 -78
- package/src/components/file-input/file-input.utils.test.ts +0 -36
- package/src/components/file-input/file-input.utils.ts +0 -130
- package/src/components/file-input/index.ts +0 -2
- package/src/components/for/for.test.tsx +0 -66
- package/src/components/for/for.tsx +0 -53
- package/src/components/for/for.types.ts +0 -40
- package/src/components/for/index.ts +0 -2
- package/src/components/index.ts +0 -35
- package/src/components/input/index.ts +0 -2
- package/src/components/input/input-description/index.ts +0 -2
- package/src/components/input/input-description/input-description.tsx +0 -36
- package/src/components/input/input-error/index.ts +0 -2
- package/src/components/input/input-error/input-error.tsx +0 -36
- package/src/components/input/input-field/index.ts +0 -1
- package/src/components/input/input-field/input-field.styles.ts +0 -23
- package/src/components/input/input-field/input-field.tsx +0 -94
- package/src/components/input/input-label/index.ts +0 -2
- package/src/components/input/input-label/input-label.tsx +0 -47
- package/src/components/input/input-wrapper/index.ts +0 -2
- package/src/components/input/input-wrapper/input-wrapper.tsx +0 -43
- package/src/components/input/input.tsx +0 -71
- package/src/components/input/input.types.ts +0 -111
- package/src/components/loader/index.ts +0 -2
- package/src/components/loader/loader.tsx +0 -89
- package/src/components/loader/loader.types.ts +0 -33
- package/src/components/menu/index.ts +0 -24
- package/src/components/menu/menu-dropdown/index.ts +0 -1
- package/src/components/menu/menu-dropdown/menu-dropdown.tsx +0 -220
- package/src/components/menu/menu-item/index.ts +0 -1
- package/src/components/menu/menu-item/menu-item.tsx +0 -126
- package/src/components/menu/menu-label/index.ts +0 -1
- package/src/components/menu/menu-label/menu-label.tsx +0 -30
- package/src/components/menu/menu-separator/index.ts +0 -1
- package/src/components/menu/menu-separator/menu-separator.tsx +0 -28
- package/src/components/menu/menu-sub/index.ts +0 -1
- package/src/components/menu/menu-sub/menu-sub.tsx +0 -117
- package/src/components/menu/menu-sub-dropdown/index.ts +0 -1
- package/src/components/menu/menu-sub-dropdown/menu-sub-dropdown.tsx +0 -221
- package/src/components/menu/menu-sub-trigger/index.ts +0 -1
- package/src/components/menu/menu-sub-trigger/menu-sub-trigger.tsx +0 -164
- package/src/components/menu/menu-trigger/index.ts +0 -1
- package/src/components/menu/menu-trigger/menu-trigger.tsx +0 -98
- package/src/components/menu/menu.context.ts +0 -162
- package/src/components/menu/menu.test.tsx +0 -136
- package/src/components/menu/menu.tsx +0 -133
- package/src/components/menu/menu.types.ts +0 -291
- package/src/components/menu/use-menu.ts +0 -204
- package/src/components/modal/index.ts +0 -18
- package/src/components/modal/modal-body/index.ts +0 -1
- package/src/components/modal/modal-body/modal-body.tsx +0 -29
- package/src/components/modal/modal-close/index.ts +0 -1
- package/src/components/modal/modal-close/modal-close.tsx +0 -43
- package/src/components/modal/modal-content/index.ts +0 -1
- package/src/components/modal/modal-content/modal-content.tsx +0 -119
- package/src/components/modal/modal-header/index.ts +0 -1
- package/src/components/modal/modal-header/modal-header.tsx +0 -40
- package/src/components/modal/modal-overlay/index.ts +0 -1
- package/src/components/modal/modal-overlay/modal-overlay.tsx +0 -87
- package/src/components/modal/modal-root/index.ts +0 -1
- package/src/components/modal/modal-root/modal-root.tsx +0 -93
- package/src/components/modal/modal.context.ts +0 -26
- package/src/components/modal/modal.test.tsx +0 -316
- package/src/components/modal/modal.tsx +0 -58
- package/src/components/modal/modal.types.ts +0 -189
- package/src/components/modal/use-modal.ts +0 -94
- package/src/components/number-input/index.ts +0 -2
- package/src/components/number-input/number-input.styles.ts +0 -37
- package/src/components/number-input/number-input.test.tsx +0 -22
- package/src/components/number-input/number-input.tsx +0 -381
- package/src/components/number-input/number-input.types.ts +0 -58
- package/src/components/pagination/index.ts +0 -7
- package/src/components/pagination/pagination.styles.ts +0 -84
- package/src/components/pagination/pagination.test.tsx +0 -117
- package/src/components/pagination/pagination.tsx +0 -371
- package/src/components/pagination/pagination.types.ts +0 -95
- package/src/components/pagination/pagination.utils.ts +0 -88
- package/src/components/password-input/index.ts +0 -2
- package/src/components/password-input/password-input.test.tsx +0 -72
- package/src/components/password-input/password-input.tsx +0 -85
- package/src/components/password-input/password-input.types.ts +0 -30
- package/src/components/pin-input/index.ts +0 -2
- package/src/components/pin-input/pin-input.test.tsx +0 -149
- package/src/components/pin-input/pin-input.tsx +0 -473
- package/src/components/pin-input/pin-input.types.ts +0 -78
- package/src/components/popover/index.ts +0 -12
- package/src/components/popover/popover-dropdown/index.ts +0 -1
- package/src/components/popover/popover-dropdown/popover-dropdown.tsx +0 -94
- package/src/components/popover/popover-trigger/index.ts +0 -1
- package/src/components/popover/popover-trigger/popover-trigger.tsx +0 -49
- package/src/components/popover/popover.context.ts +0 -20
- package/src/components/popover/popover.tsx +0 -113
- package/src/components/popover/popover.types.ts +0 -137
- package/src/components/popover/use-popover.ts +0 -219
- package/src/components/portal/index.ts +0 -2
- package/src/components/portal/portal.test.tsx +0 -39
- package/src/components/portal/portal.tsx +0 -104
- package/src/components/portal/portal.types.ts +0 -31
- package/src/components/progress/index.ts +0 -2
- package/src/components/progress/progress.styles.ts +0 -25
- package/src/components/progress/progress.test.tsx +0 -107
- package/src/components/progress/progress.tsx +0 -93
- package/src/components/progress/progress.types.ts +0 -52
- package/src/components/progress-circle/index.ts +0 -5
- package/src/components/progress-circle/progress-circle.styles.ts +0 -31
- package/src/components/progress-circle/progress-circle.test.tsx +0 -140
- package/src/components/progress-circle/progress-circle.tsx +0 -124
- package/src/components/progress-circle/progress-circle.types.ts +0 -52
- package/src/components/radio/index.ts +0 -10
- package/src/components/radio/radio-group/index.ts +0 -1
- package/src/components/radio/radio-group/radio-group.tsx +0 -89
- package/src/components/radio/radio.context.ts +0 -14
- package/src/components/radio/radio.styles.ts +0 -49
- package/src/components/radio/radio.test.tsx +0 -75
- package/src/components/radio/radio.tsx +0 -173
- package/src/components/radio/radio.types.ts +0 -126
- package/src/components/scroll-area/index.ts +0 -6
- package/src/components/scroll-area/scroll-area.test.tsx +0 -72
- package/src/components/scroll-area/scroll-area.tsx +0 -70
- package/src/components/scroll-area/scroll-area.types.ts +0 -37
- package/src/components/segmented-control/index.ts +0 -6
- package/src/components/segmented-control/segmented-control.styles.ts +0 -37
- package/src/components/segmented-control/segmented-control.test.tsx +0 -170
- package/src/components/segmented-control/segmented-control.tsx +0 -255
- package/src/components/segmented-control/segmented-control.types.ts +0 -78
- package/src/components/select/index.ts +0 -20
- package/src/components/select/select-dropdown/index.ts +0 -1
- package/src/components/select/select-dropdown/select-dropdown.tsx +0 -299
- package/src/components/select/select-group/index.ts +0 -1
- package/src/components/select/select-group/select-group.tsx +0 -47
- package/src/components/select/select-item/index.ts +0 -1
- package/src/components/select/select-item/select-item.tsx +0 -157
- package/src/components/select/select-root/index.ts +0 -1
- package/src/components/select/select-root/select-root.tsx +0 -333
- package/src/components/select/select-trigger/index.ts +0 -1
- package/src/components/select/select-trigger/select-trigger.tsx +0 -123
- package/src/components/select/select.context.ts +0 -140
- package/src/components/select/select.test.tsx +0 -190
- package/src/components/select/select.tsx +0 -82
- package/src/components/select/select.types.ts +0 -272
- package/src/components/select/use-select.ts +0 -170
- package/src/components/slider/index.ts +0 -7
- package/src/components/slider/slider.styles.ts +0 -37
- package/src/components/slider/slider.tsx +0 -275
- package/src/components/slider/slider.types.ts +0 -82
- package/src/components/switch/index.ts +0 -2
- package/src/components/switch/switch.styles.ts +0 -31
- package/src/components/switch/switch.tsx +0 -132
- package/src/components/switch/switch.types.ts +0 -62
- package/src/components/table/index.ts +0 -24
- package/src/components/table/table-body/index.ts +0 -1
- package/src/components/table/table-body/table-body.tsx +0 -37
- package/src/components/table/table-caption/index.ts +0 -1
- package/src/components/table/table-caption/table-caption.tsx +0 -32
- package/src/components/table/table-cell/index.ts +0 -1
- package/src/components/table/table-cell/table-cell.tsx +0 -33
- package/src/components/table/table-head/index.ts +0 -1
- package/src/components/table/table-head/table-head.tsx +0 -29
- package/src/components/table/table-header-cell/index.ts +0 -1
- package/src/components/table/table-header-cell/table-header-cell.tsx +0 -33
- package/src/components/table/table-row/index.ts +0 -1
- package/src/components/table/table-row/table-row.tsx +0 -30
- package/src/components/table/table.context.ts +0 -18
- package/src/components/table/table.styles.ts +0 -62
- package/src/components/table/table.test.tsx +0 -145
- package/src/components/table/table.tsx +0 -91
- package/src/components/table/table.types.ts +0 -145
- package/src/components/tabs/index.ts +0 -18
- package/src/components/tabs/tabs-list/index.ts +0 -1
- package/src/components/tabs/tabs-list/tabs-list.tsx +0 -42
- package/src/components/tabs/tabs-panel/index.ts +0 -1
- package/src/components/tabs/tabs-panel/tabs-panel.tsx +0 -58
- package/src/components/tabs/tabs-tab/index.ts +0 -1
- package/src/components/tabs/tabs-tab/tabs-tab.tsx +0 -210
- package/src/components/tabs/tabs.context.ts +0 -88
- package/src/components/tabs/tabs.styles.ts +0 -92
- package/src/components/tabs/tabs.test.tsx +0 -167
- package/src/components/tabs/tabs.tsx +0 -137
- package/src/components/tabs/tabs.types.ts +0 -128
- package/src/components/textarea/index.ts +0 -2
- package/src/components/textarea/textarea-field/index.ts +0 -1
- package/src/components/textarea/textarea-field/textarea-field.styles.ts +0 -34
- package/src/components/textarea/textarea-field/textarea-field.tsx +0 -96
- package/src/components/textarea/textarea.tsx +0 -64
- package/src/components/textarea/textarea.types.ts +0 -80
- package/src/components/timeline/index.ts +0 -11
- package/src/components/timeline/timeline-item/index.ts +0 -1
- package/src/components/timeline/timeline-item/timeline-item.tsx +0 -158
- package/src/components/timeline/timeline.context.ts +0 -21
- package/src/components/timeline/timeline.styles.ts +0 -135
- package/src/components/timeline/timeline.test.tsx +0 -150
- package/src/components/timeline/timeline.tsx +0 -124
- package/src/components/timeline/timeline.types.ts +0 -91
- package/src/components/tooltip/index.ts +0 -8
- package/src/components/tooltip/tooltip.tsx +0 -164
- package/src/components/tooltip/tooltip.types.ts +0 -104
- package/src/components/tooltip/use-tooltip.ts +0 -200
- package/src/components/transition/index.ts +0 -11
- package/src/components/transition/transition.test.tsx +0 -126
- package/src/components/transition/transition.tsx +0 -441
- package/src/components/transition/transition.types.ts +0 -97
- package/src/components/transition/transitions.ts +0 -140
- package/src/icons/check.tsx +0 -25
- package/src/icons/chevron.tsx +0 -46
- package/src/icons/eye-off.tsx +0 -30
- package/src/icons/eye.tsx +0 -24
- package/src/icons/index.ts +0 -7
- package/src/icons/minus.tsx +0 -24
- package/src/icons/types.ts +0 -9
- package/src/icons/user.tsx +0 -18
- package/src/icons/x.tsx +0 -35
- package/src/index.ts +0 -5
- package/src/style.css +0 -334
- package/src/theme/ThemeProvider/ThemeProvider.tsx +0 -111
- package/src/theme/ThemeProvider/context.ts +0 -7
- package/src/theme/ThemeProvider/generateVariables.test.ts +0 -49
- package/src/theme/ThemeProvider/generateVariables.ts +0 -124
- package/src/theme/ThemeProvider/index.ts +0 -3
- package/src/theme/ThemeProvider/types.ts +0 -37
- package/src/theme/createTheme/createTheme.ts +0 -41
- package/src/theme/createTheme/index.ts +0 -7
- package/src/theme/createTheme/types.ts +0 -62
- package/src/theme/defaults/colors.ts +0 -203
- package/src/theme/defaults/settings.ts +0 -8
- package/src/theme/index.ts +0 -4
- package/src/theme/types.ts +0 -31
- package/src/theme/utils/get-radius.ts +0 -23
- package/src/theme/utils/get-shade.ts +0 -16
- package/src/theme/utils/index.ts +0 -3
- package/src/theme/utils/use-theme.ts +0 -27
- package/src/utils/configs/create-config.ts +0 -15
- package/src/utils/configs/index.ts +0 -3
- package/src/utils/configs/use-class-names.ts +0 -41
- package/src/utils/configs/use-props.ts +0 -55
- package/src/utils/cx/index.ts +0 -6
- package/src/utils/factory/factory.ts +0 -23
- package/src/utils/factory/index.ts +0 -14
- package/src/utils/factory/types.ts +0 -92
- package/src/utils/index.ts +0 -3
- package/src/vitest/index.ts +0 -1
- package/src/vitest/setup.tsx +0 -20
- package/src/vitest/utils.tsx +0 -59
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/vitest.config.js +0 -19
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import { describe, expect, it, vi } from "vitest";
|
|
3
|
-
import { render, screen, userEvent, waitFor } from "../../vitest";
|
|
4
|
-
import Select from "./select";
|
|
5
|
-
|
|
6
|
-
describe("@refraktor/core/Select", () => {
|
|
7
|
-
const transitionProps = {
|
|
8
|
-
duration: 0,
|
|
9
|
-
immediate: true
|
|
10
|
-
} as const;
|
|
11
|
-
|
|
12
|
-
it("supports built-in data mode", async () => {
|
|
13
|
-
const user = userEvent.setup();
|
|
14
|
-
|
|
15
|
-
await render(
|
|
16
|
-
<Select
|
|
17
|
-
placeholder="Pick framework"
|
|
18
|
-
transitionProps={transitionProps}
|
|
19
|
-
data={[
|
|
20
|
-
{ value: "react", label: "React" },
|
|
21
|
-
{ value: "vue", label: "Vue" }
|
|
22
|
-
]}
|
|
23
|
-
/>
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
const trigger = screen.getByRole("combobox");
|
|
27
|
-
expect(trigger).toHaveAttribute("placeholder", "Pick framework");
|
|
28
|
-
|
|
29
|
-
await user.click(trigger);
|
|
30
|
-
await user.click(screen.getByRole("option", { name: "React" }));
|
|
31
|
-
|
|
32
|
-
expect(trigger).toHaveValue("React");
|
|
33
|
-
|
|
34
|
-
await waitFor(() => {
|
|
35
|
-
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("renders defaultValue label in trigger before opening", async () => {
|
|
40
|
-
await render(
|
|
41
|
-
<Select
|
|
42
|
-
defaultValue="apple"
|
|
43
|
-
data={[
|
|
44
|
-
{ value: "apple", label: "Apple" },
|
|
45
|
-
{ value: "orange", label: "Orange" }
|
|
46
|
-
]}
|
|
47
|
-
/>
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
expect(screen.getByRole("combobox")).toHaveValue("Apple");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("renders searchable input inside dropdown", async () => {
|
|
54
|
-
const user = userEvent.setup();
|
|
55
|
-
|
|
56
|
-
await render(
|
|
57
|
-
<Select
|
|
58
|
-
searchable
|
|
59
|
-
transitionProps={transitionProps}
|
|
60
|
-
data={[
|
|
61
|
-
{ value: "react", label: "React" },
|
|
62
|
-
{ value: "vue", label: "Vue" },
|
|
63
|
-
{ value: "solid", label: "Solid" }
|
|
64
|
-
]}
|
|
65
|
-
/>
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
await user.click(screen.getByRole("combobox"));
|
|
69
|
-
|
|
70
|
-
const searchInput = screen.getByPlaceholderText("Search...");
|
|
71
|
-
expect(searchInput).toBeInTheDocument();
|
|
72
|
-
|
|
73
|
-
await user.type(searchInput, "vu");
|
|
74
|
-
|
|
75
|
-
expect(screen.getByRole("option", { name: "Vue" })).toBeInTheDocument();
|
|
76
|
-
expect(
|
|
77
|
-
screen.queryByRole("option", { name: "React" })
|
|
78
|
-
).not.toBeInTheDocument();
|
|
79
|
-
|
|
80
|
-
await user.clear(searchInput);
|
|
81
|
-
await user.type(searchInput, "unknown");
|
|
82
|
-
|
|
83
|
-
expect(screen.getByText("No options")).toBeInTheDocument();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("supports compound mode with groups", async () => {
|
|
87
|
-
const user = userEvent.setup();
|
|
88
|
-
|
|
89
|
-
await render(
|
|
90
|
-
<Select.Root transitionProps={transitionProps}>
|
|
91
|
-
<Select.Trigger />
|
|
92
|
-
|
|
93
|
-
<Select.Dropdown>
|
|
94
|
-
<Select.Group label="Frontend">
|
|
95
|
-
<Select.Item value="react">React</Select.Item>
|
|
96
|
-
</Select.Group>
|
|
97
|
-
|
|
98
|
-
<Select.Group label="Backend">
|
|
99
|
-
<Select.Item value="node">Node.js</Select.Item>
|
|
100
|
-
</Select.Group>
|
|
101
|
-
</Select.Dropdown>
|
|
102
|
-
</Select.Root>
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
const trigger = screen.getByRole("combobox");
|
|
106
|
-
|
|
107
|
-
await user.click(trigger);
|
|
108
|
-
expect(screen.getByText("Frontend")).toBeInTheDocument();
|
|
109
|
-
expect(screen.getByText("Backend")).toBeInTheDocument();
|
|
110
|
-
|
|
111
|
-
await user.click(screen.getByRole("option", { name: "Node.js" }));
|
|
112
|
-
expect(trigger).toHaveValue("Node.js");
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it("supports keyboard selection", async () => {
|
|
116
|
-
const user = userEvent.setup();
|
|
117
|
-
|
|
118
|
-
await render(
|
|
119
|
-
<Select
|
|
120
|
-
transitionProps={transitionProps}
|
|
121
|
-
data={[
|
|
122
|
-
{ value: "react", label: "React" },
|
|
123
|
-
{ value: "vue", label: "Vue" }
|
|
124
|
-
]}
|
|
125
|
-
/>
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
const trigger = screen.getByRole("combobox");
|
|
129
|
-
trigger.focus();
|
|
130
|
-
|
|
131
|
-
await user.keyboard("{ArrowDown}");
|
|
132
|
-
await user.keyboard("{ArrowDown}");
|
|
133
|
-
await user.keyboard("{Enter}");
|
|
134
|
-
|
|
135
|
-
expect(trigger).toHaveValue("Vue");
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it("supports controlled mode", async () => {
|
|
139
|
-
const user = userEvent.setup();
|
|
140
|
-
const onChange = vi.fn();
|
|
141
|
-
|
|
142
|
-
function Demo() {
|
|
143
|
-
const [value, setValue] = useState<string | null>("react");
|
|
144
|
-
|
|
145
|
-
return (
|
|
146
|
-
<Select
|
|
147
|
-
value={value}
|
|
148
|
-
onChange={(nextValue) => {
|
|
149
|
-
onChange(nextValue);
|
|
150
|
-
setValue(nextValue);
|
|
151
|
-
}}
|
|
152
|
-
transitionProps={transitionProps}
|
|
153
|
-
data={[
|
|
154
|
-
{ value: "react", label: "React" },
|
|
155
|
-
{ value: "vue", label: "Vue" }
|
|
156
|
-
]}
|
|
157
|
-
/>
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
await render(<Demo />);
|
|
162
|
-
|
|
163
|
-
await user.click(screen.getByRole("combobox"));
|
|
164
|
-
await user.click(screen.getByRole("option", { name: "Vue" }));
|
|
165
|
-
|
|
166
|
-
expect(onChange).toHaveBeenCalledWith("vue");
|
|
167
|
-
expect(screen.getByRole("combobox")).toHaveValue("Vue");
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it("supports input wrapper props", async () => {
|
|
171
|
-
await render(
|
|
172
|
-
<Select
|
|
173
|
-
label="Framework"
|
|
174
|
-
description="Pick one option"
|
|
175
|
-
error="Selection is required"
|
|
176
|
-
transitionProps={transitionProps}
|
|
177
|
-
data={[
|
|
178
|
-
{ value: "react", label: "React" },
|
|
179
|
-
{ value: "vue", label: "Vue" }
|
|
180
|
-
]}
|
|
181
|
-
/>
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
const trigger = screen.getByLabelText("Framework");
|
|
185
|
-
|
|
186
|
-
expect(trigger).toHaveAttribute("aria-invalid", "true");
|
|
187
|
-
expect(screen.getByText("Pick one option")).toBeInTheDocument();
|
|
188
|
-
expect(screen.getByText("Selection is required")).toBeInTheDocument();
|
|
189
|
-
});
|
|
190
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createClassNamesConfig,
|
|
3
|
-
createComponentConfig,
|
|
4
|
-
factory
|
|
5
|
-
} from "../../utils";
|
|
6
|
-
import { SelectDropdown } from "./select-dropdown";
|
|
7
|
-
import { SelectGroup } from "./select-group";
|
|
8
|
-
import { SelectItem } from "./select-item";
|
|
9
|
-
import { SelectRoot } from "./select-root";
|
|
10
|
-
import { SelectTrigger } from "./select-trigger";
|
|
11
|
-
import type {
|
|
12
|
-
SelectClassNames,
|
|
13
|
-
SelectData,
|
|
14
|
-
SelectFactoryPayload,
|
|
15
|
-
SelectGroupData,
|
|
16
|
-
SelectProps
|
|
17
|
-
} from "./select.types";
|
|
18
|
-
|
|
19
|
-
function isGroupData(item: SelectData): item is SelectGroupData {
|
|
20
|
-
return "items" in item;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const Select = factory<SelectFactoryPayload>((_props, ref) => {
|
|
24
|
-
const { data, children, ...props } = _props;
|
|
25
|
-
|
|
26
|
-
if (children !== undefined && children !== null) {
|
|
27
|
-
return (
|
|
28
|
-
<SelectRoot ref={ref} {...props}>
|
|
29
|
-
{children}
|
|
30
|
-
</SelectRoot>
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return (
|
|
35
|
-
<SelectRoot ref={ref} {...props}>
|
|
36
|
-
<SelectTrigger />
|
|
37
|
-
|
|
38
|
-
<SelectDropdown>
|
|
39
|
-
{(data ?? []).map((entry, index) => {
|
|
40
|
-
if (isGroupData(entry)) {
|
|
41
|
-
return (
|
|
42
|
-
<SelectGroup key={`group-${index}`} label={entry.label}>
|
|
43
|
-
{entry.items.map((item) => (
|
|
44
|
-
<SelectItem
|
|
45
|
-
key={item.value}
|
|
46
|
-
value={item.value}
|
|
47
|
-
disabled={item.disabled}
|
|
48
|
-
textValue={item.textValue}
|
|
49
|
-
>
|
|
50
|
-
{item.label}
|
|
51
|
-
</SelectItem>
|
|
52
|
-
))}
|
|
53
|
-
</SelectGroup>
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return (
|
|
58
|
-
<SelectItem
|
|
59
|
-
key={entry.value}
|
|
60
|
-
value={entry.value}
|
|
61
|
-
disabled={entry.disabled}
|
|
62
|
-
textValue={entry.textValue}
|
|
63
|
-
>
|
|
64
|
-
{entry.label}
|
|
65
|
-
</SelectItem>
|
|
66
|
-
);
|
|
67
|
-
})}
|
|
68
|
-
</SelectDropdown>
|
|
69
|
-
</SelectRoot>
|
|
70
|
-
);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
Select.displayName = "@refraktor/core/Select";
|
|
74
|
-
Select.configure = createComponentConfig<SelectProps>();
|
|
75
|
-
Select.classNames = createClassNamesConfig<SelectClassNames>();
|
|
76
|
-
Select.Root = SelectRoot;
|
|
77
|
-
Select.Trigger = SelectTrigger;
|
|
78
|
-
Select.Dropdown = SelectDropdown;
|
|
79
|
-
Select.Group = SelectGroup;
|
|
80
|
-
Select.Item = SelectItem;
|
|
81
|
-
|
|
82
|
-
export default Select;
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import type { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
2
|
-
import type {
|
|
3
|
-
FlipOptions,
|
|
4
|
-
InlineOptions,
|
|
5
|
-
Placement,
|
|
6
|
-
ShiftOptions
|
|
7
|
-
} from "@floating-ui/react";
|
|
8
|
-
import type { RefraktorRadius, RefraktorSize } from "../../theme";
|
|
9
|
-
import {
|
|
10
|
-
createClassNamesConfig,
|
|
11
|
-
createComponentConfig,
|
|
12
|
-
FactoryPayload
|
|
13
|
-
} from "../../utils";
|
|
14
|
-
import type { TransitionProps } from "../transition";
|
|
15
|
-
import type { InputVariant } from "../input";
|
|
16
|
-
import type { SelectRoot } from "./select-root";
|
|
17
|
-
import type { SelectTrigger } from "./select-trigger";
|
|
18
|
-
import type { SelectDropdown } from "./select-dropdown";
|
|
19
|
-
import type { SelectGroup } from "./select-group";
|
|
20
|
-
import type { SelectItem } from "./select-item";
|
|
21
|
-
|
|
22
|
-
export type SelectClassNames = {
|
|
23
|
-
root?: string;
|
|
24
|
-
trigger?: string;
|
|
25
|
-
triggerInput?: string;
|
|
26
|
-
triggerIcon?: string;
|
|
27
|
-
dropdown?: string;
|
|
28
|
-
search?: string;
|
|
29
|
-
searchInput?: string;
|
|
30
|
-
options?: string;
|
|
31
|
-
group?: string;
|
|
32
|
-
groupLabel?: string;
|
|
33
|
-
item?: string;
|
|
34
|
-
itemLabel?: string;
|
|
35
|
-
itemCheck?: string;
|
|
36
|
-
empty?: string;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export type SelectPositioning = {
|
|
40
|
-
/** The placement of the dropdown relative to the trigger @default `bottom-start` */
|
|
41
|
-
placement?: Placement;
|
|
42
|
-
|
|
43
|
-
/** Offset distance from the trigger in pixels @default `4` */
|
|
44
|
-
offset?: number;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export type SelectMiddlewares = {
|
|
48
|
-
shift?: boolean | ShiftOptions;
|
|
49
|
-
flip?: boolean | FlipOptions;
|
|
50
|
-
inline?: boolean | InlineOptions;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export interface SelectItemData {
|
|
54
|
-
/** Option value */
|
|
55
|
-
value: string;
|
|
56
|
-
|
|
57
|
-
/** Option label */
|
|
58
|
-
label: ReactNode;
|
|
59
|
-
|
|
60
|
-
/** Optional searchable text for non-string labels */
|
|
61
|
-
textValue?: string;
|
|
62
|
-
|
|
63
|
-
/** Whether the option is disabled */
|
|
64
|
-
disabled?: boolean;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export interface SelectGroupData {
|
|
68
|
-
/** Group label */
|
|
69
|
-
label?: ReactNode;
|
|
70
|
-
|
|
71
|
-
/** Group items */
|
|
72
|
-
items: SelectItemData[];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export type SelectData = SelectItemData | SelectGroupData;
|
|
76
|
-
|
|
77
|
-
export interface SelectRootProps
|
|
78
|
-
extends Omit<
|
|
79
|
-
ComponentPropsWithoutRef<"div">,
|
|
80
|
-
"value" | "defaultValue" | "onChange"
|
|
81
|
-
> {
|
|
82
|
-
/** Children containing select subcomponents */
|
|
83
|
-
children: ReactNode;
|
|
84
|
-
|
|
85
|
-
/** Label text */
|
|
86
|
-
label?: ReactNode;
|
|
87
|
-
|
|
88
|
-
/** Description text */
|
|
89
|
-
description?: ReactNode;
|
|
90
|
-
|
|
91
|
-
/** Error message */
|
|
92
|
-
error?: ReactNode;
|
|
93
|
-
|
|
94
|
-
/** Whether the field is required */
|
|
95
|
-
required?: boolean;
|
|
96
|
-
|
|
97
|
-
/** Display an asterisk next to the label */
|
|
98
|
-
withAsterisk?: boolean;
|
|
99
|
-
|
|
100
|
-
/** Selected value (controlled) */
|
|
101
|
-
value?: string | null;
|
|
102
|
-
|
|
103
|
-
/** Initial selected value (uncontrolled) */
|
|
104
|
-
defaultValue?: string | null;
|
|
105
|
-
|
|
106
|
-
/** Callback called when selected value changes */
|
|
107
|
-
onChange?: (value: string | null) => void;
|
|
108
|
-
|
|
109
|
-
/** Dropdown open state (controlled) */
|
|
110
|
-
opened?: boolean;
|
|
111
|
-
|
|
112
|
-
/** Initial dropdown open state (uncontrolled) */
|
|
113
|
-
defaultOpened?: boolean;
|
|
114
|
-
|
|
115
|
-
/** Callback called when dropdown open state changes */
|
|
116
|
-
onOpenedChange?: (opened: boolean) => void;
|
|
117
|
-
|
|
118
|
-
/** Positioning settings */
|
|
119
|
-
positioning?: SelectPositioning;
|
|
120
|
-
|
|
121
|
-
/** Floating middleware settings */
|
|
122
|
-
middlewares?: SelectMiddlewares;
|
|
123
|
-
|
|
124
|
-
/** Whether select is disabled @default `false` */
|
|
125
|
-
disabled?: boolean;
|
|
126
|
-
|
|
127
|
-
/** Whether to render searchable input inside dropdown @default `false` */
|
|
128
|
-
searchable?: boolean;
|
|
129
|
-
|
|
130
|
-
/** Search query (controlled) */
|
|
131
|
-
searchValue?: string;
|
|
132
|
-
|
|
133
|
-
/** Initial search query (uncontrolled) */
|
|
134
|
-
defaultSearchValue?: string;
|
|
135
|
-
|
|
136
|
-
/** Callback called when search query changes */
|
|
137
|
-
onSearchChange?: (value: string) => void;
|
|
138
|
-
|
|
139
|
-
/** Trigger placeholder text @default `Select option` */
|
|
140
|
-
placeholder?: string;
|
|
141
|
-
|
|
142
|
-
/** Search input placeholder @default `Search...` */
|
|
143
|
-
searchPlaceholder?: string;
|
|
144
|
-
|
|
145
|
-
/** Content rendered when no options match @default `No options` */
|
|
146
|
-
nothingFound?: ReactNode;
|
|
147
|
-
|
|
148
|
-
/** Trigger and search input size @default `md` */
|
|
149
|
-
size?: RefraktorSize;
|
|
150
|
-
|
|
151
|
-
/** Trigger and search input radius @default `default` */
|
|
152
|
-
radius?: RefraktorRadius;
|
|
153
|
-
|
|
154
|
-
/** Trigger and search input variant @default `default` */
|
|
155
|
-
variant?: InputVariant;
|
|
156
|
-
|
|
157
|
-
/** Whether to render dropdown in portal @default `true` */
|
|
158
|
-
withinPortal?: boolean;
|
|
159
|
-
|
|
160
|
-
/** Whether to close on click outside @default `true` */
|
|
161
|
-
closeOnClickOutside?: boolean;
|
|
162
|
-
|
|
163
|
-
/** Whether to close on Escape key @default `true` */
|
|
164
|
-
closeOnEscape?: boolean;
|
|
165
|
-
|
|
166
|
-
/** Transition props for dropdown, uses Transition internally */
|
|
167
|
-
transitionProps?: Omit<TransitionProps, "children" | "mounted">;
|
|
168
|
-
|
|
169
|
-
/** Used for editing root class name */
|
|
170
|
-
className?: string;
|
|
171
|
-
|
|
172
|
-
/** Used for styling different parts of the component */
|
|
173
|
-
classNames?: SelectClassNames;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
export interface SelectTriggerProps extends ComponentPropsWithoutRef<"div"> {
|
|
177
|
-
/** Trigger placeholder override */
|
|
178
|
-
placeholder?: string;
|
|
179
|
-
|
|
180
|
-
/** Optional custom right section */
|
|
181
|
-
rightSection?: ReactNode;
|
|
182
|
-
|
|
183
|
-
/** Used for editing root class name */
|
|
184
|
-
className?: string;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export interface SelectDropdownProps extends ComponentPropsWithoutRef<"div"> {
|
|
188
|
-
/** Content displayed inside dropdown */
|
|
189
|
-
children: ReactNode;
|
|
190
|
-
|
|
191
|
-
/** Used for editing root class name */
|
|
192
|
-
className?: string;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export interface SelectGroupProps extends ComponentPropsWithoutRef<"div"> {
|
|
196
|
-
/** Group label */
|
|
197
|
-
label?: ReactNode;
|
|
198
|
-
|
|
199
|
-
/** Group content */
|
|
200
|
-
children: ReactNode;
|
|
201
|
-
|
|
202
|
-
/** Used for editing root class name */
|
|
203
|
-
className?: string;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export interface SelectItemProps
|
|
207
|
-
extends Omit<ComponentPropsWithoutRef<"button">, "value" | "onSelect"> {
|
|
208
|
-
/** Option value */
|
|
209
|
-
value: string;
|
|
210
|
-
|
|
211
|
-
/** Option content */
|
|
212
|
-
children: ReactNode;
|
|
213
|
-
|
|
214
|
-
/** Callback called when option is selected */
|
|
215
|
-
onSelect?: (value: string) => void;
|
|
216
|
-
|
|
217
|
-
/** Optional searchable text for non-string children */
|
|
218
|
-
textValue?: string;
|
|
219
|
-
|
|
220
|
-
/** Whether option is disabled */
|
|
221
|
-
disabled?: boolean;
|
|
222
|
-
|
|
223
|
-
/** Used for editing root class name */
|
|
224
|
-
className?: string;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export interface SelectProps extends Omit<SelectRootProps, "children"> {
|
|
228
|
-
/** Compound children. If provided, data-based rendering is skipped */
|
|
229
|
-
children?: ReactNode;
|
|
230
|
-
|
|
231
|
-
/** Data used for built-in rendering mode */
|
|
232
|
-
data?: SelectData[];
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export interface SelectFactoryPayload extends FactoryPayload {
|
|
236
|
-
props: SelectProps;
|
|
237
|
-
ref: HTMLDivElement;
|
|
238
|
-
compound: {
|
|
239
|
-
configure: ReturnType<typeof createComponentConfig<SelectProps>>;
|
|
240
|
-
classNames: ReturnType<typeof createClassNamesConfig<SelectClassNames>>;
|
|
241
|
-
Root: typeof SelectRoot;
|
|
242
|
-
Trigger: typeof SelectTrigger;
|
|
243
|
-
Dropdown: typeof SelectDropdown;
|
|
244
|
-
Group: typeof SelectGroup;
|
|
245
|
-
Item: typeof SelectItem;
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
export interface SelectRootFactoryPayload extends FactoryPayload {
|
|
250
|
-
props: SelectRootProps;
|
|
251
|
-
ref: HTMLDivElement;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
export interface SelectTriggerFactoryPayload extends FactoryPayload {
|
|
255
|
-
props: SelectTriggerProps;
|
|
256
|
-
ref: HTMLDivElement;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
export interface SelectDropdownFactoryPayload extends FactoryPayload {
|
|
260
|
-
props: SelectDropdownProps;
|
|
261
|
-
ref: HTMLDivElement;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
export interface SelectGroupFactoryPayload extends FactoryPayload {
|
|
265
|
-
props: SelectGroupProps;
|
|
266
|
-
ref: HTMLDivElement;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
export interface SelectItemFactoryPayload extends FactoryPayload {
|
|
270
|
-
props: SelectItemProps;
|
|
271
|
-
ref: HTMLButtonElement;
|
|
272
|
-
}
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { useUncontrolled } from "@refraktor/utils";
|
|
2
|
-
import {
|
|
3
|
-
autoUpdate,
|
|
4
|
-
flip,
|
|
5
|
-
FloatingContext,
|
|
6
|
-
inline,
|
|
7
|
-
Middleware,
|
|
8
|
-
offset,
|
|
9
|
-
Placement,
|
|
10
|
-
shift,
|
|
11
|
-
useClick,
|
|
12
|
-
useDismiss,
|
|
13
|
-
useFloating,
|
|
14
|
-
useInteractions
|
|
15
|
-
} from "@floating-ui/react";
|
|
16
|
-
import { useCallback, useMemo } from "react";
|
|
17
|
-
import type { SelectMiddlewares, SelectPositioning } from "./select.types";
|
|
18
|
-
|
|
19
|
-
interface UseSelectProps {
|
|
20
|
-
opened?: boolean;
|
|
21
|
-
defaultOpened?: boolean;
|
|
22
|
-
onOpenedChange?: (opened: boolean) => void;
|
|
23
|
-
positioning?: SelectPositioning;
|
|
24
|
-
middlewares?: SelectMiddlewares;
|
|
25
|
-
disabled?: boolean;
|
|
26
|
-
closeOnClickOutside?: boolean;
|
|
27
|
-
closeOnEscape?: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface UseSelectReturn {
|
|
31
|
-
opened: boolean;
|
|
32
|
-
open: () => void;
|
|
33
|
-
close: () => void;
|
|
34
|
-
toggle: () => void;
|
|
35
|
-
context: FloatingContext;
|
|
36
|
-
refs: {
|
|
37
|
-
setReference: (node: HTMLElement | null) => void;
|
|
38
|
-
setFloating: (node: HTMLElement | null) => void;
|
|
39
|
-
reference: React.MutableRefObject<HTMLElement | null>;
|
|
40
|
-
floating: React.MutableRefObject<HTMLElement | null>;
|
|
41
|
-
};
|
|
42
|
-
floatingStyles: React.CSSProperties;
|
|
43
|
-
getReferenceProps: (
|
|
44
|
-
userProps?: React.HTMLAttributes<HTMLElement>
|
|
45
|
-
) => Record<string, unknown>;
|
|
46
|
-
getFloatingProps: (
|
|
47
|
-
userProps?: React.HTMLAttributes<HTMLElement>
|
|
48
|
-
) => Record<string, unknown>;
|
|
49
|
-
placement: Placement;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function useSelect(options: UseSelectProps = {}): UseSelectReturn {
|
|
53
|
-
const {
|
|
54
|
-
opened,
|
|
55
|
-
defaultOpened,
|
|
56
|
-
onOpenedChange,
|
|
57
|
-
positioning = {
|
|
58
|
-
placement: "bottom-start",
|
|
59
|
-
offset: 4
|
|
60
|
-
},
|
|
61
|
-
middlewares = { flip: true, shift: true },
|
|
62
|
-
disabled = false,
|
|
63
|
-
closeOnClickOutside = true,
|
|
64
|
-
closeOnEscape = true
|
|
65
|
-
} = options;
|
|
66
|
-
|
|
67
|
-
const [isOpen, setIsOpen] = useUncontrolled({
|
|
68
|
-
value: opened,
|
|
69
|
-
defaultValue: defaultOpened,
|
|
70
|
-
finalValue: false,
|
|
71
|
-
onChange: onOpenedChange
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
const middleware = useMemo(() => {
|
|
75
|
-
const middlewareList: Middleware[] = [];
|
|
76
|
-
|
|
77
|
-
middlewareList.push(offset(positioning.offset ?? 4));
|
|
78
|
-
|
|
79
|
-
if (middlewares.flip) {
|
|
80
|
-
middlewareList.push(
|
|
81
|
-
flip(
|
|
82
|
-
typeof middlewares.flip === "boolean"
|
|
83
|
-
? undefined
|
|
84
|
-
: middlewares.flip
|
|
85
|
-
)
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (middlewares.shift) {
|
|
90
|
-
middlewareList.push(
|
|
91
|
-
shift(
|
|
92
|
-
typeof middlewares.shift === "boolean"
|
|
93
|
-
? undefined
|
|
94
|
-
: middlewares.shift
|
|
95
|
-
)
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (middlewares.inline) {
|
|
100
|
-
middlewareList.push(
|
|
101
|
-
inline(
|
|
102
|
-
typeof middlewares.inline === "boolean"
|
|
103
|
-
? undefined
|
|
104
|
-
: middlewares.inline
|
|
105
|
-
)
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return middlewareList;
|
|
110
|
-
}, [positioning.offset, middlewares]);
|
|
111
|
-
|
|
112
|
-
const floating = useFloating({
|
|
113
|
-
placement: positioning.placement,
|
|
114
|
-
open: isOpen,
|
|
115
|
-
onOpenChange: setIsOpen,
|
|
116
|
-
middleware,
|
|
117
|
-
whileElementsMounted: autoUpdate,
|
|
118
|
-
strategy: "fixed"
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const click = useClick(floating.context, {
|
|
122
|
-
enabled: !disabled
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
const dismiss = useDismiss(floating.context, {
|
|
126
|
-
outsidePress: closeOnClickOutside,
|
|
127
|
-
escapeKey: closeOnEscape
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
const { getReferenceProps, getFloatingProps } = useInteractions([
|
|
131
|
-
click,
|
|
132
|
-
dismiss
|
|
133
|
-
]);
|
|
134
|
-
|
|
135
|
-
const open = useCallback(() => {
|
|
136
|
-
if (!disabled) {
|
|
137
|
-
setIsOpen(true);
|
|
138
|
-
}
|
|
139
|
-
}, [disabled, setIsOpen]);
|
|
140
|
-
|
|
141
|
-
const close = useCallback(() => {
|
|
142
|
-
setIsOpen(false);
|
|
143
|
-
}, [setIsOpen]);
|
|
144
|
-
|
|
145
|
-
const toggle = useCallback(() => {
|
|
146
|
-
if (!disabled) {
|
|
147
|
-
setIsOpen(!isOpen);
|
|
148
|
-
}
|
|
149
|
-
}, [disabled, isOpen, setIsOpen]);
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
opened: isOpen,
|
|
153
|
-
open,
|
|
154
|
-
close,
|
|
155
|
-
toggle,
|
|
156
|
-
context: floating.context,
|
|
157
|
-
refs: {
|
|
158
|
-
setReference: floating.refs.setReference,
|
|
159
|
-
setFloating: floating.refs.setFloating,
|
|
160
|
-
reference: floating.refs
|
|
161
|
-
.reference as React.MutableRefObject<HTMLElement | null>,
|
|
162
|
-
floating: floating.refs
|
|
163
|
-
.floating as React.MutableRefObject<HTMLElement | null>
|
|
164
|
-
},
|
|
165
|
-
floatingStyles: floating.floatingStyles,
|
|
166
|
-
getReferenceProps,
|
|
167
|
-
getFloatingProps,
|
|
168
|
-
placement: floating.placement
|
|
169
|
-
};
|
|
170
|
-
}
|