@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
@@ -0,0 +1,251 @@
1
+ "use client"
2
+
3
+ import { useRouter } from "next/navigation"
4
+ import {
5
+ Search,
6
+ LayoutPanelLeft,
7
+ LayoutDashboard,
8
+ Mail,
9
+ CheckSquare,
10
+ MessageCircle,
11
+ Calendar,
12
+ Shield,
13
+ AlertTriangle,
14
+ Settings,
15
+ HelpCircle,
16
+ CreditCard,
17
+ User,
18
+ Bell,
19
+ Link2,
20
+ Palette,
21
+ type LucideIcon,
22
+ } from "lucide-react"
23
+
24
+ import { Button } from "@/components/ui/button"
25
+ import {
26
+ Command,
27
+ CommandDialog,
28
+ CommandEmpty,
29
+ CommandGroup,
30
+ CommandInput,
31
+ CommandItem,
32
+ CommandList,
33
+ } from "@/components/ui/command"
34
+ import { Kbd } from "@/components/ui/kbd"
35
+
36
+ interface SearchItem {
37
+ title: string
38
+ url: string
39
+ group: string
40
+ icon?: LucideIcon
41
+ }
42
+
43
+ interface CommandSearchProps {
44
+ open: boolean
45
+ onOpenChange: (open: boolean) => void
46
+ }
47
+
48
+ export function CommandSearch({ open, onOpenChange }: CommandSearchProps) {
49
+ const router = useRouter()
50
+
51
+ const searchItems: SearchItem[] = [
52
+ // Dashboards
53
+ {
54
+ title: "Dashboard 1",
55
+ url: "/dashboard",
56
+ group: "Dashboards",
57
+ icon: LayoutDashboard,
58
+ },
59
+ {
60
+ title: "Dashboard 2",
61
+ url: "/dashboard-2",
62
+ group: "Dashboards",
63
+ icon: LayoutPanelLeft,
64
+ },
65
+
66
+ // Apps
67
+ { title: "Mail", url: "/mail", group: "Apps", icon: Mail },
68
+ { title: "Tasks", url: "/tasks", group: "Apps", icon: CheckSquare },
69
+ { title: "Chat", url: "/chat", group: "Apps", icon: MessageCircle },
70
+ { title: "Calendar", url: "/calendar", group: "Apps", icon: Calendar },
71
+
72
+ // Auth Pages
73
+ {
74
+ title: "Sign In 1",
75
+ url: "/auth/sign-in",
76
+ group: "Auth Pages",
77
+ icon: Shield,
78
+ },
79
+ {
80
+ title: "Sign In 2",
81
+ url: "/auth/sign-in-2",
82
+ group: "Auth Pages",
83
+ icon: Shield,
84
+ },
85
+ {
86
+ title: "Sign Up 1",
87
+ url: "/auth/sign-up",
88
+ group: "Auth Pages",
89
+ icon: Shield,
90
+ },
91
+ {
92
+ title: "Sign Up 2",
93
+ url: "/auth/sign-up-2",
94
+ group: "Auth Pages",
95
+ icon: Shield,
96
+ },
97
+ {
98
+ title: "Forgot Password 1",
99
+ url: "/auth/forgot-password",
100
+ group: "Auth Pages",
101
+ icon: Shield,
102
+ },
103
+ {
104
+ title: "Forgot Password 2",
105
+ url: "/auth/forgot-password-2",
106
+ group: "Auth Pages",
107
+ icon: Shield,
108
+ },
109
+
110
+ // Errors
111
+ {
112
+ title: "Unauthorized",
113
+ url: "/errors/unauthorized",
114
+ group: "Errors",
115
+ icon: AlertTriangle,
116
+ },
117
+ {
118
+ title: "Forbidden",
119
+ url: "/errors/forbidden",
120
+ group: "Errors",
121
+ icon: AlertTriangle,
122
+ },
123
+ {
124
+ title: "Not Found",
125
+ url: "/errors/not-found",
126
+ group: "Errors",
127
+ icon: AlertTriangle,
128
+ },
129
+ {
130
+ title: "Internal Server Error",
131
+ url: "/errors/internal-server-error",
132
+ group: "Errors",
133
+ icon: AlertTriangle,
134
+ },
135
+ {
136
+ title: "Under Maintenance",
137
+ url: "/errors/under-maintenance",
138
+ group: "Errors",
139
+ icon: AlertTriangle,
140
+ },
141
+
142
+ // Settings
143
+ {
144
+ title: "User Settings",
145
+ url: "/settings/user",
146
+ group: "Settings",
147
+ icon: User,
148
+ },
149
+ {
150
+ title: "Account Settings",
151
+ url: "/settings/account",
152
+ group: "Settings",
153
+ icon: Settings,
154
+ },
155
+ {
156
+ title: "Plans & Billing",
157
+ url: "/settings/billing",
158
+ group: "Settings",
159
+ icon: CreditCard,
160
+ },
161
+ {
162
+ title: "Appearance",
163
+ url: "/settings/appearance",
164
+ group: "Settings",
165
+ icon: Palette,
166
+ },
167
+ {
168
+ title: "Notifications",
169
+ url: "/settings/notifications",
170
+ group: "Settings",
171
+ icon: Bell,
172
+ },
173
+ {
174
+ title: "Connections",
175
+ url: "/settings/connections",
176
+ group: "Settings",
177
+ icon: Link2,
178
+ },
179
+
180
+ // Pages
181
+ { title: "FAQs", url: "/faqs", group: "Pages", icon: HelpCircle },
182
+ { title: "Pricing", url: "/pricing", group: "Pages", icon: CreditCard },
183
+ ]
184
+
185
+ const groupedItems = searchItems.reduce(
186
+ (acc, item) => {
187
+ if (!acc[item.group]) {
188
+ acc[item.group] = []
189
+ }
190
+ acc[item.group].push(item)
191
+ return acc
192
+ },
193
+ {} as Record<string, SearchItem[]>
194
+ )
195
+
196
+ const handleSelect = (url: string) => {
197
+ router.push(url)
198
+ onOpenChange(false)
199
+ }
200
+
201
+ return (
202
+ <CommandDialog
203
+ open={open}
204
+ onOpenChange={onOpenChange}
205
+ title="Command Search"
206
+ description="Search pages and settings"
207
+ className="sm:max-w-[640px]"
208
+ >
209
+ <Command>
210
+ <CommandInput placeholder="What do you need?" autoFocus />
211
+ <CommandList className="max-h-[400px]">
212
+ <CommandEmpty>No results found.</CommandEmpty>
213
+ {Object.entries(groupedItems).map(([group, items]) => (
214
+ <CommandGroup key={group} heading={group}>
215
+ {items.map((item) => {
216
+ const Icon = item.icon
217
+ return (
218
+ <CommandItem
219
+ key={item.url}
220
+ value={item.title}
221
+ onSelect={() => handleSelect(item.url)}
222
+ >
223
+ {Icon && <Icon />}
224
+ {item.title}
225
+ </CommandItem>
226
+ )
227
+ })}
228
+ </CommandGroup>
229
+ ))}
230
+ </CommandList>
231
+ </Command>
232
+ </CommandDialog>
233
+ )
234
+ }
235
+
236
+ export function SearchTrigger({ onClick }: { onClick: () => void }) {
237
+ return (
238
+ <Button
239
+ variant="outline"
240
+ size="sm"
241
+ onClick={onClick}
242
+ className="relative w-full justify-start font-normal text-muted-foreground sm:pr-12 md:w-36 lg:w-56"
243
+ >
244
+ <Search data-icon="inline-start" />
245
+ Search...
246
+ <Kbd className="absolute top-1/2 right-1.5 hidden -translate-y-1/2 sm:inline-flex">
247
+ ⌘K
248
+ </Kbd>
249
+ </Button>
250
+ )
251
+ }
@@ -0,0 +1,131 @@
1
+ "use client"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ interface DotPatternProps {
6
+ className?: string
7
+ size?: "sm" | "md" | "lg"
8
+ opacity?: "low" | "medium" | "high"
9
+ fadeStyle?: "ellipse" | "circle" | "none"
10
+ }
11
+
12
+ export function DotPattern({
13
+ className,
14
+ size = "md",
15
+ opacity = "medium",
16
+ fadeStyle = "ellipse",
17
+ }: DotPatternProps) {
18
+ // Use predefined Tailwind classes instead of template literals for Next.js compatibility
19
+ const sizeMap = {
20
+ sm: "[background-size:12px_12px]",
21
+ md: "[background-size:16px_16px]",
22
+ lg: "[background-size:20px_20px]",
23
+ }
24
+
25
+ const opacityMap = {
26
+ low: "opacity-30",
27
+ medium: "opacity-50",
28
+ high: "opacity-70",
29
+ }
30
+
31
+ const fadeMap = {
32
+ ellipse:
33
+ "[mask-image:radial-gradient(ellipse_50%_50%_at_50%_50%,#000_70%,transparent_100%)]",
34
+ circle:
35
+ "[mask-image:radial-gradient(circle_at_50%_50%,#000_70%,transparent_100%)]",
36
+ none: "",
37
+ }
38
+
39
+ return (
40
+ <div
41
+ className={cn(
42
+ "absolute inset-0 bg-[radial-gradient(var(--border)_1px,transparent_1px)]",
43
+ sizeMap[size],
44
+ fadeMap[fadeStyle],
45
+ opacityMap[opacity],
46
+ className
47
+ )}
48
+ />
49
+ )
50
+ }
51
+
52
+ // Alternative themed variants
53
+ export function DotPatternLight({
54
+ className,
55
+ size = "md",
56
+ opacity = "medium",
57
+ fadeStyle = "ellipse",
58
+ }: DotPatternProps) {
59
+ // Use predefined Tailwind classes instead of template literals for Next.js compatibility
60
+ const sizeMap = {
61
+ sm: "[background-size:12px_12px]",
62
+ md: "[background-size:16px_16px]",
63
+ lg: "[background-size:20px_20px]",
64
+ }
65
+
66
+ const opacityMap = {
67
+ low: "opacity-20",
68
+ medium: "opacity-40",
69
+ high: "opacity-60",
70
+ }
71
+
72
+ const fadeMap = {
73
+ ellipse:
74
+ "[mask-image:radial-gradient(ellipse_50%_50%_at_50%_50%,#000_70%,transparent_100%)]",
75
+ circle:
76
+ "[mask-image:radial-gradient(circle_at_50%_50%,#000_70%,transparent_100%)]",
77
+ none: "",
78
+ }
79
+
80
+ return (
81
+ <div
82
+ className={cn(
83
+ "absolute inset-0 bg-[radial-gradient(#d1d5db_1px,transparent_1px)]",
84
+ sizeMap[size],
85
+ fadeMap[fadeStyle],
86
+ opacityMap[opacity],
87
+ className
88
+ )}
89
+ />
90
+ )
91
+ }
92
+
93
+ export function DotPatternDark({
94
+ className,
95
+ size = "md",
96
+ opacity = "medium",
97
+ fadeStyle = "ellipse",
98
+ }: DotPatternProps) {
99
+ // Use predefined Tailwind classes instead of template literals for Next.js compatibility
100
+ const sizeMap = {
101
+ sm: "[background-size:12px_12px]",
102
+ md: "[background-size:16px_16px]",
103
+ lg: "[background-size:20px_20px]",
104
+ }
105
+
106
+ const opacityMap = {
107
+ low: "opacity-30",
108
+ medium: "opacity-50",
109
+ high: "opacity-70",
110
+ }
111
+
112
+ const fadeMap = {
113
+ ellipse:
114
+ "[mask-image:radial-gradient(ellipse_50%_50%_at_50%_50%,#000_70%,transparent_100%)]",
115
+ circle:
116
+ "[mask-image:radial-gradient(circle_at_50%_50%,#000_70%,transparent_100%)]",
117
+ none: "",
118
+ }
119
+
120
+ return (
121
+ <div
122
+ className={cn(
123
+ "absolute inset-0 bg-[radial-gradient(#4b5563_1px,transparent_1px)]",
124
+ sizeMap[size],
125
+ fadeMap[fadeStyle],
126
+ opacityMap[opacity],
127
+ className
128
+ )}
129
+ />
130
+ )
131
+ }
@@ -0,0 +1,28 @@
1
+ import dynamic from "next/dynamic"
2
+ import React from "react"
3
+
4
+ // Heavy components that should be dynamically imported
5
+ export const DynamicThemeCustomizer = dynamic(
6
+ () =>
7
+ import("./theme-customizer").then((mod) => ({
8
+ default: mod.ThemeCustomizer,
9
+ })),
10
+ {
11
+ ssr: false,
12
+ loading: () =>
13
+ React.createElement("div", {
14
+ className: "h-8 w-8 animate-pulse bg-muted rounded",
15
+ }),
16
+ }
17
+ )
18
+
19
+ export const DynamicColorPicker = dynamic(
20
+ () => import("./color-picker").then((mod) => ({ default: mod.ColorPicker })),
21
+ {
22
+ ssr: false,
23
+ loading: () =>
24
+ React.createElement("div", {
25
+ className: "h-8 w-8 animate-pulse bg-muted rounded",
26
+ }),
27
+ }
28
+ )
@@ -0,0 +1,114 @@
1
+ import * as React from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ /**
6
+ * Brand icons. lucide-react 1.x dropped every brand mark, so these keep the
7
+ * exact paths the template used from lucide 0.x and render the same way
8
+ * (24px grid, 2px stroke, currentColor) — size them with className as before.
9
+ */
10
+ type BrandIconProps = React.SVGProps<SVGSVGElement>
11
+
12
+ function createBrandIcon(displayName: string, children: React.ReactNode) {
13
+ function BrandIcon({ className, ...props }: BrandIconProps) {
14
+ return (
15
+ <svg
16
+ xmlns="http://www.w3.org/2000/svg"
17
+ width={24}
18
+ height={24}
19
+ viewBox="0 0 24 24"
20
+ fill="none"
21
+ stroke="currentColor"
22
+ strokeWidth={2}
23
+ strokeLinecap="round"
24
+ strokeLinejoin="round"
25
+ aria-hidden="true"
26
+ className={cn("lucide", className)}
27
+ {...props}
28
+ >
29
+ {children}
30
+ </svg>
31
+ )
32
+ }
33
+ BrandIcon.displayName = displayName
34
+ return BrandIcon
35
+ }
36
+
37
+ export const Github = createBrandIcon(
38
+ "Github",
39
+ <>
40
+ <path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4" />
41
+ <path d="M9 18c-4.51 2-5-2-7-2" />
42
+ </>
43
+ )
44
+
45
+ export const Twitter = createBrandIcon(
46
+ "Twitter",
47
+ <path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z" />
48
+ )
49
+
50
+ export const Facebook = createBrandIcon(
51
+ "Facebook",
52
+ <path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z" />
53
+ )
54
+
55
+ export const Linkedin = createBrandIcon(
56
+ "Linkedin",
57
+ <>
58
+ <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" />
59
+ <rect width="4" height="12" x="2" y="9" />
60
+ <circle cx="4" cy="4" r="2" />
61
+ </>
62
+ )
63
+
64
+ export const Instagram = createBrandIcon(
65
+ "Instagram",
66
+ <>
67
+ <rect width="20" height="20" x="2" y="2" rx="5" ry="5" />
68
+ <path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" />
69
+ <line x1="17.5" x2="17.51" y1="6.5" y2="6.5" />
70
+ </>
71
+ )
72
+
73
+ export const Youtube = createBrandIcon(
74
+ "Youtube",
75
+ <>
76
+ <path d="M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17" />
77
+ <path d="m10 15 5-3-5-3z" />
78
+ </>
79
+ )
80
+
81
+ export const Dribbble = createBrandIcon(
82
+ "Dribbble",
83
+ <>
84
+ <circle cx="12" cy="12" r="10" />
85
+ <path d="M19.13 5.09C15.22 9.14 10 10.44 2.25 10.94" />
86
+ <path d="M21.75 12.84c-6.62-1.41-12.14 1-16.38 6.32" />
87
+ <path d="M8.56 2.75c4.37 6 6 9.42 8 17.72" />
88
+ </>
89
+ )
90
+
91
+ export const Slack = createBrandIcon(
92
+ "Slack",
93
+ <>
94
+ <rect width="3" height="8" x="13" y="2" rx="1.5" />
95
+ <path d="M19 8.5V10h1.5A1.5 1.5 0 1 0 19 8.5" />
96
+ <rect width="3" height="8" x="8" y="14" rx="1.5" />
97
+ <path d="M5 15.5V14H3.5A1.5 1.5 0 1 0 5 15.5" />
98
+ <rect width="8" height="3" x="14" y="13" rx="1.5" />
99
+ <path d="M15.5 19H14v1.5a1.5 1.5 0 1 0 1.5-1.5" />
100
+ <rect width="8" height="3" x="2" y="8" rx="1.5" />
101
+ <path d="M8.5 5H10V3.5A1.5 1.5 0 1 0 8.5 5" />
102
+ </>
103
+ )
104
+
105
+ export const Chrome = createBrandIcon(
106
+ "Chrome",
107
+ <>
108
+ <path d="M10.88 21.94 15.46 14" />
109
+ <path d="M21.17 8H12" />
110
+ <path d="M3.95 6.06 8.54 14" />
111
+ <circle cx="12" cy="12" r="10" />
112
+ <circle cx="12" cy="12" r="4" />
113
+ </>
114
+ )
@@ -0,0 +1,90 @@
1
+ "use client"
2
+
3
+ import Image from "next/image"
4
+ import { cn } from "@/lib/utils"
5
+
6
+ interface Image3DProps {
7
+ lightSrc: string
8
+ darkSrc: string
9
+ alt: string
10
+ className?: string
11
+ direction?: "left" | "right"
12
+ }
13
+
14
+ export function Image3D({
15
+ lightSrc,
16
+ darkSrc,
17
+ alt,
18
+ className,
19
+ direction = "left",
20
+ }: Image3DProps) {
21
+ const isRight = direction === "right"
22
+
23
+ return (
24
+ <div className={cn("group relative aspect-[4/3] w-full", className)}>
25
+ <div className="perspective-distant transform-3d">
26
+ {/* Animated background glow */}
27
+ <div className="absolute sm:-inset-8 rounded-3xl bg-gradient-to-r from-primary/10 via-blue-500/10 to-purple-500/10 opacity-0 group-hover:opacity-100 transition-all duration-1000 blur-2xl" />
28
+
29
+ {/* Main 3D container */}
30
+ <div className="relative size-full transform-3d group-hover:rotate-x-8 group-hover:rotate-y-12 group-hover:translate-z-16 transition-all duration-700 ease-out">
31
+ {/* Depth layers for 3D effect */}
32
+ <div className="absolute inset-0 translate-y-4 translate-x-2 -translate-z-8 rounded-2xl">
33
+ <div className="size-full rounded-2xl bg-gradient-to-br from-primary/10 via-background/40 to-secondary/10 shadow-xl" />
34
+ </div>
35
+
36
+ {/* Main image container */}
37
+ <div className="relative z-10 size-full rounded-2xl overflow-hidden shadow-2xl shadow-primary/20">
38
+ {/* Shimmer effect */}
39
+ <div
40
+ className={cn(
41
+ "absolute inset-0 z-20 bg-gradient-to-r from-transparent via-white/20 to-transparent -skew-x-12 transition-transform duration-1000 ease-out pointer-events-none",
42
+ isRight
43
+ ? "translate-x-full group-hover:-translate-x-full"
44
+ : "-translate-x-full group-hover:translate-x-full"
45
+ )}
46
+ />
47
+
48
+ {/* Content fade mask */}
49
+ <div
50
+ className={cn(
51
+ "absolute inset-0 z-15 pointer-events-none",
52
+ isRight
53
+ ? "bg-linear-to-l from-background from-0% via-background/85 via-15% to-transparent to-40%"
54
+ : "bg-linear-to-r from-background from-0% via-background/85 via-15% to-transparent to-40%"
55
+ )}
56
+ />
57
+
58
+ {/* Theme-aware images */}
59
+ <Image
60
+ src={lightSrc}
61
+ alt={`${alt} - Light Mode`}
62
+ width={800}
63
+ height={600}
64
+ className={cn(
65
+ "block size-full object-cover dark:hidden transition-transform duration-700 group-hover:scale-105",
66
+ isRight ? "object-center" : "object-left"
67
+ )}
68
+ loading="lazy"
69
+ />
70
+
71
+ <Image
72
+ src={darkSrc}
73
+ alt={`${alt} - Dark Mode`}
74
+ width={800}
75
+ height={600}
76
+ className={cn(
77
+ "hidden dark:block size-full object-cover transition-transform duration-700 group-hover:scale-105",
78
+ isRight ? "object-center" : "object-left"
79
+ )}
80
+ loading="lazy"
81
+ />
82
+
83
+ {/* Border highlight */}
84
+ <div className="absolute inset-0 rounded-2xl ring-1 ring-white/20 dark:ring-white/10 group-hover:ring-primary/40 transition-all duration-500" />
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ )
90
+ }