create-auto-app 1.34.0 → 1.36.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 (156) hide show
  1. package/package.json +2 -2
  2. package/templates/typical/.gitignore +1 -1
  3. package/templates/typical/auto.config.ts +85 -80
  4. package/templates/typical/client/.gitignore +0 -4
  5. package/templates/typical/client/.storybook/main.ts +0 -66
  6. package/templates/typical/client/.storybook/manager-head.html +0 -154
  7. package/templates/typical/client/.storybook/manager.ts +0 -164
  8. package/templates/typical/client/.storybook/preview-head.html +0 -31
  9. package/templates/typical/client/.storybook/preview.tsx +0 -120
  10. package/templates/typical/client/codegen.ts +0 -17
  11. package/templates/typical/client/components.json +0 -29
  12. package/templates/typical/client/index.html +0 -12
  13. package/templates/typical/client/package.json +0 -69
  14. package/templates/typical/client/pnpm-lock.yaml +0 -7868
  15. package/templates/typical/client/public/blank.svg +0 -1
  16. package/templates/typical/client/public/mockServiceWorker.js +0 -336
  17. package/templates/typical/client/src/App.tsx +0 -29
  18. package/templates/typical/client/src/components/.gitkeep +0 -0
  19. package/templates/typical/client/src/components/ui/Accordion.stories.tsx +0 -49
  20. package/templates/typical/client/src/components/ui/Accordion.tsx +0 -55
  21. package/templates/typical/client/src/components/ui/Alert.stories.tsx +0 -29
  22. package/templates/typical/client/src/components/ui/Alert.tsx +0 -56
  23. package/templates/typical/client/src/components/ui/AlertDialog.stories.tsx +0 -67
  24. package/templates/typical/client/src/components/ui/AlertDialog.tsx +0 -178
  25. package/templates/typical/client/src/components/ui/AspectRatio.stories.tsx +0 -35
  26. package/templates/typical/client/src/components/ui/AspectRatio.tsx +0 -13
  27. package/templates/typical/client/src/components/ui/Avatar.stories.tsx +0 -45
  28. package/templates/typical/client/src/components/ui/Avatar.tsx +0 -98
  29. package/templates/typical/client/src/components/ui/Badge.stories.tsx +0 -41
  30. package/templates/typical/client/src/components/ui/Badge.tsx +0 -45
  31. package/templates/typical/client/src/components/ui/Breadcrumb.stories.tsx +0 -54
  32. package/templates/typical/client/src/components/ui/Breadcrumb.tsx +0 -104
  33. package/templates/typical/client/src/components/ui/Button.stories.tsx +0 -102
  34. package/templates/typical/client/src/components/ui/Button.tsx +0 -67
  35. package/templates/typical/client/src/components/ui/ButtonGroup.stories.tsx +0 -32
  36. package/templates/typical/client/src/components/ui/ButtonGroup.tsx +0 -81
  37. package/templates/typical/client/src/components/ui/Calendar.stories.tsx +0 -40
  38. package/templates/typical/client/src/components/ui/Calendar.tsx +0 -165
  39. package/templates/typical/client/src/components/ui/Card.stories.tsx +0 -44
  40. package/templates/typical/client/src/components/ui/Card.tsx +0 -66
  41. package/templates/typical/client/src/components/ui/Carousel.stories.tsx +0 -56
  42. package/templates/typical/client/src/components/ui/Carousel.tsx +0 -225
  43. package/templates/typical/client/src/components/ui/Chart.stories.tsx +0 -39
  44. package/templates/typical/client/src/components/ui/Chart.tsx +0 -305
  45. package/templates/typical/client/src/components/ui/Checkbox.stories.tsx +0 -35
  46. package/templates/typical/client/src/components/ui/Checkbox.tsx +0 -30
  47. package/templates/typical/client/src/components/ui/Collapsible.stories.tsx +0 -58
  48. package/templates/typical/client/src/components/ui/Collapsible.tsx +0 -18
  49. package/templates/typical/client/src/components/ui/Combobox.stories.tsx +0 -75
  50. package/templates/typical/client/src/components/ui/Combobox.tsx +0 -296
  51. package/templates/typical/client/src/components/ui/Command.stories.tsx +0 -71
  52. package/templates/typical/client/src/components/ui/Command.tsx +0 -157
  53. package/templates/typical/client/src/components/ui/ContextMenu.stories.tsx +0 -68
  54. package/templates/typical/client/src/components/ui/ContextMenu.tsx +0 -231
  55. package/templates/typical/client/src/components/ui/DesignSystem-Colors.mdx +0 -68
  56. package/templates/typical/client/src/components/ui/DesignSystem-Colors.stories.tsx +0 -117
  57. package/templates/typical/client/src/components/ui/DesignSystem-Layout.mdx +0 -64
  58. package/templates/typical/client/src/components/ui/DesignSystem-Layout.stories.tsx +0 -167
  59. package/templates/typical/client/src/components/ui/DesignSystem-Overview.stories.tsx +0 -748
  60. package/templates/typical/client/src/components/ui/DesignSystem-Typography.mdx +0 -31
  61. package/templates/typical/client/src/components/ui/DesignSystem-Typography.stories.tsx +0 -80
  62. package/templates/typical/client/src/components/ui/Dialog.stories.tsx +0 -74
  63. package/templates/typical/client/src/components/ui/Dialog.tsx +0 -154
  64. package/templates/typical/client/src/components/ui/Direction.stories.tsx +0 -38
  65. package/templates/typical/client/src/components/ui/Direction.tsx +0 -24
  66. package/templates/typical/client/src/components/ui/Drawer.stories.tsx +0 -70
  67. package/templates/typical/client/src/components/ui/Drawer.tsx +0 -124
  68. package/templates/typical/client/src/components/ui/DropdownMenu.stories.tsx +0 -74
  69. package/templates/typical/client/src/components/ui/DropdownMenu.tsx +0 -239
  70. package/templates/typical/client/src/components/ui/Empty.stories.tsx +0 -37
  71. package/templates/typical/client/src/components/ui/Empty.tsx +0 -98
  72. package/templates/typical/client/src/components/ui/Field.stories.tsx +0 -50
  73. package/templates/typical/client/src/components/ui/Field.tsx +0 -251
  74. package/templates/typical/client/src/components/ui/Form.stories.tsx +0 -45
  75. package/templates/typical/client/src/components/ui/Form.tsx +0 -148
  76. package/templates/typical/client/src/components/ui/HoverCard.stories.tsx +0 -49
  77. package/templates/typical/client/src/components/ui/HoverCard.tsx +0 -39
  78. package/templates/typical/client/src/components/ui/Input.stories.tsx +0 -42
  79. package/templates/typical/client/src/components/ui/Input.tsx +0 -22
  80. package/templates/typical/client/src/components/ui/InputGroup.stories.tsx +0 -53
  81. package/templates/typical/client/src/components/ui/InputGroup.tsx +0 -153
  82. package/templates/typical/client/src/components/ui/InputOTP.stories.tsx +0 -42
  83. package/templates/typical/client/src/components/ui/InputOTP.tsx +0 -72
  84. package/templates/typical/client/src/components/ui/Item.stories.tsx +0 -64
  85. package/templates/typical/client/src/components/ui/Item.tsx +0 -168
  86. package/templates/typical/client/src/components/ui/Kbd.stories.tsx +0 -59
  87. package/templates/typical/client/src/components/ui/Kbd.tsx +0 -22
  88. package/templates/typical/client/src/components/ui/Label.stories.tsx +0 -90
  89. package/templates/typical/client/src/components/ui/Label.tsx +0 -44
  90. package/templates/typical/client/src/components/ui/Menubar.stories.tsx +0 -78
  91. package/templates/typical/client/src/components/ui/Menubar.tsx +0 -251
  92. package/templates/typical/client/src/components/ui/NativeSelect.stories.tsx +0 -45
  93. package/templates/typical/client/src/components/ui/NativeSelect.tsx +0 -50
  94. package/templates/typical/client/src/components/ui/NavigationMenu.stories.tsx +0 -80
  95. package/templates/typical/client/src/components/ui/NavigationMenu.tsx +0 -152
  96. package/templates/typical/client/src/components/ui/Pagination.stories.tsx +0 -77
  97. package/templates/typical/client/src/components/ui/Pagination.tsx +0 -108
  98. package/templates/typical/client/src/components/ui/Popover.stories.tsx +0 -53
  99. package/templates/typical/client/src/components/ui/Popover.tsx +0 -57
  100. package/templates/typical/client/src/components/ui/Progress.stories.tsx +0 -32
  101. package/templates/typical/client/src/components/ui/Progress.tsx +0 -25
  102. package/templates/typical/client/src/components/ui/RadioGroup.stories.tsx +0 -50
  103. package/templates/typical/client/src/components/ui/RadioGroup.tsx +0 -36
  104. package/templates/typical/client/src/components/ui/Resizable.stories.tsx +0 -72
  105. package/templates/typical/client/src/components/ui/Resizable.tsx +0 -54
  106. package/templates/typical/client/src/components/ui/ScrollArea.stories.tsx +0 -45
  107. package/templates/typical/client/src/components/ui/ScrollArea.tsx +0 -51
  108. package/templates/typical/client/src/components/ui/Select.stories.tsx +0 -59
  109. package/templates/typical/client/src/components/ui/Select.tsx +0 -171
  110. package/templates/typical/client/src/components/ui/Separator.stories.tsx +0 -42
  111. package/templates/typical/client/src/components/ui/Separator.tsx +0 -27
  112. package/templates/typical/client/src/components/ui/Sheet.stories.tsx +0 -68
  113. package/templates/typical/client/src/components/ui/Sheet.tsx +0 -115
  114. package/templates/typical/client/src/components/ui/Sidebar.stories.tsx +0 -96
  115. package/templates/typical/client/src/components/ui/Sidebar.tsx +0 -695
  116. package/templates/typical/client/src/components/ui/Skeleton.stories.tsx +0 -40
  117. package/templates/typical/client/src/components/ui/Skeleton.tsx +0 -11
  118. package/templates/typical/client/src/components/ui/Slider.stories.tsx +0 -24
  119. package/templates/typical/client/src/components/ui/Slider.tsx +0 -55
  120. package/templates/typical/client/src/components/ui/Sonner.stories.tsx +0 -45
  121. package/templates/typical/client/src/components/ui/Sonner.tsx +0 -38
  122. package/templates/typical/client/src/components/ui/Spinner.stories.tsx +0 -26
  123. package/templates/typical/client/src/components/ui/Spinner.tsx +0 -13
  124. package/templates/typical/client/src/components/ui/Switch.stories.tsx +0 -39
  125. package/templates/typical/client/src/components/ui/Switch.tsx +0 -35
  126. package/templates/typical/client/src/components/ui/Table.stories.tsx +0 -67
  127. package/templates/typical/client/src/components/ui/Table.tsx +0 -86
  128. package/templates/typical/client/src/components/ui/Tabs.stories.tsx +0 -53
  129. package/templates/typical/client/src/components/ui/Tabs.tsx +0 -75
  130. package/templates/typical/client/src/components/ui/Textarea.stories.tsx +0 -27
  131. package/templates/typical/client/src/components/ui/Textarea.tsx +0 -22
  132. package/templates/typical/client/src/components/ui/Toast.stories.tsx +0 -116
  133. package/templates/typical/client/src/components/ui/Toast.tsx +0 -123
  134. package/templates/typical/client/src/components/ui/Toaster.tsx +0 -32
  135. package/templates/typical/client/src/components/ui/Toggle.stories.tsx +0 -44
  136. package/templates/typical/client/src/components/ui/Toggle.tsx +0 -42
  137. package/templates/typical/client/src/components/ui/ToggleGroup.stories.tsx +0 -61
  138. package/templates/typical/client/src/components/ui/ToggleGroup.tsx +0 -83
  139. package/templates/typical/client/src/components/ui/Tooltip.stories.tsx +0 -42
  140. package/templates/typical/client/src/components/ui/Tooltip.tsx +0 -48
  141. package/templates/typical/client/src/gql/execute.ts +0 -11
  142. package/templates/typical/client/src/gql/fragment-masking.ts +0 -83
  143. package/templates/typical/client/src/gql/gql.ts +0 -9
  144. package/templates/typical/client/src/gql/graphql.ts +0 -182
  145. package/templates/typical/client/src/gql/index.ts +0 -2
  146. package/templates/typical/client/src/graphql/mutations.ts +0 -0
  147. package/templates/typical/client/src/graphql/queries.ts +0 -0
  148. package/templates/typical/client/src/hooks/.gitkeep +0 -0
  149. package/templates/typical/client/src/hooks/use-mobile.ts +0 -19
  150. package/templates/typical/client/src/hooks/use-toast.ts +0 -186
  151. package/templates/typical/client/src/index.css +0 -121
  152. package/templates/typical/client/src/lib/utils.ts +0 -6
  153. package/templates/typical/client/src/main.tsx +0 -5
  154. package/templates/typical/client/tsconfig.app.json +0 -26
  155. package/templates/typical/client/tsconfig.json +0 -10
  156. package/templates/typical/client/vite.config.ts +0 -50
