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.
- package/package.json +2 -2
- package/templates/default/.claude/hooks/einja/playwright-resize.sh +12 -2
- package/templates/default/.claude/settings.json +15 -0
- package/templates/default/.cursor/commands/task-vibe-kanban-loop.md +107 -42
- package/templates/default/.env.develop +0 -4
- package/templates/default/.env.example +1 -0
- package/templates/default/.env.preview +0 -4
- package/templates/default/.env.staging +19 -0
- package/templates/default/.github/actions/ci/action.yml +39 -0
- package/templates/default/.github/actions/migrate/action.yml +39 -0
- package/templates/default/.github/actions/neon-export-env/action.yml +28 -0
- package/templates/default/.github/actions/setup/action.yml +20 -0
- package/templates/default/.github/workflows/claude.yml +1 -0
- package/templates/default/.github/workflows/{cleanup-neon-branches.yml → cleanup-pr-preview-db.yml} +28 -24
- package/templates/default/.github/workflows/cleanup-pr-preview-on-close.yml +50 -0
- package/templates/default/.github/workflows/deploy-pr-preview.yml +398 -0
- package/templates/default/.github/workflows/deploy-stable-branches.yml +259 -0
- package/templates/default/.github/workflows/release-create-einja-app.yml +95 -0
- package/templates/default/.mcp.json +6 -9
- package/templates/default/CLAUDE.md +46 -9
- package/templates/default/README.md +5 -14
- package/templates/default/apps/admin/next.config.ts +11 -0
- package/templates/default/apps/admin/package.json +55 -0
- package/templates/default/apps/admin/postcss.config.cjs +5 -0
- package/templates/default/apps/admin/src/app/(auth)/forgot-password/page.tsx +97 -0
- package/templates/default/apps/admin/src/app/(auth)/layout.tsx +18 -0
- package/templates/default/apps/admin/src/app/(auth)/otp/page.tsx +121 -0
- package/templates/default/apps/admin/src/app/(auth)/sign-in/page.tsx +145 -0
- package/templates/default/apps/admin/src/app/(auth)/sign-up/page.tsx +199 -0
- package/templates/default/apps/admin/src/app/(errors)/401/page.tsx +27 -0
- package/templates/default/apps/admin/src/app/(errors)/403/page.tsx +28 -0
- package/templates/default/apps/admin/src/app/(errors)/500/page.tsx +29 -0
- package/templates/default/apps/admin/src/app/(errors)/layout.tsx +7 -0
- package/templates/default/apps/admin/src/app/(errors)/maintenance/page.tsx +25 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/analytics-chart.tsx +68 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/analytics.tsx +182 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/dashboard-page.tsx +74 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/metric-cards.tsx +49 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/overview-chart.tsx +73 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/recent-sales.tsx +75 -0
- package/templates/default/apps/admin/src/app/dashboard/apps/_components/apps-page.tsx +135 -0
- package/templates/default/apps/admin/src/app/dashboard/apps/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-list.tsx +82 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-messages.tsx +194 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/chats-page.tsx +99 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/new-chat.tsx +118 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/dashboard/layout.tsx +9 -0
- package/templates/default/apps/admin/src/app/dashboard/not-found.tsx +14 -0
- package/templates/default/apps/admin/src/app/dashboard/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/_components/content-section.tsx +20 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/_components/sidebar-nav.tsx +66 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/account/page.tsx +173 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/appearance/page.tsx +156 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/display/page.tsx +125 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/layout.tsx +30 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/notifications/page.tsx +196 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/page.tsx +5 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/profile/page.tsx +176 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-bulk-actions.tsx +183 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-row-actions.tsx +79 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-columns.tsx +107 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-dialogs.tsx +71 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-import-dialog.tsx +106 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-multi-delete-dialog.tsx +90 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-mutate-drawer.tsx +207 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-page.tsx +31 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-primary-buttons.tsx +19 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-provider.tsx +37 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-table.tsx +155 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/page.tsx +14 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-bulk-actions.tsx +136 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-row-actions.tsx +62 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-action-dialog.tsx +297 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-columns.tsx +121 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-delete-dialog.tsx +72 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-dialogs.tsx +49 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-invite-dialog.tsx +139 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-multi-delete-dialog.tsx +89 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-page.tsx +30 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-primary-buttons.tsx +19 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-provider.tsx +35 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-table.tsx +157 -0
- package/templates/default/apps/admin/src/app/dashboard/users/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/globals.css +109 -0
- package/templates/default/apps/admin/src/app/layout.tsx +32 -0
- package/templates/default/apps/admin/src/app/not-found.tsx +14 -0
- package/templates/default/apps/admin/src/app/page.tsx +5 -0
- package/templates/default/apps/admin/src/components/layout/admin-layout.tsx +16 -0
- package/templates/default/apps/admin/src/components/layout/app-sidebar.tsx +52 -0
- package/templates/default/apps/admin/src/components/layout/nav-config.ts +131 -0
- package/templates/default/apps/admin/src/components/providers/theme-provider.tsx +10 -0
- package/templates/default/apps/admin/src/components/shared/long-text.tsx +78 -0
- package/templates/default/apps/admin/src/components/shared/search-input.tsx +16 -0
- package/templates/default/apps/admin/src/components/shared/select-dropdown.tsx +64 -0
- package/templates/default/apps/admin/src/data/apps.tsx +116 -0
- package/templates/default/apps/admin/src/data/chats.ts +114 -0
- package/templates/default/apps/admin/src/data/tasks.ts +114 -0
- package/templates/default/apps/admin/src/data/users.ts +90 -0
- package/templates/default/apps/admin/src/hooks/use-dialog-state.ts +17 -0
- package/templates/default/apps/admin/src/hooks/use-table-url-state.ts +243 -0
- package/templates/default/apps/admin/src/lib/show-submitted-data.tsx +12 -0
- package/templates/default/apps/admin/src/types/table.d.ts +9 -0
- package/templates/default/apps/admin/tsconfig.json +32 -0
- package/templates/default/apps/web/next.config.ts +1 -0
- package/templates/default/apps/web/package.json +0 -22
- package/templates/default/apps/web/postcss.config.cjs +0 -1
- package/templates/default/apps/web/src/app/(authenticated)/dashboard/page.tsx +4 -20
- package/templates/default/apps/web/src/app/(authenticated)/data/_components/UserTable.tsx +4 -4
- package/templates/default/apps/web/src/app/(authenticated)/data/page.tsx +1 -1
- package/templates/default/apps/web/src/app/(authenticated)/profile/page.tsx +1 -1
- package/templates/default/apps/web/src/app/error.tsx +8 -70
- package/templates/default/apps/web/src/app/global-error.tsx +8 -70
- package/templates/default/apps/web/src/app/globals.css +20 -0
- package/templates/default/apps/web/src/app/not-found.tsx +5 -39
- package/templates/default/apps/web/src/app/page.tsx +27 -203
- package/templates/default/apps/web/src/app/signin/page.tsx +27 -191
- package/templates/default/apps/web/src/app/signup/page.tsx +33 -240
- package/templates/default/apps/web/src/components/dashboard/dashboard-stats.tsx +11 -75
- package/templates/default/apps/web/src/components/shared/Sidebar.tsx +3 -3
- package/templates/default/apps/web/src/components/shared/header.tsx +17 -112
- package/templates/default/apps/web/tsconfig.json +0 -6
- package/templates/default/biome.json +1 -2
- package/templates/default/components.json +2 -2
- package/templates/default/docker-compose.yml +1 -1
- package/templates/default/gitignore +4 -0
- package/templates/default/package.json +1 -0
- package/templates/default/packages/admin-ui/catalog/catalog.css +54 -0
- package/templates/default/packages/admin-ui/catalog/catalog.tsx +401 -0
- package/templates/default/packages/admin-ui/catalog/index.html +12 -0
- package/templates/default/packages/admin-ui/catalog/main.tsx +9 -0
- package/templates/default/packages/admin-ui/components.json +21 -0
- package/templates/default/packages/admin-ui/package.json +105 -0
- package/templates/default/packages/admin-ui/src/command-menu/index.tsx +174 -0
- package/templates/default/packages/admin-ui/src/data-table/bulk-actions.tsx +215 -0
- package/templates/default/packages/admin-ui/src/data-table/column-header.tsx +73 -0
- package/templates/default/packages/admin-ui/src/data-table/data-table.tsx +127 -0
- package/templates/default/packages/admin-ui/src/data-table/faceted-filter.tsx +148 -0
- package/templates/default/packages/admin-ui/src/data-table/index.tsx +9 -0
- package/templates/default/packages/admin-ui/src/data-table/pagination.tsx +101 -0
- package/templates/default/packages/admin-ui/src/data-table/toolbar.tsx +87 -0
- package/templates/default/packages/admin-ui/src/data-table/view-options.tsx +57 -0
- package/templates/default/packages/admin-ui/src/hooks/use-mobile.tsx +23 -0
- package/templates/default/packages/admin-ui/src/layout/header.tsx +55 -0
- package/templates/default/packages/admin-ui/src/layout/index.ts +10 -0
- package/templates/default/packages/admin-ui/src/layout/main.tsx +23 -0
- package/templates/default/packages/admin-ui/src/layout/nav-group.tsx +111 -0
- package/templates/default/packages/admin-ui/src/layout/nav-user.tsx +114 -0
- package/templates/default/packages/admin-ui/src/layout/theme-switch.tsx +40 -0
- package/templates/default/packages/admin-ui/src/layout/types.ts +21 -0
- package/templates/default/packages/admin-ui/src/lib/utils.ts +6 -0
- package/templates/default/packages/admin-ui/src/styles/base.css +65 -0
- package/templates/default/packages/admin-ui/src/styles/tokens.css +91 -0
- package/templates/default/packages/admin-ui/src/tanstack-table.d.ts +10 -0
- package/templates/default/packages/admin-ui/src/ui/alert-dialog.tsx +157 -0
- package/templates/default/packages/admin-ui/src/ui/alert.tsx +66 -0
- package/templates/default/packages/admin-ui/src/ui/avatar.tsx +53 -0
- package/templates/default/packages/admin-ui/src/ui/badge.tsx +46 -0
- package/templates/default/packages/admin-ui/src/ui/breadcrumb.tsx +108 -0
- package/templates/default/packages/admin-ui/src/ui/button.tsx +59 -0
- package/templates/default/packages/admin-ui/src/ui/calendar.tsx +69 -0
- package/templates/default/packages/admin-ui/src/ui/card.tsx +92 -0
- package/templates/default/packages/admin-ui/src/ui/chart.tsx +345 -0
- package/templates/default/packages/admin-ui/src/ui/checkbox.tsx +32 -0
- package/templates/default/packages/admin-ui/src/ui/collapsible.tsx +27 -0
- package/templates/default/packages/admin-ui/src/ui/command.tsx +161 -0
- package/templates/default/packages/admin-ui/src/ui/confirm-dialog.tsx +72 -0
- package/templates/default/packages/admin-ui/src/ui/date-picker.tsx +53 -0
- package/templates/default/packages/admin-ui/src/ui/dialog.tsx +143 -0
- package/templates/default/packages/admin-ui/src/ui/dropdown-menu.tsx +257 -0
- package/templates/default/packages/admin-ui/src/ui/form.tsx +168 -0
- package/templates/default/packages/admin-ui/src/ui/input-otp.tsx +84 -0
- package/templates/default/packages/admin-ui/src/ui/input.tsx +21 -0
- package/templates/default/packages/admin-ui/src/ui/label.tsx +24 -0
- package/templates/default/packages/admin-ui/src/ui/pagination.tsx +126 -0
- package/templates/default/packages/admin-ui/src/ui/password-input.tsx +46 -0
- package/templates/default/packages/admin-ui/src/ui/popover.tsx +48 -0
- package/templates/default/packages/admin-ui/src/ui/progress.tsx +31 -0
- package/templates/default/packages/admin-ui/src/ui/radio-group.tsx +45 -0
- package/templates/default/packages/admin-ui/src/ui/scroll-area.tsx +52 -0
- package/templates/default/packages/admin-ui/src/ui/select.tsx +185 -0
- package/templates/default/packages/admin-ui/src/ui/separator.tsx +28 -0
- package/templates/default/packages/admin-ui/src/ui/sheet.tsx +149 -0
- package/templates/default/packages/admin-ui/src/ui/sidebar.tsx +728 -0
- package/templates/default/packages/admin-ui/src/ui/skeleton.tsx +13 -0
- package/templates/default/packages/admin-ui/src/ui/sonner.tsx +25 -0
- package/templates/default/packages/admin-ui/src/ui/switch.tsx +31 -0
- package/templates/default/packages/admin-ui/src/ui/table.tsx +116 -0
- package/templates/default/packages/admin-ui/src/ui/tabs.tsx +66 -0
- package/templates/default/packages/admin-ui/src/ui/textarea.tsx +18 -0
- package/templates/default/packages/admin-ui/src/ui/toggle-group.tsx +60 -0
- package/templates/default/packages/admin-ui/src/ui/toggle.tsx +44 -0
- package/templates/default/packages/admin-ui/src/ui/tooltip.tsx +61 -0
- package/templates/default/packages/admin-ui/tsconfig.json +8 -0
- package/templates/default/packages/admin-ui/vite.config.ts +11 -0
- package/templates/default/packages/config/package.json +0 -2
- package/templates/default/packages/server-core/package.json +1 -0
- package/templates/default/packages/ui/components.json +21 -0
- package/templates/default/packages/ui/package.json +42 -5
- package/templates/default/packages/ui/src/accordion.tsx +1 -1
- package/templates/default/packages/ui/src/alert-dialog.tsx +4 -4
- package/templates/default/packages/ui/src/alert.tsx +1 -1
- package/templates/default/packages/ui/src/avatar.tsx +1 -1
- package/templates/default/packages/ui/src/badge.tsx +1 -1
- package/templates/default/packages/ui/src/breadcrumb.tsx +1 -1
- package/templates/default/packages/ui/src/button.tsx +1 -1
- package/templates/default/packages/ui/src/card.tsx +1 -1
- package/templates/default/packages/ui/src/checkbox.tsx +1 -1
- package/templates/default/packages/ui/src/dialog.tsx +3 -3
- package/templates/default/packages/ui/src/drawer.tsx +3 -3
- package/templates/default/packages/ui/src/dropdown-menu.tsx +3 -3
- package/templates/default/packages/ui/src/form.tsx +2 -2
- package/templates/default/packages/ui/src/hover-card.tsx +2 -2
- package/templates/default/packages/ui/src/input.tsx +1 -1
- package/templates/default/packages/ui/src/label.tsx +1 -1
- package/templates/default/packages/ui/src/pagination.tsx +2 -2
- package/templates/default/packages/ui/src/popover.tsx +2 -2
- package/templates/default/packages/ui/src/progress.tsx +1 -1
- package/templates/default/packages/ui/src/select.tsx +2 -2
- package/templates/default/packages/ui/src/separator.tsx +1 -1
- package/templates/default/packages/ui/src/skeleton.tsx +1 -1
- package/templates/default/packages/ui/src/table.tsx +1 -1
- package/templates/default/packages/ui/src/tabs.tsx +1 -1
- package/templates/default/packages/ui/src/textarea.tsx +1 -1
- package/templates/default/packages/ui/src/tooltip.tsx +3 -3
- package/templates/default/packages/ui/src/typography.tsx +1 -1
- package/templates/default/packages/ui/tsconfig.json +1 -6
- package/templates/default/pnpm-lock.yaml +1319 -936
- package/templates/default/postcss.config.cjs +0 -1
- package/templates/default/turbo.json +11 -5
- package/templates/default/worktree.config.json +5 -0
- package/templates/default/.env.ci +0 -32
- package/templates/default/.github/workflows/ci.yml +0 -96
- package/templates/default/.github/workflows/preview-db.yml +0 -134
- package/templates/default/.playwright-mcp/dashboard.png +0 -0
- package/templates/default/.playwright-mcp/web-home.png +0 -0
- package/templates/default/apps/web/panda.config.ts +0 -114
- package/templates/default/apps/web/src/components/ui/accordion.tsx +0 -64
- package/templates/default/apps/web/src/components/ui/alert-dialog.tsx +0 -135
- package/templates/default/apps/web/src/components/ui/alert.tsx +0 -60
- package/templates/default/apps/web/src/components/ui/aspect-ratio.tsx +0 -9
- package/templates/default/apps/web/src/components/ui/avatar.tsx +0 -41
- package/templates/default/apps/web/src/components/ui/badge.tsx +0 -39
- package/templates/default/apps/web/src/components/ui/breadcrumb.tsx +0 -101
- package/templates/default/apps/web/src/components/ui/button.tsx +0 -56
- package/templates/default/apps/web/src/components/ui/card.tsx +0 -75
- package/templates/default/apps/web/src/components/ui/checkbox.tsx +0 -29
- package/templates/default/apps/web/src/components/ui/data-table.tsx +0 -189
- package/templates/default/apps/web/src/components/ui/dialog-hook.tsx +0 -210
- package/templates/default/apps/web/src/components/ui/dialog.tsx +0 -129
- package/templates/default/apps/web/src/components/ui/drawer.tsx +0 -124
- package/templates/default/apps/web/src/components/ui/dropdown-menu.tsx +0 -228
- package/templates/default/apps/web/src/components/ui/form.tsx +0 -152
- package/templates/default/apps/web/src/components/ui/hover-card.tsx +0 -38
- package/templates/default/apps/web/src/components/ui/input.tsx +0 -21
- package/templates/default/apps/web/src/components/ui/label.tsx +0 -21
- package/templates/default/apps/web/src/components/ui/pagination.tsx +0 -105
- package/templates/default/apps/web/src/components/ui/popover.tsx +0 -42
- package/templates/default/apps/web/src/components/ui/progress.tsx +0 -28
- package/templates/default/apps/web/src/components/ui/select.tsx +0 -170
- package/templates/default/apps/web/src/components/ui/separator.tsx +0 -28
- package/templates/default/apps/web/src/components/ui/skeleton.tsx +0 -13
- package/templates/default/apps/web/src/components/ui/sonner.tsx +0 -25
- package/templates/default/apps/web/src/components/ui/table.tsx +0 -92
- package/templates/default/apps/web/src/components/ui/tabs.tsx +0 -54
- package/templates/default/apps/web/src/components/ui/textarea.tsx +0 -18
- package/templates/default/apps/web/src/components/ui/tooltip.tsx +0 -57
- package/templates/default/apps/web/src/components/ui/typography.tsx +0 -158
- package/templates/default/packages/config/panda.config.ts +0 -114
- 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,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
|
+
}
|