@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,136 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { render, screen, userEvent, waitFor } from "../../vitest";
|
|
3
|
-
import Menu from "./menu";
|
|
4
|
-
|
|
5
|
-
describe("@refraktor/core/Menu", () => {
|
|
6
|
-
const transitionProps = {
|
|
7
|
-
duration: 0,
|
|
8
|
-
immediate: true
|
|
9
|
-
} as const;
|
|
10
|
-
|
|
11
|
-
it("opens on trigger click and closes on item selection", async () => {
|
|
12
|
-
const user = userEvent.setup();
|
|
13
|
-
const onSelect = vi.fn();
|
|
14
|
-
|
|
15
|
-
await render(
|
|
16
|
-
<Menu transitionProps={transitionProps}>
|
|
17
|
-
<Menu.Trigger>
|
|
18
|
-
<button type="button">Open menu</button>
|
|
19
|
-
</Menu.Trigger>
|
|
20
|
-
|
|
21
|
-
<Menu.Dropdown>
|
|
22
|
-
<Menu.Item onSelect={onSelect}>Profile</Menu.Item>
|
|
23
|
-
</Menu.Dropdown>
|
|
24
|
-
</Menu>
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
await user.click(screen.getByRole("button", { name: "Open menu" }));
|
|
28
|
-
expect(screen.getByRole("menu")).toBeInTheDocument();
|
|
29
|
-
|
|
30
|
-
await user.click(screen.getByRole("menuitem", { name: "Profile" }));
|
|
31
|
-
|
|
32
|
-
expect(onSelect).toHaveBeenCalledTimes(1);
|
|
33
|
-
|
|
34
|
-
await waitFor(() => {
|
|
35
|
-
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("does not activate disabled item", async () => {
|
|
40
|
-
const user = userEvent.setup();
|
|
41
|
-
const onSelect = vi.fn();
|
|
42
|
-
|
|
43
|
-
await render(
|
|
44
|
-
<Menu transitionProps={transitionProps}>
|
|
45
|
-
<Menu.Trigger>
|
|
46
|
-
<button type="button">Open menu</button>
|
|
47
|
-
</Menu.Trigger>
|
|
48
|
-
|
|
49
|
-
<Menu.Dropdown>
|
|
50
|
-
<Menu.Item disabled onSelect={onSelect}>
|
|
51
|
-
Disabled item
|
|
52
|
-
</Menu.Item>
|
|
53
|
-
</Menu.Dropdown>
|
|
54
|
-
</Menu>
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
await user.click(screen.getByRole("button", { name: "Open menu" }));
|
|
58
|
-
|
|
59
|
-
const item = screen.getByRole("menuitem", { name: "Disabled item" });
|
|
60
|
-
expect(item).toBeDisabled();
|
|
61
|
-
|
|
62
|
-
await user.click(item);
|
|
63
|
-
expect(onSelect).not.toHaveBeenCalled();
|
|
64
|
-
expect(screen.getByRole("menu")).toBeInTheDocument();
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("supports keyboard navigation", async () => {
|
|
68
|
-
const user = userEvent.setup();
|
|
69
|
-
const onFirstSelect = vi.fn();
|
|
70
|
-
const onSecondSelect = vi.fn();
|
|
71
|
-
|
|
72
|
-
await render(
|
|
73
|
-
<Menu transitionProps={transitionProps}>
|
|
74
|
-
<Menu.Trigger>
|
|
75
|
-
<button type="button">Open menu</button>
|
|
76
|
-
</Menu.Trigger>
|
|
77
|
-
|
|
78
|
-
<Menu.Dropdown>
|
|
79
|
-
<Menu.Item onSelect={onFirstSelect}>First</Menu.Item>
|
|
80
|
-
<Menu.Item onSelect={onSecondSelect}>Second</Menu.Item>
|
|
81
|
-
</Menu.Dropdown>
|
|
82
|
-
</Menu>
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
const trigger = screen.getByRole("button", { name: "Open menu" });
|
|
86
|
-
trigger.focus();
|
|
87
|
-
|
|
88
|
-
await user.keyboard("{ArrowDown}");
|
|
89
|
-
await user.keyboard("{ArrowDown}");
|
|
90
|
-
await user.keyboard("{Enter}");
|
|
91
|
-
|
|
92
|
-
expect(onFirstSelect).not.toHaveBeenCalled();
|
|
93
|
-
expect(onSecondSelect).toHaveBeenCalledTimes(1);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("opens submenu with keyboard and selects submenu item", async () => {
|
|
97
|
-
const user = userEvent.setup();
|
|
98
|
-
const onSubSelect = vi.fn();
|
|
99
|
-
|
|
100
|
-
await render(
|
|
101
|
-
<Menu transitionProps={transitionProps}>
|
|
102
|
-
<Menu.Trigger>
|
|
103
|
-
<button type="button">Open menu</button>
|
|
104
|
-
</Menu.Trigger>
|
|
105
|
-
|
|
106
|
-
<Menu.Dropdown>
|
|
107
|
-
<Menu.Sub>
|
|
108
|
-
<Menu.SubTrigger>More</Menu.SubTrigger>
|
|
109
|
-
|
|
110
|
-
<Menu.SubDropdown>
|
|
111
|
-
<Menu.Item onSelect={onSubSelect}>Sub item</Menu.Item>
|
|
112
|
-
</Menu.SubDropdown>
|
|
113
|
-
</Menu.Sub>
|
|
114
|
-
</Menu.Dropdown>
|
|
115
|
-
</Menu>
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
await user.click(screen.getByRole("button", { name: "Open menu" }));
|
|
119
|
-
|
|
120
|
-
const subTrigger = screen.getByRole("menuitem", { name: "More" });
|
|
121
|
-
subTrigger.focus();
|
|
122
|
-
|
|
123
|
-
await user.keyboard("{ArrowRight}");
|
|
124
|
-
|
|
125
|
-
const subItem = await screen.findByRole("menuitem", {
|
|
126
|
-
name: "Sub item"
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
await user.click(subItem);
|
|
130
|
-
expect(onSubSelect).toHaveBeenCalledTimes(1);
|
|
131
|
-
|
|
132
|
-
await waitFor(() => {
|
|
133
|
-
expect(screen.queryAllByRole("menu")).toHaveLength(0);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
});
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { useId } from "@refraktor/utils";
|
|
2
|
-
import { useTheme } from "../../theme";
|
|
3
|
-
import {
|
|
4
|
-
createClassNamesConfig,
|
|
5
|
-
createComponentConfig,
|
|
6
|
-
factory,
|
|
7
|
-
useClassNames,
|
|
8
|
-
useProps
|
|
9
|
-
} from "../../utils";
|
|
10
|
-
import { MenuFactoryPayload, MenuClassNames, MenuProps } from "./menu.types";
|
|
11
|
-
import { useMenu } from "./use-menu";
|
|
12
|
-
import {
|
|
13
|
-
MenuLevelProvider,
|
|
14
|
-
MenuRootProvider,
|
|
15
|
-
useMenuItemsRegistry
|
|
16
|
-
} from "./menu.context";
|
|
17
|
-
import { MenuTrigger } from "./menu-trigger";
|
|
18
|
-
import { MenuDropdown } from "./menu-dropdown";
|
|
19
|
-
import { MenuItem } from "./menu-item";
|
|
20
|
-
import { MenuLabel } from "./menu-label";
|
|
21
|
-
import { MenuSeparator } from "./menu-separator";
|
|
22
|
-
import { MenuSub } from "./menu-sub";
|
|
23
|
-
import { MenuSubTrigger } from "./menu-sub-trigger";
|
|
24
|
-
import { MenuSubDropdown } from "./menu-sub-dropdown";
|
|
25
|
-
|
|
26
|
-
const defaultProps = {
|
|
27
|
-
positioning: {
|
|
28
|
-
placement: "bottom-start",
|
|
29
|
-
offset: 4
|
|
30
|
-
},
|
|
31
|
-
middlewares: { flip: true, shift: true },
|
|
32
|
-
trigger: "click",
|
|
33
|
-
openDelay: 0,
|
|
34
|
-
closeDelay: 100,
|
|
35
|
-
radius: "default",
|
|
36
|
-
withinPortal: true,
|
|
37
|
-
closeOnClickOutside: true,
|
|
38
|
-
closeOnEscape: true,
|
|
39
|
-
closeOnItemClick: true
|
|
40
|
-
} satisfies Partial<MenuProps>;
|
|
41
|
-
|
|
42
|
-
const Menu = factory<MenuFactoryPayload>((_props, ref) => {
|
|
43
|
-
const { cx } = useTheme();
|
|
44
|
-
const {
|
|
45
|
-
id,
|
|
46
|
-
children,
|
|
47
|
-
opened,
|
|
48
|
-
defaultOpened,
|
|
49
|
-
onOpenedChange,
|
|
50
|
-
positioning,
|
|
51
|
-
middlewares,
|
|
52
|
-
disabled,
|
|
53
|
-
trigger,
|
|
54
|
-
openDelay,
|
|
55
|
-
closeDelay,
|
|
56
|
-
transitionProps,
|
|
57
|
-
radius,
|
|
58
|
-
withinPortal,
|
|
59
|
-
closeOnClickOutside,
|
|
60
|
-
closeOnEscape,
|
|
61
|
-
closeOnItemClick,
|
|
62
|
-
className,
|
|
63
|
-
classNames,
|
|
64
|
-
...props
|
|
65
|
-
} = useProps("Menu", defaultProps, _props);
|
|
66
|
-
const classes = useClassNames("Menu", classNames);
|
|
67
|
-
const _id = useId(id);
|
|
68
|
-
|
|
69
|
-
const menu = useMenu({
|
|
70
|
-
opened,
|
|
71
|
-
defaultOpened,
|
|
72
|
-
onOpenedChange,
|
|
73
|
-
positioning,
|
|
74
|
-
middlewares,
|
|
75
|
-
disabled,
|
|
76
|
-
trigger,
|
|
77
|
-
closeOnClickOutside,
|
|
78
|
-
closeOnEscape,
|
|
79
|
-
openDelay,
|
|
80
|
-
closeDelay
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
const registry = useMenuItemsRegistry();
|
|
84
|
-
|
|
85
|
-
const getStyles = (part: keyof MenuClassNames) => classes[part];
|
|
86
|
-
|
|
87
|
-
return (
|
|
88
|
-
<MenuRootProvider
|
|
89
|
-
value={{
|
|
90
|
-
radius: radius ?? "default",
|
|
91
|
-
withinPortal: withinPortal ?? true,
|
|
92
|
-
closeOnItemClick: closeOnItemClick ?? true,
|
|
93
|
-
transitionProps,
|
|
94
|
-
classNames,
|
|
95
|
-
getStyles
|
|
96
|
-
}}
|
|
97
|
-
>
|
|
98
|
-
<MenuLevelProvider
|
|
99
|
-
value={{
|
|
100
|
-
menu,
|
|
101
|
-
isSubmenu: false,
|
|
102
|
-
registerItem: registry.registerItem,
|
|
103
|
-
getItems: registry.getItems,
|
|
104
|
-
closeMenu: menu.close,
|
|
105
|
-
closeAllMenus: menu.close
|
|
106
|
-
}}
|
|
107
|
-
>
|
|
108
|
-
<div
|
|
109
|
-
ref={ref}
|
|
110
|
-
id={_id}
|
|
111
|
-
className={cx("inline-block", classes.root, className)}
|
|
112
|
-
{...props}
|
|
113
|
-
>
|
|
114
|
-
{children}
|
|
115
|
-
</div>
|
|
116
|
-
</MenuLevelProvider>
|
|
117
|
-
</MenuRootProvider>
|
|
118
|
-
);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
Menu.displayName = "@refraktor/core/Menu";
|
|
122
|
-
Menu.configure = createComponentConfig<MenuProps>();
|
|
123
|
-
Menu.classNames = createClassNamesConfig<MenuClassNames>();
|
|
124
|
-
Menu.Trigger = MenuTrigger;
|
|
125
|
-
Menu.Dropdown = MenuDropdown;
|
|
126
|
-
Menu.Item = MenuItem;
|
|
127
|
-
Menu.Label = MenuLabel;
|
|
128
|
-
Menu.Separator = MenuSeparator;
|
|
129
|
-
Menu.Sub = MenuSub;
|
|
130
|
-
Menu.SubTrigger = MenuSubTrigger;
|
|
131
|
-
Menu.SubDropdown = MenuSubDropdown;
|
|
132
|
-
|
|
133
|
-
export default Menu;
|
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
import { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
2
|
-
import type {
|
|
3
|
-
FlipOptions,
|
|
4
|
-
InlineOptions,
|
|
5
|
-
Placement,
|
|
6
|
-
ShiftOptions
|
|
7
|
-
} from "@floating-ui/react";
|
|
8
|
-
import { TransitionProps } from "../transition";
|
|
9
|
-
import { RefraktorRadius } from "../../theme";
|
|
10
|
-
import {
|
|
11
|
-
createClassNamesConfig,
|
|
12
|
-
createComponentConfig,
|
|
13
|
-
FactoryPayload
|
|
14
|
-
} from "../../utils";
|
|
15
|
-
import { MenuTrigger } from "./menu-trigger";
|
|
16
|
-
import { MenuDropdown } from "./menu-dropdown";
|
|
17
|
-
import { MenuItem } from "./menu-item";
|
|
18
|
-
import { MenuLabel } from "./menu-label";
|
|
19
|
-
import { MenuSeparator } from "./menu-separator";
|
|
20
|
-
import { MenuSub } from "./menu-sub";
|
|
21
|
-
import { MenuSubTrigger } from "./menu-sub-trigger";
|
|
22
|
-
import { MenuSubDropdown } from "./menu-sub-dropdown";
|
|
23
|
-
|
|
24
|
-
export type MenuClassNames = {
|
|
25
|
-
root?: string;
|
|
26
|
-
trigger?: string;
|
|
27
|
-
dropdown?: string;
|
|
28
|
-
item?: string;
|
|
29
|
-
label?: string;
|
|
30
|
-
separator?: string;
|
|
31
|
-
subTrigger?: string;
|
|
32
|
-
subDropdown?: string;
|
|
33
|
-
itemLeftSection?: string;
|
|
34
|
-
itemRightSection?: string;
|
|
35
|
-
subIndicator?: string;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export type MenuPositioning = {
|
|
39
|
-
/** The placement of the menu relative to the trigger element @default `bottom-start` */
|
|
40
|
-
placement?: Placement;
|
|
41
|
-
|
|
42
|
-
/** Offset distance from the trigger element in pixels @default `4` */
|
|
43
|
-
offset?: number;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export type MenuMiddlewares = {
|
|
47
|
-
shift?: boolean | ShiftOptions;
|
|
48
|
-
flip?: boolean | FlipOptions;
|
|
49
|
-
inline?: boolean | InlineOptions;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export type MenuTriggerType = "click" | "hover" | "focus";
|
|
53
|
-
|
|
54
|
-
export interface MenuProps extends ComponentPropsWithoutRef<"div"> {
|
|
55
|
-
/** Children containing subcomponents */
|
|
56
|
-
children: ReactNode;
|
|
57
|
-
|
|
58
|
-
/** State of the menu (controlled) */
|
|
59
|
-
opened?: boolean;
|
|
60
|
-
|
|
61
|
-
/** Initial state of the menu (uncontrolled) */
|
|
62
|
-
defaultOpened?: boolean;
|
|
63
|
-
|
|
64
|
-
/** Callback called when the menu state changes */
|
|
65
|
-
onOpenedChange?: (opened: boolean) => void;
|
|
66
|
-
|
|
67
|
-
/** Positioning settings for the menu */
|
|
68
|
-
positioning?: MenuPositioning;
|
|
69
|
-
|
|
70
|
-
/** Middlewares settings for the menu */
|
|
71
|
-
middlewares?: MenuMiddlewares;
|
|
72
|
-
|
|
73
|
-
/** Whether the menu is disabled @default `false` */
|
|
74
|
-
disabled?: boolean;
|
|
75
|
-
|
|
76
|
-
/** Trigger type for the menu @default `click` */
|
|
77
|
-
trigger?: MenuTriggerType;
|
|
78
|
-
|
|
79
|
-
/** Delay in milliseconds before the menu opens @default `0` */
|
|
80
|
-
openDelay?: number;
|
|
81
|
-
|
|
82
|
-
/** Delay in milliseconds before the menu closes @default `100` */
|
|
83
|
-
closeDelay?: number;
|
|
84
|
-
|
|
85
|
-
/** Transition props for the menu dropdown, uses Transition component internally */
|
|
86
|
-
transitionProps?: Omit<TransitionProps, "children" | "mounted">;
|
|
87
|
-
|
|
88
|
-
/** Radius for menu dropdowns @default `default` */
|
|
89
|
-
radius?: RefraktorRadius;
|
|
90
|
-
|
|
91
|
-
/** Whether to render dropdowns within a portal @default `true` */
|
|
92
|
-
withinPortal?: boolean;
|
|
93
|
-
|
|
94
|
-
/** Whether to close on click outside @default `true` */
|
|
95
|
-
closeOnClickOutside?: boolean;
|
|
96
|
-
|
|
97
|
-
/** Whether to close on escape key @default `true` */
|
|
98
|
-
closeOnEscape?: boolean;
|
|
99
|
-
|
|
100
|
-
/** Whether to close the whole menu tree after selecting an item @default `true` */
|
|
101
|
-
closeOnItemClick?: boolean;
|
|
102
|
-
|
|
103
|
-
/** Used for editing root class name */
|
|
104
|
-
className?: string;
|
|
105
|
-
|
|
106
|
-
/** Used for styling different parts of the component */
|
|
107
|
-
classNames?: MenuClassNames;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export interface MenuTriggerProps extends ComponentPropsWithoutRef<"div"> {
|
|
111
|
-
/** The trigger element */
|
|
112
|
-
children: ReactNode;
|
|
113
|
-
|
|
114
|
-
/** Used for editing root class name */
|
|
115
|
-
className?: string;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export interface MenuDropdownProps extends ComponentPropsWithoutRef<"div"> {
|
|
119
|
-
/** Content to display inside the dropdown */
|
|
120
|
-
children: ReactNode;
|
|
121
|
-
|
|
122
|
-
/** Used for editing root class name */
|
|
123
|
-
className?: string;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export interface MenuItemProps
|
|
127
|
-
extends Omit<ComponentPropsWithoutRef<"button">, "onSelect"> {
|
|
128
|
-
/** Content of the item */
|
|
129
|
-
children: ReactNode;
|
|
130
|
-
|
|
131
|
-
/** Callback called when an item is selected */
|
|
132
|
-
onSelect?: () => void;
|
|
133
|
-
|
|
134
|
-
/** Whether the item is disabled @default `false` */
|
|
135
|
-
disabled?: boolean;
|
|
136
|
-
|
|
137
|
-
/** Whether this item should close menus when selected, defaults to Menu closeOnItemClick */
|
|
138
|
-
closeOnSelect?: boolean;
|
|
139
|
-
|
|
140
|
-
/** Optional typeahead value if children is non-text */
|
|
141
|
-
textValue?: string;
|
|
142
|
-
|
|
143
|
-
/** Optional left section for icons or markers */
|
|
144
|
-
leftSection?: ReactNode;
|
|
145
|
-
|
|
146
|
-
/** Optional right section for hints or shortcuts */
|
|
147
|
-
rightSection?: ReactNode;
|
|
148
|
-
|
|
149
|
-
/** Used for editing root class name */
|
|
150
|
-
className?: string;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export interface MenuLabelProps extends ComponentPropsWithoutRef<"div"> {
|
|
154
|
-
/** Label content */
|
|
155
|
-
children: ReactNode;
|
|
156
|
-
|
|
157
|
-
/** Used for editing root class name */
|
|
158
|
-
className?: string;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export interface MenuSeparatorProps extends ComponentPropsWithoutRef<"div"> {
|
|
162
|
-
/** Used for editing root class name */
|
|
163
|
-
className?: string;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export interface MenuSubProps extends ComponentPropsWithoutRef<"div"> {
|
|
167
|
-
/** Children containing submenu trigger and submenu dropdown */
|
|
168
|
-
children: ReactNode;
|
|
169
|
-
|
|
170
|
-
/** State of the submenu (controlled) */
|
|
171
|
-
opened?: boolean;
|
|
172
|
-
|
|
173
|
-
/** Initial state of the submenu (uncontrolled) */
|
|
174
|
-
defaultOpened?: boolean;
|
|
175
|
-
|
|
176
|
-
/** Callback called when the submenu state changes */
|
|
177
|
-
onOpenedChange?: (opened: boolean) => void;
|
|
178
|
-
|
|
179
|
-
/** Positioning settings for the submenu */
|
|
180
|
-
positioning?: MenuPositioning;
|
|
181
|
-
|
|
182
|
-
/** Middlewares settings for the submenu */
|
|
183
|
-
middlewares?: MenuMiddlewares;
|
|
184
|
-
|
|
185
|
-
/** Whether the submenu is disabled @default `false` */
|
|
186
|
-
disabled?: boolean;
|
|
187
|
-
|
|
188
|
-
/** Trigger type for the submenu @default `hover` */
|
|
189
|
-
trigger?: MenuTriggerType;
|
|
190
|
-
|
|
191
|
-
/** Delay in milliseconds before the submenu opens @default `75` */
|
|
192
|
-
openDelay?: number;
|
|
193
|
-
|
|
194
|
-
/** Delay in milliseconds before the submenu closes @default `125` */
|
|
195
|
-
closeDelay?: number;
|
|
196
|
-
|
|
197
|
-
/** Whether to close submenu on click outside @default `false` */
|
|
198
|
-
closeOnClickOutside?: boolean;
|
|
199
|
-
|
|
200
|
-
/** Whether to close submenu on escape @default `true` */
|
|
201
|
-
closeOnEscape?: boolean;
|
|
202
|
-
|
|
203
|
-
/** Used for editing root class name */
|
|
204
|
-
className?: string;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export interface MenuSubTriggerProps
|
|
208
|
-
extends Omit<ComponentPropsWithoutRef<"button">, "onSelect"> {
|
|
209
|
-
/** Content of the submenu trigger */
|
|
210
|
-
children: ReactNode;
|
|
211
|
-
|
|
212
|
-
/** Optional typeahead value if children is non-text */
|
|
213
|
-
textValue?: string;
|
|
214
|
-
|
|
215
|
-
/** Whether the submenu trigger is disabled @default `false` */
|
|
216
|
-
disabled?: boolean;
|
|
217
|
-
|
|
218
|
-
/** Optional left section for icons or markers */
|
|
219
|
-
leftSection?: ReactNode;
|
|
220
|
-
|
|
221
|
-
/** Optional right section for hints or shortcuts */
|
|
222
|
-
rightSection?: ReactNode;
|
|
223
|
-
|
|
224
|
-
/** Used for editing root class name */
|
|
225
|
-
className?: string;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export interface MenuSubDropdownProps extends ComponentPropsWithoutRef<"div"> {
|
|
229
|
-
/** Content to display inside the submenu dropdown */
|
|
230
|
-
children: ReactNode;
|
|
231
|
-
|
|
232
|
-
/** Used for editing root class name */
|
|
233
|
-
className?: string;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
export interface MenuFactoryPayload extends FactoryPayload {
|
|
237
|
-
props: MenuProps;
|
|
238
|
-
ref: HTMLDivElement;
|
|
239
|
-
compound: {
|
|
240
|
-
configure: ReturnType<typeof createComponentConfig<MenuProps>>;
|
|
241
|
-
classNames: ReturnType<typeof createClassNamesConfig<MenuClassNames>>;
|
|
242
|
-
Trigger: typeof MenuTrigger;
|
|
243
|
-
Dropdown: typeof MenuDropdown;
|
|
244
|
-
Item: typeof MenuItem;
|
|
245
|
-
Label: typeof MenuLabel;
|
|
246
|
-
Separator: typeof MenuSeparator;
|
|
247
|
-
Sub: typeof MenuSub;
|
|
248
|
-
SubTrigger: typeof MenuSubTrigger;
|
|
249
|
-
SubDropdown: typeof MenuSubDropdown;
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
export interface MenuTriggerFactoryPayload extends FactoryPayload {
|
|
254
|
-
props: MenuTriggerProps;
|
|
255
|
-
ref: HTMLDivElement;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
export interface MenuDropdownFactoryPayload extends FactoryPayload {
|
|
259
|
-
props: MenuDropdownProps;
|
|
260
|
-
ref: HTMLDivElement;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
export interface MenuItemFactoryPayload extends FactoryPayload {
|
|
264
|
-
props: MenuItemProps;
|
|
265
|
-
ref: HTMLButtonElement;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
export interface MenuLabelFactoryPayload extends FactoryPayload {
|
|
269
|
-
props: MenuLabelProps;
|
|
270
|
-
ref: HTMLDivElement;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
export interface MenuSeparatorFactoryPayload extends FactoryPayload {
|
|
274
|
-
props: MenuSeparatorProps;
|
|
275
|
-
ref: HTMLDivElement;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
export interface MenuSubFactoryPayload extends FactoryPayload {
|
|
279
|
-
props: MenuSubProps;
|
|
280
|
-
ref: HTMLDivElement;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
export interface MenuSubTriggerFactoryPayload extends FactoryPayload {
|
|
284
|
-
props: MenuSubTriggerProps;
|
|
285
|
-
ref: HTMLButtonElement;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
export interface MenuSubDropdownFactoryPayload extends FactoryPayload {
|
|
289
|
-
props: MenuSubDropdownProps;
|
|
290
|
-
ref: HTMLDivElement;
|
|
291
|
-
}
|