@create-lft-app/cli 1.0.14 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/bin/cli.js +150 -171
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/src/index.js +148 -169
  4. package/dist/src/index.js.map +1 -1
  5. package/package.json +1 -1
  6. package/templates/app/auth/login/page.tsx +0 -153
  7. package/templates/app/dashboard/page.tsx +0 -102
  8. package/templates/app/globals.css +0 -249
  9. package/templates/app/layout.tsx +0 -40
  10. package/templates/app/page.tsx +0 -5
  11. package/templates/components/dashboard/widget.tsx +0 -113
  12. package/templates/components/layout/admin-midday-sidebar.tsx +0 -247
  13. package/templates/components/layout/admin-sidebar.tsx +0 -146
  14. package/templates/components/layout/header.tsx +0 -71
  15. package/templates/components/layout/main-content.tsx +0 -28
  16. package/templates/components/layout/midday-sidebar.tsx +0 -381
  17. package/templates/components/layout/nav-user.tsx +0 -108
  18. package/templates/components/layout/page-header.tsx +0 -95
  19. package/templates/components/layout/sidebar-context.tsx +0 -33
  20. package/templates/components/layout/sidebar.tsx +0 -194
  21. package/templates/components/layout/suspension-banner.tsx +0 -21
  22. package/templates/components/ui/accordion.tsx +0 -58
  23. package/templates/components/ui/alert-dialog.tsx +0 -165
  24. package/templates/components/ui/alert.tsx +0 -66
  25. package/templates/components/ui/avatar.tsx +0 -55
  26. package/templates/components/ui/badge.tsx +0 -50
  27. package/templates/components/ui/button.tsx +0 -89
  28. package/templates/components/ui/calendar.tsx +0 -220
  29. package/templates/components/ui/card.tsx +0 -89
  30. package/templates/components/ui/checkbox.tsx +0 -38
  31. package/templates/components/ui/collapsible.tsx +0 -33
  32. package/templates/components/ui/command.tsx +0 -196
  33. package/templates/components/ui/dialog.tsx +0 -153
  34. package/templates/components/ui/dropdown-menu.tsx +0 -280
  35. package/templates/components/ui/form.tsx +0 -171
  36. package/templates/components/ui/icons.tsx +0 -167
  37. package/templates/components/ui/input.tsx +0 -28
  38. package/templates/components/ui/label.tsx +0 -25
  39. package/templates/components/ui/popover.tsx +0 -59
  40. package/templates/components/ui/progress.tsx +0 -32
  41. package/templates/components/ui/radio-group.tsx +0 -45
  42. package/templates/components/ui/scroll-area.tsx +0 -63
  43. package/templates/components/ui/select.tsx +0 -208
  44. package/templates/components/ui/separator.tsx +0 -28
  45. package/templates/components/ui/sheet.tsx +0 -146
  46. package/templates/components/ui/sidebar.tsx +0 -726
  47. package/templates/components/ui/skeleton.tsx +0 -15
  48. package/templates/components/ui/slider.tsx +0 -58
  49. package/templates/components/ui/sonner.tsx +0 -47
  50. package/templates/components/ui/spinner.tsx +0 -27
  51. package/templates/components/ui/submit-button.tsx +0 -47
  52. package/templates/components/ui/switch.tsx +0 -31
  53. package/templates/components/ui/table.tsx +0 -120
  54. package/templates/components/ui/tabs.tsx +0 -75
  55. package/templates/components/ui/textarea.tsx +0 -26
  56. package/templates/components/ui/tooltip.tsx +0 -70
  57. package/templates/hooks/use-mobile.ts +0 -21
  58. package/templates/lib/supabase/client.ts +0 -8
  59. package/templates/lib/supabase/server.ts +0 -29
  60. package/templates/lib/utils.ts +0 -6
  61. package/templates/modules/auth/actions/auth-actions.ts +0 -12
