@digilogiclabs/create-saas-app 2.0.0 → 2.2.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 (348) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +975 -891
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/generators/template-generator.d.ts +11 -0
  5. package/dist/generators/template-generator.d.ts.map +1 -1
  6. package/dist/generators/template-generator.js +389 -18
  7. package/dist/generators/template-generator.js.map +1 -1
  8. package/dist/index.js +1837 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/templates/infrastructure/kubernetes/base/template/README.md +253 -0
  11. package/dist/templates/infrastructure/kubernetes/base/template/configmap.yaml +12 -0
  12. package/dist/templates/infrastructure/kubernetes/base/template/deployment.yaml +123 -0
  13. package/dist/templates/infrastructure/kubernetes/base/template/hpa.yaml +45 -0
  14. package/dist/templates/infrastructure/kubernetes/base/template/ingress.yaml +31 -0
  15. package/dist/templates/infrastructure/kubernetes/base/template/kustomization.yaml +25 -0
  16. package/dist/templates/infrastructure/kubernetes/base/template/namespace.yaml +8 -0
  17. package/dist/templates/infrastructure/kubernetes/base/template/networkpolicy.yaml +48 -0
  18. package/dist/templates/infrastructure/kubernetes/base/template/pdb.yaml +14 -0
  19. package/dist/templates/infrastructure/kubernetes/base/template/secret.yaml +17 -0
  20. package/dist/templates/infrastructure/kubernetes/base/template/service.yaml +19 -0
  21. package/dist/templates/infrastructure/kubernetes/base/template/serviceaccount.yaml +9 -0
  22. package/dist/templates/infrastructure/kubernetes/production/template/kustomization.yaml +92 -0
  23. package/dist/templates/infrastructure/terraform/aws/template/README.md +156 -0
  24. package/dist/templates/infrastructure/terraform/aws/template/main.tf +343 -0
  25. package/dist/templates/infrastructure/terraform/aws/template/outputs.tf +66 -0
  26. package/dist/templates/infrastructure/terraform/aws/template/terraform.tfvars.example +28 -0
  27. package/dist/templates/infrastructure/terraform/aws/template/variables.tf +110 -0
  28. package/dist/templates/infrastructure/terraform/gcp/template/README.md +165 -0
  29. package/dist/templates/infrastructure/terraform/gcp/template/main.tf +397 -0
  30. package/dist/templates/infrastructure/terraform/gcp/template/outputs.tf +51 -0
  31. package/dist/templates/infrastructure/terraform/gcp/template/terraform.tfvars.example +29 -0
  32. package/dist/templates/infrastructure/terraform/gcp/template/variables.tf +115 -0
  33. package/dist/templates/shared/admin/web/app/admin/layout.tsx +34 -0
  34. package/dist/templates/shared/admin/web/components/admin-nav.tsx +48 -0
  35. package/dist/templates/shared/audit/web/lib/audit.ts +24 -0
  36. package/dist/templates/shared/auth/keycloak/web/app/api/auth/federated-logout/route.ts +173 -0
  37. package/dist/templates/shared/auth/keycloak/web/auth.config.ts +84 -0
  38. package/dist/templates/shared/auth/keycloak/web/auth.ts +26 -0
  39. package/dist/templates/shared/beta/web/app/api/beta-settings/route.ts +25 -0
  40. package/dist/templates/shared/beta/web/app/api/validate-beta-code/route.ts +67 -0
  41. package/dist/templates/shared/beta/web/lib/beta/settings.ts +31 -0
  42. package/dist/templates/shared/cache/web/lib/cache.ts +44 -0
  43. package/dist/templates/shared/config/web/lib/config.ts +112 -0
  44. package/dist/templates/shared/config/web/next.config.mjs +62 -0
  45. package/dist/templates/shared/contact/web/app/api/contact/route.ts +113 -0
  46. package/dist/templates/shared/contact/web/app/contact/page.tsx +195 -0
  47. package/dist/templates/shared/cookie-consent/web/components/cookie-consent.tsx +54 -0
  48. package/dist/templates/shared/database/postgresql/web/drizzle.config.ts +16 -0
  49. package/dist/templates/shared/database/postgresql/web/lib/db/drizzle.ts +39 -0
  50. package/dist/templates/shared/database/postgresql/web/lib/db/schema.ts +33 -0
  51. package/dist/templates/shared/database/supabase/web/lib/supabase/client.ts +12 -0
  52. package/dist/templates/shared/database/supabase/web/lib/supabase/server.ts +31 -0
  53. package/dist/templates/shared/database/supabase/web/lib/supabase/service.ts +15 -0
  54. package/dist/templates/shared/email/web/lib/email/branding.ts +18 -0
  55. package/dist/templates/shared/email/web/lib/email/client.ts +96 -0
  56. package/dist/templates/shared/error-pages/web/app/error.tsx +70 -0
  57. package/dist/templates/shared/error-pages/web/app/global-error.tsx +102 -0
  58. package/dist/templates/shared/error-pages/web/app/not-found.tsx +39 -0
  59. package/dist/templates/shared/health/web/app/api/health/route.ts +68 -0
  60. package/dist/templates/shared/legal/web/app/(legal)/privacy/page.tsx +205 -0
  61. package/dist/templates/shared/legal/web/app/(legal)/terms/page.tsx +154 -0
  62. package/dist/templates/shared/legal/web/lib/legal-config.ts +50 -0
  63. package/dist/templates/shared/loading/web/app/loading.tsx +5 -0
  64. package/dist/templates/shared/loading/web/components/skeleton.tsx +95 -0
  65. package/dist/templates/shared/middleware/web/middleware.ts +68 -0
  66. package/dist/templates/shared/observability/web/lib/observability.ts +135 -0
  67. package/dist/templates/shared/payments/web/app/api/webhooks/stripe/route.ts +109 -0
  68. package/dist/templates/shared/platform/web/lib/platform.ts +37 -0
  69. package/dist/templates/shared/redis/web/lib/rate-limit-store.ts +18 -0
  70. package/dist/templates/shared/redis/web/lib/redis.ts +48 -0
  71. package/dist/templates/shared/security/web/lib/api-security.ts +318 -0
  72. package/dist/templates/shared/seo/web/app/api/og/route.tsx +97 -0
  73. package/dist/templates/shared/seo/web/app/robots.ts +53 -0
  74. package/dist/templates/shared/seo/web/app/sitemap.ts +53 -0
  75. package/dist/templates/shared/utils/web/lib/api-response.ts +71 -0
  76. package/dist/templates/shared/utils/web/lib/utils.ts +85 -0
  77. package/dist/templates/web/ai-platform/template/.env.example +16 -0
  78. package/dist/templates/web/ai-platform/template/README.md +84 -0
  79. package/dist/templates/web/ai-platform/template/middleware.ts +55 -0
  80. package/dist/templates/web/ai-platform/template/next.config.js +14 -0
  81. package/dist/templates/web/ai-platform/template/package.json +55 -0
  82. package/dist/templates/web/ai-platform/template/src/app/api/chat/route.ts +54 -0
  83. package/dist/templates/web/ai-platform/template/src/app/chat/page.tsx +235 -0
  84. package/dist/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -0
  85. package/dist/templates/web/ai-platform/template/src/app/globals.css +34 -0
  86. package/dist/templates/web/ai-platform/template/src/app/layout.tsx +27 -0
  87. package/dist/templates/web/ai-platform/template/src/app/page.tsx +203 -0
  88. package/dist/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +27 -0
  89. package/dist/templates/web/ai-platform/template/src/lib/auth-server.ts +33 -0
  90. package/dist/templates/web/ai-platform/template/src/lib/supabase/client.ts +8 -0
  91. package/dist/templates/web/ai-platform/template/src/lib/supabase/server.ts +27 -0
  92. package/dist/templates/web/ai-platform/template/src/lib/utils.ts +6 -0
  93. package/dist/templates/web/ai-platform/template/tsconfig.json +27 -0
  94. package/dist/templates/web/iot-dashboard/template/.env.example +12 -0
  95. package/dist/templates/web/iot-dashboard/template/README.md +101 -0
  96. package/dist/templates/web/iot-dashboard/template/middleware.ts +56 -0
  97. package/dist/templates/web/iot-dashboard/template/next.config.js +14 -0
  98. package/dist/templates/web/iot-dashboard/template/package.json +49 -0
  99. package/dist/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +229 -0
  100. package/dist/templates/web/iot-dashboard/template/src/app/globals.css +20 -0
  101. package/dist/templates/web/iot-dashboard/template/src/app/layout.tsx +27 -0
  102. package/dist/templates/web/iot-dashboard/template/src/app/page.tsx +191 -0
  103. package/dist/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +24 -0
  104. package/dist/templates/web/iot-dashboard/template/src/lib/auth-server.ts +33 -0
  105. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +8 -0
  106. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +27 -0
  107. package/dist/templates/web/iot-dashboard/template/src/lib/utils.ts +25 -0
  108. package/dist/templates/web/iot-dashboard/template/tsconfig.json +27 -0
  109. package/dist/templates/web/marketplace/template/.env.example +12 -0
  110. package/dist/templates/web/marketplace/template/README.md +66 -0
  111. package/dist/templates/web/marketplace/template/middleware.ts +56 -0
  112. package/dist/templates/web/marketplace/template/next.config.js +14 -0
  113. package/dist/templates/web/marketplace/template/package.json +51 -0
  114. package/dist/templates/web/marketplace/template/src/app/cart/page.tsx +147 -0
  115. package/dist/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -0
  116. package/dist/templates/web/marketplace/template/src/app/globals.css +20 -0
  117. package/dist/templates/web/marketplace/template/src/app/layout.tsx +27 -0
  118. package/dist/templates/web/marketplace/template/src/app/page.tsx +167 -0
  119. package/dist/templates/web/marketplace/template/src/app/products/page.tsx +129 -0
  120. package/dist/templates/web/marketplace/template/src/components/providers/app-providers.tsx +27 -0
  121. package/dist/templates/web/marketplace/template/src/lib/auth-server.ts +33 -0
  122. package/dist/templates/web/marketplace/template/src/lib/supabase/client.ts +8 -0
  123. package/dist/templates/web/marketplace/template/src/lib/supabase/server.ts +27 -0
  124. package/dist/templates/web/marketplace/template/src/lib/utils.ts +19 -0
  125. package/dist/templates/web/marketplace/template/tsconfig.json +27 -0
  126. package/dist/templates/web/micro-saas/template/.env.example +10 -0
  127. package/dist/templates/web/micro-saas/template/README.md +63 -0
  128. package/dist/templates/web/micro-saas/template/middleware.ts +53 -0
  129. package/dist/templates/web/micro-saas/template/next.config.js +14 -0
  130. package/dist/templates/web/micro-saas/template/package.json +41 -0
  131. package/dist/templates/web/micro-saas/template/src/app/dashboard/page.tsx +117 -0
  132. package/dist/templates/web/micro-saas/template/src/app/globals.css +20 -0
  133. package/dist/templates/web/micro-saas/template/src/app/layout.tsx +27 -0
  134. package/dist/templates/web/micro-saas/template/src/app/login/page.tsx +87 -0
  135. package/dist/templates/web/micro-saas/template/src/app/page.tsx +137 -0
  136. package/dist/templates/web/micro-saas/template/src/app/signup/page.tsx +108 -0
  137. package/dist/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +24 -0
  138. package/dist/templates/web/micro-saas/template/src/lib/auth-server.ts +33 -0
  139. package/dist/templates/web/micro-saas/template/src/lib/supabase/client.ts +8 -0
  140. package/dist/templates/web/micro-saas/template/src/lib/supabase/server.ts +29 -0
  141. package/dist/templates/web/micro-saas/template/src/lib/utils.ts +6 -0
  142. package/dist/templates/web/micro-saas/template/tsconfig.json +27 -0
  143. package/package.json +5 -4
  144. package/src/templates/infrastructure/kubernetes/base/template/README.md +253 -0
  145. package/src/templates/infrastructure/kubernetes/base/template/configmap.yaml +12 -0
  146. package/src/templates/infrastructure/kubernetes/base/template/deployment.yaml +123 -0
  147. package/src/templates/infrastructure/kubernetes/base/template/hpa.yaml +45 -0
  148. package/src/templates/infrastructure/kubernetes/base/template/ingress.yaml +31 -0
  149. package/src/templates/infrastructure/kubernetes/base/template/kustomization.yaml +25 -0
  150. package/src/templates/infrastructure/kubernetes/base/template/namespace.yaml +8 -0
  151. package/src/templates/infrastructure/kubernetes/base/template/networkpolicy.yaml +48 -0
  152. package/src/templates/infrastructure/kubernetes/base/template/pdb.yaml +14 -0
  153. package/src/templates/infrastructure/kubernetes/base/template/secret.yaml +17 -0
  154. package/src/templates/infrastructure/kubernetes/base/template/service.yaml +19 -0
  155. package/src/templates/infrastructure/kubernetes/base/template/serviceaccount.yaml +9 -0
  156. package/src/templates/infrastructure/kubernetes/production/template/kustomization.yaml +92 -0
  157. package/src/templates/infrastructure/terraform/aws/template/README.md +156 -0
  158. package/src/templates/infrastructure/terraform/aws/template/main.tf +343 -0
  159. package/src/templates/infrastructure/terraform/aws/template/outputs.tf +66 -0
  160. package/src/templates/infrastructure/terraform/aws/template/terraform.tfvars.example +28 -0
  161. package/src/templates/infrastructure/terraform/aws/template/variables.tf +110 -0
  162. package/src/templates/infrastructure/terraform/gcp/template/README.md +165 -0
  163. package/src/templates/infrastructure/terraform/gcp/template/main.tf +397 -0
  164. package/src/templates/infrastructure/terraform/gcp/template/outputs.tf +51 -0
  165. package/src/templates/infrastructure/terraform/gcp/template/terraform.tfvars.example +29 -0
  166. package/src/templates/infrastructure/terraform/gcp/template/variables.tf +115 -0
  167. package/src/templates/shared/admin/web/app/admin/layout.tsx +34 -0
  168. package/src/templates/shared/admin/web/components/admin-nav.tsx +48 -0
  169. package/src/templates/shared/audit/web/lib/audit.ts +24 -0
  170. package/src/templates/shared/auth/keycloak/web/app/api/auth/federated-logout/route.ts +173 -0
  171. package/src/templates/shared/auth/keycloak/web/auth.config.ts +84 -0
  172. package/src/templates/shared/auth/keycloak/web/auth.ts +26 -0
  173. package/src/templates/shared/beta/web/app/api/beta-settings/route.ts +25 -0
  174. package/src/templates/shared/beta/web/app/api/validate-beta-code/route.ts +67 -0
  175. package/src/templates/shared/beta/web/lib/beta/settings.ts +31 -0
  176. package/src/templates/shared/cache/web/lib/cache.ts +44 -0
  177. package/src/templates/shared/config/web/lib/config.ts +112 -0
  178. package/src/templates/shared/config/web/next.config.mjs +62 -0
  179. package/src/templates/shared/contact/web/app/api/contact/route.ts +113 -0
  180. package/src/templates/shared/contact/web/app/contact/page.tsx +195 -0
  181. package/src/templates/shared/cookie-consent/web/components/cookie-consent.tsx +54 -0
  182. package/src/templates/shared/database/postgresql/web/drizzle.config.ts +16 -0
  183. package/src/templates/shared/database/postgresql/web/lib/db/drizzle.ts +39 -0
  184. package/src/templates/shared/database/postgresql/web/lib/db/schema.ts +33 -0
  185. package/src/templates/shared/database/supabase/web/lib/supabase/client.ts +12 -0
  186. package/src/templates/shared/database/supabase/web/lib/supabase/server.ts +31 -0
  187. package/src/templates/shared/database/supabase/web/lib/supabase/service.ts +15 -0
  188. package/src/templates/shared/email/web/lib/email/branding.ts +18 -0
  189. package/src/templates/shared/email/web/lib/email/client.ts +96 -0
  190. package/src/templates/shared/error-pages/web/app/error.tsx +70 -0
  191. package/src/templates/shared/error-pages/web/app/global-error.tsx +102 -0
  192. package/src/templates/shared/error-pages/web/app/not-found.tsx +39 -0
  193. package/src/templates/shared/health/web/app/api/health/route.ts +68 -0
  194. package/src/templates/shared/legal/web/app/(legal)/privacy/page.tsx +205 -0
  195. package/src/templates/shared/legal/web/app/(legal)/terms/page.tsx +154 -0
  196. package/src/templates/shared/legal/web/lib/legal-config.ts +50 -0
  197. package/src/templates/shared/loading/web/app/loading.tsx +5 -0
  198. package/src/templates/shared/loading/web/components/skeleton.tsx +95 -0
  199. package/src/templates/shared/middleware/web/middleware.ts +68 -0
  200. package/src/templates/shared/observability/web/lib/observability.ts +135 -0
  201. package/src/templates/shared/payments/web/app/api/webhooks/stripe/route.ts +109 -0
  202. package/src/templates/shared/platform/web/lib/platform.ts +37 -0
  203. package/src/templates/shared/redis/web/lib/rate-limit-store.ts +18 -0
  204. package/src/templates/shared/redis/web/lib/redis.ts +48 -0
  205. package/src/templates/shared/security/web/lib/api-security.ts +318 -0
  206. package/src/templates/shared/seo/web/app/api/og/route.tsx +97 -0
  207. package/src/templates/shared/seo/web/app/robots.ts +53 -0
  208. package/src/templates/shared/seo/web/app/sitemap.ts +53 -0
  209. package/src/templates/shared/utils/web/lib/api-response.ts +71 -0
  210. package/src/templates/shared/utils/web/lib/utils.ts +85 -0
  211. package/src/templates/web/ai-platform/template/.env.example +16 -0
  212. package/src/templates/web/ai-platform/template/README.md +84 -0
  213. package/src/templates/web/ai-platform/template/middleware.ts +55 -0
  214. package/src/templates/web/ai-platform/template/next.config.js +14 -0
  215. package/src/templates/web/ai-platform/template/package.json +55 -0
  216. package/src/templates/web/ai-platform/template/src/app/api/chat/route.ts +54 -0
  217. package/src/templates/web/ai-platform/template/src/app/chat/page.tsx +235 -0
  218. package/src/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -0
  219. package/src/templates/web/ai-platform/template/src/app/globals.css +34 -0
  220. package/src/templates/web/ai-platform/template/src/app/layout.tsx +27 -0
  221. package/src/templates/web/ai-platform/template/src/app/page.tsx +203 -0
  222. package/src/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +27 -0
  223. package/src/templates/web/ai-platform/template/src/lib/auth-server.ts +33 -0
  224. package/src/templates/web/ai-platform/template/src/lib/supabase/client.ts +8 -0
  225. package/src/templates/web/ai-platform/template/src/lib/supabase/server.ts +27 -0
  226. package/src/templates/web/ai-platform/template/src/lib/utils.ts +6 -0
  227. package/src/templates/web/ai-platform/template/tsconfig.json +27 -0
  228. package/src/templates/web/iot-dashboard/template/.env.example +12 -0
  229. package/src/templates/web/iot-dashboard/template/README.md +101 -0
  230. package/src/templates/web/iot-dashboard/template/middleware.ts +56 -0
  231. package/src/templates/web/iot-dashboard/template/next.config.js +14 -0
  232. package/src/templates/web/iot-dashboard/template/package.json +49 -0
  233. package/src/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +229 -0
  234. package/src/templates/web/iot-dashboard/template/src/app/globals.css +20 -0
  235. package/src/templates/web/iot-dashboard/template/src/app/layout.tsx +27 -0
  236. package/src/templates/web/iot-dashboard/template/src/app/page.tsx +191 -0
  237. package/src/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +24 -0
  238. package/src/templates/web/iot-dashboard/template/src/lib/auth-server.ts +33 -0
  239. package/src/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +8 -0
  240. package/src/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +27 -0
  241. package/src/templates/web/iot-dashboard/template/src/lib/utils.ts +25 -0
  242. package/src/templates/web/iot-dashboard/template/tsconfig.json +27 -0
  243. package/src/templates/web/marketplace/template/.env.example +12 -0
  244. package/src/templates/web/marketplace/template/README.md +66 -0
  245. package/src/templates/web/marketplace/template/middleware.ts +56 -0
  246. package/src/templates/web/marketplace/template/next.config.js +14 -0
  247. package/src/templates/web/marketplace/template/package.json +51 -0
  248. package/src/templates/web/marketplace/template/src/app/cart/page.tsx +147 -0
  249. package/src/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -0
  250. package/src/templates/web/marketplace/template/src/app/globals.css +20 -0
  251. package/src/templates/web/marketplace/template/src/app/layout.tsx +27 -0
  252. package/src/templates/web/marketplace/template/src/app/page.tsx +167 -0
  253. package/src/templates/web/marketplace/template/src/app/products/page.tsx +129 -0
  254. package/src/templates/web/marketplace/template/src/components/providers/app-providers.tsx +27 -0
  255. package/src/templates/web/marketplace/template/src/lib/auth-server.ts +33 -0
  256. package/src/templates/web/marketplace/template/src/lib/supabase/client.ts +8 -0
  257. package/src/templates/web/marketplace/template/src/lib/supabase/server.ts +27 -0
  258. package/src/templates/web/marketplace/template/src/lib/utils.ts +19 -0
  259. package/src/templates/web/marketplace/template/tsconfig.json +27 -0
  260. package/src/templates/web/micro-saas/template/.env.example +10 -0
  261. package/src/templates/web/micro-saas/template/README.md +63 -0
  262. package/src/templates/web/micro-saas/template/middleware.ts +53 -0
  263. package/src/templates/web/micro-saas/template/next.config.js +14 -0
  264. package/src/templates/web/micro-saas/template/package.json +41 -0
  265. package/src/templates/web/micro-saas/template/src/app/dashboard/page.tsx +117 -0
  266. package/src/templates/web/micro-saas/template/src/app/globals.css +20 -0
  267. package/src/templates/web/micro-saas/template/src/app/layout.tsx +27 -0
  268. package/src/templates/web/micro-saas/template/src/app/login/page.tsx +87 -0
  269. package/src/templates/web/micro-saas/template/src/app/page.tsx +137 -0
  270. package/src/templates/web/micro-saas/template/src/app/signup/page.tsx +108 -0
  271. package/src/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +24 -0
  272. package/src/templates/web/micro-saas/template/src/lib/auth-server.ts +33 -0
  273. package/src/templates/web/micro-saas/template/src/lib/supabase/client.ts +8 -0
  274. package/src/templates/web/micro-saas/template/src/lib/supabase/server.ts +29 -0
  275. package/src/templates/web/micro-saas/template/src/lib/utils.ts +6 -0
  276. package/src/templates/web/micro-saas/template/tsconfig.json +27 -0
  277. package/dist/cli/commands/add.d.ts +0 -6
  278. package/dist/cli/commands/add.d.ts.map +0 -1
  279. package/dist/cli/commands/add.js +0 -39
  280. package/dist/cli/commands/add.js.map +0 -1
  281. package/dist/cli/commands/create.d.ts +0 -45
  282. package/dist/cli/commands/create.d.ts.map +0 -1
  283. package/dist/cli/commands/create.js +0 -175
  284. package/dist/cli/commands/create.js.map +0 -1
  285. package/dist/cli/commands/index.d.ts +0 -4
  286. package/dist/cli/commands/index.d.ts.map +0 -1
  287. package/dist/cli/commands/index.js +0 -20
  288. package/dist/cli/commands/index.js.map +0 -1
  289. package/dist/cli/commands/update.d.ts +0 -6
  290. package/dist/cli/commands/update.d.ts.map +0 -1
  291. package/dist/cli/commands/update.js +0 -68
  292. package/dist/cli/commands/update.js.map +0 -1
  293. package/dist/cli/index.d.ts +0 -4
  294. package/dist/cli/index.d.ts.map +0 -1
  295. package/dist/cli/index.js +0 -61
  296. package/dist/cli/index.js.map +0 -1
  297. package/dist/cli/prompts/index.d.ts +0 -2
  298. package/dist/cli/prompts/index.d.ts.map +0 -1
  299. package/dist/cli/prompts/index.js +0 -18
  300. package/dist/cli/prompts/index.js.map +0 -1
  301. package/dist/cli/prompts/project-setup.d.ts +0 -5
  302. package/dist/cli/prompts/project-setup.d.ts.map +0 -1
  303. package/dist/cli/prompts/project-setup.js +0 -316
  304. package/dist/cli/prompts/project-setup.js.map +0 -1
  305. package/dist/cli/utils/git.d.ts +0 -9
  306. package/dist/cli/utils/git.d.ts.map +0 -1
  307. package/dist/cli/utils/git.js +0 -77
  308. package/dist/cli/utils/git.js.map +0 -1
  309. package/dist/cli/utils/index.d.ts +0 -5
  310. package/dist/cli/utils/index.d.ts.map +0 -1
  311. package/dist/cli/utils/index.js +0 -21
  312. package/dist/cli/utils/index.js.map +0 -1
  313. package/dist/cli/utils/logger.d.ts +0 -16
  314. package/dist/cli/utils/logger.d.ts.map +0 -1
  315. package/dist/cli/utils/logger.js +0 -55
  316. package/dist/cli/utils/logger.js.map +0 -1
  317. package/dist/cli/utils/package-manager.d.ts +0 -8
  318. package/dist/cli/utils/package-manager.d.ts.map +0 -1
  319. package/dist/cli/utils/package-manager.js +0 -92
  320. package/dist/cli/utils/package-manager.js.map +0 -1
  321. package/dist/cli/utils/spinner.d.ts +0 -7
  322. package/dist/cli/utils/spinner.d.ts.map +0 -1
  323. package/dist/cli/utils/spinner.js +0 -48
  324. package/dist/cli/utils/spinner.js.map +0 -1
  325. package/dist/cli/validators/dependencies.d.ts +0 -15
  326. package/dist/cli/validators/dependencies.d.ts.map +0 -1
  327. package/dist/cli/validators/dependencies.js +0 -108
  328. package/dist/cli/validators/dependencies.js.map +0 -1
  329. package/dist/cli/validators/index.d.ts +0 -3
  330. package/dist/cli/validators/index.d.ts.map +0 -1
  331. package/dist/cli/validators/index.js +0 -19
  332. package/dist/cli/validators/index.js.map +0 -1
  333. package/dist/cli/validators/project-name.d.ts +0 -5
  334. package/dist/cli/validators/project-name.d.ts.map +0 -1
  335. package/dist/cli/validators/project-name.js +0 -151
  336. package/dist/cli/validators/project-name.js.map +0 -1
  337. package/dist/generators/file-processor.d.ts +0 -28
  338. package/dist/generators/file-processor.d.ts.map +0 -1
  339. package/dist/generators/file-processor.js +0 -224
  340. package/dist/generators/file-processor.js.map +0 -1
  341. package/dist/generators/index.d.ts +0 -4
  342. package/dist/generators/index.d.ts.map +0 -1
  343. package/dist/generators/index.js +0 -20
  344. package/dist/generators/index.js.map +0 -1
  345. package/dist/generators/package-installer.d.ts +0 -29
  346. package/dist/generators/package-installer.d.ts.map +0 -1
  347. package/dist/generators/package-installer.js +0 -177
  348. package/dist/generators/package-installer.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ import { redirect } from 'next/navigation'
