shadcn-ui-react 0.1.2 → 0.2.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/dist/index.cjs CHANGED
@@ -64,6 +64,7 @@ __export(index_exports, {
64
64
  AccordionTrigger: () => AccordionTrigger,
65
65
  Alert: () => Alert,
66
66
  AlertDescription: () => AlertDescription,
67
+ AlertModal: () => AlertModal,
67
68
  AlertTitle: () => AlertTitle,
68
69
  AspectRatio: () => AspectRatio,
69
70
  Avatar: () => Avatar,
@@ -77,6 +78,7 @@ __export(index_exports, {
77
78
  BreadcrumbList: () => BreadcrumbList,
78
79
  BreadcrumbPage: () => BreadcrumbPage,
79
80
  BreadcrumbSeparator: () => BreadcrumbSeparator,
81
+ Breadcrumbs: () => Breadcrumbs,
80
82
  Button: () => Button,
81
83
  Calendar: () => Calendar,
82
84
  Card: () => Card,
@@ -118,6 +120,7 @@ __export(index_exports, {
118
120
  ContextMenuSubContent: () => ContextMenuSubContent,
119
121
  ContextMenuSubTrigger: () => ContextMenuSubTrigger,
120
122
  ContextMenuTrigger: () => ContextMenuTrigger,
123
+ DataTableSkeleton: () => DataTableSkeleton,
121
124
  Dialog: () => Dialog,
122
125
  DialogClose: () => DialogClose,
123
126
  DialogContent: () => DialogContent,
@@ -187,6 +190,7 @@ __export(index_exports, {
187
190
  MenubarSubTrigger: () => MenubarSubTrigger,
188
191
  MenubarTrigger: () => MenubarTrigger,
189
192
  Modal: () => Modal,
193
+ ModeToggle: () => ModeToggle,
190
194
  NavigationMenu: () => NavigationMenu,
191
195
  NavigationMenuContent: () => NavigationMenuContent,
192
196
  NavigationMenuIndicator: () => NavigationMenuIndicator,
@@ -8991,6 +8995,124 @@ function useToast() {
8991
8995
  dismiss: (toastId) => dispatch({ type: "DISMISS_TOAST", toastId })
8992
8996
  });
8993
8997
  }
8998
+
8999
+ // src/shared/alert-modal.tsx
9000
+ var import_jsx_runtime44 = require("react/jsx-runtime");
9001
+ var AlertModal = ({
9002
+ isOpen,
9003
+ onClose,
9004
+ onConfirm,
9005
+ loading,
9006
+ title = "Are you sure?",
9007
+ description = "Are you sure you want to continue?",
9008
+ cancelText = "Cancel",
9009
+ confirmText = "Confirm",
9010
+ className,
9011
+ children
9012
+ }) => {
9013
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
9014
+ Modal,
9015
+ {
9016
+ title,
9017
+ description,
9018
+ isOpen,
9019
+ onClose,
9020
+ className,
9021
+ children: children ? children : /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "flex w-full items-center justify-end space-x-2 pt-6", children: [
9022
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Button, { disabled: loading, variant: "outline", onClick: onClose, children: cancelText }),
9023
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Button, { disabled: loading, variant: "destructive", onClick: onConfirm, children: confirmText })
9024
+ ] })
9025
+ }
9026
+ );
9027
+ };
9028
+
9029
+ // src/shared/breadcrumbs.tsx
9030
+ var import_lucide_react3 = require("lucide-react");
9031
+ var import_react34 = require("react");
9032
+ var import_jsx_runtime45 = require("react/jsx-runtime");
9033
+ function Breadcrumbs({ items, className, classNameList }) {
9034
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Breadcrumb, { className, children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(BreadcrumbList, { className: classNameList, children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_react34.Fragment, { children: [
9035
+ index !== items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(BreadcrumbItem, { className: item.className, children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(BreadcrumbLink, { href: item.link, children: item.title }) }),
9036
+ index < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(BreadcrumbSeparator, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react3.Slash, {}) }),
9037
+ index === items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(BreadcrumbPage, { children: item.title })
9038
+ ] }, item.title)) }) });
9039
+ }
9040
+
9041
+ // src/shared/data-table-skeleton.tsx
9042
+ var import_jsx_runtime46 = require("react/jsx-runtime");
9043
+ function DataTableSkeleton({
9044
+ columnCount,
9045
+ rowCount = 10,
9046
+ searchableColumnCount = 0,
9047
+ filterableColumnCount = 0,
9048
+ showViewOptions = true
9049
+ }) {
9050
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "w-full space-y-3 overflow-auto", children: [
9051
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex w-full items-center justify-between space-x-2 overflow-auto p-1", children: [
9052
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex flex-1 items-center space-x-2 space-y-4", children: [
9053
+ searchableColumnCount > 0 ? Array.from({ length: searchableColumnCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-10 w-[150px] lg:w-[250px]" }, i)) : null,
9054
+ filterableColumnCount > 0 ? Array.from({ length: filterableColumnCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-10 w-[70px] border-dashed" }, i)) : null
9055
+ ] }),
9056
+ showViewOptions ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "ml-auto hidden h-7 w-[70px] lg:flex" }) : null
9057
+ ] }),
9058
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "rounded-md border", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(Table, { children: [
9059
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableHeader, { children: Array.from({ length: 1 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableRow, { className: "hover:bg-transparent", children: Array.from({ length: columnCount }).map((_2, i2) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableHead, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-6 w-full" }) }, i2)) }, i)) }),
9060
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableBody, { children: Array.from({ length: rowCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableRow, { className: "hover:bg-transparent", children: Array.from({ length: columnCount }).map((_2, i2) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-6 w-full" }) }, i2)) }, i)) })
9061
+ ] }) }),
9062
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex w-full flex-col items-center justify-between gap-4 overflow-auto px-2 py-1 sm:flex-row sm:gap-8", children: [
9063
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-8 w-40" }) }),
9064
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex flex-col items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8", children: [
9065
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center space-x-2", children: [
9066
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-8 w-24" }),
9067
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-8 w-[70px]" })
9068
+ ] }),
9069
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex w-[100px] items-center justify-center text-sm font-medium", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-8 w-20" }) }),
9070
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center space-x-2", children: [
9071
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "hidden size-8 lg:block" }),
9072
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "size-8" }),
9073
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "size-8" }),
9074
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "hidden size-8 lg:block" })
9075
+ ] })
9076
+ ] })
9077
+ ] })
9078
+ ] });
9079
+ }
9080
+
9081
+ // src/shared/theme-toggle.tsx
9082
+ var import_lucide_react4 = require("lucide-react");
9083
+
9084
+ // src/providers/theme-provider.tsx
9085
+ var import_react35 = require("react");
9086
+ var import_jsx_runtime47 = require("react/jsx-runtime");
9087
+ var initialState = {
9088
+ theme: "system",
9089
+ setTheme: () => null
9090
+ };
9091
+ var ThemeProviderContext = (0, import_react35.createContext)(initialState);
9092
+ var useTheme2 = () => {
9093
+ const context = (0, import_react35.useContext)(ThemeProviderContext);
9094
+ if (context === void 0)
9095
+ throw new Error("useTheme must be used within a ThemeProvider");
9096
+ return context;
9097
+ };
9098
+
9099
+ // src/shared/theme-toggle.tsx
9100
+ var import_jsx_runtime48 = require("react/jsx-runtime");
9101
+ function ModeToggle() {
9102
+ const { setTheme } = useTheme2();
9103
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(DropdownMenu, { children: [
9104
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(Button, { variant: "outline", size: "icon", children: [
9105
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react4.Sun, { className: "h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" }),
9106
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react4.Moon, { className: "absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" }),
9107
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "sr-only", children: "Toggle theme" })
9108
+ ] }) }),
9109
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(DropdownMenuContent, { align: "end", children: [
9110
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(DropdownMenuItem, { onClick: () => setTheme("light"), children: "Light" }),
9111
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(DropdownMenuItem, { onClick: () => setTheme("dark"), children: "Dark" }),
9112
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(DropdownMenuItem, { onClick: () => setTheme("system"), children: "System" })
9113
+ ] })
9114
+ ] });
9115
+ }
8994
9116
  // Annotate the CommonJS export names for ESM import in node:
