create-einja-app 0.2.17 → 0.2.18

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 (270) hide show
  1. package/package.json +2 -2
  2. package/templates/default/.claude/hooks/einja/playwright-resize.sh +12 -2
  3. package/templates/default/.claude/settings.json +15 -0
  4. package/templates/default/.cursor/commands/task-vibe-kanban-loop.md +107 -42
  5. package/templates/default/.env.develop +0 -4
  6. package/templates/default/.env.example +1 -0
  7. package/templates/default/.env.preview +0 -4
  8. package/templates/default/.env.staging +19 -0
  9. package/templates/default/.github/actions/ci/action.yml +39 -0
  10. package/templates/default/.github/actions/migrate/action.yml +39 -0
  11. package/templates/default/.github/actions/neon-export-env/action.yml +28 -0
  12. package/templates/default/.github/actions/setup/action.yml +20 -0
  13. package/templates/default/.github/workflows/claude.yml +1 -0
  14. package/templates/default/.github/workflows/{cleanup-neon-branches.yml → cleanup-pr-preview-db.yml} +28 -24
  15. package/templates/default/.github/workflows/cleanup-pr-preview-on-close.yml +50 -0
  16. package/templates/default/.github/workflows/deploy-pr-preview.yml +398 -0
  17. package/templates/default/.github/workflows/deploy-stable-branches.yml +259 -0
  18. package/templates/default/.github/workflows/release-create-einja-app.yml +95 -0
  19. package/templates/default/.mcp.json +6 -9
  20. package/templates/default/CLAUDE.md +46 -9
  21. package/templates/default/README.md +5 -14
  22. package/templates/default/apps/admin/next.config.ts +11 -0
  23. package/templates/default/apps/admin/package.json +55 -0
  24. package/templates/default/apps/admin/postcss.config.cjs +5 -0
  25. package/templates/default/apps/admin/src/app/(auth)/forgot-password/page.tsx +97 -0
  26. package/templates/default/apps/admin/src/app/(auth)/layout.tsx +18 -0
  27. package/templates/default/apps/admin/src/app/(auth)/otp/page.tsx +121 -0
  28. package/templates/default/apps/admin/src/app/(auth)/sign-in/page.tsx +145 -0
  29. package/templates/default/apps/admin/src/app/(auth)/sign-up/page.tsx +199 -0
  30. package/templates/default/apps/admin/src/app/(errors)/401/page.tsx +27 -0
  31. package/templates/default/apps/admin/src/app/(errors)/403/page.tsx +28 -0
  32. package/templates/default/apps/admin/src/app/(errors)/500/page.tsx +29 -0
  33. package/templates/default/apps/admin/src/app/(errors)/layout.tsx +7 -0
  34. package/templates/default/apps/admin/src/app/(errors)/maintenance/page.tsx +25 -0
  35. package/templates/default/apps/admin/src/app/dashboard/_components/analytics-chart.tsx +68 -0
  36. package/templates/default/apps/admin/src/app/dashboard/_components/analytics.tsx +182 -0
  37. package/templates/default/apps/admin/src/app/dashboard/_components/dashboard-page.tsx +74 -0
  38. package/templates/default/apps/admin/src/app/dashboard/_components/metric-cards.tsx +49 -0
  39. package/templates/default/apps/admin/src/app/dashboard/_components/overview-chart.tsx +73 -0
  40. package/templates/default/apps/admin/src/app/dashboard/_components/recent-sales.tsx +75 -0
  41. package/templates/default/apps/admin/src/app/dashboard/apps/_components/apps-page.tsx +135 -0
  42. package/templates/default/apps/admin/src/app/dashboard/apps/page.tsx +10 -0
  43. package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-list.tsx +82 -0
  44. package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-messages.tsx +194 -0
  45. package/templates/default/apps/admin/src/app/dashboard/chats/_components/chats-page.tsx +99 -0
  46. package/templates/default/apps/admin/src/app/dashboard/chats/_components/new-chat.tsx +118 -0
  47. package/templates/default/apps/admin/src/app/dashboard/chats/page.tsx +10 -0
  48. package/templates/default/apps/admin/src/app/dashboard/layout.tsx +9 -0
  49. package/templates/default/apps/admin/src/app/dashboard/not-found.tsx +14 -0
  50. package/templates/default/apps/admin/src/app/dashboard/page.tsx +10 -0
  51. package/templates/default/apps/admin/src/app/dashboard/settings/_components/content-section.tsx +20 -0
  52. package/templates/default/apps/admin/src/app/dashboard/settings/_components/sidebar-nav.tsx +66 -0
  53. package/templates/default/apps/admin/src/app/dashboard/settings/account/page.tsx +173 -0
  54. package/templates/default/apps/admin/src/app/dashboard/settings/appearance/page.tsx +156 -0
  55. package/templates/default/apps/admin/src/app/dashboard/settings/display/page.tsx +125 -0
  56. package/templates/default/apps/admin/src/app/dashboard/settings/layout.tsx +30 -0
  57. package/templates/default/apps/admin/src/app/dashboard/settings/notifications/page.tsx +196 -0
  58. package/templates/default/apps/admin/src/app/dashboard/settings/page.tsx +5 -0
  59. package/templates/default/apps/admin/src/app/dashboard/settings/profile/page.tsx +176 -0
  60. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-bulk-actions.tsx +183 -0
  61. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-row-actions.tsx +79 -0
  62. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-columns.tsx +107 -0
  63. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-dialogs.tsx +71 -0
  64. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-import-dialog.tsx +106 -0
  65. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-multi-delete-dialog.tsx +90 -0
  66. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-mutate-drawer.tsx +207 -0
  67. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-page.tsx +31 -0
  68. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-primary-buttons.tsx +19 -0
  69. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-provider.tsx +37 -0
  70. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-table.tsx +155 -0
  71. package/templates/default/apps/admin/src/app/dashboard/tasks/page.tsx +14 -0
  72. package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-bulk-actions.tsx +136 -0
  73. package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-row-actions.tsx +62 -0
  74. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-action-dialog.tsx +297 -0
  75. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-columns.tsx +121 -0
  76. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-delete-dialog.tsx +72 -0
  77. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-dialogs.tsx +49 -0
  78. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-invite-dialog.tsx +139 -0
  79. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-multi-delete-dialog.tsx +89 -0
  80. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-page.tsx +30 -0
  81. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-primary-buttons.tsx +19 -0
  82. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-provider.tsx +35 -0
  83. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-table.tsx +157 -0
  84. package/templates/default/apps/admin/src/app/dashboard/users/page.tsx +10 -0
  85. package/templates/default/apps/admin/src/app/globals.css +109 -0
  86. package/templates/default/apps/admin/src/app/layout.tsx +32 -0
  87. package/templates/default/apps/admin/src/app/not-found.tsx +14 -0
  88. package/templates/default/apps/admin/src/app/page.tsx +5 -0
  89. package/templates/default/apps/admin/src/components/layout/admin-layout.tsx +16 -0
  90. package/templates/default/apps/admin/src/components/layout/app-sidebar.tsx +52 -0
  91. package/templates/default/apps/admin/src/components/layout/nav-config.ts +131 -0
  92. package/templates/default/apps/admin/src/components/providers/theme-provider.tsx +10 -0
  93. package/templates/default/apps/admin/src/components/shared/long-text.tsx +78 -0
  94. package/templates/default/apps/admin/src/components/shared/search-input.tsx +16 -0
  95. package/templates/default/apps/admin/src/components/shared/select-dropdown.tsx +64 -0
  96. package/templates/default/apps/admin/src/data/apps.tsx +116 -0
  97. package/templates/default/apps/admin/src/data/chats.ts +114 -0
  98. package/templates/default/apps/admin/src/data/tasks.ts +114 -0
  99. package/templates/default/apps/admin/src/data/users.ts +90 -0
  100. package/templates/default/apps/admin/src/hooks/use-dialog-state.ts +17 -0
  101. package/templates/default/apps/admin/src/hooks/use-table-url-state.ts +243 -0
  102. package/templates/default/apps/admin/src/lib/show-submitted-data.tsx +12 -0
  103. package/templates/default/apps/admin/src/types/table.d.ts +9 -0
  104. package/templates/default/apps/admin/tsconfig.json +32 -0
  105. package/templates/default/apps/web/next.config.ts +1 -0
  106. package/templates/default/apps/web/package.json +0 -22
  107. package/templates/default/apps/web/postcss.config.cjs +0 -1
  108. package/templates/default/apps/web/src/app/(authenticated)/dashboard/page.tsx +4 -20
  109. package/templates/default/apps/web/src/app/(authenticated)/data/_components/UserTable.tsx +4 -4
  110. package/templates/default/apps/web/src/app/(authenticated)/data/page.tsx +1 -1
  111. package/templates/default/apps/web/src/app/(authenticated)/profile/page.tsx +1 -1
  112. package/templates/default/apps/web/src/app/error.tsx +8 -70
  113. package/templates/default/apps/web/src/app/global-error.tsx +8 -70
  114. package/templates/default/apps/web/src/app/globals.css +20 -0
  115. package/templates/default/apps/web/src/app/not-found.tsx +5 -39
  116. package/templates/default/apps/web/src/app/page.tsx +27 -203
  117. package/templates/default/apps/web/src/app/signin/page.tsx +27 -191
  118. package/templates/default/apps/web/src/app/signup/page.tsx +33 -240
  119. package/templates/default/apps/web/src/components/dashboard/dashboard-stats.tsx +11 -75
  120. package/templates/default/apps/web/src/components/shared/Sidebar.tsx +3 -3
  121. package/templates/default/apps/web/src/components/shared/header.tsx +17 -112
  122. package/templates/default/apps/web/tsconfig.json +0 -6
  123. package/templates/default/biome.json +1 -2
  124. package/templates/default/components.json +2 -2
  125. package/templates/default/docker-compose.yml +1 -1
  126. package/templates/default/gitignore +4 -0
  127. package/templates/default/package.json +1 -0
  128. package/templates/default/packages/admin-ui/catalog/catalog.css +54 -0
  129. package/templates/default/packages/admin-ui/catalog/catalog.tsx +401 -0
  130. package/templates/default/packages/admin-ui/catalog/index.html +12 -0
  131. package/templates/default/packages/admin-ui/catalog/main.tsx +9 -0
  132. package/templates/default/packages/admin-ui/components.json +21 -0
  133. package/templates/default/packages/admin-ui/package.json +105 -0
  134. package/templates/default/packages/admin-ui/src/command-menu/index.tsx +174 -0
  135. package/templates/default/packages/admin-ui/src/data-table/bulk-actions.tsx +215 -0
  136. package/templates/default/packages/admin-ui/src/data-table/column-header.tsx +73 -0
  137. package/templates/default/packages/admin-ui/src/data-table/data-table.tsx +127 -0
  138. package/templates/default/packages/admin-ui/src/data-table/faceted-filter.tsx +148 -0
  139. package/templates/default/packages/admin-ui/src/data-table/index.tsx +9 -0
  140. package/templates/default/packages/admin-ui/src/data-table/pagination.tsx +101 -0
  141. package/templates/default/packages/admin-ui/src/data-table/toolbar.tsx +87 -0
  142. package/templates/default/packages/admin-ui/src/data-table/view-options.tsx +57 -0
  143. package/templates/default/packages/admin-ui/src/hooks/use-mobile.tsx +23 -0
  144. package/templates/default/packages/admin-ui/src/layout/header.tsx +55 -0
  145. package/templates/default/packages/admin-ui/src/layout/index.ts +10 -0
  146. package/templates/default/packages/admin-ui/src/layout/main.tsx +23 -0
  147. package/templates/default/packages/admin-ui/src/layout/nav-group.tsx +111 -0
  148. package/templates/default/packages/admin-ui/src/layout/nav-user.tsx +114 -0
  149. package/templates/default/packages/admin-ui/src/layout/theme-switch.tsx +40 -0
  150. package/templates/default/packages/admin-ui/src/layout/types.ts +21 -0
  151. package/templates/default/packages/admin-ui/src/lib/utils.ts +6 -0
  152. package/templates/default/packages/admin-ui/src/styles/base.css +65 -0
  153. package/templates/default/packages/admin-ui/src/styles/tokens.css +91 -0
  154. package/templates/default/packages/admin-ui/src/tanstack-table.d.ts +10 -0
  155. package/templates/default/packages/admin-ui/src/ui/alert-dialog.tsx +157 -0
  156. package/templates/default/packages/admin-ui/src/ui/alert.tsx +66 -0
  157. package/templates/default/packages/admin-ui/src/ui/avatar.tsx +53 -0
  158. package/templates/default/packages/admin-ui/src/ui/badge.tsx +46 -0
  159. package/templates/default/packages/admin-ui/src/ui/breadcrumb.tsx +108 -0
  160. package/templates/default/packages/admin-ui/src/ui/button.tsx +59 -0
  161. package/templates/default/packages/admin-ui/src/ui/calendar.tsx +69 -0
  162. package/templates/default/packages/admin-ui/src/ui/card.tsx +92 -0
  163. package/templates/default/packages/admin-ui/src/ui/chart.tsx +345 -0
  164. package/templates/default/packages/admin-ui/src/ui/checkbox.tsx +32 -0
  165. package/templates/default/packages/admin-ui/src/ui/collapsible.tsx +27 -0
  166. package/templates/default/packages/admin-ui/src/ui/command.tsx +161 -0
  167. package/templates/default/packages/admin-ui/src/ui/confirm-dialog.tsx +72 -0
  168. package/templates/default/packages/admin-ui/src/ui/date-picker.tsx +53 -0
  169. package/templates/default/packages/admin-ui/src/ui/dialog.tsx +143 -0
  170. package/templates/default/packages/admin-ui/src/ui/dropdown-menu.tsx +257 -0
  171. package/templates/default/packages/admin-ui/src/ui/form.tsx +168 -0
  172. package/templates/default/packages/admin-ui/src/ui/input-otp.tsx +84 -0
  173. package/templates/default/packages/admin-ui/src/ui/input.tsx +21 -0
  174. package/templates/default/packages/admin-ui/src/ui/label.tsx +24 -0
  175. package/templates/default/packages/admin-ui/src/ui/pagination.tsx +126 -0
  176. package/templates/default/packages/admin-ui/src/ui/password-input.tsx +46 -0
  177. package/templates/default/packages/admin-ui/src/ui/popover.tsx +48 -0
  178. package/templates/default/packages/admin-ui/src/ui/progress.tsx +31 -0
  179. package/templates/default/packages/admin-ui/src/ui/radio-group.tsx +45 -0
  180. package/templates/default/packages/admin-ui/src/ui/scroll-area.tsx +52 -0
  181. package/templates/default/packages/admin-ui/src/ui/select.tsx +185 -0
  182. package/templates/default/packages/admin-ui/src/ui/separator.tsx +28 -0
  183. package/templates/default/packages/admin-ui/src/ui/sheet.tsx +149 -0
  184. package/templates/default/packages/admin-ui/src/ui/sidebar.tsx +728 -0
  185. package/templates/default/packages/admin-ui/src/ui/skeleton.tsx +13 -0
  186. package/templates/default/packages/admin-ui/src/ui/sonner.tsx +25 -0
  187. package/templates/default/packages/admin-ui/src/ui/switch.tsx +31 -0
  188. package/templates/default/packages/admin-ui/src/ui/table.tsx +116 -0
  189. package/templates/default/packages/admin-ui/src/ui/tabs.tsx +66 -0
  190. package/templates/default/packages/admin-ui/src/ui/textarea.tsx +18 -0
  191. package/templates/default/packages/admin-ui/src/ui/toggle-group.tsx +60 -0
  192. package/templates/default/packages/admin-ui/src/ui/toggle.tsx +44 -0
  193. package/templates/default/packages/admin-ui/src/ui/tooltip.tsx +61 -0
  194. package/templates/default/packages/admin-ui/tsconfig.json +8 -0
  195. package/templates/default/packages/admin-ui/vite.config.ts +11 -0
  196. package/templates/default/packages/config/package.json +0 -2
  197. package/templates/default/packages/server-core/package.json +1 -0
  198. package/templates/default/packages/ui/components.json +21 -0
  199. package/templates/default/packages/ui/package.json +42 -5
  200. package/templates/default/packages/ui/src/accordion.tsx +1 -1
  201. package/templates/default/packages/ui/src/alert-dialog.tsx +4 -4
  202. package/templates/default/packages/ui/src/alert.tsx +1 -1
  203. package/templates/default/packages/ui/src/avatar.tsx +1 -1
  204. package/templates/default/packages/ui/src/badge.tsx +1 -1
  205. package/templates/default/packages/ui/src/breadcrumb.tsx +1 -1
  206. package/templates/default/packages/ui/src/button.tsx +1 -1
  207. package/templates/default/packages/ui/src/card.tsx +1 -1
  208. package/templates/default/packages/ui/src/checkbox.tsx +1 -1
  209. package/templates/default/packages/ui/src/dialog.tsx +3 -3
  210. package/templates/default/packages/ui/src/drawer.tsx +3 -3
  211. package/templates/default/packages/ui/src/dropdown-menu.tsx +3 -3
  212. package/templates/default/packages/ui/src/form.tsx +2 -2
  213. package/templates/default/packages/ui/src/hover-card.tsx +2 -2
  214. package/templates/default/packages/ui/src/input.tsx +1 -1
  215. package/templates/default/packages/ui/src/label.tsx +1 -1
  216. package/templates/default/packages/ui/src/pagination.tsx +2 -2
  217. package/templates/default/packages/ui/src/popover.tsx +2 -2
  218. package/templates/default/packages/ui/src/progress.tsx +1 -1
  219. package/templates/default/packages/ui/src/select.tsx +2 -2
  220. package/templates/default/packages/ui/src/separator.tsx +1 -1
  221. package/templates/default/packages/ui/src/skeleton.tsx +1 -1
  222. package/templates/default/packages/ui/src/table.tsx +1 -1
  223. package/templates/default/packages/ui/src/tabs.tsx +1 -1
  224. package/templates/default/packages/ui/src/textarea.tsx +1 -1
  225. package/templates/default/packages/ui/src/tooltip.tsx +3 -3
  226. package/templates/default/packages/ui/src/typography.tsx +1 -1
  227. package/templates/default/packages/ui/tsconfig.json +1 -6
  228. package/templates/default/pnpm-lock.yaml +1319 -936
  229. package/templates/default/postcss.config.cjs +0 -1
  230. package/templates/default/turbo.json +11 -5
  231. package/templates/default/worktree.config.json +5 -0
  232. package/templates/default/.env.ci +0 -32
  233. package/templates/default/.github/workflows/ci.yml +0 -96
  234. package/templates/default/.github/workflows/preview-db.yml +0 -134
  235. package/templates/default/.playwright-mcp/dashboard.png +0 -0
  236. package/templates/default/.playwright-mcp/web-home.png +0 -0
  237. package/templates/default/apps/web/panda.config.ts +0 -114
  238. package/templates/default/apps/web/src/components/ui/accordion.tsx +0 -64
  239. package/templates/default/apps/web/src/components/ui/alert-dialog.tsx +0 -135
  240. package/templates/default/apps/web/src/components/ui/alert.tsx +0 -60
  241. package/templates/default/apps/web/src/components/ui/aspect-ratio.tsx +0 -9
  242. package/templates/default/apps/web/src/components/ui/avatar.tsx +0 -41
  243. package/templates/default/apps/web/src/components/ui/badge.tsx +0 -39
  244. package/templates/default/apps/web/src/components/ui/breadcrumb.tsx +0 -101
  245. package/templates/default/apps/web/src/components/ui/button.tsx +0 -56
  246. package/templates/default/apps/web/src/components/ui/card.tsx +0 -75
  247. package/templates/default/apps/web/src/components/ui/checkbox.tsx +0 -29
  248. package/templates/default/apps/web/src/components/ui/data-table.tsx +0 -189
  249. package/templates/default/apps/web/src/components/ui/dialog-hook.tsx +0 -210
  250. package/templates/default/apps/web/src/components/ui/dialog.tsx +0 -129
  251. package/templates/default/apps/web/src/components/ui/drawer.tsx +0 -124
  252. package/templates/default/apps/web/src/components/ui/dropdown-menu.tsx +0 -228
  253. package/templates/default/apps/web/src/components/ui/form.tsx +0 -152
  254. package/templates/default/apps/web/src/components/ui/hover-card.tsx +0 -38
  255. package/templates/default/apps/web/src/components/ui/input.tsx +0 -21
  256. package/templates/default/apps/web/src/components/ui/label.tsx +0 -21
  257. package/templates/default/apps/web/src/components/ui/pagination.tsx +0 -105
  258. package/templates/default/apps/web/src/components/ui/popover.tsx +0 -42
  259. package/templates/default/apps/web/src/components/ui/progress.tsx +0 -28
  260. package/templates/default/apps/web/src/components/ui/select.tsx +0 -170
  261. package/templates/default/apps/web/src/components/ui/separator.tsx +0 -28
  262. package/templates/default/apps/web/src/components/ui/skeleton.tsx +0 -13
  263. package/templates/default/apps/web/src/components/ui/sonner.tsx +0 -25
  264. package/templates/default/apps/web/src/components/ui/table.tsx +0 -92
  265. package/templates/default/apps/web/src/components/ui/tabs.tsx +0 -54
  266. package/templates/default/apps/web/src/components/ui/textarea.tsx +0 -18
  267. package/templates/default/apps/web/src/components/ui/tooltip.tsx +0 -57
  268. package/templates/default/apps/web/src/components/ui/typography.tsx +0 -158
  269. package/templates/default/packages/config/panda.config.ts +0 -114
  270. package/templates/default/panda.config.ts +0 -114
