@nextsparkjs/theme-default 0.1.0-beta.17 → 0.1.0-beta.171

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 (332) hide show
  1. package/api/ai/chat/stream/route.ts +4 -1
  2. package/api/ai/orchestrator/route.ts +10 -3
  3. package/api/ai/single-agent/route.ts +10 -3
  4. package/api/ai/usage/route.ts +4 -1
  5. package/blocks/benefits/component.tsx +4 -4
  6. package/blocks/cta-section/component.tsx +4 -4
  7. package/blocks/faq-accordion/component.tsx +2 -2
  8. package/blocks/features-grid/component.tsx +5 -5
  9. package/blocks/hero/component.tsx +2 -2
  10. package/blocks/hero/fields.ts +1 -1
  11. package/blocks/hero-with-form/component.tsx +7 -7
  12. package/blocks/hero-with-form/fields.ts +1 -1
  13. package/blocks/jumbotron/component.tsx +7 -7
  14. package/blocks/jumbotron/fields.ts +1 -1
  15. package/blocks/logo-cloud/component.tsx +6 -6
  16. package/blocks/logo-cloud/fields.ts +1 -1
  17. package/blocks/post-content/component.tsx +2 -2
  18. package/blocks/pricing-table/component.tsx +5 -5
  19. package/blocks/split-content/component.tsx +5 -5
  20. package/blocks/split-content/fields.ts +1 -1
  21. package/blocks/stats-counter/component.tsx +9 -9
  22. package/blocks/testimonials/component.tsx +4 -4
  23. package/blocks/testimonials/fields.ts +1 -1
  24. package/blocks/text-content/component.tsx +12 -10
  25. package/blocks/timeline/component.tsx +12 -12
  26. package/blocks/video-hero/component.tsx +7 -7
  27. package/blocks/video-hero/fields.ts +1 -1
  28. package/components/ai-chat/ChatPanel.tsx +7 -7
  29. package/components/ai-chat/Message.tsx +2 -2
  30. package/components/ai-chat/MessageInput.tsx +3 -3
  31. package/components/ai-chat/MessageList.tsx +3 -3
  32. package/components/ai-chat/TypingIndicator.tsx +2 -2
  33. package/config/app.config.ts +90 -62
  34. package/config/billing.config.ts +5 -10
  35. package/config/dashboard.config.ts +14 -0
  36. package/config/features.config.ts +10 -0
  37. package/config/permissions.config.ts +22 -23
  38. package/docs/{01-overview → public/01-overview}/01-introduction.md +5 -0
  39. package/docs/{01-overview → public/01-overview}/02-customization.md +5 -0
  40. package/docs/{02-features → public/02-features}/03-tasks-entity.md +5 -0
  41. package/docs/{03-ai → public/03-ai}/01-overview.md +5 -0
  42. package/docs/{03-ai → public/03-ai}/02-customization.md +5 -0
  43. package/docs/superadmin/01-setup/01-configuration.md +79 -0
  44. package/docs/superadmin/01-setup/02-deployment.md +82 -0
  45. package/docs/superadmin/02-management/01-users.md +83 -0
  46. package/docs/superadmin/03-integrations/01-langchain.md +139 -0
  47. package/emails/verify-email.ts +33 -0
  48. package/entities/customers/api/docs.md +107 -0
  49. package/entities/customers/api/presets.ts +80 -0
  50. package/entities/pages/api/docs.md +114 -0
  51. package/entities/pages/api/presets.ts +72 -0
  52. package/entities/posts/api/docs.md +120 -0
  53. package/entities/posts/api/presets.ts +74 -0
  54. package/entities/tasks/api/docs.md +126 -0
  55. package/entities/tasks/api/presets.ts +84 -0
  56. package/lib/selectors.ts +7 -4
  57. package/messages/de/admin.json +45 -0
  58. package/messages/en/admin.json +56 -0
  59. package/messages/en/navigation.json +2 -1
  60. package/messages/es/admin.json +56 -0
  61. package/messages/es/navigation.json +2 -1
  62. package/messages/fr/admin.json +45 -0
  63. package/messages/it/admin.json +45 -0
  64. package/messages/pt/admin.json +45 -0
  65. package/migrations/089_add_editor_team_role.sql +15 -23
  66. package/migrations/090_demo_users_teams.sql +11 -11
  67. package/migrations/091_greek_teams_billing.sql +15 -15
  68. package/migrations/093_pages_sample_data.sql +7 -7
  69. package/migrations/098_patterns_sample_data.sql +234 -0
  70. package/nextsparkjs-theme-default-0.1.0-beta.137.tgz +0 -0
  71. package/package.json +4 -3
  72. package/styles/globals.css +42 -0
  73. package/templates/(public)/page.tsx +1 -1
  74. package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
  75. package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
  76. package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
  77. package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
  78. package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
  79. package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
  80. package/tests/cypress/e2e/_utils/docs/README.md +215 -0
  81. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  82. package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
  83. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  84. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  85. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
  86. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
  87. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  88. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  89. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  90. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  91. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  92. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
  93. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
  94. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
  95. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
  96. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  97. package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
  98. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  99. package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
  100. package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
  101. package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
  102. package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
  103. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  104. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
  105. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  106. package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
  107. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
  108. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
  109. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  110. package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
  111. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  112. package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
  113. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  114. package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
  115. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  116. package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
  117. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
  118. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
  119. package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
  120. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  121. package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
  122. package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
  123. package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
  124. package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
  125. package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
  126. package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
  127. package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
  128. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
  129. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
  130. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  131. package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
  132. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  133. package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
  134. package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
  135. package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
  136. package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
  137. package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
  138. package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
  139. package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
  140. package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
  141. package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
  142. package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
  143. package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
  144. package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
  145. package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
  146. package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
  147. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
  148. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
  149. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  150. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  151. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
  152. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
  153. package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
  154. package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
  155. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  156. package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
  157. package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
  158. package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
  159. package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
  160. package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
  161. package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
  162. package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
  163. package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
  164. package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
  165. package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
  166. package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
  167. package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
  168. package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
  169. package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
  170. package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
  171. package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
  172. package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
  173. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
  174. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
  175. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
  176. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
  177. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
  178. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
  179. package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
  180. package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
  181. package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
  182. package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
  183. package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
  184. package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
  185. package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
  186. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
  187. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
  188. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
  189. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
  190. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
  191. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
  192. package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
  193. package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
  194. package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
  195. package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
  196. package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
  197. package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
  198. package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
  199. package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
  200. package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
  201. package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
  202. package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
  203. package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
  204. package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
  205. package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
  206. package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
  207. package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
  208. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
  209. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
  210. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  211. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
  212. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
  213. package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
  214. package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
  215. package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
  216. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  217. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  218. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  219. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  220. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  221. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  222. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  223. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  224. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  225. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  226. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  227. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  228. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  229. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  230. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  231. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  232. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  233. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  234. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  235. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  236. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  237. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  238. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  239. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  240. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  241. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  242. package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
  243. package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
  244. package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
  245. package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
  246. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
  247. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
  248. package/tests/cypress/fixtures/blocks.json +218 -0
  249. package/tests/cypress/fixtures/entities.json +87 -0
  250. package/tests/cypress/fixtures/page-builder.json +21 -0
  251. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  252. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  253. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  254. package/tests/cypress/src/components/EntityForm.ts +375 -0
  255. package/tests/cypress/src/components/EntityList.ts +389 -0
  256. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  257. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  258. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  259. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  260. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  261. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  262. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  263. package/tests/cypress/src/components/index.ts +21 -0
  264. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  265. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  266. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  267. package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
  268. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  269. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  270. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  271. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  272. package/tests/cypress/src/controllers/index.js +25 -0
  273. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  274. package/tests/cypress/src/core/BasePOM.ts +33 -0
  275. package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
  276. package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
  277. package/tests/cypress/src/core/index.ts +14 -0
  278. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  279. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  280. package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
  281. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  282. package/tests/cypress/src/entities/TasksPOM.ts +246 -0
  283. package/tests/cypress/src/entities/index.ts +16 -0
  284. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  285. package/tests/cypress/src/features/DashboardPOM.ts +271 -0
  286. package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
  287. package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
  288. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  289. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  290. package/tests/cypress/src/features/SettingsPOM.ts +707 -0
  291. package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
  292. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  293. package/tests/cypress/src/features/index.ts +28 -0
  294. package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
  295. package/tests/cypress/src/index.ts +101 -0
  296. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  297. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  298. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  299. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  300. package/tests/cypress/src/pages/index.js +5 -0
  301. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  302. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  303. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  304. package/tests/cypress/src/pages/public/index.js +6 -0
  305. package/tests/cypress/src/selectors.ts +46 -0
  306. package/tests/cypress/src/session-helpers.ts +518 -0
  307. package/tests/cypress/support/doc-commands.ts +260 -0
  308. package/tests/cypress/support/e2e.ts +90 -0
  309. package/tests/cypress.config.ts +178 -0
  310. package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
  311. package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
  312. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
  313. package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
  314. package/tests/jest/__mocks__/jose.js +22 -0
  315. package/tests/jest/__mocks__/next/image.js +15 -0
  316. package/tests/jest/__mocks__/next-server.js +56 -0
  317. package/tests/jest/components/post-header.test.tsx +377 -0
  318. package/tests/jest/jest.config.cjs +154 -0
  319. package/tests/jest/langchain/COVERAGE.md +372 -0
  320. package/tests/jest/langchain/guardrails.test.ts +465 -0
  321. package/tests/jest/langchain/streaming.test.ts +370 -0
  322. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  323. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  324. package/tests/jest/langchain/tracer.test.ts +823 -0
  325. package/tests/jest/services/tasks.service.test.ts +707 -0
  326. package/tests/jest/setup.ts +170 -0
  327. package/tests/jest/tsconfig.jest.json +6 -0
  328. package/tests/jest/validation/categories.test.ts +429 -0
  329. package/tests/jest/validation/posts.test.ts +546 -0
  330. package/tests/tsconfig.json +21 -0
  331. /package/docs/{02-features → public/02-features}/01-components.md +0 -0
  332. /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
