@digilogiclabs/create-saas-app 2.11.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 (358) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/index.js +1 -1
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/generators/template-generator.d.ts.map +1 -1
  6. package/dist/generators/template-generator.js +15 -8
  7. package/dist/generators/template-generator.js.map +1 -1
  8. package/dist/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  9. package/dist/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  10. package/dist/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  11. package/dist/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  12. package/dist/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  13. package/dist/templates/shared/email/web/src/lib/email/client.ts +1 -1
  14. package/dist/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  15. package/dist/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  16. package/dist/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  17. package/dist/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  18. package/dist/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  19. package/dist/templates/shared/loading/web/components/skeleton.tsx +4 -4
  20. package/dist/templates/shared/mock/web/.env.local +55 -0
  21. package/dist/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  22. package/dist/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  23. package/dist/templates/shared/mock/web/src/lib/mock.ts +147 -0
  24. package/dist/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  25. package/dist/templates/shared/redis/web/src/lib/redis.ts +1 -1
  26. package/dist/templates/web/base/template/eslint.config.mjs +14 -0
  27. package/dist/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  28. package/dist/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  29. package/dist/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  30. package/dist/templates/web/base/template/src/app/layout.tsx +40 -38
  31. package/dist/templates/web/base/template/src/app/login/page.tsx +116 -66
  32. package/dist/templates/web/base/template/src/app/page.tsx +97 -193
  33. package/dist/templates/web/base/template/src/app/settings/page.tsx +154 -0
  34. package/dist/templates/web/base/template/src/app/signup/page.tsx +117 -66
  35. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  36. package/dist/templates/web/base/template/src/components/shared/header.tsx +229 -63
  37. package/dist/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  38. package/dist/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  39. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  40. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  41. package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  42. package/dist/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  43. package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  44. package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  45. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  46. package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  47. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  48. package/dist/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  49. package/dist/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  50. package/dist/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  51. package/dist/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  52. package/dist/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  53. package/dist/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  54. package/dist/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  55. package/dist/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  56. package/dist/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  57. package/dist/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  58. package/dist/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  59. package/dist/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  60. package/dist/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  61. package/dist/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  62. package/dist/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  63. package/dist/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  64. package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  65. package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  66. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  67. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  68. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  69. package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  70. package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  71. package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  72. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  73. package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  74. package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  75. package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  76. package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  77. package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  78. package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  79. package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  80. package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  81. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  82. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  83. package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  84. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  85. package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  86. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  87. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  88. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  89. package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  90. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  91. package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  92. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  93. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  94. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  95. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  96. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  97. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  98. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  99. package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  100. package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  101. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  102. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  103. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  104. package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  105. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  106. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  107. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  108. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  109. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  110. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  111. package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  112. package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  113. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  114. package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  115. package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  116. package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  117. package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  118. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  119. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  120. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  121. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  122. package/dist/templates/web/ui-only/template/eslint.config.mjs +14 -0
  123. package/dist/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  124. package/dist/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  125. package/dist/templates/web/ui-only/template/src/app/page.tsx +69 -91
  126. package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  127. package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  128. package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  129. package/dist/templates/web/ui-package-test/template/package.json +19 -23
  130. package/dist/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  131. package/dist/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  132. package/dist/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  133. package/dist/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  134. package/package.json +1 -1
  135. package/src/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  136. package/src/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  137. package/src/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  138. package/src/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  139. package/src/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  140. package/src/templates/shared/email/web/src/lib/email/client.ts +1 -1
  141. package/src/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  142. package/src/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  143. package/src/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  144. package/src/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  145. package/src/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  146. package/src/templates/shared/loading/web/components/skeleton.tsx +4 -4
  147. package/src/templates/shared/mock/web/.env.local +55 -0
  148. package/src/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  149. package/src/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  150. package/src/templates/shared/mock/web/src/lib/mock.ts +147 -0
  151. package/src/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  152. package/src/templates/shared/redis/web/src/lib/redis.ts +1 -1
  153. package/src/templates/web/base/template/eslint.config.mjs +14 -0
  154. package/src/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  155. package/src/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  156. package/src/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  157. package/src/templates/web/base/template/src/app/layout.tsx +40 -38
  158. package/src/templates/web/base/template/src/app/login/page.tsx +116 -66
  159. package/src/templates/web/base/template/src/app/page.tsx +97 -193
  160. package/src/templates/web/base/template/src/app/settings/page.tsx +154 -0
  161. package/src/templates/web/base/template/src/app/signup/page.tsx +117 -66
  162. package/src/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  163. package/src/templates/web/base/template/src/components/shared/header.tsx +229 -63
  164. package/src/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  165. package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  166. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  167. package/src/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  168. package/src/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  169. package/src/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  170. package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  171. package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  172. package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  173. package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  174. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  175. package/src/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  176. package/src/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  177. package/src/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  178. package/src/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  179. package/src/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  180. package/src/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  181. package/src/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  182. package/src/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  183. package/src/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  184. package/src/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  185. package/src/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  186. package/src/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  187. package/src/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  188. package/src/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  189. package/src/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  190. package/src/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  191. package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  192. package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  193. package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  194. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  195. package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  196. package/src/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  197. package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  198. package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  199. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  200. package/src/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  201. package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  202. package/src/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  203. package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  204. package/src/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  205. package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  206. package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  207. package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  208. package/src/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  209. package/src/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  210. package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  211. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  212. package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  213. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  214. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  215. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  216. package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  217. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  218. package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  219. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  220. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  221. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  222. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  223. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  224. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  225. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  226. package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  227. package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  228. package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  229. package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  230. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  231. package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  232. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  233. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  234. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  235. package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  236. package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  237. package/src/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  238. package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  239. package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  240. package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  241. package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  242. package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  243. package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  244. package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  245. package/src/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  246. package/src/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  247. package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  248. package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  249. package/src/templates/web/ui-only/template/eslint.config.mjs +14 -0
  250. package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  251. package/src/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  252. package/src/templates/web/ui-only/template/src/app/page.tsx +69 -91
  253. package/src/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  254. package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  255. package/src/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  256. package/src/templates/web/ui-package-test/template/package.json +19 -23
  257. package/src/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  258. package/src/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  259. package/src/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  260. package/src/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  261. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  262. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  263. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  264. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  265. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  266. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  267. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  268. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  269. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  270. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  271. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  272. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  273. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  274. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  275. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  276. package/dist/templates/web/base/template/.eslintrc.js +0 -8
  277. package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  278. package/dist/templates/web/base/template/src/test/setup.ts +0 -74
  279. package/dist/templates/web/base/template/vitest.config.ts +0 -17
  280. package/dist/templates/web/ui-auth/template/.eslintrc.js +0 -8
  281. package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  282. package/dist/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  283. package/dist/templates/web/ui-auth/template/vitest.config.ts +0 -17
  284. package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  285. package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  286. package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  287. package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  288. package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  289. package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  290. package/dist/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  291. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  292. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  293. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  294. package/dist/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  295. package/dist/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  296. package/dist/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  297. package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  298. package/dist/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  299. package/dist/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  300. package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  301. package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  302. package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  303. package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  304. package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  305. package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  306. package/dist/templates/web/ui-only/template/.eslintrc.js +0 -8
  307. package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  308. package/dist/templates/web/ui-only/template/src/test/setup.ts +0 -74
  309. package/dist/templates/web/ui-only/template/vitest.config.ts +0 -17
  310. package/src/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  311. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  312. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  313. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  314. package/src/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  315. package/src/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  316. package/src/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  317. package/src/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  318. package/src/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  319. package/src/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  320. package/src/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  321. package/src/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  322. package/src/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  323. package/src/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  324. package/src/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  325. package/src/templates/web/base/template/.eslintrc.js +0 -8
  326. package/src/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  327. package/src/templates/web/base/template/src/test/setup.ts +0 -74
  328. package/src/templates/web/base/template/vitest.config.ts +0 -17
  329. package/src/templates/web/ui-auth/template/.eslintrc.js +0 -8
  330. package/src/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  331. package/src/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  332. package/src/templates/web/ui-auth/template/vitest.config.ts +0 -17
  333. package/src/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  334. package/src/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  335. package/src/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  336. package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  337. package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  338. package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  339. package/src/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  340. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  341. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  342. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  343. package/src/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  344. package/src/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  345. package/src/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  346. package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  347. package/src/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  348. package/src/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  349. package/src/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  350. package/src/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  351. package/src/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  352. package/src/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  353. package/src/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  354. package/src/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  355. package/src/templates/web/ui-only/template/.eslintrc.js +0 -8
  356. package/src/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  357. package/src/templates/web/ui-only/template/src/test/setup.ts +0 -74
  358. package/src/templates/web/ui-only/template/vitest.config.ts +0 -17