@@ -0,0 +1,145 @@
1
+ "use client";
2
+
3
+ import { zodResolver } from "@hookform/resolvers/zod";
4
+ import { cn } from "{{packageName}}/admin-ui/lib/utils";
5
+ import { Button } from "{{packageName}}/admin-ui/ui/button";
6
+ import {
7
+ Card,
8
+ CardContent,
9
+ CardDescription,
10
+ CardFooter,
11
+ CardHeader,
12
+ CardTitle,
13
+ } from "{{packageName}}/admin-ui/ui/card";
14
+ import {
15
+ Form,
16
+ FormControl,
17
+ FormField,
18
+ FormItem,
19
+ FormLabel,
20
+ FormMessage,
21
+ } from "{{packageName}}/admin-ui/ui/form";
22
+ import { Input } from "{{packageName}}/admin-ui/ui/input";
23
+ import { PasswordInput } from "{{packageName}}/admin-ui/ui/password-input";
24
+ import { Separator } from "{{packageName}}/admin-ui/ui/separator";
25
+ import { Loader2, LogIn } from "lucide-react";
26
+ import Link from "next/link";
27
+ import { useState } from "react";
28
+ import { useForm } from "react-hook-form";
29
+ import { z } from "zod";
30
+
31
+ const formSchema = z.object({
32
+ email: z.string().email("Invalid email address").min(1, "Please enter your email"),
33
+ password: z
34
+ .string()
35
+ .min(1, "Please enter your password")
36
+ .min(7, "Password must be at least 7 characters long"),
37
+ });
38
+
39
+ export default function SignInPage() {
40
+ const [isLoading, setIsLoading] = useState(false);
41
+
42
+ const form = useForm<z.infer<typeof formSchema>>({
43
+ resolver: zodResolver(formSchema),
44
+ defaultValues: {
45
+ email: "",
46
+ password: "",
47
+ },
48
+ });
49
+
50
+ function onSubmit(data: z.infer<typeof formSchema>) {
51
+ setIsLoading(true);
52
+ console.log("Sign In Data:", data);
53
+
54
+ // Simulate async operation
55
+ setTimeout(() => {
56
+ setIsLoading(false);
57
+ alert(`Welcome back, ${data.email}!`);
58
+ }, 2000);
59
+ }
60
+
61
+ return (
62
+ <Card className="gap-4">
63
+ <CardHeader>
64
+ <CardTitle className="text-lg tracking-tight">Sign in</CardTitle>
65
+ <CardDescription>
66
+ Enter your email and password below to <br />
67
+ log into your account
68
+ </CardDescription>
69
+ </CardHeader>
70
+ <CardContent>
71
+ <Form {...form}>
72
+ <form onSubmit={form.handleSubmit(onSubmit)} className={cn("grid gap-3")}>
73
+ <FormField
74
+ control={form.control}
75
+ name="email"
76
+ render={({ field }) => (
77
+ <FormItem>
78
+ <FormLabel>Email</FormLabel>
79
+ <FormControl>
80
+ <Input placeholder="name@example.com" {...field} />
81
+ </FormControl>
82
+ <FormMessage />
83
+ </FormItem>
84
+ )}
85
+ />
86
+ <FormField
87
+ control={form.control}
88
+ name="password"
89
+ render={({ field }) => (
90
+ <FormItem className="relative">
91
+ <FormLabel>Password</FormLabel>
92
+ <FormControl>
93
+ <PasswordInput placeholder="********" {...field} />
94
+ </FormControl>
95
+ <FormMessage />
96
+ <Link
97
+ href="/forgot-password"
98
+ className="absolute end-0 -top-0.5 text-sm font-medium text-muted-foreground hover:opacity-75"
99
+ >
100
+ Forgot password?
101
+ </Link>
102
+ </FormItem>
103
+ )}
104
+ />
105
+ <Button className="mt-2" disabled={isLoading}>
106
+ {isLoading ? <Loader2 className="animate-spin" /> : <LogIn />}
107
+ Sign in
108
+ </Button>
109
+
110
+ <div className="relative my-2">
111
+ <div className="absolute inset-0 flex items-center">
112
+ <Separator />
113
+ </div>
114
+ <div className="relative flex justify-center text-xs uppercase">
115
+ <span className="bg-background px-2 text-muted-foreground">Or continue with</span>
116
+ </div>
117
+ </div>
118
+
119
+ <div className="grid grid-cols-2 gap-2">
120
+ <Button variant="outline" type="button" disabled={isLoading}>
121
+ GitHub
122
+ </Button>
123
+ <Button variant="outline" type="button" disabled={isLoading}>
124
+ Google
125
+ </Button>
126
+ </div>
127
+ </form>
128
+ </Form>
129
+ </CardContent>
130
+ <CardFooter>
131
+ <p className="px-8 text-center text-sm text-muted-foreground">
132
+ By clicking sign in, you agree to our{" "}
133
+ <a href="/terms" className="underline underline-offset-4 hover:text-primary">
134
+ Terms of Service
135
+ </a>{" "}
136
+ and{" "}
137
+ <a href="/privacy" className="underline underline-offset-4 hover:text-primary">
138
+ Privacy Policy
139
+ </a>
140
+ .
141
+ </p>
142
+ </CardFooter>
143
+ </Card>
144
+ );
145
+ }
@@ -0,0 +1,199 @@
1
+ "use client";
2
+
3
+ import { zodResolver } from "@hookform/resolvers/zod";
4
+ import { cn } from "{{packageName}}/admin-ui/lib/utils";
5
+ import { Button } from "{{packageName}}/admin-ui/ui/button";
6
+ import {
7
+ Card,
8
+ CardContent,
9
+ CardDescription,
10
+ CardFooter,
11
+ CardHeader,
12
+ CardTitle,
13
+ } from "{{packageName}}/admin-ui/ui/card";
14
+ import { Checkbox } from "{{packageName}}/admin-ui/ui/checkbox";
15
+ import {
16
+ Form,
17
+ FormControl,
18
+ FormField,
19
+ FormItem,
20
+ FormLabel,
21
+ FormMessage,
22
+ } from "{{packageName}}/admin-ui/ui/form";
23
+ import { Input } from "{{packageName}}/admin-ui/ui/input";
24
+ import { PasswordInput } from "{{packageName}}/admin-ui/ui/password-input";
25
+ import { Separator } from "{{packageName}}/admin-ui/ui/separator";
26
+ import Link from "next/link";
27
+ import { useState } from "react";
28
+ import { useForm } from "react-hook-form";
29
+ import { z } from "zod";
30
+
31
+ const formSchema = z
32
+ .object({
33
+ name: z.string().min(1, "Please enter your name"),
34
+ email: z.string().email("Invalid email address").min(1, "Please enter your email"),
35
+ password: z
36
+ .string()
37
+ .min(1, "Please enter your password")
38
+ .min(7, "Password must be at least 7 characters long"),
39
+ confirmPassword: z.string().min(1, "Please confirm your password"),
40
+ terms: z.boolean().refine((val) => val === true, {
41
+ message: "You must accept the terms and conditions",
42
+ }),
43
+ })
44
+ .refine((data) => data.password === data.confirmPassword, {
45
+ message: "Passwords don't match",
46
+ path: ["confirmPassword"],
47
+ });
48
+
49
+ export default function SignUpPage() {
50
+ const [isLoading, setIsLoading] = useState(false);
51
+
52
+ const form = useForm<z.infer<typeof formSchema>>({
53
+ resolver: zodResolver(formSchema),
54
+ defaultValues: {
55
+ name: "",
56
+ email: "",
57
+ password: "",
58
+ confirmPassword: "",
59
+ terms: false,
60
+ },
61
+ });
62
+
63
+ function onSubmit(data: z.infer<typeof formSchema>) {
64
+ setIsLoading(true);
65
+ console.log("Sign Up Data:", data);
66
+
67
+ setTimeout(() => {
68
+ setIsLoading(false);
69
+ alert(`Account created for ${data.email}!`);
70
+ }, 2000);
71
+ }
72
+
73
+ return (
74
+ <Card className="gap-4">
75
+ <CardHeader>
76
+ <CardTitle className="text-lg tracking-tight">Create an account</CardTitle>
77
+ <CardDescription>
78
+ Enter your email and password to create an account. <br />
79
+ Already have an account?{" "}
80
+ <Link href="/sign-in" className="underline underline-offset-4 hover:text-primary">
81
+ Sign In
82
+ </Link>
83
+ </CardDescription>
84
+ </CardHeader>
85
+ <CardContent>
86
+ <Form {...form}>
87
+ <form onSubmit={form.handleSubmit(onSubmit)} className={cn("grid gap-3")}>
88
+ <FormField
89
+ control={form.control}
90
+ name="name"
91
+ render={({ field }) => (
92
+ <FormItem>
93
+ <FormLabel>Name</FormLabel>
94
+ <FormControl>
95
+ <Input placeholder="John Doe" {...field} />
96
+ </FormControl>
97
+ <FormMessage />
98
+ </FormItem>
99
+ )}
100
+ />
101
+ <FormField
102
+ control={form.control}
103
+ name="email"
104
+ render={({ field }) => (
105
+ <FormItem>
106
+ <FormLabel>Email</FormLabel>
107
+ <FormControl>
108
+ <Input placeholder="name@example.com" {...field} />
109
+ </FormControl>
110
+ <FormMessage />
111
+ </FormItem>
112
+ )}
113
+ />
114
+ <FormField
115
+ control={form.control}
116
+ name="password"
117
+ render={({ field }) => (
118
+ <FormItem>
119
+ <FormLabel>Password</FormLabel>
120
+ <FormControl>
121
+ <PasswordInput placeholder="********" {...field} />
122
+ </FormControl>
123
+ <FormMessage />
124
+ </FormItem>
125
+ )}
126
+ />
127
+ <FormField
128
+ control={form.control}
129
+ name="confirmPassword"
130
+ render={({ field }) => (
131
+ <FormItem>
132
+ <FormLabel>Confirm Password</FormLabel>
133
+ <FormControl>
134
+ <PasswordInput placeholder="********" {...field} />
135
+ </FormControl>
136
+ <FormMessage />
137
+ </FormItem>
138
+ )}
139
+ />
140
+ <FormField
141
+ control={form.control}
142
+ name="terms"
143
+ render={({ field }) => (
144
+ <FormItem className="flex flex-row items-start space-x-3 space-y-0">
145
+ <FormControl>
146
+ <Checkbox checked={field.value} onCheckedChange={field.onChange} />
147
+ </FormControl>
148
+ <div className="space-y-1 leading-none">
149
+ <FormLabel>
150
+ I agree to the{" "}
151
+ <a href="/terms" className="underline underline-offset-4 hover:text-primary">
152
+ Terms and Conditions
153
+ </a>
154
+ </FormLabel>
155
+ <FormMessage />
156
+ </div>
157
+ </FormItem>
158
+ )}
159
+ />
160
+ <Button className="mt-2" disabled={isLoading}>
161
+ Create Account
162
+ </Button>
163
+
164
+ <div className="relative my-2">
165
+ <div className="absolute inset-0 flex items-center">
166
+ <Separator />
167
+ </div>
168
+ <div className="relative flex justify-center text-xs uppercase">
169
+ <span className="bg-background px-2 text-muted-foreground">Or continue with</span>
170
+ </div>
171
+ </div>
172
+
173
+ <div className="grid grid-cols-2 gap-2">
174
+ <Button variant="outline" className="w-full" type="button" disabled={isLoading}>
175
+ GitHub
176
+ </Button>
177
+ <Button variant="outline" className="w-full" type="button" disabled={isLoading}>
178
+ Google
179
+ </Button>
180
+ </div>
181
+ </form>
182
+ </Form>
183
+ </CardContent>
184
+ <CardFooter>
185
+ <p className="px-8 text-center text-sm text-muted-foreground">
186
+ By creating an account, you agree to our{" "}
187
+ <a href="/terms" className="underline underline-offset-4 hover:text-primary">
188
+ Terms of Service
189
+ </a>{" "}
190
+ and{" "}
191
+ <a href="/privacy" className="underline underline-offset-4 hover:text-primary">
192
+ Privacy Policy
193
+ </a>
194
+ .
195
+ </p>
196
+ </CardFooter>
197
+ </Card>
198
+ );
199
+ }
@@ -0,0 +1,27 @@
1
+ import { Button } from "{{packageName}}/admin-ui/ui/button";
2
+ import type { Metadata } from "next";
3
+ import Link from "next/link";
4
+
5
+ export const metadata: Metadata = {
6
+ title: "401 - Unauthorized",
7
+ description: "Unauthorized Access",
8
+ };
9
+
10
+ export default function UnauthorizedPage() {
11
+ return (
12
+ <div className="h-svh">
13
+ <div className="m-auto flex h-full w-full flex-col items-center justify-center gap-2">
14
+ <h1 className="text-[7rem] font-bold leading-tight">401</h1>
15
+ <span className="font-medium">Unauthorized Access</span>
16
+ <p className="text-center text-muted-foreground">
17
+ Please log in with the appropriate credentials <br /> to access this resource.
18
+ </p>
19
+ <div className="mt-6 flex gap-4">
20
+ <Button variant="outline" asChild>
21
+ <Link href="/dashboard">Back to Home</Link>
22
+ </Button>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ );
27
+ }
@@ -0,0 +1,28 @@
1
+ import { Button } from "{{packageName}}/admin-ui/ui/button";
2
+ import type { Metadata } from "next";
3
+ import Link from "next/link";
4
+
5
+ export const metadata: Metadata = {
6
+ title: "403 - Forbidden",
7
+ description: "Access Forbidden",
8
+ };
9
+
10
+ export default function ForbiddenPage() {
11
+ return (
12
+ <div className="h-svh">
13
+ <div className="m-auto flex h-full w-full flex-col items-center justify-center gap-2">
14
+ <h1 className="text-[7rem] font-bold leading-tight">403</h1>
15
+ <span className="font-medium">Access Forbidden</span>
16
+ <p className="text-center text-muted-foreground">
17
+ You don't have necessary permission <br />
18
+ to view this resource.
19
+ </p>
20
+ <div className="mt-6 flex gap-4">
21
+ <Button variant="outline" asChild>
22
+ <Link href="/dashboard">Back to Home</Link>
23
+ </Button>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ );
28
+ }
@@ -0,0 +1,29 @@
1
+ import { Button } from "{{packageName}}/admin-ui/ui/button";
2
+ import type { Metadata } from "next";
3
+ import Link from "next/link";
4
+
5
+ export const metadata: Metadata = {
6
+ title: "500 - Internal Server Error",
7
+ description: "Something went wrong",
8
+ };
9
+
10
+ export const dynamic = "force-dynamic";
11
+
12
+ export default function InternalServerErrorPage() {
13
+ return (
14
+ <div className="h-svh">
15
+ <div className="m-auto flex h-full w-full flex-col items-center justify-center gap-2">
16
+ <h1 className="text-[7rem] font-bold leading-tight">500</h1>
17
+ <span className="font-medium">Oops! Something went wrong {":)"}</span>
18
+ <p className="text-center text-muted-foreground">
19
+ We apologize for the inconvenience. <br /> Please try again later.
20
+ </p>
21
+ <div className="mt-6 flex gap-4">
22
+ <Button variant="outline" asChild>
23
+ <Link href="/dashboard">Back to Home</Link>
24
+ </Button>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ );
29
+ }
@@ -0,0 +1,7 @@
1
+ export default function ErrorsLayout({
2
+ children,
3
+ }: {
4
+ children: React.ReactNode;
5
+ }) {
6
+ return <div className="flex min-h-screen flex-col items-center justify-center">{children}</div>;
7
+ }
@@ -0,0 +1,25 @@
1
+ import { Button } from "{{packageName}}/admin-ui/ui/button";
2
+ import type { Metadata } from "next";
3
+
4
+ export const metadata: Metadata = {
5
+ title: "503 - Maintenance",
6
+ description: "Website is under maintenance",
7
+ };
8
+
9
+ export default function MaintenancePage() {
10
+ return (
11
+ <div className="h-svh">
12
+ <div className="m-auto flex h-full w-full flex-col items-center justify-center gap-2">
13
+ <h1 className="text-[7rem] font-bold leading-tight">503</h1>
14
+ <span className="font-medium">Website is under maintenance!</span>
15
+ <p className="text-center text-muted-foreground">
16
+ The site is not available at the moment. <br />
17
+ We'll be back online shortly.
18
+ </p>
19
+ <div className="mt-6 flex gap-4">
20
+ <Button variant="outline">Learn more</Button>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ );
25
+ }
@@ -0,0 +1,68 @@
1
+ "use client";
2
+
3
+ import { Area, AreaChart, ResponsiveContainer, XAxis, YAxis } from "recharts";
4
+
5
+ const data = [
6
+ {
7
+ name: "Mon",
8
+ clicks: Math.floor(Math.random() * 900) + 100,
9
+ uniques: Math.floor(Math.random() * 700) + 80,
10
+ },
11
+ {
12
+ name: "Tue",
13
+ clicks: Math.floor(Math.random() * 900) + 100,
14
+ uniques: Math.floor(Math.random() * 700) + 80,
15
+ },
16
+ {
17
+ name: "Wed",
18
+ clicks: Math.floor(Math.random() * 900) + 100,
19
+ uniques: Math.floor(Math.random() * 700) + 80,
20
+ },
21
+ {
22
+ name: "Thu",
23
+ clicks: Math.floor(Math.random() * 900) + 100,
24
+ uniques: Math.floor(Math.random() * 700) + 80,
25
+ },
26
+ {
27
+ name: "Fri",
28
+ clicks: Math.floor(Math.random() * 900) + 100,
29
+ uniques: Math.floor(Math.random() * 700) + 80,
30
+ },
31
+ {
32
+ name: "Sat",
33
+ clicks: Math.floor(Math.random() * 900) + 100,
34
+ uniques: Math.floor(Math.random() * 700) + 80,
35
+ },
36
+ {
37
+ name: "Sun",
38
+ clicks: Math.floor(Math.random() * 900) + 100,
39
+ uniques: Math.floor(Math.random() * 700) + 80,
40
+ },
41
+ ];
42
+
43
+ export function AnalyticsChart() {
44
+ return (
45
+ <ResponsiveContainer width="100%" height={300}>
46
+ <AreaChart data={data}>
47
+ <XAxis dataKey="name" stroke="#888888" fontSize={12} tickLine={false} axisLine={false} />
48
+ <YAxis stroke="#888888" fontSize={12} tickLine={false} axisLine={false} />
49
+ <Area
50
+ type="monotone"
51
+ dataKey="clicks"
52
+ stroke="currentColor"
53
+ className="text-primary"
54
+ fill="currentColor"
55
+ fillOpacity={0.15}
56
+ />
57
+ <Area
58
+ type="monotone"
59
+ dataKey="uniques"
60
+ stroke="currentColor"
61
+ className="text-muted-foreground"
62
+ fill="currentColor"
63
+ fillOpacity={0.1}
64
+ />
65
+ </AreaChart>
66
+ </ResponsiveContainer>
67
+ );
68
+ }