2
+ import { createClient } from './supabase/server'
3
+
4
+ export interface AuthUser {
5
+ id: string
6
+ email: string | null
7
+ name?: string | null
8
+ }
9
+
10
+ export async function getUser(): Promise<AuthUser | null> {
11
+ const supabase = await createClient()
12
+ const { data: { user }, error } = await supabase.auth.getUser()
13
+
14
+ if (error || !user) {
15
+ return null
16
+ }
17
+
18
+ return {
19
+ id: user.id,
20
+ email: user.email ?? null,
21
+ name: user.user_metadata?.name ?? user.user_metadata?.full_name ?? null,
22
+ }
23
+ }
24
+
25
+ export async function requireAuth(): Promise<AuthUser> {
26
+ const user = await getUser()
27
+
28
+ if (!user) {
29
+ redirect('/login')
30
+ }
31
+
32
+ return user
33
+ }
@@ -0,0 +1,8 @@
1
+ import { createBrowserClient } from '@supabase/ssr'
2
+
3
+ export function createClient() {
4
+ return createBrowserClient(
5
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
6
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
7
+ )
8
+ }
@@ -0,0 +1,27 @@
1
+ import { createServerClient } from '@supabase/ssr'
2
+ import { cookies } from 'next/headers'
3
+
4
+ export async function createClient() {
5
+ const cookieStore = await cookies()
6
+
7
+ return createServerClient(
8
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
9
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
10
+ {
11
+ cookies: {
12
+ getAll() {
13
+ return cookieStore.getAll()
14
+ },
15
+ setAll(cookiesToSet) {
16
+ try {
17
+ cookiesToSet.forEach(({ name, value, options }) =>
18
+ cookieStore.set(name, value, options)
19
+ )
20
+ } catch {
21
+ // Server Component context
22
+ }
23
+ },
24
+ },
25
+ }
26
+ )
27
+ }
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from 'clsx'
2
+ import { twMerge } from 'tailwind-merge'
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
@@ -0,0 +1,27 @@
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
+ }
@@ -0,0 +1,12 @@
1
+ # Supabase Configuration
2
+ NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
3
+ NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
4
+ SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
5
+
6
+ # MQTT Configuration (optional)
7
+ MQTT_BROKER_URL=mqtt://localhost:1883
8
+ MQTT_USERNAME=
9
+ MQTT_PASSWORD=
10
+
11
+ # Application
12
+ NEXT_PUBLIC_APP_URL=http://localhost:3000
@@ -0,0 +1,101 @@
1
+ # {{titleCaseName}}
2
+
3
+ {{description}} - An IoT device monitoring and management dashboard.
4
+
5
+ ## Features
6
+
7
+ - **Device Management** - Monitor and control all your IoT devices
8
+ - **Real-time Telemetry** - Live data streams with updates every few seconds
9
+ - **Smart Alerts** - Configurable notifications for critical events
10
+ - **Analytics** - Historical data analysis and trends
11
+ - **Responsive Design** - Works on desktop and mobile
12
+
13
+ ## Quick Start
14
+
15
+ 1. **Install dependencies:**
16
+ ```bash
17
+ npm install
18
+ ```
19
+
20
+ 2. **Set up environment variables:**
21
+ ```bash
22
+ cp .env.example .env.local
23
+ ```
24
+ Update with your Supabase credentials.
25
+
26
+ 3. **Run the development server:**
27
+ ```bash
28
+ npm run dev
29
+ ```
30
+
31
+ 4. **Open [http://localhost:3000](http://localhost:3000)**
32
+
33
+ ## Tech Stack
34
+
35
+ - **Framework:** Next.js 15
36
+ - **Language:** TypeScript
37
+ - **Styling:** Tailwind CSS
38
+ - **Auth:** Supabase
39
+ - **Charts:** Recharts
40
+ - **UI Components:** @digilogiclabs/saas-factory-ui
41
+
42
+ ## Project Structure
43
+
44
+ ```
45
+ src/
46
+ ├── app/ # Next.js App Router pages
47
+ │ ├── dashboard/ # Main IoT dashboard
48
+ │ ├── devices/ # Device management
49
+ │ ├── analytics/ # Data analytics
50
+ │ └── alerts/ # Alert management
51
+ ├── components/ # React components
52
+ │ ├── iot/ # IoT-specific components
53
+ │ └── providers/ # Context providers
54
+ └── lib/ # Utilities and helpers
55
+ ```
56
+
57
+ ## Database Schema
58
+
59
+ Set up the following tables in Supabase:
60
+
61
+ ```sql
62
+ -- Devices table
63
+ create table devices (
64
+ id uuid primary key default gen_random_uuid(),
65
+ name text not null,
66
+ type text not null,
67
+ status text default 'offline',
68
+ last_seen timestamp with time zone,
69
+ metadata jsonb default '{}',
70
+ user_id uuid references auth.users(id),
71
+ created_at timestamp with time zone default now()
72
+ );
73
+
74
+ -- Telemetry table
75
+ create table telemetry (
76
+ id uuid primary key default gen_random_uuid(),
77
+ device_id uuid references devices(id),
78
+ data jsonb not null,
79
+ timestamp timestamp with time zone default now()
80
+ );
81
+
82
+ -- Alerts table
83
+ create table alerts (
84
+ id uuid primary key default gen_random_uuid(),
85
+ device_id uuid references devices(id),
86
+ message text not null,
87
+ severity text not null,
88
+ acknowledged boolean default false,
89
+ created_at timestamp with time zone default now()
90
+ );
91
+ ```
92
+
93
+ ## Deployment
94
+
95
+ Deploy to Vercel with one click:
96
+
97
+ [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new)
98
+
99
+ ## License
100
+
101
+ MIT - Built with DLL Platform
@@ -0,0 +1,56 @@
1
+ import { createServerClient } from '@supabase/ssr'
2
+ import { NextResponse, type NextRequest } from 'next/server'
3
+
4
+ export async function middleware(request: NextRequest) {
5
+ let supabaseResponse = NextResponse.next({
6
+ request,
7
+ })
8
+
9
+ const supabase = createServerClient(
10
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
11
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
12
+ {
13
+ cookies: {
14
+ getAll() {
15
+ return request.cookies.getAll()
16
+ },
17
+ setAll(cookiesToSet) {
18
+ cookiesToSet.forEach(({ name, value }) =>
19
+ request.cookies.set(name, value)
20
+ )
21
+ supabaseResponse = NextResponse.next({
22
+ request,
23
+ })
24
+ cookiesToSet.forEach(({ name, value, options }) =>
25
+ supabaseResponse.cookies.set(name, value, options)
26
+ )
27
+ },
28
+ },
29
+ }
30
+ )
31
+
32
+ const {
33
+ data: { user },
34
+ } = await supabase.auth.getUser()
35
+
36
+ // Redirect to login if accessing protected route without auth
37
+ if (
38
+ !user &&
39
+ (request.nextUrl.pathname.startsWith('/dashboard') ||
40
+ request.nextUrl.pathname.startsWith('/devices') ||
41
+ request.nextUrl.pathname.startsWith('/analytics') ||
42
+ request.nextUrl.pathname.startsWith('/alerts'))
43
+ ) {
44
+ const url = request.nextUrl.clone()
45
+ url.pathname = '/login'
46
+ return NextResponse.redirect(url)
47
+ }
48
+
49
+ return supabaseResponse
50
+ }
51
+
52
+ export const config = {
53
+ matcher: [
54
+ '/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)',
55
+ ],
56
+ }
@@ -0,0 +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
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "{{packageName}}",
3
+ "version": "0.1.0",
4
+ "description": "{{description}} - IoT Dashboard",
5
+ "private": true,
6
+ "scripts": {
7
+ "dev": "next dev",
8
+ "build": "next build",
9
+ "start": "next start",
10
+ "lint": "next lint",
11
+ "type-check": "tsc --noEmit",
12
+ "test": "vitest",
13
+ "test:run": "vitest run"
14
+ },
15
+ "dependencies": {
16
+ "next": "^15.0.0",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "@digilogiclabs/platform-core": "^1.1.0",
20
+ "@digilogiclabs/app-sdk": "^1.0.0",
21
+ "@digilogiclabs/saas-factory-auth": "^1.0.7",
22
+ "@digilogiclabs/saas-factory-ui": "^1.0.1",
23
+ "tailwindcss": "^4.0.0",
24
+ "clsx": "^2.0.0",
25
+ "class-variance-authority": "^0.7.0",
26
+ "tailwind-merge": "^2.0.0",
27
+ "next-themes": "^0.4.0",
28
+ "lucide-react": "^0.460.0",
29
+ "zod": "^3.22.4",
30
+ "zustand": "^4.5.0",
31
+ "recharts": "^2.13.0",
32
+ "date-fns": "^4.1.0"
33
+ },
34
+ "devDependencies": {
35
+ "typescript": "^5.7.0",
36
+ "@types/node": "^22.0.0",
37
+ "@types/react": "^19.0.0",
38
+ "@types/react-dom": "^19.0.0",
39
+ "eslint": "^9.0.0",
40
+ "eslint-config-next": "^15.0.0",
41
+ "prettier": "^3.4.0",
42
+ "vitest": "^2.1.0",
43
+ "@testing-library/react": "^16.0.0",
44
+ "@testing-library/jest-dom": "^6.6.0"
45
+ },
46
+ "engines": {
47
+ "node": ">=20.0.0"
48
+ }
49
+ }
@@ -0,0 +1,229 @@
1
+ 'use client'
2
+
3
+ import { useState, useEffect } from 'react'
4
+ import { Button, Card } 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
+ <span className={`inline-flex items-center px-2 py-1 rounded-full text-xs ${
206
+ device.status === 'online'
207
+ ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'
208
+ : 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'
209
+ }`}>
210
+ <span className={`w-1.5 h-1.5 rounded-full mr-1.5 ${
211
+ device.status === 'online' ? 'bg-green-500' : 'bg-red-500'
212
+ }`} />
213
+ {device.status}
214
+ </span>
215
+ </td>
216
+ <td className="py-3 px-4 text-slate-600 dark:text-slate-400 flex items-center">
217
+ <Clock className="w-3 h-3 mr-1" />
218
+ {device.lastSeen}
219
+ </td>
220
+ </tr>
221
+ ))}
222
+ </tbody>
223
+ </table>
224
+ </div>
225
+ </Card>
226
+ </div>
227
+ </div>
228
+ )
229
+ }
@@ -0,0 +1,20 @@
1
+ @import "tailwindcss";
2
+
3
+ @theme {
4
+ --color-primary: oklch(55% 0.18 160);
5
+ --color-background: oklch(98% 0.01 256);
6
+ --color-foreground: oklch(15% 0.02 256);
7
+ --font-sans: 'Inter', system-ui, sans-serif;
8
+ --radius: 0.5rem;
9
+ }
10
+
11
+ .dark {
12
+ --color-background: oklch(15% 0.02 256);
13
+ --color-foreground: oklch(95% 0 0);
14
+ }
15
+
16
+ body {
17
+ font-family: var(--font-sans);
18
+ background-color: var(--color-background);
19
+ color: var(--color-foreground);
20
+ }
@@ -0,0 +1,27 @@
1
+ import type { Metadata } from 'next'
2
+ import { Inter } from 'next/font/google'
3
+ import './globals.css'
4
+ import { AppProviders } from '@/components/providers/app-providers'
5
+
6
+ const inter = Inter({ subsets: ['latin'] })
7
+
8
+ export const metadata: Metadata = {
9
+ title: '{{titleCaseName}} - IoT Dashboard',
10
+ description: '{{description}}',
11
+ }
12
+
13
+ export default function RootLayout({
14
+ children,
15
+ }: {
16
+ children: React.ReactNode
17
+ }) {
18
+ return (
19
+ <html lang="en" suppressHydrationWarning>
20
+ <body className={inter.className}>
21
+ <AppProviders>
22
+ {children}
23
+ </AppProviders>
24
+ </body>
25
+ </html>
26
+ )
27
+ }