8995
9117
  0 && (module.exports = {
8996
9118
  Accordion,
@@ -8999,6 +9121,7 @@ function useToast() {
8999
9121
  AccordionTrigger,
9000
9122
  Alert,
9001
9123
  AlertDescription,
9124
+ AlertModal,
9002
9125
  AlertTitle,
9003
9126
  AspectRatio,
9004
9127
  Avatar,
@@ -9012,6 +9135,7 @@ function useToast() {
9012
9135
  BreadcrumbList,
9013
9136
  BreadcrumbPage,
9014
9137
  BreadcrumbSeparator,
9138
+ Breadcrumbs,
9015
9139
  Button,
9016
9140
  Calendar,
9017
9141
  Card,
@@ -9053,6 +9177,7 @@ function useToast() {
9053
9177
  ContextMenuSubContent,
9054
9178
  ContextMenuSubTrigger,
9055
9179
  ContextMenuTrigger,
9180
+ DataTableSkeleton,
9056
9181
  Dialog,
9057
9182
  DialogClose,
9058
9183
  DialogContent,
@@ -9122,6 +9247,7 @@ function useToast() {
9122
9247
  MenubarSubTrigger,
9123
9248
  MenubarTrigger,
9124
9249
  Modal,
9250
+ ModeToggle,
9125
9251
  NavigationMenu,
9126
9252
  NavigationMenuContent,
9127
9253
  NavigationMenuIndicator,
package/dist/index.d.cts CHANGED
@@ -649,6 +649,54 @@ declare function useToast(): {
649
649
  toasts: ToasterToast[];
650
650
  };
651
651
 
652
+ type TAlertModalProps = {
653
+ isOpen: boolean;
654
+ onClose: () => void;
655
+ onConfirm: () => void;
656
+ loading: boolean;
657
+ title?: string;
658
+ description?: string;
659
+ className?: string;
660
+ cancelText?: string;
661
+ confirmText?: string;
662
+ children?: React.ReactNode;
663
+ };
664
+ declare const AlertModal: ({ isOpen, onClose, onConfirm, loading, title, description, cancelText, confirmText, className, children, }: TAlertModalProps) => react_jsx_runtime.JSX.Element;
665
+
666
+ type BreadcrumbItemProps = {
667
+ title: string;
668
+ link: string;
669
+ className?: string;
670
+ };
671
+ type BreadcrumbsProps = {
672
+ items: BreadcrumbItemProps[];
673
+ className?: string;
674
+ classNameList?: string;
675
+ separator?: React.ReactNode;
676
+ };
677
+ declare function Breadcrumbs({ items, className, classNameList }: BreadcrumbsProps): react_jsx_runtime.JSX.Element;
678
+
679
+ interface NavItem {
680
+ title: string;
681
+ href: string;
682
+ disabled?: boolean;
683
+ external?: boolean;
684
+ icon?: keyof typeof Icons;
685
+ label?: string;
686
+ description?: string;
687
+ }
688
+
689
+ type DataTableSkeletonProps = {
690
+ columnCount: number;
691
+ rowCount?: number;
692
+ searchableColumnCount?: number;
693
+ filterableColumnCount?: number;
694
+ showViewOptions?: boolean;
695
+ };
696
+ declare function DataTableSkeleton({ columnCount, rowCount, searchableColumnCount, filterableColumnCount, showViewOptions }: DataTableSkeletonProps): react_jsx_runtime.JSX.Element;
697
+
698
+ declare function ModeToggle(): react_jsx_runtime.JSX.Element;
699
+
652
700
  declare function cn(...inputs: ClassValue[]): string;
653
701
 
654
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, Icons, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationNextLast, PaginationPrevious, PaginationPreviousLast, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Slider, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastDescription, type ToastProps, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, cn, navigationMenuTriggerStyle, reducer, toast, toggleVariants, useFormField, useToast };
702
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertModal, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Breadcrumbs, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataTableSkeleton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, Icons, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, ModeToggle, type NavItem, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationNextLast, PaginationPrevious, PaginationPreviousLast, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Slider, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastDescription, type ToastProps, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, cn, navigationMenuTriggerStyle, reducer, toast, toggleVariants, useFormField, useToast };
package/dist/index.d.ts CHANGED
@@ -649,6 +649,54 @@ declare function useToast(): {
649
649
  toasts: ToasterToast[];
650
650
  };
651
651
 
652
+ type TAlertModalProps = {
653
+ isOpen: boolean;
654
+ onClose: () => void;
655
+ onConfirm: () => void;
656
+ loading: boolean;
657
+ title?: string;
658
+ description?: string;
659
+ className?: string;
660
+ cancelText?: string;
661
+ confirmText?: string;
662
+ children?: React.ReactNode;
663
+ };
664
+ declare const AlertModal: ({ isOpen, onClose, onConfirm, loading, title, description, cancelText, confirmText, className, children, }: TAlertModalProps) => react_jsx_runtime.JSX.Element;
665
+
666
+ type BreadcrumbItemProps = {
667
+ title: string;
668
+ link: string;
669
+ className?: string;
670
+ };
671
+ type BreadcrumbsProps = {
672
+ items: BreadcrumbItemProps[];
673
+ className?: string;
674
+ classNameList?: string;
675
+ separator?: React.ReactNode;
676
+ };
677
+ declare function Breadcrumbs({ items, className, classNameList }: BreadcrumbsProps): react_jsx_runtime.JSX.Element;
678
+
679
+ interface NavItem {
680
+ title: string;
681
+ href: string;
682
+ disabled?: boolean;
683
+ external?: boolean;
684
+ icon?: keyof typeof Icons;
685
+ label?: string;
686
+ description?: string;
687
+ }
688
+
689
+ type DataTableSkeletonProps = {
690
+ columnCount: number;
691
+ rowCount?: number;
692
+ searchableColumnCount?: number;
693
+ filterableColumnCount?: number;
694
+ showViewOptions?: boolean;
695
+ };
696
+ declare function DataTableSkeleton({ columnCount, rowCount, searchableColumnCount, filterableColumnCount, showViewOptions }: DataTableSkeletonProps): react_jsx_runtime.JSX.Element;
697
+
698
+ declare function ModeToggle(): react_jsx_runtime.JSX.Element;
699
+
652
700
  declare function cn(...inputs: ClassValue[]): string;
653
701
 
654
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, Icons, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationNextLast, PaginationPrevious, PaginationPreviousLast, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Slider, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastDescription, type ToastProps, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, cn, navigationMenuTriggerStyle, reducer, toast, toggleVariants, useFormField, useToast };
702
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertModal, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Breadcrumbs, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataTableSkeleton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, Icons, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, ModeToggle, type NavItem, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationNextLast, PaginationPrevious, PaginationPreviousLast, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Slider, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastDescription, type ToastProps, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, cn, navigationMenuTriggerStyle, reducer, toast, toggleVariants, useFormField, useToast };
package/dist/index.js CHANGED
@@ -8794,6 +8794,124 @@ function useToast() {
8794
8794
  dismiss: (toastId) => dispatch({ type: "DISMISS_TOAST", toastId })
8795
8795
  });
8796
8796
  }
