@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.
Files changed (144) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/starter/.storybook/main.ts +17 -22
  3. package/dist/starter/.storybook/manager-head.html +31 -31
  4. package/dist/starter/.storybook/manager.ts +133 -133
  5. package/dist/starter/.storybook/preview-head.html +12 -12
  6. package/dist/starter/.storybook/preview.tsx +79 -79
  7. package/dist/starter/biome.json +126 -0
  8. package/dist/starter/codegen.ts +11 -11
  9. package/dist/starter/components.json +27 -27
  10. package/dist/starter/package.json +86 -80
  11. package/dist/starter/public/mockServiceWorker.js +261 -261
  12. package/dist/starter/scripts/build-component-db.ts +17 -20
  13. package/dist/starter/src/App.tsx +15 -17
  14. package/dist/starter/src/components/ui/Accordion.stories.tsx +35 -35
  15. package/dist/starter/src/components/ui/Accordion.tsx +33 -33
  16. package/dist/starter/src/components/ui/Alert.stories.tsx +15 -15
  17. package/dist/starter/src/components/ui/Alert.tsx +32 -32
  18. package/dist/starter/src/components/ui/AlertDialog.stories.tsx +50 -50
  19. package/dist/starter/src/components/ui/AlertDialog.tsx +114 -115
  20. package/dist/starter/src/components/ui/AspectRatio.stories.tsx +20 -20
  21. package/dist/starter/src/components/ui/AspectRatio.tsx +1 -1
  22. package/dist/starter/src/components/ui/Avatar.stories.tsx +27 -27
  23. package/dist/starter/src/components/ui/Avatar.tsx +63 -63
  24. package/dist/starter/src/components/ui/Badge.stories.tsx +14 -14
  25. package/dist/starter/src/components/ui/Badge.tsx +27 -27
  26. package/dist/starter/src/components/ui/Breadcrumb.stories.tsx +38 -38
  27. package/dist/starter/src/components/ui/Breadcrumb.tsx +63 -62
  28. package/dist/starter/src/components/ui/Button.stories.tsx +55 -55
  29. package/dist/starter/src/components/ui/Button.tsx +49 -49
  30. package/dist/starter/src/components/ui/ButtonGroup.stories.tsx +17 -17
  31. package/dist/starter/src/components/ui/ButtonGroup.tsx +52 -53
  32. package/dist/starter/src/components/ui/Calendar.stories.tsx +20 -19
  33. package/dist/starter/src/components/ui/Calendar.tsx +142 -143
  34. package/dist/starter/src/components/ui/Card.stories.tsx +29 -29
  35. package/dist/starter/src/components/ui/Card.tsx +31 -31
  36. package/dist/starter/src/components/ui/Carousel.stories.tsx +41 -41
  37. package/dist/starter/src/components/ui/Carousel.tsx +171 -172
  38. package/dist/starter/src/components/ui/Chart.stories.tsx +21 -21
  39. package/dist/starter/src/components/ui/Chart.tsx +244 -247
  40. package/dist/starter/src/components/ui/Checkbox.stories.tsx +11 -11
  41. package/dist/starter/src/components/ui/Checkbox.tsx +18 -18
  42. package/dist/starter/src/components/ui/Collapsible.stories.tsx +40 -40
  43. package/dist/starter/src/components/ui/Collapsible.tsx +3 -3
  44. package/dist/starter/src/components/ui/Combobox.stories.tsx +48 -48
  45. package/dist/starter/src/components/ui/Combobox.tsx +204 -205
  46. package/dist/starter/src/components/ui/Command.stories.tsx +55 -55
  47. package/dist/starter/src/components/ui/Command.tsx +102 -103
  48. package/dist/starter/src/components/ui/ContextMenu.stories.tsx +52 -52
  49. package/dist/starter/src/components/ui/ContextMenu.tsx +151 -151
  50. package/dist/starter/src/components/ui/DesignSystem-Colors.stories.tsx +92 -92
  51. package/dist/starter/src/components/ui/DesignSystem-Layout.stories.tsx +139 -139
  52. package/dist/starter/src/components/ui/DesignSystem-Overview.stories.tsx +676 -657
  53. package/dist/starter/src/components/ui/DesignSystem-Typography.stories.tsx +59 -59
  54. package/dist/starter/src/components/ui/Dialog.stories.tsx +56 -56
  55. package/dist/starter/src/components/ui/Dialog.tsx +97 -98
  56. package/dist/starter/src/components/ui/Direction.stories.tsx +20 -20
  57. package/dist/starter/src/components/ui/Direction.tsx +7 -7
  58. package/dist/starter/src/components/ui/Drawer.stories.tsx +54 -54
  59. package/dist/starter/src/components/ui/Drawer.tsx +70 -70
  60. package/dist/starter/src/components/ui/DropdownMenu.stories.tsx +58 -58
  61. package/dist/starter/src/components/ui/DropdownMenu.tsx +157 -157
  62. package/dist/starter/src/components/ui/Empty.stories.tsx +22 -22
  63. package/dist/starter/src/components/ui/Empty.tsx +58 -58
  64. package/dist/starter/src/components/ui/Field.stories.tsx +31 -31
  65. package/dist/starter/src/components/ui/Field.tsx +180 -181
  66. package/dist/starter/src/components/ui/Form.stories.tsx +29 -29
  67. package/dist/starter/src/components/ui/Form.tsx +93 -96
  68. package/dist/starter/src/components/ui/HoverCard.stories.tsx +34 -34
  69. package/dist/starter/src/components/ui/HoverCard.tsx +21 -21
  70. package/dist/starter/src/components/ui/Input.stories.tsx +18 -18
  71. package/dist/starter/src/components/ui/Input.tsx +14 -14
  72. package/dist/starter/src/components/ui/InputGroup.stories.tsx +34 -34
  73. package/dist/starter/src/components/ui/InputGroup.tsx +110 -111
  74. package/dist/starter/src/components/ui/InputOTP.stories.tsx +28 -28
  75. package/dist/starter/src/components/ui/InputOTP.tsx +43 -43
  76. package/dist/starter/src/components/ui/Item.stories.tsx +45 -45
  77. package/dist/starter/src/components/ui/Item.tsx +113 -114
  78. package/dist/starter/src/components/ui/Kbd.stories.tsx +31 -31
  79. package/dist/starter/src/components/ui/Kbd.tsx +11 -11
  80. package/dist/starter/src/components/ui/Label.stories.tsx +62 -62
  81. package/dist/starter/src/components/ui/Label.tsx +26 -25
  82. package/dist/starter/src/components/ui/Menubar.stories.tsx +62 -62
  83. package/dist/starter/src/components/ui/Menubar.tsx +173 -173
  84. package/dist/starter/src/components/ui/NativeSelect.stories.tsx +26 -26
  85. package/dist/starter/src/components/ui/NativeSelect.tsx +29 -29
  86. package/dist/starter/src/components/ui/NavigationMenu.stories.tsx +64 -64
  87. package/dist/starter/src/components/ui/NavigationMenu.tsx +103 -103
  88. package/dist/starter/src/components/ui/Pagination.stories.tsx +61 -61
  89. package/dist/starter/src/components/ui/Pagination.tsx +69 -71
  90. package/dist/starter/src/components/ui/Popover.stories.tsx +38 -38
  91. package/dist/starter/src/components/ui/Popover.tsx +25 -25
  92. package/dist/starter/src/components/ui/Progress.stories.tsx +9 -9
  93. package/dist/starter/src/components/ui/Progress.tsx +14 -14
  94. package/dist/starter/src/components/ui/RadioGroup.stories.tsx +35 -35
  95. package/dist/starter/src/components/ui/RadioGroup.tsx +19 -19
  96. package/dist/starter/src/components/ui/Resizable.stories.tsx +54 -54
  97. package/dist/starter/src/components/ui/Resizable.tsx +29 -29
  98. package/dist/starter/src/components/ui/ScrollArea.stories.tsx +27 -27
  99. package/dist/starter/src/components/ui/ScrollArea.tsx +34 -34
  100. package/dist/starter/src/components/ui/Select.stories.tsx +43 -43
  101. package/dist/starter/src/components/ui/Select.tsx +120 -120
  102. package/dist/starter/src/components/ui/Separator.stories.tsx +27 -27
  103. package/dist/starter/src/components/ui/Separator.tsx +17 -17
  104. package/dist/starter/src/components/ui/Sheet.stories.tsx +53 -53
  105. package/dist/starter/src/components/ui/Sheet.tsx +69 -69
  106. package/dist/starter/src/components/ui/Sidebar.stories.tsx +77 -77
  107. package/dist/starter/src/components/ui/Sidebar.tsx +563 -564
  108. package/dist/starter/src/components/ui/Skeleton.stories.tsx +25 -25
  109. package/dist/starter/src/components/ui/Skeleton.tsx +1 -1
  110. package/dist/starter/src/components/ui/Slider.stories.tsx +5 -5
  111. package/dist/starter/src/components/ui/Slider.tsx +45 -44
  112. package/dist/starter/src/components/ui/Sonner.stories.tsx +32 -32
  113. package/dist/starter/src/components/ui/Sonner.tsx +23 -23
  114. package/dist/starter/src/components/ui/Spinner.stories.tsx +8 -8
  115. package/dist/starter/src/components/ui/Spinner.tsx +1 -1
  116. package/dist/starter/src/components/ui/Switch.stories.tsx +16 -17
  117. package/dist/starter/src/components/ui/Switch.tsx +24 -24
  118. package/dist/starter/src/components/ui/Table.stories.tsx +50 -50
  119. package/dist/starter/src/components/ui/Table.tsx +45 -45
  120. package/dist/starter/src/components/ui/Tabs.stories.tsx +39 -39
  121. package/dist/starter/src/components/ui/Tabs.tsx +47 -47
  122. package/dist/starter/src/components/ui/Textarea.stories.tsx +9 -9
  123. package/dist/starter/src/components/ui/Textarea.tsx +11 -11
  124. package/dist/starter/src/components/ui/Toast.stories.tsx +77 -77
  125. package/dist/starter/src/components/ui/Toast.tsx +75 -75
  126. package/dist/starter/src/components/ui/Toaster.tsx +17 -19
  127. package/dist/starter/src/components/ui/Toggle.stories.tsx +20 -20
  128. package/dist/starter/src/components/ui/Toggle.tsx +26 -26
  129. package/dist/starter/src/components/ui/ToggleGroup.stories.tsx +41 -41
  130. package/dist/starter/src/components/ui/ToggleGroup.tsx +61 -62
  131. package/dist/starter/src/components/ui/Tooltip.stories.tsx +26 -26
  132. package/dist/starter/src/components/ui/Tooltip.tsx +24 -24
  133. package/dist/starter/src/gql/execute.ts +1 -1
  134. package/dist/starter/src/gql/fragment-masking.ts +1 -1
  135. package/dist/starter/src/gql/graphql.ts +3 -0
  136. package/dist/starter/src/hooks/use-mobile.ts +11 -11
  137. package/dist/starter/src/hooks/use-toast.ts +135 -135
  138. package/dist/starter/src/index.css +105 -105
  139. package/dist/starter/src/lib/utils.ts +1 -1
  140. package/dist/starter/src/main.tsx +4 -1
  141. package/dist/starter/tsconfig.app.json +24 -24
  142. package/dist/starter/tsconfig.json +8 -8
  143. package/dist/starter/vite.config.ts +38 -37
  144. package/package.json +3 -3
