@auto-engineer/generate-react-client 1.63.0 → 1.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/dist/starter/.storybook/main.ts +17 -22
- package/dist/starter/.storybook/manager-head.html +31 -31
- package/dist/starter/.storybook/manager.ts +133 -133
- package/dist/starter/.storybook/preview-head.html +12 -12
- package/dist/starter/.storybook/preview.tsx +79 -79
- package/dist/starter/biome.json +126 -0
- package/dist/starter/codegen.ts +11 -11
- package/dist/starter/components.json +27 -27
- package/dist/starter/package.json +86 -80
- package/dist/starter/public/mockServiceWorker.js +261 -261
- package/dist/starter/scripts/build-component-db.ts +17 -20
- package/dist/starter/src/App.tsx +15 -17
- package/dist/starter/src/components/ui/Accordion.stories.tsx +35 -35
- package/dist/starter/src/components/ui/Accordion.tsx +33 -33
- package/dist/starter/src/components/ui/Alert.stories.tsx +15 -15
- package/dist/starter/src/components/ui/Alert.tsx +32 -32
- package/dist/starter/src/components/ui/AlertDialog.stories.tsx +50 -50
- package/dist/starter/src/components/ui/AlertDialog.tsx +114 -115
- package/dist/starter/src/components/ui/AspectRatio.stories.tsx +20 -20
- package/dist/starter/src/components/ui/AspectRatio.tsx +1 -1
- package/dist/starter/src/components/ui/Avatar.stories.tsx +27 -27
- package/dist/starter/src/components/ui/Avatar.tsx +63 -63
- package/dist/starter/src/components/ui/Badge.stories.tsx +14 -14
- package/dist/starter/src/components/ui/Badge.tsx +27 -27
- package/dist/starter/src/components/ui/Breadcrumb.stories.tsx +38 -38
- package/dist/starter/src/components/ui/Breadcrumb.tsx +63 -62
- package/dist/starter/src/components/ui/Button.stories.tsx +55 -55
- package/dist/starter/src/components/ui/Button.tsx +49 -49
- package/dist/starter/src/components/ui/ButtonGroup.stories.tsx +17 -17
- package/dist/starter/src/components/ui/ButtonGroup.tsx +52 -53
- package/dist/starter/src/components/ui/Calendar.stories.tsx +20 -19
- package/dist/starter/src/components/ui/Calendar.tsx +142 -143
- package/dist/starter/src/components/ui/Card.stories.tsx +29 -29
- package/dist/starter/src/components/ui/Card.tsx +31 -31
- package/dist/starter/src/components/ui/Carousel.stories.tsx +41 -41
- package/dist/starter/src/components/ui/Carousel.tsx +171 -172
- package/dist/starter/src/components/ui/Chart.stories.tsx +21 -21
- package/dist/starter/src/components/ui/Chart.tsx +244 -247
- package/dist/starter/src/components/ui/Checkbox.stories.tsx +11 -11
- package/dist/starter/src/components/ui/Checkbox.tsx +18 -18
- package/dist/starter/src/components/ui/Collapsible.stories.tsx +40 -40
- package/dist/starter/src/components/ui/Collapsible.tsx +3 -3
- package/dist/starter/src/components/ui/Combobox.stories.tsx +48 -48
- package/dist/starter/src/components/ui/Combobox.tsx +204 -205
- package/dist/starter/src/components/ui/Command.stories.tsx +55 -55
- package/dist/starter/src/components/ui/Command.tsx +102 -103
- package/dist/starter/src/components/ui/ContextMenu.stories.tsx +52 -52
- package/dist/starter/src/components/ui/ContextMenu.tsx +151 -151
- package/dist/starter/src/components/ui/DesignSystem-Colors.stories.tsx +92 -92
- package/dist/starter/src/components/ui/DesignSystem-Layout.stories.tsx +139 -139
- package/dist/starter/src/components/ui/DesignSystem-Overview.stories.tsx +676 -657
- package/dist/starter/src/components/ui/DesignSystem-Typography.stories.tsx +59 -59
- package/dist/starter/src/components/ui/Dialog.stories.tsx +56 -56
- package/dist/starter/src/components/ui/Dialog.tsx +97 -98
- package/dist/starter/src/components/ui/Direction.stories.tsx +20 -20
- package/dist/starter/src/components/ui/Direction.tsx +7 -7
- package/dist/starter/src/components/ui/Drawer.stories.tsx +54 -54
- package/dist/starter/src/components/ui/Drawer.tsx +70 -70
- package/dist/starter/src/components/ui/DropdownMenu.stories.tsx +58 -58
- package/dist/starter/src/components/ui/DropdownMenu.tsx +157 -157
- package/dist/starter/src/components/ui/Empty.stories.tsx +22 -22
- package/dist/starter/src/components/ui/Empty.tsx +58 -58
- package/dist/starter/src/components/ui/Field.stories.tsx +31 -31
- package/dist/starter/src/components/ui/Field.tsx +180 -181
- package/dist/starter/src/components/ui/Form.stories.tsx +29 -29
- package/dist/starter/src/components/ui/Form.tsx +93 -96
- package/dist/starter/src/components/ui/HoverCard.stories.tsx +34 -34
- package/dist/starter/src/components/ui/HoverCard.tsx +21 -21
- package/dist/starter/src/components/ui/Input.stories.tsx +18 -18
- package/dist/starter/src/components/ui/Input.tsx +14 -14
- package/dist/starter/src/components/ui/InputGroup.stories.tsx +34 -34
- package/dist/starter/src/components/ui/InputGroup.tsx +110 -111
- package/dist/starter/src/components/ui/InputOTP.stories.tsx +28 -28
- package/dist/starter/src/components/ui/InputOTP.tsx +43 -43
- package/dist/starter/src/components/ui/Item.stories.tsx +45 -45
- package/dist/starter/src/components/ui/Item.tsx +113 -114
- package/dist/starter/src/components/ui/Kbd.stories.tsx +31 -31
- package/dist/starter/src/components/ui/Kbd.tsx +11 -11
- package/dist/starter/src/components/ui/Label.stories.tsx +62 -62
- package/dist/starter/src/components/ui/Label.tsx +26 -25
- package/dist/starter/src/components/ui/Menubar.stories.tsx +62 -62
- package/dist/starter/src/components/ui/Menubar.tsx +173 -173
- package/dist/starter/src/components/ui/NativeSelect.stories.tsx +26 -26
- package/dist/starter/src/components/ui/NativeSelect.tsx +29 -29
- package/dist/starter/src/components/ui/NavigationMenu.stories.tsx +64 -64
- package/dist/starter/src/components/ui/NavigationMenu.tsx +103 -103
- package/dist/starter/src/components/ui/Pagination.stories.tsx +61 -61
- package/dist/starter/src/components/ui/Pagination.tsx +69 -71
- package/dist/starter/src/components/ui/Popover.stories.tsx +38 -38
- package/dist/starter/src/components/ui/Popover.tsx +25 -25
- package/dist/starter/src/components/ui/Progress.stories.tsx +9 -9
- package/dist/starter/src/components/ui/Progress.tsx +14 -14
- package/dist/starter/src/components/ui/RadioGroup.stories.tsx +35 -35
- package/dist/starter/src/components/ui/RadioGroup.tsx +19 -19
- package/dist/starter/src/components/ui/Resizable.stories.tsx +54 -54
- package/dist/starter/src/components/ui/Resizable.tsx +29 -29
- package/dist/starter/src/components/ui/ScrollArea.stories.tsx +27 -27
- package/dist/starter/src/components/ui/ScrollArea.tsx +34 -34
- package/dist/starter/src/components/ui/Select.stories.tsx +43 -43
- package/dist/starter/src/components/ui/Select.tsx +120 -120
- package/dist/starter/src/components/ui/Separator.stories.tsx +27 -27
- package/dist/starter/src/components/ui/Separator.tsx +17 -17
- package/dist/starter/src/components/ui/Sheet.stories.tsx +53 -53
- package/dist/starter/src/components/ui/Sheet.tsx +69 -69
- package/dist/starter/src/components/ui/Sidebar.stories.tsx +77 -77
- package/dist/starter/src/components/ui/Sidebar.tsx +563 -564
- package/dist/starter/src/components/ui/Skeleton.stories.tsx +25 -25
- package/dist/starter/src/components/ui/Skeleton.tsx +1 -1
- package/dist/starter/src/components/ui/Slider.stories.tsx +5 -5
- package/dist/starter/src/components/ui/Slider.tsx +45 -44
- package/dist/starter/src/components/ui/Sonner.stories.tsx +32 -32
- package/dist/starter/src/components/ui/Sonner.tsx +23 -23
- package/dist/starter/src/components/ui/Spinner.stories.tsx +8 -8
- package/dist/starter/src/components/ui/Spinner.tsx +1 -1
- package/dist/starter/src/components/ui/Switch.stories.tsx +16 -17
- package/dist/starter/src/components/ui/Switch.tsx +24 -24
- package/dist/starter/src/components/ui/Table.stories.tsx +50 -50
- package/dist/starter/src/components/ui/Table.tsx +45 -45
- package/dist/starter/src/components/ui/Tabs.stories.tsx +39 -39
- package/dist/starter/src/components/ui/Tabs.tsx +47 -47
- package/dist/starter/src/components/ui/Textarea.stories.tsx +9 -9
- package/dist/starter/src/components/ui/Textarea.tsx +11 -11
- package/dist/starter/src/components/ui/Toast.stories.tsx +77 -77
- package/dist/starter/src/components/ui/Toast.tsx +75 -75
- package/dist/starter/src/components/ui/Toaster.tsx +17 -19
- package/dist/starter/src/components/ui/Toggle.stories.tsx +20 -20
- package/dist/starter/src/components/ui/Toggle.tsx +26 -26
- package/dist/starter/src/components/ui/ToggleGroup.stories.tsx +41 -41
- package/dist/starter/src/components/ui/ToggleGroup.tsx +61 -62
- package/dist/starter/src/components/ui/Tooltip.stories.tsx +26 -26
- package/dist/starter/src/components/ui/Tooltip.tsx +24 -24
- package/dist/starter/src/gql/execute.ts +1 -1
- package/dist/starter/src/gql/fragment-masking.ts +1 -1
- package/dist/starter/src/gql/graphql.ts +3 -0
- package/dist/starter/src/hooks/use-mobile.ts +11 -11
- package/dist/starter/src/hooks/use-toast.ts +135 -135
- package/dist/starter/src/index.css +105 -105
- package/dist/starter/src/lib/utils.ts +1 -1
- package/dist/starter/src/main.tsx +4 -1
- package/dist/starter/tsconfig.app.json +24 -24
- package/dist/starter/tsconfig.json +8 -8
- package/dist/starter/vite.config.ts +38 -37
- package/package.json +3 -3
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
Menubar,
|
|
4
|
+
MenubarContent,
|
|
5
|
+
MenubarItem,
|
|
6
|
+
MenubarLabel,
|
|
7
|
+
MenubarMenu,
|
|
8
|
+
MenubarSeparator,
|
|
9
|
+
MenubarShortcut,
|
|
10
|
+
MenubarTrigger,
|
|
11
11
|
} from '@/components/ui/Menubar';
|
|
12
12
|
|
|
13
13
|
const meta: Meta<typeof Menubar> = {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
title: 'UI Components/Menubar',
|
|
15
|
+
component: Menubar,
|
|
16
16
|
};
|
|
17
17
|
export default meta;
|
|
18
18
|
type Story = StoryObj<typeof Menubar>;
|
|
19
19
|
|
|
20
20
|
/** Shows a menubar with File and Edit menus containing items and keyboard shortcuts. */
|
|
21
21
|
export const Default: Story = {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
22
|
+
render: () => (
|
|
23
|
+
<Menubar>
|
|
24
|
+
<MenubarMenu>
|
|
25
|
+
<MenubarTrigger>File</MenubarTrigger>
|
|
26
|
+
<MenubarContent>
|
|
27
|
+
<MenubarItem>
|
|
28
|
+
New Tab <MenubarShortcut>Ctrl+T</MenubarShortcut>
|
|
29
|
+
</MenubarItem>
|
|
30
|
+
<MenubarItem>
|
|
31
|
+
New Window <MenubarShortcut>Ctrl+N</MenubarShortcut>
|
|
32
|
+
</MenubarItem>
|
|
33
|
+
<MenubarSeparator />
|
|
34
|
+
<MenubarItem>
|
|
35
|
+
Save <MenubarShortcut>Ctrl+S</MenubarShortcut>
|
|
36
|
+
</MenubarItem>
|
|
37
|
+
<MenubarSeparator />
|
|
38
|
+
<MenubarItem>Exit</MenubarItem>
|
|
39
|
+
</MenubarContent>
|
|
40
|
+
</MenubarMenu>
|
|
41
|
+
<MenubarMenu>
|
|
42
|
+
<MenubarTrigger>Edit</MenubarTrigger>
|
|
43
|
+
<MenubarContent>
|
|
44
|
+
<MenubarItem>
|
|
45
|
+
Undo <MenubarShortcut>Ctrl+Z</MenubarShortcut>
|
|
46
|
+
</MenubarItem>
|
|
47
|
+
<MenubarItem>
|
|
48
|
+
Redo <MenubarShortcut>Ctrl+Y</MenubarShortcut>
|
|
49
|
+
</MenubarItem>
|
|
50
|
+
<MenubarSeparator />
|
|
51
|
+
<MenubarItem>Cut</MenubarItem>
|
|
52
|
+
<MenubarItem>Copy</MenubarItem>
|
|
53
|
+
<MenubarItem>Paste</MenubarItem>
|
|
54
|
+
</MenubarContent>
|
|
55
|
+
</MenubarMenu>
|
|
56
|
+
</Menubar>
|
|
57
|
+
),
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
/** Demonstrates menu sections organized with labels to group related items. */
|
|
61
61
|
export const WithLabels: Story = {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
render: () => (
|
|
63
|
+
<Menubar>
|
|
64
|
+
<MenubarMenu>
|
|
65
|
+
<MenubarTrigger>View</MenubarTrigger>
|
|
66
|
+
<MenubarContent>
|
|
67
|
+
<MenubarLabel>Appearance</MenubarLabel>
|
|
68
|
+
<MenubarItem>Zoom In</MenubarItem>
|
|
69
|
+
<MenubarItem>Zoom Out</MenubarItem>
|
|
70
|
+
<MenubarSeparator />
|
|
71
|
+
<MenubarLabel>Layout</MenubarLabel>
|
|
72
|
+
<MenubarItem>Full Screen</MenubarItem>
|
|
73
|
+
<MenubarItem>Side by Side</MenubarItem>
|
|
74
|
+
</MenubarContent>
|
|
75
|
+
</MenubarMenu>
|
|
76
|
+
</Menubar>
|
|
77
|
+
),
|
|
78
78
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import * as React from 'react';
|
|
4
3
|
import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';
|
|
5
4
|
import { Menubar as MenubarPrimitive } from 'radix-ui';
|
|
5
|
+
import type * as React from 'react';
|
|
6
6
|
|
|
7
7
|
import { cn } from '@/lib/utils';
|
|
8
8
|
|
|
@@ -11,241 +11,241 @@ import { cn } from '@/lib/utils';
|
|
|
11
11
|
* Compose with MenubarMenu, MenubarTrigger, and MenubarContent to create top-level menu groups with keyboard navigation.
|
|
12
12
|
*/
|
|
13
13
|
function Menubar({ className, ...props }: React.ComponentProps<typeof MenubarPrimitive.Root>) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
return (
|
|
15
|
+
<MenubarPrimitive.Root
|
|
16
|
+
data-slot="menubar"
|
|
17
|
+
className={cn('bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs', className)}
|
|
18
|
+
{...props}
|
|
19
|
+
/>
|
|
20
|
+
);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/** A single menu within the menubar that wraps a trigger and its dropdown content. */
|
|
24
24
|
function MenubarMenu({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Menu>) {
|
|
25
|
-
|
|
25
|
+
return <MenubarPrimitive.Menu data-slot="menubar-menu" {...props} />;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
function MenubarGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Group>) {
|
|
29
|
-
|
|
29
|
+
return <MenubarPrimitive.Group data-slot="menubar-group" {...props} />;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
function MenubarPortal({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Portal>) {
|
|
33
|
-
|
|
33
|
+
return <MenubarPrimitive.Portal data-slot="menubar-portal" {...props} />;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
function MenubarRadioGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {
|
|
37
|
-
|
|
37
|
+
return <MenubarPrimitive.RadioGroup data-slot="menubar-radio-group" {...props} />;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/** The button that toggles a menu open within the menubar. */
|
|
41
41
|
function MenubarTrigger({ className, ...props }: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
return (
|
|
43
|
+
<MenubarPrimitive.Trigger
|
|
44
|
+
data-slot="menubar-trigger"
|
|
45
|
+
className={cn(
|
|
46
|
+
'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none',
|
|
47
|
+
className,
|
|
48
|
+
)}
|
|
49
|
+
{...props}
|
|
50
|
+
/>
|
|
51
|
+
);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/** The dropdown panel that appears when a MenubarTrigger is activated. Renders via a portal. */
|
|
55
55
|
function MenubarContent({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
className,
|
|
57
|
+
align = 'start',
|
|
58
|
+
alignOffset = -4,
|
|
59
|
+
sideOffset = 8,
|
|
60
|
+
...props
|
|
61
61
|
}: React.ComponentProps<typeof MenubarPrimitive.Content>) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
62
|
+
return (
|
|
63
|
+
<MenubarPortal>
|
|
64
|
+
<MenubarPrimitive.Content
|
|
65
|
+
data-slot="menubar-content"
|
|
66
|
+
align={align}
|
|
67
|
+
alignOffset={alignOffset}
|
|
68
|
+
sideOffset={sideOffset}
|
|
69
|
+
className={cn(
|
|
70
|
+
'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-md',
|
|
71
|
+
className,
|
|
72
|
+
)}
|
|
73
|
+
{...props}
|
|
74
|
+
/>
|
|
75
|
+
</MenubarPortal>
|
|
76
|
+
);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
/** An interactive item within a menubar dropdown. Supports an inset layout and a destructive variant. */
|
|
80
80
|
function MenubarItem({
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
className,
|
|
82
|
+
/** Adds left padding to align with items that have icons or indicators. */
|
|
83
|
+
inset,
|
|
84
|
+
/** Use "destructive" for dangerous actions. */
|
|
85
|
+
variant = 'default',
|
|
86
|
+
...props
|
|
87
87
|
}: React.ComponentProps<typeof MenubarPrimitive.Item> & {
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
inset?: boolean;
|
|
89
|
+
variant?: 'default' | 'destructive';
|
|
90
90
|
}) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
91
|
+
return (
|
|
92
|
+
<MenubarPrimitive.Item
|
|
93
|
+
data-slot="menubar-item"
|
|
94
|
+
data-inset={inset}
|
|
95
|
+
data-variant={variant}
|
|
96
|
+
className={cn(
|
|
97
|
+
"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
98
|
+
className,
|
|
99
|
+
)}
|
|
100
|
+
{...props}
|
|
101
|
+
/>
|
|
102
|
+
);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
/** A menu item with a checkbox indicator for toggling boolean options. */
|
|
106
106
|
function MenubarCheckboxItem({
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
className,
|
|
108
|
+
children,
|
|
109
|
+
checked,
|
|
110
|
+
...props
|
|
111
111
|
}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
112
|
+
return (
|
|
113
|
+
<MenubarPrimitive.CheckboxItem
|
|
114
|
+
data-slot="menubar-checkbox-item"
|
|
115
|
+
className={cn(
|
|
116
|
+
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
117
|
+
className,
|
|
118
|
+
)}
|
|
119
|
+
checked={checked}
|
|
120
|
+
{...props}
|
|
121
|
+
>
|
|
122
|
+
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
|
|
123
|
+
<MenubarPrimitive.ItemIndicator>
|
|
124
|
+
<CheckIcon className="size-4" />
|
|
125
|
+
</MenubarPrimitive.ItemIndicator>
|
|
126
|
+
</span>
|
|
127
|
+
{children}
|
|
128
|
+
</MenubarPrimitive.CheckboxItem>
|
|
129
|
+
);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
/** A menu item within a MenubarRadioGroup that shows a radio dot when selected. */
|
|
133
133
|
function MenubarRadioItem({ className, children, ...props }: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
134
|
+
return (
|
|
135
|
+
<MenubarPrimitive.RadioItem
|
|
136
|
+
data-slot="menubar-radio-item"
|
|
137
|
+
className={cn(
|
|
138
|
+
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
139
|
+
className,
|
|
140
|
+
)}
|
|
141
|
+
{...props}
|
|
142
|
+
>
|
|
143
|
+
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
|
|
144
|
+
<MenubarPrimitive.ItemIndicator>
|
|
145
|
+
<CircleIcon className="size-2 fill-current" />
|
|
146
|
+
</MenubarPrimitive.ItemIndicator>
|
|
147
|
+
</span>
|
|
148
|
+
{children}
|
|
149
|
+
</MenubarPrimitive.RadioItem>
|
|
150
|
+
);
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
function MenubarLabel({
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
className,
|
|
155
|
+
inset,
|
|
156
|
+
...props
|
|
157
157
|
}: React.ComponentProps<typeof MenubarPrimitive.Label> & {
|
|
158
|
-
|
|
158
|
+
inset?: boolean;
|
|
159
159
|
}) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
160
|
+
return (
|
|
161
|
+
<MenubarPrimitive.Label
|
|
162
|
+
data-slot="menubar-label"
|
|
163
|
+
data-inset={inset}
|
|
164
|
+
className={cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}
|
|
165
|
+
{...props}
|
|
166
|
+
/>
|
|
167
|
+
);
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
function MenubarSeparator({ className, ...props }: React.ComponentProps<typeof MenubarPrimitive.Separator>) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
171
|
+
return (
|
|
172
|
+
<MenubarPrimitive.Separator
|
|
173
|
+
data-slot="menubar-separator"
|
|
174
|
+
className={cn('bg-border -mx-1 my-1 h-px', className)}
|
|
175
|
+
{...props}
|
|
176
|
+
/>
|
|
177
|
+
);
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
/** Displays a keyboard shortcut hint aligned to the right of a menu item. */
|
|
181
181
|
function MenubarShortcut({ className, ...props }: React.ComponentProps<'span'>) {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
182
|
+
return (
|
|
183
|
+
<span
|
|
184
|
+
data-slot="menubar-shortcut"
|
|
185
|
+
className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}
|
|
186
|
+
{...props}
|
|
187
|
+
/>
|
|
188
|
+
);
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
function MenubarSub({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Sub>) {
|
|
192
|
-
|
|
192
|
+
return <MenubarPrimitive.Sub data-slot="menubar-sub" {...props} />;
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
/** The trigger for a nested submenu, rendering a chevron icon to indicate expandability. */
|
|
196
196
|
function MenubarSubTrigger({
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
className,
|
|
198
|
+
inset,
|
|
199
|
+
children,
|
|
200
|
+
...props
|
|
201
201
|
}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {
|
|
202
|
-
|
|
202
|
+
inset?: boolean;
|
|
203
203
|
}) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
204
|
+
return (
|
|
205
|
+
<MenubarPrimitive.SubTrigger
|
|
206
|
+
data-slot="menubar-sub-trigger"
|
|
207
|
+
data-inset={inset}
|
|
208
|
+
className={cn(
|
|
209
|
+
'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8',
|
|
210
|
+
className,
|
|
211
|
+
)}
|
|
212
|
+
{...props}
|
|
213
|
+
>
|
|
214
|
+
{children}
|
|
215
|
+
<ChevronRightIcon className="ml-auto h-4 w-4" />
|
|
216
|
+
</MenubarPrimitive.SubTrigger>
|
|
217
|
+
);
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
/** The dropdown content panel for a nested submenu. */
|
|
221
221
|
function MenubarSubContent({ className, ...props }: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
222
|
+
return (
|
|
223
|
+
<MenubarPrimitive.SubContent
|
|
224
|
+
data-slot="menubar-sub-content"
|
|
225
|
+
className={cn(
|
|
226
|
+
'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',
|
|
227
|
+
className,
|
|
228
|
+
)}
|
|
229
|
+
{...props}
|
|
230
|
+
/>
|
|
231
|
+
);
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
export {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
235
|
+
Menubar,
|
|
236
|
+
MenubarPortal,
|
|
237
|
+
MenubarMenu,
|
|
238
|
+
MenubarTrigger,
|
|
239
|
+
MenubarContent,
|
|
240
|
+
MenubarGroup,
|
|
241
|
+
MenubarSeparator,
|
|
242
|
+
MenubarLabel,
|
|
243
|
+
MenubarItem,
|
|
244
|
+
MenubarShortcut,
|
|
245
|
+
MenubarCheckboxItem,
|
|
246
|
+
MenubarRadioGroup,
|
|
247
|
+
MenubarRadioItem,
|
|
248
|
+
MenubarSub,
|
|
249
|
+
MenubarSubTrigger,
|
|
250
|
+
MenubarSubContent,
|
|
251
251
|
};
|
|
@@ -2,44 +2,44 @@ import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
|
2
2
|
import { NativeSelect, NativeSelectOption } from '@/components/ui/NativeSelect';
|
|
3
3
|
|
|
4
4
|
const meta: Meta<typeof NativeSelect> = {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
title: 'UI Components/NativeSelect',
|
|
6
|
+
component: NativeSelect,
|
|
7
7
|
};
|
|
8
8
|
export default meta;
|
|
9
9
|
type Story = StoryObj<typeof NativeSelect>;
|
|
10
10
|
|
|
11
11
|
/** Shows a native select with pre-selected value and several options. */
|
|
12
12
|
export const Default: Story = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
render: () => (
|
|
14
|
+
<NativeSelect defaultValue="react">
|
|
15
|
+
<NativeSelectOption value="react">React</NativeSelectOption>
|
|
16
|
+
<NativeSelectOption value="vue">Vue</NativeSelectOption>
|
|
17
|
+
<NativeSelectOption value="angular">Angular</NativeSelectOption>
|
|
18
|
+
<NativeSelectOption value="svelte">Svelte</NativeSelectOption>
|
|
19
|
+
</NativeSelect>
|
|
20
|
+
),
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
/** Shows the compact size variant with a disabled placeholder option. */
|
|
24
24
|
export const Small: Story = {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
render: () => (
|
|
26
|
+
<NativeSelect size="sm" defaultValue="">
|
|
27
|
+
<NativeSelectOption value="" disabled>
|
|
28
|
+
Select a fruit...
|
|
29
|
+
</NativeSelectOption>
|
|
30
|
+
<NativeSelectOption value="apple">Apple</NativeSelectOption>
|
|
31
|
+
<NativeSelectOption value="banana">Banana</NativeSelectOption>
|
|
32
|
+
<NativeSelectOption value="cherry">Cherry</NativeSelectOption>
|
|
33
|
+
</NativeSelect>
|
|
34
|
+
),
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
/** Shows the select in a disabled state. */
|
|
38
38
|
export const Disabled: Story = {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
render: () => (
|
|
40
|
+
<NativeSelect disabled defaultValue="react">
|
|
41
|
+
<NativeSelectOption value="react">React</NativeSelectOption>
|
|
42
|
+
<NativeSelectOption value="vue">Vue</NativeSelectOption>
|
|
43
|
+
</NativeSelect>
|
|
44
|
+
),
|
|
45
45
|
};
|