@nextsparkjs/core 0.1.0-beta.84 → 0.1.0-beta.85

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 (356) hide show
  1. package/dist/styles/classes.json +1 -1
  2. package/dist/templates/app/(auth)/forgot-password/page.tsx +216 -0
  3. package/dist/templates/app/(auth)/layout.tsx +51 -0
  4. package/dist/templates/app/(auth)/login/page.tsx +21 -0
  5. package/dist/templates/app/(auth)/reset-password/page.tsx +212 -0
  6. package/dist/templates/app/(auth)/signup/page.tsx +21 -0
  7. package/dist/templates/app/(auth)/verify-email/page.tsx +190 -0
  8. package/dist/templates/app/(public)/[...slug]/page.tsx +378 -0
  9. package/dist/templates/app/(public)/docs/[section]/[page]/page.tsx +90 -0
  10. package/dist/templates/app/(public)/docs/layout.tsx +25 -0
  11. package/dist/templates/app/(public)/docs/page.tsx +81 -0
  12. package/dist/templates/app/(public)/layout.tsx +41 -0
  13. package/dist/templates/app/(public)/page.tsx +19 -0
  14. package/dist/templates/app/403/page.tsx +89 -0
  15. package/dist/templates/app/api/auth/[...all]/route.ts +78 -0
  16. package/dist/templates/app/api/cron/billing/lifecycle/route.ts +98 -0
  17. package/dist/templates/app/api/csp-report/route.ts +175 -0
  18. package/dist/templates/app/api/devtools/config/entities/route.ts +108 -0
  19. package/dist/templates/app/api/devtools/config/theme/route.ts +66 -0
  20. package/dist/templates/app/api/devtools/tests/[...path]/route.ts +130 -0
  21. package/dist/templates/app/api/devtools/tests/route.ts +134 -0
  22. package/dist/templates/app/api/health/route.ts +29 -0
  23. package/dist/templates/app/api/internal/user-metadata/route.ts +36 -0
  24. package/dist/templates/app/api/superadmin/subscriptions/route.ts +310 -0
  25. package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +286 -0
  26. package/dist/templates/app/api/superadmin/teams/route.ts +188 -0
  27. package/dist/templates/app/api/superadmin/users/[userId]/route.ts +540 -0
  28. package/dist/templates/app/api/superadmin/users/route.ts +323 -0
  29. package/dist/templates/app/api/user/delete-account/route.ts +55 -0
  30. package/dist/templates/app/api/user/plan-flags/route.ts +283 -0
  31. package/dist/templates/app/api/user/profile/route.ts +133 -0
  32. package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +210 -0
  33. package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +331 -0
  34. package/dist/templates/app/api/v1/[entity]/[id]/route.ts +35 -0
  35. package/dist/templates/app/api/v1/[entity]/docs.md +369 -0
  36. package/dist/templates/app/api/v1/[entity]/presets.ts +194 -0
  37. package/dist/templates/app/api/v1/[entity]/route.ts +31 -0
  38. package/dist/templates/app/api/v1/api-keys/[id]/route.ts +303 -0
  39. package/dist/templates/app/api/v1/api-keys/docs.md +101 -0
  40. package/dist/templates/app/api/v1/api-keys/presets.ts +31 -0
  41. package/dist/templates/app/api/v1/api-keys/route.ts +250 -0
  42. package/dist/templates/app/api/v1/auth/docs.md +184 -0
  43. package/dist/templates/app/api/v1/auth/presets.ts +44 -0
  44. package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +227 -0
  45. package/dist/templates/app/api/v1/billing/cancel/route.ts +206 -0
  46. package/dist/templates/app/api/v1/billing/change-plan/route.ts +97 -0
  47. package/dist/templates/app/api/v1/billing/check-action/route.ts +81 -0
  48. package/dist/templates/app/api/v1/billing/checkout/route.ts +124 -0
  49. package/dist/templates/app/api/v1/billing/docs.md +209 -0
  50. package/dist/templates/app/api/v1/billing/plans/route.ts +85 -0
  51. package/dist/templates/app/api/v1/billing/portal/route.ts +90 -0
  52. package/dist/templates/app/api/v1/billing/presets.ts +121 -0
  53. package/dist/templates/app/api/v1/billing/webhooks/stripe/route.ts +428 -0
  54. package/dist/templates/app/api/v1/blocks/[slug]/route.ts +29 -0
  55. package/dist/templates/app/api/v1/blocks/docs.md +173 -0
  56. package/dist/templates/app/api/v1/blocks/presets.ts +121 -0
  57. package/dist/templates/app/api/v1/blocks/route.ts +45 -0
  58. package/dist/templates/app/api/v1/blocks/validate/route.ts +45 -0
  59. package/dist/templates/app/api/v1/cron/docs.md +116 -0
  60. package/dist/templates/app/api/v1/cron/presets.ts +26 -0
  61. package/dist/templates/app/api/v1/cron/process/route.ts +108 -0
  62. package/dist/templates/app/api/v1/devtools/blocks/route.ts +82 -0
  63. package/dist/templates/app/api/v1/devtools/docs/route.ts +150 -0
  64. package/dist/templates/app/api/v1/devtools/docs.md +204 -0
  65. package/dist/templates/app/api/v1/devtools/features/route.ts +61 -0
  66. package/dist/templates/app/api/v1/devtools/flows/route.ts +61 -0
  67. package/dist/templates/app/api/v1/devtools/presets.ts +113 -0
  68. package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +120 -0
  69. package/dist/templates/app/api/v1/devtools/testing/route.ts +82 -0
  70. package/dist/templates/app/api/v1/media/docs.md +117 -0
  71. package/dist/templates/app/api/v1/media/presets.ts +24 -0
  72. package/dist/templates/app/api/v1/media/upload/route.ts +150 -0
  73. package/dist/templates/app/api/v1/patterns/[id]/usages/route.ts +116 -0
  74. package/dist/templates/app/api/v1/plugin/[...path]/route.ts +373 -0
  75. package/dist/templates/app/api/v1/plugin/docs.md +79 -0
  76. package/dist/templates/app/api/v1/plugin/presets.ts +21 -0
  77. package/dist/templates/app/api/v1/plugin/route.ts +96 -0
  78. package/dist/templates/app/api/v1/post-categories/[id]/route.ts +255 -0
  79. package/dist/templates/app/api/v1/post-categories/docs.md +134 -0
  80. package/dist/templates/app/api/v1/post-categories/presets.ts +78 -0
  81. package/dist/templates/app/api/v1/post-categories/route.ts +119 -0
  82. package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +179 -0
  83. package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +120 -0
  84. package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +89 -0
  85. package/dist/templates/app/api/v1/team-invitations/docs.md +88 -0
  86. package/dist/templates/app/api/v1/team-invitations/presets.ts +43 -0
  87. package/dist/templates/app/api/v1/team-invitations/route.ts +114 -0
  88. package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +171 -0
  89. package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +105 -0
  90. package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +125 -0
  91. package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +263 -0
  92. package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +358 -0
  93. package/dist/templates/app/api/v1/teams/[teamId]/route.ts +322 -0
  94. package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +50 -0
  95. package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +91 -0
  96. package/dist/templates/app/api/v1/teams/docs.md +320 -0
  97. package/dist/templates/app/api/v1/teams/presets.ts +178 -0
  98. package/dist/templates/app/api/v1/teams/route.ts +293 -0
  99. package/dist/templates/app/api/v1/teams/switch/route.ts +88 -0
  100. package/dist/templates/app/api/v1/theme/[...path]/route.ts +361 -0
  101. package/dist/templates/app/api/v1/theme/docs.md +74 -0
  102. package/dist/templates/app/api/v1/theme/presets.ts +21 -0
  103. package/dist/templates/app/api/v1/theme/route.ts +96 -0
  104. package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +363 -0
  105. package/dist/templates/app/api/v1/users/[id]/route.ts +302 -0
  106. package/dist/templates/app/api/v1/users/docs.md +93 -0
  107. package/dist/templates/app/api/v1/users/presets.ts +59 -0
  108. package/dist/templates/app/api/v1/users/route.ts +197 -0
  109. package/dist/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +117 -0
  110. package/dist/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +103 -0
  111. package/dist/templates/app/dashboard/(main)/[entity]/create/page.tsx +95 -0
  112. package/dist/templates/app/dashboard/(main)/[entity]/error.tsx +51 -0
  113. package/dist/templates/app/dashboard/(main)/[entity]/layout.tsx +113 -0
  114. package/dist/templates/app/dashboard/(main)/[entity]/loading.tsx +61 -0
  115. package/dist/templates/app/dashboard/(main)/[entity]/page.tsx +90 -0
  116. package/dist/templates/app/dashboard/(main)/layout.tsx +98 -0
  117. package/dist/templates/app/dashboard/(main)/loading.tsx +5 -0
  118. package/dist/templates/app/dashboard/(main)/page.tsx +201 -0
  119. package/dist/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +114 -0
  120. package/dist/templates/app/dashboard/(main)/patterns/[id]/page.tsx +20 -0
  121. package/dist/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +171 -0
  122. package/dist/templates/app/dashboard/(main)/patterns/create/page.tsx +86 -0
  123. package/dist/templates/app/dashboard/(main)/patterns/page.tsx +444 -0
  124. package/dist/templates/app/dashboard/features/analytics/page.tsx +35 -0
  125. package/dist/templates/app/dashboard/features/automation/page.tsx +35 -0
  126. package/dist/templates/app/dashboard/features/layout.tsx +13 -0
  127. package/dist/templates/app/dashboard/features/loading.tsx +5 -0
  128. package/dist/templates/app/dashboard/features/webhooks/page.tsx +35 -0
  129. package/dist/templates/app/dashboard/layout.tsx +86 -0
  130. package/dist/templates/app/dashboard/permission-denied/page.tsx +29 -0
  131. package/dist/templates/app/dashboard/settings/api-keys/loading.tsx +5 -0
  132. package/dist/templates/app/dashboard/settings/api-keys/page.tsx +513 -0
  133. package/dist/templates/app/dashboard/settings/billing/loading.tsx +5 -0
  134. package/dist/templates/app/dashboard/settings/billing/page.tsx +284 -0
  135. package/dist/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +222 -0
  136. package/dist/templates/app/dashboard/settings/invoices/loading.tsx +5 -0
  137. package/dist/templates/app/dashboard/settings/invoices/page.tsx +82 -0
  138. package/dist/templates/app/dashboard/settings/layout.tsx +151 -0
  139. package/dist/templates/app/dashboard/settings/loading.tsx +5 -0
  140. package/dist/templates/app/dashboard/settings/notifications/loading.tsx +5 -0
  141. package/dist/templates/app/dashboard/settings/notifications/page.tsx +462 -0
  142. package/dist/templates/app/dashboard/settings/page.tsx +92 -0
  143. package/dist/templates/app/dashboard/settings/password/loading.tsx +5 -0
  144. package/dist/templates/app/dashboard/settings/password/page.tsx +306 -0
  145. package/dist/templates/app/dashboard/settings/plans/loading.tsx +5 -0
  146. package/dist/templates/app/dashboard/settings/plans/page.tsx +40 -0
  147. package/dist/templates/app/dashboard/settings/profile/loading.tsx +5 -0
  148. package/dist/templates/app/dashboard/settings/profile/page.tsx +686 -0
  149. package/dist/templates/app/dashboard/settings/security/loading.tsx +5 -0
  150. package/dist/templates/app/dashboard/settings/security/page.tsx +505 -0
  151. package/dist/templates/app/dashboard/settings/teams/loading.tsx +5 -0
  152. package/dist/templates/app/dashboard/settings/teams/page.tsx +272 -0
  153. package/dist/templates/app/dashboard/settings/teams/permissions/page.tsx +92 -0
  154. package/dist/templates/app/devtools/blocks/[slug]/page.tsx +39 -0
  155. package/dist/templates/app/devtools/blocks/page.tsx +31 -0
  156. package/dist/templates/app/devtools/config/page.tsx +31 -0
  157. package/dist/templates/app/devtools/features/page.tsx +31 -0
  158. package/dist/templates/app/devtools/flows/page.tsx +31 -0
  159. package/dist/templates/app/devtools/layout.tsx +58 -0
  160. package/dist/templates/app/devtools/page.tsx +121 -0
  161. package/dist/templates/app/devtools/scheduled-actions/page.tsx +157 -0
  162. package/dist/templates/app/devtools/style/page.tsx +330 -0
  163. package/dist/templates/app/devtools/tags/page.tsx +31 -0
  164. package/dist/templates/app/devtools/tests/[[...path]]/page.tsx +47 -0
  165. package/dist/templates/app/favicon.ico +0 -0
  166. package/dist/templates/app/globals.css +12 -0
  167. package/dist/templates/app/layout.tsx +96 -0
  168. package/dist/templates/app/public/page.tsx +30 -0
  169. package/dist/templates/app/superadmin/docs/[section]/[page]/page.tsx +92 -0
  170. package/dist/templates/app/superadmin/docs/page.tsx +75 -0
  171. package/dist/templates/app/superadmin/layout.tsx +67 -0
  172. package/dist/templates/app/superadmin/page.tsx +149 -0
  173. package/dist/templates/app/superadmin/subscriptions/page.tsx +655 -0
  174. package/dist/templates/app/superadmin/team-roles/page.tsx +493 -0
  175. package/dist/templates/app/superadmin/teams/[teamId]/page.tsx +687 -0
  176. package/dist/templates/app/superadmin/teams/page.tsx +302 -0
  177. package/dist/templates/app/superadmin/users/[userId]/page.tsx +548 -0
  178. package/dist/templates/app/superadmin/users/page.tsx +528 -0
  179. package/package.json +2 -2
  180. package/templates/app/(auth)/forgot-password/page.tsx +216 -0
  181. package/templates/app/(auth)/layout.tsx +51 -0
  182. package/templates/app/(auth)/login/page.tsx +21 -0
  183. package/templates/app/(auth)/reset-password/page.tsx +212 -0
  184. package/templates/app/(auth)/signup/page.tsx +21 -0
  185. package/templates/app/(auth)/verify-email/page.tsx +190 -0
  186. package/templates/app/(public)/[...slug]/page.tsx +378 -0
  187. package/templates/app/(public)/docs/[section]/[page]/page.tsx +90 -0
  188. package/templates/app/(public)/docs/layout.tsx +25 -0
  189. package/templates/app/(public)/docs/page.tsx +81 -0
  190. package/templates/app/(public)/layout.tsx +41 -0
  191. package/templates/app/(public)/page.tsx +19 -0
  192. package/templates/app/403/page.tsx +89 -0
  193. package/templates/app/api/auth/[...all]/route.ts +78 -0
  194. package/templates/app/api/cron/billing/lifecycle/route.ts +98 -0
  195. package/templates/app/api/csp-report/route.ts +175 -0
  196. package/templates/app/api/devtools/config/entities/route.ts +108 -0
  197. package/templates/app/api/devtools/config/theme/route.ts +66 -0
  198. package/templates/app/api/devtools/tests/[...path]/route.ts +130 -0
  199. package/templates/app/api/devtools/tests/route.ts +134 -0
  200. package/templates/app/api/health/route.ts +29 -0
  201. package/templates/app/api/internal/user-metadata/route.ts +36 -0
  202. package/templates/app/api/superadmin/subscriptions/route.ts +310 -0
  203. package/templates/app/api/superadmin/teams/[teamId]/route.ts +286 -0
  204. package/templates/app/api/superadmin/teams/route.ts +188 -0
  205. package/templates/app/api/superadmin/users/[userId]/route.ts +540 -0
  206. package/templates/app/api/superadmin/users/route.ts +323 -0
  207. package/templates/app/api/user/delete-account/route.ts +55 -0
  208. package/templates/app/api/user/plan-flags/route.ts +283 -0
  209. package/templates/app/api/user/profile/route.ts +133 -0
  210. package/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +210 -0
  211. package/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +331 -0
  212. package/templates/app/api/v1/[entity]/[id]/route.ts +35 -0
  213. package/templates/app/api/v1/[entity]/docs.md +369 -0
  214. package/templates/app/api/v1/[entity]/presets.ts +194 -0
  215. package/templates/app/api/v1/[entity]/route.ts +31 -0
  216. package/templates/app/api/v1/api-keys/[id]/route.ts +303 -0
  217. package/templates/app/api/v1/api-keys/docs.md +101 -0
  218. package/templates/app/api/v1/api-keys/presets.ts +31 -0
  219. package/templates/app/api/v1/api-keys/route.ts +250 -0
  220. package/templates/app/api/v1/auth/docs.md +184 -0
  221. package/templates/app/api/v1/auth/presets.ts +44 -0
  222. package/templates/app/api/v1/auth/signup-with-invite/route.ts +227 -0
  223. package/templates/app/api/v1/billing/cancel/route.ts +206 -0
  224. package/templates/app/api/v1/billing/change-plan/route.ts +97 -0
  225. package/templates/app/api/v1/billing/check-action/route.ts +81 -0
  226. package/templates/app/api/v1/billing/checkout/route.ts +124 -0
  227. package/templates/app/api/v1/billing/docs.md +209 -0
  228. package/templates/app/api/v1/billing/plans/route.ts +85 -0
  229. package/templates/app/api/v1/billing/portal/route.ts +90 -0
  230. package/templates/app/api/v1/billing/presets.ts +121 -0
  231. package/templates/app/api/v1/billing/webhooks/stripe/route.ts +428 -0
  232. package/templates/app/api/v1/blocks/[slug]/route.ts +29 -0
  233. package/templates/app/api/v1/blocks/docs.md +173 -0
  234. package/templates/app/api/v1/blocks/presets.ts +121 -0
  235. package/templates/app/api/v1/blocks/route.ts +45 -0
  236. package/templates/app/api/v1/blocks/validate/route.ts +45 -0
  237. package/templates/app/api/v1/cron/docs.md +116 -0
  238. package/templates/app/api/v1/cron/presets.ts +26 -0
  239. package/templates/app/api/v1/cron/process/route.ts +108 -0
  240. package/templates/app/api/v1/devtools/blocks/route.ts +82 -0
  241. package/templates/app/api/v1/devtools/docs/route.ts +150 -0
  242. package/templates/app/api/v1/devtools/docs.md +204 -0
  243. package/templates/app/api/v1/devtools/features/route.ts +61 -0
  244. package/templates/app/api/v1/devtools/flows/route.ts +61 -0
  245. package/templates/app/api/v1/devtools/presets.ts +113 -0
  246. package/templates/app/api/v1/devtools/scheduled-actions/route.ts +120 -0
  247. package/templates/app/api/v1/devtools/testing/route.ts +82 -0
  248. package/templates/app/api/v1/media/docs.md +117 -0
  249. package/templates/app/api/v1/media/presets.ts +24 -0
  250. package/templates/app/api/v1/media/upload/route.ts +150 -0
  251. package/templates/app/api/v1/patterns/[id]/usages/route.ts +116 -0
  252. package/templates/app/api/v1/plugin/[...path]/route.ts +373 -0
  253. package/templates/app/api/v1/plugin/docs.md +79 -0
  254. package/templates/app/api/v1/plugin/presets.ts +21 -0
  255. package/templates/app/api/v1/plugin/route.ts +96 -0
  256. package/templates/app/api/v1/post-categories/[id]/route.ts +255 -0
  257. package/templates/app/api/v1/post-categories/docs.md +134 -0
  258. package/templates/app/api/v1/post-categories/presets.ts +78 -0
  259. package/templates/app/api/v1/post-categories/route.ts +119 -0
  260. package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +179 -0
  261. package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +120 -0
  262. package/templates/app/api/v1/team-invitations/[token]/route.ts +89 -0
  263. package/templates/app/api/v1/team-invitations/docs.md +88 -0
  264. package/templates/app/api/v1/team-invitations/presets.ts +43 -0
  265. package/templates/app/api/v1/team-invitations/route.ts +114 -0
  266. package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +171 -0
  267. package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +105 -0
  268. package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +125 -0
  269. package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +263 -0
  270. package/templates/app/api/v1/teams/[teamId]/members/route.ts +358 -0
  271. package/templates/app/api/v1/teams/[teamId]/route.ts +322 -0
  272. package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +50 -0
  273. package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +91 -0
  274. package/templates/app/api/v1/teams/docs.md +320 -0
  275. package/templates/app/api/v1/teams/presets.ts +178 -0
  276. package/templates/app/api/v1/teams/route.ts +293 -0
  277. package/templates/app/api/v1/teams/switch/route.ts +88 -0
  278. package/templates/app/api/v1/theme/[...path]/route.ts +361 -0
  279. package/templates/app/api/v1/theme/docs.md +74 -0
  280. package/templates/app/api/v1/theme/presets.ts +21 -0
  281. package/templates/app/api/v1/theme/route.ts +96 -0
  282. package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +363 -0
  283. package/templates/app/api/v1/users/[id]/route.ts +302 -0
  284. package/templates/app/api/v1/users/docs.md +93 -0
  285. package/templates/app/api/v1/users/presets.ts +59 -0
  286. package/templates/app/api/v1/users/route.ts +197 -0
  287. package/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +117 -0
  288. package/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +103 -0
  289. package/templates/app/dashboard/(main)/[entity]/create/page.tsx +95 -0
  290. package/templates/app/dashboard/(main)/[entity]/error.tsx +51 -0
  291. package/templates/app/dashboard/(main)/[entity]/layout.tsx +113 -0
  292. package/templates/app/dashboard/(main)/[entity]/loading.tsx +61 -0
  293. package/templates/app/dashboard/(main)/[entity]/page.tsx +90 -0
  294. package/templates/app/dashboard/(main)/layout.tsx +98 -0
  295. package/templates/app/dashboard/(main)/loading.tsx +5 -0
  296. package/templates/app/dashboard/(main)/page.tsx +201 -0
  297. package/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +114 -0
  298. package/templates/app/dashboard/(main)/patterns/[id]/page.tsx +20 -0
  299. package/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +171 -0
  300. package/templates/app/dashboard/(main)/patterns/create/page.tsx +86 -0
  301. package/templates/app/dashboard/(main)/patterns/page.tsx +444 -0
  302. package/templates/app/dashboard/features/analytics/page.tsx +35 -0
  303. package/templates/app/dashboard/features/automation/page.tsx +35 -0
  304. package/templates/app/dashboard/features/layout.tsx +13 -0
  305. package/templates/app/dashboard/features/loading.tsx +5 -0
  306. package/templates/app/dashboard/features/webhooks/page.tsx +35 -0
  307. package/templates/app/dashboard/layout.tsx +86 -0
  308. package/templates/app/dashboard/permission-denied/page.tsx +29 -0
  309. package/templates/app/dashboard/settings/api-keys/loading.tsx +5 -0
  310. package/templates/app/dashboard/settings/api-keys/page.tsx +513 -0
  311. package/templates/app/dashboard/settings/billing/loading.tsx +5 -0
  312. package/templates/app/dashboard/settings/billing/page.tsx +284 -0
  313. package/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +222 -0
  314. package/templates/app/dashboard/settings/invoices/loading.tsx +5 -0
  315. package/templates/app/dashboard/settings/invoices/page.tsx +82 -0
  316. package/templates/app/dashboard/settings/layout.tsx +151 -0
  317. package/templates/app/dashboard/settings/loading.tsx +5 -0
  318. package/templates/app/dashboard/settings/notifications/loading.tsx +5 -0
  319. package/templates/app/dashboard/settings/notifications/page.tsx +462 -0
  320. package/templates/app/dashboard/settings/page.tsx +92 -0
  321. package/templates/app/dashboard/settings/password/loading.tsx +5 -0
  322. package/templates/app/dashboard/settings/password/page.tsx +306 -0
  323. package/templates/app/dashboard/settings/plans/loading.tsx +5 -0
  324. package/templates/app/dashboard/settings/plans/page.tsx +40 -0
  325. package/templates/app/dashboard/settings/profile/loading.tsx +5 -0
  326. package/templates/app/dashboard/settings/profile/page.tsx +686 -0
  327. package/templates/app/dashboard/settings/security/loading.tsx +5 -0
  328. package/templates/app/dashboard/settings/security/page.tsx +505 -0
  329. package/templates/app/dashboard/settings/teams/loading.tsx +5 -0
  330. package/templates/app/dashboard/settings/teams/page.tsx +272 -0
  331. package/templates/app/dashboard/settings/teams/permissions/page.tsx +92 -0
  332. package/templates/app/devtools/blocks/[slug]/page.tsx +39 -0
  333. package/templates/app/devtools/blocks/page.tsx +31 -0
  334. package/templates/app/devtools/config/page.tsx +31 -0
  335. package/templates/app/devtools/features/page.tsx +31 -0
  336. package/templates/app/devtools/flows/page.tsx +31 -0
  337. package/templates/app/devtools/layout.tsx +58 -0
  338. package/templates/app/devtools/page.tsx +121 -0
  339. package/templates/app/devtools/scheduled-actions/page.tsx +157 -0
  340. package/templates/app/devtools/style/page.tsx +330 -0
  341. package/templates/app/devtools/tags/page.tsx +31 -0
  342. package/templates/app/devtools/tests/[[...path]]/page.tsx +47 -0
  343. package/templates/app/favicon.ico +0 -0
  344. package/templates/app/globals.css +12 -0
  345. package/templates/app/layout.tsx +96 -0
  346. package/templates/app/public/page.tsx +30 -0
  347. package/templates/app/superadmin/docs/[section]/[page]/page.tsx +92 -0
  348. package/templates/app/superadmin/docs/page.tsx +75 -0
  349. package/templates/app/superadmin/layout.tsx +67 -0
  350. package/templates/app/superadmin/page.tsx +149 -0
  351. package/templates/app/superadmin/subscriptions/page.tsx +655 -0
  352. package/templates/app/superadmin/team-roles/page.tsx +493 -0
  353. package/templates/app/superadmin/teams/[teamId]/page.tsx +687 -0
  354. package/templates/app/superadmin/teams/page.tsx +302 -0
  355. package/templates/app/superadmin/users/[userId]/page.tsx +548 -0
  356. package/templates/app/superadmin/users/page.tsx +528 -0