@@ -1,108 +0,0 @@
1
- import * as React from 'react';
2
- import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react';
3
-
4
- import { cn } from '@/lib/utils';
5
- import { buttonVariants, type Button } from '@/components/ui/Button';
6
-
7
- /**
8
- * A navigation component for paginated content, rendered as a semantic nav element.
9
- * Compose with PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, and PaginationEllipsis.
10
- */
11
- function Pagination({ className, ...props }: React.ComponentProps<'nav'>) {
12
- return (
13
- <nav
14
- role="navigation"
15
- aria-label="pagination"
16
- data-slot="pagination"
17
- className={cn('mx-auto flex w-full justify-center', className)}
18
- {...props}
19
- />
20
- );
21
- }
22
-
23
- function PaginationContent({ className, ...props }: React.ComponentProps<'ul'>) {
24
- return <ul data-slot="pagination-content" className={cn('flex flex-row items-center gap-1', className)} {...props} />;
25
- }
26
-
27
- function PaginationItem({ ...props }: React.ComponentProps<'li'>) {
28
- return <li data-slot="pagination-item" {...props} />;
29
- }
30
-
31
- type PaginationLinkProps = {
32
- isActive?: boolean;
33
- } & Pick<React.ComponentProps<typeof Button>, 'size'> &
34
- React.ComponentProps<'a'>;
35
-
36
- /** A page number link that renders as outlined when active and ghost when inactive. */
37
- function PaginationLink({ className, isActive, size = 'icon', ...props }: PaginationLinkProps) {
38
- return (
39
- <a
40
- aria-current={isActive ? 'page' : undefined}
41
- data-slot="pagination-link"
42
- data-active={isActive}
43
- className={cn(
44
- buttonVariants({
45
- variant: isActive ? 'outline' : 'ghost',
46
- size,
47
- }),
48
- className,
49
- )}
50
- {...props}
51
- />
52
- );
53
- }
54
-
55
- /** A "Previous" link with a left chevron icon for navigating to the prior page. */
56
- function PaginationPrevious({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {
57
- return (
58
- <PaginationLink
59
- aria-label="Go to previous page"
60
- size="default"
61
- className={cn('gap-1 px-2.5 sm:pl-2.5', className)}
62
- {...props}
63
- >
64
- <ChevronLeftIcon />
65
- <span className="hidden sm:block">Previous</span>
66
- </PaginationLink>
67
- );
68
- }
69
-
70
- /** A "Next" link with a right chevron icon for navigating to the following page. */
71
- function PaginationNext({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {
72
- return (
73
- <PaginationLink
74
- aria-label="Go to next page"
75
- size="default"
76
- className={cn('gap-1 px-2.5 sm:pr-2.5', className)}
77
- {...props}
78
- >
79
- <span className="hidden sm:block">Next</span>
80
- <ChevronRightIcon />
81
- </PaginationLink>
82
- );
83
- }
84
-
85
- /** A visual ellipsis indicator representing skipped page numbers. */
86
- function PaginationEllipsis({ className, ...props }: React.ComponentProps<'span'>) {
87
- return (
88
- <span
89
- aria-hidden
90
- data-slot="pagination-ellipsis"
91
- className={cn('flex size-9 items-center justify-center', className)}
92
- {...props}
93
- >
94
- <MoreHorizontalIcon className="size-4" />
95
- <span className="sr-only">More pages</span>
96
- </span>
97
- );
98
- }
99
-
100
- export {
101
- Pagination,
102
- PaginationContent,
103
- PaginationLink,
104
- PaginationItem,
105
- PaginationPrevious,
106
- PaginationNext,
107
- PaginationEllipsis,
108
- };
@@ -1,53 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui/Popover';
3
- import { Button } from '@/components/ui/Button';
4
-
5
- const meta: Meta<typeof Popover> = {
6
- title: 'UI Components/Popover',
7
- component: Popover,
8
- };
9
- export default meta;
10
- type Story = StoryObj<typeof Popover>;
11
-
12
- /** Shows a popover with form inputs for setting dimensions. */
13
- export const Default: Story = {
14
- render: () => (
15
- <Popover>
16
- <PopoverTrigger asChild>
17
- <Button variant="outline">Open Popover</Button>
18
- </PopoverTrigger>
19
- <PopoverContent>
20
- <div className="grid gap-4">
21
- <div className="space-y-2">
22
- <h4 className="font-medium leading-none">Dimensions</h4>
23
- <p className="text-muted-foreground text-sm">Set the dimensions for the layer.</p>
24
- </div>
25
- <div className="grid gap-2">
26
- <div className="grid grid-cols-3 items-center gap-4">
27
- <span className="text-sm">Width</span>
28
- <input className="border-input col-span-2 h-8 rounded-md border px-3 text-sm" defaultValue="100%" />
29
- </div>
30
- <div className="grid grid-cols-3 items-center gap-4">
31
- <span className="text-sm">Height</span>
32
- <input className="border-input col-span-2 h-8 rounded-md border px-3 text-sm" defaultValue="25px" />
33
- </div>
34
- </div>
35
- </div>
36
- </PopoverContent>
37
- </Popover>
38
- ),
39
- };
40
-
41
- /** Shows a popover with simple informational text content. */
42
- export const SimpleText: Story = {
43
- render: () => (
44
- <Popover>
45
- <PopoverTrigger asChild>
46
- <Button variant="outline">Info</Button>
47
- </PopoverTrigger>
48
- <PopoverContent className="w-60">
49
- <p className="text-sm">This is a simple popover with some informational text content.</p>
50
- </PopoverContent>
51
- </Popover>
52
- ),
53
- };
@@ -1,57 +0,0 @@
1
- import * as React from 'react';
2
- import { Popover as PopoverPrimitive } from 'radix-ui';
3
-
4
- import { cn } from '@/lib/utils';
5
-
6
- /** A floating panel anchored to a trigger for rich content on click. */
7
- function Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {
8
- return <PopoverPrimitive.Root data-slot="popover" {...props} />;
9
- }
10
-
11
- /** The element that toggles the popover open and closed when clicked. */
12
- function PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {
13
- return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
14
- }
15
-
16
- /** The floating content panel rendered via a portal with animated enter/exit transitions. */
17
- function PopoverContent({
18
- className,
19
- align = 'center',
20
- sideOffset = 4,
21
- ...props
22
- }: React.ComponentProps<typeof PopoverPrimitive.Content>) {
23
- return (
24
- <PopoverPrimitive.Portal>
25
- <PopoverPrimitive.Content
26
- data-slot="popover-content"
27
- align={align}
28
- sideOffset={sideOffset}
29
- className={cn(
30
- '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 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden',
31
- className,
32
- )}
33
- {...props}
34
- />
35
- </PopoverPrimitive.Portal>
36
- );
37
- }
38
-
39
- /** An optional custom anchor element to position the popover relative to instead of the trigger. */
40
- function PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {
41
- return <PopoverPrimitive.Anchor data-slot="popover-anchor" {...props} />;
42
- }
43
-
44
- /** A layout wrapper for the popover's title and description. */
45
- function PopoverHeader({ className, ...props }: React.ComponentProps<'div'>) {
46
- return <div data-slot="popover-header" className={cn('flex flex-col gap-1 text-sm', className)} {...props} />;
47
- }
48
-
49
- function PopoverTitle({ className, ...props }: React.ComponentProps<'h2'>) {
50
- return <div data-slot="popover-title" className={cn('font-medium', className)} {...props} />;
51
- }
52
-
53
- function PopoverDescription({ className, ...props }: React.ComponentProps<'p'>) {
54
- return <p data-slot="popover-description" className={cn('text-muted-foreground', className)} {...props} />;
55
- }
56
-
57
- export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription };
@@ -1,32 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Progress } from '@/components/ui/Progress';
3
-
4
- const meta: Meta<typeof Progress> = {
5
- title: 'UI Components/Progress',
6
- component: Progress,
7
- };
8
- export default meta;
9
- type Story = StoryObj<typeof Progress>;
10
-
11
- /** Shows the progress bar at 50% with an adjustable value control. */
12
- export const Default: Story = {
13
- args: {
14
- value: 50,
15
- },
16
- render: (args) => <Progress {...args} className="w-[60%]" />,
17
- };
18
-
19
- /** Shows the progress bar at 0% (empty state). */
20
- export const Empty: Story = {
21
- render: () => <Progress value={0} className="w-[60%]" />,
22
- };
23
-
24
- /** Shows the progress bar at 50%. */
25
- export const Half: Story = {
26
- render: () => <Progress value={50} className="w-[60%]" />,
27
- };
28
-
29
- /** Shows the progress bar at 100% (complete state). */
30
- export const Full: Story = {
31
- render: () => <Progress value={100} className="w-[60%]" />,
32
- };
@@ -1,25 +0,0 @@
1
- 'use client';
2
-
3
- import * as React from 'react';
4
- import { Progress as ProgressPrimitive } from 'radix-ui';
5
-
6
- import { cn } from '@/lib/utils';
7
-
8
- /** A horizontal progress bar. Set `value` (0-100) to control fill level. */
9
- function Progress({ className, value, ...props }: React.ComponentProps<typeof ProgressPrimitive.Root>) {
10
- return (
11
- <ProgressPrimitive.Root
12
- data-slot="progress"
13
- className={cn('bg-primary/20 relative h-2 w-full overflow-hidden rounded-full', className)}
14
- {...props}
15
- >
16
- <ProgressPrimitive.Indicator
17
- data-slot="progress-indicator"
18
- className="bg-primary h-full w-full flex-1 transition-all"
19
- style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
20
- />
21
- </ProgressPrimitive.Root>
22
- );
23
- }
24
-
25
- export { Progress };
@@ -1,50 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { RadioGroup, RadioGroupItem } from '@/components/ui/RadioGroup';
3
- import { Label } from '@/components/ui/Label';
4
-
5
- const meta: Meta<typeof RadioGroup> = {
6
- title: 'UI Components/RadioGroup',
7
- component: RadioGroup,
8
- };
9
- export default meta;
10
- type Story = StoryObj<typeof RadioGroup>;
11
-
12
- /** Shows a vertical radio group with three options and a pre-selected value. */
13
- export const Default: Story = {
14
- render: () => (
15
- <RadioGroup defaultValue="comfortable">
16
- <div className="flex items-center space-x-2">
17
- <RadioGroupItem value="default" id="r1" />
18
- <Label htmlFor="r1">Default</Label>
19
- </div>
20
- <div className="flex items-center space-x-2">
21
- <RadioGroupItem value="comfortable" id="r2" />
22
- <Label htmlFor="r2">Comfortable</Label>
23
- </div>
24
- <div className="flex items-center space-x-2">
25
- <RadioGroupItem value="compact" id="r3" />
26
- <Label htmlFor="r3">Compact</Label>
27
- </div>
28
- </RadioGroup>
29
- ),
30
- };
31
-
32
- /** Shows a horizontally laid out radio group. */
33
- export const Horizontal: Story = {
34
- render: () => (
35
- <RadioGroup defaultValue="medium" className="flex flex-row gap-4">
36
- <div className="flex items-center space-x-2">
37
- <RadioGroupItem value="small" id="h1" />
38
- <Label htmlFor="h1">Small</Label>
39
- </div>
40
- <div className="flex items-center space-x-2">
41
- <RadioGroupItem value="medium" id="h2" />
42
- <Label htmlFor="h2">Medium</Label>
43
- </div>
44
- <div className="flex items-center space-x-2">
45
- <RadioGroupItem value="large" id="h3" />
46
- <Label htmlFor="h3">Large</Label>
47
- </div>
48
- </RadioGroup>
49
- ),
50
- };
@@ -1,36 +0,0 @@
1
- import * as React from 'react';
2
- import { CircleIcon } from 'lucide-react';
3
- import { RadioGroup as RadioGroupPrimitive } from 'radix-ui';
4
-
5
- import { cn } from '@/lib/utils';
6
-
7
- /**
8
- * A set of mutually exclusive radio options built on Radix UI RadioGroup primitive.
9
- * Compose with RadioGroupItem and Label to create accessible radio button groups.
10
- */
11
- function RadioGroup({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {
12
- return <RadioGroupPrimitive.Root data-slot="radio-group" className={cn('grid gap-3', className)} {...props} />;
13
- }
14
-
15
- /** An individual radio button that displays a filled dot when selected. */
16
- function RadioGroupItem({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {
17
- return (
18
- <RadioGroupPrimitive.Item
19
- data-slot="radio-group-item"
20
- className={cn(
21
- 'border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
22
- className,
23
- )}
24
- {...props}
25
- >
26
- <RadioGroupPrimitive.Indicator
27
- data-slot="radio-group-indicator"
28
- className="relative flex items-center justify-center"
29
- >
30
- <CircleIcon className="fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" />
31
- </RadioGroupPrimitive.Indicator>
32
- </RadioGroupPrimitive.Item>
33
- );
34
- }
35
-
36
- export { RadioGroup, RadioGroupItem };
@@ -1,72 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { ResizablePanelGroup, ResizablePanel, ResizableHandle } from '@/components/ui/Resizable';
3
-
4
- const meta: Meta<typeof ResizablePanelGroup> = {
5
- title: 'UI Components/Resizable',
6
- component: ResizablePanelGroup,
7
- };
8
- export default meta;
9
- type Story = StoryObj<typeof ResizablePanelGroup>;
10
-
11
- /** Shows two resizable panels split equally with a minimal divider. */
12
- export const Default: Story = {
13
- render: () => (
14
- <ResizablePanelGroup orientation="horizontal" className="min-h-[200px] max-w-md rounded-lg border">
15
- <ResizablePanel defaultSize={50}>
16
- <div className="flex h-full items-center justify-center p-6">
17
- <span className="font-semibold">Panel One</span>
18
- </div>
19
- </ResizablePanel>
20
- <ResizableHandle />
21
- <ResizablePanel defaultSize={50}>
22
- <div className="flex h-full items-center justify-center p-6">
23
- <span className="font-semibold">Panel Two</span>
24
- </div>
25
- </ResizablePanel>
26
- </ResizablePanelGroup>
27
- ),
28
- };
29
-
30
- /** Shows two panels with a visible grip handle on the divider. */
31
- export const WithHandle: Story = {
32
- render: () => (
33
- <ResizablePanelGroup orientation="horizontal" className="min-h-[200px] max-w-md rounded-lg border">
34
- <ResizablePanel defaultSize={30}>
35
- <div className="flex h-full items-center justify-center p-6">
36
- <span className="font-semibold">Sidebar</span>
37
- </div>
38
- </ResizablePanel>
39
- <ResizableHandle withHandle />
40
- <ResizablePanel defaultSize={70}>
41
- <div className="flex h-full items-center justify-center p-6">
42
- <span className="font-semibold">Content</span>
43
- </div>
44
- </ResizablePanel>
45
- </ResizablePanelGroup>
46
- ),
47
- };
48
-
49
- /** Shows three resizable panels with grip handles between them. */
50
- export const ThreePanels: Story = {
51
- render: () => (
52
- <ResizablePanelGroup orientation="horizontal" className="min-h-[200px] max-w-lg rounded-lg border">
53
- <ResizablePanel defaultSize={25}>
54
- <div className="flex h-full items-center justify-center p-6">
55
- <span className="font-semibold">Left</span>
56
- </div>
57
- </ResizablePanel>
58
- <ResizableHandle withHandle />
59
- <ResizablePanel defaultSize={50}>
60
- <div className="flex h-full items-center justify-center p-6">
61
- <span className="font-semibold">Center</span>
62
- </div>
63
- </ResizablePanel>
64
- <ResizableHandle withHandle />
65
- <ResizablePanel defaultSize={25}>
66
- <div className="flex h-full items-center justify-center p-6">
67
- <span className="font-semibold">Right</span>
68
- </div>
69
- </ResizablePanel>
70
- </ResizablePanelGroup>
71
- ),
72
- };
@@ -1,54 +0,0 @@
1
- 'use client';
2
-
3
- import { GripVerticalIcon } from 'lucide-react';
4
- import * as ResizablePrimitive from 'react-resizable-panels';
5
-
6
- import { cn } from '@/lib/utils';
7
-
8
- /**
9
- * A container for resizable panels that can be dragged to adjust their sizes.
10
- * Built on react-resizable-panels. Compose with ResizablePanel and ResizableHandle.
11
- */
12
- function ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps) {
13
- return (
14
- <ResizablePrimitive.Group
15
- data-slot="resizable-panel-group"
16
- className={cn('flex h-full w-full aria-[orientation=vertical]:flex-col', className)}
17
- {...props}
18
- />
19
- );
20
- }
21
-
22
- /** A panel within a ResizablePanelGroup whose size can be adjusted by dragging adjacent handles. */
23
- function ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {
24
- return <ResizablePrimitive.Panel data-slot="resizable-panel" {...props} />;
25
- }
26
-
27
- /** A draggable divider between resizable panels. Set withHandle to show a visible grip icon. */
28
- function ResizableHandle({
29
- /** When true, renders a visible grip icon on the handle for better discoverability. */
30
- withHandle,
31
- className,
32
- ...props
33
- }: ResizablePrimitive.SeparatorProps & {
34
- withHandle?: boolean;
35
- }) {
36
- return (
37
- <ResizablePrimitive.Separator
38
- data-slot="resizable-handle"
39
- className={cn(
40
- 'bg-border focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90',
41
- className,
42
- )}
43
- {...props}
44
- >
45
- {withHandle && (
46
- <div className="bg-border z-10 flex h-4 w-3 items-center justify-center rounded-xs border">
47
- <GripVerticalIcon className="size-2.5" />
48
- </div>
49
- )}
50
- </ResizablePrimitive.Separator>
51
- );
52
- }
53
-
54
- export { ResizableHandle, ResizablePanel, ResizablePanelGroup };
@@ -1,45 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { ScrollArea, ScrollBar } from '@/components/ui/ScrollArea';
3
- import { Separator } from '@/components/ui/Separator';
4
-
5
- const meta: Meta<typeof ScrollArea> = {
6
- title: 'UI Components/ScrollArea',
7
- component: ScrollArea,
8
- };
9
- export default meta;
10
- type Story = StoryObj<typeof ScrollArea>;
11
-
12
- const tags = Array.from({ length: 50 }, (_, i) => `Item ${i + 1}`);
13
-
14
- /** Shows a vertical scroll area with a long list of items. */
15
- export const Default: Story = {
16
- render: () => (
17
- <ScrollArea className="h-72 w-48 rounded-md border">
18
- <div className="p-4">
19
- <h4 className="mb-4 text-sm font-medium leading-none">Tags</h4>
20
- {tags.map((tag) => (
21
- <div key={tag}>
22
- <div className="text-sm">{tag}</div>
23
- <Separator className="my-2" />
24
- </div>
25
- ))}
26
- </div>
27
- </ScrollArea>
28
- ),
29
- };
30
-
31
- /** Shows a horizontal scroll area with a row of cards. */
32
- export const Horizontal: Story = {
33
- render: () => (
34
- <ScrollArea className="w-96 whitespace-nowrap rounded-md border">
35
- <div className="flex w-max space-x-4 p-4">
36
- {Array.from({ length: 20 }, (_, i) => (
37
- <div key={i} className="bg-muted flex h-24 w-36 shrink-0 items-center justify-center rounded-md">
38
- <span className="text-sm font-medium">Card {i + 1}</span>
39
- </div>
40
- ))}
41
- </div>
42
- <ScrollBar orientation="horizontal" />
43
- </ScrollArea>
44
- ),
45
- };
@@ -1,51 +0,0 @@
1
- import * as React from 'react';
2
- import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';
3
-
4
- import { cn } from '@/lib/utils';
5
-
6
- /**
7
- * A custom scrollable container with styled scrollbars, built on Radix UI ScrollArea primitive.
8
- * Replaces native browser scrollbars with consistent cross-platform styled scrollbars.
9
- */
10
- function ScrollArea({ className, children, ...props }: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {
11
- return (
12
- <ScrollAreaPrimitive.Root data-slot="scroll-area" className={cn('relative', className)} {...props}>
13
- <ScrollAreaPrimitive.Viewport
14
- data-slot="scroll-area-viewport"
15
- className="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
16
- >
17
- {children}
18
- </ScrollAreaPrimitive.Viewport>
19
- <ScrollBar />
20
- <ScrollAreaPrimitive.Corner />
21
- </ScrollAreaPrimitive.Root>
22
- );
23
- }
24
-
25
- /** A styled scrollbar track and thumb. Defaults to vertical; set orientation="horizontal" for horizontal scrolling. */
26
- function ScrollBar({
27
- className,
28
- orientation = 'vertical',
29
- ...props
30
- }: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {
31
- return (
32
- <ScrollAreaPrimitive.ScrollAreaScrollbar
33
- data-slot="scroll-area-scrollbar"
34
- orientation={orientation}
35
- className={cn(
36
- 'flex touch-none p-px transition-colors select-none',
37
- orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',
38
- orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',
39
- className,
40
- )}
41
- {...props}
42
- >
43
- <ScrollAreaPrimitive.ScrollAreaThumb
44
- data-slot="scroll-area-thumb"
45
- className="bg-border relative flex-1 rounded-full"
46
- />
47
- </ScrollAreaPrimitive.ScrollAreaScrollbar>
48
- );
49
- }
50
-
51
- export { ScrollArea, ScrollBar };
@@ -1,59 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import {
3
- Select,
4
- SelectTrigger,
5
- SelectValue,
6
- SelectContent,
7
- SelectItem,
8
- SelectGroup,
9
- SelectLabel,
10
- } from '@/components/ui/Select';
11
-
12
- const meta: Meta<typeof Select> = {
13
- title: 'UI Components/Select',
14
- component: Select,
15
- };
16
- export default meta;
17
- type Story = StoryObj<typeof Select>;
18
-
19
- /** Shows a basic select with a list of fruit options. */
20
- export const Default: Story = {
21
- render: () => (
22
- <Select>
23
- <SelectTrigger className="w-[180px]">
24
- <SelectValue placeholder="Select a fruit" />
25
- </SelectTrigger>
26
- <SelectContent>
27
- <SelectItem value="apple">Apple</SelectItem>
28
- <SelectItem value="banana">Banana</SelectItem>
29
- <SelectItem value="cherry">Cherry</SelectItem>
30
- <SelectItem value="grape">Grape</SelectItem>
31
- <SelectItem value="orange">Orange</SelectItem>
32
- </SelectContent>
33
- </Select>
34
- ),
35
- };
36
-
37
- /** Shows options organized into labeled groups for categorized selection. */
38
- export const Grouped: Story = {
39
- render: () => (
40
- <Select>
41
- <SelectTrigger className="w-[220px]">
42
- <SelectValue placeholder="Select a timezone" />
43
- </SelectTrigger>
44
- <SelectContent>
45
- <SelectGroup>
46
- <SelectLabel>North America</SelectLabel>
47
- <SelectItem value="est">Eastern Standard Time (EST)</SelectItem>
48
- <SelectItem value="cst">Central Standard Time (CST)</SelectItem>
49
- <SelectItem value="pst">Pacific Standard Time (PST)</SelectItem>
50
- </SelectGroup>
51
- <SelectGroup>
52
- <SelectLabel>Europe</SelectLabel>
53
- <SelectItem value="gmt">Greenwich Mean Time (GMT)</SelectItem>
54
- <SelectItem value="cet">Central European Time (CET)</SelectItem>
55
- </SelectGroup>
56
- </SelectContent>
57
- </Select>
58
- ),
59
- };