8797
+
8798
+ // src/shared/alert-modal.tsx
8799
+ import { jsx as jsx44, jsxs as jsxs18 } from "react/jsx-runtime";
8800
+ var AlertModal = ({
8801
+ isOpen,
8802
+ onClose,
8803
+ onConfirm,
8804
+ loading,
8805
+ title = "Are you sure?",
8806
+ description = "Are you sure you want to continue?",
8807
+ cancelText = "Cancel",
8808
+ confirmText = "Confirm",
8809
+ className,
8810
+ children
8811
+ }) => {
8812
+ return /* @__PURE__ */ jsx44(
8813
+ Modal,
8814
+ {
8815
+ title,
8816
+ description,
8817
+ isOpen,
8818
+ onClose,
8819
+ className,
8820
+ children: children ? children : /* @__PURE__ */ jsxs18("div", { className: "flex w-full items-center justify-end space-x-2 pt-6", children: [
8821
+ /* @__PURE__ */ jsx44(Button, { disabled: loading, variant: "outline", onClick: onClose, children: cancelText }),
8822
+ /* @__PURE__ */ jsx44(Button, { disabled: loading, variant: "destructive", onClick: onConfirm, children: confirmText })
8823
+ ] })
8824
+ }
8825
+ );
8826
+ };
8827
+
8828
+ // src/shared/breadcrumbs.tsx
8829
+ import { Slash } from "lucide-react";
8830
+ import { Fragment } from "react";
8831
+ import { jsx as jsx45, jsxs as jsxs19 } from "react/jsx-runtime";
8832
+ function Breadcrumbs({ items, className, classNameList }) {
8833
+ return /* @__PURE__ */ jsx45(Breadcrumb, { className, children: /* @__PURE__ */ jsx45(BreadcrumbList, { className: classNameList, children: items.map((item, index) => /* @__PURE__ */ jsxs19(Fragment, { children: [
8834
+ index !== items.length - 1 && /* @__PURE__ */ jsx45(BreadcrumbItem, { className: item.className, children: /* @__PURE__ */ jsx45(BreadcrumbLink, { href: item.link, children: item.title }) }),
8835
+ index < items.length - 1 && /* @__PURE__ */ jsx45(BreadcrumbSeparator, { children: /* @__PURE__ */ jsx45(Slash, {}) }),
8836
+ index === items.length - 1 && /* @__PURE__ */ jsx45(BreadcrumbPage, { children: item.title })
8837
+ ] }, item.title)) }) });
8838
+ }
8839
+
8840
+ // src/shared/data-table-skeleton.tsx
8841
+ import { jsx as jsx46, jsxs as jsxs20 } from "react/jsx-runtime";
8842
+ function DataTableSkeleton({
8843
+ columnCount,
8844
+ rowCount = 10,
8845
+ searchableColumnCount = 0,
8846
+ filterableColumnCount = 0,
8847
+ showViewOptions = true
8848
+ }) {
8849
+ return /* @__PURE__ */ jsxs20("div", { className: "w-full space-y-3 overflow-auto", children: [
8850
+ /* @__PURE__ */ jsxs20("div", { className: "flex w-full items-center justify-between space-x-2 overflow-auto p-1", children: [
8851
+ /* @__PURE__ */ jsxs20("div", { className: "flex flex-1 items-center space-x-2 space-y-4", children: [
8852
+ searchableColumnCount > 0 ? Array.from({ length: searchableColumnCount }).map((_, i) => /* @__PURE__ */ jsx46(Skeleton, { className: "h-10 w-[150px] lg:w-[250px]" }, i)) : null,
8853
+ filterableColumnCount > 0 ? Array.from({ length: filterableColumnCount }).map((_, i) => /* @__PURE__ */ jsx46(Skeleton, { className: "h-10 w-[70px] border-dashed" }, i)) : null
8854
+ ] }),
8855
+ showViewOptions ? /* @__PURE__ */ jsx46(Skeleton, { className: "ml-auto hidden h-7 w-[70px] lg:flex" }) : null
8856
+ ] }),
8857
+ /* @__PURE__ */ jsx46("div", { className: "rounded-md border", children: /* @__PURE__ */ jsxs20(Table, { children: [
8858
+ /* @__PURE__ */ jsx46(TableHeader, { children: Array.from({ length: 1 }).map((_, i) => /* @__PURE__ */ jsx46(TableRow, { className: "hover:bg-transparent", children: Array.from({ length: columnCount }).map((_2, i2) => /* @__PURE__ */ jsx46(TableHead, { children: /* @__PURE__ */ jsx46(Skeleton, { className: "h-6 w-full" }) }, i2)) }, i)) }),
8859
+ /* @__PURE__ */ jsx46(TableBody, { children: Array.from({ length: rowCount }).map((_, i) => /* @__PURE__ */ jsx46(TableRow, { className: "hover:bg-transparent", children: Array.from({ length: columnCount }).map((_2, i2) => /* @__PURE__ */ jsx46(TableCell, { children: /* @__PURE__ */ jsx46(Skeleton, { className: "h-6 w-full" }) }, i2)) }, i)) })
8860
+ ] }) }),
8861
+ /* @__PURE__ */ jsxs20("div", { className: "flex w-full flex-col items-center justify-between gap-4 overflow-auto px-2 py-1 sm:flex-row sm:gap-8", children: [
8862
+ /* @__PURE__ */ jsx46("div", { className: "flex-1", children: /* @__PURE__ */ jsx46(Skeleton, { className: "h-8 w-40" }) }),
8863
+ /* @__PURE__ */ jsxs20("div", { className: "flex flex-col items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8", children: [
8864
+ /* @__PURE__ */ jsxs20("div", { className: "flex items-center space-x-2", children: [
8865
+ /* @__PURE__ */ jsx46(Skeleton, { className: "h-8 w-24" }),
8866
+ /* @__PURE__ */ jsx46(Skeleton, { className: "h-8 w-[70px]" })
8867
+ ] }),
8868
+ /* @__PURE__ */ jsx46("div", { className: "flex w-[100px] items-center justify-center text-sm font-medium", children: /* @__PURE__ */ jsx46(Skeleton, { className: "h-8 w-20" }) }),
8869
+ /* @__PURE__ */ jsxs20("div", { className: "flex items-center space-x-2", children: [
8870
+ /* @__PURE__ */ jsx46(Skeleton, { className: "hidden size-8 lg:block" }),
8871
+ /* @__PURE__ */ jsx46(Skeleton, { className: "size-8" }),
8872
+ /* @__PURE__ */ jsx46(Skeleton, { className: "size-8" }),
8873
+ /* @__PURE__ */ jsx46(Skeleton, { className: "hidden size-8 lg:block" })
8874
+ ] })
8875
+ ] })
8876
+ ] })
8877
+ ] });
8878
+ }
8879
+
8880
+ // src/shared/theme-toggle.tsx
8881
+ import { Moon as Moon2, Sun } from "lucide-react";
8882
+
8883
+ // src/providers/theme-provider.tsx
8884
+ import { createContext as createContext5, useContext as useContext6, useEffect as useEffect5, useState as useState5 } from "react";
8885
+ import { jsx as jsx47 } from "react/jsx-runtime";
8886
+ var initialState = {
8887
+ theme: "system",
8888
+ setTheme: () => null
8889
+ };
8890
+ var ThemeProviderContext = createContext5(initialState);
8891
+ var useTheme2 = () => {
8892
+ const context = useContext6(ThemeProviderContext);
8893
+ if (context === void 0)
8894
+ throw new Error("useTheme must be used within a ThemeProvider");
8895
+ return context;
8896
+ };
8897
+
8898
+ // src/shared/theme-toggle.tsx
8899
+ import { jsx as jsx48, jsxs as jsxs21 } from "react/jsx-runtime";
8900
+ function ModeToggle() {
8901
+ const { setTheme } = useTheme2();
8902
+ return /* @__PURE__ */ jsxs21(DropdownMenu, { children: [
8903
+ /* @__PURE__ */ jsx48(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs21(Button, { variant: "outline", size: "icon", children: [
8904
+ /* @__PURE__ */ jsx48(Sun, { className: "h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" }),
8905
+ /* @__PURE__ */ jsx48(Moon2, { className: "absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" }),
8906
+ /* @__PURE__ */ jsx48("span", { className: "sr-only", children: "Toggle theme" })
8907
+ ] }) }),
8908
+ /* @__PURE__ */ jsxs21(DropdownMenuContent, { align: "end", children: [
8909
+ /* @__PURE__ */ jsx48(DropdownMenuItem, { onClick: () => setTheme("light"), children: "Light" }),
8910
+ /* @__PURE__ */ jsx48(DropdownMenuItem, { onClick: () => setTheme("dark"), children: "Dark" }),
8911
+ /* @__PURE__ */ jsx48(DropdownMenuItem, { onClick: () => setTheme("system"), children: "System" })
8912
+ ] })
8913
+ ] });
8914
+ }
8797
8915
  export {
8798
8916
  Accordion,
8799
8917
  AccordionContent,
@@ -8801,6 +8919,7 @@ export {
8801
8919
  AccordionTrigger,
8802
8920
  Alert,
8803
8921
  AlertDescription,
8922
+ AlertModal,
8804
8923
  AlertTitle,
8805
8924
  AspectRatio,
8806
8925
  Avatar,
@@ -8814,6 +8933,7 @@ export {
8814
8933
  BreadcrumbList,
8815
8934
  BreadcrumbPage,
8816
8935
  BreadcrumbSeparator,
8936
+ Breadcrumbs,
8817
8937
  Button,
8818
8938
  Calendar,
8819
8939
  Card,
@@ -8855,6 +8975,7 @@ export {
8855
8975
  ContextMenuSubContent,
8856
8976
  ContextMenuSubTrigger,
8857
8977
  ContextMenuTrigger,
8978
+ DataTableSkeleton,
8858
8979
  Dialog,
8859
8980
  DialogClose,
8860
8981
  DialogContent,
@@ -8924,6 +9045,7 @@ export {
8924
9045
  MenubarSubTrigger,
8925
9046
  MenubarTrigger,
8926
9047
  Modal,
9048
+ ModeToggle,
8927
9049
  NavigationMenu,
8928
9050
  NavigationMenuContent,
8929
9051
  NavigationMenuIndicator,
package/dist/style.css CHANGED
@@ -24,7 +24,11 @@
24
24
  --color-red-300: oklch(0.808 0.114 19.571);
25
25
  --color-red-400: oklch(0.704 0.191 22.216);
26
26
  --color-red-600: oklch(0.577 0.245 27.325);
27
+ --color-gray-100: oklch(0.967 0.003 264.542);
28
+ --color-gray-200: oklch(0.928 0.006 264.531);
29
+ --color-gray-300: oklch(0.872 0.01 258.338);
27
30
  --color-black: #000;
31
+ --color-white: #fff;
28
32
  --spacing: 0.25rem;
29
33
  --container-sm: 24rem;
30
34
  --container-lg: 32rem;
@@ -34,9 +38,16 @@
34
38
  --text-sm--line-height: calc(1.25 / 0.875);
35
39
  --text-lg: 1.125rem;
36
40
  --text-lg--line-height: calc(1.75 / 1.125);
41
+ --text-xl: 1.25rem;
42
+ --text-xl--line-height: calc(1.75 / 1.25);
43
+ --text-2xl: 1.5rem;
44
+ --text-2xl--line-height: calc(2 / 1.5);
45
+ --text-3xl: 1.875rem;
46
+ --text-3xl--line-height: calc(2.25 / 1.875);
37
47
  --font-weight-normal: 400;
38
48
  --font-weight-medium: 500;
39
49
  --font-weight-semibold: 600;
50
+ --font-weight-bold: 700;
40
51
  --tracking-tight: -0.025em;
41
52
  --tracking-widest: 0.1em;
42
53
  --leading-relaxed: 1.625;
@@ -324,6 +335,9 @@
324
335
  .right-4 {
325
336
  right: calc(var(--spacing) * 4);
326
337
  }
338
+ .-bottom-5 {
339
+ bottom: calc(var(--spacing) * -5);
340
+ }
327
341
  .-bottom-12 {
328
342
  bottom: calc(var(--spacing) * -12);
329
343
  }
@@ -396,6 +410,9 @@
396
410
  .mt-2 {
397
411
  margin-top: calc(var(--spacing) * 2);
398
412
  }
413
+ .mt-3 {
414
+ margin-top: calc(var(--spacing) * 3);
415
+ }
399
416
  .mt-4 {
400
417
  margin-top: calc(var(--spacing) * 4);
401
418
  }
@@ -417,6 +434,12 @@
417
434
  .ml-1 {
418
435
  margin-left: calc(var(--spacing) * 1);
419
436
  }
437
+ .ml-2\.5 {
438
+ margin-left: calc(var(--spacing) * 2.5);
439
+ }
440
+ .ml-4 {
441
+ margin-left: calc(var(--spacing) * 4);
442
+ }
420
443
  .ml-auto {
421
444
  margin-left: auto;
422
445
  }
@@ -429,6 +452,12 @@
429
452
  .grid {
430
453
  display: grid;
431
454
  }
455
+ .hidden {
456
+ display: none;
457
+ }
458
+ .inline-block {
459
+ display: inline-block;
460
+ }
432
461
  .inline-flex {
433
462
  display: inline-flex;
434
463
  }
@@ -438,6 +467,14 @@
438
467
  .aspect-square {
439
468
  aspect-ratio: 1 / 1;
440
469
  }
470
+ .size-5 {
471
+ width: calc(var(--spacing) * 5);
472
+ height: calc(var(--spacing) * 5);
473
+ }
474
+ .size-8 {
475
+ width: calc(var(--spacing) * 8);
476
+ height: calc(var(--spacing) * 8);
477
+ }
441
478
  .h-1\.5 {
442
479
  height: calc(var(--spacing) * 1.5);
443
480
  }
@@ -459,6 +496,9 @@
459
496
  .h-5 {
460
497
  height: calc(var(--spacing) * 5);
461
498
  }
499
+ .h-6 {
500
+ height: calc(var(--spacing) * 6);
501
+ }
462
502
  .h-7 {
463
503
  height: calc(var(--spacing) * 7);
464
504
  }
@@ -471,9 +511,24 @@
471
511
  .h-10 {
472
512
  height: calc(var(--spacing) * 10);
473
513
  }
514
+ .h-14 {
515
+ height: calc(var(--spacing) * 14);
516
+ }
517
+ .h-24 {
518
+ height: calc(var(--spacing) * 24);
519
+ }
520
+ .h-36 {
521
+ height: calc(var(--spacing) * 36);
522
+ }
523
+ .h-\[1\.2rem\] {
524
+ height: 1.2rem;
525
+ }
474
526
  .h-\[1px\] {
475
527
  height: 1px;
476
528
  }
529
+ .h-\[calc\(80vh-220px\)\] {
530
+ height: calc(80vh - 220px);
531
+ }
477
532
  .h-\[var\(--radix-navigation-menu-viewport-height\)\] {
478
533
  height: var(--radix-navigation-menu-viewport-height);
479
534
  }
@@ -489,6 +544,9 @@
489
544
  .h-px {
490
545
  height: 1px;
491
546
  }
547
+ .h-screen {
548
+ height: 100vh;
549
+ }
492
550
  .max-h-96 {
493
551
  max-height: calc(var(--spacing) * 96);
494
552
  }
@@ -531,18 +589,48 @@
531
589
  .w-10 {
532
590
  width: calc(var(--spacing) * 10);
533
591
  }
592
+ .w-14 {
593
+ width: calc(var(--spacing) * 14);
594
+ }
595
+ .w-20 {
596
+ width: calc(var(--spacing) * 20);
597
+ }
598
+ .w-24 {
599
+ width: calc(var(--spacing) * 24);
600
+ }
601
+ .w-36 {
602
+ width: calc(var(--spacing) * 36);
603
+ }
604
+ .w-40 {
605
+ width: calc(var(--spacing) * 40);
606
+ }
607
+ .w-56 {
608
+ width: calc(var(--spacing) * 56);
609
+ }
534
610
  .w-64 {
535
611
  width: calc(var(--spacing) * 64);
536
612
  }
537
613
  .w-72 {
538
614
  width: calc(var(--spacing) * 72);
539
615
  }
616
+ .w-\[1\.2rem\] {
617
+ width: 1.2rem;
618
+ }
540
619
  .w-\[1px\] {
541
620
  width: 1px;
542
621
  }
622
+ .w-\[70px\] {
623
+ width: 70px;
624
+ }
625
+ .w-\[80px\] {
626
+ width: 80px;
627
+ }
543
628
  .w-\[100px\] {
544
629
  width: 100px;
545
630
  }
631
+ .w-\[150px\] {
632
+ width: 150px;
633
+ }
546
634
  .w-full {
547
635
  width: 100%;
548
636
  }
@@ -575,6 +663,9 @@
575
663
  .flex-1 {
576
664
  flex: 1;
577
665
  }
666
+ .flex-none {
667
+ flex: none;
668
+ }
578
669
  .shrink-0 {
579
670
  flex-shrink: 0;
580
671
  }
@@ -609,12 +700,30 @@
609
700
  --tw-translate-y: -50%;
610
701
  translate: var(--tw-translate-x) var(--tw-translate-y);
611
702
  }
703
+ .scale-0 {
704
+ --tw-scale-x: 0%;
705
+ --tw-scale-y: 0%;
706
+ --tw-scale-z: 0%;
707
+ scale: var(--tw-scale-x) var(--tw-scale-y);
708
+ }
709
+ .scale-100 {
710
+ --tw-scale-x: 100%;
711
+ --tw-scale-y: 100%;
712
+ --tw-scale-z: 100%;
713
+ scale: var(--tw-scale-x) var(--tw-scale-y);
714
+ }
715
+ .rotate-0 {
716
+ rotate: 0deg;
717
+ }
612
718
  .rotate-45 {
613
719
  rotate: 45deg;
614
720
  }
615
721
  .rotate-90 {
616
722
  rotate: 90deg;
617
723
  }
724
+ .rotate-180 {
725
+ rotate: 180deg;
726
+ }
618
727
  .transform {
619
728
  transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y);
620
729
  }
@@ -624,6 +733,9 @@
624
733
  .cursor-default {
625
734
  cursor: default;
626
735
  }
736
+ .cursor-not-allowed {
737
+ cursor: not-allowed;
738
+ }
627
739
  .cursor-pointer {
628
740
  cursor: pointer;
629
741
  }
@@ -651,12 +763,18 @@
651
763
  .items-end {
652
764
  align-items: flex-end;
653
765
  }
766
+ .items-start {
767
+ align-items: flex-start;
768
+ }
654
769
  .justify-between {
655
770
  justify-content: space-between;
656
771
  }
657
772
  .justify-center {
658
773
  justify-content: center;
659
774
  }
775
+ .justify-end {
776
+ justify-content: flex-end;
777
+ }
660
778
  .gap-1 {
661
779
  gap: calc(var(--spacing) * 1);
662
780
  }
@@ -690,6 +808,13 @@
690
808
  margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
691
809
  }
692
810
  }
811
+ .space-y-3 {
812
+ :where(& > :not(:last-child)) {
813
+ --tw-space-y-reverse: 0;
814
+ margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));
815
+ margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));
816
+ }
817
+ }
693
818
  .space-y-4 {
694
819
  :where(& > :not(:last-child)) {
695
820
  --tw-space-y-reverse: 0;
@@ -711,6 +836,11 @@
711
836
  margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)));