@@ -0,0 +1,56 @@
1
+ import * as React from "react"
2
+ import { Slot } from "@radix-ui/react-slot"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+ import { cn } from "@/lib/utils"
5
+
6
+ const buttonVariants = cva(
7
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
12
+ destructive:
13
+ "bg-destructive text-destructive-foreground hover:bg-destructive/90",
14
+ outline:
15
+ "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
16
+ secondary:
17
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
18
+ ghost: "hover:bg-accent hover:text-accent-foreground",
19
+ link: "text-primary underline-offset-4 hover:underline",
20
+ },
21
+ size: {
22
+ default: "h-10 px-4 py-2",
23
+ sm: "h-9 rounded-md px-3",
24
+ lg: "h-11 rounded-md px-8",
25
+ icon: "h-10 w-10",
26
+ },
27
+ },
28
+ defaultVariants: {
29
+ variant: "default",
30
+ size: "default",
31
+ },
32
+ }
33
+ )
34
+
35
+ export interface ButtonProps
36
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
37
+ VariantProps<typeof buttonVariants> {
38
+ asChild?: boolean
39
+ }
40
+
41
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
42
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
43
+ const Comp = asChild ? Slot : "button"
44
+ return (
45
+ <Comp
46
+ className={cn(buttonVariants({ variant, size, className }))}
47
+ ref={ref}
48
+ {...props}
49
+ />
50
+ )
51
+ }
52
+ )
53
+ Button.displayName = "Button"
54
+
55
+ export { Button, buttonVariants }
56
+
@@ -37,7 +37,7 @@ function getResend(): Resend | null {
37
37
 
38
38
  try {
39
39
  // Dynamic import to avoid requiring resend in all environments
40
- // eslint-disable-next-line @typescript-eslint/no-require-imports
40
+ // eslint-disable-next-line
41
41
  const { Resend } = require('resend');
42
42
  resendClient = new Resend(apiKey);
43
43
  return resendClient;
@@ -1,5 +1,7 @@
1
1
  'use client';
2
2
 
3
+ import Link from 'next/link';
4
+
3
5
  /**
4
6
  * Error boundary page.
5
7
  *
@@ -14,11 +16,11 @@ export default function Error({
14
16
  reset: () => void;
15
17
  }) {
16
18
  return (
17
- <main className="flex min-h-screen items-center justify-center bg-white px-4 dark:bg-gray-950">
19
+ <main className="flex min-h-screen items-center justify-center bg-background px-4">
18
20
  <div className="text-center">
19
- <div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30">
21
+ <div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-destructive/10">
20
22
  <svg
21
- className="h-8 w-8 text-red-600 dark:text-red-400"
23
+ className="h-8 w-8 text-destructive"
22
24
  fill="none"
23
25
  viewBox="0 0 24 24"
24
26
  strokeWidth="1.5"
@@ -31,20 +33,20 @@ export default function Error({
31
33
  />
32
34
  </svg>
33
35
  </div>
34
- <h1 className="text-2xl font-semibold text-gray-900 dark:text-white">
36
+ <h1 className="text-2xl font-semibold text-foreground">
35
37
  Something went wrong
36
38
  </h1>
37
- <p className="mt-2 max-w-md text-gray-600 dark:text-gray-400">
39
+ <p className="mt-2 max-w-md text-muted-foreground">
38
40
  An unexpected error occurred. Please try again.
39
41
  </p>
40
42
  {error.digest && (
41
- <p className="mt-1 text-xs text-gray-400 dark:text-gray-500">
43
+ <p className="mt-1 text-xs text-muted-foreground/70">
42
44
  Error ID: {error.digest}
43
45
  </p>
44
46
  )}
45
47
 
46
48
  {process.env.NODE_ENV === 'development' && (
47
- <pre className="mx-auto mt-4 max-w-lg overflow-auto rounded-lg bg-gray-100 p-4 text-left text-xs text-red-600 dark:bg-gray-900 dark:text-red-400">
49
+ <pre className="mx-auto mt-4 max-w-lg overflow-auto rounded-lg bg-muted p-4 text-left text-xs text-destructive">
48
50
  {error.message}
49
51
  {error.stack && `\n\n${error.stack}`}
50
52
  </pre>
@@ -53,16 +55,16 @@ export default function Error({
53
55
  <div className="mt-8 flex items-center justify-center gap-4">
54
56
  <button
55
57
  onClick={reset}
56
- className="rounded-lg bg-blue-600 px-5 py-2.5 text-sm font-medium text-white transition-colors hover:bg-blue-700"
58
+ className="rounded-lg bg-primary px-5 py-2.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90"
57
59
  >
58
60
  Try Again
59
61
  </button>
60
- <a
62
+ <Link
61
63
  href="/"
62
- className="rounded-lg border border-gray-300 px-5 py-2.5 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800"
64
+ className="rounded-lg border border-border px-5 py-2.5 text-sm font-medium text-foreground transition-colors hover:bg-muted"
63
65
  >
64
66
  Go Home
65
- </a>
67
+ </Link>
66
68
  </div>
67
69
  </div>
68
70
  </main>
@@ -1,5 +1,7 @@
1
1
  'use client';
2
2
 
3
+ /* eslint-disable @next/next/no-html-link-for-pages */
4
+
3
5
  /**
4
6
  * Root error boundary.
5
7
  *
@@ -8,27 +8,27 @@ import Link from 'next/link';
8
8
  */
9
9
  export default function NotFound() {
10
10
  return (
11
- <main className="flex min-h-screen items-center justify-center bg-white px-4 dark:bg-gray-950">
11
+ <main className="flex min-h-screen items-center justify-center bg-background px-4">
12
12
  <div className="text-center">
13
- <p className="bg-gradient-to-r from-blue-500 to-purple-600 bg-clip-text text-8xl font-bold text-transparent">
13
+ <p className="bg-gradient-to-r from-primary to-accent bg-clip-text text-8xl font-bold text-transparent">
14
14
  404
15
15
  </p>
16
- <h1 className="mt-4 text-2xl font-semibold text-gray-900 dark:text-white">
16
+ <h1 className="mt-4 text-2xl font-semibold text-foreground">
17
17
  Page not found
18
18
  </h1>
19
- <p className="mt-2 max-w-md text-gray-600 dark:text-gray-400">
19
+ <p className="mt-2 max-w-md text-muted-foreground">
20
20
  The page you&apos;re looking for doesn&apos;t exist or has been moved.
21
21
  </p>
22
22
  <div className="mt-8 flex items-center justify-center gap-4">
23
23
  <Link
24
24
  href="/"
25
- className="rounded-lg bg-blue-600 px-5 py-2.5 text-sm font-medium text-white transition-colors hover:bg-blue-700"
25
+ className="rounded-lg bg-primary px-5 py-2.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90"
26
26
  >
27
27
  Go Home
28
28
  </Link>
29
29
  <Link
30
30
  href="/dashboard"
31
- className="rounded-lg border border-gray-300 px-5 py-2.5 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800"
31
+ className="rounded-lg border border-border px-5 py-2.5 text-sm font-medium text-foreground transition-colors hover:bg-muted"
32
32
  >
33
33
  Dashboard
34
34
  </Link>
@@ -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,14 @@
1
+ import { dirname } from 'path';
2
+ import { fileURLToPath } from 'url';
3
+ import { FlatCompat } from '@eslint/eslintrc';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+
8
+ const compat = new FlatCompat({
9
+ baseDirectory: __dirname,
10
+ });
11
+
12
+ const eslintConfig = [...compat.extends('next/core-web-vitals')];
13
+
14
+ export default eslintConfig;
@@ -16,7 +16,7 @@ export async function GET(request: NextRequest) {
16
16
  {
17
17
  cookies: {
18
18
  getAll: () => cookieStore.getAll(),
19
- setAll: (cookiesToSet) => {
19
+ setAll: (cookiesToSet: Array<{ name: string; value: string; options?: Record<string, unknown> }>) => {
20
20
  cookiesToSet.forEach(({ name, value, options }) =>
21
21
  cookieStore.set(name, value, options)
22
22
  );