@digilogiclabs/create-saas-app 2.10.0 → 2.12.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 (416) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +153 -113
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cli/commands/create.d.ts.map +1 -1
  5. package/dist/cli/commands/create.js +2 -6
  6. package/dist/cli/commands/create.js.map +1 -1
  7. package/dist/cli/index.js +1 -1
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/generators/template-generator.d.ts.map +1 -1
  10. package/dist/generators/template-generator.js +15 -8
  11. package/dist/generators/template-generator.js.map +1 -1
  12. package/dist/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  13. package/dist/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  14. package/dist/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  15. package/dist/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  16. package/dist/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  17. package/dist/templates/shared/email/web/src/lib/email/client.ts +1 -1
  18. package/dist/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  19. package/dist/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  20. package/dist/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  21. package/dist/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  22. package/dist/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  23. package/dist/templates/shared/loading/web/components/skeleton.tsx +4 -4
  24. package/dist/templates/shared/mock/web/.env.local +55 -0
  25. package/dist/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  26. package/dist/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  27. package/dist/templates/shared/mock/web/src/lib/mock.ts +147 -0
  28. package/dist/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  29. package/dist/templates/shared/redis/web/src/lib/redis.ts +1 -1
  30. package/dist/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  31. package/dist/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  32. package/dist/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  33. package/dist/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  34. package/dist/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  35. package/dist/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  36. package/dist/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  37. package/dist/templates/web/base/template/eslint.config.mjs +14 -0
  38. package/dist/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  39. package/dist/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  40. package/dist/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  41. package/dist/templates/web/base/template/src/app/layout.tsx +40 -38
  42. package/dist/templates/web/base/template/src/app/login/page.tsx +116 -66
  43. package/dist/templates/web/base/template/src/app/page.tsx +97 -193
  44. package/dist/templates/web/base/template/src/app/settings/page.tsx +154 -0
  45. package/dist/templates/web/base/template/src/app/signup/page.tsx +117 -66
  46. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  47. package/dist/templates/web/base/template/src/components/shared/header.tsx +229 -63
  48. package/dist/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  49. package/dist/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  50. package/dist/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  51. package/dist/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  52. package/dist/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  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/settings/page.tsx +186 -0
  55. package/dist/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  56. package/dist/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  57. package/dist/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  58. package/dist/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  59. package/dist/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  60. package/dist/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  61. package/dist/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  62. package/dist/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  63. package/dist/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  64. package/dist/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  65. package/dist/templates/web/micro-saas/template/src/app/login/page.tsx +14 -3
  66. package/dist/templates/web/micro-saas/template/src/app/signup/page.tsx +15 -4
  67. package/dist/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  68. package/dist/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  69. package/dist/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  70. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  71. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  72. package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  73. package/dist/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  74. package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  75. package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  76. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  77. package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  78. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  79. package/dist/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  80. package/dist/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  81. package/dist/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  82. package/dist/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  83. package/dist/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  84. package/dist/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  85. package/dist/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  86. package/dist/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  87. package/dist/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  88. package/dist/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  89. package/dist/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  90. package/dist/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  91. package/dist/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  92. package/dist/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  93. package/dist/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  94. package/dist/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  95. package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  96. package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  97. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  98. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  99. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  100. package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  101. package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  102. package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  103. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  104. package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  105. package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  106. package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  107. package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  108. package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  109. package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  110. package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  111. package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  112. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  113. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  114. package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  115. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  116. package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  117. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  118. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  119. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  120. package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  121. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  122. package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  123. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  124. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  125. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  126. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  127. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  128. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  129. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  130. package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  131. package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  132. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  133. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  134. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  135. package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  136. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  137. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  138. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  139. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  140. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  141. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  142. package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  143. package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  144. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  145. package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  146. package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  147. package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  148. package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  149. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  150. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  151. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  152. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  153. package/dist/templates/web/ui-only/template/eslint.config.mjs +14 -0
  154. package/dist/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  155. package/dist/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  156. package/dist/templates/web/ui-only/template/src/app/page.tsx +69 -91
  157. package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  158. package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  159. package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  160. package/dist/templates/web/ui-package-test/template/package.json +19 -23
  161. package/dist/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  162. package/dist/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  163. package/dist/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  164. package/dist/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  165. package/package.json +1 -1
  166. package/src/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  167. package/src/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  168. package/src/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  169. package/src/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  170. package/src/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  171. package/src/templates/shared/email/web/src/lib/email/client.ts +1 -1
  172. package/src/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  173. package/src/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  174. package/src/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  175. package/src/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  176. package/src/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  177. package/src/templates/shared/loading/web/components/skeleton.tsx +4 -4
  178. package/src/templates/shared/mock/web/.env.local +55 -0
  179. package/src/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  180. package/src/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  181. package/src/templates/shared/mock/web/src/lib/mock.ts +147 -0
  182. package/src/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  183. package/src/templates/shared/redis/web/src/lib/redis.ts +1 -1
  184. package/src/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  185. package/src/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  186. package/src/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  187. package/src/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  188. package/src/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  189. package/src/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  190. package/src/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  191. package/src/templates/web/base/template/eslint.config.mjs +14 -0
  192. package/src/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  193. package/src/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  194. package/src/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  195. package/src/templates/web/base/template/src/app/layout.tsx +40 -38
  196. package/src/templates/web/base/template/src/app/login/page.tsx +116 -66
  197. package/src/templates/web/base/template/src/app/page.tsx +97 -193
  198. package/src/templates/web/base/template/src/app/settings/page.tsx +154 -0
  199. package/src/templates/web/base/template/src/app/signup/page.tsx +117 -66
  200. package/src/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  201. package/src/templates/web/base/template/src/components/shared/header.tsx +229 -63
  202. package/src/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  203. package/src/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  204. package/src/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  205. package/src/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  206. package/src/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  207. package/src/templates/web/iot-dashboard/template/src/app/login/page.tsx +112 -0
  208. package/src/templates/web/iot-dashboard/template/src/app/settings/page.tsx +186 -0
  209. package/src/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  210. package/src/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  211. package/src/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  212. package/src/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  213. package/src/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  214. package/src/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  215. package/src/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  216. package/src/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  217. package/src/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  218. package/src/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  219. package/src/templates/web/micro-saas/template/src/app/login/page.tsx +14 -3
  220. package/src/templates/web/micro-saas/template/src/app/signup/page.tsx +15 -4
  221. package/src/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  222. package/src/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  223. package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  224. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  225. package/src/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  226. package/src/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  227. package/src/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  228. package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  229. package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  230. package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  231. package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  232. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  233. package/src/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  234. package/src/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  235. package/src/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  236. package/src/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  237. package/src/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  238. package/src/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  239. package/src/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  240. package/src/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  241. package/src/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  242. package/src/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  243. package/src/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  244. package/src/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  245. package/src/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  246. package/src/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  247. package/src/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  248. package/src/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  249. package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  250. package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  251. package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  252. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  253. package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  254. package/src/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  255. package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  256. package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  257. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  258. package/src/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  259. package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  260. package/src/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  261. package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  262. package/src/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  263. package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  264. package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  265. package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  266. package/src/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  267. package/src/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  268. package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  269. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  270. package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  271. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  272. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  273. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  274. package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  275. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  276. package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  277. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  278. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  279. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  280. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  281. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  282. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  283. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  284. package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  285. package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  286. package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  287. package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  288. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  289. package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  290. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  291. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  292. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  293. package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  294. package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  295. package/src/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  296. package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  297. package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  298. package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  299. package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  300. package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  301. package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  302. package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  303. package/src/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  304. package/src/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  305. package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  306. package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  307. package/src/templates/web/ui-only/template/eslint.config.mjs +14 -0
  308. package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  309. package/src/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  310. package/src/templates/web/ui-only/template/src/app/page.tsx +69 -91
  311. package/src/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  312. package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  313. package/src/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  314. package/src/templates/web/ui-package-test/template/package.json +19 -23
  315. package/src/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  316. package/src/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  317. package/src/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  318. package/src/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  319. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  320. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  321. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  322. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  323. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  324. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  325. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  326. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  327. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  328. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  329. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  330. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  331. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  332. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  333. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  334. package/dist/templates/web/base/template/.eslintrc.js +0 -8
  335. package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  336. package/dist/templates/web/base/template/src/test/setup.ts +0 -74
  337. package/dist/templates/web/base/template/vitest.config.ts +0 -17
  338. package/dist/templates/web/ui-auth/template/.eslintrc.js +0 -8
  339. package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  340. package/dist/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  341. package/dist/templates/web/ui-auth/template/vitest.config.ts +0 -17
  342. package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  343. package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  344. package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  345. package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  346. package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  347. package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  348. package/dist/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  349. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  350. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  351. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  352. package/dist/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  353. package/dist/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  354. package/dist/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  355. package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  356. package/dist/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  357. package/dist/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  358. package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  359. package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  360. package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  361. package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  362. package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  363. package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  364. package/dist/templates/web/ui-only/template/.eslintrc.js +0 -8
  365. package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  366. package/dist/templates/web/ui-only/template/src/test/setup.ts +0 -74
  367. package/dist/templates/web/ui-only/template/vitest.config.ts +0 -17
  368. package/src/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  369. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  370. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  371. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  372. package/src/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  373. package/src/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  374. package/src/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  375. package/src/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  376. package/src/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  377. package/src/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  378. package/src/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  379. package/src/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  380. package/src/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  381. package/src/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  382. package/src/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  383. package/src/templates/web/base/template/.eslintrc.js +0 -8
  384. package/src/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  385. package/src/templates/web/base/template/src/test/setup.ts +0 -74
  386. package/src/templates/web/base/template/vitest.config.ts +0 -17
  387. package/src/templates/web/ui-auth/template/.eslintrc.js +0 -8
  388. package/src/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  389. package/src/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  390. package/src/templates/web/ui-auth/template/vitest.config.ts +0 -17
  391. package/src/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  392. package/src/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  393. package/src/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  394. package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  395. package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  396. package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  397. package/src/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  398. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  399. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  400. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  401. package/src/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  402. package/src/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  403. package/src/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  404. package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  405. package/src/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  406. package/src/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  407. package/src/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  408. package/src/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  409. package/src/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  410. package/src/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  411. package/src/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  412. package/src/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  413. package/src/templates/web/ui-only/template/.eslintrc.js +0 -8
  414. package/src/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  415. package/src/templates/web/ui-only/template/src/test/setup.ts +0 -74
  416. package/src/templates/web/ui-only/template/vitest.config.ts +0 -17