712
837
  }
713
838
  }
839
+ .truncate {
840
+ overflow: hidden;
841
+ text-overflow: ellipsis;
842
+ white-space: nowrap;
843
+ }
714
844
  .overflow-auto {
715
845
  overflow: auto;
716
846
  }
@@ -776,6 +906,10 @@
776
906
  border-left-style: var(--tw-border-style);
777
907
  border-left-width: 1px;
778
908
  }
909
+ .border-dashed {
910
+ --tw-border-style: dashed;
911
+ border-style: dashed;
912
+ }
779
913
  .border-destructive {
780
914
  border-color: var(--destructive);
781
915
  }
@@ -821,6 +955,12 @@
821
955
  .bg-foreground {
822
956
  background-color: var(--foreground);
823
957
  }
958
+ .bg-gray-200 {
959
+ background-color: var(--color-gray-200);
960
+ }
961
+ .bg-gray-300 {
962
+ background-color: var(--color-gray-300);
963
+ }
824
964
  .bg-muted {
825
965
  background-color: var(--muted);
826
966
  }
@@ -845,12 +985,19 @@
845
985
  .bg-transparent {
846
986
  background-color: transparent;
847
987
  }
988
+ .bg-white {
989
+ background-color: var(--color-white);
990
+ }
848
991
  .fill-current {
849
992
  fill: currentColor;
850
993
  }
