@digilogiclabs/create-saas-app 2.10.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +153 -113
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cli/commands/create.d.ts.map +1 -1
  5. package/dist/cli/commands/create.js +2 -6
  6. package/dist/cli/commands/create.js.map +1 -1
  7. package/dist/cli/index.js +1 -1
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/generators/template-generator.d.ts.map +1 -1
  10. package/dist/generators/template-generator.js +15 -8
  11. package/dist/generators/template-generator.js.map +1 -1
  12. package/dist/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  13. package/dist/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  14. package/dist/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  15. package/dist/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  16. package/dist/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  17. package/dist/templates/shared/email/web/src/lib/email/client.ts +1 -1
  18. package/dist/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  19. package/dist/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  20. package/dist/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  21. package/dist/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  22. package/dist/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  23. package/dist/templates/shared/loading/web/components/skeleton.tsx +4 -4
  24. package/dist/templates/shared/mock/web/.env.local +55 -0
  25. package/dist/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  26. package/dist/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  27. package/dist/templates/shared/mock/web/src/lib/mock.ts +147 -0
  28. package/dist/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  29. package/dist/templates/shared/redis/web/src/lib/redis.ts +1 -1
  30. package/dist/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  31. package/dist/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  32. package/dist/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  33. package/dist/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  34. package/dist/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  35. package/dist/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  36. package/dist/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  37. package/dist/templates/web/base/template/eslint.config.mjs +14 -0
  38. package/dist/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  39. package/dist/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  40. package/dist/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  41. package/dist/templates/web/base/template/src/app/layout.tsx +40 -38
  42. package/dist/templates/web/base/template/src/app/login/page.tsx +116 -66
  43. package/dist/templates/web/base/template/src/app/page.tsx +97 -193
  44. package/dist/templates/web/base/template/src/app/settings/page.tsx +154 -0
  45. package/dist/templates/web/base/template/src/app/signup/page.tsx +117 -66
  46. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  47. package/dist/templates/web/base/template/src/components/shared/header.tsx +229 -63
  48. package/dist/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  49. package/dist/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  50. package/dist/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  51. package/dist/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  52. package/dist/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  53. package/dist/templates/web/iot-dashboard/template/src/app/login/page.tsx +112 -0
  54. package/dist/templates/web/iot-dashboard/template/src/app/settings/page.tsx +186 -0
  55. package/dist/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  56. package/dist/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  57. package/dist/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  58. package/dist/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  59. package/dist/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  60. package/dist/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  61. package/dist/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  62. package/dist/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  63. package/dist/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  64. package/dist/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  65. package/dist/templates/web/micro-saas/template/src/app/login/page.tsx +14 -3
  66. package/dist/templates/web/micro-saas/template/src/app/signup/page.tsx +15 -4
  67. package/dist/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  68. package/dist/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  69. package/dist/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  70. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  71. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  72. package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  73. package/dist/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  74. package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  75. package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  76. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  77. package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  78. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  79. package/dist/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  80. package/dist/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  81. package/dist/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  82. package/dist/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  83. package/dist/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  84. package/dist/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  85. package/dist/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  86. package/dist/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  87. package/dist/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  88. package/dist/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  89. package/dist/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  90. package/dist/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  91. package/dist/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  92. package/dist/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  93. package/dist/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  94. package/dist/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  95. package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  96. package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  97. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  98. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  99. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  100. package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  101. package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  102. package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  103. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  104. package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  105. package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  106. package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  107. package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  108. package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  109. package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  110. package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  111. package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  112. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  113. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  114. package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  115. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  116. package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  117. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  118. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  119. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  120. package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  121. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  122. package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  123. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  124. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  125. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  126. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  127. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  128. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  129. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  130. package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  131. package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  132. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  133. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  134. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  135. package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  136. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  137. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  138. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  139. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  140. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  141. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  142. package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  143. package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  144. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  145. package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  146. package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  147. package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  148. package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  149. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  150. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  151. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  152. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  153. package/dist/templates/web/ui-only/template/eslint.config.mjs +14 -0
  154. package/dist/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  155. package/dist/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  156. package/dist/templates/web/ui-only/template/src/app/page.tsx +69 -91
  157. package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  158. package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  159. package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  160. package/dist/templates/web/ui-package-test/template/package.json +19 -23
  161. package/dist/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  162. package/dist/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  163. package/dist/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  164. package/dist/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  165. package/package.json +1 -1
  166. package/src/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  167. package/src/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  168. package/src/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  169. package/src/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  170. package/src/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  171. package/src/templates/shared/email/web/src/lib/email/client.ts +1 -1
  172. package/src/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  173. package/src/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  174. package/src/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  175. package/src/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  176. package/src/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  177. package/src/templates/shared/loading/web/components/skeleton.tsx +4 -4
  178. package/src/templates/shared/mock/web/.env.local +55 -0
  179. package/src/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  180. package/src/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  181. package/src/templates/shared/mock/web/src/lib/mock.ts +147 -0
  182. package/src/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  183. package/src/templates/shared/redis/web/src/lib/redis.ts +1 -1
  184. package/src/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  185. package/src/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  186. package/src/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  187. package/src/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  188. package/src/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  189. package/src/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  190. package/src/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  191. package/src/templates/web/base/template/eslint.config.mjs +14 -0
  192. package/src/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  193. package/src/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  194. package/src/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  195. package/src/templates/web/base/template/src/app/layout.tsx +40 -38
  196. package/src/templates/web/base/template/src/app/login/page.tsx +116 -66
  197. package/src/templates/web/base/template/src/app/page.tsx +97 -193
  198. package/src/templates/web/base/template/src/app/settings/page.tsx +154 -0
  199. package/src/templates/web/base/template/src/app/signup/page.tsx +117 -66
  200. package/src/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  201. package/src/templates/web/base/template/src/components/shared/header.tsx +229 -63
  202. package/src/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  203. package/src/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  204. package/src/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  205. package/src/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  206. package/src/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  207. package/src/templates/web/iot-dashboard/template/src/app/login/page.tsx +112 -0
  208. package/src/templates/web/iot-dashboard/template/src/app/settings/page.tsx +186 -0
  209. package/src/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  210. package/src/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  211. package/src/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  212. package/src/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  213. package/src/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  214. package/src/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  215. package/src/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  216. package/src/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  217. package/src/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  218. package/src/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  219. package/src/templates/web/micro-saas/template/src/app/login/page.tsx +14 -3
  220. package/src/templates/web/micro-saas/template/src/app/signup/page.tsx +15 -4
  221. package/src/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  222. package/src/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  223. package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  224. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  225. package/src/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  226. package/src/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  227. package/src/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  228. package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  229. package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  230. package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  231. package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  232. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  233. package/src/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  234. package/src/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  235. package/src/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  236. package/src/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  237. package/src/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  238. package/src/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  239. package/src/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  240. package/src/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  241. package/src/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  242. package/src/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  243. package/src/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  244. package/src/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  245. package/src/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  246. package/src/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  247. package/src/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  248. package/src/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  249. package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  250. package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  251. package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  252. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  253. package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  254. package/src/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  255. package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  256. package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  257. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  258. package/src/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  259. package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  260. package/src/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  261. package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  262. package/src/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  263. package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  264. package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  265. package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  266. package/src/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  267. package/src/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  268. package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  269. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  270. package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  271. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  272. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  273. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  274. package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  275. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  276. package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  277. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  278. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  279. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  280. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  281. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  282. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  283. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  284. package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  285. package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  286. package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  287. package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  288. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  289. package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  290. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  291. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  292. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  293. package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  294. package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  295. package/src/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  296. package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  297. package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  298. package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  299. package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  300. package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  301. package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  302. package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  303. package/src/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  304. package/src/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  305. package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  306. package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  307. package/src/templates/web/ui-only/template/eslint.config.mjs +14 -0
  308. package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  309. package/src/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  310. package/src/templates/web/ui-only/template/src/app/page.tsx +69 -91
  311. package/src/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  312. package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  313. package/src/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  314. package/src/templates/web/ui-package-test/template/package.json +19 -23
  315. package/src/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  316. package/src/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  317. package/src/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  318. package/src/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  319. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  320. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  321. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  322. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  323. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  324. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  325. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  326. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  327. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  328. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  329. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  330. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  331. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  332. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  333. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  334. package/dist/templates/web/base/template/.eslintrc.js +0 -8
  335. package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  336. package/dist/templates/web/base/template/src/test/setup.ts +0 -74
  337. package/dist/templates/web/base/template/vitest.config.ts +0 -17
  338. package/dist/templates/web/ui-auth/template/.eslintrc.js +0 -8
  339. package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  340. package/dist/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  341. package/dist/templates/web/ui-auth/template/vitest.config.ts +0 -17
  342. package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  343. package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  344. package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  345. package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  346. package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  347. package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  348. package/dist/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  349. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  350. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  351. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  352. package/dist/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  353. package/dist/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  354. package/dist/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  355. package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  356. package/dist/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  357. package/dist/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  358. package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  359. package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  360. package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  361. package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  362. package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  363. package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  364. package/dist/templates/web/ui-only/template/.eslintrc.js +0 -8
  365. package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  366. package/dist/templates/web/ui-only/template/src/test/setup.ts +0 -74
  367. package/dist/templates/web/ui-only/template/vitest.config.ts +0 -17
  368. package/src/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  369. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  370. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  371. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  372. package/src/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  373. package/src/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  374. package/src/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  375. package/src/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  376. package/src/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  377. package/src/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  378. package/src/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  379. package/src/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  380. package/src/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  381. package/src/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  382. package/src/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  383. package/src/templates/web/base/template/.eslintrc.js +0 -8
  384. package/src/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  385. package/src/templates/web/base/template/src/test/setup.ts +0 -74
  386. package/src/templates/web/base/template/vitest.config.ts +0 -17
  387. package/src/templates/web/ui-auth/template/.eslintrc.js +0 -8
  388. package/src/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  389. package/src/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  390. package/src/templates/web/ui-auth/template/vitest.config.ts +0 -17
  391. package/src/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  392. package/src/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  393. package/src/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  394. package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  395. package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  396. package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  397. package/src/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  398. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  399. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  400. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  401. package/src/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  402. package/src/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  403. package/src/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  404. package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  405. package/src/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  406. package/src/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  407. package/src/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  408. package/src/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  409. package/src/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  410. package/src/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  411. package/src/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  412. package/src/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  413. package/src/templates/web/ui-only/template/.eslintrc.js +0 -8
  414. package/src/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  415. package/src/templates/web/ui-only/template/src/test/setup.ts +0 -74
  416. package/src/templates/web/ui-only/template/vitest.config.ts +0 -17
