@digilogiclabs/create-saas-app 2.9.1 → 2.11.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 (377) hide show
  1. package/README.md +153 -113
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/commands/create.d.ts.map +1 -1
  4. package/dist/cli/commands/create.js +2 -6
  5. package/dist/cli/commands/create.js.map +1 -1
  6. package/dist/generators/template-generator.d.ts.map +1 -1
  7. package/dist/generators/template-generator.js +6 -3
  8. package/dist/generators/template-generator.js.map +1 -1
  9. package/dist/templates/shared/auth/supabase/web/src/middleware.ts +63 -0
  10. package/dist/templates/shared/database/supabase/web/src/lib/supabase/server.ts +3 -1
  11. package/dist/templates/shared/design/web/src/config/design.config.ts +14 -14
  12. package/dist/templates/shared/landing/web/src/components/LandingPage.tsx +0 -3
  13. package/dist/templates/shared/security/web/src/lib/api-security.ts +2 -2
  14. package/dist/templates/web/ai-platform/template/next.config.js +14 -14
  15. package/dist/templates/web/ai-platform/template/package.json +11 -22
  16. package/dist/templates/web/ai-platform/template/postcss.config.mjs +8 -0
  17. package/dist/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  18. package/dist/templates/web/ai-platform/template/src/app/chat/page.tsx +234 -235
  19. package/dist/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -142
  20. package/dist/templates/web/ai-platform/template/src/app/error.tsx +13 -13
  21. package/dist/templates/web/ai-platform/template/src/app/globals.css +97 -34
  22. package/dist/templates/web/ai-platform/template/src/app/layout.tsx +3 -0
  23. package/dist/templates/web/ai-platform/template/src/app/loading.tsx +22 -22
  24. package/dist/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  25. package/dist/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  26. package/dist/templates/web/ai-platform/template/src/app/page.tsx +248 -154
  27. package/dist/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  28. package/dist/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  29. package/dist/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  30. package/dist/templates/web/ai-platform/template/src/lib/auth-server.ts +32 -33
  31. package/dist/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  32. package/dist/templates/web/base/template/next.config.js +14 -15
  33. package/dist/templates/web/base/template/package.json +16 -31
  34. package/dist/templates/web/base/template/postcss.config.mjs +8 -0
  35. package/dist/templates/web/base/template/src/app/error.tsx +97 -97
  36. package/dist/templates/web/base/template/src/app/globals.css +87 -148
  37. package/dist/templates/web/base/template/src/app/layout.tsx +4 -1
  38. package/dist/templates/web/base/template/src/app/loading.tsx +52 -52
  39. package/dist/templates/web/base/template/tsconfig.json +27 -33
  40. package/dist/templates/web/iot-dashboard/template/next.config.js +14 -14
  41. package/dist/templates/web/iot-dashboard/template/package.json +12 -16
  42. package/dist/templates/web/iot-dashboard/template/postcss.config.mjs +8 -0
  43. package/dist/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  44. package/dist/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  45. package/dist/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +224 -224
  46. package/dist/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  47. package/dist/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  48. package/dist/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  49. package/dist/templates/web/iot-dashboard/template/src/app/error.tsx +8 -8
  50. package/dist/templates/web/iot-dashboard/template/src/app/globals.css +97 -20
  51. package/dist/templates/web/iot-dashboard/template/src/app/layout.tsx +3 -0
  52. package/dist/templates/web/iot-dashboard/template/src/app/loading.tsx +5 -5
  53. package/dist/templates/web/iot-dashboard/template/src/app/login/page.tsx +112 -0
  54. package/dist/templates/web/iot-dashboard/template/src/app/page.tsx +266 -189
  55. package/dist/templates/web/iot-dashboard/template/src/app/settings/page.tsx +186 -0
  56. package/dist/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  57. package/dist/templates/web/iot-dashboard/template/src/lib/auth-server.ts +32 -33
  58. package/dist/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  59. package/dist/templates/web/marketplace/template/next.config.js +14 -14
  60. package/dist/templates/web/marketplace/template/package.json +11 -18
  61. package/dist/templates/web/marketplace/template/postcss.config.mjs +8 -0
  62. package/dist/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  63. package/dist/templates/web/marketplace/template/src/app/cart/page.tsx +147 -147
  64. package/dist/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -149
  65. package/dist/templates/web/marketplace/template/src/app/error.tsx +7 -7
  66. package/dist/templates/web/marketplace/template/src/app/globals.css +97 -20
  67. package/dist/templates/web/marketplace/template/src/app/layout.tsx +3 -0
  68. package/dist/templates/web/marketplace/template/src/app/loading.tsx +5 -5
  69. package/dist/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  70. package/dist/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  71. package/dist/templates/web/marketplace/template/src/app/page.tsx +370 -169
  72. package/dist/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  73. package/dist/templates/web/marketplace/template/src/app/products/page.tsx +129 -129
  74. package/dist/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  75. package/dist/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  76. package/dist/templates/web/marketplace/template/src/lib/auth-server.ts +32 -33
  77. package/dist/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  78. package/dist/templates/web/micro-saas/template/next.config.js +14 -14
  79. package/dist/templates/web/micro-saas/template/package.json +9 -8
  80. package/dist/templates/web/micro-saas/template/postcss.config.mjs +8 -0
  81. package/dist/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  82. package/dist/templates/web/micro-saas/template/src/app/dashboard/page.tsx +145 -117
  83. package/dist/templates/web/micro-saas/template/src/app/error.tsx +7 -7
  84. package/dist/templates/web/micro-saas/template/src/app/globals.css +97 -20
  85. package/dist/templates/web/micro-saas/template/src/app/layout.tsx +3 -0
  86. package/dist/templates/web/micro-saas/template/src/app/loading.tsx +43 -27
  87. package/dist/templates/web/micro-saas/template/src/app/login/page.tsx +112 -87
  88. package/dist/templates/web/micro-saas/template/src/app/page.tsx +227 -137
  89. package/dist/templates/web/micro-saas/template/src/app/signup/page.tsx +133 -108
  90. package/dist/templates/web/micro-saas/template/src/lib/auth-server.ts +32 -33
  91. package/dist/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  92. package/dist/templates/web/ui-auth/template/next.config.js +14 -12
  93. package/dist/templates/web/ui-auth/template/package.json +16 -26
  94. package/dist/templates/web/ui-auth/template/postcss.config.mjs +8 -0
  95. package/dist/templates/web/ui-auth/template/src/app/error.tsx +67 -67
  96. package/dist/templates/web/ui-auth/template/src/app/globals.css +85 -84
  97. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +4 -1
  98. package/dist/templates/web/ui-auth/template/src/app/loading.tsx +20 -38
  99. package/dist/templates/web/ui-auth/template/tsconfig.json +27 -33
  100. package/dist/templates/web/ui-auth-ai/template/next.config.js +15 -13
  101. package/dist/templates/web/ui-auth-ai/template/package.json +25 -21
  102. package/dist/templates/web/ui-auth-ai/template/postcss.config.mjs +8 -0
  103. package/dist/templates/web/ui-auth-ai/template/src/app/error.tsx +7 -7
  104. package/dist/templates/web/ui-auth-ai/template/src/app/globals.css +87 -25
  105. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +3 -0
  106. package/dist/templates/web/ui-auth-ai/template/src/app/loading.tsx +4 -4
  107. package/dist/templates/web/ui-auth-ai/template/tsconfig.json +27 -28
  108. package/dist/templates/web/ui-auth-payments/template/next.config.js +14 -12
  109. package/dist/templates/web/ui-auth-payments/template/package.json +16 -29
  110. package/dist/templates/web/ui-auth-payments/template/postcss.config.mjs +8 -0
  111. package/dist/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -67
  112. package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +89 -204
  113. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +4 -1
  114. package/dist/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -20
  115. package/dist/templates/web/ui-auth-payments/template/tsconfig.json +27 -33
  116. package/dist/templates/web/ui-auth-payments-ai/template/next.config.js +14 -12
  117. package/dist/templates/web/ui-auth-payments-ai/template/package.json +17 -33
  118. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.mjs +8 -0
  119. package/dist/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -67
  120. package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +85 -85
  121. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +4 -1
  122. package/dist/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -20
  123. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.json +27 -33
  124. package/dist/templates/web/ui-auth-payments-audio/template/next.config.js +14 -12
  125. package/dist/templates/web/ui-auth-payments-audio/template/package.json +17 -30
  126. package/dist/templates/web/ui-auth-payments-audio/template/postcss.config.mjs +8 -0
  127. package/dist/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -67
  128. package/dist/templates/web/ui-auth-payments-audio/template/src/app/globals.css +85 -85
  129. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +4 -1
  130. package/dist/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -20
  131. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.json +27 -33
  132. package/dist/templates/web/ui-auth-payments-video/template/next.config.js +14 -12
  133. package/dist/templates/web/ui-auth-payments-video/template/package.json +17 -30
  134. package/dist/templates/web/ui-auth-payments-video/template/postcss.config.mjs +8 -0
  135. package/dist/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -67
  136. package/dist/templates/web/ui-auth-payments-video/template/src/app/globals.css +89 -221
  137. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +4 -1
  138. package/dist/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -20
  139. package/dist/templates/web/ui-auth-payments-video/template/tsconfig.json +27 -33
  140. package/dist/templates/web/ui-only/template/next.config.js +14 -12
  141. package/dist/templates/web/ui-only/template/package.json +15 -25
  142. package/dist/templates/web/ui-only/template/postcss.config.mjs +8 -0
  143. package/dist/templates/web/ui-only/template/src/app/error.tsx +67 -67
  144. package/dist/templates/web/ui-only/template/src/app/globals.css +85 -31
  145. package/dist/templates/web/ui-only/template/src/app/layout.tsx +4 -1
  146. package/dist/templates/web/ui-only/template/src/app/loading.tsx +20 -20
  147. package/dist/templates/web/ui-only/template/tsconfig.json +27 -33
  148. package/package.json +1 -1
  149. package/src/templates/shared/auth/supabase/web/src/middleware.ts +63 -0
  150. package/src/templates/shared/database/supabase/web/src/lib/supabase/server.ts +3 -1
  151. package/src/templates/shared/design/web/src/config/design.config.ts +14 -14
  152. package/src/templates/shared/landing/web/src/components/LandingPage.tsx +0 -3
  153. package/src/templates/shared/security/web/src/lib/api-security.ts +2 -2
  154. package/src/templates/web/ai-platform/template/next.config.js +14 -14
  155. package/src/templates/web/ai-platform/template/package.json +11 -22
  156. package/src/templates/web/ai-platform/template/postcss.config.mjs +8 -0
  157. package/src/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  158. package/src/templates/web/ai-platform/template/src/app/chat/page.tsx +234 -235
  159. package/src/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -142
  160. package/src/templates/web/ai-platform/template/src/app/error.tsx +13 -13
  161. package/src/templates/web/ai-platform/template/src/app/globals.css +97 -34
  162. package/src/templates/web/ai-platform/template/src/app/layout.tsx +3 -0
  163. package/src/templates/web/ai-platform/template/src/app/loading.tsx +22 -22
  164. package/src/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  165. package/src/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  166. package/src/templates/web/ai-platform/template/src/app/page.tsx +248 -154
  167. package/src/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  168. package/src/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  169. package/src/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  170. package/src/templates/web/ai-platform/template/src/lib/auth-server.ts +32 -33
  171. package/src/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  172. package/src/templates/web/base/template/next.config.js +14 -15
  173. package/src/templates/web/base/template/package.json +16 -31
  174. package/src/templates/web/base/template/postcss.config.mjs +8 -0
  175. package/src/templates/web/base/template/src/app/error.tsx +97 -97
  176. package/src/templates/web/base/template/src/app/globals.css +87 -148
  177. package/src/templates/web/base/template/src/app/layout.tsx +4 -1
  178. package/src/templates/web/base/template/src/app/loading.tsx +52 -52
  179. package/src/templates/web/base/template/tsconfig.json +27 -33
  180. package/src/templates/web/iot-dashboard/template/next.config.js +14 -14
  181. package/src/templates/web/iot-dashboard/template/package.json +12 -16
  182. package/src/templates/web/iot-dashboard/template/postcss.config.mjs +8 -0
  183. package/src/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  184. package/src/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  185. package/src/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +224 -224
  186. package/src/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  187. package/src/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  188. package/src/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  189. package/src/templates/web/iot-dashboard/template/src/app/error.tsx +8 -8
  190. package/src/templates/web/iot-dashboard/template/src/app/globals.css +97 -20
  191. package/src/templates/web/iot-dashboard/template/src/app/layout.tsx +3 -0
  192. package/src/templates/web/iot-dashboard/template/src/app/loading.tsx +5 -5
  193. package/src/templates/web/iot-dashboard/template/src/app/login/page.tsx +112 -0
  194. package/src/templates/web/iot-dashboard/template/src/app/page.tsx +266 -189
  195. package/src/templates/web/iot-dashboard/template/src/app/settings/page.tsx +186 -0
  196. package/src/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  197. package/src/templates/web/iot-dashboard/template/src/lib/auth-server.ts +32 -33
  198. package/src/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  199. package/src/templates/web/marketplace/template/next.config.js +14 -14
  200. package/src/templates/web/marketplace/template/package.json +11 -18
  201. package/src/templates/web/marketplace/template/postcss.config.mjs +8 -0
  202. package/src/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  203. package/src/templates/web/marketplace/template/src/app/cart/page.tsx +147 -147
  204. package/src/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -149
  205. package/src/templates/web/marketplace/template/src/app/error.tsx +7 -7
  206. package/src/templates/web/marketplace/template/src/app/globals.css +97 -20
  207. package/src/templates/web/marketplace/template/src/app/layout.tsx +3 -0
  208. package/src/templates/web/marketplace/template/src/app/loading.tsx +5 -5
  209. package/src/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  210. package/src/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  211. package/src/templates/web/marketplace/template/src/app/page.tsx +370 -169
  212. package/src/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  213. package/src/templates/web/marketplace/template/src/app/products/page.tsx +129 -129
  214. package/src/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  215. package/src/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  216. package/src/templates/web/marketplace/template/src/lib/auth-server.ts +32 -33
  217. package/src/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  218. package/src/templates/web/micro-saas/template/next.config.js +14 -14
  219. package/src/templates/web/micro-saas/template/package.json +9 -8
  220. package/src/templates/web/micro-saas/template/postcss.config.mjs +8 -0
  221. package/src/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  222. package/src/templates/web/micro-saas/template/src/app/dashboard/page.tsx +145 -117
  223. package/src/templates/web/micro-saas/template/src/app/error.tsx +7 -7
  224. package/src/templates/web/micro-saas/template/src/app/globals.css +97 -20
  225. package/src/templates/web/micro-saas/template/src/app/layout.tsx +3 -0
  226. package/src/templates/web/micro-saas/template/src/app/loading.tsx +43 -27
  227. package/src/templates/web/micro-saas/template/src/app/login/page.tsx +112 -87
  228. package/src/templates/web/micro-saas/template/src/app/page.tsx +227 -137
  229. package/src/templates/web/micro-saas/template/src/app/signup/page.tsx +133 -108
  230. package/src/templates/web/micro-saas/template/src/lib/auth-server.ts +32 -33
  231. package/src/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  232. package/src/templates/web/ui-auth/template/next.config.js +14 -12
  233. package/src/templates/web/ui-auth/template/package.json +16 -26
  234. package/src/templates/web/ui-auth/template/postcss.config.mjs +8 -0
  235. package/src/templates/web/ui-auth/template/src/app/error.tsx +67 -67
  236. package/src/templates/web/ui-auth/template/src/app/globals.css +85 -84
  237. package/src/templates/web/ui-auth/template/src/app/layout.tsx +4 -1
  238. package/src/templates/web/ui-auth/template/src/app/loading.tsx +20 -38
  239. package/src/templates/web/ui-auth/template/tsconfig.json +27 -33
  240. package/src/templates/web/ui-auth-ai/template/next.config.js +15 -13
  241. package/src/templates/web/ui-auth-ai/template/package.json +25 -21
  242. package/src/templates/web/ui-auth-ai/template/postcss.config.mjs +8 -0
  243. package/src/templates/web/ui-auth-ai/template/src/app/error.tsx +7 -7
  244. package/src/templates/web/ui-auth-ai/template/src/app/globals.css +87 -25
  245. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +3 -0
  246. package/src/templates/web/ui-auth-ai/template/src/app/loading.tsx +4 -4
  247. package/src/templates/web/ui-auth-ai/template/tsconfig.json +27 -28
  248. package/src/templates/web/ui-auth-payments/template/next.config.js +14 -12
  249. package/src/templates/web/ui-auth-payments/template/package.json +16 -29
  250. package/src/templates/web/ui-auth-payments/template/postcss.config.mjs +8 -0
  251. package/src/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -67
  252. package/src/templates/web/ui-auth-payments/template/src/app/globals.css +89 -204
  253. package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +4 -1
  254. package/src/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -20
  255. package/src/templates/web/ui-auth-payments/template/tsconfig.json +27 -33
  256. package/src/templates/web/ui-auth-payments-ai/template/next.config.js +14 -12
  257. package/src/templates/web/ui-auth-payments-ai/template/package.json +17 -33
  258. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.mjs +8 -0
  259. package/src/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -67
  260. package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +85 -85
  261. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +4 -1
  262. package/src/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -20
  263. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.json +27 -33
  264. package/src/templates/web/ui-auth-payments-audio/template/next.config.js +14 -12
  265. package/src/templates/web/ui-auth-payments-audio/template/package.json +17 -30
  266. package/src/templates/web/ui-auth-payments-audio/template/postcss.config.mjs +8 -0
  267. package/src/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -67
  268. package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +85 -85
  269. package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +4 -1
  270. package/src/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -20
  271. package/src/templates/web/ui-auth-payments-audio/template/tsconfig.json +27 -33
  272. package/src/templates/web/ui-auth-payments-video/template/next.config.js +14 -12
  273. package/src/templates/web/ui-auth-payments-video/template/package.json +17 -30
  274. package/src/templates/web/ui-auth-payments-video/template/postcss.config.mjs +8 -0
  275. package/src/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -67
  276. package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +89 -221
  277. package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +4 -1
  278. package/src/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -20
  279. package/src/templates/web/ui-auth-payments-video/template/tsconfig.json +27 -33
  280. package/src/templates/web/ui-only/template/next.config.js +14 -12
  281. package/src/templates/web/ui-only/template/package.json +15 -25
  282. package/src/templates/web/ui-only/template/postcss.config.mjs +8 -0
  283. package/src/templates/web/ui-only/template/src/app/error.tsx +67 -67
  284. package/src/templates/web/ui-only/template/src/app/globals.css +85 -31
  285. package/src/templates/web/ui-only/template/src/app/layout.tsx +4 -1
  286. package/src/templates/web/ui-only/template/src/app/loading.tsx +20 -20
  287. package/src/templates/web/ui-only/template/tsconfig.json +27 -33
  288. package/dist/templates/web/ai-platform/template/middleware.ts +0 -55
  289. package/dist/templates/web/ai-platform/template/src/lib/supabase/client.ts +0 -8
  290. package/dist/templates/web/ai-platform/template/src/lib/supabase/server.ts +0 -27
  291. package/dist/templates/web/base/template/postcss.config.js +0 -7
  292. package/dist/templates/web/base/template/tailwind.config.js +0 -77
  293. package/dist/templates/web/iot-dashboard/template/middleware.ts +0 -56
  294. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +0 -8
  295. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +0 -27
  296. package/dist/templates/web/marketplace/template/middleware.ts +0 -56
  297. package/dist/templates/web/marketplace/template/src/lib/supabase/client.ts +0 -8
  298. package/dist/templates/web/marketplace/template/src/lib/supabase/server.ts +0 -27
  299. package/dist/templates/web/micro-saas/template/middleware.ts +0 -53
  300. package/dist/templates/web/micro-saas/template/src/lib/supabase/client.ts +0 -8
  301. package/dist/templates/web/micro-saas/template/src/lib/supabase/server.ts +0 -29
  302. package/dist/templates/web/ui-auth/template/.claude +0 -21
  303. package/dist/templates/web/ui-auth/template/context.md +0 -105
  304. package/dist/templates/web/ui-auth/template/postcss.config.js +0 -7
  305. package/dist/templates/web/ui-auth/template/tailwind.config.js +0 -77
  306. package/dist/templates/web/ui-auth-ai/template/postcss.config.js +0 -6
  307. package/dist/templates/web/ui-auth-ai/template/tailwind.config.js +0 -22
  308. package/dist/templates/web/ui-auth-payments/template/middleware.ts +0 -68
  309. package/dist/templates/web/ui-auth-payments/template/package-lock.json +0 -12240
  310. package/dist/templates/web/ui-auth-payments/template/postcss.config.js +0 -7
  311. package/dist/templates/web/ui-auth-payments/template/tailwind.config.js +0 -77
  312. package/dist/templates/web/ui-auth-payments/template/tsconfig.tsbuildinfo +0 -1
  313. package/dist/templates/web/ui-auth-payments-ai/template/.claude +0 -21
  314. package/dist/templates/web/ui-auth-payments-ai/template/context.md +0 -169
  315. package/dist/templates/web/ui-auth-payments-ai/template/middleware.ts +0 -68
  316. package/dist/templates/web/ui-auth-payments-ai/template/package-lock.json +0 -12241
  317. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.js +0 -7
  318. package/dist/templates/web/ui-auth-payments-ai/template/tailwind.config.js +0 -77
  319. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +0 -1
  320. package/dist/templates/web/ui-auth-payments-audio/template/middleware.ts +0 -68
  321. package/dist/templates/web/ui-auth-payments-audio/template/package-lock.json +0 -12241
  322. package/dist/templates/web/ui-auth-payments-audio/template/postcss.config.js +0 -7
  323. package/dist/templates/web/ui-auth-payments-audio/template/tailwind.config.js +0 -77
  324. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.tsbuildinfo +0 -1
  325. package/dist/templates/web/ui-auth-payments-video/template/postcss.config.js +0 -7
  326. package/dist/templates/web/ui-auth-payments-video/template/tailwind.config.js +0 -77
  327. package/dist/templates/web/ui-only/template/postcss.config.js +0 -7
  328. package/dist/templates/web/ui-only/template/tailwind.config.js +0 -77
  329. package/src/templates/web/ai-platform/template/middleware.ts +0 -55
  330. package/src/templates/web/ai-platform/template/src/lib/supabase/client.ts +0 -8
  331. package/src/templates/web/ai-platform/template/src/lib/supabase/server.ts +0 -27
  332. package/src/templates/web/base/template/postcss.config.js +0 -7
  333. package/src/templates/web/base/template/tailwind.config.js +0 -77
  334. package/src/templates/web/iot-dashboard/template/middleware.ts +0 -56
  335. package/src/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +0 -8
  336. package/src/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +0 -27
  337. package/src/templates/web/marketplace/template/middleware.ts +0 -56
  338. package/src/templates/web/marketplace/template/src/lib/supabase/client.ts +0 -8
  339. package/src/templates/web/marketplace/template/src/lib/supabase/server.ts +0 -27
  340. package/src/templates/web/micro-saas/template/middleware.ts +0 -53
  341. package/src/templates/web/micro-saas/template/src/lib/supabase/client.ts +0 -8
  342. package/src/templates/web/micro-saas/template/src/lib/supabase/server.ts +0 -29
  343. package/src/templates/web/ui-auth/template/.claude +0 -21
  344. package/src/templates/web/ui-auth/template/context.md +0 -105
  345. package/src/templates/web/ui-auth/template/postcss.config.js +0 -7
  346. package/src/templates/web/ui-auth/template/tailwind.config.js +0 -77
  347. package/src/templates/web/ui-auth-ai/template/postcss.config.js +0 -6
  348. package/src/templates/web/ui-auth-ai/template/tailwind.config.js +0 -22
  349. package/src/templates/web/ui-auth-payments/template/middleware.ts +0 -68
  350. package/src/templates/web/ui-auth-payments/template/package-lock.json +0 -12240
  351. package/src/templates/web/ui-auth-payments/template/postcss.config.js +0 -7
  352. package/src/templates/web/ui-auth-payments/template/tailwind.config.js +0 -77
  353. package/src/templates/web/ui-auth-payments/template/tsconfig.tsbuildinfo +0 -1
  354. package/src/templates/web/ui-auth-payments-ai/template/.claude +0 -21
  355. package/src/templates/web/ui-auth-payments-ai/template/context.md +0 -169
  356. package/src/templates/web/ui-auth-payments-ai/template/middleware.ts +0 -68
  357. package/src/templates/web/ui-auth-payments-ai/template/package-lock.json +0 -12241
  358. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.js +0 -7
  359. package/src/templates/web/ui-auth-payments-ai/template/tailwind.config.js +0 -77
  360. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +0 -1
  361. package/src/templates/web/ui-auth-payments-audio/template/middleware.ts +0 -68
  362. package/src/templates/web/ui-auth-payments-audio/template/package-lock.json +0 -12241
  363. package/src/templates/web/ui-auth-payments-audio/template/postcss.config.js +0 -7
  364. package/src/templates/web/ui-auth-payments-audio/template/tailwind.config.js +0 -77
  365. package/src/templates/web/ui-auth-payments-audio/template/tsconfig.tsbuildinfo +0 -1
  366. package/src/templates/web/ui-auth-payments-video/template/postcss.config.js +0 -7
  367. package/src/templates/web/ui-auth-payments-video/template/tailwind.config.js +0 -77
  368. package/src/templates/web/ui-only/template/postcss.config.js +0 -7
  369. package/src/templates/web/ui-only/template/tailwind.config.js +0 -77
  370. /package/dist/templates/shared/admin/web/{components → src/components}/admin-nav.tsx +0 -0
  371. /package/dist/templates/shared/auth/keycloak/web/{auth.config.ts → src/auth.config.ts} +0 -0
  372. /package/dist/templates/shared/auth/keycloak/web/{auth.ts → src/auth.ts} +0 -0
  373. /package/dist/templates/shared/middleware/web/{middleware.ts → src/middleware.ts} +0 -0
  374. /package/src/templates/shared/admin/web/{components → src/components}/admin-nav.tsx +0 -0
  375. /package/src/templates/shared/auth/keycloak/web/{auth.config.ts → src/auth.config.ts} +0 -0
  376. /package/src/templates/shared/auth/keycloak/web/{auth.ts → src/auth.ts} +0 -0
  377. /package/src/templates/shared/middleware/web/{middleware.ts → src/middleware.ts} +0 -0
