@nextsparkjs/theme-default 0.1.0-beta.1 → 0.1.0-beta.101

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/api/ai/chat/stream/route.ts +4 -1
  3. package/api/ai/orchestrator/route.ts +10 -3
  4. package/api/ai/single-agent/route.ts +10 -3
  5. package/api/ai/usage/route.ts +4 -1
  6. package/blocks/benefits/component.tsx +4 -4
  7. package/blocks/cta-section/component.tsx +4 -4
  8. package/blocks/faq-accordion/component.tsx +2 -2
  9. package/blocks/features-grid/component.tsx +5 -5
  10. package/blocks/hero/component.tsx +2 -2
  11. package/blocks/hero/fields.ts +1 -1
  12. package/blocks/hero-with-form/component.tsx +7 -7
  13. package/blocks/hero-with-form/fields.ts +1 -1
  14. package/blocks/jumbotron/component.tsx +7 -7
  15. package/blocks/jumbotron/fields.ts +1 -1
  16. package/blocks/logo-cloud/component.tsx +6 -6
  17. package/blocks/logo-cloud/fields.ts +1 -1
  18. package/blocks/post-content/component.tsx +2 -2
  19. package/blocks/pricing-table/component.tsx +5 -5
  20. package/blocks/split-content/component.tsx +5 -5
  21. package/blocks/split-content/fields.ts +1 -1
  22. package/blocks/stats-counter/component.tsx +9 -9
  23. package/blocks/testimonials/component.tsx +4 -4
  24. package/blocks/testimonials/fields.ts +1 -1
  25. package/blocks/text-content/component.tsx +12 -10
  26. package/blocks/timeline/component.tsx +12 -12
  27. package/blocks/video-hero/component.tsx +7 -7
  28. package/blocks/video-hero/fields.ts +1 -1
  29. package/components/ai-chat/ChatPanel.tsx +7 -7
  30. package/components/ai-chat/Message.tsx +2 -2
  31. package/components/ai-chat/MessageInput.tsx +3 -3
  32. package/components/ai-chat/MessageList.tsx +3 -3
  33. package/components/ai-chat/TypingIndicator.tsx +2 -2
  34. package/config/app.config.ts +75 -62
  35. package/config/dashboard.config.ts +14 -0
  36. package/config/features.config.ts +10 -0
  37. package/config/permissions.config.ts +26 -1
  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/entities/customers/api/docs.md +107 -0
  48. package/entities/customers/api/presets.ts +80 -0
  49. package/entities/pages/api/docs.md +114 -0
  50. package/entities/pages/api/presets.ts +72 -0
  51. package/entities/posts/api/docs.md +120 -0
  52. package/entities/posts/api/presets.ts +74 -0
  53. package/entities/tasks/api/docs.md +126 -0
  54. package/entities/tasks/api/presets.ts +84 -0
  55. package/lib/selectors.ts +7 -4
  56. package/messages/de/admin.json +45 -0
  57. package/messages/en/admin.json +56 -0
  58. package/messages/en/navigation.json +2 -1
  59. package/messages/es/admin.json +56 -0
  60. package/messages/es/navigation.json +2 -1
  61. package/messages/fr/admin.json +45 -0
  62. package/messages/it/admin.json +45 -0
  63. package/messages/pt/admin.json +45 -0
  64. package/migrations/090_demo_users_teams.sql +11 -11
  65. package/migrations/091_greek_teams_billing.sql +15 -15
  66. package/migrations/093_pages_sample_data.sql +7 -7
  67. package/migrations/098_patterns_sample_data.sql +234 -0
  68. package/package.json +8 -3
  69. package/styles/globals.css +42 -0
  70. package/templates/(public)/blog/[slug]/page.tsx +1 -1
  71. package/templates/(public)/page.tsx +1 -1
  72. package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
  73. package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
  74. package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
  75. package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
  76. package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
  77. package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
  78. package/tests/cypress/e2e/_utils/docs/README.md +215 -0
  79. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  80. package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
  81. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  82. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  83. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
  84. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
  85. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  86. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  87. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  88. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  89. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  90. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
  91. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
  92. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
  93. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
  94. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  95. package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
  96. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  97. package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
  98. package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
  99. package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
  100. package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
  101. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  102. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
  103. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  104. package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
  105. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
  106. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
  107. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  108. package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
  109. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  110. package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
  111. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  112. package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
  113. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  114. package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
  115. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
  116. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
  117. package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
  118. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  119. package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
  120. package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
  121. package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
  122. package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
  123. package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
  124. package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
  125. package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
  126. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
  127. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
  128. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  129. package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
  130. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  131. package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
  132. package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
  133. package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
  134. package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
  135. package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
  136. package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
  137. package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
  138. package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
  139. package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
  140. package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
  141. package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
  142. package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
  143. package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
  144. package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
  145. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
  146. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
  147. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  148. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  149. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
  150. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
  151. package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
  152. package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
  153. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  154. package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
  155. package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
  156. package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
  157. package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
  158. package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
  159. package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
  160. package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
  161. package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
  162. package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
  163. package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
  164. package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
  165. package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
  166. package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
  167. package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
  168. package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
  169. package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
  170. package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
  171. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
  172. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
  173. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
  174. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
  175. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
  176. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
  177. package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
  178. package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
  179. package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
  180. package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
  181. package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
  182. package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
  183. package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
  184. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
  185. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
  186. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
  187. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
  188. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
  189. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
  190. package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
  191. package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
  192. package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
  193. package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
  194. package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
  195. package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
  196. package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
  197. package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
  198. package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
  199. package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
  200. package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
  201. package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
  202. package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
  203. package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
  204. package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
  205. package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
  206. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
  207. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
  208. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  209. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
  210. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
  211. package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
  212. package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
  213. package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
  214. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  215. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  216. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  217. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  218. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  219. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  220. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  221. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  222. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  223. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  224. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  225. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  226. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  227. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  228. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  229. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  230. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  231. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  232. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  233. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  234. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  235. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  236. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  237. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  238. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  239. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  240. package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
  241. package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
  242. package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
  243. package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
  244. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
  245. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
  246. package/tests/cypress/fixtures/blocks.json +218 -0
  247. package/tests/cypress/fixtures/entities.json +87 -0
  248. package/tests/cypress/fixtures/page-builder.json +21 -0
  249. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  250. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  251. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  252. package/tests/cypress/src/components/EntityForm.ts +375 -0
  253. package/tests/cypress/src/components/EntityList.ts +389 -0
  254. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  255. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  256. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  257. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  258. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  259. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  260. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  261. package/tests/cypress/src/components/index.ts +21 -0
  262. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  263. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  264. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  265. package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
  266. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  267. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  268. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  269. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  270. package/tests/cypress/src/controllers/index.js +25 -0
  271. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  272. package/tests/cypress/src/core/BasePOM.ts +33 -0
  273. package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
  274. package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
  275. package/tests/cypress/src/core/index.ts +14 -0
  276. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  277. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  278. package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
  279. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  280. package/tests/cypress/src/entities/TasksPOM.ts +246 -0
  281. package/tests/cypress/src/entities/index.ts +16 -0
  282. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  283. package/tests/cypress/src/features/DashboardPOM.ts +271 -0
  284. package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
  285. package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
  286. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  287. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  288. package/tests/cypress/src/features/SettingsPOM.ts +707 -0
  289. package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
  290. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  291. package/tests/cypress/src/features/index.ts +28 -0
  292. package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
  293. package/tests/cypress/src/index.ts +101 -0
  294. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  295. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  296. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  297. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  298. package/tests/cypress/src/pages/index.js +5 -0
  299. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  300. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  301. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  302. package/tests/cypress/src/pages/public/index.js +6 -0
  303. package/tests/cypress/src/selectors.ts +46 -0
  304. package/tests/cypress/src/session-helpers.ts +518 -0
  305. package/tests/cypress/support/doc-commands.ts +260 -0
  306. package/tests/cypress/support/e2e.ts +90 -0
  307. package/tests/cypress.config.ts +178 -0
  308. package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
  309. package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
  310. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
  311. package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
  312. package/tests/jest/__mocks__/jose.js +22 -0
  313. package/tests/jest/__mocks__/next/image.js +15 -0
  314. package/tests/jest/__mocks__/next-server.js +56 -0
  315. package/tests/jest/components/post-header.test.tsx +377 -0
  316. package/tests/jest/jest.config.cjs +154 -0
  317. package/tests/jest/langchain/COVERAGE.md +372 -0
  318. package/tests/jest/langchain/guardrails.test.ts +465 -0
  319. package/tests/jest/langchain/streaming.test.ts +370 -0
  320. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  321. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  322. package/tests/jest/langchain/tracer.test.ts +823 -0
  323. package/tests/jest/services/tasks.service.test.ts +707 -0
  324. package/tests/jest/setup.ts +170 -0
  325. package/tests/jest/tsconfig.jest.json +6 -0
  326. package/tests/jest/validation/categories.test.ts +429 -0
  327. package/tests/jest/validation/posts.test.ts +546 -0
  328. package/tests/tsconfig.json +21 -0
  329. /package/docs/{02-features → public/02-features}/01-components.md +0 -0
  330. /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
