@digilogiclabs/create-saas-app 2.9.1 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +153 -113
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/commands/create.d.ts.map +1 -1
  4. package/dist/cli/commands/create.js +2 -6
  5. package/dist/cli/commands/create.js.map +1 -1
  6. package/dist/generators/template-generator.d.ts.map +1 -1
  7. package/dist/generators/template-generator.js +6 -3
  8. package/dist/generators/template-generator.js.map +1 -1
  9. package/dist/templates/shared/auth/supabase/web/src/middleware.ts +63 -0
  10. package/dist/templates/shared/database/supabase/web/src/lib/supabase/server.ts +3 -1
  11. package/dist/templates/shared/design/web/src/config/design.config.ts +14 -14
  12. package/dist/templates/shared/landing/web/src/components/LandingPage.tsx +0 -3
  13. package/dist/templates/shared/security/web/src/lib/api-security.ts +2 -2
  14. package/dist/templates/web/ai-platform/template/next.config.js +14 -14
  15. package/dist/templates/web/ai-platform/template/package.json +11 -22
  16. package/dist/templates/web/ai-platform/template/postcss.config.mjs +8 -0
  17. package/dist/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  18. package/dist/templates/web/ai-platform/template/src/app/chat/page.tsx +234 -235
  19. package/dist/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -142
  20. package/dist/templates/web/ai-platform/template/src/app/error.tsx +13 -13
  21. package/dist/templates/web/ai-platform/template/src/app/globals.css +97 -34
  22. package/dist/templates/web/ai-platform/template/src/app/layout.tsx +3 -0
  23. package/dist/templates/web/ai-platform/template/src/app/loading.tsx +22 -22
  24. package/dist/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  25. package/dist/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  26. package/dist/templates/web/ai-platform/template/src/app/page.tsx +248 -154
  27. package/dist/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  28. package/dist/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  29. package/dist/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  30. package/dist/templates/web/ai-platform/template/src/lib/auth-server.ts +32 -33
  31. package/dist/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  32. package/dist/templates/web/base/template/next.config.js +14 -15
  33. package/dist/templates/web/base/template/package.json +16 -31
  34. package/dist/templates/web/base/template/postcss.config.mjs +8 -0
  35. package/dist/templates/web/base/template/src/app/error.tsx +97 -97
  36. package/dist/templates/web/base/template/src/app/globals.css +87 -148
  37. package/dist/templates/web/base/template/src/app/layout.tsx +4 -1
  38. package/dist/templates/web/base/template/src/app/loading.tsx +52 -52
  39. package/dist/templates/web/base/template/tsconfig.json +27 -33
  40. package/dist/templates/web/iot-dashboard/template/next.config.js +14 -14
  41. package/dist/templates/web/iot-dashboard/template/package.json +12 -16
  42. package/dist/templates/web/iot-dashboard/template/postcss.config.mjs +8 -0
  43. package/dist/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  44. package/dist/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  45. package/dist/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +224 -224
  46. package/dist/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  47. package/dist/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  48. package/dist/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  49. package/dist/templates/web/iot-dashboard/template/src/app/error.tsx +8 -8
  50. package/dist/templates/web/iot-dashboard/template/src/app/globals.css +97 -20
  51. package/dist/templates/web/iot-dashboard/template/src/app/layout.tsx +3 -0
  52. package/dist/templates/web/iot-dashboard/template/src/app/loading.tsx +5 -5
  53. package/dist/templates/web/iot-dashboard/template/src/app/login/page.tsx +112 -0
  54. package/dist/templates/web/iot-dashboard/template/src/app/page.tsx +266 -189
  55. package/dist/templates/web/iot-dashboard/template/src/app/settings/page.tsx +186 -0
  56. package/dist/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  57. package/dist/templates/web/iot-dashboard/template/src/lib/auth-server.ts +32 -33
  58. package/dist/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  59. package/dist/templates/web/marketplace/template/next.config.js +14 -14
  60. package/dist/templates/web/marketplace/template/package.json +11 -18
  61. package/dist/templates/web/marketplace/template/postcss.config.mjs +8 -0
  62. package/dist/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  63. package/dist/templates/web/marketplace/template/src/app/cart/page.tsx +147 -147
  64. package/dist/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -149
  65. package/dist/templates/web/marketplace/template/src/app/error.tsx +7 -7
  66. package/dist/templates/web/marketplace/template/src/app/globals.css +97 -20
  67. package/dist/templates/web/marketplace/template/src/app/layout.tsx +3 -0
  68. package/dist/templates/web/marketplace/template/src/app/loading.tsx +5 -5
  69. package/dist/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  70. package/dist/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  71. package/dist/templates/web/marketplace/template/src/app/page.tsx +370 -169
  72. package/dist/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  73. package/dist/templates/web/marketplace/template/src/app/products/page.tsx +129 -129
  74. package/dist/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  75. package/dist/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  76. package/dist/templates/web/marketplace/template/src/lib/auth-server.ts +32 -33
  77. package/dist/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  78. package/dist/templates/web/micro-saas/template/next.config.js +14 -14
  79. package/dist/templates/web/micro-saas/template/package.json +9 -8
  80. package/dist/templates/web/micro-saas/template/postcss.config.mjs +8 -0
  81. package/dist/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  82. package/dist/templates/web/micro-saas/template/src/app/dashboard/page.tsx +145 -117
  83. package/dist/templates/web/micro-saas/template/src/app/error.tsx +7 -7
  84. package/dist/templates/web/micro-saas/template/src/app/globals.css +97 -20
  85. package/dist/templates/web/micro-saas/template/src/app/layout.tsx +3 -0
  86. package/dist/templates/web/micro-saas/template/src/app/loading.tsx +43 -27
  87. package/dist/templates/web/micro-saas/template/src/app/login/page.tsx +112 -87
  88. package/dist/templates/web/micro-saas/template/src/app/page.tsx +227 -137
  89. package/dist/templates/web/micro-saas/template/src/app/signup/page.tsx +133 -108
  90. package/dist/templates/web/micro-saas/template/src/lib/auth-server.ts +32 -33
  91. package/dist/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  92. package/dist/templates/web/ui-auth/template/next.config.js +14 -12
  93. package/dist/templates/web/ui-auth/template/package.json +16 -26
  94. package/dist/templates/web/ui-auth/template/postcss.config.mjs +8 -0
  95. package/dist/templates/web/ui-auth/template/src/app/error.tsx +67 -67
  96. package/dist/templates/web/ui-auth/template/src/app/globals.css +85 -84
  97. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +4 -1
  98. package/dist/templates/web/ui-auth/template/src/app/loading.tsx +20 -38
  99. package/dist/templates/web/ui-auth/template/tsconfig.json +27 -33
  100. package/dist/templates/web/ui-auth-ai/template/next.config.js +15 -13
  101. package/dist/templates/web/ui-auth-ai/template/package.json +25 -21
  102. package/dist/templates/web/ui-auth-ai/template/postcss.config.mjs +8 -0
  103. package/dist/templates/web/ui-auth-ai/template/src/app/error.tsx +7 -7
  104. package/dist/templates/web/ui-auth-ai/template/src/app/globals.css +87 -25
  105. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +3 -0
  106. package/dist/templates/web/ui-auth-ai/template/src/app/loading.tsx +4 -4
  107. package/dist/templates/web/ui-auth-ai/template/tsconfig.json +27 -28
  108. package/dist/templates/web/ui-auth-payments/template/next.config.js +14 -12
  109. package/dist/templates/web/ui-auth-payments/template/package.json +16 -29
  110. package/dist/templates/web/ui-auth-payments/template/postcss.config.mjs +8 -0
  111. package/dist/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -67
  112. package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +89 -204
  113. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +4 -1
  114. package/dist/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -20
  115. package/dist/templates/web/ui-auth-payments/template/tsconfig.json +27 -33
  116. package/dist/templates/web/ui-auth-payments-ai/template/next.config.js +14 -12
  117. package/dist/templates/web/ui-auth-payments-ai/template/package.json +17 -33
  118. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.mjs +8 -0
  119. package/dist/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -67
  120. package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +85 -85
  121. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +4 -1
  122. package/dist/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -20
  123. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.json +27 -33
  124. package/dist/templates/web/ui-auth-payments-audio/template/next.config.js +14 -12
  125. package/dist/templates/web/ui-auth-payments-audio/template/package.json +17 -30
  126. package/dist/templates/web/ui-auth-payments-audio/template/postcss.config.mjs +8 -0
  127. package/dist/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -67
  128. package/dist/templates/web/ui-auth-payments-audio/template/src/app/globals.css +85 -85
  129. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +4 -1
  130. package/dist/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -20
  131. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.json +27 -33
  132. package/dist/templates/web/ui-auth-payments-video/template/next.config.js +14 -12
  133. package/dist/templates/web/ui-auth-payments-video/template/package.json +17 -30
  134. package/dist/templates/web/ui-auth-payments-video/template/postcss.config.mjs +8 -0
  135. package/dist/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -67
  136. package/dist/templates/web/ui-auth-payments-video/template/src/app/globals.css +89 -221
  137. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +4 -1
  138. package/dist/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -20
  139. package/dist/templates/web/ui-auth-payments-video/template/tsconfig.json +27 -33
  140. package/dist/templates/web/ui-only/template/next.config.js +14 -12
  141. package/dist/templates/web/ui-only/template/package.json +15 -25
  142. package/dist/templates/web/ui-only/template/postcss.config.mjs +8 -0
  143. package/dist/templates/web/ui-only/template/src/app/error.tsx +67 -67
  144. package/dist/templates/web/ui-only/template/src/app/globals.css +85 -31
  145. package/dist/templates/web/ui-only/template/src/app/layout.tsx +4 -1
  146. package/dist/templates/web/ui-only/template/src/app/loading.tsx +20 -20
  147. package/dist/templates/web/ui-only/template/tsconfig.json +27 -33
  148. package/package.json +1 -1
  149. package/src/templates/shared/auth/supabase/web/src/middleware.ts +63 -0
  150. package/src/templates/shared/database/supabase/web/src/lib/supabase/server.ts +3 -1
  151. package/src/templates/shared/design/web/src/config/design.config.ts +14 -14
  152. package/src/templates/shared/landing/web/src/components/LandingPage.tsx +0 -3
  153. package/src/templates/shared/security/web/src/lib/api-security.ts +2 -2
  154. package/src/templates/web/ai-platform/template/next.config.js +14 -14
  155. package/src/templates/web/ai-platform/template/package.json +11 -22
  156. package/src/templates/web/ai-platform/template/postcss.config.mjs +8 -0
  157. package/src/templates/web/ai-platform/template/src/app/api/auth/route.ts +57 -0
  158. package/src/templates/web/ai-platform/template/src/app/chat/page.tsx +234 -235
  159. package/src/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -142
  160. package/src/templates/web/ai-platform/template/src/app/error.tsx +13 -13
  161. package/src/templates/web/ai-platform/template/src/app/globals.css +97 -34
  162. package/src/templates/web/ai-platform/template/src/app/layout.tsx +3 -0
  163. package/src/templates/web/ai-platform/template/src/app/loading.tsx +22 -22
  164. package/src/templates/web/ai-platform/template/src/app/login/page.tsx +112 -0
  165. package/src/templates/web/ai-platform/template/src/app/models/page.tsx +186 -0
  166. package/src/templates/web/ai-platform/template/src/app/page.tsx +248 -154
  167. package/src/templates/web/ai-platform/template/src/app/playground/page.tsx +251 -0
  168. package/src/templates/web/ai-platform/template/src/app/settings/page.tsx +190 -0
  169. package/src/templates/web/ai-platform/template/src/app/signup/page.tsx +133 -0
  170. package/src/templates/web/ai-platform/template/src/lib/auth-server.ts +32 -33
  171. package/src/templates/web/ai-platform/template/src/lib/auth-session.ts +52 -0
  172. package/src/templates/web/base/template/next.config.js +14 -15
  173. package/src/templates/web/base/template/package.json +16 -31
  174. package/src/templates/web/base/template/postcss.config.mjs +8 -0
  175. package/src/templates/web/base/template/src/app/error.tsx +97 -97
  176. package/src/templates/web/base/template/src/app/globals.css +87 -148
  177. package/src/templates/web/base/template/src/app/layout.tsx +4 -1
  178. package/src/templates/web/base/template/src/app/loading.tsx +52 -52
  179. package/src/templates/web/base/template/tsconfig.json +27 -33
  180. package/src/templates/web/iot-dashboard/template/next.config.js +14 -14
  181. package/src/templates/web/iot-dashboard/template/package.json +12 -16
  182. package/src/templates/web/iot-dashboard/template/postcss.config.mjs +8 -0
  183. package/src/templates/web/iot-dashboard/template/src/app/alerts/page.tsx +157 -0
  184. package/src/templates/web/iot-dashboard/template/src/app/api/auth/route.ts +57 -0
  185. package/src/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +224 -224
  186. package/src/templates/web/iot-dashboard/template/src/app/devices/[id]/page.tsx +204 -0
  187. package/src/templates/web/iot-dashboard/template/src/app/devices/new/page.tsx +139 -0
  188. package/src/templates/web/iot-dashboard/template/src/app/devices/page.tsx +171 -0
  189. package/src/templates/web/iot-dashboard/template/src/app/error.tsx +8 -8
  190. package/src/templates/web/iot-dashboard/template/src/app/globals.css +97 -20
  191. package/src/templates/web/iot-dashboard/template/src/app/layout.tsx +3 -0
  192. package/src/templates/web/iot-dashboard/template/src/app/loading.tsx +5 -5
  193. package/src/templates/web/iot-dashboard/template/src/app/login/page.tsx +112 -0
  194. package/src/templates/web/iot-dashboard/template/src/app/page.tsx +266 -189
  195. package/src/templates/web/iot-dashboard/template/src/app/settings/page.tsx +186 -0
  196. package/src/templates/web/iot-dashboard/template/src/app/signup/page.tsx +133 -0
  197. package/src/templates/web/iot-dashboard/template/src/lib/auth-server.ts +32 -33
  198. package/src/templates/web/iot-dashboard/template/src/lib/auth-session.ts +52 -0
  199. package/src/templates/web/marketplace/template/next.config.js +14 -14
  200. package/src/templates/web/marketplace/template/package.json +11 -18
  201. package/src/templates/web/marketplace/template/postcss.config.mjs +8 -0
  202. package/src/templates/web/marketplace/template/src/app/api/auth/route.ts +57 -0
  203. package/src/templates/web/marketplace/template/src/app/cart/page.tsx +147 -147
  204. package/src/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -149
  205. package/src/templates/web/marketplace/template/src/app/error.tsx +7 -7
  206. package/src/templates/web/marketplace/template/src/app/globals.css +97 -20
  207. package/src/templates/web/marketplace/template/src/app/layout.tsx +3 -0
  208. package/src/templates/web/marketplace/template/src/app/loading.tsx +5 -5
  209. package/src/templates/web/marketplace/template/src/app/login/page.tsx +112 -0
  210. package/src/templates/web/marketplace/template/src/app/orders/page.tsx +160 -0
  211. package/src/templates/web/marketplace/template/src/app/page.tsx +370 -169
  212. package/src/templates/web/marketplace/template/src/app/products/[id]/page.tsx +218 -0
  213. package/src/templates/web/marketplace/template/src/app/products/page.tsx +129 -129
  214. package/src/templates/web/marketplace/template/src/app/settings/page.tsx +150 -0
  215. package/src/templates/web/marketplace/template/src/app/signup/page.tsx +133 -0
  216. package/src/templates/web/marketplace/template/src/lib/auth-server.ts +32 -33
  217. package/src/templates/web/marketplace/template/src/lib/auth-session.ts +52 -0
  218. package/src/templates/web/micro-saas/template/next.config.js +14 -14
  219. package/src/templates/web/micro-saas/template/package.json +9 -8
  220. package/src/templates/web/micro-saas/template/postcss.config.mjs +8 -0
  221. package/src/templates/web/micro-saas/template/src/app/api/auth/route.ts +57 -0
  222. package/src/templates/web/micro-saas/template/src/app/dashboard/page.tsx +145 -117
  223. package/src/templates/web/micro-saas/template/src/app/error.tsx +7 -7
  224. package/src/templates/web/micro-saas/template/src/app/globals.css +97 -20
  225. package/src/templates/web/micro-saas/template/src/app/layout.tsx +3 -0
  226. package/src/templates/web/micro-saas/template/src/app/loading.tsx +43 -27
  227. package/src/templates/web/micro-saas/template/src/app/login/page.tsx +112 -87
  228. package/src/templates/web/micro-saas/template/src/app/page.tsx +227 -137
  229. package/src/templates/web/micro-saas/template/src/app/signup/page.tsx +133 -108
  230. package/src/templates/web/micro-saas/template/src/lib/auth-server.ts +32 -33
  231. package/src/templates/web/micro-saas/template/src/lib/auth-session.ts +52 -0
  232. package/src/templates/web/ui-auth/template/next.config.js +14 -12
  233. package/src/templates/web/ui-auth/template/package.json +16 -26
  234. package/src/templates/web/ui-auth/template/postcss.config.mjs +8 -0
  235. package/src/templates/web/ui-auth/template/src/app/error.tsx +67 -67
  236. package/src/templates/web/ui-auth/template/src/app/globals.css +85 -84
  237. package/src/templates/web/ui-auth/template/src/app/layout.tsx +4 -1
  238. package/src/templates/web/ui-auth/template/src/app/loading.tsx +20 -38
  239. package/src/templates/web/ui-auth/template/tsconfig.json +27 -33
  240. package/src/templates/web/ui-auth-ai/template/next.config.js +15 -13
  241. package/src/templates/web/ui-auth-ai/template/package.json +25 -21
  242. package/src/templates/web/ui-auth-ai/template/postcss.config.mjs +8 -0
  243. package/src/templates/web/ui-auth-ai/template/src/app/error.tsx +7 -7
  244. package/src/templates/web/ui-auth-ai/template/src/app/globals.css +87 -25
  245. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +3 -0
  246. package/src/templates/web/ui-auth-ai/template/src/app/loading.tsx +4 -4
  247. package/src/templates/web/ui-auth-ai/template/tsconfig.json +27 -28
  248. package/src/templates/web/ui-auth-payments/template/next.config.js +14 -12
  249. package/src/templates/web/ui-auth-payments/template/package.json +16 -29
  250. package/src/templates/web/ui-auth-payments/template/postcss.config.mjs +8 -0
  251. package/src/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -67
  252. package/src/templates/web/ui-auth-payments/template/src/app/globals.css +89 -204
  253. package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +4 -1
  254. package/src/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -20
  255. package/src/templates/web/ui-auth-payments/template/tsconfig.json +27 -33
  256. package/src/templates/web/ui-auth-payments-ai/template/next.config.js +14 -12
  257. package/src/templates/web/ui-auth-payments-ai/template/package.json +17 -33
  258. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.mjs +8 -0
  259. package/src/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -67
  260. package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +85 -85
  261. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +4 -1
  262. package/src/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -20
  263. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.json +27 -33
  264. package/src/templates/web/ui-auth-payments-audio/template/next.config.js +14 -12
  265. package/src/templates/web/ui-auth-payments-audio/template/package.json +17 -30
  266. package/src/templates/web/ui-auth-payments-audio/template/postcss.config.mjs +8 -0
  267. package/src/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -67
  268. package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +85 -85
  269. package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +4 -1
  270. package/src/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -20
  271. package/src/templates/web/ui-auth-payments-audio/template/tsconfig.json +27 -33
  272. package/src/templates/web/ui-auth-payments-video/template/next.config.js +14 -12
  273. package/src/templates/web/ui-auth-payments-video/template/package.json +17 -30
  274. package/src/templates/web/ui-auth-payments-video/template/postcss.config.mjs +8 -0
  275. package/src/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -67
  276. package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +89 -221
  277. package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +4 -1
  278. package/src/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -20
  279. package/src/templates/web/ui-auth-payments-video/template/tsconfig.json +27 -33
  280. package/src/templates/web/ui-only/template/next.config.js +14 -12
  281. package/src/templates/web/ui-only/template/package.json +15 -25
  282. package/src/templates/web/ui-only/template/postcss.config.mjs +8 -0
  283. package/src/templates/web/ui-only/template/src/app/error.tsx +67 -67
  284. package/src/templates/web/ui-only/template/src/app/globals.css +85 -31
  285. package/src/templates/web/ui-only/template/src/app/layout.tsx +4 -1
  286. package/src/templates/web/ui-only/template/src/app/loading.tsx +20 -20
  287. package/src/templates/web/ui-only/template/tsconfig.json +27 -33
  288. package/dist/templates/web/ai-platform/template/middleware.ts +0 -55
  289. package/dist/templates/web/ai-platform/template/src/lib/supabase/client.ts +0 -8
  290. package/dist/templates/web/ai-platform/template/src/lib/supabase/server.ts +0 -27
  291. package/dist/templates/web/base/template/postcss.config.js +0 -7
  292. package/dist/templates/web/base/template/tailwind.config.js +0 -77
  293. package/dist/templates/web/iot-dashboard/template/middleware.ts +0 -56
  294. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +0 -8
  295. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +0 -27
  296. package/dist/templates/web/marketplace/template/middleware.ts +0 -56
  297. package/dist/templates/web/marketplace/template/src/lib/supabase/client.ts +0 -8
  298. package/dist/templates/web/marketplace/template/src/lib/supabase/server.ts +0 -27
  299. package/dist/templates/web/micro-saas/template/middleware.ts +0 -53
  300. package/dist/templates/web/micro-saas/template/src/lib/supabase/client.ts +0 -8
  301. package/dist/templates/web/micro-saas/template/src/lib/supabase/server.ts +0 -29
  302. package/dist/templates/web/ui-auth/template/.claude +0 -21
  303. package/dist/templates/web/ui-auth/template/context.md +0 -105
  304. package/dist/templates/web/ui-auth/template/postcss.config.js +0 -7
  305. package/dist/templates/web/ui-auth/template/tailwind.config.js +0 -77
  306. package/dist/templates/web/ui-auth-ai/template/postcss.config.js +0 -6
  307. package/dist/templates/web/ui-auth-ai/template/tailwind.config.js +0 -22
  308. package/dist/templates/web/ui-auth-payments/template/middleware.ts +0 -68
  309. package/dist/templates/web/ui-auth-payments/template/package-lock.json +0 -12240
  310. package/dist/templates/web/ui-auth-payments/template/postcss.config.js +0 -7
  311. package/dist/templates/web/ui-auth-payments/template/tailwind.config.js +0 -77
  312. package/dist/templates/web/ui-auth-payments/template/tsconfig.tsbuildinfo +0 -1
  313. package/dist/templates/web/ui-auth-payments-ai/template/.claude +0 -21
  314. package/dist/templates/web/ui-auth-payments-ai/template/context.md +0 -169
  315. package/dist/templates/web/ui-auth-payments-ai/template/middleware.ts +0 -68
  316. package/dist/templates/web/ui-auth-payments-ai/template/package-lock.json +0 -12241
  317. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.js +0 -7
  318. package/dist/templates/web/ui-auth-payments-ai/template/tailwind.config.js +0 -77
  319. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +0 -1
  320. package/dist/templates/web/ui-auth-payments-audio/template/middleware.ts +0 -68
  321. package/dist/templates/web/ui-auth-payments-audio/template/package-lock.json +0 -12241
  322. package/dist/templates/web/ui-auth-payments-audio/template/postcss.config.js +0 -7
  323. package/dist/templates/web/ui-auth-payments-audio/template/tailwind.config.js +0 -77
  324. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.tsbuildinfo +0 -1
  325. package/dist/templates/web/ui-auth-payments-video/template/postcss.config.js +0 -7
  326. package/dist/templates/web/ui-auth-payments-video/template/tailwind.config.js +0 -77
  327. package/dist/templates/web/ui-only/template/postcss.config.js +0 -7
  328. package/dist/templates/web/ui-only/template/tailwind.config.js +0 -77
  329. package/src/templates/web/ai-platform/template/middleware.ts +0 -55
  330. package/src/templates/web/ai-platform/template/src/lib/supabase/client.ts +0 -8
  331. package/src/templates/web/ai-platform/template/src/lib/supabase/server.ts +0 -27
  332. package/src/templates/web/base/template/postcss.config.js +0 -7
  333. package/src/templates/web/base/template/tailwind.config.js +0 -77
  334. package/src/templates/web/iot-dashboard/template/middleware.ts +0 -56
  335. package/src/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +0 -8
  336. package/src/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +0 -27
  337. package/src/templates/web/marketplace/template/middleware.ts +0 -56
  338. package/src/templates/web/marketplace/template/src/lib/supabase/client.ts +0 -8
  339. package/src/templates/web/marketplace/template/src/lib/supabase/server.ts +0 -27
  340. package/src/templates/web/micro-saas/template/middleware.ts +0 -53
  341. package/src/templates/web/micro-saas/template/src/lib/supabase/client.ts +0 -8
  342. package/src/templates/web/micro-saas/template/src/lib/supabase/server.ts +0 -29
  343. package/src/templates/web/ui-auth/template/.claude +0 -21
  344. package/src/templates/web/ui-auth/template/context.md +0 -105
  345. package/src/templates/web/ui-auth/template/postcss.config.js +0 -7
  346. package/src/templates/web/ui-auth/template/tailwind.config.js +0 -77
  347. package/src/templates/web/ui-auth-ai/template/postcss.config.js +0 -6
  348. package/src/templates/web/ui-auth-ai/template/tailwind.config.js +0 -22
  349. package/src/templates/web/ui-auth-payments/template/middleware.ts +0 -68
  350. package/src/templates/web/ui-auth-payments/template/package-lock.json +0 -12240
  351. package/src/templates/web/ui-auth-payments/template/postcss.config.js +0 -7
  352. package/src/templates/web/ui-auth-payments/template/tailwind.config.js +0 -77
  353. package/src/templates/web/ui-auth-payments/template/tsconfig.tsbuildinfo +0 -1
  354. package/src/templates/web/ui-auth-payments-ai/template/.claude +0 -21
  355. package/src/templates/web/ui-auth-payments-ai/template/context.md +0 -169
  356. package/src/templates/web/ui-auth-payments-ai/template/middleware.ts +0 -68
  357. package/src/templates/web/ui-auth-payments-ai/template/package-lock.json +0 -12241
  358. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.js +0 -7
  359. package/src/templates/web/ui-auth-payments-ai/template/tailwind.config.js +0 -77
  360. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +0 -1
  361. package/src/templates/web/ui-auth-payments-audio/template/middleware.ts +0 -68
  362. package/src/templates/web/ui-auth-payments-audio/template/package-lock.json +0 -12241
  363. package/src/templates/web/ui-auth-payments-audio/template/postcss.config.js +0 -7
  364. package/src/templates/web/ui-auth-payments-audio/template/tailwind.config.js +0 -77
  365. package/src/templates/web/ui-auth-payments-audio/template/tsconfig.tsbuildinfo +0 -1
  366. package/src/templates/web/ui-auth-payments-video/template/postcss.config.js +0 -7
  367. package/src/templates/web/ui-auth-payments-video/template/tailwind.config.js +0 -77
  368. package/src/templates/web/ui-only/template/postcss.config.js +0 -7
  369. package/src/templates/web/ui-only/template/tailwind.config.js +0 -77
  370. /package/dist/templates/shared/admin/web/{components → src/components}/admin-nav.tsx +0 -0
  371. /package/dist/templates/shared/auth/keycloak/web/{auth.config.ts → src/auth.config.ts} +0 -0
  372. /package/dist/templates/shared/auth/keycloak/web/{auth.ts → src/auth.ts} +0 -0
  373. /package/dist/templates/shared/middleware/web/{middleware.ts → src/middleware.ts} +0 -0
  374. /package/src/templates/shared/admin/web/{components → src/components}/admin-nav.tsx +0 -0
  375. /package/src/templates/shared/auth/keycloak/web/{auth.config.ts → src/auth.config.ts} +0 -0
  376. /package/src/templates/shared/auth/keycloak/web/{auth.ts → src/auth.ts} +0 -0
  377. /package/src/templates/shared/middleware/web/{middleware.ts → src/middleware.ts} +0 -0
