From ec438644aec816941c06996e1fd2c4d3f6a7dffd Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 1 Apr 2026 12:26:26 +0000 Subject: [PATCH 1/2] feat: add ShadCN Luma style with runtime toggle Add support for the new shadcn/ui v4 "radix-luma" style alongside the existing "new-york" style, with a runtime toggle in the app header. Architecture: - ui-default/: current "new-york" style components (moved from ui/) - ui-luma/: new "luma" style components (fetched from upstream) - ui/: proxy layer that switches between styles via React context - StyleProvider + useStyle hook for runtime style switching The Luma style features pill-shaped corners (rounded-4xl), filled inputs, soft destructive variants, press animations, and ring-based card borders. https://claude.ai/code/session_01HFKFcR8tEaXjvTVe3XVC3c --- apps/ui/src/App.tsx | 23 +- apps/ui/src/components/app-header.tsx | 17 + .../src/components/ui-default/accordion.tsx | 62 ++ .../components/ui-default/alert-dialog.tsx | 179 ++++ apps/ui/src/components/ui-default/alert.tsx | 60 ++ .../components/ui-default/aspect-ratio.tsx | 9 + apps/ui/src/components/ui-default/avatar.tsx | 94 +++ apps/ui/src/components/ui-default/badge.tsx | 46 ++ .../src/components/ui-default/breadcrumb.tsx | 102 +++ .../components/ui-default/button-group.tsx | 78 ++ apps/ui/src/components/ui-default/button.tsx | 62 ++ .../ui/src/components/ui-default/calendar.tsx | 178 ++++ apps/ui/src/components/ui-default/card.tsx | 75 ++ .../ui/src/components/ui-default/carousel.tsx | 230 ++++++ apps/ui/src/components/ui-default/chart.tsx | 324 ++++++++ .../ui/src/components/ui-default/checkbox.tsx | 29 + .../src/components/ui-default/code-block.tsx | 27 + .../src/components/ui-default/collapsible.tsx | 19 + .../ui/src/components/ui-default/combobox.tsx | 286 +++++++ apps/ui/src/components/ui-default/command.tsx | 161 ++++ .../components/ui-default/context-menu.tsx | 224 +++++ apps/ui/src/components/ui-default/dialog.tsx | 142 ++++ .../src/components/ui-default/direction.tsx | 20 + apps/ui/src/components/ui-default/drawer.tsx | 122 +++ .../components/ui-default/dropdown-menu.tsx | 228 ++++++ apps/ui/src/components/ui-default/empty.tsx | 94 +++ apps/ui/src/components/ui-default/field.tsx | 234 ++++++ apps/ui/src/components/ui-default/form.tsx | 150 ++++ .../src/components/ui-default/hover-card.tsx | 36 + .../src/components/ui-default/input-group.tsx | 156 ++++ .../src/components/ui-default/input-otp.tsx | 70 ++ apps/ui/src/components/ui-default/input.tsx | 21 + apps/ui/src/components/ui-default/item.tsx | 172 ++++ apps/ui/src/components/ui-default/kbd.tsx | 28 + apps/ui/src/components/ui-default/label.tsx | 19 + apps/ui/src/components/ui-default/layout.tsx | 82 ++ apps/ui/src/components/ui-default/menubar.tsx | 252 ++++++ .../components/ui-default/native-select.tsx | 44 + .../components/ui-default/navigation-menu.tsx | 161 ++++ .../src/components/ui-default/pagination.tsx | 106 +++ apps/ui/src/components/ui-default/popover.tsx | 72 ++ .../ui/src/components/ui-default/progress.tsx | 28 + .../src/components/ui-default/radio-group.tsx | 43 + .../src/components/ui-default/resizable.tsx | 47 ++ .../src/components/ui-default/scroll-area.tsx | 54 ++ apps/ui/src/components/ui-default/select.tsx | 175 ++++ .../src/components/ui-default/separator.tsx | 26 + apps/ui/src/components/ui-default/sheet.tsx | 134 +++ apps/ui/src/components/ui-default/sidebar.tsx | 692 ++++++++++++++++ .../components/ui-default/simple-chart.tsx | 100 +++ .../components/ui-default/simple-select.tsx | 26 + .../ui/src/components/ui-default/skeleton.tsx | 13 + apps/ui/src/components/ui-default/slider.tsx | 56 ++ apps/ui/src/components/ui-default/sonner.tsx | 40 + apps/ui/src/components/ui-default/spinner.tsx | 16 + apps/ui/src/components/ui-default/switch.tsx | 33 + apps/ui/src/components/ui-default/table.tsx | 92 +++ apps/ui/src/components/ui-default/tabs.tsx | 79 ++ .../ui/src/components/ui-default/textarea.tsx | 18 + .../components/ui-default/toggle-group.tsx | 82 ++ apps/ui/src/components/ui-default/toggle.tsx | 46 ++ apps/ui/src/components/ui-default/tooltip.tsx | 51 ++ apps/ui/src/components/ui-luma/accordion.tsx | 84 ++ .../src/components/ui-luma/alert-dialog.tsx | 182 +++++ apps/ui/src/components/ui-luma/alert.tsx | 73 ++ .../src/components/ui-luma/aspect-ratio.tsx | 9 + apps/ui/src/components/ui-luma/avatar.tsx | 96 +++ apps/ui/src/components/ui-luma/badge.tsx | 45 + apps/ui/src/components/ui-luma/breadcrumb.tsx | 104 +++ .../src/components/ui-luma/button-group.tsx | 78 ++ apps/ui/src/components/ui-luma/button.tsx | 65 ++ apps/ui/src/components/ui-luma/calendar.tsx | 189 +++++ apps/ui/src/components/ui-luma/card.tsx | 89 ++ apps/ui/src/components/ui-luma/carousel.tsx | 231 ++++++ apps/ui/src/components/ui-luma/chart.tsx | 324 ++++++++ apps/ui/src/components/ui-luma/checkbox.tsx | 29 + apps/ui/src/components/ui-luma/code-block.tsx | 27 + .../ui/src/components/ui-luma/collapsible.tsx | 21 + apps/ui/src/components/ui-luma/combobox.tsx | 270 ++++++ apps/ui/src/components/ui-luma/command.tsx | 174 ++++ .../src/components/ui-luma/context-menu.tsx | 244 ++++++ apps/ui/src/components/ui-luma/dialog.tsx | 142 ++++ apps/ui/src/components/ui-luma/direction.tsx | 20 + apps/ui/src/components/ui-luma/drawer.tsx | 120 +++ .../src/components/ui-luma/dropdown-menu.tsx | 247 ++++++ apps/ui/src/components/ui-luma/empty.tsx | 94 +++ apps/ui/src/components/ui-luma/field.tsx | 224 +++++ apps/ui/src/components/ui-luma/form.tsx | 150 ++++ apps/ui/src/components/ui-luma/hover-card.tsx | 38 + .../ui/src/components/ui-luma/input-group.tsx | 144 ++++ apps/ui/src/components/ui-luma/input-otp.tsx | 86 ++ apps/ui/src/components/ui-luma/input.tsx | 19 + apps/ui/src/components/ui-luma/item.tsx | 182 +++++ apps/ui/src/components/ui-luma/kbd.tsx | 26 + apps/ui/src/components/ui-luma/label.tsx | 21 + apps/ui/src/components/ui-luma/layout.tsx | 82 ++ apps/ui/src/components/ui-luma/menubar.tsx | 260 ++++++ .../src/components/ui-luma/native-select.tsx | 43 + .../components/ui-luma/navigation-menu.tsx | 160 ++++ apps/ui/src/components/ui-luma/pagination.tsx | 112 +++ apps/ui/src/components/ui-luma/popover.tsx | 80 ++ apps/ui/src/components/ui-luma/progress.tsx | 31 + .../ui/src/components/ui-luma/radio-group.tsx | 44 + apps/ui/src/components/ui-luma/resizable.tsx | 42 + .../ui/src/components/ui-luma/scroll-area.tsx | 55 ++ apps/ui/src/components/ui-luma/select.tsx | 185 +++++ apps/ui/src/components/ui-luma/separator.tsx | 28 + apps/ui/src/components/ui-luma/sheet.tsx | 130 +++ apps/ui/src/components/ui-luma/sidebar.tsx | 665 +++++++++++++++ .../src/components/ui-luma/simple-chart.tsx | 100 +++ .../src/components/ui-luma/simple-select.tsx | 26 + apps/ui/src/components/ui-luma/skeleton.tsx | 13 + apps/ui/src/components/ui-luma/slider.tsx | 54 ++ apps/ui/src/components/ui-luma/sonner.tsx | 45 + apps/ui/src/components/ui-luma/spinner.tsx | 16 + apps/ui/src/components/ui-luma/switch.tsx | 33 + apps/ui/src/components/ui-luma/table.tsx | 89 ++ apps/ui/src/components/ui-luma/tabs.tsx | 80 ++ apps/ui/src/components/ui-luma/textarea.tsx | 18 + .../src/components/ui-luma/toggle-group.tsx | 86 ++ apps/ui/src/components/ui-luma/toggle.tsx | 46 ++ apps/ui/src/components/ui-luma/tooltip.tsx | 53 ++ apps/ui/src/components/ui/accordion.tsx | 81 +- apps/ui/src/components/ui/alert-dialog.tsx | 231 +++--- apps/ui/src/components/ui/alert.tsx | 74 +- apps/ui/src/components/ui/aspect-ratio.tsx | 11 +- apps/ui/src/components/ui/avatar.tsx | 121 +-- apps/ui/src/components/ui/badge.tsx | 50 +- apps/ui/src/components/ui/breadcrumb.tsx | 130 ++- apps/ui/src/components/ui/button-group.tsx | 102 +-- apps/ui/src/components/ui/button.tsx | 71 +- apps/ui/src/components/ui/calendar.tsx | 191 +---- apps/ui/src/components/ui/card.tsx | 105 +-- apps/ui/src/components/ui/carousel.tsx | 258 +----- apps/ui/src/components/ui/chart.tsx | 321 +------- apps/ui/src/components/ui/checkbox.tsx | 31 +- apps/ui/src/components/ui/code-block.tsx | 29 +- apps/ui/src/components/ui/collapsible.tsx | 39 +- apps/ui/src/components/ui/combobox.tsx | 338 +++----- apps/ui/src/components/ui/command.tsx | 183 ++--- apps/ui/src/components/ui/context-menu.tsx | 298 +++---- apps/ui/src/components/ui/dialog.tsx | 168 ++-- apps/ui/src/components/ui/direction.tsx | 29 +- apps/ui/src/components/ui/drawer.tsx | 146 ++-- apps/ui/src/components/ui/dropdown-menu.tsx | 302 +++---- apps/ui/src/components/ui/empty.tsx | 119 +-- apps/ui/src/components/ui/field.tsx | 262 ++---- apps/ui/src/components/ui/form.tsx | 174 ++-- apps/ui/src/components/ui/hover-card.tsx | 54 +- apps/ui/src/components/ui/input-group.tsx | 180 ++-- apps/ui/src/components/ui/input-otp.tsx | 89 +- apps/ui/src/components/ui/input.tsx | 23 +- apps/ui/src/components/ui/item.tsx | 196 ++--- apps/ui/src/components/ui/kbd.tsx | 31 +- apps/ui/src/components/ui/label.tsx | 21 +- apps/ui/src/components/ui/layout.tsx | 85 +- apps/ui/src/components/ui/menubar.tsx | 320 +++----- apps/ui/src/components/ui/native-select.tsx | 64 +- apps/ui/src/components/ui/navigation-menu.tsx | 199 ++--- apps/ui/src/components/ui/pagination.tsx | 136 ++-- apps/ui/src/components/ui/popover.tsx | 96 +-- apps/ui/src/components/ui/progress.tsx | 30 +- apps/ui/src/components/ui/radio-group.tsx | 54 +- apps/ui/src/components/ui/resizable.tsx | 67 +- apps/ui/src/components/ui/scroll-area.tsx | 60 +- apps/ui/src/components/ui/select.tsx | 203 ++--- apps/ui/src/components/ui/separator.tsx | 28 +- apps/ui/src/components/ui/sheet.tsx | 154 ++-- apps/ui/src/components/ui/sidebar.tsx | 770 ++++-------------- apps/ui/src/components/ui/simple-chart.tsx | 106 +-- apps/ui/src/components/ui/simple-select.tsx | 28 +- apps/ui/src/components/ui/skeleton.tsx | 15 +- apps/ui/src/components/ui/slider.tsx | 58 +- apps/ui/src/components/ui/sonner.tsx | 46 +- apps/ui/src/components/ui/spinner.tsx | 18 +- apps/ui/src/components/ui/switch.tsx | 35 +- apps/ui/src/components/ui/table.tsx | 119 +-- apps/ui/src/components/ui/tabs.tsx | 97 +-- apps/ui/src/components/ui/textarea.tsx | 20 +- apps/ui/src/components/ui/toggle-group.tsx | 93 +-- apps/ui/src/components/ui/toggle.tsx | 55 +- apps/ui/src/components/ui/tooltip.tsx | 76 +- apps/ui/src/lib/style-context.tsx | 23 + 183 files changed, 14999 insertions(+), 5282 deletions(-) create mode 100644 apps/ui/src/components/ui-default/accordion.tsx create mode 100644 apps/ui/src/components/ui-default/alert-dialog.tsx create mode 100644 apps/ui/src/components/ui-default/alert.tsx create mode 100644 apps/ui/src/components/ui-default/aspect-ratio.tsx create mode 100644 apps/ui/src/components/ui-default/avatar.tsx create mode 100644 apps/ui/src/components/ui-default/badge.tsx create mode 100644 apps/ui/src/components/ui-default/breadcrumb.tsx create mode 100644 apps/ui/src/components/ui-default/button-group.tsx create mode 100644 apps/ui/src/components/ui-default/button.tsx create mode 100644 apps/ui/src/components/ui-default/calendar.tsx create mode 100644 apps/ui/src/components/ui-default/card.tsx create mode 100644 apps/ui/src/components/ui-default/carousel.tsx create mode 100644 apps/ui/src/components/ui-default/chart.tsx create mode 100644 apps/ui/src/components/ui-default/checkbox.tsx create mode 100644 apps/ui/src/components/ui-default/code-block.tsx create mode 100644 apps/ui/src/components/ui-default/collapsible.tsx create mode 100644 apps/ui/src/components/ui-default/combobox.tsx create mode 100644 apps/ui/src/components/ui-default/command.tsx create mode 100644 apps/ui/src/components/ui-default/context-menu.tsx create mode 100644 apps/ui/src/components/ui-default/dialog.tsx create mode 100644 apps/ui/src/components/ui-default/direction.tsx create mode 100644 apps/ui/src/components/ui-default/drawer.tsx create mode 100644 apps/ui/src/components/ui-default/dropdown-menu.tsx create mode 100644 apps/ui/src/components/ui-default/empty.tsx create mode 100644 apps/ui/src/components/ui-default/field.tsx create mode 100644 apps/ui/src/components/ui-default/form.tsx create mode 100644 apps/ui/src/components/ui-default/hover-card.tsx create mode 100644 apps/ui/src/components/ui-default/input-group.tsx create mode 100644 apps/ui/src/components/ui-default/input-otp.tsx create mode 100644 apps/ui/src/components/ui-default/input.tsx create mode 100644 apps/ui/src/components/ui-default/item.tsx create mode 100644 apps/ui/src/components/ui-default/kbd.tsx create mode 100644 apps/ui/src/components/ui-default/label.tsx create mode 100644 apps/ui/src/components/ui-default/layout.tsx create mode 100644 apps/ui/src/components/ui-default/menubar.tsx create mode 100644 apps/ui/src/components/ui-default/native-select.tsx create mode 100644 apps/ui/src/components/ui-default/navigation-menu.tsx create mode 100644 apps/ui/src/components/ui-default/pagination.tsx create mode 100644 apps/ui/src/components/ui-default/popover.tsx create mode 100644 apps/ui/src/components/ui-default/progress.tsx create mode 100644 apps/ui/src/components/ui-default/radio-group.tsx create mode 100644 apps/ui/src/components/ui-default/resizable.tsx create mode 100644 apps/ui/src/components/ui-default/scroll-area.tsx create mode 100644 apps/ui/src/components/ui-default/select.tsx create mode 100644 apps/ui/src/components/ui-default/separator.tsx create mode 100644 apps/ui/src/components/ui-default/sheet.tsx create mode 100644 apps/ui/src/components/ui-default/sidebar.tsx create mode 100644 apps/ui/src/components/ui-default/simple-chart.tsx create mode 100644 apps/ui/src/components/ui-default/simple-select.tsx create mode 100644 apps/ui/src/components/ui-default/skeleton.tsx create mode 100644 apps/ui/src/components/ui-default/slider.tsx create mode 100644 apps/ui/src/components/ui-default/sonner.tsx create mode 100644 apps/ui/src/components/ui-default/spinner.tsx create mode 100644 apps/ui/src/components/ui-default/switch.tsx create mode 100644 apps/ui/src/components/ui-default/table.tsx create mode 100644 apps/ui/src/components/ui-default/tabs.tsx create mode 100644 apps/ui/src/components/ui-default/textarea.tsx create mode 100644 apps/ui/src/components/ui-default/toggle-group.tsx create mode 100644 apps/ui/src/components/ui-default/toggle.tsx create mode 100644 apps/ui/src/components/ui-default/tooltip.tsx create mode 100644 apps/ui/src/components/ui-luma/accordion.tsx create mode 100644 apps/ui/src/components/ui-luma/alert-dialog.tsx create mode 100644 apps/ui/src/components/ui-luma/alert.tsx create mode 100644 apps/ui/src/components/ui-luma/aspect-ratio.tsx create mode 100644 apps/ui/src/components/ui-luma/avatar.tsx create mode 100644 apps/ui/src/components/ui-luma/badge.tsx create mode 100644 apps/ui/src/components/ui-luma/breadcrumb.tsx create mode 100644 apps/ui/src/components/ui-luma/button-group.tsx create mode 100644 apps/ui/src/components/ui-luma/button.tsx create mode 100644 apps/ui/src/components/ui-luma/calendar.tsx create mode 100644 apps/ui/src/components/ui-luma/card.tsx create mode 100644 apps/ui/src/components/ui-luma/carousel.tsx create mode 100644 apps/ui/src/components/ui-luma/chart.tsx create mode 100644 apps/ui/src/components/ui-luma/checkbox.tsx create mode 100644 apps/ui/src/components/ui-luma/code-block.tsx create mode 100644 apps/ui/src/components/ui-luma/collapsible.tsx create mode 100644 apps/ui/src/components/ui-luma/combobox.tsx create mode 100644 apps/ui/src/components/ui-luma/command.tsx create mode 100644 apps/ui/src/components/ui-luma/context-menu.tsx create mode 100644 apps/ui/src/components/ui-luma/dialog.tsx create mode 100644 apps/ui/src/components/ui-luma/direction.tsx create mode 100644 apps/ui/src/components/ui-luma/drawer.tsx create mode 100644 apps/ui/src/components/ui-luma/dropdown-menu.tsx create mode 100644 apps/ui/src/components/ui-luma/empty.tsx create mode 100644 apps/ui/src/components/ui-luma/field.tsx create mode 100644 apps/ui/src/components/ui-luma/form.tsx create mode 100644 apps/ui/src/components/ui-luma/hover-card.tsx create mode 100644 apps/ui/src/components/ui-luma/input-group.tsx create mode 100644 apps/ui/src/components/ui-luma/input-otp.tsx create mode 100644 apps/ui/src/components/ui-luma/input.tsx create mode 100644 apps/ui/src/components/ui-luma/item.tsx create mode 100644 apps/ui/src/components/ui-luma/kbd.tsx create mode 100644 apps/ui/src/components/ui-luma/label.tsx create mode 100644 apps/ui/src/components/ui-luma/layout.tsx create mode 100644 apps/ui/src/components/ui-luma/menubar.tsx create mode 100644 apps/ui/src/components/ui-luma/native-select.tsx create mode 100644 apps/ui/src/components/ui-luma/navigation-menu.tsx create mode 100644 apps/ui/src/components/ui-luma/pagination.tsx create mode 100644 apps/ui/src/components/ui-luma/popover.tsx create mode 100644 apps/ui/src/components/ui-luma/progress.tsx create mode 100644 apps/ui/src/components/ui-luma/radio-group.tsx create mode 100644 apps/ui/src/components/ui-luma/resizable.tsx create mode 100644 apps/ui/src/components/ui-luma/scroll-area.tsx create mode 100644 apps/ui/src/components/ui-luma/select.tsx create mode 100644 apps/ui/src/components/ui-luma/separator.tsx create mode 100644 apps/ui/src/components/ui-luma/sheet.tsx create mode 100644 apps/ui/src/components/ui-luma/sidebar.tsx create mode 100644 apps/ui/src/components/ui-luma/simple-chart.tsx create mode 100644 apps/ui/src/components/ui-luma/simple-select.tsx create mode 100644 apps/ui/src/components/ui-luma/skeleton.tsx create mode 100644 apps/ui/src/components/ui-luma/slider.tsx create mode 100644 apps/ui/src/components/ui-luma/sonner.tsx create mode 100644 apps/ui/src/components/ui-luma/spinner.tsx create mode 100644 apps/ui/src/components/ui-luma/switch.tsx create mode 100644 apps/ui/src/components/ui-luma/table.tsx create mode 100644 apps/ui/src/components/ui-luma/tabs.tsx create mode 100644 apps/ui/src/components/ui-luma/textarea.tsx create mode 100644 apps/ui/src/components/ui-luma/toggle-group.tsx create mode 100644 apps/ui/src/components/ui-luma/toggle.tsx create mode 100644 apps/ui/src/components/ui-luma/tooltip.tsx create mode 100644 apps/ui/src/lib/style-context.tsx diff --git a/apps/ui/src/App.tsx b/apps/ui/src/App.tsx index 49e3c06..8cebb45 100644 --- a/apps/ui/src/App.tsx +++ b/apps/ui/src/App.tsx @@ -6,19 +6,22 @@ import { useChatKit } from "@/components/chat/chat-kit"; import { s } from "@hashbrownai/core"; import { chatTheme } from "@/lib/chat-theme"; import { useInitialSuggestions } from "./lib/suggestions"; +import { StyleProvider } from "@/lib/style-context"; export function App() { return ( - - - + + + + + ); } diff --git a/apps/ui/src/components/app-header.tsx b/apps/ui/src/components/app-header.tsx index 1b76e8d..a496fe5 100644 --- a/apps/ui/src/components/app-header.tsx +++ b/apps/ui/src/components/app-header.tsx @@ -1,4 +1,8 @@ +import { useStyle } from "@/lib/style-context"; + export function AppHeader({ title }: { title: string }) { + const { style, setStyle } = useStyle(); + return (

