@create-lft-app/nextjs 3.1.0 → 3.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.
Files changed (128) hide show
  1. package/README.md +549 -549
  2. package/package.json +48 -48
  3. package/template/CLAUDE.md +1239 -279
  4. package/template/drizzle.config.ts +12 -12
  5. package/template/eslint.config.mjs +16 -16
  6. package/template/gitignore +36 -36
  7. package/template/next.config.ts +7 -7
  8. package/template/package.json +86 -86
  9. package/template/postcss.config.mjs +7 -7
  10. package/template/proxy.ts +12 -12
  11. package/template/public/logolft.svg +11 -11
  12. package/template/src/app/(auth)/dashboard/dashboard-content.tsx +124 -124
  13. package/template/src/app/(auth)/dashboard/page.tsx +9 -9
  14. package/template/src/app/(auth)/layout.tsx +7 -7
  15. package/template/src/app/(auth)/users/page.tsx +9 -9
  16. package/template/src/app/(auth)/users/users-content.tsx +26 -26
  17. package/template/src/app/(public)/layout.tsx +7 -7
  18. package/template/src/app/(public)/login/page.tsx +17 -17
  19. package/template/src/app/api/webhooks/route.ts +20 -20
  20. package/template/src/app/globals.css +249 -249
  21. package/template/src/app/layout.tsx +37 -37
  22. package/template/src/app/page.tsx +5 -5
  23. package/template/src/app/providers.tsx +27 -27
  24. package/template/src/components/layout/main-content.tsx +28 -28
  25. package/template/src/components/layout/sidebar-context.tsx +33 -33
  26. package/template/src/components/layout/sidebar.tsx +141 -146
  27. package/template/src/components/tables/data-table-column-header.tsx +68 -68
  28. package/template/src/components/tables/data-table-date-filter.tsx +203 -0
  29. package/template/src/components/tables/data-table-faceted-filter.tsx +185 -0
  30. package/template/src/components/tables/data-table-filters-dropdown.tsx +130 -0
  31. package/template/src/components/tables/data-table-number-filter.tsx +295 -0
  32. package/template/src/components/tables/data-table-pagination.tsx +99 -99
  33. package/template/src/components/tables/data-table-toolbar.tsx +140 -50
  34. package/template/src/components/tables/data-table-view-options.tsx +63 -59
  35. package/template/src/components/tables/data-table.tsx +148 -128
  36. package/template/src/components/tables/index.ts +9 -5
  37. package/template/src/components/ui/accordion.tsx +58 -58
  38. package/template/src/components/ui/alert-dialog.tsx +165 -165
  39. package/template/src/components/ui/alert.tsx +66 -66
  40. package/template/src/components/ui/animations/index.ts +44 -44
  41. package/template/src/components/ui/avatar.tsx +55 -55
  42. package/template/src/components/ui/badge.tsx +50 -50
  43. package/template/src/components/ui/button.tsx +118 -118
  44. package/template/src/components/ui/calendar.tsx +220 -220
  45. package/template/src/components/ui/card.tsx +113 -113
  46. package/template/src/components/ui/checkbox.tsx +38 -38
  47. package/template/src/components/ui/collapsible.tsx +33 -33
  48. package/template/src/components/ui/command.tsx +196 -196
  49. package/template/src/components/ui/dialog.tsx +156 -156
  50. package/template/src/components/ui/dropdown-menu.tsx +280 -280
  51. package/template/src/components/ui/form.tsx +171 -171
  52. package/template/src/components/ui/icons.tsx +167 -167
  53. package/template/src/components/ui/input.tsx +28 -28
  54. package/template/src/components/ui/label.tsx +25 -25
  55. package/template/src/components/ui/motion.tsx +197 -197
  56. package/template/src/components/ui/page-transition.tsx +166 -166
  57. package/template/src/components/ui/popover.tsx +59 -59
  58. package/template/src/components/ui/progress.tsx +32 -32
  59. package/template/src/components/ui/radio-group.tsx +45 -45
  60. package/template/src/components/ui/scroll-area.tsx +63 -63
  61. package/template/src/components/ui/select.tsx +208 -208
  62. package/template/src/components/ui/separator.tsx +28 -28
  63. package/template/src/components/ui/sheet.tsx +170 -170
  64. package/template/src/components/ui/sidebar.tsx +726 -726
  65. package/template/src/components/ui/skeleton.tsx +15 -15
  66. package/template/src/components/ui/slider.tsx +58 -58
  67. package/template/src/components/ui/sonner.tsx +47 -47
  68. package/template/src/components/ui/spinner.tsx +27 -27
  69. package/template/src/components/ui/submit-button.tsx +47 -47
  70. package/template/src/components/ui/switch.tsx +31 -31
  71. package/template/src/components/ui/table.tsx +120 -120
  72. package/template/src/components/ui/tabs.tsx +75 -75
  73. package/template/src/components/ui/textarea.tsx +26 -26
  74. package/template/src/components/ui/tooltip.tsx +70 -70
  75. package/template/src/config/navigation.ts +59 -69
  76. package/template/src/config/roles.ts +27 -0
  77. package/template/src/config/site.ts +12 -12
  78. package/template/src/db/index.ts +12 -12
  79. package/template/src/db/schema/index.ts +1 -1
  80. package/template/src/db/schema/users.ts +16 -16
  81. package/template/src/db/seed.ts +39 -39
  82. package/template/src/hooks/index.ts +3 -3
  83. package/template/src/hooks/use-mobile.ts +21 -21
  84. package/template/src/hooks/useDataTable.ts +82 -82
  85. package/template/src/hooks/useDebounce.ts +49 -49
  86. package/template/src/hooks/useMediaQuery.ts +36 -36
  87. package/template/src/lib/date/config.ts +36 -34
  88. package/template/src/lib/date/formatters.ts +127 -120
  89. package/template/src/lib/date/index.ts +26 -19
  90. package/template/src/lib/excel/exporter.ts +89 -89
  91. package/template/src/lib/excel/index.ts +14 -14
  92. package/template/src/lib/excel/parser.ts +96 -96
  93. package/template/src/lib/query-client.ts +35 -35
  94. package/template/src/lib/supabase/admin.ts +23 -0
  95. package/template/src/lib/supabase/client.ts +11 -11
  96. package/template/src/lib/supabase/proxy.ts +67 -67
  97. package/template/src/lib/supabase/server.ts +38 -38
  98. package/template/src/lib/supabase/types.ts +53 -53
  99. package/template/src/lib/utils.ts +6 -6
  100. package/template/src/lib/validations/common.ts +75 -75
  101. package/template/src/lib/validations/index.ts +20 -20
  102. package/template/src/modules/auth/actions/auth-actions.ts +59 -59
  103. package/template/src/modules/auth/components/login-form.tsx +68 -68
  104. package/template/src/modules/auth/hooks/useAuth.ts +38 -38
  105. package/template/src/modules/auth/hooks/useAuthMutations.ts +43 -43
  106. package/template/src/modules/auth/hooks/useAuthQueries.ts +43 -43
  107. package/template/src/modules/auth/index.ts +12 -12
  108. package/template/src/modules/auth/schemas/auth.schema.ts +32 -32
  109. package/template/src/modules/auth/stores/useAuthStore.ts +37 -37
  110. package/template/src/modules/users/actions/users-actions.ts +166 -94
  111. package/template/src/modules/users/columns.tsx +106 -86
  112. package/template/src/modules/users/components/users-list.tsx +48 -22
  113. package/template/src/modules/users/hooks/useUsers.ts +39 -39
  114. package/template/src/modules/users/hooks/useUsersMutations.ts +55 -55
  115. package/template/src/modules/users/hooks/useUsersQueries.ts +35 -35
  116. package/template/src/modules/users/index.ts +30 -12
  117. package/template/src/modules/users/schemas/users.schema.ts +51 -23
  118. package/template/src/modules/users/stores/useUsersStore.ts +60 -60
  119. package/template/src/modules/users/types/auth-user.types.ts +42 -0
  120. package/template/src/modules/users/utils/user-mapper.ts +32 -0
  121. package/template/src/stores/index.ts +1 -1
  122. package/template/src/stores/useUiStore.ts +55 -55
  123. package/template/src/types/api.ts +28 -28
  124. package/template/src/types/index.ts +2 -2
  125. package/template/src/types/table.ts +34 -34
  126. package/template/supabase/config.toml +94 -94
  127. package/template/tsconfig.json +42 -42
  128. package/template/tsconfig.tsbuildinfo +1 -1