@@ -1,235 +1,234 @@
1
- 'use client'
2
-
3
- import { useState, useRef, useEffect } from 'react'
4
- import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
- import { Send, Bot, User, Loader2, Sparkles } from 'lucide-react'
6
- import { useAuth } from '@digilogiclabs/app-sdk'
7
- import Link from 'next/link'
8
-
9
- interface Message {
10
- id: string
11
- role: 'user' | 'assistant'
12
- content: string
13
- timestamp: Date
14
- }
15
-
16
- const MODELS = [
17
- { id: 'gpt-4o', name: 'GPT-4o', provider: 'OpenAI' },
18
- { id: 'claude-3-5-sonnet', name: 'Claude 3.5 Sonnet', provider: 'Anthropic' },
19
- { id: 'gpt-4o-mini', name: 'GPT-4o Mini', provider: 'OpenAI' },
20
- ]
21
-
22
- export default function ChatPage() {
23
- const { user, loading: authLoading } = useAuth()
24
- const [messages, setMessages] = useState<Message[]>([])
25
- const [input, setInput] = useState('')
26
- const [isLoading, setIsLoading] = useState(false)
27
- const [selectedModel, setSelectedModel] = useState(MODELS[0].id)
28
- const messagesEndRef = useRef<HTMLDivElement>(null)
29
-
30
- const scrollToBottom = () => {
31
- messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })
32
- }
33
-
34
- useEffect(() => {
35
- scrollToBottom()
36
- }, [messages])
37
-
38
- const handleSubmit = async (e: React.FormEvent) => {
39
- e.preventDefault()
40
- if (!input.trim() || isLoading) return
41
-
42
- const userMessage: Message = {
43
- id: Date.now().toString(),
44
- role: 'user',
45
- content: input,
46
- timestamp: new Date(),
47
- }
48
-
49
- setMessages(prev => [...prev, userMessage])
50
- setInput('')
51
- setIsLoading(true)
52
-
53
- try {
54
- const response = await fetch('/api/chat', {
55
- method: 'POST',
56
- headers: { 'Content-Type': 'application/json' },
57
- body: JSON.stringify({
58
- messages: [...messages, userMessage].map(m => ({
59
- role: m.role,
60
- content: m.content,
61
- })),
62
- model: selectedModel,
63
- }),
64
- })
65
-
66
- const data = await response.json()
67
-
68
- const assistantMessage: Message = {
69
- id: (Date.now() + 1).toString(),
70
- role: 'assistant',
71
- content: data.content || 'Sorry, I could not process your request.',
72
- timestamp: new Date(),
73
- }
74
-
75
- setMessages(prev => [...prev, assistantMessage])
76
- } catch (error) {
77
- console.error('Chat error:', error)
78
- const errorMessage: Message = {
79
- id: (Date.now() + 1).toString(),
80
- role: 'assistant',
81
- content: 'Sorry, there was an error processing your request. Please try again.',
82
- timestamp: new Date(),
83
- }
84
- setMessages(prev => [...prev, errorMessage])
85
- } finally {
86
- setIsLoading(false)
87
- }
88
- }
89
-
90
- if (authLoading) {
91
- return (
92
- <div className="min-h-screen bg-slate-900 flex items-center justify-center">
93
- <Loader2 className="w-8 h-8 text-purple-400 animate-spin" />
94
- </div>
95
- )
96
- }
97
-
98
- if (!user) {
99
- return (
100
- <div className="min-h-screen bg-slate-900 flex items-center justify-center">
101
- <Card className="p-8 bg-white/5 border-white/10 text-center max-w-md">
102
- <Bot className="w-16 h-16 text-purple-400 mx-auto mb-4" />
103
- <h2 className="text-2xl font-bold text-white mb-2">Sign in to Chat</h2>
104
- <p className="text-gray-400 mb-6">
105
- Create an account to start chatting with AI models.
106
- </p>
107
- <div className="flex gap-2 justify-center">
108
- <Link href="/login">
109
- <Button variant="outline" className="border-white/20 text-white">Sign In</Button>
110
- </Link>
111
- <Link href="/signup">
112
- <Button className="bg-purple-600 hover:bg-purple-700">Sign Up</Button>
113
- </Link>
114
- </div>
115
- </Card>
116
- </div>
117
- )
118
- }
119
-
120
- return (
121
- <div className="h-screen bg-slate-900 flex flex-col">
122
- {/* Header */}
123
- <header className="border-b border-white/10 bg-black/20 px-4 py-3">
124
- <div className="max-w-4xl mx-auto flex items-center justify-between">
125
- <div className="flex items-center gap-2">
126
- <Link href="/" className="flex items-center gap-2 text-white">
127
- <Bot className="w-6 h-6 text-purple-400" />
128
- <span className="font-bold">AI Chat</span>
129
- </Link>
130
- </div>
131
- <select
132
- value={selectedModel}
133
- onChange={(e) => setSelectedModel(e.target.value)}
134
- className="bg-white/10 border border-white/20 rounded-lg px-3 py-1.5 text-white text-sm focus:ring-2 focus:ring-purple-500"
135
- >
136
- {MODELS.map((model) => (
137
- <option key={model.id} value={model.id} className="bg-slate-800">
138
- {model.name}
139
- </option>
140
- ))}
141
- </select>
142
- </div>
143
- </header>
144
-
145
- {/* Messages */}
146
- <div className="flex-1 overflow-y-auto px-4 py-6">
147
- <div className="max-w-4xl mx-auto space-y-6">
148
- {messages.length === 0 && (
149
- <div className="text-center py-20">
150
- <Sparkles className="w-16 h-16 text-purple-400 mx-auto mb-4" />
151
- <h2 className="text-2xl font-bold text-white mb-2">Start a Conversation</h2>
152
- <p className="text-gray-400">Ask me anything or try one of these prompts:</p>
153
- <div className="flex flex-wrap gap-2 justify-center mt-4">
154
- {['Explain quantum computing', 'Write a Python function', 'Help me brainstorm'].map((prompt) => (
155
- <button
156
- key={prompt}
157
- onClick={() => setInput(prompt)}
158
- className="px-4 py-2 bg-white/5 border border-white/10 rounded-lg text-gray-300 hover:bg-white/10 transition text-sm"
159
- >
160
- {prompt}
161
- </button>
162
- ))}
163
- </div>
164
- </div>
165
- )}
166
-
167
- {messages.map((message) => (
168
- <div
169
- key={message.id}
170
- className={`flex gap-4 ${message.role === 'user' ? 'justify-end' : ''}`}
171
- >
172
- {message.role === 'assistant' && (
173
- <div className="w-8 h-8 rounded-lg bg-purple-500/20 flex items-center justify-center flex-shrink-0">
174
- <Bot className="w-5 h-5 text-purple-400" />
175
- </div>
176
- )}
177
- <div
178
- className={`max-w-2xl rounded-lg px-4 py-3 ${
179
- message.role === 'user'
180
- ? 'bg-purple-600 text-white'
181
- : 'bg-white/5 text-gray-200'
182
- }`}
183
- >
184
- <p className="whitespace-pre-wrap">{message.content}</p>
185
- </div>
186
- {message.role === 'user' && (
187
- <div className="w-8 h-8 rounded-lg bg-blue-500/20 flex items-center justify-center flex-shrink-0">
188
- <User className="w-5 h-5 text-blue-400" />
189
- </div>
190
- )}
191
- </div>
192
- ))}
193
-
194
- {isLoading && (
195
- <div className="flex gap-4">
196
- <div className="w-8 h-8 rounded-lg bg-purple-500/20 flex items-center justify-center">
197
- <Bot className="w-5 h-5 text-purple-400" />
198
- </div>
199
- <div className="bg-white/5 rounded-lg px-4 py-3">
200
- <Loader2 className="w-5 h-5 text-purple-400 animate-spin" />
201
- </div>
202
- </div>
203
- )}
204
-
205
- <div ref={messagesEndRef} />
206
- </div>
207
- </div>
208
-
209
- {/* Input */}
210
- <div className="border-t border-white/10 bg-black/20 px-4 py-4">
211
- <form onSubmit={handleSubmit} className="max-w-4xl mx-auto flex gap-2">
212
- <input
213
- type="text"
214
- value={input}
215
- onChange={(e) => setInput(e.target.value)}
216
- placeholder="Type your message..."
217
- className="flex-1 bg-white/10 border border-white/20 rounded-lg px-4 py-2 text-white placeholder-gray-400 focus:ring-2 focus:ring-purple-500 focus:border-transparent"
218
- disabled={isLoading}
219
- />
220
- <Button
221
- type="submit"
222
- disabled={!input.trim() || isLoading}
223
- className="bg-purple-600 hover:bg-purple-700"
224
- >
225
- {isLoading ? (
226
- <Loader2 className="w-5 h-5 animate-spin" />
227
- ) : (
228
- <Send className="w-5 h-5" />
229
- )}
230
- </Button>
231
- </form>
232
- </div>
233
- </div>
234
- )
235
- }
1
+ 'use client'
2
+
3
+ import { useState, useRef, useEffect } from 'react'
4
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
+ import { Send, Bot, User, Loader2, Sparkles } from 'lucide-react'
6
+ import { useAuth } from '@digilogiclabs/app-sdk'
7
+ import Link from 'next/link'
8
+
9
+ interface Message {
10
+ id: string
11
+ role: 'user' | 'assistant'
12
+ content: string
13
+ timestamp: Date
14
+ }
15
+
16
+ const MODELS = [
17
+ { id: 'gpt-4o', name: 'GPT-4o', provider: 'OpenAI' },
18
+ { id: 'claude-3-5-sonnet', name: 'Claude 3.5 Sonnet', provider: 'Anthropic' },
19
+ { id: 'gpt-4o-mini', name: 'GPT-4o Mini', provider: 'OpenAI' },
20
+ ]
21
+
22
+ export default function ChatPage() {
23
+ const { user, loading: authLoading } = useAuth()
24
+ const [messages, setMessages] = useState<Message[]>([])
25
+ const [input, setInput] = useState('')
26
+ const [isLoading, setIsLoading] = useState(false)
27
+ const [selectedModel, setSelectedModel] = useState(MODELS[0].id)
28
+ const messagesEndRef = useRef<HTMLDivElement>(null)
29
+
30
+ const scrollToBottom = () => {
31
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })
32
+ }
33
+
34
+ useEffect(() => {
35
+ scrollToBottom()
36
+ }, [messages])
37
+
38
+ const handleSubmit = async (e: React.FormEvent) => {
39
+ e.preventDefault()
40
+ if (!input.trim() || isLoading) return
41
+
42
+ const userMessage: Message = {
43
+ id: Date.now().toString(),
44
+ role: 'user',
45
+ content: input,
46
+ timestamp: new Date(),
47
+ }
48
+
49
+ setMessages(prev => [...prev, userMessage])
50
+ setInput('')
51
+ setIsLoading(true)
52
+
53
+ try {
54
+ const response = await fetch('/api/chat', {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify({
58
+ messages: [...messages, userMessage].map(m => ({
59
+ role: m.role,
60
+ content: m.content,
61
+ })),
62
+ model: selectedModel,
63
+ }),
64
+ })
65
+
66
+ const data = await response.json()
67
+
68
+ const assistantMessage: Message = {
69
+ id: (Date.now() + 1).toString(),
70
+ role: 'assistant',
71
+ content: data.content || 'Sorry, I could not process your request.',
72
+ timestamp: new Date(),
73
+ }
74
+
75
+ setMessages(prev => [...prev, assistantMessage])
76
+ } catch (error) {
77
+ console.error('Chat error:', error)
78
+ const errorMessage: Message = {
79
+ id: (Date.now() + 1).toString(),
80
+ role: 'assistant',
81
+ content: 'Sorry, there was an error processing your request. Please try again.',
82
+ timestamp: new Date(),
83
+ }
84
+ setMessages(prev => [...prev, errorMessage])
85
+ } finally {
86
+ setIsLoading(false)
87
+ }
88
+ }
89
+
90
+ if (authLoading) {
91
+ return (
92
+ <div className="min-h-screen bg-background flex items-center justify-center">
93
+ <Loader2 className="w-8 h-8 text-primary animate-spin" />
94
+ </div>
95
+ )
96
+ }
97
+
98
+ if (!user) {
99
+ return (
100
+ <div className="min-h-screen bg-background flex items-center justify-center">
101
+ <Card className="p-8 bg-secondary border-border text-center max-w-md">
102
+ <Bot className="w-16 h-16 text-primary mx-auto mb-4" />
103
+ <h2 className="text-2xl font-bold text-foreground mb-2">Sign in to Chat</h2>
104
+ <p className="text-muted-foreground mb-6">
105
+ Create an account to start chatting with AI models.
106
+ </p>
107
+ <div className="flex gap-2 justify-center">
108
+ <Link href="/login">
109
+ <Button variant="outline">Sign In</Button>
110
+ </Link>
111
+ <Link href="/signup">
112
+ <Button>Sign Up</Button>
113
+ </Link>
114
+ </div>
115
+ </Card>
116
+ </div>
117
+ )
118
+ }
119
+
120
+ return (
121
+ <div className="h-screen bg-background flex flex-col">
122
+ {/* Header */}
123
+ <header className="border-b border-border bg-card/50 px-4 py-3">
124
+ <div className="max-w-4xl mx-auto flex items-center justify-between">
125
+ <div className="flex items-center gap-2">
126
+ <Link href="/" className="flex items-center gap-2 text-foreground">
127
+ <Bot className="w-6 h-6 text-primary" />
128
+ <span className="font-bold">AI Chat</span>
129
+ </Link>
130
+ </div>
131
+ <select
132
+ value={selectedModel}
133
+ onChange={(e) => setSelectedModel(e.target.value)}
134
+ className="bg-secondary border border-border rounded-lg px-3 py-1.5 text-foreground text-sm focus:ring-2 focus:ring-ring"
135
+ >
136
+ {MODELS.map((model) => (
137
+ <option key={model.id} value={model.id} className="bg-card">
138
+ {model.name}
139
+ </option>
140
+ ))}
141
+ </select>
142
+ </div>
143
+ </header>
144
+
145
+ {/* Messages */}
146
+ <div className="flex-1 overflow-y-auto px-4 py-6">
147
+ <div className="max-w-4xl mx-auto space-y-6">
148
+ {messages.length === 0 && (
149
+ <div className="text-center py-20">
150
+ <Sparkles className="w-16 h-16 text-primary mx-auto mb-4" />
151
+ <h2 className="text-2xl font-bold text-foreground mb-2">Start a Conversation</h2>
152
+ <p className="text-muted-foreground">Ask me anything or try one of these prompts:</p>
153
+ <div className="flex flex-wrap gap-2 justify-center mt-4">
154
+ {['Explain quantum computing', 'Write a Python function', 'Help me brainstorm'].map((prompt) => (
155
+ <button
156
+ key={prompt}
157
+ onClick={() => setInput(prompt)}
158
+ className="px-4 py-2 bg-secondary border border-border rounded-lg text-muted-foreground hover:bg-accent transition text-sm"
159
+ >
160
+ {prompt}
161
+ </button>
162
+ ))}
163
+ </div>
164
+ </div>
165
+ )}
166
+
167
+ {messages.map((message) => (
168
+ <div
169
+ key={message.id}
170
+ className={`flex gap-4 ${message.role === 'user' ? 'justify-end' : ''}`}
171
+ >
172
+ {message.role === 'assistant' && (
173
+ <div className="w-8 h-8 rounded-lg bg-primary/20 flex items-center justify-center flex-shrink-0">
174
+ <Bot className="w-5 h-5 text-primary" />
175
+ </div>
176
+ )}
177
+ <div
178
+ className={`max-w-2xl rounded-lg px-4 py-3 ${
179
+ message.role === 'user'
180
+ ? 'bg-primary text-primary-foreground'
181
+ : 'bg-secondary text-foreground'
182
+ }`}
183
+ >
184
+ <p className="whitespace-pre-wrap">{message.content}</p>
185
+ </div>
186
+ {message.role === 'user' && (
187
+ <div className="w-8 h-8 rounded-lg bg-accent flex items-center justify-center flex-shrink-0">
188
+ <User className="w-5 h-5 text-accent-foreground" />
189
+ </div>
190
+ )}
191
+ </div>
192
+ ))}
193
+
194
+ {isLoading && (
195
+ <div className="flex gap-4">
196
+ <div className="w-8 h-8 rounded-lg bg-primary/20 flex items-center justify-center">
197
+ <Bot className="w-5 h-5 text-primary" />
198
+ </div>
199
+ <div className="bg-secondary rounded-lg px-4 py-3">
200
+ <Loader2 className="w-5 h-5 text-primary animate-spin" />
201
+ </div>
202
+ </div>
203
+ )}
204
+
205
+ <div ref={messagesEndRef} />
206
+ </div>
207
+ </div>
208
+
209
+ {/* Input */}
210
+ <div className="border-t border-border bg-card/50 px-4 py-4">
211
+ <form onSubmit={handleSubmit} className="max-w-4xl mx-auto flex gap-2">
212
+ <input
213
+ type="text"
214
+ value={input}
215
+ onChange={(e) => setInput(e.target.value)}
216
+ placeholder="Type your message..."
217
+ className="flex-1 bg-secondary border border-border rounded-lg px-4 py-2 text-foreground placeholder-muted-foreground focus:ring-2 focus:ring-ring focus:border-transparent"
218
+ disabled={isLoading}
219
+ />
220
+ <Button
221
+ type="submit"
222
+ disabled={!input.trim() || isLoading}
223
+ >
224
+ {isLoading ? (
225
+ <Loader2 className="w-5 h-5 animate-spin" />
226
+ ) : (
227
+ <Send className="w-5 h-5" />
228
+ )}
229
+ </Button>
230
+ </form>
231
+ </div>
232
+ </div>
233
+ )
234
+ }