851
994
  .fill-primary {
852
995
  fill: var(--primary);
853
996
  }
997
+ .object-cover {
998
+ -o-object-fit: cover;
999
+ object-fit: cover;
1000
+ }
854
1001
  .p-0 {
855
1002
  padding: calc(var(--spacing) * 0);
856
1003
  }
@@ -872,6 +1019,12 @@
872
1019
  .p-\[1px\] {
873
1020
  padding: 1px;
874
1021
  }
1022
+ .\!px-0 {
1023
+ padding-inline: calc(var(--spacing) * 0) !important;
1024
+ }
1025
+ .px-0 {
1026
+ padding-inline: calc(var(--spacing) * 0);
1027
+ }
875
1028
  .px-2 {
876
1029
  padding-inline: calc(var(--spacing) * 2);
877
1030
  }
@@ -905,6 +1058,9 @@
905
1058
  .py-4 {
906
1059
  padding-block: calc(var(--spacing) * 4);
907
1060
  }
1061
+ .py-5 {
1062
+ padding-block: calc(var(--spacing) * 5);
1063
+ }
908
1064
  .py-6 {
909
1065
  padding-block: calc(var(--spacing) * 6);
910
1066
  }
@@ -917,6 +1073,9 @@
917
1073
  .pt-4 {
918
1074
  padding-top: calc(var(--spacing) * 4);
919
1075
  }