@@ -0,0 +1,186 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
+ import { Bot, MessageSquare, Code, Eye, Sparkles, Zap } from 'lucide-react'
6
+ import Link from 'next/link'
7
+
8
+ interface Model {
9
+ id: string
10
+ name: string
11
+ provider: 'OpenAI' | 'Anthropic' | 'Google'
12
+ description: string
13
+ capabilities: { label: string; icon: React.ComponentType<{ className?: string }> }[]
14
+ pricing: string
15
+ badge: string
16
+ }
17
+
18
+ const MODELS: Model[] = [
19
+ {
20
+ id: 'gpt-4o',
21
+ name: 'GPT-4o',
22
+ provider: 'OpenAI',
23
+ description: 'Most capable OpenAI model with vision and advanced reasoning.',
24
+ capabilities: [
25
+ { label: 'Chat', icon: MessageSquare },
26
+ { label: 'Code', icon: Code },
27
+ { label: 'Vision', icon: Eye },
28
+ ],
29
+ pricing: '~2.5M tokens/$1',
30
+ badge: 'bg-green-500/20 text-green-400',
31
+ },
32
+ {
33
+ id: 'gpt-4o-mini',
34
+ name: 'GPT-4o Mini',
35
+ provider: 'OpenAI',
36
+ description: 'Fast and affordable for everyday tasks and simple queries.',
37
+ capabilities: [
38
+ { label: 'Chat', icon: MessageSquare },
39
+ { label: 'Code', icon: Code },
40
+ ],
41
+ pricing: '~16.6M tokens/$1',
42
+ badge: 'bg-green-500/20 text-green-400',
43
+ },
44
+ {
45
+ id: 'claude-3-5-sonnet',
46
+ name: 'Claude 3.5 Sonnet',
47
+ provider: 'Anthropic',
48
+ description: 'Excellent at analysis, writing, and complex reasoning tasks.',
49
+ capabilities: [
50
+ { label: 'Chat', icon: MessageSquare },
51
+ { label: 'Code', icon: Code },
52
+ { label: 'Vision', icon: Eye },
53
+ { label: 'Analysis', icon: Sparkles },
54
+ ],
55
+ pricing: '~3.3M tokens/$1',
56
+ badge: 'bg-orange-500/20 text-orange-400',
57
+ },
58
+ {
59
+ id: 'claude-3-haiku',
60
+ name: 'Claude 3 Haiku',
61
+ provider: 'Anthropic',
62
+ description: 'Fastest Anthropic model, great for quick responses and automation.',
63
+ capabilities: [
64
+ { label: 'Chat', icon: MessageSquare },
65
+ { label: 'Code', icon: Code },
66
+ ],
67
+ pricing: '~20M tokens/$1',
68
+ badge: 'bg-orange-500/20 text-orange-400',
69
+ },
70
+ {
71
+ id: 'gemini-1-5-pro',
72
+ name: 'Gemini 1.5 Pro',
73
+ provider: 'Google',
74
+ description: 'Long context window with multimodal support from Google.',
75
+ capabilities: [
76
+ { label: 'Chat', icon: MessageSquare },
77
+ { label: 'Code', icon: Code },
78
+ { label: 'Vision', icon: Eye },
79
+ { label: 'Analysis', icon: Sparkles },
80
+ ],
81
+ pricing: '~4M tokens/$1',
82
+ badge: 'bg-blue-500/20 text-blue-400',
83
+ },
84
+ {
85
+ id: 'gemini-flash',
86
+ name: 'Gemini Flash',
87
+ provider: 'Google',
88
+ description: 'Ultra-fast responses with efficient token usage.',
89
+ capabilities: [
90
+ { label: 'Chat', icon: MessageSquare },
91
+ { label: 'Code', icon: Code },
92
+ ],
93
+ pricing: '~26.6M tokens/$1',
94
+ badge: 'bg-blue-500/20 text-blue-400',
95
+ },
96
+ ]
97
+
98
+ const PROVIDERS = ['All', 'OpenAI', 'Anthropic', 'Google'] as const
99
+
100
+ export default function ModelsPage() {
101
+ const [filter, setFilter] = useState<string>('All')
102
+
103
+ const filteredModels = filter === 'All'
104
+ ? MODELS
105
+ : MODELS.filter(m => m.provider === filter)
106
+
107
+ return (
108
+ <div className="min-h-screen bg-background">
109
+ <div className="max-w-7xl mx-auto px-4 py-8">
110
+ {/* Header */}
111
+ <div className="mb-8">
112
+ <h1 className="text-3xl font-bold text-foreground">AI Models</h1>
113
+ <p className="text-muted-foreground mt-1">
114
+ Browse available models and find the right one for your use case.
115
+ </p>
116
+ </div>
117
+
118
+ {/* Filter */}
119
+ <div className="flex flex-wrap gap-2 mb-8">
120
+ {PROVIDERS.map((provider) => (
121
+ <Button
122
+ key={provider}
123
+ variant={filter === provider ? 'default' : 'outline'}
124
+ size="sm"
125
+ onClick={() => setFilter(provider)}
126
+ >
127
+ {provider}
128
+ </Button>
129
+ ))}
130
+ </div>
131
+
132
+ {/* Models Grid */}
133
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
134
+ {filteredModels.map((model) => (
135
+ <Card key={model.id} className="p-6 bg-secondary border-border flex flex-col">
136
+ <div className="flex items-start justify-between mb-3">
137
+ <div className="flex items-center gap-3">
138
+ <div className="w-10 h-10 bg-primary/20 rounded-lg flex items-center justify-center">
139
+ <Bot className="w-5 h-5 text-primary" />
140
+ </div>
141
+ <div>
142
+ <h3 className="text-lg font-semibold text-foreground">{model.name}</h3>
143
+ <span className={`text-xs font-medium px-2 py-0.5 rounded-full ${model.badge}`}>
144
+ {model.provider}
145
+ </span>
146
+ </div>
147
+ </div>
148
+ </div>
149
+
150
+ <p className="text-sm text-muted-foreground mb-4 flex-1">
151
+ {model.description}
152
+ </p>
153
+
154
+ {/* Capabilities */}
155
+ <div className="flex flex-wrap gap-2 mb-4">
156
+ {model.capabilities.map((cap) => (
157
+ <span
158
+ key={cap.label}
159
+ className="inline-flex items-center gap-1 text-xs px-2 py-1 bg-muted rounded-md text-muted-foreground"
160
+ >
161
+ <cap.icon className="w-3 h-3" />
162
+ {cap.label}
163
+ </span>
164
+ ))}
165
+ </div>
166
+
167
+ {/* Pricing */}
168
+ <div className="flex items-center gap-1 text-sm text-muted-foreground mb-4">
169
+ <Zap className="w-4 h-4 text-primary" />
170
+ <span>{model.pricing}</span>
171
+ </div>
172
+
173
+ {/* Action */}
174
+ <Link href={`/chat?model=${model.id}`}>
175
+ <Button className="w-full">
176
+ <MessageSquare className="w-4 h-4 mr-2" />
177
+ Try in Chat
178
+ </Button>
179
+ </Link>
180
+ </Card>
181
+ ))}
182
+ </div>
183
+ </div>
184
+ </div>
185
+ )
186
+ }
@@ -0,0 +1,251 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
+ import { Play, Loader2, Clock, Hash, Bot } from 'lucide-react'
6
+ import { useAuth } from '@digilogiclabs/app-sdk'
7
+ import Link from 'next/link'
8
+
9
+ const MODELS = [
10
+ { id: 'gpt-4o', name: 'GPT-4o' },
11
+ { id: 'gpt-4o-mini', name: 'GPT-4o Mini' },
12
+ { id: 'claude-3-5-sonnet', name: 'Claude 3.5 Sonnet' },
13
+ { id: 'claude-3-haiku', name: 'Claude 3 Haiku' },
14
+ { id: 'gemini-1-5-pro', name: 'Gemini 1.5 Pro' },
15
+ { id: 'gemini-flash', name: 'Gemini Flash' },
16
+ ]
17
+
18
+ const DEMO_RESPONSES: Record<string, string> = {
19
+ 'gpt-4o': 'This is a simulated response from GPT-4o. In production, this would connect to the OpenAI API and return a real completion based on your prompt and parameters.',
20
+ 'gpt-4o-mini': 'This is a simulated response from GPT-4o Mini. This model is optimized for speed and cost-efficiency while maintaining good quality output.',
21
+ 'claude-3-5-sonnet': 'This is a simulated response from Claude 3.5 Sonnet. Known for nuanced analysis and careful reasoning, this model excels at complex tasks.',
22
+ 'claude-3-haiku': 'This is a simulated response from Claude 3 Haiku. Designed for fast, concise responses ideal for automation and quick queries.',
23
+ 'gemini-1-5-pro': 'This is a simulated response from Gemini 1.5 Pro. With its large context window, this model handles long documents and complex multi-turn conversations well.',
24
+ 'gemini-flash': 'This is a simulated response from Gemini Flash. Optimized for ultra-fast inference, this model provides quick responses at minimal cost.',
25
+ }
26
+
27
+ export default function PlaygroundPage() {
28
+ const { user, loading: authLoading } = useAuth()
29
+ const [model, setModel] = useState(MODELS[0].id)
30
+ const [systemPrompt, setSystemPrompt] = useState('You are a helpful AI assistant.')
31
+ const [userMessage, setUserMessage] = useState('')
32
+ const [temperature, setTemperature] = useState(0.7)
33
+ const [maxTokens, setMaxTokens] = useState(1024)
34
+ const [response, setResponse] = useState('')
35
+ const [isRunning, setIsRunning] = useState(false)
36
+ const [tokenCount, setTokenCount] = useState<number | null>(null)
37
+ const [responseTime, setResponseTime] = useState<number | null>(null)
38
+
39
+ const handleRun = async () => {
40
+ if (!userMessage.trim() || isRunning) return
41
+
42
+ setIsRunning(true)
43
+ setResponse('')
44
+ setTokenCount(null)
45
+ setResponseTime(null)
46
+
47
+ const start = Date.now()
48
+
49
+ await new Promise(resolve => setTimeout(resolve, 500 + Math.random() * 500))
50
+
51
+ const demoResponse = DEMO_RESPONSES[model] || 'Response from the selected model.'
52
+ const fullResponse = `${demoResponse}\n\nParameters used:\n- Model: ${model}\n- Temperature: ${temperature}\n- Max Tokens: ${maxTokens}\n- System Prompt: "${systemPrompt}"\n- User Message: "${userMessage}"`
53
+
54
+ setResponse(fullResponse)
55
+ setTokenCount(Math.floor(fullResponse.split(/\s+/).length * 1.3))
56
+ setResponseTime(Date.now() - start)
57
+ setIsRunning(false)
58
+ }
59
+
60
+ if (authLoading) {
61
+ return (
62
+ <div className="min-h-screen bg-background flex items-center justify-center">
63
+ <Loader2 className="w-8 h-8 text-primary animate-spin" />
64
+ </div>
65
+ )
66
+ }
67
+
68
+ if (!user) {
69
+ return (
70
+ <div className="min-h-screen bg-background flex items-center justify-center">
71
+ <Card className="p-8 bg-secondary border-border text-center max-w-md">
72
+ <Bot className="w-16 h-16 text-primary mx-auto mb-4" />
73
+ <h2 className="text-2xl font-bold text-foreground mb-2">Sign in to use Playground</h2>
74
+ <p className="text-muted-foreground mb-6">
75
+ Create an account to test AI models in the playground.
76
+ </p>
77
+ <div className="flex gap-2 justify-center">
78
+ <Link href="/login">
79
+ <Button variant="outline">Sign In</Button>
80
+ </Link>
81
+ <Link href="/signup">
82
+ <Button>Sign Up</Button>
83
+ </Link>
84
+ </div>
85
+ </Card>
86
+ </div>
87
+ )
88
+ }
89
+
90
+ return (
91
+ <div className="min-h-screen bg-background">
92
+ <div className="max-w-7xl mx-auto px-4 py-8">
93
+ {/* Header */}
94
+ <div className="mb-8">
95
+ <h1 className="text-3xl font-bold text-foreground">API Playground</h1>
96
+ <p className="text-muted-foreground mt-1">
97
+ Test different models and parameters before integrating into your app.
98
+ </p>
99
+ </div>
100
+
101
+ {/* Split Layout */}
102
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
103
+ {/* Left Panel - Request */}
104
+ <Card className="p-6 bg-secondary border-border">
105
+ <h2 className="text-lg font-semibold text-foreground mb-4">Request</h2>
106
+
107
+ {/* Model Selection */}
108
+ <div className="mb-4">
109
+ <label className="block text-sm font-medium text-muted-foreground mb-1.5">
110
+ Model
111
+ </label>
112
+ <select
113
+ value={model}
114
+ onChange={(e) => setModel(e.target.value)}
115
+ className="w-full bg-muted border border-border rounded-lg px-3 py-2 text-foreground text-sm focus:ring-2 focus:ring-ring"
116
+ >
117
+ {MODELS.map((m) => (
118
+ <option key={m.id} value={m.id} className="bg-card">
119
+ {m.name}
120
+ </option>
121
+ ))}
122
+ </select>
123
+ </div>
124
+
125
+ {/* System Prompt */}
126
+ <div className="mb-4">
127
+ <label className="block text-sm font-medium text-muted-foreground mb-1.5">
128
+ System Prompt
129
+ </label>
130
+ <textarea
131
+ value={systemPrompt}
132
+ onChange={(e) => setSystemPrompt(e.target.value)}
133
+ rows={3}
134
+ className="w-full bg-muted border border-border rounded-lg px-3 py-2 text-foreground text-sm placeholder-muted-foreground focus:ring-2 focus:ring-ring resize-none"
135
+ placeholder="You are a helpful assistant..."
136
+ />
137
+ </div>
138
+
139
+ {/* User Message */}
140
+ <div className="mb-4">
141
+ <label className="block text-sm font-medium text-muted-foreground mb-1.5">
142
+ User Message
143
+ </label>
144
+ <textarea
145
+ value={userMessage}
146
+ onChange={(e) => setUserMessage(e.target.value)}
147
+ rows={4}
148
+ className="w-full bg-muted border border-border rounded-lg px-3 py-2 text-foreground text-sm placeholder-muted-foreground focus:ring-2 focus:ring-ring resize-none"
149
+ placeholder="Enter your message..."
150
+ />
151
+ </div>
152
+
153
+ {/* Temperature */}
154
+ <div className="mb-4">
155
+ <div className="flex items-center justify-between mb-1.5">
156
+ <label className="text-sm font-medium text-muted-foreground">Temperature</label>
157
+ <span className="text-sm text-foreground font-mono">{temperature.toFixed(1)}</span>
158
+ </div>
159
+ <input
160
+ type="range"
161
+ min="0"
162
+ max="1"
163
+ step="0.1"
164
+ value={temperature}
165
+ onChange={(e) => setTemperature(parseFloat(e.target.value))}
166
+ className="w-full accent-primary"
167
+ />
168
+ <div className="flex justify-between text-xs text-muted-foreground mt-1">
169
+ <span>Precise</span>
170
+ <span>Creative</span>
171
+ </div>
172
+ </div>
173
+
174
+ {/* Max Tokens */}
175
+ <div className="mb-6">
176
+ <label className="block text-sm font-medium text-muted-foreground mb-1.5">
177
+ Max Tokens
178
+ </label>
179
+ <input
180
+ type="number"
181
+ value={maxTokens}
182
+ onChange={(e) => setMaxTokens(parseInt(e.target.value) || 0)}
183
+ min={1}
184
+ max={4096}
185
+ className="w-full bg-muted border border-border rounded-lg px-3 py-2 text-foreground text-sm focus:ring-2 focus:ring-ring"
186
+ />
187
+ </div>
188
+
189
+ {/* Run Button */}
190
+ <Button
191
+ className="w-full"
192
+ onClick={handleRun}
193
+ disabled={!userMessage.trim() || isRunning}
194
+ >
195
+ {isRunning ? (
196
+ <>
197
+ <Loader2 className="w-4 h-4 mr-2 animate-spin" />
198
+ Running...
199
+ </>
200
+ ) : (
201
+ <>
202
+ <Play className="w-4 h-4 mr-2" />
203
+ Run
204
+ </>
205
+ )}
206
+ </Button>
207
+ </Card>
208
+
209
+ {/* Right Panel - Response */}
210
+ <Card className="p-6 bg-secondary border-border flex flex-col">
211
+ <h2 className="text-lg font-semibold text-foreground mb-4">Response</h2>
212
+
213
+ {/* Response Area */}
214
+ <div className="bg-muted rounded-lg p-4 flex-1 min-h-[300px] font-mono text-sm text-foreground whitespace-pre-wrap overflow-auto">
215
+ {isRunning ? (
216
+ <div className="flex items-center gap-2 text-muted-foreground">
217
+ <Loader2 className="w-4 h-4 animate-spin" />
218
+ Generating response...
219
+ </div>
220
+ ) : response ? (
221
+ response
222
+ ) : (
223
+ <span className="text-muted-foreground">
224
+ Response will appear here after you click Run.
225
+ </span>
226
+ )}
227
+ </div>
228
+
229
+ {/* Metadata */}
230
+ {(tokenCount !== null || responseTime !== null) && (
231
+ <div className="flex gap-4 mt-4 pt-4 border-t border-border">
232
+ {tokenCount !== null && (
233
+ <div className="flex items-center gap-1.5 text-sm text-muted-foreground">
234
+ <Hash className="w-4 h-4" />
235
+ <span>{tokenCount} tokens</span>
236
+ </div>
237
+ )}
238
+ {responseTime !== null && (
239
+ <div className="flex items-center gap-1.5 text-sm text-muted-foreground">
240
+ <Clock className="w-4 h-4" />
241
+ <span>{responseTime}ms</span>
242
+ </div>
243
+ )}
244
+ </div>
245
+ )}
246
+ </Card>
247
+ </div>
248
+ </div>
249
+ </div>
250
+ )
251
+ }
@@ -0,0 +1,190 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
+ import { User, Key, CreditCard, Copy, Eye, EyeOff, Trash2, Plus, Zap } from 'lucide-react'
6
+
7
+ const MOCK_KEYS = [
8
+ { id: '1', name: 'Production', key: 'sk-proj-abc...xyz', created: '2026-01-15', lastUsed: '2 hours ago' },
9
+ { id: '2', name: 'Development', key: 'sk-proj-def...uvw', created: '2026-02-20', lastUsed: '3 days ago' },
10
+ ]
11
+
12
+ export default function SettingsPage() {
13
+ const [activeTab, setActiveTab] = useState<'profile' | 'keys' | 'billing'>('profile')
14
+ const [name, setName] = useState('Test User')
15
+ const [revealedKeys, setRevealedKeys] = useState<Set<string>>(new Set())
16
+
17
+ const toggleReveal = (id: string) => {
18
+ setRevealedKeys(prev => {
19
+ const next = new Set(prev)
20
+ if (next.has(id)) next.delete(id)
21
+ else next.add(id)
22
+ return next
23
+ })
24
+ }
25
+
26
+ const tabs = [
27
+ { id: 'profile' as const, label: 'Profile', icon: User },
28
+ { id: 'keys' as const, label: 'API Keys', icon: Key },
29
+ { id: 'billing' as const, label: 'Billing', icon: CreditCard },
30
+ ]
31
+
32
+ return (
33
+ <div className="min-h-screen bg-background">
34
+ <div className="max-w-4xl mx-auto px-4 sm:px-6 py-8">
35
+ <h1 className="text-3xl font-bold text-foreground mb-8">Settings</h1>
36
+
37
+ {/* Tabs */}
38
+ <div className="flex gap-1 mb-8 border-b border-border" role="tablist">
39
+ {tabs.map(({ id, label, icon: Icon }) => (
40
+ <button
41
+ key={id}
42
+ role="tab"
43
+ aria-selected={activeTab === id}
44
+ onClick={() => setActiveTab(id)}
45
+ className={`flex items-center gap-2 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors -mb-px ${
46
+ activeTab === id
47
+ ? 'border-primary text-foreground'
48
+ : 'border-transparent text-muted-foreground hover:text-foreground'
49
+ }`}
50
+ >
51
+ <Icon className="w-4 h-4" />
52
+ {label}
53
+ </button>
54
+ ))}
55
+ </div>
56
+
57
+ {/* Profile Tab */}
58
+ {activeTab === 'profile' && (
59
+ <Card className="p-6 bg-secondary border-border">
60
+ <h2 className="text-lg font-semibold text-foreground mb-6">Profile Information</h2>
61
+ <div className="space-y-4 max-w-md">
62
+ <div>
63
+ <label htmlFor="name" className="block text-sm font-medium mb-1.5">Name</label>
64
+ <input
65
+ id="name"
66
+ type="text"
67
+ value={name}
68
+ onChange={(e) => setName(e.target.value)}
69
+ className="w-full px-3 py-2.5 rounded-lg border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent"
70
+ />
71
+ </div>
72
+ <div>
73
+ <label htmlFor="email" className="block text-sm font-medium mb-1.5">Email</label>
74
+ <input
75
+ id="email"
76
+ type="email"
77
+ value="user@example.com"
78
+ readOnly
79
+ className="w-full px-3 py-2.5 rounded-lg border border-input bg-muted text-muted-foreground cursor-not-allowed"
80
+ />
81
+ <p className="text-xs text-muted-foreground mt-1">Contact support to change your email.</p>
82
+ </div>
83
+ <Button className="mt-4">Save Changes</Button>
84
+ </div>
85
+ </Card>
86
+ )}
87
+
88
+ {/* API Keys Tab */}
89
+ {activeTab === 'keys' && (
90
+ <div className="space-y-6">
91
+ <div className="flex items-center justify-between">
92
+ <p className="text-sm text-muted-foreground">
93
+ API keys allow programmatic access to the platform. Keep them secret.
94
+ </p>
95
+ <Button size="sm">
96
+ <Plus className="w-4 h-4 mr-1" />
97
+ Create Key
98
+ </Button>
99
+ </div>
100
+
101
+ <div className="space-y-3">
102
+ {MOCK_KEYS.map((apiKey) => (
103
+ <Card key={apiKey.id} className="p-4 bg-secondary border-border">
104
+ <div className="flex items-center justify-between">
105
+ <div className="flex-1">
106
+ <div className="flex items-center gap-3 mb-1">
107
+ <span className="font-medium text-foreground">{apiKey.name}</span>
108
+ <span className="text-xs text-muted-foreground">Created {apiKey.created}</span>
109
+ </div>
110
+ <div className="flex items-center gap-2">
111
+ <code className="text-sm bg-muted px-2 py-0.5 rounded font-mono text-muted-foreground">
112
+ {revealedKeys.has(apiKey.id) ? 'sk-proj-abcdef1234567890xyz' : apiKey.key}
113
+ </code>
114
+ <button
115
+ onClick={() => toggleReveal(apiKey.id)}
116
+ className="text-muted-foreground hover:text-foreground"
117
+ aria-label={revealedKeys.has(apiKey.id) ? 'Hide key' : 'Show key'}
118
+ >
119
+ {revealedKeys.has(apiKey.id) ? <EyeOff className="w-4 h-4" /> : <Eye className="w-4 h-4" />}
120
+ </button>
121
+ <button className="text-muted-foreground hover:text-foreground" aria-label="Copy key">
122
+ <Copy className="w-4 h-4" />
123
+ </button>
124
+ </div>
125
+ <p className="text-xs text-muted-foreground mt-1">Last used {apiKey.lastUsed}</p>
126
+ </div>
127
+ <Button variant="ghost" size="sm" className="text-destructive hover:text-destructive/80" aria-label="Delete key">
128
+ <Trash2 className="w-4 h-4" />
129
+ </Button>
130
+ </div>
131
+ </Card>
132
+ ))}
133
+ </div>
134
+ </div>
135
+ )}
136
+
137
+ {/* Billing Tab */}
138
+ {activeTab === 'billing' && (
139
+ <div className="space-y-6">
140
+ <Card className="p-6 bg-secondary border-border">
141
+ <div className="flex items-center justify-between mb-4">
142
+ <div>
143
+ <h2 className="text-lg font-semibold text-foreground">Free Tier</h2>
144
+ <p className="text-sm text-muted-foreground">Your current plan</p>
145
+ </div>
146
+ <span className="text-xs px-2.5 py-1 rounded-full bg-primary/10 text-primary font-medium">Active</span>
147
+ </div>
148
+
149
+ <div className="mb-4">
150
+ <div className="flex items-center justify-between text-sm mb-1">
151
+ <span className="text-muted-foreground">Token usage this month</span>
152
+ <span className="text-foreground font-medium">45,678 / 100,000</span>
153
+ </div>
154
+ <div className="w-full h-2 rounded-full bg-muted overflow-hidden">
155
+ <div className="h-full rounded-full bg-primary" style={{ width: '46%' }} />
156
+ </div>
157
+ </div>
158
+
159
+ <div className="grid grid-cols-3 gap-4 pt-4 border-t border-border">
160
+ <div>
161
+ <p className="text-xs text-muted-foreground">API Calls</p>
162
+ <p className="text-lg font-bold text-foreground">1,234</p>
163
+ </div>
164
+ <div>
165
+ <p className="text-xs text-muted-foreground">Models Used</p>
166
+ <p className="text-lg font-bold text-foreground">3</p>
167
+ </div>
168
+ <div>
169
+ <p className="text-xs text-muted-foreground">Avg Response</p>
170
+ <p className="text-lg font-bold text-foreground">1.2s</p>
171
+ </div>
172
+ </div>
173
+ </Card>
174
+
175
+ <Card className="p-6 bg-gradient-to-r from-brand-from/10 via-brand-via/10 to-brand-to/10 border-primary/20">
176
+ <div className="flex items-center gap-3 mb-3">
177
+ <Zap className="w-5 h-5 text-primary" />
178
+ <h3 className="font-semibold text-foreground">Upgrade to Pro</h3>
179
+ </div>
180
+ <p className="text-sm text-muted-foreground mb-4">
181
+ Get 1M tokens/month, all models, priority support, and custom fine-tuning.
182
+ </p>
183
+ <Button>Upgrade — $29/month</Button>
184
+ </Card>
185
+ </div>
186
+ )}
187
+ </div>
188
+ </div>
189
+ )
190
+ }