@digilogiclabs/create-saas-app 2.9.0 → 2.10.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 (343) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/generators/template-generator.d.ts.map +1 -1
  3. package/dist/generators/template-generator.js +6 -3
  4. package/dist/generators/template-generator.js.map +1 -1
  5. package/dist/templates/shared/auth/supabase/web/src/middleware.ts +63 -0
  6. package/dist/templates/shared/database/supabase/web/src/lib/supabase/server.ts +3 -1
  7. package/dist/templates/shared/design/web/src/config/design.config.ts +14 -14
  8. package/dist/templates/shared/landing/web/src/components/LandingPage.tsx +0 -3
  9. package/dist/templates/shared/security/web/src/lib/api-security.ts +2 -2
  10. package/dist/templates/web/ai-platform/template/next.config.js +14 -14
  11. package/dist/templates/web/ai-platform/template/package.json +11 -22
  12. package/dist/templates/web/ai-platform/template/postcss.config.mjs +8 -0
  13. package/dist/templates/web/ai-platform/template/src/app/chat/page.tsx +234 -235
  14. package/dist/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -142
  15. package/dist/templates/web/ai-platform/template/src/app/error.tsx +13 -13
  16. package/dist/templates/web/ai-platform/template/src/app/globals.css +97 -34
  17. package/dist/templates/web/ai-platform/template/src/app/layout.tsx +3 -0
  18. package/dist/templates/web/ai-platform/template/src/app/loading.tsx +22 -22
  19. package/dist/templates/web/ai-platform/template/src/app/page.tsx +249 -155
  20. package/dist/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +5 -2
  21. package/dist/templates/web/ai-platform/template/src/lib/auth-server.ts +32 -33
  22. package/dist/templates/web/base/template/next.config.js +14 -15
  23. package/dist/templates/web/base/template/package.json +16 -31
  24. package/dist/templates/web/base/template/postcss.config.mjs +8 -0
  25. package/dist/templates/web/base/template/src/app/error.tsx +97 -97
  26. package/dist/templates/web/base/template/src/app/globals.css +87 -148
  27. package/dist/templates/web/base/template/src/app/layout.tsx +4 -1
  28. package/dist/templates/web/base/template/src/app/loading.tsx +52 -52
  29. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +5 -2
  30. package/dist/templates/web/base/template/tsconfig.json +27 -33
  31. package/dist/templates/web/iot-dashboard/template/next.config.js +14 -14
  32. package/dist/templates/web/iot-dashboard/template/package.json +12 -16
  33. package/dist/templates/web/iot-dashboard/template/postcss.config.mjs +8 -0
  34. package/dist/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +224 -224
  35. package/dist/templates/web/iot-dashboard/template/src/app/error.tsx +8 -8
  36. package/dist/templates/web/iot-dashboard/template/src/app/globals.css +97 -20
  37. package/dist/templates/web/iot-dashboard/template/src/app/layout.tsx +3 -0
  38. package/dist/templates/web/iot-dashboard/template/src/app/loading.tsx +5 -5
  39. package/dist/templates/web/iot-dashboard/template/src/app/page.tsx +266 -189
  40. package/dist/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +5 -2
  41. package/dist/templates/web/iot-dashboard/template/src/lib/auth-server.ts +32 -33
  42. package/dist/templates/web/marketplace/template/next.config.js +14 -14
  43. package/dist/templates/web/marketplace/template/package.json +11 -18
  44. package/dist/templates/web/marketplace/template/postcss.config.mjs +8 -0
  45. package/dist/templates/web/marketplace/template/src/app/cart/page.tsx +147 -147
  46. package/dist/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -149
  47. package/dist/templates/web/marketplace/template/src/app/error.tsx +7 -7
  48. package/dist/templates/web/marketplace/template/src/app/globals.css +97 -20
  49. package/dist/templates/web/marketplace/template/src/app/layout.tsx +3 -0
  50. package/dist/templates/web/marketplace/template/src/app/loading.tsx +5 -5
  51. package/dist/templates/web/marketplace/template/src/app/page.tsx +370 -169
  52. package/dist/templates/web/marketplace/template/src/app/products/page.tsx +129 -129
  53. package/dist/templates/web/marketplace/template/src/components/providers/app-providers.tsx +5 -2
  54. package/dist/templates/web/marketplace/template/src/lib/auth-server.ts +32 -33
  55. package/dist/templates/web/micro-saas/template/next.config.js +14 -14
  56. package/dist/templates/web/micro-saas/template/package.json +9 -8
  57. package/dist/templates/web/micro-saas/template/postcss.config.mjs +8 -0
  58. package/dist/templates/web/micro-saas/template/src/app/dashboard/page.tsx +145 -117
  59. package/dist/templates/web/micro-saas/template/src/app/error.tsx +7 -7
  60. package/dist/templates/web/micro-saas/template/src/app/globals.css +97 -20
  61. package/dist/templates/web/micro-saas/template/src/app/layout.tsx +3 -0
  62. package/dist/templates/web/micro-saas/template/src/app/loading.tsx +43 -27
  63. package/dist/templates/web/micro-saas/template/src/app/login/page.tsx +101 -87
  64. package/dist/templates/web/micro-saas/template/src/app/page.tsx +227 -137
  65. package/dist/templates/web/micro-saas/template/src/app/signup/page.tsx +122 -108
  66. package/dist/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +5 -2
  67. package/dist/templates/web/micro-saas/template/src/lib/auth-server.ts +32 -33
  68. package/dist/templates/web/ui-auth/template/next.config.js +14 -12
  69. package/dist/templates/web/ui-auth/template/package.json +16 -26
  70. package/dist/templates/web/ui-auth/template/postcss.config.mjs +8 -0
  71. package/dist/templates/web/ui-auth/template/src/app/error.tsx +67 -67
  72. package/dist/templates/web/ui-auth/template/src/app/globals.css +85 -84
  73. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +4 -1
  74. package/dist/templates/web/ui-auth/template/src/app/loading.tsx +20 -38
  75. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +5 -2
  76. package/dist/templates/web/ui-auth/template/tsconfig.json +27 -33
  77. package/dist/templates/web/ui-auth-ai/template/next.config.js +15 -13
  78. package/dist/templates/web/ui-auth-ai/template/package.json +25 -21
  79. package/dist/templates/web/ui-auth-ai/template/postcss.config.mjs +8 -0
  80. package/dist/templates/web/ui-auth-ai/template/src/app/error.tsx +7 -7
  81. package/dist/templates/web/ui-auth-ai/template/src/app/globals.css +87 -25
  82. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +3 -0
  83. package/dist/templates/web/ui-auth-ai/template/src/app/loading.tsx +4 -4
  84. package/dist/templates/web/ui-auth-ai/template/tsconfig.json +27 -28
  85. package/dist/templates/web/ui-auth-payments/template/next.config.js +14 -12
  86. package/dist/templates/web/ui-auth-payments/template/package.json +16 -29
  87. package/dist/templates/web/ui-auth-payments/template/postcss.config.mjs +8 -0
  88. package/dist/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -67
  89. package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +89 -204
  90. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +4 -1
  91. package/dist/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -20
  92. package/dist/templates/web/ui-auth-payments/template/tsconfig.json +27 -33
  93. package/dist/templates/web/ui-auth-payments-ai/template/next.config.js +14 -12
  94. package/dist/templates/web/ui-auth-payments-ai/template/package.json +17 -33
  95. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.mjs +8 -0
  96. package/dist/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -67
  97. package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +85 -85
  98. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +4 -1
  99. package/dist/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -20
  100. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +5 -2
  101. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.json +27 -33
  102. package/dist/templates/web/ui-auth-payments-audio/template/next.config.js +14 -12
  103. package/dist/templates/web/ui-auth-payments-audio/template/package.json +17 -30
  104. package/dist/templates/web/ui-auth-payments-audio/template/postcss.config.mjs +8 -0
  105. package/dist/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -67
  106. package/dist/templates/web/ui-auth-payments-audio/template/src/app/globals.css +85 -85
  107. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +4 -1
  108. package/dist/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -20
  109. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +5 -2
  110. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.json +27 -33
  111. package/dist/templates/web/ui-auth-payments-video/template/next.config.js +14 -12
  112. package/dist/templates/web/ui-auth-payments-video/template/package.json +17 -30
  113. package/dist/templates/web/ui-auth-payments-video/template/postcss.config.mjs +8 -0
  114. package/dist/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -67
  115. package/dist/templates/web/ui-auth-payments-video/template/src/app/globals.css +89 -221
  116. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +4 -1
  117. package/dist/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -20
  118. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +5 -2
  119. package/dist/templates/web/ui-auth-payments-video/template/tsconfig.json +27 -33
  120. package/dist/templates/web/ui-only/template/next.config.js +14 -12
  121. package/dist/templates/web/ui-only/template/package.json +15 -25
  122. package/dist/templates/web/ui-only/template/postcss.config.mjs +8 -0
  123. package/dist/templates/web/ui-only/template/src/app/error.tsx +67 -67
  124. package/dist/templates/web/ui-only/template/src/app/globals.css +85 -31
  125. package/dist/templates/web/ui-only/template/src/app/layout.tsx +4 -1
  126. package/dist/templates/web/ui-only/template/src/app/loading.tsx +20 -20
  127. package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +20 -26
  128. package/dist/templates/web/ui-only/template/tsconfig.json +27 -33
  129. package/package.json +1 -1
  130. package/src/templates/shared/auth/supabase/web/src/middleware.ts +63 -0
  131. package/src/templates/shared/database/supabase/web/src/lib/supabase/server.ts +3 -1
  132. package/src/templates/shared/design/web/src/config/design.config.ts +14 -14
  133. package/src/templates/shared/landing/web/src/components/LandingPage.tsx +0 -3
  134. package/src/templates/shared/security/web/src/lib/api-security.ts +2 -2
  135. package/src/templates/web/ai-platform/template/next.config.js +14 -14
  136. package/src/templates/web/ai-platform/template/package.json +11 -22
  137. package/src/templates/web/ai-platform/template/postcss.config.mjs +8 -0
  138. package/src/templates/web/ai-platform/template/src/app/chat/page.tsx +234 -235
  139. package/src/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -142
  140. package/src/templates/web/ai-platform/template/src/app/error.tsx +13 -13
  141. package/src/templates/web/ai-platform/template/src/app/globals.css +97 -34
  142. package/src/templates/web/ai-platform/template/src/app/layout.tsx +3 -0
  143. package/src/templates/web/ai-platform/template/src/app/loading.tsx +22 -22
  144. package/src/templates/web/ai-platform/template/src/app/page.tsx +249 -155
  145. package/src/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +5 -2
  146. package/src/templates/web/ai-platform/template/src/lib/auth-server.ts +32 -33
  147. package/src/templates/web/base/template/next.config.js +14 -15
  148. package/src/templates/web/base/template/package.json +16 -31
  149. package/src/templates/web/base/template/postcss.config.mjs +8 -0
  150. package/src/templates/web/base/template/src/app/error.tsx +97 -97
  151. package/src/templates/web/base/template/src/app/globals.css +87 -148
  152. package/src/templates/web/base/template/src/app/layout.tsx +4 -1
  153. package/src/templates/web/base/template/src/app/loading.tsx +52 -52
  154. package/src/templates/web/base/template/src/components/providers/app-providers.tsx +5 -2
  155. package/src/templates/web/base/template/tsconfig.json +27 -33
  156. package/src/templates/web/iot-dashboard/template/next.config.js +14 -14
  157. package/src/templates/web/iot-dashboard/template/package.json +12 -16
  158. package/src/templates/web/iot-dashboard/template/postcss.config.mjs +8 -0
  159. package/src/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +224 -224
  160. package/src/templates/web/iot-dashboard/template/src/app/error.tsx +8 -8
  161. package/src/templates/web/iot-dashboard/template/src/app/globals.css +97 -20
  162. package/src/templates/web/iot-dashboard/template/src/app/layout.tsx +3 -0
  163. package/src/templates/web/iot-dashboard/template/src/app/loading.tsx +5 -5
  164. package/src/templates/web/iot-dashboard/template/src/app/page.tsx +266 -189
  165. package/src/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +5 -2
  166. package/src/templates/web/iot-dashboard/template/src/lib/auth-server.ts +32 -33
  167. package/src/templates/web/marketplace/template/next.config.js +14 -14
  168. package/src/templates/web/marketplace/template/package.json +11 -18
  169. package/src/templates/web/marketplace/template/postcss.config.mjs +8 -0
  170. package/src/templates/web/marketplace/template/src/app/cart/page.tsx +147 -147
  171. package/src/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -149
  172. package/src/templates/web/marketplace/template/src/app/error.tsx +7 -7
  173. package/src/templates/web/marketplace/template/src/app/globals.css +97 -20
  174. package/src/templates/web/marketplace/template/src/app/layout.tsx +3 -0
  175. package/src/templates/web/marketplace/template/src/app/loading.tsx +5 -5
  176. package/src/templates/web/marketplace/template/src/app/page.tsx +370 -169
  177. package/src/templates/web/marketplace/template/src/app/products/page.tsx +129 -129
  178. package/src/templates/web/marketplace/template/src/components/providers/app-providers.tsx +5 -2
  179. package/src/templates/web/marketplace/template/src/lib/auth-server.ts +32 -33
  180. package/src/templates/web/micro-saas/template/next.config.js +14 -14
  181. package/src/templates/web/micro-saas/template/package.json +9 -8
  182. package/src/templates/web/micro-saas/template/postcss.config.mjs +8 -0
  183. package/src/templates/web/micro-saas/template/src/app/dashboard/page.tsx +145 -117
  184. package/src/templates/web/micro-saas/template/src/app/error.tsx +7 -7
  185. package/src/templates/web/micro-saas/template/src/app/globals.css +97 -20
  186. package/src/templates/web/micro-saas/template/src/app/layout.tsx +3 -0
  187. package/src/templates/web/micro-saas/template/src/app/loading.tsx +43 -27
  188. package/src/templates/web/micro-saas/template/src/app/login/page.tsx +101 -87
  189. package/src/templates/web/micro-saas/template/src/app/page.tsx +227 -137
  190. package/src/templates/web/micro-saas/template/src/app/signup/page.tsx +122 -108
  191. package/src/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +5 -2
  192. package/src/templates/web/micro-saas/template/src/lib/auth-server.ts +32 -33
  193. package/src/templates/web/ui-auth/template/next.config.js +14 -12
  194. package/src/templates/web/ui-auth/template/package.json +16 -26
  195. package/src/templates/web/ui-auth/template/postcss.config.mjs +8 -0
  196. package/src/templates/web/ui-auth/template/src/app/error.tsx +67 -67
  197. package/src/templates/web/ui-auth/template/src/app/globals.css +85 -84
  198. package/src/templates/web/ui-auth/template/src/app/layout.tsx +4 -1
  199. package/src/templates/web/ui-auth/template/src/app/loading.tsx +20 -38
  200. package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +5 -2
  201. package/src/templates/web/ui-auth/template/tsconfig.json +27 -33
  202. package/src/templates/web/ui-auth-ai/template/next.config.js +15 -13
  203. package/src/templates/web/ui-auth-ai/template/package.json +25 -21
  204. package/src/templates/web/ui-auth-ai/template/postcss.config.mjs +8 -0
  205. package/src/templates/web/ui-auth-ai/template/src/app/error.tsx +7 -7
  206. package/src/templates/web/ui-auth-ai/template/src/app/globals.css +87 -25
  207. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +3 -0
  208. package/src/templates/web/ui-auth-ai/template/src/app/loading.tsx +4 -4
  209. package/src/templates/web/ui-auth-ai/template/tsconfig.json +27 -28
  210. package/src/templates/web/ui-auth-payments/template/next.config.js +14 -12
  211. package/src/templates/web/ui-auth-payments/template/package.json +16 -29
  212. package/src/templates/web/ui-auth-payments/template/postcss.config.mjs +8 -0
  213. package/src/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -67
  214. package/src/templates/web/ui-auth-payments/template/src/app/globals.css +89 -204
  215. package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +4 -1
  216. package/src/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -20
  217. package/src/templates/web/ui-auth-payments/template/tsconfig.json +27 -33
  218. package/src/templates/web/ui-auth-payments-ai/template/next.config.js +14 -12
  219. package/src/templates/web/ui-auth-payments-ai/template/package.json +17 -33
  220. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.mjs +8 -0
  221. package/src/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -67
  222. package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +85 -85
  223. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +4 -1
  224. package/src/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -20
  225. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +5 -2
  226. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.json +27 -33
  227. package/src/templates/web/ui-auth-payments-audio/template/next.config.js +14 -12
  228. package/src/templates/web/ui-auth-payments-audio/template/package.json +17 -30
  229. package/src/templates/web/ui-auth-payments-audio/template/postcss.config.mjs +8 -0
  230. package/src/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -67
  231. package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +85 -85
  232. package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +4 -1
  233. package/src/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -20
  234. package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +5 -2
  235. package/src/templates/web/ui-auth-payments-audio/template/tsconfig.json +27 -33
  236. package/src/templates/web/ui-auth-payments-video/template/next.config.js +14 -12
  237. package/src/templates/web/ui-auth-payments-video/template/package.json +17 -30
  238. package/src/templates/web/ui-auth-payments-video/template/postcss.config.mjs +8 -0
  239. package/src/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -67
  240. package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +89 -221
  241. package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +4 -1
  242. package/src/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -20
  243. package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +5 -2
  244. package/src/templates/web/ui-auth-payments-video/template/tsconfig.json +27 -33
  245. package/src/templates/web/ui-only/template/next.config.js +14 -12
  246. package/src/templates/web/ui-only/template/package.json +15 -25
  247. package/src/templates/web/ui-only/template/postcss.config.mjs +8 -0
  248. package/src/templates/web/ui-only/template/src/app/error.tsx +67 -67
  249. package/src/templates/web/ui-only/template/src/app/globals.css +85 -31
  250. package/src/templates/web/ui-only/template/src/app/layout.tsx +4 -1
  251. package/src/templates/web/ui-only/template/src/app/loading.tsx +20 -20
  252. package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +20 -26
  253. package/src/templates/web/ui-only/template/tsconfig.json +27 -33
  254. package/dist/templates/web/ai-platform/template/middleware.ts +0 -55
  255. package/dist/templates/web/ai-platform/template/src/lib/supabase/client.ts +0 -8
  256. package/dist/templates/web/ai-platform/template/src/lib/supabase/server.ts +0 -27
  257. package/dist/templates/web/base/template/postcss.config.js +0 -7
  258. package/dist/templates/web/base/template/tailwind.config.js +0 -77
  259. package/dist/templates/web/iot-dashboard/template/middleware.ts +0 -56
  260. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +0 -8
  261. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +0 -27
  262. package/dist/templates/web/marketplace/template/middleware.ts +0 -56
  263. package/dist/templates/web/marketplace/template/src/lib/supabase/client.ts +0 -8
  264. package/dist/templates/web/marketplace/template/src/lib/supabase/server.ts +0 -27
  265. package/dist/templates/web/micro-saas/template/middleware.ts +0 -53
  266. package/dist/templates/web/micro-saas/template/src/lib/supabase/client.ts +0 -8
  267. package/dist/templates/web/micro-saas/template/src/lib/supabase/server.ts +0 -29
  268. package/dist/templates/web/ui-auth/template/.claude +0 -21
  269. package/dist/templates/web/ui-auth/template/context.md +0 -105
  270. package/dist/templates/web/ui-auth/template/postcss.config.js +0 -7
  271. package/dist/templates/web/ui-auth/template/tailwind.config.js +0 -77
  272. package/dist/templates/web/ui-auth-ai/template/postcss.config.js +0 -6
  273. package/dist/templates/web/ui-auth-ai/template/tailwind.config.js +0 -22
  274. package/dist/templates/web/ui-auth-payments/template/middleware.ts +0 -68
  275. package/dist/templates/web/ui-auth-payments/template/package-lock.json +0 -12240
  276. package/dist/templates/web/ui-auth-payments/template/postcss.config.js +0 -7
  277. package/dist/templates/web/ui-auth-payments/template/tailwind.config.js +0 -77
  278. package/dist/templates/web/ui-auth-payments/template/tsconfig.tsbuildinfo +0 -1
  279. package/dist/templates/web/ui-auth-payments-ai/template/.claude +0 -21
  280. package/dist/templates/web/ui-auth-payments-ai/template/context.md +0 -169
  281. package/dist/templates/web/ui-auth-payments-ai/template/middleware.ts +0 -68
  282. package/dist/templates/web/ui-auth-payments-ai/template/package-lock.json +0 -12241
  283. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.js +0 -7
  284. package/dist/templates/web/ui-auth-payments-ai/template/tailwind.config.js +0 -77
  285. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +0 -1
  286. package/dist/templates/web/ui-auth-payments-audio/template/middleware.ts +0 -68
  287. package/dist/templates/web/ui-auth-payments-audio/template/package-lock.json +0 -12241
  288. package/dist/templates/web/ui-auth-payments-audio/template/postcss.config.js +0 -7
  289. package/dist/templates/web/ui-auth-payments-audio/template/tailwind.config.js +0 -77
  290. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.tsbuildinfo +0 -1
  291. package/dist/templates/web/ui-auth-payments-video/template/postcss.config.js +0 -7
  292. package/dist/templates/web/ui-auth-payments-video/template/tailwind.config.js +0 -77
  293. package/dist/templates/web/ui-only/template/postcss.config.js +0 -7
  294. package/dist/templates/web/ui-only/template/tailwind.config.js +0 -77
  295. package/src/templates/web/ai-platform/template/middleware.ts +0 -55
  296. package/src/templates/web/ai-platform/template/src/lib/supabase/client.ts +0 -8
  297. package/src/templates/web/ai-platform/template/src/lib/supabase/server.ts +0 -27
  298. package/src/templates/web/base/template/postcss.config.js +0 -7
  299. package/src/templates/web/base/template/tailwind.config.js +0 -77
  300. package/src/templates/web/iot-dashboard/template/middleware.ts +0 -56
  301. package/src/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +0 -8
  302. package/src/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +0 -27
  303. package/src/templates/web/marketplace/template/middleware.ts +0 -56
  304. package/src/templates/web/marketplace/template/src/lib/supabase/client.ts +0 -8
  305. package/src/templates/web/marketplace/template/src/lib/supabase/server.ts +0 -27
  306. package/src/templates/web/micro-saas/template/middleware.ts +0 -53
  307. package/src/templates/web/micro-saas/template/src/lib/supabase/client.ts +0 -8
  308. package/src/templates/web/micro-saas/template/src/lib/supabase/server.ts +0 -29
  309. package/src/templates/web/ui-auth/template/.claude +0 -21
  310. package/src/templates/web/ui-auth/template/context.md +0 -105
  311. package/src/templates/web/ui-auth/template/postcss.config.js +0 -7
  312. package/src/templates/web/ui-auth/template/tailwind.config.js +0 -77
  313. package/src/templates/web/ui-auth-ai/template/postcss.config.js +0 -6
  314. package/src/templates/web/ui-auth-ai/template/tailwind.config.js +0 -22
  315. package/src/templates/web/ui-auth-payments/template/middleware.ts +0 -68
  316. package/src/templates/web/ui-auth-payments/template/package-lock.json +0 -12240
  317. package/src/templates/web/ui-auth-payments/template/postcss.config.js +0 -7
  318. package/src/templates/web/ui-auth-payments/template/tailwind.config.js +0 -77
  319. package/src/templates/web/ui-auth-payments/template/tsconfig.tsbuildinfo +0 -1
  320. package/src/templates/web/ui-auth-payments-ai/template/.claude +0 -21
  321. package/src/templates/web/ui-auth-payments-ai/template/context.md +0 -169
  322. package/src/templates/web/ui-auth-payments-ai/template/middleware.ts +0 -68
  323. package/src/templates/web/ui-auth-payments-ai/template/package-lock.json +0 -12241
  324. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.js +0 -7
  325. package/src/templates/web/ui-auth-payments-ai/template/tailwind.config.js +0 -77
  326. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +0 -1
  327. package/src/templates/web/ui-auth-payments-audio/template/middleware.ts +0 -68
  328. package/src/templates/web/ui-auth-payments-audio/template/package-lock.json +0 -12241
  329. package/src/templates/web/ui-auth-payments-audio/template/postcss.config.js +0 -7
  330. package/src/templates/web/ui-auth-payments-audio/template/tailwind.config.js +0 -77
  331. package/src/templates/web/ui-auth-payments-audio/template/tsconfig.tsbuildinfo +0 -1
  332. package/src/templates/web/ui-auth-payments-video/template/postcss.config.js +0 -7
  333. package/src/templates/web/ui-auth-payments-video/template/tailwind.config.js +0 -77
  334. package/src/templates/web/ui-only/template/postcss.config.js +0 -7
  335. package/src/templates/web/ui-only/template/tailwind.config.js +0 -77
  336. /package/dist/templates/shared/admin/web/{components → src/components}/admin-nav.tsx +0 -0
  337. /package/dist/templates/shared/auth/keycloak/web/{auth.config.ts → src/auth.config.ts} +0 -0
  338. /package/dist/templates/shared/auth/keycloak/web/{auth.ts → src/auth.ts} +0 -0
  339. /package/dist/templates/shared/middleware/web/{middleware.ts → src/middleware.ts} +0 -0
  340. /package/src/templates/shared/admin/web/{components → src/components}/admin-nav.tsx +0 -0
  341. /package/src/templates/shared/auth/keycloak/web/{auth.config.ts → src/auth.config.ts} +0 -0
  342. /package/src/templates/shared/auth/keycloak/web/{auth.ts → src/auth.ts} +0 -0
  343. /package/src/templates/shared/middleware/web/{middleware.ts → src/middleware.ts} +0 -0
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { ThemeProvider } from 'next-themes'
4
4
  import { Toaster } from '@digilogiclabs/saas-factory-ui'