1076
+ .pt-6 {
1077
+ padding-top: calc(var(--spacing) * 6);
1078
+ }
920
1079
  .pr-2 {
921
1080
  padding-right: calc(var(--spacing) * 2);
922
1081
  }
@@ -953,6 +1112,10 @@
953
1112
  .align-middle {
954
1113
  vertical-align: middle;
955
1114
  }
1115
+ .text-2xl {
1116
+ font-size: var(--text-2xl);
1117
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
1118
+ }
956
1119
  .text-lg {
957
1120
  font-size: var(--text-lg);
958
1121
  line-height: var(--tw-leading, var(--text-lg--line-height));
@@ -961,6 +1124,10 @@
961
1124
  font-size: var(--text-sm);
962
1125
  line-height: var(--tw-leading, var(--text-sm--line-height));
963
1126
  }
1127
+ .text-xl {
1128
+ font-size: var(--text-xl);
1129
+ line-height: var(--tw-leading, var(--text-xl--line-height));
1130
+ }
964
1131
  .text-xs {
965
1132
  font-size: var(--text-xs);
966
1133
  line-height: var(--tw-leading, var(--text-xs--line-height));
@@ -972,6 +1139,10 @@
972
1139
  --tw-leading: 1;
973
1140
  line-height: 1;
974
1141
  }