@@ -1,156 +1,156 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import * as DialogPrimitive from "@radix-ui/react-dialog"
5
- import { motion, AnimatePresence } from "framer-motion"
6
- import { XIcon } from "lucide-react"
7
- import { cn } from "@/lib/utils"
8
-
9
- function Dialog({
10
- ...props
11
- }: React.ComponentProps<typeof DialogPrimitive.Root>) {
12
- return <DialogPrimitive.Root data-slot="dialog" {...props} />
13
- }
14
-
15
- function DialogTrigger({
16
- ...props
17
- }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
18
- return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
19
- }
20
-
21
- function DialogPortal({
22
- ...props
23
- }: React.ComponentProps<typeof DialogPrimitive.Portal>) {
24
- return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
25
- }
26
-
27
- function DialogClose({
28
- ...props
29
- }: React.ComponentProps<typeof DialogPrimitive.Close>) {
30
- return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
31
- }
32
-
33
- const DialogOverlay = React.forwardRef<
34
- React.ElementRef<typeof DialogPrimitive.Overlay>,
35
- React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
36
- >(({ className, ...props }, ref) => (
37
- <DialogPrimitive.Overlay ref={ref} asChild {...props}>
38
- <motion.div
39
- data-slot="dialog-overlay"
40
- initial={{ opacity: 0 }}
41
- animate={{ opacity: 1 }}
42
- exit={{ opacity: 0 }}
43
- transition={{ duration: 0.2 }}
44
- className={cn(
45
- "fixed inset-0 z-50",
46
- "bg-black/60 backdrop-blur-sm",
47
- className
48
- )}
49
- />
50
- </DialogPrimitive.Overlay>
51
- ))
52
- DialogOverlay.displayName = "DialogOverlay"
53
-
54
- const DialogContent = React.forwardRef<
55
- React.ElementRef<typeof DialogPrimitive.Content>,
56
- React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {
57
- showCloseButton?: boolean
58
- }
59
- >(({ className, children, showCloseButton = true, ...props }, ref) => (
60
- <DialogPortal>
61
- <DialogOverlay />
62
- <DialogPrimitive.Content ref={ref} asChild {...props}>
63
- <motion.div
64
- data-slot="dialog-content"
65
- initial={{ opacity: 0, scale: 0.95, y: -10 }}
66
- animate={{ opacity: 1, scale: 1, y: 0 }}
67
- exit={{ opacity: 0, scale: 0.95, y: -10 }}
68
- transition={{
69
- type: "spring",
70
- stiffness: 300,
71
- damping: 30,
72
- }}
73
- className={cn(
74
- "fixed left-[50%] top-[50%] z-50",
75
- "translate-x-[-50%] translate-y-[-50%]",
76
- "grid w-full max-w-xl gap-4 border bg-background p-6",
77
- className
78
- )}
79
- >
80
- {children}
81
- {showCloseButton && (
82
- <DialogPrimitive.Close
83
- data-slot="dialog-close"
84
- className="absolute right-6 top-6 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none"
85
- >
86
- <XIcon className="h-4 w-4" />
87
- <span className="sr-only">Close</span>
88
- </DialogPrimitive.Close>
89
- )}
90
- </motion.div>
91
- </DialogPrimitive.Content>
92
- </DialogPortal>
93
- ))
94
- DialogContent.displayName = "DialogContent"
95
-
96
- function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
97
- return (
98
- <div
99
- data-slot="dialog-header"
100
- className={cn("flex flex-col gap-2 text-center sm:text-left", className)}
101
- {...props}
102
- />
103
- )
104
- }
105
-
106
- function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
107
- return (
108
- <div
109
- data-slot="dialog-footer"
110
- className={cn(
111
- "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
112
- className
113
- )}
114
- {...props}
115
- />
116
- )
117
- }
118
-
119
- function DialogTitle({
120
- className,
121
- ...props
122
- }: React.ComponentProps<typeof DialogPrimitive.Title>) {
123
- return (
124
- <DialogPrimitive.Title
125
- data-slot="dialog-title"
126
- className={cn("text-lg leading-none font-semibold", className)}
127
- {...props}
128
- />
129
- )
130
- }
131
-
132
- function DialogDescription({
133
- className,
134
- ...props
135
- }: React.ComponentProps<typeof DialogPrimitive.Description>) {
136
- return (
137
- <DialogPrimitive.Description
138
- data-slot="dialog-description"
139
- className={cn("text-muted-foreground text-sm", className)}
140
- {...props}
141
- />
142
- )
143
- }
144
-
145
- export {
146
- Dialog,
147
- DialogClose,
148
- DialogContent,
149
- DialogDescription,
150
- DialogFooter,
151
- DialogHeader,
152
- DialogOverlay,
153
- DialogPortal,
154
- DialogTitle,
155
- DialogTrigger,
156
- }
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as DialogPrimitive from "@radix-ui/react-dialog"
5
+ import { motion, AnimatePresence } from "framer-motion"
6
+ import { XIcon } from "lucide-react"
7
+ import { cn } from "@/lib/utils"
8
+
9
+ function Dialog({
10
+ ...props
11
+ }: React.ComponentProps<typeof DialogPrimitive.Root>) {
12
+ return <DialogPrimitive.Root data-slot="dialog" {...props} />
13
+ }
14
+
15
+ function DialogTrigger({
16
+ ...props
17
+ }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
18
+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
19
+ }
20
+
21
+ function DialogPortal({
22
+ ...props
23
+ }: React.ComponentProps<typeof DialogPrimitive.Portal>) {
24
+ return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
25
+ }
26
+
27
+ function DialogClose({
28
+ ...props
29
+ }: React.ComponentProps<typeof DialogPrimitive.Close>) {
30
+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
31
+ }
32
+
33
+ const DialogOverlay = React.forwardRef<
34
+ React.ElementRef<typeof DialogPrimitive.Overlay>,
35
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
36
+ >(({ className, ...props }, ref) => (
37
+ <DialogPrimitive.Overlay ref={ref} asChild {...props}>
38
+ <motion.div
39
+ data-slot="dialog-overlay"
40
+ initial={{ opacity: 0 }}
41
+ animate={{ opacity: 1 }}
42
+ exit={{ opacity: 0 }}
43
+ transition={{ duration: 0.2 }}
44
+ className={cn(
45
+ "fixed inset-0 z-50",
46
+ "bg-black/60 backdrop-blur-sm",
47
+ className
48
+ )}
49
+ />
50
+ </DialogPrimitive.Overlay>
51
+ ))
52
+ DialogOverlay.displayName = "DialogOverlay"
53
+
54
+ const DialogContent = React.forwardRef<
55
+ React.ElementRef<typeof DialogPrimitive.Content>,
56
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {
57
+ showCloseButton?: boolean
58
+ }
59
+ >(({ className, children, showCloseButton = true, ...props }, ref) => (
60
+ <DialogPortal>
61
+ <DialogOverlay />
62
+ <DialogPrimitive.Content ref={ref} asChild {...props}>
63
+ <motion.div
64
+ data-slot="dialog-content"
65
+ initial={{ opacity: 0, scale: 0.95, y: -10 }}
66
+ animate={{ opacity: 1, scale: 1, y: 0 }}
67
+ exit={{ opacity: 0, scale: 0.95, y: -10 }}
68
+ transition={{
69
+ type: "spring",
70
+ stiffness: 300,
71
+ damping: 30,
72
+ }}
73
+ className={cn(
74
+ "fixed left-[50%] top-[50%] z-50",
75
+ "translate-x-[-50%] translate-y-[-50%]",
76
+ "grid w-full max-w-xl gap-4 border bg-background p-6",
77
+ className
78
+ )}
79
+ >
80
+ {children}
81
+ {showCloseButton && (
82
+ <DialogPrimitive.Close
83
+ data-slot="dialog-close"
84
+ className="absolute right-6 top-6 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none"
85
+ >
86
+ <XIcon className="h-4 w-4" />
87
+ <span className="sr-only">Close</span>
88
+ </DialogPrimitive.Close>
89
+ )}
90
+ </motion.div>
91
+ </DialogPrimitive.Content>
92
+ </DialogPortal>
93
+ ))
94
+ DialogContent.displayName = "DialogContent"
95
+
96
+ function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
97
+ return (
98
+ <div
99
+ data-slot="dialog-header"
100
+ className={cn("flex flex-col gap-2 text-center sm:text-left", className)}
101
+ {...props}
102
+ />
103
+ )
104
+ }
105
+
106
+ function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
107
+ return (
108
+ <div
109
+ data-slot="dialog-footer"
110
+ className={cn(
111
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
112
+ className
113
+ )}
114
+ {...props}
115
+ />
116
+ )
117
+ }
118
+
119
+ function DialogTitle({
120
+ className,
121
+ ...props
122
+ }: React.ComponentProps<typeof DialogPrimitive.Title>) {
123
+ return (
124
+ <DialogPrimitive.Title
125
+ data-slot="dialog-title"
126
+ className={cn("text-lg leading-none font-semibold", className)}
127
+ {...props}
128
+ />
129
+ )
130
+ }
131
+
132
+ function DialogDescription({
133
+ className,
134
+ ...props
135
+ }: React.ComponentProps<typeof DialogPrimitive.Description>) {
136
+ return (
137
+ <DialogPrimitive.Description
138
+ data-slot="dialog-description"
139
+ className={cn("text-muted-foreground text-sm", className)}
140
+ {...props}
141
+ />
142
+ )
143
+ }
144
+
145
+ export {
146
+ Dialog,
147
+ DialogClose,
148
+ DialogContent,
149
+ DialogDescription,
150
+ DialogFooter,
151
+ DialogHeader,
152
+ DialogOverlay,
153
+ DialogPortal,
154
+ DialogTitle,
155
+ DialogTrigger,
156
+ }