5
+ import { DLLProvider } from '@digilogiclabs/app-sdk'
5
6
 
6
7
  interface AppProvidersProps {
7
8
  children: React.ReactNode
@@ -10,8 +11,10 @@ interface AppProvidersProps {
10
11
  export function AppProviders({ children }: AppProvidersProps) {
11
12
  return (
12
13
  <ThemeProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
13
- {children}
14
- <Toaster />
14
+ <DLLProvider>
15
+ {children}
16
+ <Toaster />
17
+ </DLLProvider>
15
18
  </ThemeProvider>
16
19
  )
17
20
  }
@@ -1,33 +1,27 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es5",
4
- "lib": ["dom", "dom.iterable", "es6"],
5
- "allowJs": true,
6
- "skipLibCheck": true,
7
- "strict": true,
8
- "noEmit": true,
9
- "esModuleInterop": true,
10
- "module": "esnext",
11
- "moduleResolution": "bundler",
12
- "resolveJsonModule": true,
13
- "isolatedModules": true,
14
- "jsx": "preserve",
15
- "incremental": true,
16
- "plugins": [
17
- {
18
- "name": "next"
19
- }
20
- ],
21
- "baseUrl": ".",
22
- "paths": {
23
- "@/*": ["./src/*"],
24
- "@/components/*": ["./src/components/*"],
25
- "@/lib/*": ["./src/lib/*"],
26
- "@/hooks/*": ["./src/hooks/*"],
27
- "@/types/*": ["./src/types/*"]
28
- }
29
- },
30
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
31
- "exclude": ["node_modules"]
32
- }
33
-
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "preserve",
15
+ "incremental": true,
16
+ "plugins": [
17
+ {
18
+ "name": "next"
19
+ }
20
+ ],
21
+ "paths": {
22
+ "@/*": ["./src/*"]
23
+ }
24
+ },
25
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26
+ "exclude": ["node_modules"]
27
+ }
@@ -1,14 +1,14 @@
1
- /** @type {import('next').NextConfig} */
2
- const nextConfig = {
3
- reactStrictMode: true,
4
- images: {
5
- remotePatterns: [
6
- {
7
- protocol: 'https',
8
- hostname: '**.supabase.co',
9
- },
10
- ],
11
- },
12
- }
13
-
14
- module.exports = nextConfig
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ reactStrictMode: true,
4
+ images: {
5
+ remotePatterns: [
6
+ {
7
+ protocol: 'https',
8
+ hostname: '**',
9
+ },
10
+ ],
11
+ },
12
+ }
13
+
14
+ module.exports = nextConfig
@@ -8,39 +8,35 @@
8
8
  "build": "next build",