@@ -44,7 +44,7 @@ export function TextContentBlock({
44
44
 
45
45
  // Build section classes with background and custom className
46
46
  const sectionClasses = buildSectionClasses(
47
- 'py-16 px-4 md:py-24',
47
+ 'py-16 px-4 @md:py-24',
48
48
  { backgroundColor, className }
49
49
  )
50
50
 
@@ -58,21 +58,23 @@ export function TextContentBlock({
58
58
  maxWidthClasses[maxWidth],
59
59
  alignmentClasses[alignment]
60
60
  )}>
61
- <h2 className="text-3xl font-bold md:text-4xl">
61
+ <h2 className="text-3xl font-bold @md:text-4xl">
62
62
  {title}
63
63
  </h2>
64
64
  </div>
65
65
  )}
66
66
 
67
67
  {/* Rich Text Content */}
68
- <div
69
- className={cn(
70
- 'prose prose-lg dark:prose-invert',
71
- maxWidthClasses[maxWidth],
72
- alignmentClasses[alignment]
73
- )}
74
- dangerouslySetInnerHTML={{ __html: content }}
75
- />
68
+ {content && (
69
+ <div
70
+ className={cn(
71
+ 'prose prose-lg dark:prose-invert',
72
+ maxWidthClasses[maxWidth],
73
+ alignmentClasses[alignment]
74
+ )}
75
+ dangerouslySetInnerHTML={{ __html: content }}
76
+ />
77
+ )}
76
78
 