@@ -1,78 +1,78 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import {
3
- Menubar,
4
- MenubarMenu,
5
- MenubarTrigger,
6
- MenubarContent,
7
- MenubarItem,
8
- MenubarSeparator,
9
- MenubarLabel,
10
- MenubarShortcut,
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
- title: 'UI Components/Menubar',
15
- component: Menubar,
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
- 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
- ),
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
- 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
- ),
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
- 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
- );
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
- return <MenubarPrimitive.Menu data-slot="menubar-menu" {...props} />;
25
+ return <MenubarPrimitive.Menu data-slot="menubar-menu" {...props} />;
26
26
  }
27
27
 
28
28
  function MenubarGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Group>) {
29
- return <MenubarPrimitive.Group data-slot="menubar-group" {...props} />;
29
+ return <MenubarPrimitive.Group data-slot="menubar-group" {...props} />;
30
30
  }
31
31
 
32
32
  function MenubarPortal({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Portal>) {
33
- return <MenubarPrimitive.Portal data-slot="menubar-portal" {...props} />;
33
+ return <MenubarPrimitive.Portal data-slot="menubar-portal" {...props} />;
34
34
  }
35
35
 
36
36
  function MenubarRadioGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {
37
- return <MenubarPrimitive.RadioGroup data-slot="menubar-radio-group" {...props} />;
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
- 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
- );
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
- className,
57
- align = 'start',
58
- alignOffset = -4,
59
- sideOffset = 8,
60
- ...props
56
+ className,
57
+ align = 'start',
58
+ alignOffset = -4,
59
+ sideOffset = 8,
60
+ ...props
61
61
  }: React.ComponentProps<typeof MenubarPrimitive.Content>) {
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
- );
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
- 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
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
- inset?: boolean;
89
- variant?: 'default' | 'destructive';
88
+ inset?: boolean;
89
+ variant?: 'default' | 'destructive';
90
90
  }) {
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
- );
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
- className,
108
- children,
109
- checked,
110
- ...props
107
+ className,
108
+ children,
109
+ checked,
110
+ ...props
111
111
  }: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {
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
- );
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
- 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
- );
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
- className,
155
- inset,
156
- ...props
154
+ className,
155
+ inset,
156
+ ...props
157
157
  }: React.ComponentProps<typeof MenubarPrimitive.Label> & {
158
- inset?: boolean;
158
+ inset?: boolean;
159
159
  }) {
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
- );
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
- 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
- );
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
- 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
- );
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
- return <MenubarPrimitive.Sub data-slot="menubar-sub" {...props} />;
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
- className,
198
- inset,
199
- children,
200
- ...props
197
+ className,
198
+ inset,
199
+ children,
200
+ ...props
201
201
  }: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {
202
- inset?: boolean;
202
+ inset?: boolean;
203
203
  }) {
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
- );
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
- 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
- );
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
- 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,
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
- title: 'UI Components/NativeSelect',
6
- component: NativeSelect,
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
- 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
- ),
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
- 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
- ),
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
- render: () => (
40
- <NativeSelect disabled defaultValue="react">
41
- <NativeSelectOption value="react">React</NativeSelectOption>
42
- <NativeSelectOption value="vue">Vue</NativeSelectOption>
43
- </NativeSelect>
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
  };