@imksh/create 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 (441) hide show
  1. package/README.md +88 -0
  2. package/bin/index.js +3 -0
  3. package/package.json +43 -0
  4. package/src/commands/create.js +90 -0
  5. package/src/index.js +41 -0
  6. package/src/utils/askTemplate.js +25 -0
  7. package/src/utils/copyTemplate.js +36 -0
  8. package/src/utils/installPackages.js +25 -0
  9. package/src/utils/logger.js +17 -0
  10. package/src/utils/runGit.js +11 -0
  11. package/templates/mern/_gitignore +2 -0
  12. package/templates/mern/client/_gitignore +24 -0
  13. package/templates/mern/client/index.html +14 -0
  14. package/templates/mern/client/package.json +39 -0
  15. package/templates/mern/client/public/_redirects +1 -0
  16. package/templates/mern/client/public/favicon.ico +0 -0
  17. package/templates/mern/client/public/favicon.svg +1 -0
  18. package/templates/mern/client/public/logo.png +0 -0
  19. package/templates/mern/client/public/manifest.json +24 -0
  20. package/templates/mern/client/public/sw.js +56 -0
  21. package/templates/mern/client/src/App.jsx +68 -0
  22. package/templates/mern/client/src/assets/animations/loading.json +1 -0
  23. package/templates/mern/client/src/assets/data/navigation.js +29 -0
  24. package/templates/mern/client/src/assets/images/logo.png +0 -0
  25. package/templates/mern/client/src/components/common/Breadcrumbs.jsx +27 -0
  26. package/templates/mern/client/src/components/common/Loading.jsx +19 -0
  27. package/templates/mern/client/src/components/common/LottieIcon.jsx +36 -0
  28. package/templates/mern/client/src/components/common/NotFound.jsx +78 -0
  29. package/templates/mern/client/src/components/common/PwaInstallPrompt.jsx +72 -0
  30. package/templates/mern/client/src/components/common/SEO.jsx +67 -0
  31. package/templates/mern/client/src/components/common/Scroll.jsx +25 -0
  32. package/templates/mern/client/src/components/common/Table.jsx +110 -0
  33. package/templates/mern/client/src/components/common/ToggleSwitch.jsx +38 -0
  34. package/templates/mern/client/src/components/common/Unauthorized.jsx +76 -0
  35. package/templates/mern/client/src/components/layout/ProtectedRoute.jsx +17 -0
  36. package/templates/mern/client/src/components/layout/PublicLayout.jsx +13 -0
  37. package/templates/mern/client/src/components/layout/SidebarLayout.jsx +37 -0
  38. package/templates/mern/client/src/components/modals/ConfirmModal.jsx +135 -0
  39. package/templates/mern/client/src/components/modals/Modal.jsx +94 -0
  40. package/templates/mern/client/src/components/skeletons/common/CardSkeleton.jsx +23 -0
  41. package/templates/mern/client/src/components/skeletons/common/DashboardSkeleton.jsx +19 -0
  42. package/templates/mern/client/src/components/skeletons/common/ListSkeleton.jsx +24 -0
  43. package/templates/mern/client/src/components/skeletons/common/PageSkeleton.jsx +26 -0
  44. package/templates/mern/client/src/components/skeletons/common/ProfileSkeleton.jsx +23 -0
  45. package/templates/mern/client/src/components/skeletons/common/Skeleton.jsx +18 -0
  46. package/templates/mern/client/src/components/skeletons/common/TableSkeleton.jsx +33 -0
  47. package/templates/mern/client/src/components/ui/Header.jsx +230 -0
  48. package/templates/mern/client/src/components/ui/SidebarHeader.jsx +27 -0
  49. package/templates/mern/client/src/components/ui/sidebar.jsx +152 -0
  50. package/templates/mern/client/src/config/api.js +22 -0
  51. package/templates/mern/client/src/config/appConfig.js +44 -0
  52. package/templates/mern/client/src/config/navigation.js +14 -0
  53. package/templates/mern/client/src/hooks/useLenis.js +28 -0
  54. package/templates/mern/client/src/hooks/usePwaInstall.js +45 -0
  55. package/templates/mern/client/src/hooks/useWindowSize.js +25 -0
  56. package/templates/mern/client/src/index.css +158 -0
  57. package/templates/mern/client/src/main.jsx +24 -0
  58. package/templates/mern/client/src/pages/Home.jsx +154 -0
  59. package/templates/mern/client/src/pages/Login.jsx +196 -0
  60. package/templates/mern/client/src/pages/Profile.jsx +9 -0
  61. package/templates/mern/client/src/services/authService.js +16 -0
  62. package/templates/mern/client/src/store/useAuthStore.js +98 -0
  63. package/templates/mern/client/src/store/useUiStore.js +54 -0
  64. package/templates/mern/client/src/utils/getInitials.js +10 -0
  65. package/templates/mern/client/vite.config.js +8 -0
  66. package/templates/mern/package.json +18 -0
  67. package/templates/mern/server/.env.example +62 -0
  68. package/templates/mern/server/README.md +65 -0
  69. package/templates/mern/server/_gitignore +24 -0
  70. package/templates/mern/server/package.json +32 -0
  71. package/templates/mern/server/src/app.js +42 -0
  72. package/templates/mern/server/src/config/cloudinary.js +9 -0
  73. package/templates/mern/server/src/config/db.js +14 -0
  74. package/templates/mern/server/src/config/dotenv.js +2 -0
  75. package/templates/mern/server/src/config/email.js +30 -0
  76. package/templates/mern/server/src/config/socket.js +54 -0
  77. package/templates/mern/server/src/config/webPush.js +9 -0
  78. package/templates/mern/server/src/controllers/auth.controller.js +153 -0
  79. package/templates/mern/server/src/controllers/upload.controller.js +26 -0
  80. package/templates/mern/server/src/index.js +24 -0
  81. package/templates/mern/server/src/middleware/auth.middleware.js +43 -0
  82. package/templates/mern/server/src/middleware/errorHandler.js +22 -0
  83. package/templates/mern/server/src/middleware/multer.js +21 -0
  84. package/templates/mern/server/src/middleware/rateLimiter.js +57 -0
  85. package/templates/mern/server/src/models/otp.model.js +21 -0
  86. package/templates/mern/server/src/models/pushSubscription.model.js +32 -0
  87. package/templates/mern/server/src/models/user.model.js +43 -0
  88. package/templates/mern/server/src/routes/auth.route.js +22 -0
  89. package/templates/mern/server/src/routes/index.js +10 -0
  90. package/templates/mern/server/src/routes/upload.route.js +12 -0
  91. package/templates/mern/server/src/services/auth.service.js +162 -0
  92. package/templates/mern/server/src/services/auth.service.ts +0 -0
  93. package/templates/mern/server/src/utils/authToken.js +26 -0
  94. package/templates/mern/server/src/utils/cloudinary.js +27 -0
  95. package/templates/mern/server/src/utils/cloudinaryUpload.js +87 -0
  96. package/templates/mern/server/src/utils/emailOtp.js +190 -0
  97. package/templates/mern/server/src/utils/genOtpToken.js +20 -0
  98. package/templates/mern/server/src/utils/generateVapidKeys.js +12 -0
  99. package/templates/mern/server/src/utils/jwt.js +25 -0
  100. package/templates/mern/server/src/utils/logger.js +25 -0
  101. package/templates/mern-ts/_gitignore +2 -0
  102. package/templates/mern-ts/client/_gitignore +24 -0
  103. package/templates/mern-ts/client/index.html +14 -0
  104. package/templates/mern-ts/client/package.json +45 -0
  105. package/templates/mern-ts/client/public/_redirects +1 -0
  106. package/templates/mern-ts/client/public/favicon.ico +0 -0
  107. package/templates/mern-ts/client/public/favicon.svg +1 -0
  108. package/templates/mern-ts/client/public/logo.png +0 -0
  109. package/templates/mern-ts/client/public/manifest.json +24 -0
  110. package/templates/mern-ts/client/public/sw.js +56 -0
  111. package/templates/mern-ts/client/src/App.tsx +68 -0
  112. package/templates/mern-ts/client/src/assets/animations/loading.json +1 -0
  113. package/templates/mern-ts/client/src/assets/data/navigation.ts +29 -0
  114. package/templates/mern-ts/client/src/assets/images/logo.png +0 -0
  115. package/templates/mern-ts/client/src/components/common/Breadcrumbs.tsx +27 -0
  116. package/templates/mern-ts/client/src/components/common/Loading.tsx +19 -0
  117. package/templates/mern-ts/client/src/components/common/LottieIcon.tsx +36 -0
  118. package/templates/mern-ts/client/src/components/common/NotFound.tsx +78 -0
  119. package/templates/mern-ts/client/src/components/common/PwaInstallPrompt.tsx +72 -0
  120. package/templates/mern-ts/client/src/components/common/SEO.tsx +67 -0
  121. package/templates/mern-ts/client/src/components/common/Scroll.tsx +25 -0
  122. package/templates/mern-ts/client/src/components/common/Table.tsx +118 -0
  123. package/templates/mern-ts/client/src/components/common/ToggleSwitch.tsx +38 -0
  124. package/templates/mern-ts/client/src/components/common/Unauthorized.tsx +76 -0
  125. package/templates/mern-ts/client/src/components/layout/ProtectedRoute.tsx +23 -0
  126. package/templates/mern-ts/client/src/components/layout/PublicLayout.tsx +13 -0
  127. package/templates/mern-ts/client/src/components/layout/SidebarLayout.tsx +37 -0
  128. package/templates/mern-ts/client/src/components/modals/ConfirmModal.tsx +135 -0
  129. package/templates/mern-ts/client/src/components/modals/Modal.tsx +94 -0
  130. package/templates/mern-ts/client/src/components/skeletons/common/CardSkeleton.tsx +23 -0
  131. package/templates/mern-ts/client/src/components/skeletons/common/DashboardSkeleton.tsx +19 -0
  132. package/templates/mern-ts/client/src/components/skeletons/common/ListSkeleton.tsx +24 -0
  133. package/templates/mern-ts/client/src/components/skeletons/common/PageSkeleton.tsx +26 -0
  134. package/templates/mern-ts/client/src/components/skeletons/common/ProfileSkeleton.tsx +23 -0
  135. package/templates/mern-ts/client/src/components/skeletons/common/Skeleton.tsx +18 -0
  136. package/templates/mern-ts/client/src/components/skeletons/common/TableSkeleton.tsx +33 -0
  137. package/templates/mern-ts/client/src/components/ui/Header.tsx +230 -0
  138. package/templates/mern-ts/client/src/components/ui/SidebarHeader.tsx +27 -0
  139. package/templates/mern-ts/client/src/components/ui/sidebar.tsx +152 -0
  140. package/templates/mern-ts/client/src/config/api.ts +22 -0
  141. package/templates/mern-ts/client/src/config/appConfig.ts +44 -0
  142. package/templates/mern-ts/client/src/config/navigation.ts +14 -0
  143. package/templates/mern-ts/client/src/hooks/useLenis.ts +28 -0
  144. package/templates/mern-ts/client/src/hooks/usePwaInstall.ts +45 -0
  145. package/templates/mern-ts/client/src/hooks/useWindowSize.ts +25 -0
  146. package/templates/mern-ts/client/src/index.css +158 -0
  147. package/templates/mern-ts/client/src/main.tsx +24 -0
  148. package/templates/mern-ts/client/src/pages/Home.tsx +154 -0
  149. package/templates/mern-ts/client/src/pages/Login.tsx +196 -0
  150. package/templates/mern-ts/client/src/pages/Profile.tsx +9 -0
  151. package/templates/mern-ts/client/src/services/authService.ts +16 -0
  152. package/templates/mern-ts/client/src/store/useAuthStore.ts +98 -0
  153. package/templates/mern-ts/client/src/store/useUiStore.ts +54 -0
  154. package/templates/mern-ts/client/src/utils/getInitials.ts +10 -0
  155. package/templates/mern-ts/client/tsconfig.json +25 -0
  156. package/templates/mern-ts/client/tsconfig.node.json +10 -0
  157. package/templates/mern-ts/client/vite.config.ts +8 -0
  158. package/templates/mern-ts/package.json +19 -0
  159. package/templates/mern-ts/server/.env.example +62 -0
  160. package/templates/mern-ts/server/README.md +69 -0
  161. package/templates/mern-ts/server/_gitignore +24 -0
  162. package/templates/mern-ts/server/package.json +47 -0
  163. package/templates/mern-ts/server/src/app.ts +36 -0
  164. package/templates/mern-ts/server/src/config/cloudinary.ts +9 -0
  165. package/templates/mern-ts/server/src/config/db.ts +15 -0
  166. package/templates/mern-ts/server/src/config/dotenv.ts +2 -0
  167. package/templates/mern-ts/server/src/config/email.ts +28 -0
  168. package/templates/mern-ts/server/src/config/socket.ts +54 -0
  169. package/templates/mern-ts/server/src/config/webPush.ts +9 -0
  170. package/templates/mern-ts/server/src/controllers/auth.controller.ts +126 -0
  171. package/templates/mern-ts/server/src/controllers/upload.controller.ts +22 -0
  172. package/templates/mern-ts/server/src/index.ts +17 -0
  173. package/templates/mern-ts/server/src/middleware/auth.middleware.ts +38 -0
  174. package/templates/mern-ts/server/src/middleware/errorHandler.ts +16 -0
  175. package/templates/mern-ts/server/src/middleware/multer.ts +20 -0
  176. package/templates/mern-ts/server/src/middleware/rateLimiter.ts +53 -0
  177. package/templates/mern-ts/server/src/models/otp.model.ts +21 -0
  178. package/templates/mern-ts/server/src/models/pushSubscription.model.ts +32 -0
  179. package/templates/mern-ts/server/src/models/user.model.ts +43 -0
  180. package/templates/mern-ts/server/src/routes/auth.route.ts +22 -0
  181. package/templates/mern-ts/server/src/routes/index.ts +10 -0
  182. package/templates/mern-ts/server/src/routes/upload.route.ts +11 -0
  183. package/templates/mern-ts/server/src/services/auth.service.ts +115 -0
  184. package/templates/mern-ts/server/src/types/express.d.ts +10 -0
  185. package/templates/mern-ts/server/src/utils/cloudinaryUpload.ts +44 -0
  186. package/templates/mern-ts/server/src/utils/emailOtp.ts +30 -0
  187. package/templates/mern-ts/server/src/utils/genOtpToken.ts +22 -0
  188. package/templates/mern-ts/server/src/utils/generateVapidKeys.ts +12 -0
  189. package/templates/mern-ts/server/src/utils/jwt.ts +27 -0
  190. package/templates/mern-ts/server/src/utils/logger.ts +27 -0
  191. package/templates/mern-ts/server/tsconfig.json +14 -0
  192. package/templates/next/_gitignore +24 -0
  193. package/templates/next/package.json +20 -0
  194. package/templates/next/src/app/layout.js +7 -0
  195. package/templates/next/src/app/page.js +218 -0
  196. package/templates/next-ts/_gitignore +24 -0
  197. package/templates/next-ts/package.json +24 -0
  198. package/templates/next-ts/src/app/layout.tsx +9 -0
  199. package/templates/next-ts/src/app/page.tsx +218 -0
  200. package/templates/next-ts/tsconfig.json +27 -0
  201. package/templates/node/.env.example +62 -0
  202. package/templates/node/README.md +65 -0
  203. package/templates/node/_gitignore +24 -0
  204. package/templates/node/package.json +32 -0
  205. package/templates/node/src/app.js +42 -0
  206. package/templates/node/src/config/cloudinary.js +9 -0
  207. package/templates/node/src/config/db.js +14 -0
  208. package/templates/node/src/config/dotenv.js +2 -0
  209. package/templates/node/src/config/email.js +30 -0
  210. package/templates/node/src/config/socket.js +54 -0
  211. package/templates/node/src/config/webPush.js +9 -0
  212. package/templates/node/src/controllers/auth.controller.js +153 -0
  213. package/templates/node/src/controllers/upload.controller.js +26 -0
  214. package/templates/node/src/index.js +24 -0
  215. package/templates/node/src/middleware/auth.middleware.js +43 -0
  216. package/templates/node/src/middleware/errorHandler.js +22 -0
  217. package/templates/node/src/middleware/multer.js +21 -0
  218. package/templates/node/src/middleware/rateLimiter.js +57 -0
  219. package/templates/node/src/models/otp.model.js +21 -0
  220. package/templates/node/src/models/pushSubscription.model.js +32 -0
  221. package/templates/node/src/models/user.model.js +43 -0
  222. package/templates/node/src/routes/auth.route.js +22 -0
  223. package/templates/node/src/routes/index.js +10 -0
  224. package/templates/node/src/routes/upload.route.js +12 -0
  225. package/templates/node/src/services/auth.service.js +162 -0
  226. package/templates/node/src/services/auth.service.ts +0 -0
  227. package/templates/node/src/utils/authToken.js +26 -0
  228. package/templates/node/src/utils/cloudinary.js +27 -0
  229. package/templates/node/src/utils/cloudinaryUpload.js +87 -0
  230. package/templates/node/src/utils/emailOtp.js +190 -0
  231. package/templates/node/src/utils/genOtpToken.js +20 -0
  232. package/templates/node/src/utils/generateVapidKeys.js +12 -0
  233. package/templates/node/src/utils/jwt.js +25 -0
  234. package/templates/node/src/utils/logger.js +25 -0
  235. package/templates/node-prisma/.env.example +63 -0
  236. package/templates/node-prisma/README.md +69 -0
  237. package/templates/node-prisma/_gitignore +24 -0
  238. package/templates/node-prisma/package.json +35 -0
  239. package/templates/node-prisma/prisma/schema.prisma +41 -0
  240. package/templates/node-prisma/src/app.js +42 -0
  241. package/templates/node-prisma/src/config/cloudinary.js +9 -0
  242. package/templates/node-prisma/src/config/db.js +16 -0
  243. package/templates/node-prisma/src/config/dotenv.js +2 -0
  244. package/templates/node-prisma/src/config/email.js +30 -0
  245. package/templates/node-prisma/src/config/socket.js +54 -0
  246. package/templates/node-prisma/src/config/webPush.js +9 -0
  247. package/templates/node-prisma/src/controllers/auth.controller.js +146 -0
  248. package/templates/node-prisma/src/controllers/upload.controller.js +26 -0
  249. package/templates/node-prisma/src/index.js +24 -0
  250. package/templates/node-prisma/src/middleware/auth.middleware.js +44 -0
  251. package/templates/node-prisma/src/middleware/errorHandler.js +22 -0
  252. package/templates/node-prisma/src/middleware/multer.js +21 -0
  253. package/templates/node-prisma/src/middleware/rateLimiter.js +57 -0
  254. package/templates/node-prisma/src/routes/auth.route.js +22 -0
  255. package/templates/node-prisma/src/routes/index.js +10 -0
  256. package/templates/node-prisma/src/routes/upload.route.js +12 -0
  257. package/templates/node-prisma/src/services/auth.service.js +163 -0
  258. package/templates/node-prisma/src/services/auth.service.ts +0 -0
  259. package/templates/node-prisma/src/utils/authToken.js +26 -0
  260. package/templates/node-prisma/src/utils/cloudinary.js +27 -0
  261. package/templates/node-prisma/src/utils/cloudinaryUpload.js +87 -0
  262. package/templates/node-prisma/src/utils/emailOtp.js +190 -0
  263. package/templates/node-prisma/src/utils/genOtpToken.js +20 -0
  264. package/templates/node-prisma/src/utils/generateVapidKeys.js +12 -0
  265. package/templates/node-prisma/src/utils/jwt.js +25 -0
  266. package/templates/node-prisma/src/utils/logger.js +25 -0
  267. package/templates/node-prisma-ts/.env.example +63 -0
  268. package/templates/node-prisma-ts/README.md +73 -0
  269. package/templates/node-prisma-ts/_gitignore +24 -0
  270. package/templates/node-prisma-ts/package.json +48 -0
  271. package/templates/node-prisma-ts/prisma/schema.prisma +41 -0
  272. package/templates/node-prisma-ts/src/app.ts +36 -0
  273. package/templates/node-prisma-ts/src/config/cloudinary.ts +9 -0
  274. package/templates/node-prisma-ts/src/config/db.ts +16 -0
  275. package/templates/node-prisma-ts/src/config/dotenv.ts +2 -0
  276. package/templates/node-prisma-ts/src/config/email.ts +28 -0
  277. package/templates/node-prisma-ts/src/config/socket.ts +54 -0
  278. package/templates/node-prisma-ts/src/config/webPush.ts +9 -0
  279. package/templates/node-prisma-ts/src/controllers/auth.controller.ts +124 -0
  280. package/templates/node-prisma-ts/src/controllers/upload.controller.ts +22 -0
  281. package/templates/node-prisma-ts/src/index.ts +17 -0
  282. package/templates/node-prisma-ts/src/middleware/auth.middleware.ts +45 -0
  283. package/templates/node-prisma-ts/src/middleware/errorHandler.ts +16 -0
  284. package/templates/node-prisma-ts/src/middleware/multer.ts +20 -0
  285. package/templates/node-prisma-ts/src/middleware/rateLimiter.ts +53 -0
  286. package/templates/node-prisma-ts/src/routes/auth.route.ts +22 -0
  287. package/templates/node-prisma-ts/src/routes/index.ts +10 -0
  288. package/templates/node-prisma-ts/src/routes/upload.route.ts +11 -0
  289. package/templates/node-prisma-ts/src/services/auth.service.ts +163 -0
  290. package/templates/node-prisma-ts/src/types/express.d.ts +10 -0
  291. package/templates/node-prisma-ts/src/utils/cloudinaryUpload.ts +44 -0
  292. package/templates/node-prisma-ts/src/utils/emailOtp.ts +30 -0
  293. package/templates/node-prisma-ts/src/utils/genOtpToken.ts +22 -0
  294. package/templates/node-prisma-ts/src/utils/generateVapidKeys.ts +12 -0
  295. package/templates/node-prisma-ts/src/utils/jwt.ts +27 -0
  296. package/templates/node-prisma-ts/src/utils/logger.ts +27 -0
  297. package/templates/node-prisma-ts/tsconfig.json +14 -0
  298. package/templates/node-ts/.env.example +62 -0
  299. package/templates/node-ts/README.md +69 -0
  300. package/templates/node-ts/_gitignore +24 -0
  301. package/templates/node-ts/package.json +47 -0
  302. package/templates/node-ts/src/app.ts +36 -0
  303. package/templates/node-ts/src/config/cloudinary.ts +9 -0
  304. package/templates/node-ts/src/config/db.ts +15 -0
  305. package/templates/node-ts/src/config/dotenv.ts +2 -0
  306. package/templates/node-ts/src/config/email.ts +28 -0
  307. package/templates/node-ts/src/config/socket.ts +54 -0
  308. package/templates/node-ts/src/config/webPush.ts +9 -0
  309. package/templates/node-ts/src/controllers/auth.controller.ts +126 -0
  310. package/templates/node-ts/src/controllers/upload.controller.ts +22 -0
  311. package/templates/node-ts/src/index.ts +17 -0
  312. package/templates/node-ts/src/middleware/auth.middleware.ts +38 -0
  313. package/templates/node-ts/src/middleware/errorHandler.ts +16 -0
  314. package/templates/node-ts/src/middleware/multer.ts +20 -0
  315. package/templates/node-ts/src/middleware/rateLimiter.ts +53 -0
  316. package/templates/node-ts/src/models/otp.model.ts +21 -0
  317. package/templates/node-ts/src/models/pushSubscription.model.ts +32 -0
  318. package/templates/node-ts/src/models/user.model.ts +43 -0
  319. package/templates/node-ts/src/routes/auth.route.ts +22 -0
  320. package/templates/node-ts/src/routes/index.ts +10 -0
  321. package/templates/node-ts/src/routes/upload.route.ts +11 -0
  322. package/templates/node-ts/src/services/auth.service.ts +115 -0
  323. package/templates/node-ts/src/types/express.d.ts +10 -0
  324. package/templates/node-ts/src/utils/cloudinaryUpload.ts +44 -0
  325. package/templates/node-ts/src/utils/emailOtp.ts +30 -0
  326. package/templates/node-ts/src/utils/genOtpToken.ts +22 -0
  327. package/templates/node-ts/src/utils/generateVapidKeys.ts +12 -0
  328. package/templates/node-ts/src/utils/jwt.ts +27 -0
  329. package/templates/node-ts/src/utils/logger.ts +27 -0
  330. package/templates/node-ts/tsconfig.json +18 -0
  331. package/templates/react/.env.example +1 -0
  332. package/templates/react/_gitignore +24 -0
  333. package/templates/react/index.html +14 -0
  334. package/templates/react/package.json +39 -0
  335. package/templates/react/public/_redirects +1 -0
  336. package/templates/react/public/favicon.ico +0 -0
  337. package/templates/react/public/favicon.svg +1 -0
  338. package/templates/react/public/logo.png +0 -0
  339. package/templates/react/public/manifest.json +24 -0
  340. package/templates/react/public/sw.js +56 -0
  341. package/templates/react/src/App.jsx +68 -0
  342. package/templates/react/src/assets/animations/loading.json +1 -0
  343. package/templates/react/src/assets/data/navigation.js +29 -0
  344. package/templates/react/src/assets/images/logo.png +0 -0
  345. package/templates/react/src/components/common/Breadcrumbs.jsx +27 -0
  346. package/templates/react/src/components/common/Loading.jsx +19 -0
  347. package/templates/react/src/components/common/LottieIcon.jsx +36 -0
  348. package/templates/react/src/components/common/NotFound.jsx +78 -0
  349. package/templates/react/src/components/common/PwaInstallPrompt.jsx +72 -0
  350. package/templates/react/src/components/common/SEO.jsx +67 -0
  351. package/templates/react/src/components/common/Scroll.jsx +25 -0
  352. package/templates/react/src/components/common/Table.jsx +110 -0
  353. package/templates/react/src/components/common/ToggleSwitch.jsx +38 -0
  354. package/templates/react/src/components/common/Unauthorized.jsx +76 -0
  355. package/templates/react/src/components/layout/ProtectedRoute.jsx +17 -0
  356. package/templates/react/src/components/layout/PublicLayout.jsx +13 -0
  357. package/templates/react/src/components/layout/SidebarLayout.jsx +37 -0
  358. package/templates/react/src/components/modals/ConfirmModal.jsx +135 -0
  359. package/templates/react/src/components/modals/Modal.jsx +94 -0
  360. package/templates/react/src/components/skeletons/common/CardSkeleton.jsx +23 -0
  361. package/templates/react/src/components/skeletons/common/DashboardSkeleton.jsx +19 -0
  362. package/templates/react/src/components/skeletons/common/ListSkeleton.jsx +24 -0
  363. package/templates/react/src/components/skeletons/common/PageSkeleton.jsx +26 -0
  364. package/templates/react/src/components/skeletons/common/ProfileSkeleton.jsx +23 -0
  365. package/templates/react/src/components/skeletons/common/Skeleton.jsx +18 -0
  366. package/templates/react/src/components/skeletons/common/TableSkeleton.jsx +33 -0
  367. package/templates/react/src/components/ui/Header.jsx +230 -0
  368. package/templates/react/src/components/ui/SidebarHeader.jsx +27 -0
  369. package/templates/react/src/components/ui/sidebar.jsx +152 -0
  370. package/templates/react/src/config/api.js +22 -0
  371. package/templates/react/src/config/appConfig.js +44 -0
  372. package/templates/react/src/config/navigation.js +14 -0
  373. package/templates/react/src/hooks/useLenis.js +28 -0
  374. package/templates/react/src/hooks/usePwaInstall.js +45 -0
  375. package/templates/react/src/hooks/useWindowSize.js +25 -0
  376. package/templates/react/src/index.css +158 -0
  377. package/templates/react/src/main.jsx +24 -0
  378. package/templates/react/src/pages/Home.jsx +154 -0
  379. package/templates/react/src/pages/Login.jsx +196 -0
  380. package/templates/react/src/pages/Profile.jsx +9 -0
  381. package/templates/react/src/services/authService.js +16 -0
  382. package/templates/react/src/store/useAuthStore.js +98 -0
  383. package/templates/react/src/store/useUiStore.js +54 -0
  384. package/templates/react/src/utils/getInitials.js +10 -0
  385. package/templates/react/vite.config.js +8 -0
  386. package/templates/react-ts/_gitignore +24 -0
  387. package/templates/react-ts/index.html +14 -0
  388. package/templates/react-ts/package.json +45 -0
  389. package/templates/react-ts/public/_redirects +1 -0
  390. package/templates/react-ts/public/favicon.ico +0 -0
  391. package/templates/react-ts/public/favicon.svg +1 -0
  392. package/templates/react-ts/public/logo.png +0 -0
  393. package/templates/react-ts/public/manifest.json +24 -0
  394. package/templates/react-ts/public/sw.js +56 -0
  395. package/templates/react-ts/src/App.tsx +68 -0
  396. package/templates/react-ts/src/assets/animations/loading.json +1 -0
  397. package/templates/react-ts/src/assets/data/navigation.ts +29 -0
  398. package/templates/react-ts/src/assets/images/logo.png +0 -0
  399. package/templates/react-ts/src/components/common/Breadcrumbs.tsx +27 -0
  400. package/templates/react-ts/src/components/common/Loading.tsx +19 -0
  401. package/templates/react-ts/src/components/common/LottieIcon.tsx +36 -0
  402. package/templates/react-ts/src/components/common/NotFound.tsx +78 -0
  403. package/templates/react-ts/src/components/common/PwaInstallPrompt.tsx +72 -0
  404. package/templates/react-ts/src/components/common/SEO.tsx +67 -0
  405. package/templates/react-ts/src/components/common/Scroll.tsx +25 -0
  406. package/templates/react-ts/src/components/common/Table.tsx +118 -0
  407. package/templates/react-ts/src/components/common/ToggleSwitch.tsx +38 -0
  408. package/templates/react-ts/src/components/common/Unauthorized.tsx +76 -0
  409. package/templates/react-ts/src/components/layout/ProtectedRoute.tsx +23 -0
  410. package/templates/react-ts/src/components/layout/PublicLayout.tsx +13 -0
  411. package/templates/react-ts/src/components/layout/SidebarLayout.tsx +37 -0
  412. package/templates/react-ts/src/components/modals/ConfirmModal.tsx +135 -0
  413. package/templates/react-ts/src/components/modals/Modal.tsx +94 -0
  414. package/templates/react-ts/src/components/skeletons/common/CardSkeleton.tsx +23 -0
  415. package/templates/react-ts/src/components/skeletons/common/DashboardSkeleton.tsx +19 -0
  416. package/templates/react-ts/src/components/skeletons/common/ListSkeleton.tsx +24 -0
  417. package/templates/react-ts/src/components/skeletons/common/PageSkeleton.tsx +26 -0
  418. package/templates/react-ts/src/components/skeletons/common/ProfileSkeleton.tsx +23 -0
  419. package/templates/react-ts/src/components/skeletons/common/Skeleton.tsx +18 -0
  420. package/templates/react-ts/src/components/skeletons/common/TableSkeleton.tsx +33 -0
  421. package/templates/react-ts/src/components/ui/Header.tsx +230 -0
  422. package/templates/react-ts/src/components/ui/SidebarHeader.tsx +27 -0
  423. package/templates/react-ts/src/components/ui/sidebar.tsx +152 -0
  424. package/templates/react-ts/src/config/api.ts +22 -0
  425. package/templates/react-ts/src/config/appConfig.ts +44 -0
  426. package/templates/react-ts/src/config/navigation.ts +14 -0
  427. package/templates/react-ts/src/hooks/useLenis.ts +28 -0
  428. package/templates/react-ts/src/hooks/usePwaInstall.ts +45 -0
  429. package/templates/react-ts/src/hooks/useWindowSize.ts +25 -0
  430. package/templates/react-ts/src/index.css +158 -0
  431. package/templates/react-ts/src/main.tsx +24 -0
  432. package/templates/react-ts/src/pages/Home.tsx +154 -0
  433. package/templates/react-ts/src/pages/Login.tsx +196 -0
  434. package/templates/react-ts/src/pages/Profile.tsx +9 -0
  435. package/templates/react-ts/src/services/authService.ts +16 -0
  436. package/templates/react-ts/src/store/useAuthStore.ts +98 -0
  437. package/templates/react-ts/src/store/useUiStore.ts +54 -0
  438. package/templates/react-ts/src/utils/getInitials.ts +10 -0
  439. package/templates/react-ts/tsconfig.json +25 -0
  440. package/templates/react-ts/tsconfig.node.json +10 -0
  441. package/templates/react-ts/vite.config.ts +8 -0
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import { motion } from "motion/react";
3
+
4
+ const ToggleSwitch = ({ checked, onChange, label }) => {
5
+ return (
6
+ <div
7
+ className="flex items-center gap-3 cursor-pointer select-none w-fit group"
8
+ onClick={() => onChange(!checked)}
9
+ >
10
+ <span className="text-sm font-bold">{label}</span>
11
+ <div
12
+ className={`w-12 h-6 flex items-center rounded-full p-1 transition-all duration-300 shadow-inner border ${
13
+ checked
14
+ ? "bg-gradient-to-r from-emerald-400 to-cyan-500 border-transparent shadow-emerald-500/20"
15
+ : "bg-base-300 border-base-300/50"
16
+ }`}
17
+ >
18
+ <motion.div
19
+ className={`w-4 h-4 rounded-full shadow-sm ${
20
+ checked ? "bg-white" : "bg-base-content/40"
21
+ }`}
22
+ layout
23
+ initial={false}
24
+ animate={{
25
+ x: checked ? 24 : 0,
26
+ }}
27
+ transition={{
28
+ type: "spring",
29
+ stiffness: 500,
30
+ damping: 30,
31
+ }}
32
+ />
33
+ </div>
34
+ </div>
35
+ );
36
+ };
37
+
38
+ export default ToggleSwitch;
@@ -0,0 +1,76 @@
1
+ import { motion } from "framer-motion";
2
+ import { Link } from "react-router-dom";
3
+ import { FaArrowLeft, FaLock } from "react-icons/fa6";
4
+
5
+ const Unauthorized = () => {
6
+ return (
7
+ <div className="min-h-screen flex items-center justify-center bg-base-100 px-6">
8
+ <div className="max-w-lg text-center">
9
+ <motion.div
10
+ initial={{ scale: 0 }}
11
+ animate={{ scale: 1 }}
12
+ transition={{
13
+ type: "spring",
14
+ stiffness: 180,
15
+ damping: 12,
16
+ }}
17
+ className="mx-auto mb-6 w-24 h-24 rounded-full bg-warning/15 flex items-center justify-center"
18
+ >
19
+ <FaLock className="text-5xl text-warning" />
20
+ </motion.div>
21
+
22
+ <motion.h1
23
+ initial={{ opacity: 0, y: -15 }}
24
+ animate={{ opacity: 1, y: 0 }}
25
+ className="text-7xl font-black text-warning"
26
+ >
27
+ 401
28
+ </motion.h1>
29
+
30
+ <motion.h2
31
+ initial={{ opacity: 0 }}
32
+ animate={{ opacity: 1 }}
33
+ transition={{ delay: 0.15 }}
34
+ className="mt-4 text-3xl font-bold"
35
+ >
36
+ Unauthorized
37
+ </motion.h2>
38
+
39
+ <motion.p
40
+ initial={{ opacity: 0 }}
41
+ animate={{ opacity: 0.7 }}
42
+ transition={{ delay: 0.3 }}
43
+ className="mt-3 text-base-content/70"
44
+ >
45
+ You don't have permission to access this page. Please sign in with an
46
+ authorized account.
47
+ </motion.p>
48
+
49
+ <motion.div
50
+ initial={{ opacity: 0, y: 25 }}
51
+ animate={{ opacity: 1, y: 0 }}
52
+ transition={{ delay: 0.45 }}
53
+ className="mt-8 flex flex-wrap justify-center gap-3"
54
+ >
55
+ <Link to="/login" className="btn btn-warning">
56
+ Sign In
57
+ </Link>
58
+
59
+ <Link to="/" className="btn btn-outline">
60
+ Home
61
+ </Link>
62
+
63
+ <button
64
+ onClick={() => window.history.back()}
65
+ className="btn btn-ghost gap-2"
66
+ >
67
+ <FaArrowLeft />
68
+ Go Back
69
+ </button>
70
+ </motion.div>
71
+ </div>
72
+ </div>
73
+ );
74
+ };
75
+
76
+ export default Unauthorized;
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { Navigate } from "react-router-dom";
3
+ import { useAuthStore } from "../../store/useAuthStore";
4
+ import Loading from "../common/Loading";
5
+
6
+ interface ProtectedRouteProps {
7
+ children: React.ReactNode;
8
+ role?: string;
9
+ }
10
+
11
+ const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ children, role }) => {
12
+ const { user, isCheckingAuth } = useAuthStore();
13
+
14
+ if (isCheckingAuth) return <Loading />;
15
+
16
+ if (!user) return <Navigate to="/login" />;
17
+
18
+ if (role && user.role !== role) return <Navigate to="/" />;
19
+
20
+ return children;
21
+ };
22
+
23
+ export default ProtectedRoute;
@@ -0,0 +1,13 @@
1
+ import { Outlet } from "react-router-dom";
2
+ import Header from "../ui/Header";
3
+
4
+ const PublicLayout = () => {
5
+ return (
6
+ <>
7
+ <Header />
8
+ <Outlet />
9
+ </>
10
+ );
11
+ };
12
+
13
+ export default PublicLayout;
@@ -0,0 +1,37 @@
1
+ import { useEffect } from "react";
2
+ import { Outlet, useLocation } from "react-router-dom";
3
+ import SidebarHeader from "../ui/SidebarHeader";
4
+ import Sidebar from "../ui/sidebar";
5
+ import { useUiStore } from "../../store/useUiStore";
6
+ import appConfig from "../../config/appConfig";
7
+
8
+ const SidebarLayout = () => {
9
+ const { headerTitle, headerActions, setHeaderTitle, setHeaderActions } =
10
+ useUiStore();
11
+ const { pathname } = useLocation();
12
+
13
+ // Reset header title and actions whenever the route shifts
14
+ useEffect(() => {
15
+ setHeaderTitle(appConfig.app.name);
16
+ setHeaderActions(null);
17
+ }, [pathname, setHeaderTitle, setHeaderActions]);
18
+
19
+ return (
20
+ <div className="flex h-screen overflow-hidden">
21
+ <Sidebar />
22
+
23
+ <div className="flex flex-1 flex-col overflow-hidden">
24
+ <SidebarHeader title={headerTitle} actions={headerActions} />
25
+
26
+ <main
27
+ className="flex-1 h-full overflow-y-auto px-2 py-6 md:p-6 max-w-7xl"
28
+ data-lenis-prevent
29
+ >
30
+ <Outlet />
31
+ </main>
32
+ </div>
33
+ </div>
34
+ );
35
+ };
36
+
37
+ export default SidebarLayout;
@@ -0,0 +1,135 @@
1
+ import { useEffect } from "react";
2
+ import { createPortal } from "react-dom";
3
+ import {
4
+ FaTriangleExclamation,
5
+ FaCircleInfo,
6
+ FaCircleCheck,
7
+ FaCircleXmark,
8
+ } from "react-icons/fa6";
9
+
10
+ const variants = {
11
+ warning: {
12
+ icon: FaTriangleExclamation,
13
+ iconBg: "bg-warning/15",
14
+ iconColor: "text-warning",
15
+ button: "btn-warning",
16
+ },
17
+ error: {
18
+ icon: FaCircleXmark,
19
+ iconBg: "bg-error/15",
20
+ iconColor: "text-error",
21
+ button: "btn-error",
22
+ },
23
+ success: {
24
+ icon: FaCircleCheck,
25
+ iconBg: "bg-success/15",
26
+ iconColor: "text-success",
27
+ button: "btn-success",
28
+ },
29
+ info: {
30
+ icon: FaCircleInfo,
31
+ iconBg: "bg-info/15",
32
+ iconColor: "text-info",
33
+ button: "btn-info",
34
+ },
35
+ };
36
+
37
+ const ConfirmModal = ({
38
+ open,
39
+ variant = "warning",
40
+ title = "Confirm Action",
41
+ message = "Are you sure you want to continue?",
42
+ confirmText = "Confirm",
43
+ cancelText = "Cancel",
44
+ loading = false,
45
+ closeOnBackdrop = true,
46
+ closeOnEsc = true,
47
+ onConfirm,
48
+ onCancel,
49
+ }) => {
50
+ useEffect(() => {
51
+ if (!open || !closeOnEsc) return;
52
+
53
+ const handleKeyDown = (e) => {
54
+ if (e.key === "Escape") {
55
+ onCancel?.();
56
+ }
57
+ };
58
+
59
+ window.addEventListener("keydown", handleKeyDown);
60
+
61
+ return () => window.removeEventListener("keydown", handleKeyDown);
62
+ }, [open, closeOnEsc, onCancel]);
63
+
64
+ if (!open) return null;
65
+
66
+ const style = variants[variant] || variants.warning;
67
+ const Icon = style.icon;
68
+
69
+ return createPortal(
70
+ <div className="fixed inset-0 z-[9999] flex items-center justify-center">
71
+ {/* Backdrop */}
72
+
73
+ <div
74
+ className="absolute inset-0 bg-black/60 backdrop-blur-sm"
75
+ onClick={closeOnBackdrop ? onCancel : undefined}
76
+ />
77
+
78
+ {/* Modal */}
79
+
80
+ <div className="relative w-full max-w-md mx-4 rounded-2xl bg-base-100 shadow-2xl animate-in fade-in zoom-in duration-200">
81
+ <div className="p-6">
82
+
83
+ <div className="flex gap-4">
84
+
85
+ <div
86
+ className={`w-14 h-14 rounded-full flex items-center justify-center shrink-0 ${style.iconBg}`}
87
+ >
88
+ <Icon className={`text-2xl ${style.iconColor}`} />
89
+ </div>
90
+
91
+ <div className="flex-1">
92
+
93
+ <h2 className="text-xl font-bold">
94
+ {title}
95
+ </h2>
96
+
97
+ <p className="mt-2 text-sm text-base-content/70 leading-relaxed">
98
+ {message}
99
+ </p>
100
+
101
+ </div>
102
+
103
+ </div>
104
+
105
+ <div className="mt-8 flex justify-end gap-3">
106
+
107
+ <button
108
+ className="btn btn-ghost"
109
+ disabled={loading}
110
+ onClick={onCancel}
111
+ >
112
+ {cancelText}
113
+ </button>
114
+
115
+ <button
116
+ className={`btn ${style.button}`}
117
+ disabled={loading}
118
+ onClick={onConfirm}
119
+ >
120
+ {loading && (
121
+ <span className="loading loading-spinner loading-xs" />
122
+ )}
123
+
124
+ {confirmText}
125
+ </button>
126
+
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </div>,
131
+ document.body,
132
+ );
133
+ };
134
+
135
+ export default ConfirmModal;
@@ -0,0 +1,94 @@
1
+ import { useEffect } from "react";
2
+ import { createPortal } from "react-dom";
3
+ import { IoClose } from "react-icons/io5";
4
+
5
+ const sizes = {
6
+ sm: "max-w-sm",
7
+ md: "max-w-md",
8
+ lg: "max-w-lg",
9
+ xl: "max-w-2xl",
10
+ "2xl": "max-w-4xl",
11
+ full: "max-w-7xl",
12
+ };
13
+
14
+ const Modal = ({
15
+ open,
16
+ onClose,
17
+ title,
18
+ children,
19
+ size = "md",
20
+ closeOnBackdrop = true,
21
+ closeOnEsc = true,
22
+ showCloseButton = true,
23
+ footer,
24
+ }) => {
25
+ useEffect(() => {
26
+ if (!open || !closeOnEsc) return;
27
+
28
+ const handleKeyDown = (e) => {
29
+ if (e.key === "Escape") {
30
+ onClose?.();
31
+ }
32
+ };
33
+
34
+ document.addEventListener("keydown", handleKeyDown);
35
+
36
+ return () =>
37
+ document.removeEventListener("keydown", handleKeyDown);
38
+ }, [open, closeOnEsc, onClose]);
39
+
40
+ if (!open) return null;
41
+
42
+ return createPortal(
43
+ <div className="fixed inset-0 z-[9999] flex items-center justify-center p-4">
44
+ {/* Backdrop */}
45
+ <div
46
+ className="absolute inset-0 bg-black/50 backdrop-blur-sm"
47
+ onClick={closeOnBackdrop ? onClose : undefined}
48
+ />
49
+
50
+ {/* Modal */}
51
+ <div
52
+ className={`
53
+ relative
54
+ w-full
55
+ ${sizes[size]}
56
+ rounded-2xl
57
+ bg-base-100
58
+ shadow-2xl
59
+ border border-base-300
60
+ animate-in zoom-in-95 fade-in duration-200
61
+ `}
62
+ >
63
+ {/* Header */}
64
+ <div className="flex items-center justify-between border-b border-base-300 px-6 py-4">
65
+ <h2 className="text-lg font-bold">{title}</h2>
66
+
67
+ {showCloseButton && (
68
+ <button
69
+ className="btn btn-circle btn-sm btn-ghost"
70
+ onClick={onClose}
71
+ >
72
+ <IoClose size={20} />
73
+ </button>
74
+ )}
75
+ </div>
76
+
77
+ {/* Body */}
78
+ <div className="max-h-[70vh] overflow-y-auto p-6">
79
+ {children}
80
+ </div>
81
+
82
+ {/* Footer */}
83
+ {footer && (
84
+ <div className="border-t border-base-300 px-6 py-4">
85
+ {footer}
86
+ </div>
87
+ )}
88
+ </div>
89
+ </div>,
90
+ document.body,
91
+ );
92
+ };
93
+
94
+ export default Modal;
@@ -0,0 +1,23 @@
1
+ import Skeleton from "./Skeleton";
2
+
3
+ const CardSkeleton = () => {
4
+ return (
5
+ <div className="card bg-base-100 shadow border border-base-300">
6
+ <div className="card-body space-y-4">
7
+
8
+ <Skeleton className="h-40 w-full rounded-xl" />
9
+
10
+ <Skeleton className="h-6 w-2/3" />
11
+
12
+ <Skeleton className="h-4 w-full" />
13
+
14
+ <Skeleton className="h-4 w-5/6" />
15
+
16
+ <Skeleton className="h-10 w-28" />
17
+
18
+ </div>
19
+ </div>
20
+ );
21
+ };
22
+
23
+ export default CardSkeleton;
@@ -0,0 +1,19 @@
1
+ import CardSkeleton from "./CardSkeleton";
2
+
3
+ const DashboardSkeleton = () => {
4
+ return (
5
+ <div className="space-y-8">
6
+
7
+ <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-6">
8
+ {[...Array(4)].map((_, i) => (
9
+ <CardSkeleton key={i} />
10
+ ))}
11
+ </div>
12
+
13
+ <CardSkeleton />
14
+
15
+ </div>
16
+ );
17
+ };
18
+
19
+ export default DashboardSkeleton;
@@ -0,0 +1,24 @@
1
+ import Skeleton from "./Skeleton";
2
+
3
+ const ListSkeleton = ({ items = 6 }) => {
4
+ return (
5
+ <div className="space-y-4">
6
+ {Array.from({ length: items }).map((_, i) => (
7
+ <div
8
+ key={i}
9
+ className="flex items-center gap-4"
10
+ >
11
+ <Skeleton className="w-12 h-12 rounded-full" />
12
+
13
+ <div className="flex-1 space-y-2">
14
+ <Skeleton className="h-5 w-1/3" />
15
+
16
+ <Skeleton className="h-4 w-2/3" />
17
+ </div>
18
+ </div>
19
+ ))}
20
+ </div>
21
+ );
22
+ };
23
+
24
+ export default ListSkeleton;
@@ -0,0 +1,26 @@
1
+ import Skeleton from "./Skeleton";
2
+
3
+ const PageSkeleton = () => {
4
+ return (
5
+ <div className="space-y-8">
6
+
7
+ <Skeleton className="h-10 w-56" />
8
+
9
+ <Skeleton className="h-64 w-full rounded-2xl" />
10
+
11
+ <div className="grid md:grid-cols-3 gap-6">
12
+
13
+ {[1, 2, 3].map((i) => (
14
+ <Skeleton
15
+ key={i}
16
+ className="h-40 rounded-xl"
17
+ />
18
+ ))}
19
+
20
+ </div>
21
+
22
+ </div>
23
+ );
24
+ };
25
+
26
+ export default PageSkeleton;
@@ -0,0 +1,23 @@
1
+ import Skeleton from "./Skeleton";
2
+
3
+ const ProfileSkeleton = () => {
4
+ return (
5
+ <div className="flex gap-6 items-center">
6
+
7
+ <Skeleton className="w-24 h-24 rounded-full" />
8
+
9
+ <div className="flex-1 space-y-3">
10
+
11
+ <Skeleton className="h-6 w-48" />
12
+
13
+ <Skeleton className="h-4 w-64" />
14
+
15
+ <Skeleton className="h-10 w-32" />
16
+
17
+ </div>
18
+
19
+ </div>
20
+ );
21
+ };
22
+
23
+ export default ProfileSkeleton;
@@ -0,0 +1,18 @@
1
+ const Skeleton = ({
2
+ className = "",
3
+ rounded = "rounded-lg",
4
+ animate = true,
5
+ }) => {
6
+ return (
7
+ <div
8
+ className={`
9
+ bg-base-300
10
+ ${rounded}
11
+ ${animate ? "animate-pulse" : ""}
12
+ ${className}
13
+ `}
14
+ />
15
+ );
16
+ };
17
+
18
+ export default Skeleton;
@@ -0,0 +1,33 @@
1
+ import Skeleton from "./Skeleton";
2
+
3
+ const TableSkeleton = ({ rows = 6, columns = 5 }) => {
4
+ return (
5
+ <div className="overflow-x-auto border border-base-300 rounded-xl">
6
+ <table className="table">
7
+ <thead>
8
+ <tr>
9
+ {Array.from({ length: columns }).map((_, i) => (
10
+ <th key={i}>
11
+ <Skeleton className="h-4 w-20" />
12
+ </th>
13
+ ))}
14
+ </tr>
15
+ </thead>
16
+
17
+ <tbody>
18
+ {Array.from({ length: rows }).map((_, row) => (
19
+ <tr key={row}>
20
+ {Array.from({ length: columns }).map((_, col) => (
21
+ <td key={col}>
22
+ <Skeleton className="h-4 w-full" />
23
+ </td>
24
+ ))}
25
+ </tr>
26
+ ))}
27
+ </tbody>
28
+ </table>
29
+ </div>
30
+ );
31
+ };
32
+
33
+ export default TableSkeleton;