77
79
  {/* Optional CTA */}
78
80
  {cta && (
@@ -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,27 @@ 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
+
37
58
  // =============================================================================
38
59
  // INTERNATIONALIZATION OVERRIDES
39
60
  // =============================================================================
@@ -72,17 +93,19 @@ export const APP_CONFIG_OVERRIDES = {
72
93
  // =============================================================================
73
94
  api: {
74
95
  cors: {
75
- allowedOrigins: {
96
+ // Theme-specific CORS origins (extends core defaults, does not replace)
97
+ // Core already includes: localhost:3000, localhost:5173, and their 127.0.0.1 variants
98
+ additionalOrigins: {
76
99
  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
100
+ 'http://localhost:8081', // Expo mobile web
101
+ 'http://localhost:8082', // Expo alternate port
102
+ 'http://localhost:19006', // Expo web (legacy)
103
+ 'http://192.168.68.106:8081', // Local network Expo
104
+ // Add theme-specific development origins here
82
105
  ],
83
106
  production: [
84
- // Add Project production domains
85
- // 'https://boilerplate-themoneyteam.xyz',
107
+ // Add theme-specific production domains
108
+ // 'https://mobile.boilerplate-themoneyteam.xyz',
86
109
  ],
87
110
  },
88
111
  },
@@ -91,78 +114,51 @@ export const APP_CONFIG_OVERRIDES = {
91
114
  // =============================================================================
92
115
  // DOCUMENTATION CONFIGURATION
93
116
  // =============================================================================
117
+ /**
118
+ * Documentation system configuration
119
+ *
120
+ * Structure:
121
+ * - public: User-facing documentation at /docs
122
+ * - superadmin: Admin documentation at /superadmin/docs
123
+ *
124
+ * NOTE: Plugin docs are NOT in the registry - they are for developer reference only (IDE/LLM).
125
+ */
94
126
  docs: {
95
- /**
96
- * Enable/disable documentation system
97
- */
127
+ /** Enable/disable documentation system */
98
128
  enabled: true,
99
129
 
100
- /**
101
- * Public access to documentation
102
- * - true: Documentation accessible without authentication
103
- * - false: Requires user to be logged in
104
- */
105
- public: true,
130
+ /** Make public documentation accessible without authentication */
131
+ publicAccess: true,
106
132
 
107
- /**
108
- * Enable search functionality in documentation
109
- */
133
+ /** Enable search functionality in documentation */
110
134
  searchEnabled: true,
111
135
 
112
- /**
113
- * Show breadcrumbs in documentation pages
114
- */
136
+ /** Show breadcrumbs in documentation pages */
115
137
  breadcrumbs: true,
116
138
 
117
139
  /**
118
- * Theme Documentation Configuration
119
- * Controls how theme-level documentation appears in the sidebar
140
+ * Public Documentation Configuration
141
+ * Controls public-facing documentation at /docs routes
120
142
  */
121
- theme: {
122
- /** Show/hide theme documentation category */
143
+ public: {
144
+ /** Show/hide public documentation */
123
145
  enabled: true,
124
- /** Expand theme category by default on page load */
146
+ /** Expand sections by default on page load */
125
147
  open: true,
126
- /** Custom label displayed in sidebar for theme category */
127
- label: "Default Theme",
148
+ /** Custom label displayed in sidebar */
149
+ label: "Documentation",
128
150
  },
129
151
 
130
152
  /**
131
- * Plugins Documentation Configuration
132
- * Controls how plugin documentation appears in the sidebar
153
+ * Superadmin Documentation Configuration
154
+ * Controls admin documentation at /superadmin/docs routes
133
155
  */
134
- plugins: {
135
- /** Show/hide plugin documentation category */
156
+ superadmin: {
157
+ /** Show/hide superadmin documentation */
136
158
  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",
159
+ /** Custom label displayed in sidebar */
160
+ label: "Admin Docs",
141
161
  },
142
-
143
- /**
144
- * Core Documentation Configuration
145
- * Controls how core framework documentation appears in the sidebar
146
- */
147
- core: {
148
- /** Show/hide core documentation category */
149
- 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",
154
- },
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
162
  },
167
163
 
168
164
  // =============================================================================
@@ -358,6 +354,23 @@ export const APP_CONFIG_OVERRIDES = {
358
354
  },
359
355
  },
360
356
 
357
+ // =============================================================================
358
+ // MEDIA LIBRARY OVERRIDES
359
+ // =============================================================================
360
+ // Uncomment and modify to customize media upload limits and accepted file types.
361
+ //
362
+ // media: {
363
+ // maxSizeMB: 10, // General fallback max size
364
+ // maxSizeImageMB: 10, // Max size for image/* files (overrides maxSizeMB)
365
+ // maxSizeVideoMB: 50, // Max size for video/* files (overrides maxSizeMB)
366
+ // acceptedTypes: ['image/*', 'video/*', 'application/pdf'],
367
+ // allowedMimeTypes: [
368
+ // 'image/jpeg', 'image/png', 'image/webp',
369
+ // 'video/mp4', 'video/webm',
370
+ // 'application/pdf',
371
+ // ],
372
+ // },
373
+
361
374
  // =============================================================================
362
375
  // DEV KEYRING - MOVED TO dev.config.ts
363
376
  // =============================================================================
@@ -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
@@ -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
  // ==========================================
@@ -188,12 +199,26 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
188
199
  },
189
200
 
190
201
  // MEDIA MANAGEMENT
202
+ {
203
+ action: 'media.read',
204
+ label: 'View Media',
205
+ description: 'Can browse and view media files in the library',
206
+ category: 'Media',
207
+ roles: ['owner', 'admin', 'editor', 'member', 'viewer'],
208
+ },
191
209
  {
192
210
  action: 'media.upload',
193
211
  label: 'Upload Media',
194
212
  description: 'Can upload images, videos, and other media files',
195
213
  category: 'Media',
196
- roles: ['owner', 'admin', 'editor', 'member'],
214
+ roles: ['owner', 'admin', 'editor'],
215
+ },
216
+ {
217
+ action: 'media.update',
218
+ label: 'Edit Media',
219
+ description: 'Can edit media metadata, tags, and captions',
220
+ category: 'Media',
221
+ roles: ['owner', 'admin', 'editor'],
197
222
  },
198
223
  {
199
224
  action: 'media.delete',
@@ -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
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Customization
3
+ description: Learn how to customize colors, typography, components, and functionality in the default theme.
4
+ ---
5
+
1
6
  # Theme Customization
2
7
 
3
8
  ## Introduction
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Tasks Entity
3
+ description: Complete guide to the Tasks entity implementation with CRUD operations, metadata, and API access.
4
+ ---
5
+
1
6
  # Tasks Entity
2
7
 
3
8
  ## Introduction
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: AI Assistant Overview
3
+ description: Learn about the AI-powered assistant features and multi-agent architecture.
4
+ ---
5
+
1
6
  # AI Assistant - Overview
2
7
 
3
8
  This theme includes an AI-powered assistant that helps users manage tasks, customers, and pages through natural language.
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: AI Customization
3
+ description: Guide to customizing and extending the AI assistant with custom tools and handlers.
4
+ ---
5
+
1
6
  # AI Assistant - Customization
2
7
 
3
8
  This guide covers how to customize and extend the AI assistant for your specific needs.