@@ -1,108 +0,0 @@
1
- 'use client'
2
-
3
- import { logout } from '@/modules/auth/actions/auth-actions'
4
- import { Avatar, AvatarFallback } from '@/components/ui/avatar'
5
- import {
6
- DropdownMenu,
7
- DropdownMenuContent,
8
- DropdownMenuItem,
9
- DropdownMenuLabel,
10
- DropdownMenuSeparator,
11
- DropdownMenuTrigger,
12
- } from '@/components/ui/dropdown-menu'
13
- import { SidebarMenuButton } from '@/components/ui/sidebar'
14
- import { ChevronsUpDown, LogOut, User } from 'lucide-react'
15
- import { Badge } from '@/components/ui/badge'
16
-
17
- interface NavUserProps {
18
- user: {
19
- email: string
20
- full_name: string | null
21
- role: string
22
- } | null
23
- }
24
-
25
- const roleLabels: Record<string, string> = {
26
- super_admin: 'Super Admin',
27
- admin: 'Administrador',
28
- compliance: 'Compliance',
29
- analyst: 'Analista',
30
- }
31
-
32
- export function NavUser({ user }: NavUserProps) {
33
- if (!user) return null
34
-
35
- const initials = user.full_name
36
- ? user.full_name
37
- .split(' ')
38
- .map((n) => n[0])
39
- .join('')
40
- .toUpperCase()
41
- .slice(0, 2)
42
- : user.email.slice(0, 2).toUpperCase()
43
-
44
- return (
45
- <DropdownMenu>
46
- <DropdownMenuTrigger asChild>
47
- <SidebarMenuButton
48
- size="lg"
49
- className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
50
- >
51
- <Avatar className="h-8 w-8">
52
- <AvatarFallback className="bg-primary text-primary-foreground text-xs">
53
- {initials}
54
- </AvatarFallback>
55
- </Avatar>
56
- <div className="grid flex-1 text-left text-sm leading-tight">
57
- <span className="truncate font-semibold">
58
- {user.full_name || user.email}
59
- </span>
60
- <span className="truncate text-xs text-muted-foreground">
61
- {user.email}
62
- </span>
63
- </div>
64
- <ChevronsUpDown className="ml-auto size-4" />
65
- </SidebarMenuButton>
66
- </DropdownMenuTrigger>
67
- <DropdownMenuContent
68
- className="w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg"
69
- side="bottom"
70
- align="end"
71
- sideOffset={4}
72
- >
73
- <DropdownMenuLabel className="p-0 font-normal">
74
- <div className="flex items-center gap-2 px-1 py-1.5 text-left text-sm">
75
- <Avatar className="h-8 w-8">
76
- <AvatarFallback className="bg-primary text-primary-foreground text-xs">
77
- {initials}
78
- </AvatarFallback>
79
- </Avatar>
80
- <div className="grid flex-1 text-left text-sm leading-tight">
81
- <span className="truncate font-semibold">
82
- {user.full_name || user.email}
83
- </span>
84
- <Badge variant="secondary" className="w-fit text-xs">
85
- {roleLabels[user.role] || user.role}
86
- </Badge>
87
- </div>
88
- </div>
89
- </DropdownMenuLabel>
90
- <DropdownMenuSeparator />
91
- <DropdownMenuItem asChild>
92
- <a href="/settings/profile" className="cursor-pointer">
93
- <User className="mr-2 h-4 w-4" />
94
- Mi Perfil
95
- </a>
96
- </DropdownMenuItem>
97
- <DropdownMenuSeparator />
98
- <DropdownMenuItem
99
- className="cursor-pointer text-destructive focus:text-destructive"
100
- onClick={() => logout()}
101
- >
102
- <LogOut className="mr-2 h-4 w-4" />
103
- Cerrar sesión
104
- </DropdownMenuItem>
105
- </DropdownMenuContent>
106
- </DropdownMenu>
107
- )
108
- }
@@ -1,95 +0,0 @@
1
- import { cn } from '@/lib/utils'
2
-
3
- interface PageHeaderProps {
4
- title: string
5
- description?: string
6
- children?: React.ReactNode
7
- className?: string
8
- }
9
-
10
- export function PageHeader({ title, description, children, className }: PageHeaderProps) {
11
- return (
12
- <header className={cn('h-[70px] flex items-center border-b border-border px-6', className)}>
13
- <div className="flex items-center justify-between w-full">
14
- <div>
15
- <h1 className="text-lg font-medium">{title}</h1>
16
- {description && (
17
- <p className="text-xs text-[#878787]">{description}</p>
18
- )}
19
- </div>
20
- {children && (
21
- <div className="flex items-center gap-2">
22
- {children}
23
- </div>
24
- )}
25
- </div>
26
- </header>
27
- )
28
- }
29
-
30
- interface PageContentProps {
31
- children: React.ReactNode
32
- className?: string
33
- }
34
-
35
- export function PageContent({ children, className }: PageContentProps) {
36
- return (
37
- <div className={cn('flex-1 overflow-auto p-6', className)}>
38
- {children}
39
- </div>
40
- )
41
- }
42
-
43
- interface PageContainerProps {
44
- children: React.ReactNode
45
- className?: string
46
- }
47
-
48
- export function PageContainer({ children, className }: PageContainerProps) {
49
- return (
50
- <div className={cn('flex flex-col h-screen', className)}>
51
- {children}
52
- </div>
53
- )
54
- }
55
-
56
- interface StatItemProps {
57
- label: string
58
- value: string | number
59
- trend?: {
60
- value: number
61
- positive?: boolean
62
- }
63
- }
64
-
65
- export function StatItem({ label, value, trend }: StatItemProps) {
66
- return (
67
- <div className="border border-border bg-background p-6">
68
- <p className="text-sm text-[#878787] mb-3">{label}</p>
69
- <div className="flex items-baseline gap-2">
70
- <span className="text-2xl font-normal tabular-nums">{value}</span>
71
- {trend && (
72
- <span className={cn(
73
- 'text-xs',
74
- trend.positive ? 'text-[#00C48C]' : 'text-[#FF3B3B]'
75
- )}>
76
- {trend.positive ? '+' : ''}{trend.value}%
77
- </span>
78
- )}
79
- </div>
80
- </div>
81
- )
82
- }
83
-
84
- interface StatsRowProps {
85
- children: React.ReactNode
86
- className?: string
87
- }
88
-
89
- export function StatsRow({ children, className }: StatsRowProps) {
90
- return (
91
- <div className={cn('grid grid-cols-4 gap-6', className)}>
92
- {children}
93
- </div>
94
- )
95
- }
@@ -1,33 +0,0 @@
1
- 'use client'
2
-
3
- import { createContext, useContext, useState, useCallback, ReactNode } from 'react'
4
-
5
- interface SidebarContextType {
6
- isExpanded: boolean
7
- setIsExpanded: (value: boolean) => void
8
- expand: () => void
9
- collapse: () => void
10
- }
11
-
12
- const SidebarContext = createContext<SidebarContextType | undefined>(undefined)
13
-
14
- export function SidebarProvider({ children }: { children: ReactNode }) {
15
- const [isExpanded, setIsExpanded] = useState(false)
16
-
17
- const expand = useCallback(() => setIsExpanded(true), [])
18
- const collapse = useCallback(() => setIsExpanded(false), [])
19
-
20
- return (
21
- <SidebarContext.Provider value={{ isExpanded, setIsExpanded, expand, collapse }}>
22
- {children}
23
- </SidebarContext.Provider>
24
- )
25
- }
26
-
27
- export function useSidebar() {
28
- const context = useContext(SidebarContext)
29
- if (context === undefined) {
30
- throw new Error('useSidebar must be used within a SidebarProvider')
31
- }
32
- return context
33
- }
@@ -1,194 +0,0 @@
1
- 'use client'
2
-
3
- import Link from 'next/link'
4
- import { usePathname } from 'next/navigation'
5
- import {
6
- LayoutDashboard,
7
- Users,
8
- FileText,
9
- AlertTriangle,
10
- BarChart3,
11
- Calendar,
12
- Settings,
13
- Building2,
14
- Shield,
15
- UserPlus,
16
- } from 'lucide-react'
17
- import { cn } from '@/lib/utils'
18
- import {
19
- Sidebar,
20
- SidebarContent,
21
- SidebarGroup,
22
- SidebarGroupContent,
23
- SidebarGroupLabel,
24
- SidebarMenu,
25
- SidebarMenuButton,
26
- SidebarMenuItem,
27
- SidebarHeader,
28
- SidebarFooter,
29
- } from '@/components/ui/sidebar'
30
- import { NavUser } from './nav-user'
31
-
32
- const mainNavItems = [
33
- {
34
- title: 'Dashboard',
35
- url: '/',
36
- icon: LayoutDashboard,
37
- },
38
- {
39
- title: 'Clientes',
40
- url: '/clientes',
41
- icon: Users,
42
- },
43
- {
44
- title: 'Onboarding',
45
- url: '/onboarding',
46
- icon: UserPlus,
47
- },
48
- {
49
- title: 'Documentos',
50
- url: '/documents',
51
- icon: FileText,
52
- },
53
- {
54
- title: 'Alertas',
55
- url: '/alerts',
56
- icon: AlertTriangle,
57
- },
58
- {
59
- title: 'Operaciones',
60
- url: '/operations',
61
- icon: BarChart3,
62
- },
63
- {
64
- title: 'Reportes',
65
- url: '/reports',
66
- icon: FileText,
67
- },
68
- {
69
- title: 'Calendario',
70
- url: '/calendar',
71
- icon: Calendar,
72
- },
73
- ]
74
-
75
- const configNavItems = [
76
- {
77
- title: 'Configuración',
78
- url: '/settings',
79
- icon: Settings,
80
- },
81
- {
82
- title: 'Organización',
83
- url: '/settings/organization',
84
- icon: Building2,
85
- },
86
- {
87
- title: 'Onboarding',
88
- url: '/settings/onboarding',
89
- icon: UserPlus,
90
- },
91
- ]
92
-
93
- interface AppSidebarProps {
94
- user: {
95
- email: string
96
- full_name: string | null
97
- role: string
98
- organization?: {
99
- name: string
100
- } | null
101
- } | null
102
- }
103
-
104
- export function AppSidebar({ user }: AppSidebarProps) {
105
- const pathname = usePathname()
106
-
107
- return (
108
- <Sidebar>
109
- <SidebarHeader className="border-b border-sidebar-border">
110
- <div className="flex items-center gap-2 px-4 py-3">
111
- <div className="flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold">
112
- R
113
- </div>
114
- <div className="flex flex-col">
115
- <span className="text-sm font-semibold">Radiant Compliance</span>
116
- {user?.organization && (
117
- <span className="text-xs text-muted-foreground">
118
- {user.organization.name}
119
- </span>
120
- )}
121
- </div>
122
- </div>
123
- </SidebarHeader>
124
-
125
- <SidebarContent>
126
- <SidebarGroup>
127
- <SidebarGroupLabel>Principal</SidebarGroupLabel>
128
- <SidebarGroupContent>
129
- <SidebarMenu>
130
- {mainNavItems.map((item) => (
131
- <SidebarMenuItem key={item.title}>
132
- <SidebarMenuButton
133
- asChild
134
- isActive={pathname === item.url}
135
- >
136
- <Link href={item.url}>
137
- <item.icon className="h-4 w-4" />
138
- <span>{item.title}</span>
139
- </Link>
140
- </SidebarMenuButton>
141
- </SidebarMenuItem>
142
- ))}
143
- </SidebarMenu>
144
- </SidebarGroupContent>
145
- </SidebarGroup>
146
-
147
- {user?.role && ['admin', 'super_admin'].includes(user.role) && (
148
- <SidebarGroup>
149
- <SidebarGroupLabel>Administración</SidebarGroupLabel>
150
- <SidebarGroupContent>
151
- <SidebarMenu>
152
- {configNavItems.map((item) => (
153
- <SidebarMenuItem key={item.title}>
154
- <SidebarMenuButton
155
- asChild
156
- isActive={pathname === item.url || pathname.startsWith(item.url + '/')}
157
- >
158
- <Link href={item.url}>
159
- <item.icon className="h-4 w-4" />
160
- <span>{item.title}</span>
161
- </Link>
162
- </SidebarMenuButton>
163
- </SidebarMenuItem>
164
- ))}
165
- </SidebarMenu>
166
- </SidebarGroupContent>
167
- </SidebarGroup>
168
- )}
169
-
170
- {user?.role === 'super_admin' && (
171
- <SidebarGroup>
172
- <SidebarGroupLabel>Super Admin</SidebarGroupLabel>
173
- <SidebarGroupContent>
174
- <SidebarMenu>
175
- <SidebarMenuItem>
176
- <SidebarMenuButton asChild>
177
- <Link href="/admin">
178
- <Shield className="h-4 w-4" />
179
- <span>Panel de Admin</span>
180
- </Link>
181
- </SidebarMenuButton>
182
- </SidebarMenuItem>
183
- </SidebarMenu>
184
- </SidebarGroupContent>
185
- </SidebarGroup>
186
- )}
187
- </SidebarContent>
188
-
189
- <SidebarFooter className="border-t border-sidebar-border">
190
- <NavUser user={user} />
191
- </SidebarFooter>
192
- </Sidebar>
193
- )
194
- }
@@ -1,21 +0,0 @@
1
- 'use client'
2
-
3
- import { AlertTriangle } from 'lucide-react'
4
-
5
- interface SuspensionBannerProps {
6
- organizationName: string
7
- }
8
-
9
- export function SuspensionBanner({ organizationName }: SuspensionBannerProps) {
10
- return (
11
- <div className="bg-red-500 text-white px-4 py-3">
12
- <div className="flex items-center justify-center gap-2 text-sm font-medium">
13
- <AlertTriangle className="h-4 w-4" />
14
- <span>
15
- La organización <strong>{organizationName}</strong> se encuentra suspendida.
16
- Contacte al administrador para más información.
17
- </span>
18
- </div>
19
- </div>
20
- )
21
- }
@@ -1,58 +0,0 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import * as AccordionPrimitive from "@radix-ui/react-accordion"
5
- import { ChevronDown } from "lucide-react"
6
-
7
- import { cn } from "@/lib/utils"
8
-
9
- const Accordion = AccordionPrimitive.Root
10
-
11
- const AccordionItem = React.forwardRef<
12
- React.ElementRef<typeof AccordionPrimitive.Item>,
13
- React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
14
- >(({ className, ...props }, ref) => (
15
- <AccordionPrimitive.Item
16
- ref={ref}
17
- className={cn("", className)}
18
- {...props}
19
- />
20
- ))
21
- AccordionItem.displayName = "AccordionItem"
22
-
23
- const AccordionTrigger = React.forwardRef<
24
- React.ElementRef<typeof AccordionPrimitive.Trigger>,
25
- React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
26
- >(({ className, children, ...props }, ref) => (
27
- <AccordionPrimitive.Header className="flex">
28
- <AccordionPrimitive.Trigger
29
- ref={ref}
30
- className={cn(
31
- "flex flex-1 items-center justify-between py-4 font-medium transition-all [&[data-state=open]>svg]:rotate-180",
32
- className
33
- )}
34
- {...props}
35
- >
36
- {children}
37
- <ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" />
38
- </AccordionPrimitive.Trigger>
39
- </AccordionPrimitive.Header>
40
- ))
41
- AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
42
-
43
- const AccordionContent = React.forwardRef<
44
- React.ElementRef<typeof AccordionPrimitive.Content>,
45
- React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
46
- >(({ className, children, ...props }, ref) => (
47
- <AccordionPrimitive.Content
48
- ref={ref}
49
- className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
50
- {...props}
51
- >
52
- <div className={cn("pb-4 pt-0", className)}>{children}</div>
53
- </AccordionPrimitive.Content>
54
- ))
55
-
56
- AccordionContent.displayName = AccordionPrimitive.Content.displayName
57
-
58
- export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
@@ -1,165 +0,0 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
5
-
6
- import { cn } from "@/lib/utils"
7
- import { buttonVariants } from "@/components/ui/button"
8
-
9
- function AlertDialog({
10
- ...props
11
- }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
12
- return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />
13
- }
14
-
15
- function AlertDialogTrigger({
16
- ...props
17
- }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
18
- return (
19
- <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />
20
- )
21
- }
22
-
23
- function AlertDialogPortal({
24
- ...props
25
- }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {
26
- return (
27
- <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
28
- )
29
- }
30
-
31
- function AlertDialogOverlay({
32
- className,
33
- ...props
34
- }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
35
- return (
36
- <AlertDialogPrimitive.Overlay
37
- data-slot="alert-dialog-overlay"
38
- className={cn(
39
- "fixed inset-0 z-50",
40
- "bg-[#f6f6f3]/60 dark:bg-[#0C0C0C]/80",
41
- "data-[state=open]:animate-in data-[state=closed]:animate-out",
42
- "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
43
- className
44
- )}
45
- {...props}
46
- />
47
- )
48
- }
49
-
50
- function AlertDialogContent({
51
- className,
52
- ...props
53
- }: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {
54
- return (
55
- <AlertDialogPortal>
56
- <AlertDialogOverlay />
57
- <AlertDialogPrimitive.Content
58
- data-slot="alert-dialog-content"
59
- className={cn(
60
- "fixed left-[50%] top-[50%] z-50",
61
- "translate-x-[-50%] translate-y-[-50%]",
62
- "grid w-full max-w-lg gap-4 border bg-background p-6",
63
- "duration-200",
64
- "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
65
- "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
66
- className
67
- )}
68
- {...props}
69
- />
70
- </AlertDialogPortal>
71
- )
72
- }
73
-
74
- function AlertDialogHeader({
75
- className,
76
- ...props
77
- }: React.ComponentProps<"div">) {
78
- return (
79
- <div
80
- data-slot="alert-dialog-header"
81
- className={cn("flex flex-col gap-2 text-center sm:text-left", className)}
82
- {...props}
83
- />
84
- )
85
- }
86
-
87
- function AlertDialogFooter({
88
- className,
89
- ...props
90
- }: React.ComponentProps<"div">) {
91
- return (
92
- <div
93
- data-slot="alert-dialog-footer"
94
- className={cn(
95
- "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
96
- className
97
- )}
98
- {...props}
99
- />
100
- )
101
- }
102
-
103
- function AlertDialogTitle({
104
- className,
105
- ...props
106
- }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {
107
- return (
108
- <AlertDialogPrimitive.Title
109
- data-slot="alert-dialog-title"
110
- className={cn("text-lg font-semibold", className)}
111
- {...props}
112
- />
113
- )
114
- }
115
-
116
- function AlertDialogDescription({
117
- className,
118
- ...props
119
- }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {
120
- return (
121
- <AlertDialogPrimitive.Description
122
- data-slot="alert-dialog-description"
123
- className={cn("text-muted-foreground text-sm", className)}
124
- {...props}
125
- />
126
- )
127
- }
128
-
129
- function AlertDialogAction({
130
- className,
131
- ...props
132
- }: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {
133
- return (
134
- <AlertDialogPrimitive.Action
135
- className={cn(buttonVariants(), className)}
136
- {...props}
137
- />
138
- )
139
- }
140
-
141
- function AlertDialogCancel({
142
- className,
143
- ...props
144
- }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {
145
- return (
146
- <AlertDialogPrimitive.Cancel
147
- className={cn(buttonVariants({ variant: "outline" }), className)}
148
- {...props}
149
- />
150
- )
151
- }
152
-
153
- export {
154
- AlertDialog,
155
- AlertDialogPortal,
156
- AlertDialogOverlay,
157
- AlertDialogTrigger,
158
- AlertDialogContent,
159
- AlertDialogHeader,
160
- AlertDialogFooter,
161
- AlertDialogTitle,
162
- AlertDialogDescription,
163
- AlertDialogAction,
164
- AlertDialogCancel,
165
- }