@@ -23,16 +23,16 @@ export default function PrivacyPage() {
23
23
  } = LEGAL_CONFIG;
24
24
 
25
25
  return (
26
- <main className="min-h-screen bg-white dark:bg-gray-950">
26
+ <main className="min-h-screen bg-background">
27
27
  <div className="mx-auto max-w-3xl px-4 py-16 sm:px-6 lg:px-8">
28
- <h1 className="mb-2 text-3xl font-bold tracking-tight text-gray-900 dark:text-white">
28
+ <h1 className="mb-2 text-3xl font-bold tracking-tight text-foreground">
29
29
  Privacy Policy
30
30
  </h1>
31
- <p className="mb-8 text-sm text-gray-500 dark:text-gray-400">
31
+ <p className="mb-8 text-sm text-muted-foreground">
32
32
  Effective: {effectiveDate}
33
33
  </p>
34
34
 
35
- <div className="prose prose-gray dark:prose-invert max-w-none">
35
+ <div className="prose dark:prose-invert max-w-none">
36
36
  <section>
37
37
  <h2>1. Information We Collect</h2>
38
38
  <p>We collect information you provide directly:</p>
@@ -23,16 +23,16 @@ export default function TermsPage() {
23
23
  } = LEGAL_CONFIG;
24
24
 
25
25
  return (
26
- <main className="min-h-screen bg-white dark:bg-gray-950">
26
+ <main className="min-h-screen bg-background">
27
27
  <div className="mx-auto max-w-3xl px-4 py-16 sm:px-6 lg:px-8">
28
- <h1 className="mb-2 text-3xl font-bold tracking-tight text-gray-900 dark:text-white">
28
+ <h1 className="mb-2 text-3xl font-bold tracking-tight text-foreground">
29
29
  Terms of Service
30
30
  </h1>
31
- <p className="mb-8 text-sm text-gray-500 dark:text-gray-400">
31
+ <p className="mb-8 text-sm text-muted-foreground">
32
32
  Effective: {effectiveDate}
33
33
  </p>
34
34
 
35
- <div className="prose prose-gray dark:prose-invert max-w-none">
35
+ <div className="prose dark:prose-invert max-w-none">
36
36
  <section>
37
37
  <h2>1. Acceptance of Terms</h2>
38
38
  <p>
@@ -13,7 +13,7 @@ export function Skeleton({
13
13
  }) {
14
14
  return (
15
15
  <div
16
- className={`animate-pulse rounded bg-gray-200 dark:bg-gray-800 ${className}`}
16
+ className={`animate-pulse rounded bg-muted ${className}`}
17
17
  />
18
18
  );
19
19
  }
@@ -21,7 +21,7 @@ export function Skeleton({
21
21
  /** Skeleton for a card with title, description, and action area */
22
22
  export function CardSkeleton() {
23
23
  return (
24
- <div className="rounded-lg border border-gray-200 p-6 dark:border-gray-800">
24
+ <div className="rounded-lg border border-border p-6">
25
25
  <Skeleton className="mb-4 h-4 w-3/4" />
26
26
  <Skeleton className="mb-2 h-3 w-full" />
27
27
  <Skeleton className="mb-4 h-3 w-5/6" />
@@ -46,7 +46,7 @@ export function TableSkeleton({ rows = 5 }: { rows?: number }) {
46
46
  return (
47
47
  <div className="space-y-3">
48
48
  {/* Header */}
49
- <div className="flex gap-4 border-b border-gray-200 pb-3 dark:border-gray-800">
49
+ <div className="flex gap-4 border-b border-border pb-3">
50
50
  <Skeleton className="h-4 w-1/4" />
51
51
  <Skeleton className="h-4 w-1/3" />
52
52
  <Skeleton className="h-4 w-1/4" />
@@ -89,7 +89,7 @@ export function PageSkeleton() {
89
89
  export function LoadingSpinner() {
90
90
  return (
91
91
  <div className="flex min-h-[50vh] items-center justify-center">
92
- <div className="h-8 w-8 animate-spin rounded-full border-4 border-gray-200 border-t-blue-600 dark:border-gray-700 dark:border-t-blue-400" />
92
+ <div className="h-8 w-8 animate-spin rounded-full border-4 border-muted border-t-primary" />
93
93
  </div>
94
94
  );
95
95
  }
@@ -0,0 +1,55 @@
1
+ # ═══════════════════════════════════════════════════════════════
2
+ # MOCK MODE (default: enabled for local development)
3
+ # ═══════════════════════════════════════════════════════════════
4
+ # true = Mock user, mock data, no auth required, all pages accessible
5
+ # false = Real providers required (configure below)
6
+ NEXT_PUBLIC_MOCK_MODE=true
7
+
8
+ # ═══════════════════════════════════════════════════════════════
9
+ # AUTH PROVIDER — uncomment and configure your chosen provider
10
+ # ═══════════════════════════════════════════════════════════════
11
+
12
+ # --- Supabase ---
13
+ # NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
14
+ # NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
15
+ # SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
16
+
17
+ # --- Firebase ---
18
+ # NEXT_PUBLIC_FIREBASE_API_KEY=
19
+ # NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
20
+ # NEXT_PUBLIC_FIREBASE_PROJECT_ID=
21
+
22
+ # --- Keycloak ---
23
+ # KEYCLOAK_ISSUER=https://auth.yourdomain.com/realms/your-realm
24
+ # KEYCLOAK_CLIENT_ID=your-client-id
25
+ # KEYCLOAK_CLIENT_SECRET=your-client-secret
26
+
27
+ # --- NextAuth / Auth.js ---
28
+ # AUTH_SECRET=your-secret-here
29
+ # NEXTAUTH_URL=http://localhost:3000
30
+
31
+ # ═══════════════════════════════════════════════════════════════
32
+ # DATABASE — uncomment and configure your chosen provider
33
+ # ═══════════════════════════════════════════════════════════════
34
+
35
+ # --- PostgreSQL (direct) ---
36
+ # DATABASE_URL=postgres://user:password@localhost:5432/mydb
37
+
38
+ # --- Supabase (uses same URL as auth above) ---
39
+
40
+ # ═══════════════════════════════════════════════════════════════
41
+ # PAYMENTS — uncomment when ready
42
+ # ═══════════════════════════════════════════════════════════════
43
+
44
+ # STRIPE_SECRET_KEY=sk_test_...
45
+ # STRIPE_WEBHOOK_SECRET=whsec_...
46
+ # NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
47
+
48
+ # ═══════════════════════════════════════════════════════════════
49
+ # OPTIONAL SERVICES
50
+ # ═══════════════════════════════════════════════════════════════
51
+
52
+ # REDIS_URL=redis://localhost:6379
53
+ # RESEND_API_KEY=re_...
54
+ # OPENAI_API_KEY=sk-...
55
+ # ANTHROPIC_API_KEY=sk-ant-...
@@ -0,0 +1,72 @@
1
+ 'use client';
2
+
3
+ import { createContext, useContext, useState, useCallback, type ReactNode } from 'react';
4
+ import { MOCK_MODE, MOCK_USER, type MockUser } from '@/lib/mock';
5
+
6
+ /**
7
+ * Mock Auth Context — provides login/logout state for mock mode.
8
+ *
9
+ * When MOCK_MODE=true:
10
+ * - User starts as "logged in" with MOCK_USER
11
+ * - signOut() sets user to null (shows logged-out UI)
12
+ * - signIn() restores mock user (shows logged-in UI)
13
+ * - All pages still accessible (no real redirects)
14
+ *
15
+ * When MOCK_MODE=false:
16
+ * - This provider is a passthrough (renders children only)
17
+ * - TODO: [REAL_DATA] Replace with your real auth provider
18
+ */
19
+
20
+ type MockAuthState = {
21
+ user: MockUser | null;
22
+ isAuthenticated: boolean;
23
+ signIn: (email?: string, password?: string) => void;
24
+ signOut: () => void;
25
+ loading: boolean;
26
+ };
27
+
28
+ const MockAuthContext = createContext<MockAuthState | undefined>(undefined);
29
+
30
+ export function MockAuthProvider({ children }: { children: ReactNode }) {
31
+ const [user, setUser] = useState<MockUser | null>(MOCK_MODE ? MOCK_USER : null);
32
+ const [loading] = useState(false);
33
+
34
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
35
+ const signIn = useCallback((_email?: string, _password?: string) => {
36
+ // TODO: [REAL_DATA] Replace with your auth provider's sign in
37
+ setUser(MOCK_USER);
38
+ }, []);
39
+
40
+ const signOut = useCallback(() => {
41
+ // TODO: [REAL_DATA] Replace with your auth provider's sign out
42
+ setUser(null);
43
+ }, []);
44
+
45
+ return (
46
+ <MockAuthContext.Provider value={{ user, isAuthenticated: !!user, signIn, signOut, loading }}>
47
+ {children}
48
+ </MockAuthContext.Provider>
49
+ );
50
+ }
51
+
52
+ /**
53
+ * Hook to access mock auth state.
54
+ * Works identically to a real useAuth() hook — same shape, same behavior.
55
+ *
56
+ * TODO: [REAL_DATA] When switching to a real auth provider, replace
57
+ * useMockAuth() calls with your provider's hook (e.g. useAuth(), useSession()).
58
+ */
59
+ export function useMockAuth() {
60
+ const context = useContext(MockAuthContext);
61
+ if (context === undefined) {
62
+ // Fallback for non-mock mode or missing provider
63
+ return {
64
+ user: null,
65
+ isAuthenticated: false,
66
+ signIn: () => {},
67
+ signOut: () => {},
68
+ loading: false,
69
+ };
70
+ }
71
+ return context;
72
+ }
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+
3
+ import { useState, useEffect } from 'react';
4
+
5
+ /**
6
+ * Mock mode indicator banner.
7
+ * Shown at the top of every page when NEXT_PUBLIC_MOCK_MODE=true.
8
+ * Uses useEffect to render only on the client (avoids SSR double-render).
9
+ */
10
+ export function MockBanner() {
11
+ const [show, setShow] = useState(false);
12
+
13
+ useEffect(() => {
14
+ setShow(process.env.NEXT_PUBLIC_MOCK_MODE === 'true');
15
+ }, []);
16
+
17
+ if (!show) return null;
18
+
19
+ return (
20
+ <div className="bg-primary/10 border-b border-primary/20 px-4 py-2 text-center text-xs text-primary">
21
+ <strong>Mock Mode</strong> — Showing demo data. All pages accessible without auth.
22
+ <span className="hidden sm:inline">
23
+ {' '}Set <code className="rounded bg-primary/10 px-1 py-0.5 font-mono">NEXT_PUBLIC_MOCK_MODE=false</code> and
24
+ configure your providers to use real data. Search for{' '}
25
+ <code className="rounded bg-primary/10 px-1 py-0.5 font-mono">TODO: [REAL_DATA]</code> in the code.
26
+ </span>
27
+ </div>
28
+ );
29
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Mock Mode — for local development and template smoke testing.
3
+ *
4
+ * Set NEXT_PUBLIC_MOCK_MODE=true in .env.local to enable.
5
+ * Provides mock user, mock data, and bypasses all auth/provider checks
6
+ * so you can explore every page without any backend configuration.
7
+ *
8
+ * ┌─────────────────────────────────────────────────────────────┐
9
+ * │ TO CONNECT REAL PROVIDERS: │
10
+ * │ │
11
+ * │ 1. Set NEXT_PUBLIC_MOCK_MODE=false in .env.local │
12
+ * │ 2. Configure your auth provider (see .env.example) │
13
+ * │ 3. Configure your database provider │
14
+ * │ 4. Search for "TODO: [REAL_DATA]" in this codebase │
15
+ * │ to find all mock→real integration points │
16
+ * └─────────────────────────────────────────────────────────────┘
17
+ *
18
+ * This file is provider-agnostic — works with Supabase, Firebase,
19
+ * Keycloak, Auth0, NextAuth, or any custom auth/database solution.
20
+ */
21
+
22
+ // ═══════════════════════════════════════════════════════════════
23
+ // CORE
24
+ // ═══════════════════════════════════════════════════════════════
25
+
26
+ export const MOCK_MODE = process.env.NEXT_PUBLIC_MOCK_MODE === 'true';
27
+
28
+ // ═══════════════════════════════════════════════════════════════
29
+ // MOCK USER
30
+ // ═══════════════════════════════════════════════════════════════
31
+
32
+ export const MOCK_USER = {
33
+ id: 'mock-user-000-0000-000000000000',
34
+ email: 'demo@example.com',
35
+ name: 'Demo User',
36
+ avatar_url: null,
37
+ role: 'admin' as const,
38
+ plan: 'pro' as const,
39
+ createdAt: '2025-01-15T00:00:00Z',
40
+ };
41
+
42
+ export type MockUser = typeof MOCK_USER;
43
+
44
+ // ═══════════════════════════════════════════════════════════════
45
+ // MOCK DASHBOARD DATA
46
+ // ═══════════════════════════════════════════════════════════════
47
+
48
+ export const MOCK_STATS = {
49
+ totalUsers: 1_234,
50
+ activeUsers: 847,
51
+ revenue: 12_580,
52
+ mrr: 4_250,
53
+ growth: 12.5,
54
+ churn: 2.1,
55
+ newSignups: 42,
56
+ avgSessionMinutes: 8.3,
57
+ };
58
+
59
+ export const MOCK_RECENT_ACTIVITY = [
60
+ { id: '1', action: 'New signup', user: 'alice@example.com', timestamp: '2 min ago' },
61
+ { id: '2', action: 'Plan upgraded', user: 'bob@corp.io', timestamp: '15 min ago' },
62
+ { id: '3', action: 'Invoice paid', user: 'carol@startup.co', timestamp: '1 hour ago' },
63
+ { id: '4', action: 'Support ticket', user: 'dave@agency.com', timestamp: '2 hours ago' },
64
+ { id: '5', action: 'New signup', user: 'eve@freelance.dev', timestamp: '3 hours ago' },
65
+ ];
66
+
67
+ // ═══════════════════════════════════════════════════════════════
68
+ // MOCK BILLING DATA
69
+ // ═══════════════════════════════════════════════════════════════
70
+
71
+ export const MOCK_SUBSCRIPTION = {
72
+ plan: 'Pro',
73
+ status: 'active' as const,
74
+ price: '$29/month',
75
+ nextBilling: '2025-04-15',
76
+ cardLast4: '4242',
77
+ cardBrand: 'Visa',
78
+ };
79
+
80
+ export const MOCK_INVOICES = [
81
+ { id: 'inv_001', date: '2025-03-01', amount: '$29.00', status: 'paid' as const },
82
+ { id: 'inv_002', date: '2025-02-01', amount: '$29.00', status: 'paid' as const },
83
+ { id: 'inv_003', date: '2025-01-01', amount: '$29.00', status: 'paid' as const },
84
+ ];
85
+
86
+ // ═══════════════════════════════════════════════════════════════
87
+ // MOCK PRODUCTS (for marketplace/checkout)
88
+ // ═══════════════════════════════════════════════════════════════
89
+
90
+ export const MOCK_PRODUCTS = [
91
+ {
92
+ id: 'prod_1',
93
+ name: 'Starter',
94
+ price: 9,
95
+ features: ['1,000 users', 'Basic analytics', 'Email support'],
96
+ },
97
+ {
98
+ id: 'prod_2',
99
+ name: 'Pro',
100
+ price: 29,
101
+ features: ['Unlimited users', 'Advanced analytics', 'Priority support', 'Custom domains'],
102
+ },
103
+ {
104
+ id: 'prod_3',
105
+ name: 'Enterprise',
106
+ price: 99,
107
+ features: ['Everything in Pro', 'SSO/SAML', 'Dedicated support', 'SLA guarantee'],
108
+ },
109
+ ];
110
+
111
+ // ═══════════════════════════════════════════════════════════════
112
+ // MOCK NOTIFICATIONS
113
+ // ═══════════════════════════════════════════════════════════════
114
+
115
+ export const MOCK_NOTIFICATIONS = [
116
+ {
117
+ id: 'n1',
118
+ title: 'Welcome!',
119
+ message: 'Your account is set up and ready to go.',
120
+ read: true,
121
+ timestamp: '1 day ago',
122
+ },
123
+ {
124
+ id: 'n2',
125
+ title: 'New feature',
126
+ message: 'Check out our latest dashboard improvements.',
127
+ read: false,
128
+ timestamp: '2 hours ago',
129
+ },
130
+ ];
131
+
132
+ // ═══════════════════════════════════════════════════════════════
133
+ // HELPERS
134
+ // ═══════════════════════════════════════════════════════════════
135
+
136
+ /**
137
+ * Returns mock data when in mock mode, or calls the real fetcher.
138
+ * Use this to wrap any data-fetching function for easy mock→real transition.
139
+ *
140
+ * @example
141
+ * // TODO: [REAL_DATA] Replace mockData with your actual API call
142
+ * const stats = await mockOr(MOCK_STATS, () => fetchDashboardStats());
143
+ */
144
+ export async function mockOr<T>(mockData: T, realFetcher: () => Promise<T>): Promise<T> {
145
+ if (MOCK_MODE) return mockData;
146
+ return realFetcher();
147
+ }
@@ -15,9 +15,11 @@ import { enforceRateLimit, AppRateLimits } from '@/lib/api-security';
15
15
 
16
16
  export const dynamic = 'force-dynamic';
17
17
 
18
- const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
19
- apiVersion: '2025-02-24.acacia',
20
- });
18
+ function getStripe() {
19
+ return new Stripe(process.env.STRIPE_SECRET_KEY!, {
20
+ apiVersion: '2025-02-24.acacia',
21
+ });
22
+ }
21
23
 
22
24
  /**
23
25
  * Check if this webhook event has already been processed (idempotency).
@@ -49,7 +51,11 @@ export async function POST(request: NextRequest) {
49
51
 
50
52
  let event: Stripe.Event;
51
53
  try {
52
- event = stripe.webhooks.constructEvent(body, signature, process.env.STRIPE_WEBHOOK_SECRET!);
54
+ event = getStripe().webhooks.constructEvent(
55
+ body,
56
+ signature,
57
+ process.env.STRIPE_WEBHOOK_SECRET!,
58
+ );
53
59
  } catch (err) {
54
60
  console.error('[Stripe Webhook] Signature verification failed:', err);
55
61
  return NextResponse.json({ error: 'Invalid signature' }, { status: 400 });
@@ -32,7 +32,7 @@ export function getRedisClient(): RedisClient | null {
32
32
 
33
33
  try {
34
34
  // Dynamic require — only loads if ioredis is installed
35
- // eslint-disable-next-line @typescript-eslint/no-require-imports
35
+ // eslint-disable-next-line
36
36
  const Redis = require('ioredis');
37
37
  _client = new Redis(url, {
38
38
  keyPrefix: process.env.REDIS_KEY_PREFIX || 'app:',
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Demo auth API routes.
3
+ *
4
+ * POST /api/auth — Login or Signup
5
+ * DELETE /api/auth — Logout
6
+ *
7
+ * Replace with your real auth provider (Auth.js, Supabase Auth, etc.)
8
+ * when configuring your app for production.
9
+ */
10
+ import { NextRequest, NextResponse } from 'next/server'
11
+ import { cookies } from 'next/headers'
12
+
13
+ export async function POST(request: NextRequest) {
14
+ try {
15
+ const body = await request.json()
16
+ const { email, password, action } = body
17
+
18
+ if (!email || !password) {
19
+ return NextResponse.json(
20
+ { error: 'Email and password are required' },
21
+ { status: 400 }
22
+ )
23
+ }
24
+
25
+ // Demo: accept any email/password combination.
26
+ // Replace with real authentication (database lookup, bcrypt compare, etc.)
27
+ const user = {
28
+ id: crypto.randomUUID(),
29
+ email,
30
+ name: email.split('@')[0],
31
+ }
32
+
33
+ const session = JSON.stringify({ user })
34
+ const cookieStore = await cookies()
35
+
36
+ cookieStore.set('session', session, {
37
+ httpOnly: true,
38
+ secure: process.env.NODE_ENV === 'production',
39
+ sameSite: 'lax',
40
+ path: '/',
41
+ maxAge: 60 * 60 * 24 * 7, // 7 days
42
+ })
43
+
44
+ return NextResponse.json({ user })
45
+ } catch {
46
+ return NextResponse.json(
47
+ { error: 'Authentication failed' },
48
+ { status: 500 }
49
+ )
50
+ }
51
+ }
52
+
53
+ export async function DELETE() {
54
+ const cookieStore = await cookies()
55
+ cookieStore.delete('session')
56
+ return NextResponse.json({ success: true })
57
+ }
@@ -0,0 +1,112 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { Button, Card, CardContent } from '@digilogiclabs/saas-factory-ui'
5
+ import { Bot } from 'lucide-react'
6
+ import { useRouter } from 'next/navigation'
7
+ import Link from 'next/link'
8
+
9
+ export default function LoginPage() {
10
+ const [email, setEmail] = useState('')
11
+ const [password, setPassword] = useState('')
12
+ const [error, setError] = useState('')
13
+ const [loading, setLoading] = useState(false)
14
+ const router = useRouter()
15
+
16
+ const handleSubmit = async (e: React.FormEvent) => {
17
+ e.preventDefault()
18
+ setError('')
19
+ setLoading(true)
20
+ try {
21
+ const res = await fetch('/api/auth', {
22
+ method: 'POST',
23
+ headers: { 'Content-Type': 'application/json' },
24
+ body: JSON.stringify({ email, password, action: 'login' }),
25
+ })
26
+ if (!res.ok) {
27
+ const data = await res.json()
28
+ throw new Error(data.error || 'Failed to sign in')
29
+ }
30
+ router.push('/dashboard')
31
+ router.refresh()
32
+ } catch (err) {
33
+ setError(err instanceof Error ? err.message : 'Failed to sign in')
34
+ } finally {
35
+ setLoading(false)
36
+ }
37
+ }
38
+
39
+ return (
40
+ <div className="min-h-screen flex items-center justify-center bg-background px-4">
41
+ <div className="w-full max-w-md">
42
+ {/* Logo */}
43
+ <Link href="/" className="flex items-center justify-center gap-2 mb-8 hover:opacity-80 transition-opacity">
44
+ <div className="w-10 h-10 rounded-xl bg-gradient-to-br from-brand-from via-brand-via to-brand-to flex items-center justify-center">
45
+ <Bot className="w-5 h-5 text-white" />
46
+ </div>
47
+ <span className="font-bold text-xl">AI Platform</span>
48
+ </Link>
49
+
50
+ <Card className="border border-border">
51
+ <CardContent className="p-8">
52
+ <div className="text-center mb-8">
53
+ <h1 className="text-2xl font-bold">Welcome back</h1>
54
+ <p className="text-muted-foreground mt-2">Sign in to access AI models</p>
55
+ </div>
56
+
57
+ {error && (
58
+ <div className="bg-destructive/10 text-destructive p-3 rounded-lg mb-6 text-sm" role="alert">
59
+ {error}
60
+ </div>
61
+ )}
62
+
63
+ <form onSubmit={handleSubmit} className="space-y-4">
64
+ <div>
65
+ <label htmlFor="email" className="block text-sm font-medium mb-1.5">
66
+ Email
67
+ </label>
68
+ <input
69
+ id="email"
70
+ type="email"
71
+ value={email}
72
+ onChange={(e) => setEmail(e.target.value)}
73
+ className="w-full px-3 py-2.5 rounded-lg border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-shadow"
74
+ placeholder="you@example.com"
75
+ required
76
+ />
77
+ </div>
78
+
79
+ <div>
80
+ <label htmlFor="password" className="block text-sm font-medium mb-1.5">
81
+ Password
82
+ </label>
83
+ <input
84
+ id="password"
85
+ type="password"
86
+ value={password}
87
+ onChange={(e) => setPassword(e.target.value)}
88
+ className="w-full px-3 py-2.5 rounded-lg border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-shadow"
89
+ placeholder="Enter your password"
90
+ required
91
+ />
92
+ </div>
93
+
94
+ <Button type="submit" className="w-full h-11 text-base cursor-pointer hover:brightness-110 active:scale-[0.98] transition-all duration-200" disabled={loading}>
95
+ {loading ? 'Signing in...' : 'Sign In'}
96
+ </Button>
97
+ </form>
98
+
99
+ <div className="mt-6 text-center">
100
+ <p className="text-muted-foreground text-sm">
101
+ Don&apos;t have an account?{' '}
102
+ <Link href="/signup" className="text-primary hover:underline font-medium">
103
+ Create an account
104
+ </Link>
105
+ </p>
106
+ </div>
107
+ </CardContent>
108
+ </Card>
109
+ </div>
110
+ </div>
111
+ )
112
+ }