9
9
  "start": "next start",
10
10
  "lint": "next lint",
11
- "type-check": "tsc --noEmit",
12
- "test": "vitest",
13
- "test:run": "vitest run"
11
+ "type-check": "tsc --noEmit"
14
12
  },
15
13
  "dependencies": {
16
- "next": "^15.0.0",
14
+ "next": "^15.5.0",
17
15
  "react": "^19.0.0",
18
16
  "react-dom": "^19.0.0",
19
- "@digilogiclabs/platform-core": "^1.13.0",
20
- "@digilogiclabs/app-sdk": "^1.0.0",
21
- "@digilogiclabs/saas-factory-ui": "^1.4.0",
22
- "tailwindcss": "^4.0.0",
23
- "clsx": "^2.0.0",
17
+ "@digilogiclabs/platform-core": "^1.14.0",
18
+ "@digilogiclabs/app-sdk": "^1.1.0",
19
+ "@digilogiclabs/saas-factory-ui": "^1.8.1",
20
+ "tailwindcss": "^4.1.0",
21
+ "@tailwindcss/postcss": "^4.1.0",
22
+ "clsx": "^2.1.0",
24
23
  "class-variance-authority": "^0.7.0",
25
- "tailwind-merge": "^2.0.0",
24
+ "tailwind-merge": "^2.6.0",
26
25
  "next-themes": "^0.4.0",
27
26
  "lucide-react": "^0.460.0",
28
27
  "zod": "^4.1.0",
29
28
  "zustand": "^4.5.0",
30
- "recharts": "^2.13.0",
29
+ "recharts": "^2.14.0",
31
30
  "date-fns": "^4.1.0"
32
31
  },