@@ -0,0 +1,218 @@
1
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
2
+ import { ArrowLeft, Star, ShoppingCart, MessageCircle, ShoppingBag } from 'lucide-react'
3
+ import Link from 'next/link'
4
+
5
+ const PRODUCTS: Record<string, {
6
+ id: string
7
+ name: string
8
+ price: number
9
+ vendor: string
10
+ rating: number
11
+ reviews: number
12
+ category: string
13
+ description: string
14
+ features: string[]
15
+ }> = {
16
+ '1': {
17
+ id: '1',
18
+ name: 'Premium Widget Pro',
19
+ price: 49.99,
20
+ vendor: 'TechCo',
21
+ rating: 4.8,
22
+ reviews: 124,
23
+ category: 'Software',
24
+ description: 'A comprehensive widget toolkit that helps developers build beautiful, responsive interfaces in minutes. Includes 50+ pre-built components, dark mode support, and full TypeScript definitions. Perfect for startups and teams looking to ship faster without sacrificing quality.',
25
+ features: ['50+ Pre-built Components', 'Dark Mode Support', 'TypeScript Definitions', 'Lifetime Updates'],
26
+ },
27
+ '2': {
28
+ id: '2',
29
+ name: 'Developer Toolkit',
30
+ price: 129.99,
31
+ vendor: 'DevTools',
32
+ rating: 4.9,
33
+ reviews: 87,
34
+ category: 'Software',
35
+ description: 'The ultimate developer toolkit packed with debugging utilities, code generators, and productivity boosters. Streamline your development workflow with intelligent code analysis, automated refactoring tools, and seamless CI/CD integration.',
36
+ features: ['Code Generator', 'Debugging Utilities', 'CI/CD Integration', 'Team Collaboration'],
37
+ },
38
+ '3': {
39
+ id: '3',
40
+ name: 'UI Design Pack',
41
+ price: 79.99,
42
+ vendor: 'CreativeStudio',
43
+ rating: 4.7,
44
+ reviews: 203,
45
+ category: 'Templates',
46
+ description: 'A stunning collection of UI design templates for web and mobile applications. Each template is fully customizable and built with modern design principles. Includes Figma source files, responsive layouts, and component documentation.',
47
+ features: ['Figma Source Files', 'Responsive Layouts', 'Component Docs', '100+ Screens'],
48
+ },
49
+ '4': {
50
+ id: '4',
51
+ name: 'Analytics Dashboard',
52
+ price: 199.99,
53
+ vendor: 'DataCorp',
54
+ rating: 4.6,
55
+ reviews: 56,
56
+ category: 'Software',
57
+ description: 'Real-time analytics dashboard with advanced data visualization capabilities. Track key metrics, create custom reports, and share insights with your team. Supports multiple data sources and provides AI-powered trend analysis.',
58
+ features: ['Real-time Analytics', 'Custom Reports', 'AI Trend Analysis', 'Multi-source Support'],
59
+ },
60
+ '5': {
61
+ id: '5',
62
+ name: 'Marketing Templates',
63
+ price: 39.99,
64
+ vendor: 'GrowthLab',
65
+ rating: 4.5,
66
+ reviews: 312,
67
+ category: 'Templates',
68
+ description: 'Ready-to-use marketing templates for landing pages, email campaigns, and social media. Conversion-optimized designs backed by A/B testing data from thousands of campaigns.',
69
+ features: ['Landing Pages', 'Email Templates', 'Social Media Kit', 'A/B Tested Designs'],
70
+ },
71
+ }
72
+
73
+ const RELATED_PRODUCTS = [
74
+ { id: '2', name: 'Developer Toolkit', price: 129.99, vendor: 'DevTools', rating: 4.9, category: 'Software' },
75
+ { id: '3', name: 'UI Design Pack', price: 79.99, vendor: 'CreativeStudio', rating: 4.7, category: 'Templates' },
76
+ { id: '5', name: 'Marketing Templates', price: 39.99, vendor: 'GrowthLab', rating: 4.5, category: 'Templates' },
77
+ ]
78
+
79
+ function StarRating({ rating, reviews }: { rating: number; reviews: number }) {
80
+ return (
81
+ <div className="flex items-center gap-2">
82
+ <div className="flex items-center">
83
+ {[...Array(5)].map((_, i) => (
84
+ <Star
85
+ key={i}
86
+ className={`w-5 h-5 ${
87
+ i < Math.floor(rating)
88
+ ? 'text-amber-500 fill-amber-500'
89
+ : i < rating
90
+ ? 'text-amber-500 fill-amber-500/50'
91
+ : 'text-muted-foreground/30'
92
+ }`}
93
+ />
94
+ ))}
95
+ </div>
96
+ <span className="text-sm text-muted-foreground">
97
+ {rating} ({reviews} reviews)
98
+ </span>
99
+ </div>
100
+ )
101
+ }
102
+
103
+ export default async function ProductDetailPage({
104
+ params,
105
+ }: {
106
+ params: Promise<{ id: string }>
107
+ }) {
108
+ const { id } = await params
109
+ const product = PRODUCTS[id] || PRODUCTS['1']
110
+
111
+ const relatedProducts = RELATED_PRODUCTS.filter(p => p.id !== product.id).slice(0, 3)
112
+
113
+ return (
114
+ <div className="min-h-screen bg-background">
115
+ <div className="max-w-7xl mx-auto px-4 py-8">
116
+ {/* Back Link */}
117
+ <Link
118
+ href="/products"
119
+ className="inline-flex items-center text-sm text-muted-foreground hover:text-foreground mb-6 transition-colors"
120
+ >
121
+ <ArrowLeft className="w-4 h-4 mr-1" />
122
+ Back to Products
123
+ </Link>
124
+
125
+ {/* Product Detail */}
126
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-16">
127
+ {/* Product Image */}
128
+ <div className="aspect-video bg-muted rounded-xl flex items-center justify-center border border-border">
129
+ <div className="text-center">
130
+ <ShoppingBag className="w-16 h-16 mx-auto text-muted-foreground/30 mb-2" />
131
+ <p className="text-sm text-muted-foreground">Product Preview</p>
132
+ </div>
133
+ </div>
134
+
135
+ {/* Product Info */}
136
+ <div>
137
+ <div className="mb-4">
138
+ <span className="inline-block px-3 py-1 text-xs font-medium bg-primary text-primary-foreground rounded-full mb-3">
139
+ {product.category}
140
+ </span>
141
+ <h1 className="text-2xl font-bold text-foreground mb-2">
142
+ {product.name}
143
+ </h1>
144
+ <p className="text-muted-foreground">
145
+ by {product.vendor}
146
+ </p>
147
+ </div>
148
+
149
+ <StarRating rating={product.rating} reviews={product.reviews} />
150
+
151
+ <p className="text-3xl font-bold text-primary mt-4 mb-6">
152
+ ${product.price}
153
+ </p>
154
+
155
+ <p className="text-muted-foreground leading-relaxed mb-6">
156
+ {product.description}
157
+ </p>
158
+
159
+ {/* Features */}
160
+ <div className="mb-6">
161
+ <h3 className="text-sm font-semibold text-foreground mb-3">What&apos;s Included</h3>
162
+ <ul className="grid grid-cols-2 gap-2">
163
+ {product.features.map((feature) => (
164
+ <li key={feature} className="flex items-center text-sm text-muted-foreground">
165
+ <span className="w-1.5 h-1.5 bg-primary rounded-full mr-2 flex-shrink-0" />
166
+ {feature}
167
+ </li>
168
+ ))}
169
+ </ul>
170
+ </div>
171
+
172
+ {/* Actions */}
173
+ <div className="flex gap-3">
174
+ <Button size="lg" className="flex-1">
175
+ <ShoppingCart className="w-4 h-4 mr-2" />
176
+ Add to Cart
177
+ </Button>
178
+ <Button variant="outline" size="lg" className="flex-1">
179
+ <MessageCircle className="w-4 h-4 mr-2" />
180
+ Contact Vendor
181
+ </Button>
182
+ </div>
183
+ </div>
184
+ </div>
185
+
186
+ {/* Related Products */}
187
+ <div>
188
+ <h2 className="text-2xl font-bold text-foreground mb-6">Related Products</h2>
189
+ <div className="grid grid-cols-1 sm:grid-cols-3 gap-6">
190
+ {relatedProducts.map((item) => (
191
+ <Card key={item.id} className="overflow-hidden hover:shadow-lg transition-shadow">
192
+ <div className="aspect-square bg-muted relative">
193
+ <span className="absolute top-2 left-2 bg-primary text-primary-foreground text-xs px-2 py-1 rounded">
194
+ {item.category}
195
+ </span>
196
+ </div>
197
+ <div className="p-4">
198
+ <h3 className="font-semibold text-foreground mb-1">{item.name}</h3>
199
+ <p className="text-sm text-muted-foreground mb-2">by {item.vendor}</p>
200
+ <div className="flex items-center justify-between mb-3">
201
+ <span className="text-lg font-bold text-primary">${item.price}</span>
202
+ <div className="flex items-center text-amber-500">
203
+ <Star className="w-4 h-4 fill-current" />
204
+ <span className="text-sm ml-1">{item.rating}</span>
205
+ </div>
206
+ </div>
207
+ <Link href={`/products/${item.id}`}>
208
+ <Button variant="outline" size="sm" className="w-full">View Details</Button>
209
+ </Link>
210
+ </div>
211
+ </Card>
212
+ ))}
213
+ </div>
214
+ </div>
215
+ </div>
216
+ </div>
217
+ )
218
+ }
@@ -1,129 +1,129 @@
1
- 'use client'
2
-
3
- import { useState } from 'react'
4
- import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
- import { Search, Filter, Star, ShoppingCart } from 'lucide-react'
6
- import Link from 'next/link'
7
-
8
- const PRODUCTS = [
9
- { id: 1, name: 'Premium Widget Pro', price: 49.99, vendor: 'TechCo', rating: 4.8, category: 'Software', sales: 234 },
10
- { id: 2, name: 'Developer Toolkit', price: 129.99, vendor: 'DevTools', rating: 4.9, category: 'Software', sales: 156 },
11
- { id: 3, name: 'UI Design Pack', price: 79.99, vendor: 'CreativeStudio', rating: 4.7, category: 'Templates', sales: 89 },
12
- { id: 4, name: 'Analytics Dashboard', price: 199.99, vendor: 'DataCorp', rating: 4.6, category: 'Software', sales: 67 },
13
- { id: 5, name: 'Marketing Templates', price: 39.99, vendor: 'GrowthLab', rating: 4.5, category: 'Templates', sales: 312 },
14
- { id: 6, name: 'API Integration Kit', price: 149.99, vendor: 'APIExperts', rating: 4.8, category: 'Software', sales: 178 },
15
- { id: 7, name: 'SEO Course Bundle', price: 99.99, vendor: 'SEOMasters', rating: 4.9, category: 'Courses', sales: 245 },
16
- { id: 8, name: 'Cloud Consulting', price: 299.99, vendor: 'CloudPros', rating: 4.7, category: 'Services', sales: 45 },
17
- ]
18
-
19
- const CATEGORIES = ['All', 'Software', 'Templates', 'Courses', 'Services']
20
-
21
- export default function ProductsPage() {
22
- const [searchQuery, setSearchQuery] = useState('')
23
- const [selectedCategory, setSelectedCategory] = useState('All')
24
- const [sortBy, setSortBy] = useState('popular')
25
-
26
- const filteredProducts = PRODUCTS
27
- .filter(p => selectedCategory === 'All' || p.category === selectedCategory)
28
- .filter(p => p.name.toLowerCase().includes(searchQuery.toLowerCase()))
29
- .sort((a, b) => {
30
- if (sortBy === 'popular') return b.sales - a.sales
31
- if (sortBy === 'price-low') return a.price - b.price
32
- if (sortBy === 'price-high') return b.price - a.price
33
- if (sortBy === 'rating') return b.rating - a.rating
34
- return 0
35
- })
36
-
37
- return (
38
- <div className="min-h-screen bg-gray-50 dark:bg-gray-900">
39
- {/* Header */}
40
- <div className="bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700">
41
- <div className="max-w-7xl mx-auto px-4 py-6">
42
- <h1 className="text-3xl font-bold text-gray-900 dark:text-white mb-4">Products</h1>
43
-
44
- {/* Search and Filters */}
45
- <div className="flex flex-col md:flex-row gap-4">
46
- <div className="flex-1 relative">
47
- <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-gray-400" />
48
- <input
49
- type="text"
50
- placeholder="Search products..."
51
- value={searchQuery}
52
- onChange={(e) => setSearchQuery(e.target.value)}
53
- className="w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
54
- />
55
- </div>
56
-
57
- <div className="flex gap-2">
58
- <select
59
- value={sortBy}
60
- onChange={(e) => setSortBy(e.target.value)}
61
- className="px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
62
- >
63
- <option value="popular">Most Popular</option>
64
- <option value="rating">Highest Rated</option>
65
- <option value="price-low">Price: Low to High</option>
66
- <option value="price-high">Price: High to Low</option>
67
- </select>
68
- </div>
69
- </div>
70
-
71
- {/* Categories */}
72
- <div className="flex gap-2 mt-4 overflow-x-auto pb-2">
73
- {CATEGORIES.map((category) => (
74
- <Button
75
- key={category}
76
- variant={selectedCategory === category ? 'default' : 'outline'}
77
- size="sm"
78
- onClick={() => setSelectedCategory(category)}
79
- >
80
- {category}
81
- </Button>
82
- ))}
83
- </div>
84
- </div>
85
- </div>
86
-
87
- {/* Products Grid */}
88
- <div className="max-w-7xl mx-auto px-4 py-8">
89
- <div className="flex items-center justify-between mb-6">
90
- <p className="text-gray-600 dark:text-gray-300">
91
- {filteredProducts.length} products found
92
- </p>
93
- </div>
94
-
95
- <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
96
- {filteredProducts.map((product) => (
97
- <Card key={product.id} className="overflow-hidden hover:shadow-lg transition-shadow">
98
- <div className="aspect-square bg-gray-100 dark:bg-gray-700 relative">
99
- <span className="absolute top-2 left-2 bg-blue-600 text-white text-xs px-2 py-1 rounded">
100
- {product.category}
101
- </span>
102
- </div>
103
- <div className="p-4">
104
- <h3 className="font-semibold text-gray-900 dark:text-white mb-1">{product.name}</h3>
105
- <p className="text-sm text-gray-500 mb-2">by {product.vendor}</p>
106
- <div className="flex items-center justify-between mb-3">
107
- <span className="text-lg font-bold text-blue-600">${product.price}</span>
108
- <div className="flex items-center text-yellow-500">
109
- <Star className="w-4 h-4 fill-current" />
110
- <span className="text-sm ml-1">{product.rating}</span>
111
- </div>
112
- </div>
113
- <div className="flex gap-2">
114
- <Button className="flex-1" size="sm">
115
- <ShoppingCart className="w-4 h-4 mr-1" />
116
- Add
117
- </Button>
118
- <Link href={`/products/${product.id}`} className="flex-1">
119
- <Button variant="outline" size="sm" className="w-full">View</Button>
120
- </Link>
121
- </div>
122
- </div>
123
- </Card>
124
- ))}
125
- </div>
126
- </div>
127
- </div>
128
- )
129
- }
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
+ import { Search, Filter, Star, ShoppingCart } from 'lucide-react'
6
+ import Link from 'next/link'
7
+
8
+ const PRODUCTS = [
9
+ { id: 1, name: 'Premium Widget Pro', price: 49.99, vendor: 'TechCo', rating: 4.8, category: 'Software', sales: 234 },
10
+ { id: 2, name: 'Developer Toolkit', price: 129.99, vendor: 'DevTools', rating: 4.9, category: 'Software', sales: 156 },
11
+ { id: 3, name: 'UI Design Pack', price: 79.99, vendor: 'CreativeStudio', rating: 4.7, category: 'Templates', sales: 89 },
12
+ { id: 4, name: 'Analytics Dashboard', price: 199.99, vendor: 'DataCorp', rating: 4.6, category: 'Software', sales: 67 },
13
+ { id: 5, name: 'Marketing Templates', price: 39.99, vendor: 'GrowthLab', rating: 4.5, category: 'Templates', sales: 312 },
14
+ { id: 6, name: 'API Integration Kit', price: 149.99, vendor: 'APIExperts', rating: 4.8, category: 'Software', sales: 178 },
15
+ { id: 7, name: 'SEO Course Bundle', price: 99.99, vendor: 'SEOMasters', rating: 4.9, category: 'Courses', sales: 245 },
16
+ { id: 8, name: 'Cloud Consulting', price: 299.99, vendor: 'CloudPros', rating: 4.7, category: 'Services', sales: 45 },
17
+ ]
18
+
19
+ const CATEGORIES = ['All', 'Software', 'Templates', 'Courses', 'Services']
20
+
21
+ export default function ProductsPage() {
22
+ const [searchQuery, setSearchQuery] = useState('')
23
+ const [selectedCategory, setSelectedCategory] = useState('All')
24
+ const [sortBy, setSortBy] = useState('popular')
25
+
26
+ const filteredProducts = PRODUCTS
27
+ .filter(p => selectedCategory === 'All' || p.category === selectedCategory)
28
+ .filter(p => p.name.toLowerCase().includes(searchQuery.toLowerCase()))
29
+ .sort((a, b) => {
30
+ if (sortBy === 'popular') return b.sales - a.sales
31
+ if (sortBy === 'price-low') return a.price - b.price
32
+ if (sortBy === 'price-high') return b.price - a.price
33
+ if (sortBy === 'rating') return b.rating - a.rating
34
+ return 0
35
+ })
36
+
37
+ return (
38
+ <div className="min-h-screen bg-background">
39
+ {/* Header */}
40
+ <div className="bg-card border-b border-border">
41
+ <div className="max-w-7xl mx-auto px-4 py-6">
42
+ <h1 className="text-3xl font-bold text-foreground mb-4">Products</h1>
43
+
44
+ {/* Search and Filters */}
45
+ <div className="flex flex-col md:flex-row gap-4">
46
+ <div className="flex-1 relative">
47
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-muted-foreground" />
48
+ <input
49
+ type="text"
50
+ placeholder="Search products..."
51
+ value={searchQuery}
52
+ onChange={(e) => setSearchQuery(e.target.value)}
53
+ className="w-full pl-10 pr-4 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring bg-background text-foreground"
54
+ />
55
+ </div>
56
+
57
+ <div className="flex gap-2">
58
+ <select
59
+ value={sortBy}
60
+ onChange={(e) => setSortBy(e.target.value)}
61
+ className="px-4 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring bg-background text-foreground"
62
+ >
63
+ <option value="popular">Most Popular</option>
64
+ <option value="rating">Highest Rated</option>
65
+ <option value="price-low">Price: Low to High</option>
66
+ <option value="price-high">Price: High to Low</option>
67
+ </select>
68
+ </div>
69
+ </div>
70
+
71
+ {/* Categories */}
72
+ <div className="flex gap-2 mt-4 overflow-x-auto pb-2">
73
+ {CATEGORIES.map((category) => (
74
+ <Button
75
+ key={category}
76
+ variant={selectedCategory === category ? 'default' : 'outline'}
77
+ size="sm"
78
+ onClick={() => setSelectedCategory(category)}
79
+ >
80
+ {category}
81
+ </Button>
82
+ ))}
83
+ </div>
84
+ </div>
85
+ </div>
86
+
87
+ {/* Products Grid */}
88
+ <div className="max-w-7xl mx-auto px-4 py-8">
89
+ <div className="flex items-center justify-between mb-6">
90
+ <p className="text-muted-foreground">
91
+ {filteredProducts.length} products found
92
+ </p>
93
+ </div>
94
+
95
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
96
+ {filteredProducts.map((product) => (
97
+ <Card key={product.id} className="overflow-hidden hover:shadow-lg transition-shadow">
98
+ <div className="aspect-square bg-muted relative">
99
+ <span className="absolute top-2 left-2 bg-primary text-primary-foreground text-xs px-2 py-1 rounded">
100
+ {product.category}
101
+ </span>
102
+ </div>
103
+ <div className="p-4">
104
+ <h3 className="font-semibold text-foreground mb-1">{product.name}</h3>
105
+ <p className="text-sm text-muted-foreground mb-2">by {product.vendor}</p>
106
+ <div className="flex items-center justify-between mb-3">
107
+ <span className="text-lg font-bold text-primary">${product.price}</span>
108
+ <div className="flex items-center text-amber-500">
109
+ <Star className="w-4 h-4 fill-current" />
110
+ <span className="text-sm ml-1">{product.rating}</span>
111
+ </div>
112
+ </div>
113
+ <div className="flex gap-2">
114
+ <Button className="flex-1" size="sm">
115
+ <ShoppingCart className="w-4 h-4 mr-1" />
116
+ Add
117
+ </Button>
118
+ <Link href={`/products/${product.id}`} className="flex-1">
119
+ <Button variant="outline" size="sm" className="w-full">View</Button>
120
+ </Link>
121
+ </div>
122
+ </div>
123
+ </Card>
124
+ ))}
125
+ </div>
126
+ </div>
127
+ </div>
128
+ )
129
+ }
@@ -0,0 +1,150 @@
1
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
2
+ import { User, Bell, CreditCard } from 'lucide-react'
3
+ import { requireAuth } from '@/lib/auth-server'
4
+
5
+ function ToggleSwitch({ defaultChecked = false }: { defaultChecked?: boolean }) {
6
+ return (
7
+ <label className="relative inline-flex items-center cursor-pointer">
8
+ <input type="checkbox" className="sr-only peer" defaultChecked={defaultChecked} />
9
+ <div className="w-11 h-6 bg-muted rounded-full peer peer-checked:bg-primary peer-focus:ring-2 peer-focus:ring-ring after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-background after:border after:border-border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full" />
10
+ </label>
11
+ )
12
+ }
13
+
14
+ export default async function SettingsPage() {
15
+ const user = await requireAuth()
16
+
17
+ return (
18
+ <div className="min-h-screen bg-background">
19
+ <div className="max-w-3xl mx-auto px-4 py-8">
20
+ {/* Header */}
21
+ <div className="mb-8">
22
+ <h1 className="text-3xl font-bold text-foreground">Settings</h1>
23
+ <p className="text-muted-foreground mt-1">
24
+ Manage your account preferences
25
+ </p>
26
+ </div>
27
+
28
+ <div className="space-y-6">
29
+ {/* Profile Section */}
30
+ <Card className="p-6">
31
+ <div className="flex items-center gap-3 mb-6">
32
+ <User className="w-5 h-5 text-primary" />
33
+ <h2 className="text-lg font-semibold text-foreground">Profile</h2>
34
+ </div>
35
+
36
+ <div className="space-y-4">
37
+ {/* Avatar */}
38
+ <div className="flex items-center gap-4 mb-6">
39
+ <div className="w-16 h-16 bg-muted rounded-full flex items-center justify-center border border-border">
40
+ <User className="w-8 h-8 text-muted-foreground" />
41
+ </div>
42
+ <Button variant="outline" size="sm">Change Avatar</Button>
43
+ </div>
44
+
45
+ {/* Name */}
46
+ <div>
47
+ <label htmlFor="name" className="block text-sm font-medium text-foreground mb-1.5">
48
+ Display Name
49
+ </label>
50
+ <input
51
+ id="name"
52
+ type="text"
53
+ defaultValue={user.name || ''}
54
+ placeholder="Your name"
55
+ className="w-full px-4 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring bg-background text-foreground"
56
+ />
57
+ </div>
58
+
59
+ {/* Email (read-only) */}
60
+ <div>
61
+ <label htmlFor="email" className="block text-sm font-medium text-foreground mb-1.5">
62
+ Email Address
63
+ </label>
64
+ <input
65
+ id="email"
66
+ type="email"
67
+ value={user.email || ''}
68
+ readOnly
69
+ className="w-full px-4 py-2 border border-input rounded-lg bg-muted text-muted-foreground cursor-not-allowed"
70
+ />
71
+ <p className="text-xs text-muted-foreground mt-1">
72
+ Email cannot be changed. Contact support if you need to update it.
73
+ </p>
74
+ </div>
75
+ </div>
76
+ </Card>
77
+
78
+ {/* Notification Preferences */}
79
+ <Card className="p-6">
80
+ <div className="flex items-center gap-3 mb-6">
81
+ <Bell className="w-5 h-5 text-primary" />
82
+ <h2 className="text-lg font-semibold text-foreground">Notifications</h2>
83
+ </div>
84
+
85
+ <div className="space-y-4">
86
+ <div className="flex items-center justify-between py-2">
87
+ <div>
88
+ <p className="font-medium text-foreground">Order Updates</p>
89
+ <p className="text-sm text-muted-foreground">
90
+ Get notified when your order status changes
91
+ </p>
92
+ </div>
93
+ <ToggleSwitch defaultChecked />
94
+ </div>
95
+
96
+ <div className="border-t border-border" />
97
+
98
+ <div className="flex items-center justify-between py-2">
99
+ <div>
100
+ <p className="font-medium text-foreground">Marketing Emails</p>
101
+ <p className="text-sm text-muted-foreground">
102
+ Receive deals, promotions, and product recommendations
103
+ </p>
104
+ </div>
105
+ <ToggleSwitch />
106
+ </div>
107
+
108
+ <div className="border-t border-border" />
109
+
110
+ <div className="flex items-center justify-between py-2">
111
+ <div>
112
+ <p className="font-medium text-foreground">Vendor Messages</p>
113
+ <p className="text-sm text-muted-foreground">
114
+ Get notified when a vendor replies to your message
115
+ </p>
116
+ </div>
117
+ <ToggleSwitch defaultChecked />
118
+ </div>
119
+ </div>
120
+ </Card>
121
+
122
+ {/* Payment Methods */}
123
+ <Card className="p-6">
124
+ <div className="flex items-center gap-3 mb-6">
125
+ <CreditCard className="w-5 h-5 text-primary" />
126
+ <h2 className="text-lg font-semibold text-foreground">Payment Methods</h2>
127
+ </div>
128
+
129
+ <div className="text-center py-6">
130
+ <CreditCard className="w-12 h-12 mx-auto mb-3 text-muted-foreground/50" />
131
+ <p className="text-muted-foreground mb-4">
132
+ No payment methods saved yet
133
+ </p>
134
+ <Button variant="outline">
135
+ Add Payment Method
136
+ </Button>
137
+ </div>
138
+ </Card>
139
+
140
+ {/* Save Button */}
141
+ <div className="flex justify-end">
142
+ <Button size="lg">
143
+ Save Changes
144
+ </Button>
145
+ </div>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ )
150
+ }