{title}

+
) { + return ; +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + svg]:rotate-180", + className, + )} + {...props} + > + {children} + + + + ); +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
{children}
+
+ ); +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/apps/ui/src/components/ui-default/alert-dialog.tsx b/apps/ui/src/components/ui-default/alert-dialog.tsx new file mode 100644 index 0000000..c85227b --- /dev/null +++ b/apps/ui/src/components/ui-default/alert-dialog.tsx @@ -0,0 +1,179 @@ +"use client"; + +import * as React from "react"; +import { AlertDialog as AlertDialogPrimitive } from "radix-ui"; + +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; + +function AlertDialog({ ...props }: React.ComponentProps) { + return ; +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ; +} + +function AlertDialogPortal({ ...props }: React.ComponentProps) { + return ; +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogContent({ + className, + size = "default", + ...props +}: React.ComponentProps & { + size?: "default" | "sm"; +}) { + return ( + + + + + ); +} + +function AlertDialogHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDialogFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogMedia({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDialogAction({ + className, + variant = "default", + size = "default", + ...props +}: React.ComponentProps & + Pick, "variant" | "size">) { + return ( + + ); +} + +function AlertDialogCancel({ + className, + variant = "outline", + size = "default", + ...props +}: React.ComponentProps & + Pick, "variant" | "size">) { + return ( + + ); +} + +export { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogMedia, + AlertDialogOverlay, + AlertDialogPortal, + AlertDialogTitle, + AlertDialogTrigger, +}; diff --git a/apps/ui/src/components/ui-default/alert.tsx b/apps/ui/src/components/ui-default/alert.tsx new file mode 100644 index 0000000..55632ed --- /dev/null +++ b/apps/ui/src/components/ui-default/alert.tsx @@ -0,0 +1,60 @@ +import * as React from "react"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ); +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDescription({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +export { Alert, AlertTitle, AlertDescription }; diff --git a/apps/ui/src/components/ui-default/aspect-ratio.tsx b/apps/ui/src/components/ui-default/aspect-ratio.tsx new file mode 100644 index 0000000..b5993d1 --- /dev/null +++ b/apps/ui/src/components/ui-default/aspect-ratio.tsx @@ -0,0 +1,9 @@ +"use client"; + +import { AspectRatio as AspectRatioPrimitive } from "radix-ui"; + +function AspectRatio({ ...props }: React.ComponentProps) { + return ; +} + +export { AspectRatio }; diff --git a/apps/ui/src/components/ui-default/avatar.tsx b/apps/ui/src/components/ui-default/avatar.tsx new file mode 100644 index 0000000..41cde35 --- /dev/null +++ b/apps/ui/src/components/ui-default/avatar.tsx @@ -0,0 +1,94 @@ +import * as React from "react"; +import { Avatar as AvatarPrimitive } from "radix-ui"; + +import { cn } from "@/lib/utils"; + +function Avatar({ + className, + size = "default", + ...props +}: React.ComponentProps & { + size?: "default" | "sm" | "lg"; +}) { + return ( + + ); +} + +function AvatarImage({ className, ...props }: React.ComponentProps) { + return ( + + ); +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) { + return ( + svg]:hidden", + "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", + "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", + className, + )} + {...props} + /> + ); +} + +function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AvatarGroupCount({ className, ...props }: React.ComponentProps<"div">) { + return ( +
svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", + className, + )} + {...props} + /> + ); +} + +export { Avatar, AvatarImage, AvatarFallback, AvatarBadge, AvatarGroup, AvatarGroupCount }; diff --git a/apps/ui/src/components/ui-default/badge.tsx b/apps/ui/src/components/ui-default/badge.tsx new file mode 100644 index 0000000..716e827 --- /dev/null +++ b/apps/ui/src/components/ui-default/badge.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import { cva, type VariantProps } from "class-variance-authority"; +import { Slot } from "radix-ui"; + +import { cn } from "@/lib/utils"; + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + link: "text-primary underline-offset-4 [a&]:hover:underline", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function Badge({ + className, + variant = "default", + asChild = false, + ...props +}: React.ComponentProps<"span"> & VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot.Root : "span"; + + return ( + + ); +} + +export { Badge, badgeVariants }; diff --git a/apps/ui/src/components/ui-default/breadcrumb.tsx b/apps/ui/src/components/ui-default/breadcrumb.tsx new file mode 100644 index 0000000..2b4fa1e --- /dev/null +++ b/apps/ui/src/components/ui-default/breadcrumb.tsx @@ -0,0 +1,102 @@ +import * as React from "react"; +import { ChevronRight, MoreHorizontal } from "lucide-react"; +import { Slot } from "radix-ui"; + +import { cn } from "@/lib/utils"; + +function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { + return