From fd87c4916770f06e9f5f65d8194988a7bca15a8a Mon Sep 17 00:00:00 2001 From: bepyan Date: Mon, 8 Jul 2024 01:11:25 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A6=20shadcn-ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 148173 -> 179480 bytes components.json | 17 +++ package.json | 25 +++- src/app/globals.css | 73 ++++++++++ src/components/ui/accordion.tsx | 57 ++++++++ src/components/ui/aspect-ratio.tsx | 7 + src/components/ui/avatar.tsx | 50 +++++++ src/components/ui/button.tsx | 57 ++++++++ src/components/ui/card.tsx | 83 +++++++++++ src/components/ui/dialog.tsx | 122 +++++++++++++++++ src/components/ui/dropdown-menu.tsx | 205 ++++++++++++++++++++++++++++ src/components/ui/input.tsx | 25 ++++ src/components/ui/label.tsx | 26 ++++ src/components/ui/select.tsx | 164 ++++++++++++++++++++++ src/components/ui/separator.tsx | 31 +++++ src/components/ui/sonner.tsx | 31 +++++ src/components/ui/tabs.tsx | 55 ++++++++ src/components/ui/textarea.tsx | 24 ++++ src/components/ui/tooltip.tsx | 30 ++++ src/lib/utils.ts | 6 + tailwind.config.ts | 79 +++++++++-- 21 files changed, 1153 insertions(+), 14 deletions(-) create mode 100644 components.json create mode 100644 src/components/ui/accordion.tsx create mode 100644 src/components/ui/aspect-ratio.tsx create mode 100644 src/components/ui/avatar.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/dialog.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/separator.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/components/ui/tabs.tsx create mode 100644 src/components/ui/textarea.tsx create mode 100644 src/components/ui/tooltip.tsx create mode 100644 src/lib/utils.ts diff --git a/bun.lockb b/bun.lockb index e4ae8818d7e57bdebbe5e70cdcc8649e5b4afe96..6ea041bdce594ad90c33fdf6dbb11634f755c0f4 100755 GIT binary patch delta 51666 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 delta 29946 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 diff --git a/components.json b/components.json new file mode 100644 index 0000000..bc32655 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "aliases": { + "components": "~/components", + "utils": "~/lib/utils" + }, + "rsc": true, + "style": "new-york", + "tailwind": { + "baseColor": "slate", + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "cssVariables": true, + "prefix": "" + }, + "tsx": true +} diff --git a/package.json b/package.json index 163f44b..64ed731 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,33 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "ui": "bunx shadcn-ui@latest", + "ui:add": "bunx shadcn-ui@latest add", + "ui:lint": "bunx prettier src/components/ui/* --write" }, "dependencies": { + "@radix-ui/react-accordion": "^1.2.0", + "@radix-ui/react-aspect-ratio": "^1.1.0", + "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "next": "14.2.4", + "next-themes": "^0.3.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "next": "14.2.4" + "sonner": "^1.5.0", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@types/node": "^20.14.10", diff --git a/src/app/globals.css b/src/app/globals.css index b5c61c9..8abdb15 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,3 +1,76 @@ @tailwind base; @tailwind components; @tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx new file mode 100644 index 0000000..6cc2ec1 --- /dev/null +++ b/src/components/ui/accordion.tsx @@ -0,0 +1,57 @@ +"use client"; + +import * as AccordionPrimitive from "@radix-ui/react-accordion"; +import { ChevronDownIcon } from "@radix-ui/react-icons"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const Accordion = AccordionPrimitive.Root; + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AccordionItem.displayName = "AccordionItem"; + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className, + )} + {...props} + > + {children} + + + +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)); +AccordionContent.displayName = AccordionPrimitive.Content.displayName; + +export { Accordion, AccordionContent, AccordionItem, AccordionTrigger }; diff --git a/src/components/ui/aspect-ratio.tsx b/src/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..359bc94 --- /dev/null +++ b/src/components/ui/aspect-ratio.tsx @@ -0,0 +1,7 @@ +"use client"; + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"; + +const AspectRatio = AspectRatioPrimitive.Root; + +export { AspectRatio }; diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..9183109 --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client"; + +import * as AvatarPrimitive from "@radix-ui/react-avatar"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarFallback, AvatarImage }; diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..9345217 --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const buttonVariants = cva( + "focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground hover:bg-primary/90 shadow", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm", + outline: + "border-input bg-background hover:bg-accent hover:text-accent-foreground border shadow-sm", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-sm", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + }, +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx new file mode 100644 index 0000000..04e0179 --- /dev/null +++ b/src/components/ui/card.tsx @@ -0,0 +1,83 @@ +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardTitle.displayName = "CardTitle"; + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = "CardFooter"; + +export { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +}; diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx new file mode 100644 index 0000000..4cd1c57 --- /dev/null +++ b/src/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client"; + +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { Cross2Icon } from "@radix-ui/react-icons"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +}; diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..eff5dd5 --- /dev/null +++ b/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,205 @@ +"use client"; + +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { + CheckIcon, + ChevronRightIcon, + DotFilledIcon, +} from "@radix-ui/react-icons"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +}; diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx new file mode 100644 index 0000000..8ee178c --- /dev/null +++ b/src/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ); + }, +); +Input.displayName = "Input"; + +export { Input }; diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx new file mode 100644 index 0000000..171d8d9 --- /dev/null +++ b/src/components/ui/label.tsx @@ -0,0 +1,26 @@ +"use client"; + +import * as LabelPrimitive from "@radix-ui/react-label"; +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", +); + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)); +Label.displayName = LabelPrimitive.Root.displayName; + +export { Label }; diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx new file mode 100644 index 0000000..bc4127c --- /dev/null +++ b/src/components/ui/select.tsx @@ -0,0 +1,164 @@ +"use client"; + +import { + CaretSortIcon, + CheckIcon, + ChevronDownIcon, + ChevronUpIcon, +} from "@radix-ui/react-icons"; +import * as SelectPrimitive from "@radix-ui/react-select"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const Select = SelectPrimitive.Root; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className, + )} + {...props} + > + {children} + + + + +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName; + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +}; diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx new file mode 100644 index 0000000..1330ac9 --- /dev/null +++ b/src/components/ui/separator.tsx @@ -0,0 +1,31 @@ +"use client"; + +import * as SeparatorPrimitive from "@radix-ui/react-separator"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref, + ) => ( + + ), +); +Separator.displayName = SeparatorPrimitive.Root.displayName; + +export { Separator }; diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx new file mode 100644 index 0000000..549cf84 --- /dev/null +++ b/src/components/ui/sonner.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { useTheme } from "next-themes"; +import { Toaster as Sonner } from "sonner"; + +type ToasterProps = React.ComponentProps; + +const Toaster = ({ ...props }: ToasterProps) => { + const { theme = "system" } = useTheme(); + + return ( + + ); +}; + +export { Toaster }; diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx new file mode 100644 index 0000000..265dea3 --- /dev/null +++ b/src/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client"; + +import * as TabsPrimitive from "@radix-ui/react-tabs"; +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +const Tabs = TabsPrimitive.Root; + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsList.displayName = TabsPrimitive.List.displayName; + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName; + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsContent.displayName = TabsPrimitive.Content.displayName; + +export { Tabs, TabsContent, TabsList, TabsTrigger }; diff --git a/src/components/ui/textarea.tsx b/src/components/ui/textarea.tsx new file mode 100644 index 0000000..f3a201a --- /dev/null +++ b/src/components/ui/textarea.tsx @@ -0,0 +1,24 @@ +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +export interface TextareaProps + extends React.TextareaHTMLAttributes {} + +const Textarea = React.forwardRef( + ({ className, ...props }, ref) => { + return ( +