@meghpatel-007/next-starter 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +27 -0
- package/README.md +131 -2
- package/bin/index.js +8 -0
- package/package.json +44 -4
- package/src/cli.js +242 -0
- package/src/git.js +25 -0
- package/src/install.js +55 -0
- package/src/scaffold.js +110 -0
- package/src/utils.js +70 -0
- package/template/AGENTS.md +9 -0
- package/template/LICENSE +28 -0
- package/template/README.md +36 -0
- package/template/_gitignore +41 -0
- package/template/components.json +25 -0
- package/template/eslint.config.mjs +11 -0
- package/template/next-env.d.ts +7 -0
- package/template/next.config.ts +59 -0
- package/template/package.json +49 -0
- package/template/postcss.config.mjs +6 -0
- package/template/public/apps.png +0 -0
- package/template/public/customizer.png +0 -0
- package/template/public/dashboard-dark.png +0 -0
- package/template/public/dashboard-light.png +0 -0
- package/template/public/dashboard.png +0 -0
- package/template/public/favicon-dark.png +0 -0
- package/template/public/favicon.png +0 -0
- package/template/public/feature-1-dark.png +0 -0
- package/template/public/feature-1-light.png +0 -0
- package/template/public/feature-2-dark.png +0 -0
- package/template/public/feature-2-light.png +0 -0
- package/template/public/file.svg +1 -0
- package/template/public/globe.svg +1 -0
- package/template/public/hero-images-container.png +0 -0
- package/template/public/next.svg +1 -0
- package/template/public/vercel.svg +1 -0
- package/template/public/window.svg +1 -0
- package/template/src/app/(auth)/errors/forbidden/components/forbidden-error.tsx +36 -0
- package/template/src/app/(auth)/errors/forbidden/page.tsx +5 -0
- package/template/src/app/(auth)/errors/internal-server-error/components/internal-server-error.tsx +36 -0
- package/template/src/app/(auth)/errors/internal-server-error/page.tsx +5 -0
- package/template/src/app/(auth)/errors/not-found/components/not-found-error.tsx +36 -0
- package/template/src/app/(auth)/errors/not-found/page.tsx +5 -0
- package/template/src/app/(auth)/errors/unauthorized/components/unauthorized-error.tsx +36 -0
- package/template/src/app/(auth)/errors/unauthorized/page.tsx +5 -0
- package/template/src/app/(auth)/errors/under-maintenance/components/under-maintenance-error.tsx +33 -0
- package/template/src/app/(auth)/errors/under-maintenance/page.tsx +5 -0
- package/template/src/app/(auth)/forgot-password/components/forgot-password-form-1.tsx +61 -0
- package/template/src/app/(auth)/forgot-password/page.tsx +22 -0
- package/template/src/app/(auth)/forgot-password-2/components/forgot-password-form-2.tsx +38 -0
- package/template/src/app/(auth)/forgot-password-2/page.tsx +25 -0
- package/template/src/app/(auth)/forgot-password-3/components/forgot-password-form-3.tsx +66 -0
- package/template/src/app/(auth)/forgot-password-3/page.tsx +9 -0
- package/template/src/app/(auth)/layout.tsx +14 -0
- package/template/src/app/(auth)/sign-in/components/login-form-1.tsx +143 -0
- package/template/src/app/(auth)/sign-in/page.tsx +22 -0
- package/template/src/app/(auth)/sign-in-2/components/login-form-2.tsx +78 -0
- package/template/src/app/(auth)/sign-in-2/page.tsx +25 -0
- package/template/src/app/(auth)/sign-in-3/components/login-form-3.tsx +130 -0
- package/template/src/app/(auth)/sign-in-3/page.tsx +11 -0
- package/template/src/app/(auth)/sign-up/components/signup-form-1.tsx +245 -0
- package/template/src/app/(auth)/sign-up/page.tsx +22 -0
- package/template/src/app/(auth)/sign-up-2/components/signup-form-2.tsx +89 -0
- package/template/src/app/(auth)/sign-up-2/page.tsx +25 -0
- package/template/src/app/(auth)/sign-up-3/components/signup-form-3.tsx +152 -0
- package/template/src/app/(auth)/sign-up-3/page.tsx +9 -0
- package/template/src/app/(dashboard)/calendar/components/calendar-main.tsx +446 -0
- package/template/src/app/(dashboard)/calendar/components/calendar-sidebar.tsx +78 -0
- package/template/src/app/(dashboard)/calendar/components/calendar-unified.tsx +431 -0
- package/template/src/app/(dashboard)/calendar/components/calendar.tsx +90 -0
- package/template/src/app/(dashboard)/calendar/components/calendars.tsx +265 -0
- package/template/src/app/(dashboard)/calendar/components/date-picker.tsx +56 -0
- package/template/src/app/(dashboard)/calendar/components/event-form.tsx +468 -0
- package/template/src/app/(dashboard)/calendar/components/quick-actions.tsx +159 -0
- package/template/src/app/(dashboard)/calendar/data/calendars.json +37 -0
- package/template/src/app/(dashboard)/calendar/data/event-dates.json +30 -0
- package/template/src/app/(dashboard)/calendar/data/events.json +62 -0
- package/template/src/app/(dashboard)/calendar/data.ts +55 -0
- package/template/src/app/(dashboard)/calendar/page.tsx +10 -0
- package/template/src/app/(dashboard)/calendar/types.ts +20 -0
- package/template/src/app/(dashboard)/calendar/use-calendar.ts +93 -0
- package/template/src/app/(dashboard)/chat/components/chat-header.tsx +266 -0
- package/template/src/app/(dashboard)/chat/components/chat.tsx +212 -0
- package/template/src/app/(dashboard)/chat/components/conversation-list-new.tsx +248 -0
- package/template/src/app/(dashboard)/chat/components/conversation-list.tsx +242 -0
- package/template/src/app/(dashboard)/chat/components/message-input.tsx +235 -0
- package/template/src/app/(dashboard)/chat/components/message-list.tsx +325 -0
- package/template/src/app/(dashboard)/chat/data/conversations.json +92 -0
- package/template/src/app/(dashboard)/chat/data/messages.json +224 -0
- package/template/src/app/(dashboard)/chat/data/users.json +47 -0
- package/template/src/app/(dashboard)/chat/page.tsx +49 -0
- package/template/src/app/(dashboard)/chat/use-chat.ts +149 -0
- package/template/src/app/(dashboard)/dashboard/components/chart-area-interactive.tsx +304 -0
- package/template/src/app/(dashboard)/dashboard/components/data-table.tsx +1156 -0
- package/template/src/app/(dashboard)/dashboard/components/section-cards.tsx +102 -0
- package/template/src/app/(dashboard)/dashboard/data/data.json +614 -0
- package/template/src/app/(dashboard)/dashboard/data/focus-documents-data.json +47 -0
- package/template/src/app/(dashboard)/dashboard/data/key-personnel-data.json +47 -0
- package/template/src/app/(dashboard)/dashboard/data/past-performance-data.json +47 -0
- package/template/src/app/(dashboard)/dashboard/page.tsx +37 -0
- package/template/src/app/(dashboard)/dashboard/schemas/task-schema.ts +13 -0
- package/template/src/app/(dashboard)/dashboard-2/components/customer-insights.tsx +390 -0
- package/template/src/app/(dashboard)/dashboard-2/components/dashboard-header.tsx +103 -0
- package/template/src/app/(dashboard)/dashboard-2/components/metrics-overview.tsx +95 -0
- package/template/src/app/(dashboard)/dashboard-2/components/quick-actions.tsx +50 -0
- package/template/src/app/(dashboard)/dashboard-2/components/recent-transactions.tsx +164 -0
- package/template/src/app/(dashboard)/dashboard-2/components/revenue-breakdown.tsx +269 -0
- package/template/src/app/(dashboard)/dashboard-2/components/sales-chart.tsx +170 -0
- package/template/src/app/(dashboard)/dashboard-2/components/top-products.tsx +140 -0
- package/template/src/app/(dashboard)/dashboard-2/data/dashboard-data.json +39 -0
- package/template/src/app/(dashboard)/dashboard-2/page.tsx +49 -0
- package/template/src/app/(dashboard)/faqs/components/faq-list.tsx +148 -0
- package/template/src/app/(dashboard)/faqs/components/features-grid.tsx +46 -0
- package/template/src/app/(dashboard)/faqs/data/categories.json +10 -0
- package/template/src/app/(dashboard)/faqs/data/faqs.json +278 -0
- package/template/src/app/(dashboard)/faqs/data/features.ts +37 -0
- package/template/src/app/(dashboard)/faqs/page.tsx +16 -0
- package/template/src/app/(dashboard)/layout.tsx +83 -0
- package/template/src/app/(dashboard)/mail/components/account-switcher.tsx +69 -0
- package/template/src/app/(dashboard)/mail/components/mail-display.tsx +290 -0
- package/template/src/app/(dashboard)/mail/components/mail-list.tsx +94 -0
- package/template/src/app/(dashboard)/mail/components/mail.tsx +226 -0
- package/template/src/app/(dashboard)/mail/components/nav.tsx +83 -0
- package/template/src/app/(dashboard)/mail/data.tsx +300 -0
- package/template/src/app/(dashboard)/mail/index.tsx +6 -0
- package/template/src/app/(dashboard)/mail/page.tsx +18 -0
- package/template/src/app/(dashboard)/mail/use-mail.ts +20 -0
- package/template/src/app/(dashboard)/pricing/components/faq-section.tsx +79 -0
- package/template/src/app/(dashboard)/pricing/components/features-grid.tsx +51 -0
- package/template/src/app/(dashboard)/pricing/data/faqs.json +32 -0
- package/template/src/app/(dashboard)/pricing/data/features.ts +61 -0
- package/template/src/app/(dashboard)/pricing/page.tsx +24 -0
- package/template/src/app/(dashboard)/settings/account/page.tsx +276 -0
- package/template/src/app/(dashboard)/settings/appearance/page.tsx +313 -0
- package/template/src/app/(dashboard)/settings/billing/components/billing-history-card.tsx +53 -0
- package/template/src/app/(dashboard)/settings/billing/components/current-plan-card.tsx +82 -0
- package/template/src/app/(dashboard)/settings/billing/data/billing-history.json +23 -0
- package/template/src/app/(dashboard)/settings/billing/data/current-plan.json +12 -0
- package/template/src/app/(dashboard)/settings/billing/page.tsx +57 -0
- package/template/src/app/(dashboard)/settings/connections/page.tsx +366 -0
- package/template/src/app/(dashboard)/settings/notifications/page.tsx +845 -0
- package/template/src/app/(dashboard)/settings/user/page.tsx +415 -0
- package/template/src/app/(dashboard)/tasks/components/add-task-modal.tsx +291 -0
- package/template/src/app/(dashboard)/tasks/components/columns.tsx +159 -0
- package/template/src/app/(dashboard)/tasks/components/data-table-column-header.tsx +46 -0
- package/template/src/app/(dashboard)/tasks/components/data-table-faceted-filter.tsx +164 -0
- package/template/src/app/(dashboard)/tasks/components/data-table-pagination.tsx +107 -0
- package/template/src/app/(dashboard)/tasks/components/data-table-row-actions.tsx +72 -0
- package/template/src/app/(dashboard)/tasks/components/data-table-toolbar.tsx +189 -0
- package/template/src/app/(dashboard)/tasks/components/data-table-view-options.tsx +67 -0
- package/template/src/app/(dashboard)/tasks/components/data-table.tsx +122 -0
- package/template/src/app/(dashboard)/tasks/components/user-nav.tsx +70 -0
- package/template/src/app/(dashboard)/tasks/data/data.tsx +66 -0
- package/template/src/app/(dashboard)/tasks/data/schema.ts +13 -0
- package/template/src/app/(dashboard)/tasks/data/tasks.json +352 -0
- package/template/src/app/(dashboard)/tasks/page.tsx +204 -0
- package/template/src/app/(dashboard)/users/components/data-table.tsx +600 -0
- package/template/src/app/(dashboard)/users/components/stat-cards.tsx +91 -0
- package/template/src/app/(dashboard)/users/components/user-form-dialog.tsx +291 -0
- package/template/src/app/(dashboard)/users/data.json +182 -0
- package/template/src/app/(dashboard)/users/page.tsx +84 -0
- package/template/src/app/favicon.ico +0 -0
- package/template/src/app/globals.css +193 -0
- package/template/src/app/landing/components/about-section.tsx +125 -0
- package/template/src/app/landing/components/blog-section.tsx +86 -0
- package/template/src/app/landing/components/contact-section.tsx +299 -0
- package/template/src/app/landing/components/cta-section.tsx +121 -0
- package/template/src/app/landing/components/faq-section.tsx +125 -0
- package/template/src/app/landing/components/features-section.tsx +221 -0
- package/template/src/app/landing/components/footer.tsx +273 -0
- package/template/src/app/landing/components/hero-section.tsx +121 -0
- package/template/src/app/landing/components/landing-theme-customizer.tsx +563 -0
- package/template/src/app/landing/components/logo-carousel.tsx +130 -0
- package/template/src/app/landing/components/navbar.tsx +367 -0
- package/template/src/app/landing/components/pricing-section.tsx +214 -0
- package/template/src/app/landing/components/stats-section.tsx +71 -0
- package/template/src/app/landing/components/team-section.tsx +224 -0
- package/template/src/app/landing/components/testimonials-section.tsx +148 -0
- package/template/src/app/landing/landing-page-content.tsx +60 -0
- package/template/src/app/landing/page.tsx +6 -0
- package/template/src/app/layout.tsx +31 -0
- package/template/src/app/loading.tsx +10 -0
- package/template/src/app/not-found.tsx +20 -0
- package/template/src/app/page.tsx +32 -0
- package/template/src/assets/react.svg +1 -0
- package/template/src/components/app-sidebar.tsx +241 -0
- package/template/src/components/color-picker.tsx +91 -0
- package/template/src/components/command-search.tsx +251 -0
- package/template/src/components/dot-pattern.tsx +131 -0
- package/template/src/components/dynamic-imports.ts +28 -0
- package/template/src/components/icons/brand-icons.tsx +114 -0
- package/template/src/components/image-3d.tsx +90 -0
- package/template/src/components/landing/mega-menu.tsx +143 -0
- package/template/src/components/layouts/base-layout.tsx +109 -0
- package/template/src/components/logo.tsx +44 -0
- package/template/src/components/mode-toggle.tsx +76 -0
- package/template/src/components/nav-main.tsx +121 -0
- package/template/src/components/nav-secondary.tsx +43 -0
- package/template/src/components/nav-user.tsx +122 -0
- package/template/src/components/pricing-plans.tsx +181 -0
- package/template/src/components/sidebar-notification.tsx +59 -0
- package/template/src/components/site-footer.tsx +30 -0
- package/template/src/components/site-header.tsx +87 -0
- package/template/src/components/theme-customizer/circular-transition.css +115 -0
- package/template/src/components/theme-customizer/import-modal.tsx +128 -0
- package/template/src/components/theme-customizer/index.tsx +229 -0
- package/template/src/components/theme-customizer/layout-tab.tsx +274 -0
- package/template/src/components/theme-customizer/main.tsx +7 -0
- package/template/src/components/theme-customizer/theme-tab.tsx +403 -0
- package/template/src/components/theme-customizer.tsx +6 -0
- package/template/src/components/theme-provider.tsx +62 -0
- package/template/src/components/ui/accordion.tsx +77 -0
- package/template/src/components/ui/alert.tsx +75 -0
- package/template/src/components/ui/avatar.tsx +108 -0
- package/template/src/components/ui/badge.tsx +51 -0
- package/template/src/components/ui/breadcrumb.tsx +121 -0
- package/template/src/components/ui/button.tsx +57 -0
- package/template/src/components/ui/calendar.tsx +228 -0
- package/template/src/components/ui/card-decorator.tsx +20 -0
- package/template/src/components/ui/card.tsx +102 -0
- package/template/src/components/ui/chart.tsx +372 -0
- package/template/src/components/ui/checkbox.tsx +27 -0
- package/template/src/components/ui/collapsible.tsx +21 -0
- package/template/src/components/ui/command.tsx +193 -0
- package/template/src/components/ui/dialog.tsx +156 -0
- package/template/src/components/ui/drawer.tsx +224 -0
- package/template/src/components/ui/dropdown-menu.tsx +271 -0
- package/template/src/components/ui/field.tsx +238 -0
- package/template/src/components/ui/hover-card.tsx +50 -0
- package/template/src/components/ui/input-group.tsx +158 -0
- package/template/src/components/ui/input.tsx +19 -0
- package/template/src/components/ui/kbd.tsx +26 -0
- package/template/src/components/ui/label.tsx +19 -0
- package/template/src/components/ui/loading-spinner.tsx +31 -0
- package/template/src/components/ui/navigation-menu.tsx +170 -0
- package/template/src/components/ui/popover.tsx +89 -0
- package/template/src/components/ui/progress.tsx +82 -0
- package/template/src/components/ui/radio-group.tsx +37 -0
- package/template/src/components/ui/resizable.tsx +49 -0
- package/template/src/components/ui/scroll-area.tsx +54 -0
- package/template/src/components/ui/select.tsx +201 -0
- package/template/src/components/ui/separator.tsx +24 -0
- package/template/src/components/ui/sheet.tsx +134 -0
- package/template/src/components/ui/sidebar.tsx +726 -0
- package/template/src/components/ui/skeleton.tsx +13 -0
- package/template/src/components/ui/switch.tsx +31 -0
- package/template/src/components/ui/table.tsx +115 -0
- package/template/src/components/ui/tabs.tsx +81 -0
- package/template/src/components/ui/textarea.tsx +17 -0
- package/template/src/components/ui/toast.tsx +229 -0
- package/template/src/components/ui/toggle-group.tsx +89 -0
- package/template/src/components/ui/toggle.tsx +44 -0
- package/template/src/components/ui/tooltip.tsx +65 -0
- package/template/src/components/upgrade-to-pro-button.tsx +107 -0
- package/template/src/config/site.ts +8 -0
- package/template/src/config/theme-customizer-constants.ts +56 -0
- package/template/src/config/theme-data.ts +29 -0
- package/template/src/contexts/sidebar-config.ts +16 -0
- package/template/src/contexts/sidebar-context.tsx +33 -0
- package/template/src/contexts/theme-context.ts +16 -0
- package/template/src/hooks/use-circular-transition.ts +83 -0
- package/template/src/hooks/use-fullscreen.ts +43 -0
- package/template/src/hooks/use-mobile.ts +18 -0
- package/template/src/hooks/use-sidebar-config.ts +15 -0
- package/template/src/hooks/use-theme-manager.ts +218 -0
- package/template/src/hooks/use-theme.ts +11 -0
- package/template/src/lib/data-table.ts +54 -0
- package/template/src/lib/fonts.ts +8 -0
- package/template/src/lib/utils.ts +7 -0
- package/template/src/proxy.ts +38 -0
- package/template/src/types/theme-customizer.ts +45 -0
- package/template/src/types/theme.ts +58 -0
- package/template/src/utils/shadcn-ui-theme-presets.ts +741 -0
- package/template/src/utils/tweakcn-theme-presets.ts +3425 -0
- package/template/tsconfig.json +41 -0
package/src/utils.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { builtinModules } from "node:module";
|
|
2
|
+
|
|
3
|
+
// npm package-name rules for newly created packages (mirrors validate-npm-package-name).
|
|
4
|
+
const FORBIDDEN_NAMES = new Set(["node_modules", "favicon.ico"]);
|
|
5
|
+
const NAME_PATTERN = /^[a-z0-9][a-z0-9-._]*[a-z0-9]$|^[a-z0-9]$/;
|
|
6
|
+
|
|
7
|
+
function checkPart(part, label) {
|
|
8
|
+
if (part.length === 0) return `${label} cannot be empty.`;
|
|
9
|
+
if (part.length > 214) return `${label} must be at most 214 characters long.`;
|
|
10
|
+
if (part !== part.toLowerCase()) {
|
|
11
|
+
return `${label} must be lowercase (npm package names are lowercase only).`;
|
|
12
|
+
}
|
|
13
|
+
if (part.startsWith(".") || part.startsWith("_")) {
|
|
14
|
+
return `${label} cannot start with a dot or an underscore.`;
|
|
15
|
+
}
|
|
16
|
+
if (!NAME_PATTERN.test(part)) {
|
|
17
|
+
return `${label} may only contain lowercase letters, digits, hyphens, dots, and underscores, and cannot start or end with a hyphen or dot.`;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function validateProjectName(input) {
|
|
23
|
+
const raw = (input ?? "").trim();
|
|
24
|
+
if (raw.length === 0) return "Project name cannot be empty.";
|
|
25
|
+
|
|
26
|
+
const name = raw.startsWith("@") ? raw : raw;
|
|
27
|
+
|
|
28
|
+
let scope = null;
|
|
29
|
+
let pkgName = name;
|
|
30
|
+
if (raw.startsWith("@")) {
|
|
31
|
+
const withoutAt = raw.slice(1);
|
|
32
|
+
const slashIndex = withoutAt.indexOf("/");
|
|
33
|
+
if (slashIndex === -1 || slashIndex === 0 || slashIndex === withoutAt.length - 1) {
|
|
34
|
+
return 'Scoped names must look like @scope/project-name (for example @acme/dashboard).';
|
|
35
|
+
}
|
|
36
|
+
scope = withoutAt.slice(0, slashIndex);
|
|
37
|
+
pkgName = withoutAt.slice(slashIndex + 1);
|
|
38
|
+
if (scope.startsWith(".") || scope.startsWith("_")) {
|
|
39
|
+
return "Scope name cannot start with a dot or an underscore.";
|
|
40
|
+
}
|
|
41
|
+
if (/\s|[A-Z]/.test(scope)) {
|
|
42
|
+
return "Scope name must be lowercase and cannot contain spaces or uppercase letters.";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (/\s/.test(pkgName)) {
|
|
47
|
+
return "Project name cannot contain spaces. Use hyphens instead.";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
for (const [part, label] of [
|
|
51
|
+
[scope, "Scope name"],
|
|
52
|
+
[pkgName, "Project name"],
|
|
53
|
+
]) {
|
|
54
|
+
if (part === null) continue;
|
|
55
|
+
const error = checkPart(part, label);
|
|
56
|
+
if (error) return error;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (FORBIDDEN_NAMES.has(pkgName)) {
|
|
60
|
+
return `"${pkgName}" is not allowed as a project name.`;
|
|
61
|
+
}
|
|
62
|
+
if (builtinModules.includes(pkgName) || builtinModules.includes(`node:${pkgName}`)) {
|
|
63
|
+
return `"${pkgName}" conflicts with a built-in Node.js module name.`;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function isValidProjectName(input) {
|
|
69
|
+
return validateProjectName(input) === null;
|
|
70
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<!-- BEGIN:nextjs-agent-rules -->
|
|
2
|
+
|
|
3
|
+
## This is NOT the Next.js you know
|
|
4
|
+
|
|
5
|
+
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
|
|
6
|
+
|
|
7
|
+
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
|
|
8
|
+
|
|
9
|
+
<!-- END:nextjs-agent-rules -->
|
package/template/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 ShadcnStore
|
|
4
|
+
Copyright (c) 2026 Megh Patel
|
|
5
|
+
|
|
6
|
+
This project is derived from shadcn-dashboard-landing-template by ShadcnStore,
|
|
7
|
+
published under the MIT License
|
|
8
|
+
(https://github.com/shadcnstore/shadcn-dashboard-landing-template). Megh Patel's
|
|
9
|
+
copyright covers the CLI scaffolding tool (shipped in a parent package) and
|
|
10
|
+
modifications made to this template.
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
|
2
|
+
|
|
3
|
+
## Getting Started
|
|
4
|
+
|
|
5
|
+
First, run the development server:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm run dev
|
|
9
|
+
# or
|
|
10
|
+
yarn dev
|
|
11
|
+
# or
|
|
12
|
+
pnpm dev
|
|
13
|
+
# or
|
|
14
|
+
bun dev
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
18
|
+
|
|
19
|
+
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
|
20
|
+
|
|
21
|
+
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
|
22
|
+
|
|
23
|
+
## Learn More
|
|
24
|
+
|
|
25
|
+
To learn more about Next.js, take a look at the following resources:
|
|
26
|
+
|
|
27
|
+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
28
|
+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
29
|
+
|
|
30
|
+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
|
31
|
+
|
|
32
|
+
## Deploy on Vercel
|
|
33
|
+
|
|
34
|
+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
35
|
+
|
|
36
|
+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
|
+
|
|
3
|
+
# dependencies
|
|
4
|
+
/node_modules
|
|
5
|
+
/.pnp
|
|
6
|
+
.pnp.*
|
|
7
|
+
.yarn/*
|
|
8
|
+
!.yarn/patches
|
|
9
|
+
!.yarn/plugins
|
|
10
|
+
!.yarn/releases
|
|
11
|
+
!.yarn/versions
|
|
12
|
+
|
|
13
|
+
# testing
|
|
14
|
+
/coverage
|
|
15
|
+
|
|
16
|
+
# next.js
|
|
17
|
+
/.next/
|
|
18
|
+
/out/
|
|
19
|
+
|
|
20
|
+
# production
|
|
21
|
+
/build
|
|
22
|
+
|
|
23
|
+
# misc
|
|
24
|
+
.DS_Store
|
|
25
|
+
*.pem
|
|
26
|
+
|
|
27
|
+
# debug
|
|
28
|
+
npm-debug.log*
|
|
29
|
+
yarn-debug.log*
|
|
30
|
+
yarn-error.log*
|
|
31
|
+
.pnpm-debug.log*
|
|
32
|
+
|
|
33
|
+
# env files (can opt-in for committing if needed)
|
|
34
|
+
.env*
|
|
35
|
+
|
|
36
|
+
# vercel
|
|
37
|
+
.vercel
|
|
38
|
+
|
|
39
|
+
# typescript
|
|
40
|
+
*.tsbuildinfo
|
|
41
|
+
next-env.d.ts
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "base-nova",
|
|
4
|
+
"rsc": true,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "",
|
|
8
|
+
"css": "src/app/globals.css",
|
|
9
|
+
"baseColor": "neutral",
|
|
10
|
+
"cssVariables": true,
|
|
11
|
+
"prefix": ""
|
|
12
|
+
},
|
|
13
|
+
"iconLibrary": "lucide",
|
|
14
|
+
"rtl": false,
|
|
15
|
+
"aliases": {
|
|
16
|
+
"components": "@/components",
|
|
17
|
+
"utils": "@/lib/utils",
|
|
18
|
+
"ui": "@/components/ui",
|
|
19
|
+
"lib": "@/lib",
|
|
20
|
+
"hooks": "@/hooks"
|
|
21
|
+
},
|
|
22
|
+
"menuColor": "default",
|
|
23
|
+
"menuAccent": "subtle",
|
|
24
|
+
"registries": {}
|
|
25
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { defineConfig, globalIgnores } from "eslint/config";
|
|
2
|
+
import nextVitals from "eslint-config-next/core-web-vitals";
|
|
3
|
+
import nextTs from "eslint-config-next/typescript";
|
|
4
|
+
|
|
5
|
+
const eslintConfig = defineConfig([
|
|
6
|
+
...nextVitals,
|
|
7
|
+
...nextTs,
|
|
8
|
+
globalIgnores([".next/**", "out/**", "build/**", "next-env.d.ts"]),
|
|
9
|
+
]);
|
|
10
|
+
|
|
11
|
+
export default eslintConfig;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="next" />
|
|
2
|
+
/// <reference types="next/image-types/global" />
|
|
3
|
+
import "./.next/dev/types/routes.d.ts";
|
|
4
|
+
import "./.next/dev/types/root-params.d.ts";
|
|
5
|
+
|
|
6
|
+
// NOTE: This file should not be edited
|
|
7
|
+
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { NextConfig } from "next";
|
|
2
|
+
|
|
3
|
+
const nextConfig: NextConfig = {
|
|
4
|
+
experimental: {
|
|
5
|
+
optimizePackageImports: ["lucide-react"],
|
|
6
|
+
},
|
|
7
|
+
turbopack: {},
|
|
8
|
+
|
|
9
|
+
// Image optimization
|
|
10
|
+
images: {
|
|
11
|
+
remotePatterns: [
|
|
12
|
+
{
|
|
13
|
+
protocol: 'https',
|
|
14
|
+
hostname: 'ui.shadcn.com',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
protocol: 'https',
|
|
18
|
+
hostname: 'images.unsplash.com',
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
formats: ['image/webp', 'image/avif'],
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
// Headers for better security and performance
|
|
25
|
+
async headers() {
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
source: '/(.*)',
|
|
29
|
+
headers: [
|
|
30
|
+
{
|
|
31
|
+
key: 'X-Frame-Options',
|
|
32
|
+
value: 'DENY',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: 'X-Content-Type-Options',
|
|
36
|
+
value: 'nosniff',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: 'Referrer-Policy',
|
|
40
|
+
value: 'origin-when-cross-origin',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
// Redirects for better SEO
|
|
48
|
+
async redirects() {
|
|
49
|
+
return [
|
|
50
|
+
{
|
|
51
|
+
source: '/home',
|
|
52
|
+
destination: '/dashboard',
|
|
53
|
+
permanent: true,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default nextConfig;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Next-starter",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start",
|
|
9
|
+
"lint": "eslint ."
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@base-ui/react": "^1.8.0",
|
|
13
|
+
"@dnd-kit/core": "^6.3.1",
|
|
14
|
+
"@dnd-kit/modifiers": "^9.0.0",
|
|
15
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
16
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
17
|
+
"@hookform/resolvers": "^5.9.1",
|
|
18
|
+
"@tailwindcss/postcss": "^4.3.3",
|
|
19
|
+
"@tanstack/react-table": "^9.2.6",
|
|
20
|
+
"class-variance-authority": "^0.7.1",
|
|
21
|
+
"cmdk": "^1.1.1",
|
|
22
|
+
"clsx": "^2.1.1",
|
|
23
|
+
"date-fns": "^4.4.0",
|
|
24
|
+
"lucide-react": "^1.52.0",
|
|
25
|
+
"next": "16.4.3",
|
|
26
|
+
"next-themes": "^0.4.6",
|
|
27
|
+
"postcss": "^8.5.29",
|
|
28
|
+
"react": "19.3.0",
|
|
29
|
+
"react-day-picker": "^10.0.2",
|
|
30
|
+
"react-dom": "19.3.0",
|
|
31
|
+
"react-hook-form": "^7.89.0",
|
|
32
|
+
"react-resizable-panels": "^4.14.3",
|
|
33
|
+
"recharts": "3.8.0",
|
|
34
|
+
"tailwind-merge": "^3.7.0",
|
|
35
|
+
"zod": "^4.6.5",
|
|
36
|
+
"zustand": "^5.0.15"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^26.6.4",
|
|
40
|
+
"@types/react": "^19.3.0",
|
|
41
|
+
"@types/react-dom": "^19.3.0",
|
|
42
|
+
"eslint": "^10.12.0",
|
|
43
|
+
"eslint-config-next": "16.4.3",
|
|
44
|
+
"shadcn": "^4.21.4",
|
|
45
|
+
"tailwindcss": "^4.3.3",
|
|
46
|
+
"tw-animate-css": "^1.4.0",
|
|
47
|
+
"typescript": "^6.0.3"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/components/ui/button"
|
|
4
|
+
import { useRouter } from "next/navigation"
|
|
5
|
+
|
|
6
|
+
export function ForbiddenError() {
|
|
7
|
+
const router = useRouter()
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="mx-auto flex min-h-dvh flex-col items-center justify-center gap-8 p-8 md:gap-12 md:p-16">
|
|
11
|
+
<div className="text-center">
|
|
12
|
+
<h1 className="mb-4 text-3xl font-bold">403</h1>
|
|
13
|
+
<h2 className="mb-3 text-2xl font-semibold">Forbidden</h2>
|
|
14
|
+
<p>
|
|
15
|
+
Access to this resource is forbidden. You don't have the
|
|
16
|
+
necessary permissions to view this page.
|
|
17
|
+
</p>
|
|
18
|
+
<div className="mt-6 flex items-center justify-center gap-4 md:mt-8">
|
|
19
|
+
<Button
|
|
20
|
+
className="cursor-pointer"
|
|
21
|
+
onClick={() => router.push("/dashboard")}
|
|
22
|
+
>
|
|
23
|
+
Go Back Home
|
|
24
|
+
</Button>
|
|
25
|
+
<Button
|
|
26
|
+
variant="outline"
|
|
27
|
+
className="flex cursor-pointer items-center gap-1"
|
|
28
|
+
onClick={() => router.push("#")}
|
|
29
|
+
>
|
|
30
|
+
Contact Us
|
|
31
|
+
</Button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
)
|
|
36
|
+
}
|
package/template/src/app/(auth)/errors/internal-server-error/components/internal-server-error.tsx
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/components/ui/button"
|
|
4
|
+
import { useRouter } from "next/navigation"
|
|
5
|
+
|
|
6
|
+
export function InternalServerError() {
|
|
7
|
+
const router = useRouter()
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="mx-auto flex min-h-dvh flex-col items-center justify-center gap-8 p-8 md:gap-12 md:p-16">
|
|
11
|
+
<div className="text-center">
|
|
12
|
+
<h1 className="mb-4 text-3xl font-bold">500</h1>
|
|
13
|
+
<h2 className="mb-3 text-2xl font-semibold">Internal Server Error</h2>
|
|
14
|
+
<p>
|
|
15
|
+
Something went wrong on our end. We're working to fix the issue.
|
|
16
|
+
Please try again later.
|
|
17
|
+
</p>
|
|
18
|
+
<div className="mt-6 flex items-center justify-center gap-4 md:mt-8">
|
|
19
|
+
<Button
|
|
20
|
+
className="cursor-pointer"
|
|
21
|
+
onClick={() => router.push("/dashboard")}
|
|
22
|
+
>
|
|
23
|
+
Go Back Home
|
|
24
|
+
</Button>
|
|
25
|
+
<Button
|
|
26
|
+
variant="outline"
|
|
27
|
+
className="flex cursor-pointer items-center gap-1"
|
|
28
|
+
onClick={() => router.push("#")}
|
|
29
|
+
>
|
|
30
|
+
Contact Us
|
|
31
|
+
</Button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/components/ui/button"
|
|
4
|
+
import { useRouter } from "next/navigation"
|
|
5
|
+
|
|
6
|
+
export function NotFoundError() {
|
|
7
|
+
const router = useRouter()
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="mx-auto flex min-h-dvh flex-col items-center justify-center gap-8 p-8 md:gap-12 md:p-16">
|
|
11
|
+
<div className="text-center">
|
|
12
|
+
<h1 className="mb-4 text-3xl font-bold">404</h1>
|
|
13
|
+
<h2 className="mb-3 text-2xl font-semibold">Page Not Found</h2>
|
|
14
|
+
<p>
|
|
15
|
+
The page you are looking for doesn't exist or has been moved to
|
|
16
|
+
another location.
|
|
17
|
+
</p>
|
|
18
|
+
<div className="mt-6 flex items-center justify-center gap-4 md:mt-8">
|
|
19
|
+
<Button
|
|
20
|
+
className="cursor-pointer"
|
|
21
|
+
onClick={() => router.push("/dashboard")}
|
|
22
|
+
>
|
|
23
|
+
Go Back Home
|
|
24
|
+
</Button>
|
|
25
|
+
<Button
|
|
26
|
+
variant="outline"
|
|
27
|
+
className="flex cursor-pointer items-center gap-1"
|
|
28
|
+
onClick={() => router.push("#")}
|
|
29
|
+
>
|
|
30
|
+
Contact Us
|
|
31
|
+
</Button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/components/ui/button"
|
|
4
|
+
import { useRouter } from "next/navigation"
|
|
5
|
+
|
|
6
|
+
export function UnauthorizedError() {
|
|
7
|
+
const router = useRouter()
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="mx-auto flex min-h-dvh flex-col items-center justify-center gap-8 p-8 md:gap-12 md:p-16">
|
|
11
|
+
<div className="text-center">
|
|
12
|
+
<h1 className="mb-4 text-3xl font-bold">401</h1>
|
|
13
|
+
<h2 className="mb-3 text-2xl font-semibold">Unauthorized</h2>
|
|
14
|
+
<p>
|
|
15
|
+
You don't have permission to access this resource. Please sign in
|
|
16
|
+
or contact your administrator.
|
|
17
|
+
</p>
|
|
18
|
+
<div className="mt-6 flex items-center justify-center gap-4 md:mt-8">
|
|
19
|
+
<Button
|
|
20
|
+
className="cursor-pointer"
|
|
21
|
+
onClick={() => router.push("/dashboard")}
|
|
22
|
+
>
|
|
23
|
+
Go Back Home
|
|
24
|
+
</Button>
|
|
25
|
+
<Button
|
|
26
|
+
variant="outline"
|
|
27
|
+
className="flex cursor-pointer items-center gap-1"
|
|
28
|
+
onClick={() => router.push("#")}
|
|
29
|
+
>
|
|
30
|
+
Contact Us
|
|
31
|
+
</Button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
)
|
|
36
|
+
}
|
package/template/src/app/(auth)/errors/under-maintenance/components/under-maintenance-error.tsx
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/components/ui/button"
|
|
4
|
+
import { useRouter } from "next/navigation"
|
|
5
|
+
|
|
6
|
+
export function UnderMaintenanceError() {
|
|
7
|
+
const router = useRouter()
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="mx-auto flex min-h-dvh flex-col items-center justify-center gap-8 p-8 md:gap-12 md:p-16">
|
|
11
|
+
<div className="text-center">
|
|
12
|
+
<h1 className="mb-4 text-3xl font-bold">503</h1>
|
|
13
|
+
<h2 className="mb-3 text-2xl font-semibold">Under Maintenance</h2>
|
|
14
|
+
<p>The service is currently unavailable. Please try again later.</p>
|
|
15
|
+
<div className="mt-6 flex items-center justify-center gap-4 md:mt-8">
|
|
16
|
+
<Button
|
|
17
|
+
className="cursor-pointer"
|
|
18
|
+
onClick={() => router.push("/dashboard")}
|
|
19
|
+
>
|
|
20
|
+
Go Back Home
|
|
21
|
+
</Button>
|
|
22
|
+
<Button
|
|
23
|
+
variant="outline"
|
|
24
|
+
className="flex cursor-pointer items-center gap-1"
|
|
25
|
+
onClick={() => router.push("#")}
|
|
26
|
+
>
|
|
27
|
+
Contact Us
|
|
28
|
+
</Button>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
)
|
|
33
|
+
}
|