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.
- package/package.json +2 -2
- package/templates/typical/.gitignore +1 -1
- package/templates/typical/auto.config.ts +85 -80
- package/templates/typical/client/.gitignore +0 -4
- package/templates/typical/client/.storybook/main.ts +0 -66
- package/templates/typical/client/.storybook/manager-head.html +0 -154
- package/templates/typical/client/.storybook/manager.ts +0 -164
- package/templates/typical/client/.storybook/preview-head.html +0 -31
- package/templates/typical/client/.storybook/preview.tsx +0 -120
- package/templates/typical/client/codegen.ts +0 -17
- package/templates/typical/client/components.json +0 -29
- package/templates/typical/client/index.html +0 -12
- package/templates/typical/client/package.json +0 -69
- package/templates/typical/client/pnpm-lock.yaml +0 -7868
- package/templates/typical/client/public/blank.svg +0 -1
- package/templates/typical/client/public/mockServiceWorker.js +0 -336
- package/templates/typical/client/src/App.tsx +0 -29
- package/templates/typical/client/src/components/.gitkeep +0 -0
- package/templates/typical/client/src/components/ui/Accordion.stories.tsx +0 -49
- package/templates/typical/client/src/components/ui/Accordion.tsx +0 -55
- package/templates/typical/client/src/components/ui/Alert.stories.tsx +0 -29
- package/templates/typical/client/src/components/ui/Alert.tsx +0 -56
- package/templates/typical/client/src/components/ui/AlertDialog.stories.tsx +0 -67
- package/templates/typical/client/src/components/ui/AlertDialog.tsx +0 -178
- package/templates/typical/client/src/components/ui/AspectRatio.stories.tsx +0 -35
- package/templates/typical/client/src/components/ui/AspectRatio.tsx +0 -13
- package/templates/typical/client/src/components/ui/Avatar.stories.tsx +0 -45
- package/templates/typical/client/src/components/ui/Avatar.tsx +0 -98
- package/templates/typical/client/src/components/ui/Badge.stories.tsx +0 -41
- package/templates/typical/client/src/components/ui/Badge.tsx +0 -45
- package/templates/typical/client/src/components/ui/Breadcrumb.stories.tsx +0 -54
- package/templates/typical/client/src/components/ui/Breadcrumb.tsx +0 -104
- package/templates/typical/client/src/components/ui/Button.stories.tsx +0 -102
- package/templates/typical/client/src/components/ui/Button.tsx +0 -67
- package/templates/typical/client/src/components/ui/ButtonGroup.stories.tsx +0 -32
- package/templates/typical/client/src/components/ui/ButtonGroup.tsx +0 -81
- package/templates/typical/client/src/components/ui/Calendar.stories.tsx +0 -40
- package/templates/typical/client/src/components/ui/Calendar.tsx +0 -165
- package/templates/typical/client/src/components/ui/Card.stories.tsx +0 -44
- package/templates/typical/client/src/components/ui/Card.tsx +0 -66
- package/templates/typical/client/src/components/ui/Carousel.stories.tsx +0 -56
- package/templates/typical/client/src/components/ui/Carousel.tsx +0 -225
- package/templates/typical/client/src/components/ui/Chart.stories.tsx +0 -39
- package/templates/typical/client/src/components/ui/Chart.tsx +0 -305
- package/templates/typical/client/src/components/ui/Checkbox.stories.tsx +0 -35
- package/templates/typical/client/src/components/ui/Checkbox.tsx +0 -30
- package/templates/typical/client/src/components/ui/Collapsible.stories.tsx +0 -58
- package/templates/typical/client/src/components/ui/Collapsible.tsx +0 -18
- package/templates/typical/client/src/components/ui/Combobox.stories.tsx +0 -75
- package/templates/typical/client/src/components/ui/Combobox.tsx +0 -296
- package/templates/typical/client/src/components/ui/Command.stories.tsx +0 -71
- package/templates/typical/client/src/components/ui/Command.tsx +0 -157
- package/templates/typical/client/src/components/ui/ContextMenu.stories.tsx +0 -68
- package/templates/typical/client/src/components/ui/ContextMenu.tsx +0 -231
- package/templates/typical/client/src/components/ui/DesignSystem-Colors.mdx +0 -68
- package/templates/typical/client/src/components/ui/DesignSystem-Colors.stories.tsx +0 -117
- package/templates/typical/client/src/components/ui/DesignSystem-Layout.mdx +0 -64
- package/templates/typical/client/src/components/ui/DesignSystem-Layout.stories.tsx +0 -167
- package/templates/typical/client/src/components/ui/DesignSystem-Overview.stories.tsx +0 -748
- package/templates/typical/client/src/components/ui/DesignSystem-Typography.mdx +0 -31
- package/templates/typical/client/src/components/ui/DesignSystem-Typography.stories.tsx +0 -80
- package/templates/typical/client/src/components/ui/Dialog.stories.tsx +0 -74
- package/templates/typical/client/src/components/ui/Dialog.tsx +0 -154
- package/templates/typical/client/src/components/ui/Direction.stories.tsx +0 -38
- package/templates/typical/client/src/components/ui/Direction.tsx +0 -24
- package/templates/typical/client/src/components/ui/Drawer.stories.tsx +0 -70
- package/templates/typical/client/src/components/ui/Drawer.tsx +0 -124
- package/templates/typical/client/src/components/ui/DropdownMenu.stories.tsx +0 -74
- package/templates/typical/client/src/components/ui/DropdownMenu.tsx +0 -239
- package/templates/typical/client/src/components/ui/Empty.stories.tsx +0 -37
- package/templates/typical/client/src/components/ui/Empty.tsx +0 -98
- package/templates/typical/client/src/components/ui/Field.stories.tsx +0 -50
- package/templates/typical/client/src/components/ui/Field.tsx +0 -251
- package/templates/typical/client/src/components/ui/Form.stories.tsx +0 -45
- package/templates/typical/client/src/components/ui/Form.tsx +0 -148
- package/templates/typical/client/src/components/ui/HoverCard.stories.tsx +0 -49
- package/templates/typical/client/src/components/ui/HoverCard.tsx +0 -39
- package/templates/typical/client/src/components/ui/Input.stories.tsx +0 -42
- package/templates/typical/client/src/components/ui/Input.tsx +0 -22
- package/templates/typical/client/src/components/ui/InputGroup.stories.tsx +0 -53
- package/templates/typical/client/src/components/ui/InputGroup.tsx +0 -153
- package/templates/typical/client/src/components/ui/InputOTP.stories.tsx +0 -42
- package/templates/typical/client/src/components/ui/InputOTP.tsx +0 -72
- package/templates/typical/client/src/components/ui/Item.stories.tsx +0 -64
- package/templates/typical/client/src/components/ui/Item.tsx +0 -168
- package/templates/typical/client/src/components/ui/Kbd.stories.tsx +0 -59
- package/templates/typical/client/src/components/ui/Kbd.tsx +0 -22
- package/templates/typical/client/src/components/ui/Label.stories.tsx +0 -90
- package/templates/typical/client/src/components/ui/Label.tsx +0 -44
- package/templates/typical/client/src/components/ui/Menubar.stories.tsx +0 -78
- package/templates/typical/client/src/components/ui/Menubar.tsx +0 -251
- package/templates/typical/client/src/components/ui/NativeSelect.stories.tsx +0 -45
- package/templates/typical/client/src/components/ui/NativeSelect.tsx +0 -50
- package/templates/typical/client/src/components/ui/NavigationMenu.stories.tsx +0 -80
- package/templates/typical/client/src/components/ui/NavigationMenu.tsx +0 -152
- package/templates/typical/client/src/components/ui/Pagination.stories.tsx +0 -77
- package/templates/typical/client/src/components/ui/Pagination.tsx +0 -108
- package/templates/typical/client/src/components/ui/Popover.stories.tsx +0 -53
- package/templates/typical/client/src/components/ui/Popover.tsx +0 -57
- package/templates/typical/client/src/components/ui/Progress.stories.tsx +0 -32
- package/templates/typical/client/src/components/ui/Progress.tsx +0 -25
- package/templates/typical/client/src/components/ui/RadioGroup.stories.tsx +0 -50
- package/templates/typical/client/src/components/ui/RadioGroup.tsx +0 -36
- package/templates/typical/client/src/components/ui/Resizable.stories.tsx +0 -72
- package/templates/typical/client/src/components/ui/Resizable.tsx +0 -54
- package/templates/typical/client/src/components/ui/ScrollArea.stories.tsx +0 -45
- package/templates/typical/client/src/components/ui/ScrollArea.tsx +0 -51
- package/templates/typical/client/src/components/ui/Select.stories.tsx +0 -59
- package/templates/typical/client/src/components/ui/Select.tsx +0 -171
- package/templates/typical/client/src/components/ui/Separator.stories.tsx +0 -42
- package/templates/typical/client/src/components/ui/Separator.tsx +0 -27
- package/templates/typical/client/src/components/ui/Sheet.stories.tsx +0 -68
- package/templates/typical/client/src/components/ui/Sheet.tsx +0 -115
- package/templates/typical/client/src/components/ui/Sidebar.stories.tsx +0 -96
- package/templates/typical/client/src/components/ui/Sidebar.tsx +0 -695
- package/templates/typical/client/src/components/ui/Skeleton.stories.tsx +0 -40
- package/templates/typical/client/src/components/ui/Skeleton.tsx +0 -11
- package/templates/typical/client/src/components/ui/Slider.stories.tsx +0 -24
- package/templates/typical/client/src/components/ui/Slider.tsx +0 -55
- package/templates/typical/client/src/components/ui/Sonner.stories.tsx +0 -45
- package/templates/typical/client/src/components/ui/Sonner.tsx +0 -38
- package/templates/typical/client/src/components/ui/Spinner.stories.tsx +0 -26
- package/templates/typical/client/src/components/ui/Spinner.tsx +0 -13
- package/templates/typical/client/src/components/ui/Switch.stories.tsx +0 -39
- package/templates/typical/client/src/components/ui/Switch.tsx +0 -35
- package/templates/typical/client/src/components/ui/Table.stories.tsx +0 -67
- package/templates/typical/client/src/components/ui/Table.tsx +0 -86
- package/templates/typical/client/src/components/ui/Tabs.stories.tsx +0 -53
- package/templates/typical/client/src/components/ui/Tabs.tsx +0 -75
- package/templates/typical/client/src/components/ui/Textarea.stories.tsx +0 -27
- package/templates/typical/client/src/components/ui/Textarea.tsx +0 -22
- package/templates/typical/client/src/components/ui/Toast.stories.tsx +0 -116
- package/templates/typical/client/src/components/ui/Toast.tsx +0 -123
- package/templates/typical/client/src/components/ui/Toaster.tsx +0 -32
- package/templates/typical/client/src/components/ui/Toggle.stories.tsx +0 -44
- package/templates/typical/client/src/components/ui/Toggle.tsx +0 -42
- package/templates/typical/client/src/components/ui/ToggleGroup.stories.tsx +0 -61
- package/templates/typical/client/src/components/ui/ToggleGroup.tsx +0 -83
- package/templates/typical/client/src/components/ui/Tooltip.stories.tsx +0 -42
- package/templates/typical/client/src/components/ui/Tooltip.tsx +0 -48
- package/templates/typical/client/src/gql/execute.ts +0 -11
- package/templates/typical/client/src/gql/fragment-masking.ts +0 -83
- package/templates/typical/client/src/gql/gql.ts +0 -9
- package/templates/typical/client/src/gql/graphql.ts +0 -182
- package/templates/typical/client/src/gql/index.ts +0 -2
- package/templates/typical/client/src/graphql/mutations.ts +0 -0
- package/templates/typical/client/src/graphql/queries.ts +0 -0
- package/templates/typical/client/src/hooks/.gitkeep +0 -0
- package/templates/typical/client/src/hooks/use-mobile.ts +0 -19
- package/templates/typical/client/src/hooks/use-toast.ts +0 -186
- package/templates/typical/client/src/index.css +0 -121
- package/templates/typical/client/src/lib/utils.ts +0 -6
- package/templates/typical/client/src/main.tsx +0 -5
- package/templates/typical/client/tsconfig.app.json +0 -26
- package/templates/typical/client/tsconfig.json +0 -10
- 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
|
-
};
|