@@ -0,0 +1,505 @@
1
+ 'use client'
2
+
3
+
4
+ import { useState, useCallback, useEffect } from 'react'
5
+ import { Button } from '@nextsparkjs/core/components/ui/button'
6
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextsparkjs/core/components/ui/card'
7
+ import { Badge } from '@nextsparkjs/core/components/ui/badge'
8
+ import { Switch } from '@nextsparkjs/core/components/ui/switch'
9
+ import { Alert, AlertDescription } from '@nextsparkjs/core/components/ui/alert'
10
+ import { toast } from 'sonner'
11
+ import {
12
+ Dialog,
13
+ DialogContent,
14
+ DialogDescription,
15
+ DialogFooter,
16
+ DialogHeader,
17
+ DialogTitle,
18
+ DialogTrigger,
19
+ } from '@nextsparkjs/core/components/ui/dialog'
20
+ import {
21
+ Shield,
22
+ Smartphone,
23
+ Monitor,
24
+ Globe,
25
+ AlertTriangle,
26
+ Check,
27
+ X,
28
+ Eye,
29
+ Clock,
30
+ MapPin,
31
+ Wifi,
32
+ Save,
33
+ Loader2
34
+ } from 'lucide-react'
35
+ import { useTranslations } from 'next-intl'
36
+ import { useUserWithMetaSettings } from '@nextsparkjs/core/hooks/useUserSettings'
37
+ import { SecurityPageSkeleton } from '@nextsparkjs/core/components/settings/SettingsPageSkeleton'
38
+ import { getTemplateOrDefaultClient } from '@nextsparkjs/registries/template-registry.client'
39
+
40
+ function SecurityPage() {
41
+ const t = useTranslations('settings')
42
+
43
+ // Hook para manejar user metadata con autenticación de sesión
44
+ const {
45
+ data: userData,
46
+ isLoading: isLoadingUser,
47
+ updateEntity: updateUserMeta,
48
+ isUpdating
49
+ } = useUserWithMetaSettings()
50
+
51
+ const [twoFactorEnabled, setTwoFactorEnabled] = useState(false)
52
+ const [loginAlertsEnabled, setLoginAlertsEnabled] = useState(true)
53
+
54
+ const [statusMessage, setStatusMessage] = useState('')
55
+ const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false)
56
+
57
+ // Cargar configuraciones desde metadata al montar el componente
58
+ useEffect(() => {
59
+ if (userData?.meta?.securityPreferences) {
60
+ const securityPrefs = userData.meta.securityPreferences as Record<string, unknown>
61
+
62
+ if (securityPrefs.twoFactorEnabled !== undefined) {
63
+ setTwoFactorEnabled(securityPrefs.twoFactorEnabled as boolean)
64
+ }
65
+
66
+ if (securityPrefs.loginAlertsEnabled !== undefined) {
67
+ setLoginAlertsEnabled(securityPrefs.loginAlertsEnabled as boolean)
68
+ }
69
+
70
+ setHasUnsavedChanges(false)
71
+ }
72
+ }, [userData?.meta])
73
+
74
+ // Datos de ejemplo para sesiones activas
75
+ const activeSessions = [
76
+ {
77
+ id: '1',
78
+ device: 'MacBook Pro',
79
+ browser: 'Chrome 120',
80
+ location: 'Buenos Aires, Argentina',
81
+ ip: '192.168.1.100',
82
+ lastActive: '2 minutos atrás',
83
+ current: true,
84
+ icon: <Monitor className="h-4 w-4" />
85
+ },
86
+ {
87
+ id: '2',
88
+ device: 'iPhone 15 Pro',
89
+ browser: 'Safari Mobile',
90
+ location: 'Buenos Aires, Argentina',
91
+ ip: '192.168.1.101',
92
+ lastActive: '1 hora atrás',
93
+ current: false,
94
+ icon: <Smartphone className="h-4 w-4" />
95
+ },
96
+ {
97
+ id: '3',
98
+ device: 'Unknown Device',
99
+ browser: 'Chrome 119',
100
+ location: 'Córdoba, Argentina',
101
+ ip: '200.45.123.45',
102
+ lastActive: '3 días atrás',
103
+ current: false,
104
+ icon: <Globe className="h-4 w-4" />
105
+ }
106
+ ]
107
+
108
+ // Datos de ejemplo para historial de logins
109
+ const loginHistory = [
110
+ {
111
+ id: '1',
112
+ success: true,
113
+ location: 'Buenos Aires, Argentina',
114
+ device: 'MacBook Pro - Chrome',
115
+ timestamp: '2024-01-15 10:30:00',
116
+ ip: '192.168.1.100'
117
+ },
118
+ {
119
+ id: '2',
120
+ success: true,
121
+ location: 'Buenos Aires, Argentina',
122
+ device: 'iPhone 15 Pro - Safari',
123
+ timestamp: '2024-01-15 08:45:00',
124
+ ip: '192.168.1.101'
125
+ },
126
+ {
127
+ id: '3',
128
+ success: false,
129
+ location: 'Madrid, España',
130
+ device: 'Unknown - Chrome',
131
+ timestamp: '2024-01-14 22:15:00',
132
+ ip: '85.123.45.67'
133
+ },
134
+ {
135
+ id: '4',
136
+ success: true,
137
+ location: 'Buenos Aires, Argentina',
138
+ device: 'MacBook Pro - Chrome',
139
+ timestamp: '2024-01-14 09:20:00',
140
+ ip: '192.168.1.100'
141
+ }
142
+ ]
143
+
144
+ const handleTerminateSession = useCallback((sessionId: string) => {
145
+ console.log('Terminating session:', sessionId)
146
+ setStatusMessage(t('security.messages.sessionTerminated'))
147
+ // Aquí iría la lógica para terminar la sesión
148
+ }, [t])
149
+
150
+ const handleTwoFactorToggle = useCallback((enabled: boolean) => {
151
+ setTwoFactorEnabled(enabled)
152
+ setStatusMessage(enabled ? t('security.messages.twoFactorEnabled') : t('security.messages.twoFactorDisabled'))
153
+ setHasUnsavedChanges(true)
154
+ }, [t])
155
+
156
+ const handleLoginAlertsToggle = useCallback((enabled: boolean) => {
157
+ setLoginAlertsEnabled(enabled)
158
+ setStatusMessage(enabled ? t('security.messages.alertsEnabled') : t('security.messages.alertsDisabled'))
159
+ setHasUnsavedChanges(true)
160
+ }, [t])
161
+
162
+ // Función para guardar configuraciones como metadata
163
+ const handleSaveSettings = useCallback(async () => {
164
+ try {
165
+ // Crear metadata en formato anidado
166
+ const securityPreferences = {
167
+ twoFactorEnabled: twoFactorEnabled,
168
+ loginAlertsEnabled: loginAlertsEnabled,
169
+ }
170
+
171
+ await updateUserMeta({
172
+ meta: {
173
+ securityPreferences
174
+ }
175
+ })
176
+
177
+ setHasUnsavedChanges(false)
178
+ toast.success(t('security.messages.saveSuccess'), {
179
+ description: t('security.messages.saveSuccessDescription'),
180
+ })
181
+ } catch (error) {
182
+ console.error('Error saving security settings:', error)
183
+ toast.error(t('security.messages.saveError'), {
184
+ description: t('security.messages.saveErrorDescription'),
185
+ })
186
+ }
187
+ }, [twoFactorEnabled, loginAlertsEnabled, updateUserMeta, t])
188
+
189
+ // Mostrar skeleton mientras cargan los datos
190
+ if (isLoadingUser) {
191
+ return <SecurityPageSkeleton />
192
+ }
193
+
194
+ return (
195
+ <>
196
+ {/* MANDATORY: Screen reader announcements */}
197
+ <div
198
+ aria-live="polite"
199
+ aria-atomic="true"
200
+ className="sr-only"
201
+ >
202
+ {statusMessage}
203
+ </div>
204
+
205
+ <div className="max-w-4xl">
206
+ <div className="space-y-6">
207
+ {/* Header */}
208
+ <header>
209
+ <h1 className="text-2xl font-bold" id="security-heading">
210
+ {t('security.title')}
211
+ </h1>
212
+ <p className="text-muted-foreground mt-1">
213
+ {t('security.description')}
214
+ </p>
215
+ </header>
216
+
217
+ {/* Main Security Settings Card */}
218
+ <Card>
219
+ <CardHeader>
220
+ <CardTitle>{t('security.main.title')}</CardTitle>
221
+ <CardDescription>
222
+ {t('security.main.description')}
223
+ </CardDescription>
224
+ </CardHeader>
225
+ <CardContent className="space-y-8">
226
+ {/* Autenticación de Dos Factores */}
227
+ <div className="space-y-6">
228
+ <h3 className="text-lg font-semibold flex items-center gap-2">
229
+ <Shield className="h-5 w-5" />
230
+ {t('security.twoFactor.title')}
231
+ </h3>
232
+
233
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6 items-center">
234
+ <div className="space-y-1">
235
+ <h4 className="font-medium">
236
+ {twoFactorEnabled ? t('security.twoFactor.enabled') : t('security.twoFactor.disabled')}
237
+ </h4>
238
+ <p className="text-sm text-muted-foreground">
239
+ {twoFactorEnabled
240
+ ? t('security.twoFactor.enabledStatus')
241
+ : t('security.twoFactor.disabledStatus')
242
+ }
243
+ </p>
244
+ </div>
245
+ <div className="flex justify-end">
246
+ <div className="flex items-center gap-3">
247
+ <Badge variant={twoFactorEnabled ? 'default' : 'secondary'}>
248
+ {twoFactorEnabled ? t('security.twoFactor.active') : t('security.twoFactor.inactive')}
249
+ </Badge>
250
+ <Switch
251
+ checked={twoFactorEnabled}
252
+ onCheckedChange={handleTwoFactorToggle}
253
+ aria-label={twoFactorEnabled ? t('security.twoFactor.ariaEnabled') : t('security.twoFactor.ariaDisabled')}
254
+ aria-describedby="2fa-description"
255
+ />
256
+ </div>
257
+ </div>
258
+ </div>
259
+
260
+ {!twoFactorEnabled && (
261
+ <Alert>
262
+ <AlertTriangle className="h-4 w-4" />
263
+ <AlertDescription>
264
+ {t('security.twoFactor.recommendation')}
265
+ </AlertDescription>
266
+ </Alert>
267
+ )}
268
+
269
+ {twoFactorEnabled && (
270
+ <div className="space-y-3">
271
+ <p className="text-sm font-medium">{t('security.twoFactor.configuredMethods')}</p>
272
+ <div className="flex items-center justify-between p-3 bg-muted/30 rounded-lg">
273
+ <div className="flex items-center gap-3">
274
+ <Smartphone className="h-4 w-4" />
275
+ <div>
276
+ <p className="text-sm font-medium">{t('security.twoFactor.appAuthenticator')}</p>
277
+ <p className="text-xs text-muted-foreground">{t('security.twoFactor.appDescription')}</p>
278
+ </div>
279
+ </div>
280
+ <Badge variant="outline">{t('security.twoFactor.configured')}</Badge>
281
+ </div>
282
+ </div>
283
+ )}
284
+ </div>
285
+
286
+ {/* Divisor */}
287
+ <hr className="border-muted" />
288
+
289
+ {/* Alertas de Seguridad */}
290
+ <div className="space-y-6">
291
+ <h3 className="text-lg font-semibold flex items-center gap-2">
292
+ <AlertTriangle className="h-5 w-5" />
293
+ {t('security.alerts.title')}
294
+ </h3>
295
+
296
+ <div className="grid grid-cols-1 md:grid-cols-4 gap-6 items-center">
297
+ <div className="space-y-1 md:col-span-3">
298
+ <h4 className="font-medium">{t('security.alerts.loginTitle')}</h4>
299
+ <p className="text-sm text-muted-foreground">
300
+ {t('security.alerts.loginDescription')}
301
+ </p>
302
+ </div>
303
+ <div className="flex justify-end md:col-span-1">
304
+ <Switch
305
+ checked={loginAlertsEnabled}
306
+ onCheckedChange={handleLoginAlertsToggle}
307
+ aria-label={loginAlertsEnabled ? t('security.alerts.ariaEnabled') : t('security.alerts.ariaDisabled')}
308
+ aria-describedby="alerts-description"
309
+ />
310
+ </div>
311
+ </div>
312
+ </div>
313
+
314
+ {/* Botón de Guardar */}
315
+ <div className="flex justify-end pt-6 border-t border-muted">
316
+ <Button
317
+ onClick={handleSaveSettings}
318
+ disabled={!hasUnsavedChanges || isUpdating || isLoadingUser}
319
+ className="min-w-[120px]"
320
+ >
321
+ {isUpdating ? (
322
+ <>
323
+ <Loader2 className="h-4 w-4 mr-2 animate-spin" />
324
+ {t('security.buttons.saving')}
325
+ </>
326
+ ) : (
327
+ <>
328
+ <Save className="h-4 w-4 mr-2" />
329
+ {t('security.buttons.save')}
330
+ </>
331
+ )}
332
+ </Button>
333
+ </div>
334
+ </CardContent>
335
+ </Card>
336
+
337
+ {/* Two Column Layout for Sessions and History */}
338
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
339
+
340
+ {/* Sesiones Activas */}
341
+ <Card>
342
+ <CardHeader>
343
+ <CardTitle className="flex items-center gap-2">
344
+ <Monitor className="h-5 w-5" />
345
+ {t('security.sessions.title')}
346
+ </CardTitle>
347
+ <CardDescription>
348
+ {t('security.sessions.description')}
349
+ </CardDescription>
350
+ </CardHeader>
351
+ <CardContent>
352
+ <div className="space-y-4">
353
+ {activeSessions.map((session) => (
354
+ <div
355
+ key={session.id}
356
+ className="p-4 border border-muted/40 rounded-lg space-y-3"
357
+ role="article"
358
+ aria-label={t('security.sessions.sessionAriaLabel', { device: session.device, status: session.current ? t('security.sessions.currentSession') : t('security.sessions.activeSession') })}
359
+ >
360
+ {/* Header Row */}
361
+ <div className="flex items-center justify-between">
362
+ <div className="flex items-center gap-3 min-w-0 flex-1">
363
+ {session.icon}
364
+ <div className="min-w-0 flex-1">
365
+ <div className="flex items-center gap-2">
366
+ <p className="font-medium truncate">{session.device}</p>
367
+ {session.current && (
368
+ <Badge variant="default" className="text-xs shrink-0">
369
+ {t('security.sessions.current')}
370
+ </Badge>
371
+ )}
372
+ </div>
373
+ <p className="text-sm text-muted-foreground truncate">{session.browser}</p>
374
+ </div>
375
+ </div>
376
+ {!session.current && (
377
+ <div className="shrink-0 ml-3">
378
+ <Dialog>
379
+ <DialogTrigger asChild>
380
+ <Button
381
+ variant="outline"
382
+ size="sm"
383
+ aria-label={t('security.sessions.terminateAriaLabel', { device: session.device })}
384
+ >
385
+ <X className="h-4 w-4 mr-1" />
386
+ {t('security.sessions.terminate')}
387
+ </Button>
388
+ </DialogTrigger>
389
+ <DialogContent>
390
+ <DialogHeader>
391
+ <DialogTitle>{t('security.sessions.terminateDialog.title')}</DialogTitle>
392
+ <DialogDescription>
393
+ {t('security.sessions.terminateDialog.description')}
394
+ </DialogDescription>
395
+ </DialogHeader>
396
+ <DialogFooter>
397
+ <Button variant="outline">{t('security.sessions.terminateDialog.cancel')}</Button>
398
+ <Button
399
+ variant="destructive"
400
+ onClick={() => handleTerminateSession(session.id)}
401
+ >
402
+ {t('security.sessions.terminateDialog.confirm')}
403
+ </Button>
404
+ </DialogFooter>
405
+ </DialogContent>
406
+ </Dialog>
407
+ </div>
408
+ )}
409
+ </div>
410
+
411
+ {/* Details Row */}
412
+ <div className="grid grid-cols-1 sm:grid-cols-3 gap-2 text-xs text-muted-foreground">
413
+ <span className="flex items-center gap-1">
414
+ <MapPin className="h-3 w-3 shrink-0" />
415
+ <span className="truncate">{session.location}</span>
416
+ </span>
417
+ <span className="flex items-center gap-1">
418
+ <Wifi className="h-3 w-3 shrink-0" />
419
+ <span className="truncate">{session.ip}</span>
420
+ </span>
421
+ <span className="flex items-center gap-1">
422
+ <Clock className="h-3 w-3 shrink-0" />
423
+ <span className="truncate">{session.lastActive}</span>
424
+ </span>
425
+ </div>
426
+ </div>
427
+ ))}
428
+ </div>
429
+ </CardContent>
430
+ </Card>
431
+
432
+ {/* Historial de Accesos */}
433
+ <Card>
434
+ <CardHeader>
435
+ <CardTitle className="flex items-center gap-2">
436
+ <Eye className="h-5 w-5" />
437
+ {t('security.loginHistory.title')}
438
+ </CardTitle>
439
+ <CardDescription>
440
+ {t('security.loginHistory.description')}
441
+ </CardDescription>
442
+ </CardHeader>
443
+ <CardContent>
444
+ <div className="space-y-3">
445
+ {loginHistory.map((login) => (
446
+ <div
447
+ key={login.id}
448
+ className="p-3 border border-muted/40 rounded-lg space-y-2"
449
+ role="article"
450
+ aria-label={t('security.loginHistory.attemptAriaLabel', { status: login.success ? t('security.loginHistory.successBadge').toLowerCase() : t('security.loginHistory.failBadge').toLowerCase(), location: login.location })}
451
+ >
452
+ {/* Header Row */}
453
+ <div className="flex items-center gap-3">
454
+ {login.success ? (
455
+ <Check className="h-4 w-4 text-green-500 shrink-0" />
456
+ ) : (
457
+ <X className="h-4 w-4 text-red-500 shrink-0" />
458
+ )}
459
+ <div className="min-w-0 flex-1">
460
+ <div className="flex items-center gap-2">
461
+ <p className="text-sm font-medium truncate">
462
+ {login.success ? t('security.loginHistory.successful') : t('security.loginHistory.failed')}
463
+ </p>
464
+ <Badge variant={login.success ? 'default' : 'destructive'} className="text-xs shrink-0">
465
+ {login.success ? t('security.loginHistory.successBadge') : t('security.loginHistory.failBadge')}
466
+ </Badge>
467
+ </div>
468
+ </div>
469
+ </div>
470
+
471
+ {/* Details Row */}
472
+ <div className="grid grid-cols-1 sm:grid-cols-3 gap-2 text-xs text-muted-foreground pl-7">
473
+ <span className="flex items-center gap-1">
474
+ <MapPin className="h-3 w-3 shrink-0" />
475
+ <span className="truncate">{login.location}</span>
476
+ </span>
477
+ <span className="truncate">{login.device}</span>
478
+ <span className="flex items-center gap-1">
479
+ <Clock className="h-3 w-3 shrink-0" />
480
+ <span className="truncate">{new Date(login.timestamp).toLocaleString()}</span>
481
+ </span>
482
+ </div>
483
+ </div>
484
+ ))}
485
+ </div>
486
+ <div className="mt-4 text-center">
487
+ <Button
488
+ variant="outline"
489
+ size="sm"
490
+ aria-label={t('security.loginHistory.viewHistoryAriaLabel')}
491
+ >
492
+ {t('security.loginHistory.viewComplete')}
493
+ </Button>
494
+ </div>
495
+ </CardContent>
496
+ </Card>
497
+ </div>
498
+
499
+ </div>
500
+ </div>
501
+ </>
502
+ )
503
+ }
504
+
505
+ export default getTemplateOrDefaultClient('app/dashboard/settings/security/page.tsx', SecurityPage)
@@ -0,0 +1,5 @@
1
+ import { SkeletonTeamsPage } from '@nextsparkjs/core/components/ui/skeleton-settings'
2
+
3
+ export default function TeamsLoading() {
4
+ return <SkeletonTeamsPage />
5
+ }