@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.
Files changed (274) hide show
  1. package/LICENSE +27 -0
  2. package/README.md +131 -2
  3. package/bin/index.js +8 -0
  4. package/package.json +44 -4
  5. package/src/cli.js +242 -0
  6. package/src/git.js +25 -0
  7. package/src/install.js +55 -0
  8. package/src/scaffold.js +110 -0
  9. package/src/utils.js +70 -0
  10. package/template/AGENTS.md +9 -0
  11. package/template/LICENSE +28 -0
  12. package/template/README.md +36 -0
  13. package/template/_gitignore +41 -0
  14. package/template/components.json +25 -0
  15. package/template/eslint.config.mjs +11 -0
  16. package/template/next-env.d.ts +7 -0
  17. package/template/next.config.ts +59 -0
  18. package/template/package.json +49 -0
  19. package/template/postcss.config.mjs +6 -0
  20. package/template/public/apps.png +0 -0
  21. package/template/public/customizer.png +0 -0
  22. package/template/public/dashboard-dark.png +0 -0
  23. package/template/public/dashboard-light.png +0 -0
  24. package/template/public/dashboard.png +0 -0
  25. package/template/public/favicon-dark.png +0 -0
  26. package/template/public/favicon.png +0 -0
  27. package/template/public/feature-1-dark.png +0 -0
  28. package/template/public/feature-1-light.png +0 -0
  29. package/template/public/feature-2-dark.png +0 -0
  30. package/template/public/feature-2-light.png +0 -0
  31. package/template/public/file.svg +1 -0
  32. package/template/public/globe.svg +1 -0
  33. package/template/public/hero-images-container.png +0 -0
  34. package/template/public/next.svg +1 -0
  35. package/template/public/vercel.svg +1 -0
  36. package/template/public/window.svg +1 -0
  37. package/template/src/app/(auth)/errors/forbidden/components/forbidden-error.tsx +36 -0
  38. package/template/src/app/(auth)/errors/forbidden/page.tsx +5 -0
  39. package/template/src/app/(auth)/errors/internal-server-error/components/internal-server-error.tsx +36 -0
  40. package/template/src/app/(auth)/errors/internal-server-error/page.tsx +5 -0
  41. package/template/src/app/(auth)/errors/not-found/components/not-found-error.tsx +36 -0
  42. package/template/src/app/(auth)/errors/not-found/page.tsx +5 -0
  43. package/template/src/app/(auth)/errors/unauthorized/components/unauthorized-error.tsx +36 -0
  44. package/template/src/app/(auth)/errors/unauthorized/page.tsx +5 -0
  45. package/template/src/app/(auth)/errors/under-maintenance/components/under-maintenance-error.tsx +33 -0
  46. package/template/src/app/(auth)/errors/under-maintenance/page.tsx +5 -0
  47. package/template/src/app/(auth)/forgot-password/components/forgot-password-form-1.tsx +61 -0
  48. package/template/src/app/(auth)/forgot-password/page.tsx +22 -0
  49. package/template/src/app/(auth)/forgot-password-2/components/forgot-password-form-2.tsx +38 -0
  50. package/template/src/app/(auth)/forgot-password-2/page.tsx +25 -0
  51. package/template/src/app/(auth)/forgot-password-3/components/forgot-password-form-3.tsx +66 -0
  52. package/template/src/app/(auth)/forgot-password-3/page.tsx +9 -0
  53. package/template/src/app/(auth)/layout.tsx +14 -0
  54. package/template/src/app/(auth)/sign-in/components/login-form-1.tsx +143 -0
  55. package/template/src/app/(auth)/sign-in/page.tsx +22 -0
  56. package/template/src/app/(auth)/sign-in-2/components/login-form-2.tsx +78 -0
  57. package/template/src/app/(auth)/sign-in-2/page.tsx +25 -0
  58. package/template/src/app/(auth)/sign-in-3/components/login-form-3.tsx +130 -0
  59. package/template/src/app/(auth)/sign-in-3/page.tsx +11 -0
  60. package/template/src/app/(auth)/sign-up/components/signup-form-1.tsx +245 -0
  61. package/template/src/app/(auth)/sign-up/page.tsx +22 -0
  62. package/template/src/app/(auth)/sign-up-2/components/signup-form-2.tsx +89 -0
  63. package/template/src/app/(auth)/sign-up-2/page.tsx +25 -0
  64. package/template/src/app/(auth)/sign-up-3/components/signup-form-3.tsx +152 -0
  65. package/template/src/app/(auth)/sign-up-3/page.tsx +9 -0
  66. package/template/src/app/(dashboard)/calendar/components/calendar-main.tsx +446 -0
  67. package/template/src/app/(dashboard)/calendar/components/calendar-sidebar.tsx +78 -0
  68. package/template/src/app/(dashboard)/calendar/components/calendar-unified.tsx +431 -0
  69. package/template/src/app/(dashboard)/calendar/components/calendar.tsx +90 -0
  70. package/template/src/app/(dashboard)/calendar/components/calendars.tsx +265 -0
  71. package/template/src/app/(dashboard)/calendar/components/date-picker.tsx +56 -0
  72. package/template/src/app/(dashboard)/calendar/components/event-form.tsx +468 -0
  73. package/template/src/app/(dashboard)/calendar/components/quick-actions.tsx +159 -0
  74. package/template/src/app/(dashboard)/calendar/data/calendars.json +37 -0
  75. package/template/src/app/(dashboard)/calendar/data/event-dates.json +30 -0
  76. package/template/src/app/(dashboard)/calendar/data/events.json +62 -0
  77. package/template/src/app/(dashboard)/calendar/data.ts +55 -0
  78. package/template/src/app/(dashboard)/calendar/page.tsx +10 -0
  79. package/template/src/app/(dashboard)/calendar/types.ts +20 -0
  80. package/template/src/app/(dashboard)/calendar/use-calendar.ts +93 -0
  81. package/template/src/app/(dashboard)/chat/components/chat-header.tsx +266 -0
  82. package/template/src/app/(dashboard)/chat/components/chat.tsx +212 -0
  83. package/template/src/app/(dashboard)/chat/components/conversation-list-new.tsx +248 -0
  84. package/template/src/app/(dashboard)/chat/components/conversation-list.tsx +242 -0
  85. package/template/src/app/(dashboard)/chat/components/message-input.tsx +235 -0
  86. package/template/src/app/(dashboard)/chat/components/message-list.tsx +325 -0
  87. package/template/src/app/(dashboard)/chat/data/conversations.json +92 -0
  88. package/template/src/app/(dashboard)/chat/data/messages.json +224 -0
  89. package/template/src/app/(dashboard)/chat/data/users.json +47 -0
  90. package/template/src/app/(dashboard)/chat/page.tsx +49 -0
  91. package/template/src/app/(dashboard)/chat/use-chat.ts +149 -0
  92. package/template/src/app/(dashboard)/dashboard/components/chart-area-interactive.tsx +304 -0
  93. package/template/src/app/(dashboard)/dashboard/components/data-table.tsx +1156 -0
  94. package/template/src/app/(dashboard)/dashboard/components/section-cards.tsx +102 -0
  95. package/template/src/app/(dashboard)/dashboard/data/data.json +614 -0
  96. package/template/src/app/(dashboard)/dashboard/data/focus-documents-data.json +47 -0
  97. package/template/src/app/(dashboard)/dashboard/data/key-personnel-data.json +47 -0
  98. package/template/src/app/(dashboard)/dashboard/data/past-performance-data.json +47 -0
  99. package/template/src/app/(dashboard)/dashboard/page.tsx +37 -0
  100. package/template/src/app/(dashboard)/dashboard/schemas/task-schema.ts +13 -0
  101. package/template/src/app/(dashboard)/dashboard-2/components/customer-insights.tsx +390 -0
  102. package/template/src/app/(dashboard)/dashboard-2/components/dashboard-header.tsx +103 -0
  103. package/template/src/app/(dashboard)/dashboard-2/components/metrics-overview.tsx +95 -0
  104. package/template/src/app/(dashboard)/dashboard-2/components/quick-actions.tsx +50 -0
  105. package/template/src/app/(dashboard)/dashboard-2/components/recent-transactions.tsx +164 -0
  106. package/template/src/app/(dashboard)/dashboard-2/components/revenue-breakdown.tsx +269 -0
  107. package/template/src/app/(dashboard)/dashboard-2/components/sales-chart.tsx +170 -0
  108. package/template/src/app/(dashboard)/dashboard-2/components/top-products.tsx +140 -0
  109. package/template/src/app/(dashboard)/dashboard-2/data/dashboard-data.json +39 -0
  110. package/template/src/app/(dashboard)/dashboard-2/page.tsx +49 -0
  111. package/template/src/app/(dashboard)/faqs/components/faq-list.tsx +148 -0
  112. package/template/src/app/(dashboard)/faqs/components/features-grid.tsx +46 -0
  113. package/template/src/app/(dashboard)/faqs/data/categories.json +10 -0
  114. package/template/src/app/(dashboard)/faqs/data/faqs.json +278 -0
  115. package/template/src/app/(dashboard)/faqs/data/features.ts +37 -0
  116. package/template/src/app/(dashboard)/faqs/page.tsx +16 -0
  117. package/template/src/app/(dashboard)/layout.tsx +83 -0
  118. package/template/src/app/(dashboard)/mail/components/account-switcher.tsx +69 -0
  119. package/template/src/app/(dashboard)/mail/components/mail-display.tsx +290 -0
  120. package/template/src/app/(dashboard)/mail/components/mail-list.tsx +94 -0
  121. package/template/src/app/(dashboard)/mail/components/mail.tsx +226 -0
  122. package/template/src/app/(dashboard)/mail/components/nav.tsx +83 -0
  123. package/template/src/app/(dashboard)/mail/data.tsx +300 -0
  124. package/template/src/app/(dashboard)/mail/index.tsx +6 -0
  125. package/template/src/app/(dashboard)/mail/page.tsx +18 -0
  126. package/template/src/app/(dashboard)/mail/use-mail.ts +20 -0
  127. package/template/src/app/(dashboard)/pricing/components/faq-section.tsx +79 -0
  128. package/template/src/app/(dashboard)/pricing/components/features-grid.tsx +51 -0
  129. package/template/src/app/(dashboard)/pricing/data/faqs.json +32 -0
  130. package/template/src/app/(dashboard)/pricing/data/features.ts +61 -0
  131. package/template/src/app/(dashboard)/pricing/page.tsx +24 -0
  132. package/template/src/app/(dashboard)/settings/account/page.tsx +276 -0
  133. package/template/src/app/(dashboard)/settings/appearance/page.tsx +313 -0
  134. package/template/src/app/(dashboard)/settings/billing/components/billing-history-card.tsx +53 -0
  135. package/template/src/app/(dashboard)/settings/billing/components/current-plan-card.tsx +82 -0
  136. package/template/src/app/(dashboard)/settings/billing/data/billing-history.json +23 -0
  137. package/template/src/app/(dashboard)/settings/billing/data/current-plan.json +12 -0
  138. package/template/src/app/(dashboard)/settings/billing/page.tsx +57 -0
  139. package/template/src/app/(dashboard)/settings/connections/page.tsx +366 -0
  140. package/template/src/app/(dashboard)/settings/notifications/page.tsx +845 -0
  141. package/template/src/app/(dashboard)/settings/user/page.tsx +415 -0
  142. package/template/src/app/(dashboard)/tasks/components/add-task-modal.tsx +291 -0
  143. package/template/src/app/(dashboard)/tasks/components/columns.tsx +159 -0
  144. package/template/src/app/(dashboard)/tasks/components/data-table-column-header.tsx +46 -0
  145. package/template/src/app/(dashboard)/tasks/components/data-table-faceted-filter.tsx +164 -0
  146. package/template/src/app/(dashboard)/tasks/components/data-table-pagination.tsx +107 -0
  147. package/template/src/app/(dashboard)/tasks/components/data-table-row-actions.tsx +72 -0
  148. package/template/src/app/(dashboard)/tasks/components/data-table-toolbar.tsx +189 -0
  149. package/template/src/app/(dashboard)/tasks/components/data-table-view-options.tsx +67 -0
  150. package/template/src/app/(dashboard)/tasks/components/data-table.tsx +122 -0
  151. package/template/src/app/(dashboard)/tasks/components/user-nav.tsx +70 -0
  152. package/template/src/app/(dashboard)/tasks/data/data.tsx +66 -0
  153. package/template/src/app/(dashboard)/tasks/data/schema.ts +13 -0
  154. package/template/src/app/(dashboard)/tasks/data/tasks.json +352 -0
  155. package/template/src/app/(dashboard)/tasks/page.tsx +204 -0
  156. package/template/src/app/(dashboard)/users/components/data-table.tsx +600 -0
  157. package/template/src/app/(dashboard)/users/components/stat-cards.tsx +91 -0
  158. package/template/src/app/(dashboard)/users/components/user-form-dialog.tsx +291 -0
  159. package/template/src/app/(dashboard)/users/data.json +182 -0
  160. package/template/src/app/(dashboard)/users/page.tsx +84 -0
  161. package/template/src/app/favicon.ico +0 -0
  162. package/template/src/app/globals.css +193 -0
  163. package/template/src/app/landing/components/about-section.tsx +125 -0
  164. package/template/src/app/landing/components/blog-section.tsx +86 -0
  165. package/template/src/app/landing/components/contact-section.tsx +299 -0
  166. package/template/src/app/landing/components/cta-section.tsx +121 -0
  167. package/template/src/app/landing/components/faq-section.tsx +125 -0
  168. package/template/src/app/landing/components/features-section.tsx +221 -0
  169. package/template/src/app/landing/components/footer.tsx +273 -0
  170. package/template/src/app/landing/components/hero-section.tsx +121 -0
  171. package/template/src/app/landing/components/landing-theme-customizer.tsx +563 -0
  172. package/template/src/app/landing/components/logo-carousel.tsx +130 -0
  173. package/template/src/app/landing/components/navbar.tsx +367 -0
  174. package/template/src/app/landing/components/pricing-section.tsx +214 -0
  175. package/template/src/app/landing/components/stats-section.tsx +71 -0
  176. package/template/src/app/landing/components/team-section.tsx +224 -0
  177. package/template/src/app/landing/components/testimonials-section.tsx +148 -0
  178. package/template/src/app/landing/landing-page-content.tsx +60 -0
  179. package/template/src/app/landing/page.tsx +6 -0
  180. package/template/src/app/layout.tsx +31 -0
  181. package/template/src/app/loading.tsx +10 -0
  182. package/template/src/app/not-found.tsx +20 -0
  183. package/template/src/app/page.tsx +32 -0
  184. package/template/src/assets/react.svg +1 -0
  185. package/template/src/components/app-sidebar.tsx +241 -0
  186. package/template/src/components/color-picker.tsx +91 -0
  187. package/template/src/components/command-search.tsx +251 -0
  188. package/template/src/components/dot-pattern.tsx +131 -0
  189. package/template/src/components/dynamic-imports.ts +28 -0
  190. package/template/src/components/icons/brand-icons.tsx +114 -0
  191. package/template/src/components/image-3d.tsx +90 -0
  192. package/template/src/components/landing/mega-menu.tsx +143 -0
  193. package/template/src/components/layouts/base-layout.tsx +109 -0
  194. package/template/src/components/logo.tsx +44 -0
  195. package/template/src/components/mode-toggle.tsx +76 -0
  196. package/template/src/components/nav-main.tsx +121 -0
  197. package/template/src/components/nav-secondary.tsx +43 -0
  198. package/template/src/components/nav-user.tsx +122 -0
  199. package/template/src/components/pricing-plans.tsx +181 -0
  200. package/template/src/components/sidebar-notification.tsx +59 -0
  201. package/template/src/components/site-footer.tsx +30 -0
  202. package/template/src/components/site-header.tsx +87 -0
  203. package/template/src/components/theme-customizer/circular-transition.css +115 -0
  204. package/template/src/components/theme-customizer/import-modal.tsx +128 -0
  205. package/template/src/components/theme-customizer/index.tsx +229 -0
  206. package/template/src/components/theme-customizer/layout-tab.tsx +274 -0
  207. package/template/src/components/theme-customizer/main.tsx +7 -0
  208. package/template/src/components/theme-customizer/theme-tab.tsx +403 -0
  209. package/template/src/components/theme-customizer.tsx +6 -0
  210. package/template/src/components/theme-provider.tsx +62 -0
  211. package/template/src/components/ui/accordion.tsx +77 -0
  212. package/template/src/components/ui/alert.tsx +75 -0
  213. package/template/src/components/ui/avatar.tsx +108 -0
  214. package/template/src/components/ui/badge.tsx +51 -0
  215. package/template/src/components/ui/breadcrumb.tsx +121 -0
  216. package/template/src/components/ui/button.tsx +57 -0
  217. package/template/src/components/ui/calendar.tsx +228 -0
  218. package/template/src/components/ui/card-decorator.tsx +20 -0
  219. package/template/src/components/ui/card.tsx +102 -0
  220. package/template/src/components/ui/chart.tsx +372 -0
  221. package/template/src/components/ui/checkbox.tsx +27 -0
  222. package/template/src/components/ui/collapsible.tsx +21 -0
  223. package/template/src/components/ui/command.tsx +193 -0
  224. package/template/src/components/ui/dialog.tsx +156 -0
  225. package/template/src/components/ui/drawer.tsx +224 -0
  226. package/template/src/components/ui/dropdown-menu.tsx +271 -0
  227. package/template/src/components/ui/field.tsx +238 -0
  228. package/template/src/components/ui/hover-card.tsx +50 -0
  229. package/template/src/components/ui/input-group.tsx +158 -0
  230. package/template/src/components/ui/input.tsx +19 -0
  231. package/template/src/components/ui/kbd.tsx +26 -0
  232. package/template/src/components/ui/label.tsx +19 -0
  233. package/template/src/components/ui/loading-spinner.tsx +31 -0
  234. package/template/src/components/ui/navigation-menu.tsx +170 -0
  235. package/template/src/components/ui/popover.tsx +89 -0
  236. package/template/src/components/ui/progress.tsx +82 -0
  237. package/template/src/components/ui/radio-group.tsx +37 -0
  238. package/template/src/components/ui/resizable.tsx +49 -0
  239. package/template/src/components/ui/scroll-area.tsx +54 -0
  240. package/template/src/components/ui/select.tsx +201 -0
  241. package/template/src/components/ui/separator.tsx +24 -0
  242. package/template/src/components/ui/sheet.tsx +134 -0
  243. package/template/src/components/ui/sidebar.tsx +726 -0
  244. package/template/src/components/ui/skeleton.tsx +13 -0
  245. package/template/src/components/ui/switch.tsx +31 -0
  246. package/template/src/components/ui/table.tsx +115 -0
  247. package/template/src/components/ui/tabs.tsx +81 -0
  248. package/template/src/components/ui/textarea.tsx +17 -0
  249. package/template/src/components/ui/toast.tsx +229 -0
  250. package/template/src/components/ui/toggle-group.tsx +89 -0
  251. package/template/src/components/ui/toggle.tsx +44 -0
  252. package/template/src/components/ui/tooltip.tsx +65 -0
  253. package/template/src/components/upgrade-to-pro-button.tsx +107 -0
  254. package/template/src/config/site.ts +8 -0
  255. package/template/src/config/theme-customizer-constants.ts +56 -0
  256. package/template/src/config/theme-data.ts +29 -0
  257. package/template/src/contexts/sidebar-config.ts +16 -0
  258. package/template/src/contexts/sidebar-context.tsx +33 -0
  259. package/template/src/contexts/theme-context.ts +16 -0
  260. package/template/src/hooks/use-circular-transition.ts +83 -0
  261. package/template/src/hooks/use-fullscreen.ts +43 -0
  262. package/template/src/hooks/use-mobile.ts +18 -0
  263. package/template/src/hooks/use-sidebar-config.ts +15 -0
  264. package/template/src/hooks/use-theme-manager.ts +218 -0
  265. package/template/src/hooks/use-theme.ts +11 -0
  266. package/template/src/lib/data-table.ts +54 -0
  267. package/template/src/lib/fonts.ts +8 -0
  268. package/template/src/lib/utils.ts +7 -0
  269. package/template/src/proxy.ts +38 -0
  270. package/template/src/types/theme-customizer.ts +45 -0
  271. package/template/src/types/theme.ts +58 -0
  272. package/template/src/utils/shadcn-ui-theme-presets.ts +741 -0
  273. package/template/src/utils/tweakcn-theme-presets.ts +3425 -0
  274. 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 -->
@@ -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
+ }
@@ -0,0 +1,6 @@
1
+ const config = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
6
+ export default config;
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>
@@ -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&apos;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
+ }
@@ -0,0 +1,5 @@
1
+ import { ForbiddenError } from "./components/forbidden-error"
2
+
3
+ export default function ForbiddenPage() {
4
+ return <ForbiddenError />
5
+ }
@@ -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&apos;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,5 @@
1
+ import { InternalServerError } from "./components/internal-server-error"
2
+
3
+ export default function InternalServerErrorPage() {
4
+ return <InternalServerError />
5
+ }
@@ -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&apos;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,5 @@
1
+ import { NotFoundError } from "./components/not-found-error"
2
+
3
+ export default function NotFoundPage() {
4
+ return <NotFoundError />
5
+ }
@@ -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&apos;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
+ }
@@ -0,0 +1,5 @@
1
+ import { UnauthorizedError } from "./components/unauthorized-error"
2
+
3
+ export default function UnauthorizedPage() {
4
+ return <UnauthorizedError />
5
+ }
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ import { UnderMaintenanceError } from "./components/under-maintenance-error"
2
+
3
+ export default function UnderMaintenancePage() {
4
+ return <UnderMaintenanceError />
5
+ }