33
32
  "devDependencies": {
34
- "typescript": "^5.7.0",
33
+ "typescript": "^5.8.0",
35
34
  "@types/node": "^22.0.0",
36
35
  "@types/react": "^19.0.0",
37
36
  "@types/react-dom": "^19.0.0",
38
37
  "eslint": "^9.0.0",
39
38
  "eslint-config-next": "^15.0.0",
40
- "prettier": "^3.4.0",
41
- "vitest": "^2.1.0",
42
- "@testing-library/react": "^16.0.0",
43
- "@testing-library/jest-dom": "^6.6.0"
39
+ "prettier": "^3.4.0"
44
40
  },
45
41
  "engines": {
46
42
  "node": ">=20.0.0"
@@ -0,0 +1,8 @@
1
+ /** @type {import('postcss-load-config').Config} */
2
+ const config = {
3
+ plugins: {
4
+ '@tailwindcss/postcss': {},
5
+ },
6
+ };
7
+
8
+ export default config;
@@ -1,224 +1,224 @@
1
- 'use client'
2
-
3
- import { useState, useEffect } from 'react'
4
- import { Button, Card, PulseIndicator } from '@digilogiclabs/saas-factory-ui'
5
- import { Cpu, Activity, Signal, Bell, AlertTriangle, CheckCircle, Clock, ThermometerSun, Gauge, Wifi, Plus } from 'lucide-react'
6
- import Link from 'next/link'
7
-
8
- // Simulated real-time data
9
- const generateTelemetryData = () => ({
10
- temperature: (20 + Math.random() * 10).toFixed(1),
11
- pressure: (100 + Math.random() * 20).toFixed(1),
12
- humidity: (40 + Math.random() * 30).toFixed(0),
13
- signalStrength: (-50 - Math.random() * 40).toFixed(0),
14
- })
15
-
16
- const DEVICES = [
17
- { id: 1, name: 'Sensor Hub A1', type: 'Gateway', status: 'online', lastSeen: '2 min ago' },
18
- { id: 2, name: 'Temp Sensor T-001', type: 'Temperature', status: 'online', lastSeen: '1 min ago' },
19
- { id: 3, name: 'Pressure Gauge P-001', type: 'Pressure', status: 'online', lastSeen: '3 min ago' },
20
- { id: 4, name: 'Motion Detector M-001', type: 'Motion', status: 'offline', lastSeen: '15 min ago' },
21
- { id: 5, name: 'Humidity Sensor H-001', type: 'Humidity', status: 'online', lastSeen: '30 sec ago' },
22
- ]
23
-
24
- const RECENT_ALERTS = [
25
- { id: 1, message: 'Temperature threshold exceeded on T-001', severity: 'warning', time: '5 min ago' },
26
- { id: 2, message: 'Motion Detector M-001 offline', severity: 'error', time: '15 min ago' },
27
- { id: 3, message: 'System backup completed', severity: 'info', time: '1 hour ago' },
28
- ]
29
-
30
- export default function DashboardPage() {
31
- const [telemetry, setTelemetry] = useState(generateTelemetryData())
32
-
33
- // Simulate real-time updates
34
- useEffect(() => {
35
- const interval = setInterval(() => {
36
- setTelemetry(generateTelemetryData())
37
- }, 3000)
38
- return () => clearInterval(interval)
39
- }, [])
40
-
41
- const onlineDevices = DEVICES.filter(d => d.status === 'online').length
42
- const offlineDevices = DEVICES.filter(d => d.status === 'offline').length
43
-
44
- return (
45
- <div className="min-h-screen bg-slate-50 dark:bg-slate-900">
46
- {/* Header */}
47
- <header className="bg-white dark:bg-slate-800 border-b border-slate-200 dark:border-slate-700 px-6 py-4">
48
- <div className="flex items-center justify-between">
49
- <div>
50
- <h1 className="text-2xl font-bold text-slate-900 dark:text-white">Dashboard</h1>
51
- <p className="text-slate-600 dark:text-slate-400 text-sm">Real-time IoT monitoring</p>
52
- </div>
53
- <Link href="/devices/new">
54
- <Button className="bg-emerald-600 hover:bg-emerald-700">
55
- <Plus className="w-4 h-4 mr-2" />
56
- Add Device
57
- </Button>
58
- </Link>
59
- </div>
60
- </header>
61
-
62
- <div className="p-6">
63
- {/* Stats */}
64
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
65
- <Card className="p-6">
66
- <div className="flex items-center justify-between">
67
- <div>
68
- <p className="text-sm text-slate-600 dark:text-slate-400">Total Devices</p>
69
- <p className="text-3xl font-bold text-slate-900 dark:text-white">{DEVICES.length}</p>
70
- </div>
71
- <div className="w-12 h-12 bg-emerald-100 dark:bg-emerald-900/30 rounded-lg flex items-center justify-center">
72
- <Cpu className="w-6 h-6 text-emerald-600" />
73
- </div>
74
- </div>
75
- </Card>
76
-
77
- <Card className="p-6">
78
- <div className="flex items-center justify-between">
79
- <div>
80
- <p className="text-sm text-slate-600 dark:text-slate-400">Online</p>
81
- <p className="text-3xl font-bold text-green-600">{onlineDevices}</p>
82
- </div>
83
- <div className="w-12 h-12 bg-green-100 dark:bg-green-900/30 rounded-lg flex items-center justify-center">
84
- <CheckCircle className="w-6 h-6 text-green-600" />
85
- </div>
86
- </div>
87
- </Card>
88
-
89
- <Card className="p-6">
90
- <div className="flex items-center justify-between">
91
- <div>
92
- <p className="text-sm text-slate-600 dark:text-slate-400">Offline</p>
93
- <p className="text-3xl font-bold text-red-600">{offlineDevices}</p>
94
- </div>
95
- <div className="w-12 h-12 bg-red-100 dark:bg-red-900/30 rounded-lg flex items-center justify-center">
96
- <AlertTriangle className="w-6 h-6 text-red-600" />
97
- </div>
98
- </div>
99
- </Card>
100
-
101
- <Card className="p-6">
102
- <div className="flex items-center justify-between">
103
- <div>
104
- <p className="text-sm text-slate-600 dark:text-slate-400">Active Alerts</p>
105
- <p className="text-3xl font-bold text-amber-600">{RECENT_ALERTS.length}</p>
106
- </div>
107
- <div className="w-12 h-12 bg-amber-100 dark:bg-amber-900/30 rounded-lg flex items-center justify-center">
108
- <Bell className="w-6 h-6 text-amber-600" />
109
- </div>
110
- </div>
111
- </Card>
112
- </div>
113
-
114
- {/* Live Telemetry */}
115
- <div className="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
116
- <Card className="p-6">
117
- <h2 className="text-lg font-semibold text-slate-900 dark:text-white mb-6 flex items-center">
118
- <Activity className="w-5 h-5 mr-2 text-emerald-600" />
119
- Live Telemetry
120
- </h2>
121
- <div className="grid grid-cols-2 gap-4">
122
- <div className="p-4 bg-slate-100 dark:bg-slate-700/50 rounded-lg">
123
- <div className="flex items-center gap-2 mb-2">
124
- <ThermometerSun className="w-4 h-4 text-orange-500" />
125
- <span className="text-sm text-slate-600 dark:text-slate-400">Temperature</span>
126
- </div>
127
- <p className="text-2xl font-bold text-slate-900 dark:text-white">{telemetry.temperature}°C</p>
128
- </div>
129
- <div className="p-4 bg-slate-100 dark:bg-slate-700/50 rounded-lg">
130
- <div className="flex items-center gap-2 mb-2">
131
- <Gauge className="w-4 h-4 text-blue-500" />
132
- <span className="text-sm text-slate-600 dark:text-slate-400">Pressure</span>
133
- </div>
134
- <p className="text-2xl font-bold text-slate-900 dark:text-white">{telemetry.pressure} kPa</p>
135
- </div>
136
- <div className="p-4 bg-slate-100 dark:bg-slate-700/50 rounded-lg">
137
- <div className="flex items-center gap-2 mb-2">
138
- <Activity className="w-4 h-4 text-cyan-500" />
139
- <span className="text-sm text-slate-600 dark:text-slate-400">Humidity</span>
140
- </div>
141
- <p className="text-2xl font-bold text-slate-900 dark:text-white">{telemetry.humidity}%</p>
142
- </div>
143
- <div className="p-4 bg-slate-100 dark:bg-slate-700/50 rounded-lg">
144
- <div className="flex items-center gap-2 mb-2">
145
- <Signal className="w-4 h-4 text-purple-500" />
146
- <span className="text-sm text-slate-600 dark:text-slate-400">Signal</span>
147
- </div>
148
- <p className="text-2xl font-bold text-slate-900 dark:text-white">{telemetry.signalStrength} dBm</p>
149
- </div>
150
- </div>
151
- </Card>
152
-
153
- <Card className="p-6">
154
- <h2 className="text-lg font-semibold text-slate-900 dark:text-white mb-6 flex items-center">
155
- <Bell className="w-5 h-5 mr-2 text-amber-600" />
156
- Recent Alerts
157
- </h2>
158
- <div className="space-y-4">
159
- {RECENT_ALERTS.map((alert) => (
160
- <div key={alert.id} className="flex items-start gap-3 p-3 bg-slate-100 dark:bg-slate-700/50 rounded-lg">
161
- <div className={`w-2 h-2 rounded-full mt-2 ${
162
- alert.severity === 'error' ? 'bg-red-500' :
163
- alert.severity === 'warning' ? 'bg-amber-500' :
164
- 'bg-blue-500'
165
- }`} />
166
- <div className="flex-1">
167
- <p className="text-sm text-slate-900 dark:text-white">{alert.message}</p>
168
- <p className="text-xs text-slate-500 mt-1">{alert.time}</p>
169
- </div>
170
- </div>
171
- ))}
172
- </div>
173
- </Card>
174
- </div>
175
-
176
- {/* Device List */}
177
- <Card className="p-6">
178
- <div className="flex items-center justify-between mb-6">
179
- <h2 className="text-lg font-semibold text-slate-900 dark:text-white flex items-center">
180
- <Cpu className="w-5 h-5 mr-2 text-emerald-600" />
181
- Devices
182
- </h2>
183
- <Link href="/devices">
184
- <Button variant="outline" size="sm">View All</Button>
185
- </Link>
186
- </div>
187
- <div className="overflow-x-auto">
188
- <table className="w-full">
189
- <thead>
190
- <tr className="border-b border-slate-200 dark:border-slate-700">
191
- <th className="text-left py-3 px-4 text-sm font-medium text-slate-600 dark:text-slate-400">Name</th>
192
- <th className="text-left py-3 px-4 text-sm font-medium text-slate-600 dark:text-slate-400">Type</th>
193
- <th className="text-left py-3 px-4 text-sm font-medium text-slate-600 dark:text-slate-400">Status</th>
194
- <th className="text-left py-3 px-4 text-sm font-medium text-slate-600 dark:text-slate-400">Last Seen</th>
195
- </tr>
196
- </thead>
197
- <tbody>
198
- {DEVICES.map((device) => (
199
- <tr key={device.id} className="border-b border-slate-100 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/50">
200
- <td className="py-3 px-4">
201
- <span className="font-medium text-slate-900 dark:text-white">{device.name}</span>
202
- </td>
203
- <td className="py-3 px-4 text-slate-600 dark:text-slate-400">{device.type}</td>
204
- <td className="py-3 px-4">
205
- <PulseIndicator
206
- status={device.status === 'online' ? 'success' : 'error'}
207
- label={device.status}
208
- size="sm"
209
- />
210
- </td>
211
- <td className="py-3 px-4 text-slate-600 dark:text-slate-400 flex items-center">
212
- <Clock className="w-3 h-3 mr-1" />
213
- {device.lastSeen}
214
- </td>
215
- </tr>
216
- ))}
217
- </tbody>
218
- </table>
219
- </div>
220
- </Card>
221
- </div>
222
- </div>
223
- )
224
- }
1
+ 'use client'
2
+
3
+ import { useState, useEffect } from 'react'
4
+ import { Button, Card, PulseIndicator } from '@digilogiclabs/saas-factory-ui'
5
+ import { Cpu, Activity, Signal, Bell, AlertTriangle, CheckCircle, Clock, ThermometerSun, Gauge, Wifi, Plus } from 'lucide-react'
6
+ import Link from 'next/link'
7
+
8
+ // Simulated real-time data
9
+ const generateTelemetryData = () => ({
10
+ temperature: (20 + Math.random() * 10).toFixed(1),
11
+ pressure: (100 + Math.random() * 20).toFixed(1),
12
+ humidity: (40 + Math.random() * 30).toFixed(0),
13
+ signalStrength: (-50 - Math.random() * 40).toFixed(0),
14
+ })
15
+
16
+ const DEVICES = [
17
+ { id: 1, name: 'Sensor Hub A1', type: 'Gateway', status: 'online', lastSeen: '2 min ago' },
18
+ { id: 2, name: 'Temp Sensor T-001', type: 'Temperature', status: 'online', lastSeen: '1 min ago' },
19
+ { id: 3, name: 'Pressure Gauge P-001', type: 'Pressure', status: 'online', lastSeen: '3 min ago' },
20
+ { id: 4, name: 'Motion Detector M-001', type: 'Motion', status: 'offline', lastSeen: '15 min ago' },
21
+ { id: 5, name: 'Humidity Sensor H-001', type: 'Humidity', status: 'online', lastSeen: '30 sec ago' },
22
+ ]
23
+
24
+ const RECENT_ALERTS = [
25
+ { id: 1, message: 'Temperature threshold exceeded on T-001', severity: 'warning', time: '5 min ago' },
26
+ { id: 2, message: 'Motion Detector M-001 offline', severity: 'error', time: '15 min ago' },
27
+ { id: 3, message: 'System backup completed', severity: 'info', time: '1 hour ago' },
28
+ ]
29
+
30
+ export default function DashboardPage() {
31
+ const [telemetry, setTelemetry] = useState(generateTelemetryData())
32
+
33
+ // Simulate real-time updates
34
+ useEffect(() => {
35
+ const interval = setInterval(() => {
36
+ setTelemetry(generateTelemetryData())
37
+ }, 3000)
38
+ return () => clearInterval(interval)
39
+ }, [])
40
+
41
+ const onlineDevices = DEVICES.filter(d => d.status === 'online').length
42
+ const offlineDevices = DEVICES.filter(d => d.status === 'offline').length
43
+
44
+ return (
45
+ <div className="min-h-screen bg-background">
46
+ {/* Header */}
47
+ <header className="bg-card border-b border-border px-6 py-4">
48
+ <div className="flex items-center justify-between">
49
+ <div>
50
+ <h1 className="text-2xl font-bold text-foreground">Dashboard</h1>
51
+ <p className="text-muted-foreground text-sm">Real-time IoT monitoring</p>
52
+ </div>
53
+ <Link href="/devices/new">
54
+ <Button>
55
+ <Plus className="w-4 h-4 mr-2" />
56
+ Add Device
57
+ </Button>
58
+ </Link>
59
+ </div>
60
+ </header>
61
+
62
+ <div className="p-6">
63
+ {/* Stats */}
64
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
65
+ <Card className="p-6">
66
+ <div className="flex items-center justify-between">
67
+ <div>
68
+ <p className="text-sm text-muted-foreground">Total Devices</p>
69
+ <p className="text-3xl font-bold text-foreground">{DEVICES.length}</p>
70
+ </div>
71
+ <div className="w-12 h-12 bg-primary/10 rounded-lg flex items-center justify-center">
72
+ <Cpu className="w-6 h-6 text-primary" />
73
+ </div>
74
+ </div>
75
+ </Card>
76
+
77
+ <Card className="p-6">
78
+ <div className="flex items-center justify-between">
79
+ <div>
80
+ <p className="text-sm text-muted-foreground">Online</p>
81
+ <p className="text-3xl font-bold text-green-600">{onlineDevices}</p>
82
+ </div>
83
+ <div className="w-12 h-12 bg-green-100 dark:bg-green-900/30 rounded-lg flex items-center justify-center">
84
+ <CheckCircle className="w-6 h-6 text-green-600" />
85
+ </div>
86
+ </div>
87
+ </Card>
88
+
89
+ <Card className="p-6">
90
+ <div className="flex items-center justify-between">
91
+ <div>
92
+ <p className="text-sm text-muted-foreground">Offline</p>
93
+ <p className="text-3xl font-bold text-destructive">{offlineDevices}</p>
94
+ </div>
95
+ <div className="w-12 h-12 bg-destructive/10 rounded-lg flex items-center justify-center">
96
+ <AlertTriangle className="w-6 h-6 text-destructive" />
97
+ </div>
98
+ </div>
99
+ </Card>
100
+
101
+ <Card className="p-6">
102
+ <div className="flex items-center justify-between">
103
+ <div>
104
+ <p className="text-sm text-muted-foreground">Active Alerts</p>
105
+ <p className="text-3xl font-bold text-amber-600">{RECENT_ALERTS.length}</p>
106
+ </div>
107
+ <div className="w-12 h-12 bg-amber-100 dark:bg-amber-900/30 rounded-lg flex items-center justify-center">
108
+ <Bell className="w-6 h-6 text-amber-600" />
109
+ </div>
110
+ </div>
111
+ </Card>
112
+ </div>
113
+
114
+ {/* Live Telemetry */}
115
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
116
+ <Card className="p-6">
117
+ <h2 className="text-lg font-semibold text-foreground mb-6 flex items-center">
118
+ <Activity className="w-5 h-5 mr-2 text-primary" />
119
+ Live Telemetry
120
+ </h2>
121
+ <div className="grid grid-cols-2 gap-4">
122
+ <div className="p-4 bg-muted rounded-lg">
123
+ <div className="flex items-center gap-2 mb-2">
124
+ <ThermometerSun className="w-4 h-4 text-orange-500" />
125
+ <span className="text-sm text-muted-foreground">Temperature</span>
126
+ </div>
127
+ <p className="text-2xl font-bold text-foreground">{telemetry.temperature}°C</p>
128
+ </div>
129
+ <div className="p-4 bg-muted rounded-lg">
130
+ <div className="flex items-center gap-2 mb-2">
131
+ <Gauge className="w-4 h-4 text-blue-500" />
132
+ <span className="text-sm text-muted-foreground">Pressure</span>
133
+ </div>
134
+ <p className="text-2xl font-bold text-foreground">{telemetry.pressure} kPa</p>
135
+ </div>
136
+ <div className="p-4 bg-muted rounded-lg">
137
+ <div className="flex items-center gap-2 mb-2">
138
+ <Activity className="w-4 h-4 text-cyan-500" />
139
+ <span className="text-sm text-muted-foreground">Humidity</span>
140
+ </div>
141
+ <p className="text-2xl font-bold text-foreground">{telemetry.humidity}%</p>
142
+ </div>
143
+ <div className="p-4 bg-muted rounded-lg">
144
+ <div className="flex items-center gap-2 mb-2">
145
+ <Signal className="w-4 h-4 text-purple-500" />
146
+ <span className="text-sm text-muted-foreground">Signal</span>
147
+ </div>
148
+ <p className="text-2xl font-bold text-foreground">{telemetry.signalStrength} dBm</p>
149
+ </div>
150
+ </div>
151
+ </Card>
152
+
153
+ <Card className="p-6">
154
+ <h2 className="text-lg font-semibold text-foreground mb-6 flex items-center">
155
+ <Bell className="w-5 h-5 mr-2 text-amber-600" />
156
+ Recent Alerts
157
+ </h2>
158
+ <div className="space-y-4">
159
+ {RECENT_ALERTS.map((alert) => (
160
+ <div key={alert.id} className="flex items-start gap-3 p-3 bg-muted rounded-lg">
161
+ <div className={`w-2 h-2 rounded-full mt-2 ${
162
+ alert.severity === 'error' ? 'bg-red-500' :
163
+ alert.severity === 'warning' ? 'bg-amber-500' :
164
+ 'bg-blue-500'
165
+ }`} />
166
+ <div className="flex-1">
167
+ <p className="text-sm text-foreground">{alert.message}</p>
168
+ <p className="text-xs text-muted-foreground mt-1">{alert.time}</p>
169
+ </div>
170
+ </div>
171
+ ))}
172
+ </div>
173
+ </Card>
174
+ </div>
175
+
176
+ {/* Device List */}
177
+ <Card className="p-6">
178
+ <div className="flex items-center justify-between mb-6">
179
+ <h2 className="text-lg font-semibold text-foreground flex items-center">
180
+ <Cpu className="w-5 h-5 mr-2 text-primary" />
181
+ Devices
182
+ </h2>
183
+ <Link href="/devices">
184
+ <Button variant="outline" size="sm">View All</Button>
185
+ </Link>
186
+ </div>
187
+ <div className="overflow-x-auto">
188
+ <table className="w-full">
189
+ <thead>
190
+ <tr className="border-b border-border">
191
+ <th className="text-left py-3 px-4 text-sm font-medium text-muted-foreground">Name</th>
192
+ <th className="text-left py-3 px-4 text-sm font-medium text-muted-foreground">Type</th>
193
+ <th className="text-left py-3 px-4 text-sm font-medium text-muted-foreground">Status</th>
194
+ <th className="text-left py-3 px-4 text-sm font-medium text-muted-foreground">Last Seen</th>
195
+ </tr>
196
+ </thead>
197
+ <tbody>
198
+ {DEVICES.map((device) => (
199
+ <tr key={device.id} className="border-b border-border/50 hover:bg-muted/50">
200
+ <td className="py-3 px-4">
201
+ <span className="font-medium text-foreground">{device.name}</span>
202
+ </td>
203
+ <td className="py-3 px-4 text-muted-foreground">{device.type}</td>
204
+ <td className="py-3 px-4">
205
+ <PulseIndicator
206
+ status={device.status === 'online' ? 'success' : 'error'}
207
+ label={device.status}
208
+ size="sm"
209
+ />
210
+ </td>
211
+ <td className="py-3 px-4 text-muted-foreground flex items-center">
212
+ <Clock className="w-3 h-3 mr-1" />
213
+ {device.lastSeen}
214
+ </td>
215
+ </tr>
216
+ ))}
217
+ </tbody>
218
+ </table>
219
+ </div>
220
+ </Card>
221
+ </div>
222
+ </div>
223
+ )
224
+ }