1142
+ .font-bold {
1143
+ --tw-font-weight: var(--font-weight-bold);
1144
+ font-weight: var(--font-weight-bold);
1145
+ }
975
1146
  .font-medium {
976
1147
  --tw-font-weight: var(--font-weight-medium);
977
1148
  font-weight: var(--font-weight-medium);
@@ -1001,6 +1172,9 @@
1001
1172
  .text-accent-foreground {
1002
1173
  color: var(--accent-foreground);
1003
1174
  }
1175
+ .text-black {
1176
+ color: var(--color-black);
1177
+ }
1004
1178
  .text-card-foreground {
1005
1179
  color: var(--card-foreground);
1006
1180
  }
@@ -1019,6 +1193,9 @@
1019
1193
  .text-foreground\/50 {
1020
1194
  color: color-mix(in oklab, var(--foreground) 50%, transparent);
1021
1195
  }
1196
+ .text-gray-100 {
1197
+ color: var(--color-gray-100);
1198
+ }
1022
1199
  .text-muted-foreground {
1023
1200
  color: var(--muted-foreground);
1024
1201
  }
@@ -1034,6 +1211,9 @@
1034
1211
  .text-secondary-foreground {
1035
1212
  color: var(--secondary-foreground);
1036
1213
  }
1214
+ .text-white {
1215
+ color: var(--color-white);
1216
+ }
1037
1217
  .underline-offset-4 {
1038
1218
  text-underline-offset: 4px;
1039
1219
  }
@@ -1049,6 +1229,9 @@
1049
1229
  .opacity-70 {
1050
1230
  opacity: 70%;
1051
1231
  }
1232
+ .opacity-80 {
1233
+ opacity: 80%;
1234
+ }
1052
1235
  .opacity-90 {
1053
1236
  opacity: 90%;
1054
1237
  }
@@ -1061,6 +1244,15 @@
1061
1244
  var(--tw-ring-shadow),
1062
1245
  var(--tw-shadow);
1063
1246
  }
1247
+ .shadow-2xl {
1248
+ --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
1249
+ box-shadow:
1250
+ var(--tw-inset-shadow),
1251
+ var(--tw-inset-ring-shadow),
1252
+ var(--tw-ring-offset-shadow),
1253
+ var(--tw-ring-shadow),
1254
+ var(--tw-shadow);
1255
+ }
1064
1256
  .shadow-lg {
1065
1257
  --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
1066
1258
  box-shadow:
@@ -1185,6 +1377,10 @@
1185
1377
  --tw-duration: 300ms;
1186
1378
  transition-duration: 300ms;
1187
1379
  }
1380
+ .duration-500 {
1381
+ --tw-duration: 500ms;
1382
+ transition-duration: 500ms;
1383
+ }
1188
1384
  .duration-1000 {
1189
1385
  --tw-duration: 1000ms;
1190
1386
  transition-duration: 1000ms;
@@ -1221,6 +1417,9 @@
1221
1417
  .duration-300 {
1222
1418
  animation-duration: 300ms;
1223
1419
  }
1420
+ .duration-500 {
1421
+ animation-duration: 500ms;
1422
+ }
1224
1423
  .duration-1000 {
1225
1424
  animation-duration: 1000ms;
1226
1425
  }
@@ -1474,6 +1673,13 @@
1474
1673
  }
1475
1674
  }
1476
1675
  }
1676
+ .hover\:bg-transparent {
1677
+ &:hover {
1678
+ @media (hover: hover) {
1679
+ background-color: transparent;
1680
+ }
1681
+ }
1682
+ }
1477
1683
  .hover\:text-accent-foreground {
1478
1684
  &:hover {
1479
1685
  @media (hover: hover) {
@@ -1481,6 +1687,13 @@
1481
1687
  }
1482
1688
  }
1483
1689
  }