@@ -32,7 +32,7 @@ export function TimelineBlock({
32
32
  }: TimelineBlockProps) {
33
33
  // Build section classes with background and custom className
34
34
  const sectionClasses = buildSectionClasses(
35
- 'py-16 px-4 md:py-24',
35
+ 'py-16 px-4 @md:py-24',
36
36
  { backgroundColor, className }
37
37
  )
38
38
 
@@ -46,7 +46,7 @@ export function TimelineBlock({
46
46
  {(title || subtitle) && (
47
47
  <div className="mb-16 text-center">
48
48
  {title && (
49
- <h2 className="mb-4 text-4xl font-bold md:text-5xl">
49
+ <h2 className="mb-4 text-4xl font-bold @md:text-5xl">
50
50
  {title}
51
51
  </h2>
52
52
  )}
@@ -96,10 +96,10 @@ function VerticalTimeline({
96
96
  <div className="relative">
97
97
  {/* Connector Line */}
98
98
  {showConnector && (
99
- <div className="absolute left-1/2 top-0 bottom-0 w-0.5 bg-border -translate-x-1/2 hidden md:block" />
99
+ <div className="absolute left-1/2 top-0 bottom-0 w-0.5 bg-border -translate-x-1/2 hidden @md:block" />
100
100
  )}
101
101
  {showConnector && (
102
- <div className="absolute left-8 top-0 bottom-0 w-0.5 bg-border md:hidden" />
102
+ <div className="absolute left-8 top-0 bottom-0 w-0.5 bg-border @md:hidden" />
103
103
  )}
104
104
 
105
105
  {/* Timeline Items */}
@@ -112,27 +112,27 @@ function VerticalTimeline({
112
112
  key={index}
113
113
  className={cn(
114
114
  'relative flex items-center gap-8',
115
- alternating ? 'md:justify-center' : 'md:justify-start md:pl-[50%]',
116
- 'justify-start pl-16 md:pl-0'
115
+ alternating ? '@md:justify-center' : '@md:justify-start @md:pl-[50%]',
116
+ 'justify-start pl-16 @md:pl-0'
117
117
  )}
118
118
  >
119
119
  {/* Mobile/Left Content */}
120
120
  <div className={cn(
121
121
  'flex-1',
122
- alternating && !isLeft && 'md:text-right md:order-1',
123
- !alternating && 'md:pl-8'
122
+ alternating && !isLeft && '@md:text-right @md:order-1',
123
+ !alternating && '@md:pl-8'
124
124
  )}>
125
125
  <TimelineItemContent item={item} variant={variant} align={alternating && !isLeft ? 'right' : 'left'} />
126
126
  </div>
127
127
 
128
128
  {/* Center Dot */}
129
- <div className="absolute left-8 md:left-1/2 md:-translate-x-1/2 flex-shrink-0">
129
+ <div className="absolute left-8 @md:left-1/2 @md:-translate-x-1/2 flex-shrink-0">
130
130
  <TimelineIcon item={item} />
131
131
  </div>
132
132
 
133
133
  {/* Desktop Spacer (for alternating layout) */}
134
134
  {alternating && (
135
- <div className="hidden md:block flex-1" />
135
+ <div className="hidden @md:block flex-1" />
136
136
  )}
137
137
  </div>
138
138
  )
@@ -158,7 +158,7 @@ function HorizontalTimeline({
158
158
  return (
159
159
  <div className="relative">
160
160
  {/* Mobile: Vertical Layout */}
161
- <div className="md:hidden">
161
+ <div className="@md:hidden">
162
162
  {showConnector && (
163
163
  <div className="absolute left-8 top-0 bottom-0 w-0.5 bg-border" />
164
164
  )}
@@ -175,7 +175,7 @@ function HorizontalTimeline({
175
175
  </div>
176
176
 
177
177
  {/* Desktop: Horizontal Layout */}
178
- <div className="hidden md:block overflow-x-auto pb-4">
178
+ <div className="hidden @md:block overflow-x-auto pb-4">
179
179
  <div className="relative min-w-max">
180
180
  {/* Connector Line */}
181
181
  {showConnector && (
@@ -151,13 +151,13 @@ export function VideoHeroBlock({
151
151
  {/* Content Overlay */}
152
152
  <div className="container relative z-10 mx-auto max-w-4xl text-center px-4 py-20 text-white">
153
153
  {title && (
154
- <h1 className="mb-6 text-5xl font-bold leading-tight md:text-6xl lg:text-7xl">
154
+ <h1 className="mb-6 text-5xl font-bold leading-tight @md:text-6xl @lg:text-7xl">
155
155
  {title}
156
156
  </h1>
157
157
  )}
158
158
 
159
159
  {content && (
160
- <p className="mb-8 text-xl md:text-2xl opacity-90">
160
+ <p className="mb-8 text-xl @md:text-2xl opacity-90">
161
161
  {content}
162
162
  </p>
163
163
  )}
@@ -187,17 +187,17 @@ export function VideoHeroBlock({
187
187
  data-cy={sel('blocks.videoHero.container')}
188
188
  >
189
189
  <div className="container mx-auto">
190
- <div className="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
190
+ <div className="grid grid-cols-1 @lg:grid-cols-2 gap-8 items-center">
191
191
  {/* Text Content */}
192
192
  <div className="space-y-6">
193
193
  {title && (
194
- <h1 className="text-4xl font-bold leading-tight md:text-5xl lg:text-6xl">
194
+ <h1 className="text-4xl font-bold leading-tight @md:text-5xl @lg:text-6xl">
195
195
  {title}
196
196
  </h1>
197
197
  )}
198
198
 
199
199
  {content && (
200
- <p className="text-lg md:text-xl text-gray-600">
200
+ <p className="text-lg @md:text-xl text-gray-600">
201
201
  {content}
202
202
  </p>
203
203
  )}
@@ -236,13 +236,13 @@ export function VideoHeroBlock({
236
236
  {/* Text Content */}
237
237
  <div className="text-center mb-10 space-y-6">
238
238
  {title && (
239
- <h1 className="text-4xl font-bold leading-tight md:text-5xl lg:text-6xl">
239
+ <h1 className="text-4xl font-bold leading-tight @md:text-5xl @lg:text-6xl">
240
240
  {title}
241
241
  </h1>
242
242
  )}
243
243
 
244
244
  {content && (
245
- <p className="text-lg md:text-xl text-gray-600 max-w-3xl mx-auto">
245
+ <p className="text-lg @md:text-xl text-gray-600 max-w-3xl mx-auto">
246
246
  {content}
247
247
  </p>
248
248
  )}
@@ -28,7 +28,7 @@ const videoHeroContentFields: FieldDefinition[] = [
28
28
  {
29
29
  name: 'videoThumbnail',
30
30
  label: 'Custom Thumbnail',
31
- type: 'image',
31
+ type: 'media-library',
32
32
  tab: 'content',
33
33
  required: false,
34
34
  helpText: 'Optional custom thumbnail shown before video plays (recommended: 1920x1080px)',
@@ -8,7 +8,7 @@ import { MessageInput } from './MessageInput'
8
8
  import { MarkdownRenderer } from './MarkdownRenderer'
9
9
  import { TypingIndicator } from './TypingIndicator'
10
10
  import { ConversationSidebar } from './ConversationSidebar'
11
- import { createCyId } from '@nextsparkjs/core/lib/testing-utils'
11
+ import { sel } from '@nextsparkjs/core/selectors'
12
12
  import { cn } from '@nextsparkjs/core/lib/utils'
13
13
  import { Bot, User, Loader2, Trash2, ListTodo, Users, FileText, Sparkles, X } from 'lucide-react'
14
14
  import type { ConversationInfo } from '../../lib/hooks/useConversations'
@@ -163,7 +163,7 @@ function ChatMessageItem({
163
163
 
164
164
  return (
165
165
  <div
166
- data-cy={createCyId(cyPrefix, `message-${message.role}`)}
166
+ data-cy={sel(message.role === 'user' ? 'common.aiChat.messageUser' : 'common.aiChat.messageAssistant')}
167
167
  className={cn(
168
168
  'flex w-full gap-3 p-4',
169
169
  isUser ? 'flex-row-reverse' : 'flex-row'
@@ -351,7 +351,7 @@ export function ChatPanel({
351
351
  return (
352
352
  <div className="h-[calc(100vh-4rem)] p-4 md:p-6 lg:p-8">
353
353
  <Card
354
- data-cy={createCyId(cyPrefix, 'panel')}
354
+ data-cy={sel('common.aiChat.panel')}
355
355
  className={cn(
356
356
  'flex h-full mx-auto overflow-hidden shadow-lg',
357
357
  layoutClass
@@ -408,7 +408,7 @@ export function ChatPanel({
408
408
  {/* Clear button */}
409
409
  {header.showClearButton && header.onClear && (
410
410
  <Button
411
- data-cy={createCyId(cyPrefix, 'clear-btn')}
411
+ data-cy={sel('common.aiChat.clearBtn')}
412
412
  variant="ghost"
413
413
  size="sm"
414
414
  onClick={header.onClear}
@@ -470,13 +470,13 @@ export function ChatPanel({
470
470
  ) : (
471
471
  /* Messages */
472
472
  <ScrollArea
473
- data-cy={createCyId(cyPrefix, 'message-list')}
473
+ data-cy={sel('common.aiChat.messageList')}
474
474
  className="flex-1 p-4"
475
475
  >
476
476
  <div className="flex flex-col gap-4">
477
477
  {error && (
478
478
  <div
479
- data-cy={createCyId(cyPrefix, 'error-message')}
479
+ data-cy={sel('common.aiChat.errorMessage')}
480
480
  className="p-4 mb-2 text-sm text-red-600 bg-red-50 dark:bg-red-900/20 dark:text-red-400 rounded-lg"
481
481
  >
482
482
  {error}
@@ -517,7 +517,7 @@ export function ChatPanel({
517
517
  variant="outline"
518
518
  size="sm"
519
519
  onClick={onCancelStream}
520
- data-cy="chat-cancel-button"
520
+ data-cy={sel('common.aiChat.cancelBtn')}
521
521
  >
522
522
  <X className="h-4 w-4 mr-1" />
523
523
  Stop generating
@@ -2,7 +2,7 @@ import { cn } from '@nextsparkjs/core/lib/utils'
2
2
  import { Message as MessageType } from '../../lib/hooks/useAiChat'
3
3
  import { MarkdownRenderer } from './MarkdownRenderer'
4
4
  import { User, Bot } from 'lucide-react'
5
- import { createCyId } from '@nextsparkjs/core/lib/testing-utils'
5
+ import { sel } from '@nextsparkjs/core/selectors'
6
6
 
7
7
  interface MessageProps {
8
8
  message: MessageType
@@ -13,7 +13,7 @@ export function Message({ message }: MessageProps) {
13
13
 
14
14
  return (
15
15
  <div
16
- data-cy={createCyId('ai-chat', `message-${message.role}`)}
16
+ data-cy={sel(message.role === 'user' ? 'common.aiChat.messageUser' : 'common.aiChat.messageAssistant')}
17
17
  className={cn(
18
18
  'flex w-full gap-3 p-4',
19
19
  isUser ? 'flex-row-reverse' : 'flex-row'
@@ -2,7 +2,7 @@ import { KeyboardEvent } from 'react'
2
2
  import { Button } from '@nextsparkjs/core/components/ui/button'
3
3
  import { Textarea } from '@nextsparkjs/core/components/ui/textarea'
4
4
  import { Send } from 'lucide-react'
5
- import { createCyId } from '@nextsparkjs/core/lib/testing-utils'
5
+ import { sel } from '@nextsparkjs/core/selectors'
6
6
 
7
7
  interface MessageInputProps {
8
8
  value: string
@@ -23,7 +23,7 @@ export function MessageInput({ value, onChange, onSend, isLoading }: MessageInpu
23
23
  <div className="p-4 border-t bg-background">
24
24
  <div className="flex gap-2">
25
25
  <Textarea
26
- data-cy={createCyId('ai-chat', 'message-input')}
26
+ data-cy={sel('common.aiChat.messageInput')}
27
27
  value={value}
28
28
  onChange={(e) => onChange(e.target.value)}
29
29
  onKeyDown={handleKeyDown}
@@ -32,7 +32,7 @@ export function MessageInput({ value, onChange, onSend, isLoading }: MessageInpu
32
32
  disabled={isLoading}
33
33
  />
34
34
  <Button
35
- data-cy={createCyId('ai-chat', 'send-btn')}
35
+ data-cy={sel('common.aiChat.sendBtn')}
36
36
  size="icon"
37
37
  onClick={onSend}
38
38
  disabled={!value.trim() || isLoading}
@@ -3,7 +3,7 @@ import { ScrollArea } from '@nextsparkjs/core/components/ui/scroll-area'
3
3
  import { Message as MessageType } from '../../lib/hooks/useAiChat'
4
4
  import { Message } from './Message'
5
5
  import { TypingIndicator } from './TypingIndicator'
6
- import { createCyId } from '@nextsparkjs/core/lib/testing-utils'
6
+ import { sel } from '@nextsparkjs/core/selectors'
7
7
 
8
8
  interface MessageListProps {
9
9
  messages: MessageType[]
@@ -21,11 +21,11 @@ export function MessageList({ messages, isLoading, error }: MessageListProps) {
21
21
  }, [messages, isLoading])
22
22
 
23
23
  return (
24
- <ScrollArea data-cy={createCyId('ai-chat', 'message-list')} className="flex-1 p-4">
24
+ <ScrollArea data-cy={sel('common.aiChat.messageList')} className="flex-1 p-4">
25
25
  <div className="flex flex-col gap-4">
26
26
  {error && (
27
27
  <div
28
- data-cy={createCyId('ai-chat', 'error-message')}
28
+ data-cy={sel('common.aiChat.errorMessage')}
29
29
  className="p-4 mb-2 text-sm text-red-600 bg-red-50 dark:bg-red-900/20 dark:text-red-400 rounded-lg"
30
30
  >
31
31
  {error}
@@ -1,8 +1,8 @@
1
- import { createCyId } from '@nextsparkjs/core/lib/testing-utils'
1
+ import { sel } from '@nextsparkjs/core/selectors'
2
2
 
3
3
  export function TypingIndicator() {
4
4
  return (
5
- <div data-cy={createCyId('ai-chat', 'typing-indicator')} className="flex items-center gap-1 p-2">
5
+ <div data-cy={sel('common.aiChat.typingIndicator')} className="flex items-center gap-1 p-2">
6
6
  <div className="w-2 h-2 bg-muted-foreground/40 rounded-full animate-bounce [animation-delay:-0.3s]" />
7
7
  <div className="w-2 h-2 bg-muted-foreground/40 rounded-full animate-bounce [animation-delay:-0.15s]" />
8
8
  <div className="w-2 h-2 bg-muted-foreground/40 rounded-full animate-bounce" />
@@ -34,6 +34,42 @@ export const APP_CONFIG_OVERRIDES = {
34
34
  },
35
35
  },
36
36
 
37
+ // =============================================================================
38
+ // AUTHENTICATION CONFIGURATION
39
+ // =============================================================================
40
+ /**
41
+ * Registration modes:
42
+ * - 'open': Anyone can register (email+password and Google OAuth) - DEFAULT
43
+ * - 'domain-restricted': Only Google OAuth for specific email domains
44
+ * - 'invitation-only': Registration only via invitation link
45
+ */
46
+ auth: {
47
+ registration: {
48
+ mode: 'domain-restricted' as const,
49
+ allowedDomains: ['nextspark.dev'],
50
+ },
51
+ providers: {
52
+ google: {
53
+ enabled: true,
54
+ },
55
+ },
56
+ /**
57
+ * Whether Better Auth automatically sends the verification email on signup.
58
+ *
59
+ * - `true` (default): users get a "Verify Your Email Address" link email
60
+ * immediately when they sign up via `/api/auth/sign-up/email`.
61
+ * - `false`: suppress the automatic email. Use this when your project
62
+ * verifies email ownership through other means (OTP code, invitation
63
+ * token, claim-account flow). The `sendVerificationEmail` function
64
+ * remains available — you can still trigger link-based verification
65
+ * explicitly when you need to.
66
+ *
67
+ * `requireEmailVerification: true` is enforced regardless: users with
68
+ * `emailVerified: false` cannot sign in.
69
+ */
70
+ sendVerificationEmailOnSignup: true,
71
+ },
72
+
37
73
  // =============================================================================
38
74
  // INTERNATIONALIZATION OVERRIDES
39
75
  // =============================================================================
@@ -72,17 +108,19 @@ export const APP_CONFIG_OVERRIDES = {
72
108
  // =============================================================================
73
109
  api: {
74
110
  cors: {
75
- allowedOrigins: {
111
+ // Theme-specific CORS origins (extends core defaults, does not replace)
112
+ // Core already includes: localhost:3000, localhost:5173, and their 127.0.0.1 variants
113
+ additionalOrigins: {
76
114
  development: [
77
- 'http://localhost:3000',
78
- 'http://localhost:5173',
79
- 'http://127.0.0.1:3000',
80
- 'http://127.0.0.1:5173',
81
- // Project specific development origins
115
+ 'http://localhost:8081', // Expo mobile web
116
+ 'http://localhost:8082', // Expo alternate port
117
+ 'http://localhost:19006', // Expo web (legacy)
118
+ 'http://192.168.68.106:8081', // Local network Expo
119
+ // Add theme-specific development origins here
82
120
  ],
83
121
  production: [
84
- // Add Project production domains
85
- // 'https://boilerplate-themoneyteam.xyz',
122
+ // Add theme-specific production domains
123
+ // 'https://mobile.boilerplate-themoneyteam.xyz',
86
124
  ],
87
125
  },
88
126
  },
@@ -91,78 +129,51 @@ export const APP_CONFIG_OVERRIDES = {
91
129
  // =============================================================================
92
130
  // DOCUMENTATION CONFIGURATION
93
131
  // =============================================================================
132
+ /**
133
+ * Documentation system configuration
134
+ *
135
+ * Structure:
136
+ * - public: User-facing documentation at /docs
137
+ * - superadmin: Admin documentation at /superadmin/docs
138
+ *
139
+ * NOTE: Plugin docs are NOT in the registry - they are for developer reference only (IDE/LLM).
140
+ */
94
141
  docs: {
95
- /**
96
- * Enable/disable documentation system
97
- */
142
+ /** Enable/disable documentation system */
98
143
  enabled: true,
99
144
 
100
- /**
101
- * Public access to documentation
102
- * - true: Documentation accessible without authentication
103
- * - false: Requires user to be logged in
104
- */
105
- public: true,
145
+ /** Make public documentation accessible without authentication */
146
+ publicAccess: true,
106
147
 
107
- /**
108
- * Enable search functionality in documentation
109
- */
148
+ /** Enable search functionality in documentation */
110
149
  searchEnabled: true,
111
150
 
112
- /**
113
- * Show breadcrumbs in documentation pages
114
- */
151
+ /** Show breadcrumbs in documentation pages */
115
152
  breadcrumbs: true,
116
153
 
117
154
  /**
118
- * Theme Documentation Configuration
119
- * Controls how theme-level documentation appears in the sidebar
155
+ * Public Documentation Configuration
156
+ * Controls public-facing documentation at /docs routes
120
157
  */
121
- theme: {
122
- /** Show/hide theme documentation category */
158
+ public: {
159
+ /** Show/hide public documentation */
123
160
  enabled: true,
124
- /** Expand theme category by default on page load */
161
+ /** Expand sections by default on page load */
125
162
  open: true,
126
- /** Custom label displayed in sidebar for theme category */
127
- label: "Default Theme",
128
- },
129
-
130
- /**
131
- * Plugins Documentation Configuration
132
- * Controls how plugin documentation appears in the sidebar
133
- */
134
- plugins: {
135
- /** Show/hide plugin documentation category */
136
- enabled: true,
137
- /** Expand plugins category by default on page load */
138
- open: false,
139
- /** Custom label displayed in sidebar for plugins category */
140
- label: "Plugins",
163
+ /** Custom label displayed in sidebar */
164
+ label: "Documentation",
141
165
  },
142
166
 
143
167
  /**
144
- * Core Documentation Configuration
145
- * Controls how core framework documentation appears in the sidebar
168
+ * Superadmin Documentation Configuration
169
+ * Controls admin documentation at /superadmin/docs routes
146
170
  */
147
- core: {
148
- /** Show/hide core documentation category */
171
+ superadmin: {
172
+ /** Show/hide superadmin documentation */
149
173
  enabled: true,
150
- /** Expand core category by default on page load */
151
- open: true,
152
- /** Custom label displayed in sidebar for core category */
153
- label: "Core",
174
+ /** Custom label displayed in sidebar */
175
+ label: "Admin Docs",
154
176
  },
155
-
156
- /**
157
- * Additional environment-based check for plugin docs in production
158
- * Plugin docs will only show if BOTH conditions are met:
159
- * 1. plugins.enabled is true
160
- * 2. Either in development OR showPluginsDocsInProd is true
161
- *
162
- * @deprecated Prefer using plugins.enabled for simpler control
163
- * By default plugins documentation is not available in prod environments
164
- */
165
- showPluginsDocsInProd: false,
166
177
  },
167
178
 
168
179
  // =============================================================================
@@ -358,6 +369,23 @@ export const APP_CONFIG_OVERRIDES = {
358
369
  },
359
370
  },
360
371
 
372
+ // =============================================================================
373
+ // MEDIA LIBRARY OVERRIDES
374
+ // =============================================================================
375
+ // Uncomment and modify to customize media upload limits and accepted file types.
376
+ //
377
+ // media: {
378
+ // maxSizeMB: 10, // General fallback max size
379
+ // maxSizeImageMB: 10, // Max size for image/* files (overrides maxSizeMB)
380
+ // maxSizeVideoMB: 50, // Max size for video/* files (overrides maxSizeMB)
381
+ // acceptedTypes: ['image/*', 'video/*', 'application/pdf'],
382
+ // allowedMimeTypes: [
383
+ // 'image/jpeg', 'image/png', 'image/webp',
384
+ // 'video/mp4', 'video/webm',
385
+ // 'application/pdf',
386
+ // ],
387
+ // },
388
+
361
389
  // =============================================================================
362
390
  // DEV KEYRING - MOVED TO dev.config.ts
363
391
  // =============================================================================
@@ -163,8 +163,7 @@ export const billingConfig: BillingConfig = {
163
163
  file_uploads: 100,
164
164
  webhooks_count: 0,
165
165
  },
166
- stripePriceIdMonthly: null,
167
- stripePriceIdYearly: null,
166
+ providerPriceIds: { monthly: null, yearly: null },
168
167
  },
169
168
 
170
169
  // Starter Plan - For growing teams
@@ -194,8 +193,7 @@ export const billingConfig: BillingConfig = {
194
193
  file_uploads: 500,
195
194
  webhooks_count: 3,
196
195
  },
197
- stripePriceIdMonthly: 'price_starter_monthly',
198
- stripePriceIdYearly: 'price_starter_yearly',
196
+ providerPriceIds: { monthly: 'price_1TAIW6QetGjJvG5hzCCpMwXT', yearly: 'price_1TAIWuQetGjJvG5hkI3aJYTw' },
199
197
  },
200
198
 
201
199
  // Pro Plan - For professional teams
@@ -230,8 +228,7 @@ export const billingConfig: BillingConfig = {
230
228
  file_uploads: 2000,
231
229
  webhooks_count: 10,
232
230
  },
233
- stripePriceIdMonthly: 'price_pro_monthly',
234
- stripePriceIdYearly: 'price_pro_yearly',
231
+ providerPriceIds: { monthly: 'price_1TAIZMQetGjJvG5hqDh3dbCv', yearly: 'price_1TAIZMQetGjJvG5haLm28w3H' },
235
232
  },
236
233
 
237
234
  // Business Plan - For larger organizations
@@ -270,8 +267,7 @@ export const billingConfig: BillingConfig = {
270
267
  file_uploads: 10000,
271
268
  webhooks_count: 50,
272
269
  },
273
- stripePriceIdMonthly: 'price_business_monthly',
274
- stripePriceIdYearly: 'price_business_yearly',
270
+ providerPriceIds: { monthly: 'price_1TAIaNQetGjJvG5hn6fgXx1n', yearly: 'price_1TAIacQetGjJvG5hVQO6i2UL' },
275
271
  },
276
272
 
277
273
  // Enterprise Plan - Custom unlimited plan
@@ -292,8 +288,7 @@ export const billingConfig: BillingConfig = {
292
288
  file_uploads: -1,
293
289
  webhooks_count: -1,
294
290
  },
295
- stripePriceIdMonthly: null,
296
- stripePriceIdYearly: null,
291
+ providerPriceIds: { monthly: null, yearly: null },
297
292
  },
298
293
  ],
299
294
 
@@ -94,6 +94,20 @@ export const DASHBOARD_CONFIG = {
94
94
  enabled: true,
95
95
  },
96
96
 
97
+ /**
98
+ * Settings menu dropdown (gear icon)
99
+ */
100
+ settingsMenu: {
101
+ enabled: true,
102
+ links: [
103
+ {
104
+ label: 'navigation.patterns',
105
+ href: '/dashboard/patterns',
106
+ icon: 'layers',
107
+ },
108
+ ],
109
+ },
110
+
97
111
  /**
98
112
  * User menu dropdown
99
113
  */
@@ -91,6 +91,16 @@ export default defineFeatures({
91
91
  docs: ['18-page-builder/*'],
92
92
  },
93
93
 
94
+ patterns: {
95
+ name: 'Patterns',
96
+ description: 'Reusable block patterns for page builder',
97
+ category: 'content',
98
+ icon: 'grid',
99
+ entities: ['patterns'],
100
+ permissions: ['patterns.*'],
101
+ docs: [],
102
+ },
103
+
94
104
  // ===========================================================================
95
105
  // CORE FEATURES
96
106
  // Platform-level features that exist in all themes
@@ -7,7 +7,7 @@
7
7
  * - roles: Custom roles beyond core (owner, admin, member, viewer)
8
8
  * - teams: Team-level permissions (team.view, team.edit, etc.)
9
9
  * - entities: Entity CRUD permissions (customers, tasks, etc.)
10
- * - features: Theme-specific feature permissions (page-builder, blog, media)
10
+ * - features: Theme-specific feature permissions (page-builder, blog)
11
11
  *
12
12
  * All sections use unified format: { action: '...', roles: [...] }
13
13
  *
@@ -110,6 +110,17 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
110
110
  { action: 'delete', label: 'Delete Pages', description: 'Can delete pages', roles: ['owner', 'admin'], dangerous: true },
111
111
  { action: 'publish', label: 'Publish Pages', description: 'Can publish pages to make them public', roles: ['owner', 'admin'] },
112
112
  ],
113
+
114
+ // ------------------------------------------
115
+ // PATTERNS
116
+ // ------------------------------------------
117
+ patterns: [
118
+ { action: 'create', label: 'Create Patterns', description: 'Can create reusable patterns', roles: ['owner', 'admin'] },
119
+ { action: 'read', label: 'View Patterns', description: 'Can view pattern details', roles: ['owner', 'admin', 'member', 'viewer'] },
120
+ { action: 'list', label: 'List Patterns', description: 'Can see the patterns list', roles: ['owner', 'admin', 'member', 'viewer'] },
121
+ { action: 'update', label: 'Edit Patterns', description: 'Can modify patterns', roles: ['owner', 'admin'] },
122
+ { action: 'delete', label: 'Delete Patterns', description: 'Can delete patterns', roles: ['owner', 'admin'], dangerous: true },
123
+ ],
113
124
  },
114
125
 
115
126
  // ==========================================
@@ -187,24 +198,18 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
187
198
  roles: ['owner', 'admin'],
188
199
  },
189
200
 
190
- // MEDIA MANAGEMENT
191
- {
192
- action: 'media.upload',
193
- label: 'Upload Media',
194
- description: 'Can upload images, videos, and other media files',
195
- category: 'Media',
196
- roles: ['owner', 'admin', 'editor', 'member'],
197
- },
198
- {
199
- action: 'media.delete',
200
- label: 'Delete Media',
201
- description: 'Can permanently delete media files',
202
- category: 'Media',
203
- roles: ['owner', 'admin'],
204
- dangerous: true,
205
- },
206
201
  ],
207
202
 
203
+ // ==========================================
204
+ // CORE PERMISSION OVERRIDES
205
+ // ==========================================
206
+ // Extend core media permissions with the 'editor' custom role
207
+ overrides: {
208
+ 'media.read': { roles: ['owner', 'admin', 'editor', 'member', 'viewer'] },
209
+ 'media.upload': { roles: ['owner', 'admin', 'editor'] },
210
+ 'media.update': { roles: ['owner', 'admin', 'editor'] },
211
+ },
212
+
208
213
  // ==========================================
209
214
  // UI SECTIONS
210
215
  // ==========================================
@@ -233,12 +238,6 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
233
238
  description: 'Blog publishing and management features',
234
239
  categories: ['Blog'],
235
240
  },
236
- {
237
- id: 'media',
238
- label: 'Media',
239
- description: 'Media library management',
240
- categories: ['Media'],
241
- },
242
241
  ],
243
242
  }
244
243
 
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Introduction
3
+ description: Overview of the Default Theme and its key features for NextSpark applications.
4
+ ---
5
+
1
6
  # Default Theme Introduction
2
7
 
3
8
  ## Overview