@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
@@ -2,63 +2,50 @@
2
2
 
3
3
  import React, { useState } from 'react';
4
4
  import { Button, Card, Input, Label } from '@digilogiclabs/saas-factory-ui';
5
- import { useAuth } from '@digilogiclabs/app-sdk';
6
5
  import { useRouter } from 'next/navigation';
6
+ import Link from 'next/link';
7
7
 
8
8
  export default function SignupPage() {
9
9
  const [email, setEmail] = useState('');
10
10
  const [password, setPassword] = useState('');
11
11
  const [confirmPassword, setConfirmPassword] = useState('');
12
- const { signUp, signInWithOAuth, loading, error, user } = useAuth();
12
+ const [loading, setLoading] = useState(false);
13
+ const [error, setError] = useState<string | null>(null);
13
14
  const router = useRouter();
14
15
 
15
- // Redirect if already logged in
16
- React.useEffect(() => {
17
- if (user) {
18
- router.push('/');
19
- }
20
- }, [user, router]);
21
-
22
16
  const handleSignup = async (e: React.FormEvent) => {
23
17
  e.preventDefault();
24
-
18
+ setLoading(true);
19
+ setError(null);
20
+
25
21
  if (password !== confirmPassword) {
26
- alert('Passwords do not match');
22
+ setError('Passwords do not match');
23
+ setLoading(false);
27
24
  return;
28
25
  }
29
26
 
30
27
  try {
31
- await signUp(email, password);
28
+ // TODO: Replace with your auth provider (Supabase, NextAuth, etc.)
29
+ // Example with Supabase:
30
+ // const { error } = await supabase.auth.signUp({ email, password });
31
+ // if (error) throw error;
32
+ console.log('Sign up with:', email);
32
33
  router.push('/');
33
34
  } catch (err) {
34
- console.error('Signup error:', err);
35
+ setError(err instanceof Error ? err.message : 'An error occurred during sign up');
36
+ } finally {
37
+ setLoading(false);
35
38
  }
36
39
  };
37
40
 
38
- const handleGoogleSignup = async () => {
39
- try {
40
- await signInWithOAuth('google');
41
- } catch (err) {
42
- console.error('Google signup error:', err);
43
- }
44
- };
45
-
46
- if (loading) {
47
- return (
48
- <div className="flex items-center justify-center min-h-screen bg-gray-100">
49
- <div>Loading...</div>
50
- </div>
51
- );
52
- }
53
-
54
41
  return (
55
- <div className="flex items-center justify-center min-h-screen bg-gray-100">
42
+ <div className="flex items-center justify-center min-h-screen bg-muted">
56
43
  <Card className="w-full max-w-md p-8">
57
- <h1 className="text-2xl font-bold text-center mb-6">Sign Up</h1>
58
-
44
+ <h1 className="text-2xl font-bold text-center mb-6 text-foreground">Sign Up</h1>
45
+
59
46
  {error && (
60
- <div className="mb-4 p-3 bg-red-100 border border-red-400 text-red-700 rounded">
61
- {error.message}
47
+ <div className="mb-4 p-3 rounded border border-destructive/50 bg-destructive/10 text-destructive text-sm">
48
+ {error}
62
49
  </div>
63
50
  )}
64
51
 
@@ -102,27 +89,17 @@ export default function SignupPage() {
102
89
  <Button type="submit" className="w-full" disabled={loading}>
103
90
  {loading ? 'Signing Up...' : 'Sign Up'}
104
91
  </Button>
105
- <Button
106
- type="button"
107
- variant="outline"
108
- className="w-full"
109
- onClick={handleGoogleSignup}
110
- disabled={loading}
111
- >
112
- Sign up with Google
113
- </Button>
114
92
  </form>
115
93
 
116
94
  <div className="mt-4 text-center">
117
- <p className="text-sm text-gray-600">
95
+ <p className="text-sm text-muted-foreground">
118
96
  Already have an account?{' '}
119
- <a href="/login" className="text-blue-600 hover:underline">
97
+ <Link href="/login" className="text-primary hover:underline">
120
98
  Sign in
121
- </a>
99
+ </Link>
122
100
  </p>
123
101
  </div>
124
102
  </Card>
125
103
  </div>
126
104
  );
127
105
  }
128
-
@@ -2,7 +2,12 @@
2
2
 
3
3
  import { ThemeProvider } from 'next-themes'
4
4
  import { Toaster } from '@digilogiclabs/saas-factory-ui'
5
- import { DLLProvider } from '@digilogiclabs/app-sdk'
5
+ import { MockAuthProvider } from '@/components/mock-auth-provider'
6
+
7
+ // TODO: [REAL_DATA] Replace MockAuthProvider with your auth provider:
8
+ // Supabase: import { AuthProvider } from '@/providers/auth-provider'
9
+ // NextAuth: import { SessionProvider } from 'next-auth/react'
10
+ // Keycloak: import { KeycloakProvider } from '@/providers/keycloak'
6
11
 
7
12
  interface AppProvidersProps {
8
13
  children: React.ReactNode
@@ -11,10 +16,10 @@ interface AppProvidersProps {
11
16
  export function AppProviders({ children }: AppProvidersProps) {
12
17
  return (
13
18
  <ThemeProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
14
- <DLLProvider>
19
+ <MockAuthProvider>
15
20
  {children}
16
21
  <Toaster />
17
- </DLLProvider>
22
+ </MockAuthProvider>
18
23
  </ThemeProvider>
19
24
  )
20
25
  }
@@ -1,94 +1,229 @@
1
- 'use client';
2
-
3
- import React, { useState } from 'react';
4
- import Link from 'next/link';
5
- import { LogOut, Search, Command } from 'lucide-react';
6
- import { SearchBar, CommandPalette, useToast } from '@digilogiclabs/saas-factory-ui';
7
- import { ThemeToggle } from '../ui/theme-toggle';
8
-
9
- export function Header() {
10
- const user = null; // Placeholder for auth state
11
- const [showSearch, setShowSearch] = useState(false);
12
- const { toast } = useToast();
13
-
14
- const handleSignOut = () => {
15
- alert('Sign out functionality requires @digilogiclabs/saas-factory-auth package');
16
- };
17
-
18
- const handleSearch = (query: string) => {
19
- toast({
20
- title: "Search",
21
- description: `Searching for: ${query}`,
22
- });
23
- };
24
-
25
- return (
26
- <header className="bg-white dark:bg-gray-800 shadow-md">
27
- <div className="container mx-auto px-4 py-4 flex justify-between items-center">
28
- <Link href="/" className="text-2xl font-bold text-gray-900 dark:text-white">
29
- {{titleCaseName}}
30
- </Link>
31
- <nav className="flex items-center gap-4">
32
- {/* Search Bar */}
33
- <div className="hidden md:block">
34
- <SearchBar
35
- placeholder="Search..."
36
- onSearch={handleSearch}
37
- debounceMs={300}
38
- className="w-64"
39
- />
40
- </div>
41
-
42
- {/* Mobile search toggle */}
43
- <button
44
- onClick={() => setShowSearch(!showSearch)}
45
- className="md:hidden p-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white"
46
- >
47
- <Search className="h-5 w-5" />
48
- </button>
49
-
50
- <CommandPalette />
51
- <ThemeToggle />
52
- {user ? (
53
- <>
54
- <Link href="/dashboard" className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white">
55
- Dashboard
56
- </Link>
57
- <button
58
- onClick={handleSignOut}
59
- className="p-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white"
60
- >
61
- <LogOut className="h-5 w-5" />
62
- </button>
63
- </>
64
- ) : (
65
- <>
66
- <Link href="/login" className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white">
67
- Login
68
- </Link>
69
- <Link
70
- href="/signup"
71
- className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700"
72
- >
73
- Sign Up
74
- </Link>
75
- </>
76
- )}
77
- </nav>
78
-
79
- {/* Mobile search bar */}
80
- {showSearch && (
81
- <div className="md:hidden absolute top-full left-0 right-0 p-4 bg-white dark:bg-gray-800 border-t">
82
- <SearchBar
83
- placeholder="Search..."
84
- onSearch={handleSearch}
85
- debounceMs={300}
86
- autoFocus
87
- />
88
- </div>
89
- )}
90
- </div>
91
- </header>
92
- );
93
- }
94
-
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import Link from 'next/link';
5
+ import { usePathname } from 'next/navigation';
6
+ import { ThemeToggle } from '@/components/ui/theme-toggle';
7
+ import { useMockAuth } from '@/components/mock-auth-provider';
8
+ import { MOCK_MODE } from '@/lib/mock';
9
+ import {
10
+ User, LogOut, ChevronDown, Menu, X, MoreHorizontal,
11
+ LayoutDashboard, Settings, CreditCard,
12
+ } from 'lucide-react';
13
+
14
+ /**
15
+ * Navigation links config.
16
+ * - `auth`: if true, only shown when user is authenticated
17
+ * - Links are shown in order; on desktop, the first MAX_DESKTOP_NAV
18
+ * are in the top bar and extras overflow into the user dropdown.
19
+ */
20
+ const NAV_LINKS = [
21
+ { href: '/dashboard', label: 'Dashboard', icon: LayoutDashboard, auth: true },
22
+ { href: '/settings', label: 'Settings', icon: Settings, auth: true },
23
+ { href: '/checkout', label: 'Billing', icon: CreditCard, auth: true },
24
+ // Add more links here — extras automatically overflow to dropdown/mobile
25
+ ];
26
+
27
+ /** Max nav links shown in the desktop top bar before overflow */
28
+ const MAX_DESKTOP_NAV = 3;
29
+
30
+ export function Header() {
31
+ const [dropdownOpen, setDropdownOpen] = useState(false);
32
+ const [mobileOpen, setMobileOpen] = useState(false);
33
+ const { user, signOut, isAuthenticated } = useMockAuth();
34
+ const pathname = usePathname();
35
+
36
+ const handleSignOut = () => {
37
+ signOut();
38
+ setDropdownOpen(false);
39
+ setMobileOpen(false);
40
+ };
41
+
42
+ // Filter links based on auth state
43
+ const visibleLinks = NAV_LINKS.filter((link) => !link.auth || isAuthenticated);
44
+ const desktopLinks = visibleLinks.slice(0, MAX_DESKTOP_NAV);
45
+ const overflowLinks = visibleLinks.slice(MAX_DESKTOP_NAV);
46
+
47
+ const isActive = (href: string) =>
48
+ pathname === href || (href !== '/' && pathname.startsWith(href));
49
+
50
+ return (
51
+ <header className="sticky top-0 z-50 border-b border-border bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
52
+ <div className="mx-auto flex h-14 max-w-6xl items-center px-4">
53
+ {/* Logo — left */}
54
+ <Link href="/" className="mr-auto text-lg font-bold text-foreground">
55
+ {'{{titleCaseName}}'}
56
+ </Link>
57
+
58
+ {/* ═══ Desktop (md+) ═══ */}
59
+ <div className="hidden items-center gap-1 md:flex">
60
+ {/* Primary nav links */}
61
+ {desktopLinks.map((link) => (
62
+ <Link
63
+ key={link.href}
64
+ href={link.href}
65
+ className={`rounded-md px-3 py-2 text-sm transition-colors ${
66
+ isActive(link.href)
67
+ ? 'bg-primary/10 text-primary font-medium'
68
+ : 'text-muted-foreground hover:text-foreground hover:bg-muted'
69
+ }`}
70
+ >
71
+ {link.label}
72
+ </Link>
73
+ ))}
74
+
75
+ <div className="ml-2 flex items-center gap-2">
76
+ <ThemeToggle />
77
+
78
+ {isAuthenticated && user ? (
79
+ <div className="relative">
80
+ <button
81
+ onClick={() => setDropdownOpen(!dropdownOpen)}
82
+ className="flex items-center gap-2 rounded-lg border border-border bg-card px-3 py-1.5 text-sm hover:bg-muted transition-colors"
83
+ >
84
+ <div className="flex h-6 w-6 items-center justify-center rounded-full bg-primary/10">
85
+ <User className="h-3.5 w-3.5 text-primary" />
86
+ </div>
87
+ <span className="text-foreground">{user.name}</span>
88
+ {MOCK_MODE && (
89
+ <span className="rounded bg-primary/10 px-1 py-0.5 text-[10px] text-primary font-medium">Mock</span>
90
+ )}
91
+ <ChevronDown className={`h-3.5 w-3.5 text-muted-foreground transition-transform ${dropdownOpen ? 'rotate-180' : ''}`} />
92
+ </button>
93
+
94
+ {dropdownOpen && (
95
+ <>
96
+ <div className="fixed inset-0 z-40" onClick={() => setDropdownOpen(false)} />
97
+ <div className="absolute right-0 top-full z-50 mt-1 w-56 rounded-lg border border-border bg-card shadow-lg">
98
+ {/* User info */}
99
+ <div className="border-b border-border px-4 py-3">
100
+ <p className="text-sm font-medium text-foreground">{user.name}</p>
101
+ <p className="text-xs text-muted-foreground">{user.email}</p>
102
+ </div>
103
+
104
+ {/* Overflow nav links (4th+ links go here) */}
105
+ {overflowLinks.length > 0 && (
106
+ <div className="border-b border-border py-1">
107
+ {overflowLinks.map((link) => (
108
+ <Link
109
+ key={link.href}
110
+ href={link.href}
111
+ onClick={() => setDropdownOpen(false)}
112
+ className={`flex items-center gap-2 px-4 py-2 text-sm transition-colors ${
113
+ isActive(link.href)
114
+ ? 'text-primary bg-primary/5'
115
+ : 'text-foreground hover:bg-muted'
116
+ }`}
117
+ >
118
+ <link.icon className="h-4 w-4 text-muted-foreground" />
119
+ {link.label}
120
+ </Link>
121
+ ))}
122
+ </div>
123
+ )}
124
+
125
+ {/* Sign out */}
126
+ <div className="py-1">
127
+ <button
128
+ onClick={handleSignOut}
129
+ className="flex w-full items-center gap-2 px-4 py-2 text-sm text-destructive hover:bg-muted transition-colors"
130
+ >
131
+ <LogOut className="h-4 w-4" /> Sign Out
132
+ </button>
133
+ </div>
134
+ </div>
135
+ </>
136
+ )}
137
+ </div>
138
+ ) : (
139
+ <>
140
+ <Link href="/login" className="rounded-md px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors">
141
+ Sign In
142
+ </Link>
143
+ <Link href="/signup" className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors">
144
+ Sign Up
145
+ </Link>
146
+ </>
147
+ )}
148
+ </div>
149
+ </div>
150
+
151
+ {/* ═══ Mobile (<md) ═══ */}
152
+ <div className="flex items-center gap-2 md:hidden">
153
+ <ThemeToggle />
154
+ <button
155
+ className="inline-flex items-center justify-center rounded-md p-2 text-muted-foreground hover:text-foreground hover:bg-muted"
156
+ onClick={() => { setMobileOpen(!mobileOpen); setDropdownOpen(false); }}
157
+ aria-label="Toggle menu"
158
+ >
159
+ {mobileOpen ? <X className="h-5 w-5" /> : <Menu className="h-5 w-5" />}
160
+ </button>
161
+ </div>
162
+ </div>
163
+
164
+ {/* ═══ Mobile overlay panel ═══ */}
165
+ {mobileOpen && (
166
+ <>
167
+ <div className="fixed inset-0 top-14 z-40 bg-background/80 backdrop-blur-sm md:hidden" onClick={() => setMobileOpen(false)} />
168
+ <div className="fixed inset-x-0 top-14 z-50 border-b border-border bg-background shadow-lg md:hidden">
169
+ {/* Nav links — filtered by auth */}
170
+ {visibleLinks.length > 0 && (
171
+ <nav className="px-4 py-2">
172
+ {visibleLinks.map((link) => (
173
+ <Link
174
+ key={link.href}
175
+ href={link.href}
176
+ onClick={() => setMobileOpen(false)}
177
+ className={`flex items-center gap-3 rounded-md px-3 py-2.5 text-sm transition-colors ${
178
+ isActive(link.href)
179
+ ? 'bg-primary/10 text-primary font-medium'
180
+ : 'text-muted-foreground hover:bg-muted hover:text-foreground'
181
+ }`}
182
+ >
183
+ <link.icon className="h-4 w-4" />
184
+ {link.label}
185
+ </Link>
186
+ ))}
187
+ </nav>
188
+ )}
189
+
190
+ {/* User section */}
191
+ <div className="border-t border-border px-4 py-3">
192
+ {isAuthenticated && user ? (
193
+ <>
194
+ <div className="flex items-center gap-3 px-3 py-2">
195
+ <div className="flex h-8 w-8 items-center justify-center rounded-full bg-primary/10">
196
+ <User className="h-4 w-4 text-primary" />
197
+ </div>
198
+ <div className="min-w-0 flex-1">
199
+ <p className="text-sm font-medium text-foreground truncate">{user.name}</p>
200
+ <p className="text-xs text-muted-foreground truncate">{user.email}</p>
201
+ </div>
202
+ {MOCK_MODE && (
203
+ <span className="rounded bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary font-medium">Mock</span>
204
+ )}
205
+ </div>
206
+ <button
207
+ onClick={handleSignOut}
208
+ className="mt-1 flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-sm text-destructive hover:bg-muted transition-colors"
209
+ >
210
+ <LogOut className="h-4 w-4" /> Sign Out
211
+ </button>
212
+ </>
213
+ ) : (
214
+ <div className="flex gap-2">
215
+ <Link href="/login" onClick={() => setMobileOpen(false)} className="flex-1 text-center rounded-md border border-border px-3 py-2.5 text-sm text-foreground hover:bg-muted transition-colors">
216
+ Sign In
217
+ </Link>
218
+ <Link href="/signup" onClick={() => setMobileOpen(false)} className="flex-1 text-center rounded-md bg-primary px-3 py-2.5 text-sm text-primary-foreground hover:bg-primary/90 transition-colors">
219
+ Sign Up
220
+ </Link>
221
+ </div>
222
+ )}
223
+ </div>
224
+ </div>
225
+ </>
226
+ )}
227
+ </header>
228
+ );
229
+ }
@@ -1,45 +1,38 @@
1
- import type { Metadata } from 'next'
2
- import { Inter } from 'next/font/google'
3
- import '@digilogiclabs/saas-factory-ui/dist/index.css'
4
- import './globals.css'
5
- {{#ai.enabled}}
6
- import { AIProvider } from '@digilogiclabs/saas-factory-ai/react'
7
- {{/ai.enabled}}
8
- import { AuthProvider } from '@/providers/auth-provider'
9
-
10
- const inter = Inter({ subsets: ['latin'] })
11
-
12
- export const metadata: Metadata = {
13
- title: '{{titleCaseName}}',
14
- description: '{{description}}',
15
- }
16
-
17
- export default function RootLayout({
18
- children,
19
- }: {
20
- children: React.ReactNode
21
- }) {
22
- return (
23
- <html lang="en">
24
- <body className={inter.className}>
25
- <a href="#main-content" className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 focus:z-[90] focus:px-4 focus:py-2 focus:bg-primary focus:text-primary-foreground focus:rounded-lg focus:outline-none">
26
- Skip to content
27
- </a>
28
- <AuthProvider>
29
- {{#ai.enabled}}
30
- <AIProvider
31
- config={{
32
- gatewayUrl: process.env.NEXT_PUBLIC_AI_GATEWAY_URL || 'http://localhost:3001',
33
- }}
34
- >
35
- {children}
36
- </AIProvider>
37
- {{/ai.enabled}}
38
- {{^ai.enabled}}
39
- {children}
40
- {{/ai.enabled}}
41
- </AuthProvider>
42
- </body>
43
- </html>
44
- )
45
- }
1
+ import type { Metadata } from 'next'
2
+ import { Inter } from 'next/font/google'
3
+ import './globals.css'
4
+ import { AppProviders } from '@/components/providers/app-providers'
5
+ import { Header } from '@/components/shared/header'
6
+ import { MockBanner } from '@/components/mock-banner'
7
+ import { Footer } from '@/components/shared/footer'
8
+
9
+ const inter = Inter({ subsets: ['latin'] })
10
+
11
+ export const metadata: Metadata = {
12
+ title: '{{titleCaseName}}',
13
+ description: '{{description}}',
14
+ }
15
+
16
+ export default function RootLayout({
17
+ children,
18
+ }: {
19
+ children: React.ReactNode
20
+ }) {
21
+ return (
22
+ <html lang="en" suppressHydrationWarning>
23
+ <body className={`${inter.className} min-h-screen flex flex-col`}>
24
+ <AppProviders>
25
+ <MockBanner />
26
+ <a href="#main-content" className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 focus:z-[90] focus:px-4 focus:py-2 focus:bg-primary focus:text-primary-foreground focus:rounded-lg focus:outline-none">
27
+ Skip to content
28
+ </a>
29
+ <Header />
30
+ <main id="main-content" className="flex-1">
31
+ {children}
32
+ </main>
33
+ <Footer />
34
+ </AppProviders>
35
+ </body>
36
+ </html>
37
+ )
38
+ }
@@ -0,0 +1,86 @@
1
+ 'use client';
2
+
3
+ import React, { useState } from 'react';
4
+ import { Button, Card, Input, Label } from '@digilogiclabs/saas-factory-ui';
5
+ import { useRouter } from 'next/navigation';
6
+ import Link from 'next/link';
7
+
8
+ export default function LoginPage() {
9
+ const [email, setEmail] = useState('');
10
+ const [password, setPassword] = useState('');
11
+ const [loading, setLoading] = useState(false);
12
+ const [error, setError] = useState<string | null>(null);
13
+ const router = useRouter();
14
+
15
+ const handleLogin = async (e: React.FormEvent) => {
16
+ e.preventDefault();
17
+ setLoading(true);
18
+ setError(null);
19
+
20
+ try {
21
+ // TODO: Replace with your auth provider (Supabase, NextAuth, etc.)
22
+ // Example with Supabase:
23
+ // const { error } = await supabase.auth.signInWithPassword({ email, password });
24
+ // if (error) throw error;
25
+ console.log('Sign in with:', email);
26
+ router.push('/');
27
+ } catch (err) {
28
+ setError(err instanceof Error ? err.message : 'An error occurred during sign in');
29
+ } finally {
30
+ setLoading(false);
31
+ }
32
+ };
33
+
34
+ return (
35
+ <div className="flex items-center justify-center min-h-screen bg-muted">
36
+ <Card className="w-full max-w-md p-8">
37
+ <h1 className="text-2xl font-bold text-center mb-6 text-foreground">Sign In</h1>
38
+
39
+ {error && (
40
+ <div className="mb-4 p-3 rounded border border-destructive/50 bg-destructive/10 text-destructive text-sm">
41
+ {error}
42
+ </div>
43
+ )}
44
+
45
+ <form onSubmit={handleLogin} className="space-y-4">
46
+ <div>
47
+ <Label htmlFor="email">Email</Label>
48
+ <Input
49
+ id="email"
50
+ type="email"
51
+ value={email}
52
+ onChange={(e) => setEmail(e.target.value)}
53
+ placeholder="Enter your email"
54
+ required
55
+ disabled={loading}
56
+ />
57
+ </div>
58
+ <div>
59
+ <Label htmlFor="password">Password</Label>
60
+ <Input
61
+ id="password"
62
+ type="password"
63
+ value={password}
64
+ onChange={(e) => setPassword(e.target.value)}
65
+ placeholder="Enter your password"
66
+ required
67
+ disabled={loading}
68
+ />
69
+ </div>
70
+ <Button type="submit" className="w-full" disabled={loading}>
71
+ {loading ? 'Signing In...' : 'Sign In'}
72
+ </Button>
73
+ </form>
74
+
75
+ <div className="mt-4 text-center">
76
+ <p className="text-sm text-muted-foreground">
77
+ Don&apos;t have an account?{' '}
78
+ <Link href="/signup" className="text-primary hover:underline">
79
+ Sign up
80
+ </Link>
81
+ </p>
82
+ </div>
83
+ </Card>
84
+ </div>
85
+ );
86
+ }