1690
+ .hover\:text-black {
1691
+ &:hover {
1692
+ @media (hover: hover) {
1693
+ color: var(--color-black);
1694
+ }
1695
+ }
1696
+ }
1484
1697
  .hover\:text-foreground {
1485
1698
  &:hover {
1486
1699
  @media (hover: hover) {
@@ -2248,6 +2461,16 @@
2248
2461
  gap: calc(var(--spacing) * 2.5);
2249
2462
  }
2250
2463
  }
2464
+ .sm\:gap-6 {
2465
+ @media (width >= 40rem) {
2466
+ gap: calc(var(--spacing) * 6);
2467
+ }
2468
+ }
2469
+ .sm\:gap-8 {
2470
+ @media (width >= 40rem) {
2471
+ gap: calc(var(--spacing) * 8);
2472
+ }
2473
+ }
2251
2474
  .sm\:space-y-0 {
2252
2475
  @media (width >= 40rem) {
2253
2476
  :where(& > :not(:last-child)) {
@@ -2285,6 +2508,12 @@
2285
2508
  text-align: left;
2286
2509
  }
2287
2510
  }
2511
+ .sm\:text-3xl {
2512
+ @media (width >= 40rem) {
2513
+ font-size: var(--text-3xl);
2514
+ line-height: var(--tw-leading, var(--text-3xl--line-height));
2515
+ }
2516
+ }
2288
2517
  .data-\[state\=open\]\:sm\:slide-in-from-bottom-full {
2289
2518
  &[data-state=open] {
2290
2519
  @media (width >= 40rem) {
@@ -2297,6 +2526,21 @@
2297
2526
  position: absolute;
2298
2527
  }
2299
2528
  }
2529
+ .md\:ml-6 {
2530
+ @media (width >= 48rem) {
2531
+ margin-left: calc(var(--spacing) * 6);
2532
+ }
2533
+ }
2534
+ .md\:block {
2535
+ @media (width >= 48rem) {
2536
+ display: block;
2537
+ }
2538
+ }
2539
+ .md\:h-\[calc\(80dvh-80px\)\] {
2540
+ @media (width >= 48rem) {
2541
+ height: calc(80dvh - 80px);
2542
+ }
2543
+ }
2300
2544
  .md\:w-\[var\(--radix-navigation-menu-viewport-width\)\] {
2301
2545
  @media (width >= 48rem) {
2302
2546
  width: var(--radix-navigation-menu-viewport-width);
@@ -2312,6 +2556,62 @@
2312
2556
  max-width: 420px;
2313
2557
  }
2314
2558
  }
2559
+ .md\:max-w-sm {
2560
+ @media (width >= 48rem) {
2561
+ max-width: var(--container-sm);
2562
+ }
2563
+ }
2564
+ .md\:px-2 {
2565
+ @media (width >= 48rem) {
2566
+ padding-inline: calc(var(--spacing) * 2);
2567
+ }
2568
+ }
2569
+ .lg\:block {
2570
+ @media (width >= 64rem) {
2571
+ display: block;
2572
+ }
2573
+ }
2574
+ .lg\:flex {
2575
+ @media (width >= 64rem) {
2576
+ display: flex;
2577
+ }
2578
+ }
2579
+ .lg\:w-\[250px\] {
2580
+ @media (width >= 64rem) {
2581
+ width: 250px;
2582
+ }
2583
+ }
2584
+ .lg\:gap-8 {
2585
+ @media (width >= 64rem) {
2586
+ gap: calc(var(--spacing) * 8);
2587
+ }
2588
+ }
2589
+ .dark\:scale-0 {
2590
+ &:is(.dark *) {
2591
+ --tw-scale-x: 0%;
2592
+ --tw-scale-y: 0%;
2593
+ --tw-scale-z: 0%;
2594
+ scale: var(--tw-scale-x) var(--tw-scale-y);
2595
+ }
2596
+ }
2597
+ .dark\:scale-100 {
2598
+ &:is(.dark *) {
2599
+ --tw-scale-x: 100%;
2600
+ --tw-scale-y: 100%;
2601
+ --tw-scale-z: 100%;
2602
+ scale: var(--tw-scale-x) var(--tw-scale-y);
2603
+ }
2604
+ }
2605
+ .dark\:-rotate-90 {
2606
+ &:is(.dark *) {
2607
+ rotate: calc(90deg * -1);
2608
+ }
2609
+ }
2610
+ .dark\:rotate-0 {
2611
+ &:is(.dark *) {
2612
+ rotate: 0deg;
2613
+ }
2614
+ }
2315
2615
  .dark\:border-destructive {
2316
2616
  &:is(.dark *) {
2317
2617
  border-color: var(--destructive);
@@ -2636,6 +2936,9 @@
2636
2936
  @property --tw-translate-x { syntax: "*"; inherits: false; initial-value: 0; }
2637
2937
  @property --tw-translate-y { syntax: "*"; inherits: false; initial-value: 0; }
2638
2938
  @property --tw-translate-z { syntax: "*"; inherits: false; initial-value: 0; }
2939
+ @property --tw-scale-x { syntax: "*"; inherits: false; initial-value: 1; }
2940
+ @property --tw-scale-y { syntax: "*"; inherits: false; initial-value: 1; }
2941
+ @property --tw-scale-z { syntax: "*"; inherits: false; initial-value: 1; }
2639
2942
  @property --tw-rotate-x { syntax: "*"; inherits: false; initial-value: rotateX(0); }
2640
2943
  @property --tw-rotate-y { syntax: "*"; inherits: false; initial-value: rotateY(0); }
2641
2944
  @property --tw-rotate-z { syntax: "*"; inherits: false; initial-value: rotateZ(0); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadcn-ui-react",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "author": "Bleker Cordova <bleker@gliyen.com>",
6
6
  "description": "React UI library for ShadCN",
@@ -55,20 +55,21 @@
55
55
  "@types/react-dom": "^19.0.4",
56
56
  "autoprefixer": "^10.4.20",
57
57
  "cross-env": "^7.0.3",
58
+ "jest": "^29.7.0",
58
59
  "react": "^19.0.0",
59
60
  "react-day-picker": "^9.5.1",
60
61
  "react-dom": "^19.0.0",
62
+ "react-router-dom": "^7.2.0",
61
63
  "react-test-renderer": "^19.0.0",
62
64
  "rimraf": "^6.0.1",
63
65
  "tailwindcss": "^4.0.9",
64
66
  "tailwindcss-animate": "^1.0.7",
65
67
  "tsup": "^8.4.0",
66
- "vite-plugin-dts": "^4.5.3",
67
- "vite-plugin-ts-alias": "^0.1.1",
68
68
  "typescript": "^5.8.2",
69
69
  "vaul": "^1.1.2",
70
- "jest": "^29.7.0",
71
- "vite": "^6.2.0"
70
+ "vite": "^6.2.0",
71
+ "vite-plugin-dts": "^4.5.3",
72
+ "vite-plugin-ts-alias": "^0.1.1"
72
73
  },
73
74
  "peerDependencies": {
74
75
  "react": "^17.0.0 || ^18.3.1 || ^19.0.0 || ^20.0.0",
@@ -107,6 +108,7 @@
107
108
  "@radix-ui/react-toggle": "^1.1.2",
108
109
  "@radix-ui/react-toggle-group": "^1.1.2",
109
110
  "@radix-ui/react-tooltip": "^1.1.8",
111
+ "@tanstack/react-table": "^8.21.2",
110
112
  "@vitejs/plugin-react": "^4.3.4",
111
113
  "@vitejs/plugin-react-swc": "^3.8.0",
112
114
  "class-variance-authority": "^0.7.1",
@@ -116,9 +118,12 @@
116
118
  "input-otp": "^1.4.2",
117
119
  "lucide-react": "^0.477.0",
118
120
  "next-themes": "^0.4.4",
121
+ "react-dropzone": "^14.3.8",
122
+ "react-helmet-next": "^0.0.1",
119
123
  "react-resizable-panels": "^2.1.7",
120
124
  "sonner": "^2.0.1",
121
125
  "tailwind-merge": "^3.0.2",
122
- "tailwind-variants": "^0.3.1"
126
+ "tailwind-variants": "^0.3.1",
127
+ "use-debounce": "^10.0.4"
123
128
  }
124
129
  }