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

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
@@ -0,0 +1,303 @@
1
+ ---
2
+ feature: DevTools Page Content
3
+ priority: high
4
+ tags: [dev-area, pages, content]
5
+ grepTags: [uat, feat-dev-area, regression]
6
+ coverage: 6
7
+ ---
8
+
9
+ # DevTools Page Content
10
+
11
+ > Tests the content and functionality of each /devtools page including Home quick links, Style Gallery components, Test Cases viewer, and Config viewer tabs.
12
+
13
+ ## @test PAGE-001: Home page renders quick links
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Smoke
18
+ - **Tags:** home, quick-links
19
+ - **Grep:** `@smoke`
20
+
21
+ ```gherkin:en
22
+ Scenario: Display all quick link cards on home page
23
+
24
+ Given I am logged in as Developer (developer@nextspark.dev)
25
+ When I visit /devtools home
26
+ Then the home page container should be visible
27
+ And all quick links should be visible (Style, Tests, Config)
28
+
29
+ When I click Style Gallery quick link
30
+ Then I should be on /devtools/style
31
+
32
+ When I go back to /devtools home
33
+ And I click Test Cases quick link
34
+ Then I should be on /devtools/tests
35
+
36
+ When I go back to /devtools home
37
+ And I click Config Viewer quick link
38
+ Then I should be on /devtools/config
39
+ ```
40
+
41
+ ```gherkin:es
42
+ Scenario: Mostrar todas las tarjetas de enlaces rapidos en home
43
+
44
+ Given estoy logueado como Developer (developer@nextspark.dev)
45
+ When visito /devtools home
46
+ Then el contenedor de home page deberia estar visible
47
+ And todos los enlaces rapidos deberian estar visibles (Style, Tests, Config)
48
+
49
+ When hago clic en el enlace rapido Style Gallery
50
+ Then deberia estar en /devtools/style
51
+
52
+ When vuelvo a /devtools home
53
+ And hago clic en el enlace rapido Test Cases
54
+ Then deberia estar en /devtools/tests
55
+
56
+ When vuelvo a /devtools home
57
+ And hago clic en el enlace rapido Config Viewer
58
+ Then deberia estar en /devtools/config
59
+ ```
60
+
61
+ ### Expected Results
62
+ - Home page container visible
63
+ - All 3 quick link cards displayed
64
+ - Each quick link navigates correctly
65
+ - All target pages load successfully
66
+
67
+ ---
68
+
69
+ ## @test PAGE-002: Style Gallery loads components
70
+
71
+ ### Metadata
72
+ - **Priority:** High
73
+ - **Type:** Smoke
74
+ - **Tags:** style-gallery, components, tabs
75
+
76
+ ```gherkin:en
77
+ Scenario: Display all Style Gallery sections
78
+
79
+ Given I am logged in as Developer (developer@nextspark.dev)
80
+ When I visit /devtools/style
81
+ Then the style page should be visible
82
+
83
+ And I verify all tab sections by clicking through them:
84
+ | Tab | Content Section |
85
+ | Components | Component Gallery |
86
+ | Field Types | Field Types Gallery |
87
+ | Theme | Theme Preview |
88
+ ```
89
+
90
+ ```gherkin:es
91
+ Scenario: Mostrar todas las secciones de Style Gallery
92
+
93
+ Given estoy logueado como Developer (developer@nextspark.dev)
94
+ When visito /devtools/style
95
+ Then la pagina de estilos deberia estar visible
96
+
97
+ And verifico todas las secciones de tabs haciendo clic en cada una:
98
+ | Tab | Seccion de Contenido |
99
+ | Components | Component Gallery |
100
+ | Field Types | Field Types Gallery |
101
+ | Theme | Theme Preview |
102
+ ```
103
+
104
+ ### Expected Results
105
+ - Style page container visible
106
+ - Components tab visible by default
107
+ - Field Types tab content loads on click
108
+ - Theme tab content loads on click
109
+
110
+ ---
111
+
112
+ ## @test PAGE-003a: Test Cases viewer shows file tree
113
+
114
+ ### Metadata
115
+ - **Priority:** High
116
+ - **Type:** Smoke
117
+ - **Tags:** test-cases, file-tree
118
+
119
+ ```gherkin:en
120
+ Scenario: Display test cases viewer with file tree
121
+
122
+ Given I am logged in as Developer (developer@nextspark.dev)
123
+ When I visit /devtools/tests
124
+ Then the tests page should be visible
125
+ And the viewer container should be visible
126
+ And either file tree or empty state should be displayed
127
+ ```
128
+
129
+ ```gherkin:es
130
+ Scenario: Mostrar visor de test cases con arbol de archivos
131
+
132
+ Given estoy logueado como Developer (developer@nextspark.dev)
133
+ When visito /devtools/tests
134
+ Then la pagina de tests deberia estar visible
135
+ And el contenedor del visor deberia estar visible
136
+ And deberia mostrarse el arbol de archivos o estado vacio
137
+ ```
138
+
139
+ ### Expected Results
140
+ - Tests page container visible
141
+ - Viewer component rendered
142
+ - File tree shows .bdd.md files (or empty state)
143
+
144
+ ---
145
+
146
+ ## @test PAGE-003b: Test Cases viewer shows markdown content
147
+
148
+ ### Metadata
149
+ - **Priority:** Medium
150
+ - **Type:** Regression
151
+ - **Tags:** test-cases, markdown, file-select
152
+
153
+ ```gherkin:en
154
+ Scenario: Show markdown content when selecting a file
155
+
156
+ Given I am on /devtools/tests
157
+ When I check if file tree has files
158
+ And files exist
159
+ And I click on the first file
160
+ Then the content area should be visible
161
+ And markdown content should be rendered
162
+ ```
163
+
164
+ ```gherkin:es
165
+ Scenario: Mostrar contenido markdown al seleccionar un archivo
166
+
167
+ Given estoy en /devtools/tests
168
+ When verifico si el arbol de archivos tiene archivos
169
+ And existen archivos
170
+ And hago clic en el primer archivo
171
+ Then el area de contenido deberia estar visible
172
+ And el contenido markdown deberia estar renderizado
173
+ ```
174
+
175
+ ### Expected Results
176
+ - File selection works
177
+ - Markdown content loads
178
+ - Content is properly formatted
179
+
180
+ ---
181
+
182
+ ## @test PAGE-004a: Config viewer shows tabs
183
+
184
+ ### Metadata
185
+ - **Priority:** High
186
+ - **Type:** Smoke
187
+ - **Tags:** config, tabs
188
+
189
+ ```gherkin:en
190
+ Scenario: Display config viewer with tabs
191
+
192
+ Given I am logged in as Developer (developer@nextspark.dev)
193
+ When I visit /devtools/config
194
+ Then the config page should be visible
195
+ And config tabs should be visible (Theme, Entities)
196
+
197
+ When I click Theme tab
198
+ Then Theme content should be visible
199
+
200
+ When I click Entities tab
201
+ Then Entities content should be visible
202
+ ```
203
+
204
+ ```gherkin:es
205
+ Scenario: Mostrar visor de config con tabs
206
+
207
+ Given estoy logueado como Developer (developer@nextspark.dev)
208
+ When visito /devtools/config
209
+ Then la pagina de config deberia estar visible
210
+ And los tabs de config deberian estar visibles (Theme, Entities)
211
+
212
+ When hago clic en el tab Theme
213
+ Then el contenido de Theme deberia estar visible
214
+
215
+ When hago clic en el tab Entities
216
+ Then el contenido de Entities deberia estar visible
217
+ ```
218
+
219
+ ### Expected Results
220
+ - Config page container visible
221
+ - Theme and Entities tabs visible
222
+ - Tab switching works correctly
223
+ - Each tab shows correct content
224
+
225
+ ---
226
+
227
+ ## @test PAGE-004b: Config viewer shows copy buttons
228
+
229
+ ### Metadata
230
+ - **Priority:** Medium
231
+ - **Type:** Regression
232
+ - **Tags:** config, copy-buttons
233
+
234
+ ```gherkin:en
235
+ Scenario: Display copy buttons in config viewer
236
+
237
+ Given I am on /devtools/config
238
+ When I click Theme tab
239
+ Then copy button for theme config should be visible
240
+
241
+ When I click Entities tab
242
+ Then copy button for entities config should be visible
243
+ ```
244
+
245
+ ```gherkin:es
246
+ Scenario: Mostrar botones de copia en el visor de config
247
+
248
+ Given estoy en /devtools/config
249
+ When hago clic en el tab Theme
250
+ Then el boton de copia para config de theme deberia estar visible
251
+
252
+ When hago clic en el tab Entities
253
+ Then el boton de copia para config de entities deberia estar visible
254
+ ```
255
+
256
+ ### Expected Results
257
+ - Copy buttons present in both tabs
258
+ - Copy functionality available for developers
259
+
260
+ ---
261
+
262
+ ## UI Elements
263
+
264
+ | Element | Selector | Description |
265
+ |---------|----------|-------------|
266
+ | Home Page | `[data-cy="dev-home-page"]` | Dev home page container |
267
+ | Home Style Link | `[data-cy="dev-home-style-link"]` | Quick link to Style Gallery |
268
+ | Home Tests Link | `[data-cy="dev-home-tests-link"]` | Quick link to Test Cases |
269
+ | Home Config Link | `[data-cy="dev-home-config-link"]` | Quick link to Config Viewer |
270
+ | Style Page | `[data-cy="dev-style-page"]` | Style Gallery page container |
271
+ | Style Tab Components | `[data-cy="dev-style-tab-components"]` | Components tab trigger |
272
+ | Style Tab Field Types | `[data-cy="dev-style-tab-field-types"]` | Field Types tab trigger |
273
+ | Style Tab Theme | `[data-cy="dev-style-tab-theme"]` | Theme tab trigger |
274
+ | Style Component Gallery | `[data-cy="dev-style-component-gallery"]` | Components tab content |
275
+ | Style Field Types | `[data-cy="dev-style-field-types"]` | Field Types tab content |
276
+ | Style Theme Preview | `[data-cy="dev-style-theme-preview"]` | Theme tab content |
277
+ | Tests Page | `[data-cy="dev-tests-page"]` | Test Cases page container |
278
+ | Tests Viewer | `[data-cy="dev-tests-viewer"]` | Test viewer container |
279
+ | Tests Tree | `[data-cy="dev-tests-tree"]` | File tree component |
280
+ | Tests Empty State | `[data-cy="dev-tests-empty-state"]` | Empty state when no files |
281
+ | Tests Content | `[data-cy="dev-tests-content"]` | Content display area |
282
+ | Tests Markdown | `[data-cy="dev-tests-markdown-content"]` | Rendered markdown content |
283
+ | Config Page | `[data-cy="dev-config-page"]` | Config Viewer page container |
284
+ | Config Viewer | `[data-cy="dev-config-viewer"]` | Config viewer container |
285
+ | Config Tab Theme | `[data-cy="dev-config-tab-theme"]` | Theme tab trigger |
286
+ | Config Tab Entities | `[data-cy="dev-config-tab-entities"]` | Entities tab trigger |
287
+ | Config Theme Content | `[data-cy="dev-config-theme-content"]` | Theme config content |
288
+ | Config Entities Content | `[data-cy="dev-config-entities-content"]` | Entities config content |
289
+ | Config Copy Theme | `[data-cy="dev-config-copy-theme"]` | Copy theme config button |
290
+ | Config Copy Entities | `[data-cy="dev-config-copy-entities"]` | Copy entities config button |
291
+
292
+ ---
293
+
294
+ ## Summary
295
+
296
+ | Test ID | Block | Description | Tags |
297
+ |---------|-------|-------------|------|
298
+ | PAGE-001 | Home Page | Quick links display and work | `@smoke` |
299
+ | PAGE-002 | Style Gallery | All tab sections load | |
300
+ | PAGE-003a | Test Cases | File tree viewer works | |
301
+ | PAGE-003b | Test Cases | Markdown content renders | |
302
+ | PAGE-004a | Config Viewer | Tabs display and switch | |
303
+ | PAGE-004b | Config Viewer | Copy buttons available | |
@@ -0,0 +1,184 @@
1
+ /// <reference types="cypress" />
2
+
3
+ import * as allure from 'allure-cypress'
4
+ import { DevtoolsPOM } from '../../../src/features/DevtoolsPOM'
5
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
6
+
7
+ /**
8
+ * DevTools Page Content Tests
9
+ *
10
+ * Tests the content and functionality of each /devtools page:
11
+ * - Home page renders quick links
12
+ * - Style Gallery loads all components
13
+ * - Test Cases viewer shows file tree
14
+ * - Config viewer shows tabs and content
15
+ *
16
+ * Test User:
17
+ * - Developer: developer@nextspark.dev (via loginAsDefaultDeveloper)
18
+ */
19
+
20
+ describe('DevTools - Page Content', {
21
+ tags: ['@uat', '@area-devtools', '@regression']
22
+ }, () => {
23
+ const devtools = DevtoolsPOM.create()
24
+
25
+ beforeEach(() => {
26
+ allure.epic('UAT')
27
+ allure.feature('DevTools')
28
+ allure.story('Page Content')
29
+
30
+ // Login as developer before each test
31
+ loginAsDefaultDeveloper()
32
+ })
33
+
34
+ describe('PAGE-001: Home page renders quick links', () => {
35
+ it('should display all quick link cards on home page', () => {
36
+ allure.severity('high')
37
+
38
+ // 1. Visit /devtools home
39
+ devtools.visitHome()
40
+
41
+ // 2. Verify page container is visible
42
+ devtools.assertHomePageVisible()
43
+
44
+ // 3. Verify all quick links are visible
45
+ devtools.assertHomeQuickLinksVisible()
46
+
47
+ // 4. Verify quick links are clickable and navigate correctly
48
+ cy.log('Testing Style Gallery quick link...')
49
+ devtools.clickHomeStyleLink()
50
+ devtools.assertOnStyleGallery()
51
+
52
+ cy.log('Testing Test Cases quick link...')
53
+ devtools.visitHome()
54
+ devtools.clickHomeTestsLink()
55
+ devtools.assertOnTestCases()
56
+
57
+ cy.log('Testing Config Viewer quick link...')
58
+ devtools.visitHome()
59
+ devtools.clickHomeConfigLink()
60
+ devtools.assertOnConfig()
61
+
62
+ cy.log(`✅ Home page quick links work correctly`)
63
+ })
64
+ })
65
+
66
+ describe('PAGE-002: Style Gallery loads components', () => {
67
+ it('should display all Style Gallery sections', () => {
68
+ allure.severity('high')
69
+
70
+ // 1. Visit /devtools/style
71
+ devtools.visitStyleGallery()
72
+
73
+ // 2. Verify page is visible
74
+ devtools.assertStylePageVisible()
75
+
76
+ // 3. Verify all tab sections by clicking through them
77
+ // (assertStyleSectionsVisible clicks each tab and verifies content)
78
+ devtools.assertStyleSectionsVisible()
79
+
80
+ cy.log(`✅ Style Gallery sections loaded correctly`)
81
+ })
82
+ })
83
+
84
+ describe('PAGE-003: Test Cases viewer shows file tree', () => {
85
+ it('should display test cases viewer with file tree', () => {
86
+ allure.severity('high')
87
+
88
+ // 1. Visit /devtools/tests
89
+ devtools.visitTestCases()
90
+
91
+ // 2. Verify page is visible
92
+ devtools.assertTestsPageVisible()
93
+
94
+ // 3. Verify viewer container is visible
95
+ devtools.assertTestsViewerVisible()
96
+
97
+ // 4. Verify file tree is present (or empty state if no files)
98
+ cy.get('body').then(($body) => {
99
+ if ($body.find(devtools.selectors.testsTree).length > 0) {
100
+ // File tree exists
101
+ cy.get(devtools.selectors.testsTree).should('be.visible')
102
+ cy.log('✅ File tree displayed')
103
+ } else if ($body.find(devtools.selectors.testsEmptyState).length > 0) {
104
+ // Empty state (no test files)
105
+ cy.get(devtools.selectors.testsEmptyState).should('be.visible')
106
+ cy.log('✅ Empty state displayed (no test files found)')
107
+ }
108
+ })
109
+
110
+ cy.log(`✅ Test Cases viewer loaded correctly`)
111
+ })
112
+
113
+ it('should show markdown content when selecting a file', () => {
114
+ allure.severity('medium')
115
+
116
+ // 1. Visit /devtools/tests
117
+ devtools.visitTestCases()
118
+
119
+ // 2. Check if file tree has files
120
+ cy.get('body').then(($body) => {
121
+ if ($body.find('[data-cy^="dev-tests-file-"]').length > 0) {
122
+ // Files exist - click first file
123
+ cy.get('[data-cy^="dev-tests-file-"]').first().click()
124
+
125
+ // 3. Verify markdown content is displayed
126
+ cy.get(devtools.selectors.testsContent).should('be.visible')
127
+ cy.get(devtools.selectors.testsMarkdownContent).should('be.visible')
128
+
129
+ cy.log('✅ File content displayed when selected')
130
+ } else {
131
+ cy.log('⚠️ No test files found - skipping file selection test')
132
+ }
133
+ })
134
+ })
135
+ })
136
+
137
+ describe('PAGE-004: Config viewer shows tabs', () => {
138
+ it('should display config viewer with tabs', () => {
139
+ allure.severity('high')
140
+
141
+ // 1. Visit /devtools/config
142
+ devtools.visitConfig()
143
+
144
+ // 2. Verify page is visible
145
+ devtools.assertConfigPageVisible()
146
+
147
+ // 3. Verify tabs are visible
148
+ devtools.assertConfigTabsVisible()
149
+
150
+ // 4. Test Theme tab
151
+ cy.log('Testing Theme tab...')
152
+ devtools.clickConfigTabTheme()
153
+ cy.get(devtools.selectors.configThemeContent).should('be.visible')
154
+
155
+ // 5. Test Entities tab
156
+ cy.log('Testing Entities tab...')
157
+ devtools.clickConfigTabEntities()
158
+ cy.get(devtools.selectors.configEntitiesContent).should('be.visible')
159
+
160
+ cy.log(`✅ Config viewer tabs work correctly`)
161
+ })
162
+
163
+ it('should display copy buttons in config viewer', () => {
164
+ allure.severity('medium')
165
+
166
+ // 1. Visit /devtools/config
167
+ devtools.visitConfig()
168
+
169
+ // 2. Verify copy buttons exist for theme config
170
+ devtools.clickConfigTabTheme()
171
+ cy.get(devtools.selectors.configCopyTheme).should('be.visible')
172
+
173
+ // 3. Verify copy buttons exist for entities config
174
+ devtools.clickConfigTabEntities()
175
+ cy.get(devtools.selectors.configCopyEntities).should('be.visible')
176
+
177
+ cy.log(`✅ Copy buttons displayed correctly`)
178
+ })
179
+ })
180
+
181
+ after(() => {
182
+ cy.log('✅ DevTools page content tests completed')
183
+ })
184
+ })
@@ -0,0 +1,215 @@
1
+ # Cypress Documentation Videos
2
+
3
+ This directory contains Cypress tests designed to generate documentation videos with narration support.
4
+
5
+ ## Concept
6
+
7
+ Instead of manually recording tutorial videos, we use Cypress tests that:
8
+ 1. **Slow down execution** to human-readable speed using `cypress-slow-down`
9
+ 2. **Add narration markers** that are saved as JSON for post-processing
10
+ 3. **Highlight elements** visually during important steps
11
+ 4. **Generate MP4 videos** automatically via Cypress video recording
12
+
13
+ ## Quick Start
14
+
15
+ ### Run a documentation test
16
+
17
+ ```bash
18
+ # Interactive mode (watch the test execute)
19
+ NEXT_PUBLIC_ACTIVE_THEME=default pnpm cy:open
20
+
21
+ # Headless mode (generates video file)
22
+ NEXT_PUBLIC_ACTIVE_THEME=default pnpm cy:run --spec "**/teams-system.doc.cy.ts"
23
+ ```
24
+
25
+ ### Output Files
26
+
27
+ After running, you'll find:
28
+ - **Video**: `cypress/videos/docs/tutorials/teams-system.doc.cy.ts.mp4`
29
+ - **Narrations**: `cypress/docs-output/narrations/teams-system.doc-narrations.json`
30
+
31
+ ## File Structure
32
+
33
+ ```
34
+ cypress/e2e/docs/
35
+ ├── README.md # This file
36
+ └── tutorials/
37
+ ├── teams-system.doc.cy.ts # The actual Cypress test
38
+ └── teams-system.narration.json # Narration script (reference)
39
+
40
+ cypress/docs-output/
41
+ └── narrations/
42
+ └── teams-system.doc-narrations.json # Generated narration timing
43
+ ```
44
+
45
+ ## Creating a New Documentation Video
46
+
47
+ ### 1. Plan the narration
48
+
49
+ Create a `.narration.json` file with your script:
50
+
51
+ ```json
52
+ {
53
+ "title": "Feature Name Tutorial",
54
+ "chapters": [
55
+ {
56
+ "id": "intro",
57
+ "title": "Introduction",
58
+ "narrations": [
59
+ {
60
+ "step": 1,
61
+ "text": "Welcome to this tutorial...",
62
+ "action": "none",
63
+ "estimatedSeconds": 5
64
+ }
65
+ ]
66
+ }
67
+ ]
68
+ }
69
+ ```
70
+
71
+ ### 2. Create the test file
72
+
73
+ Use the `*.doc.cy.ts` naming convention:
74
+
75
+ ```typescript
76
+ import { slowCypressDown } from 'cypress-slow-down'
77
+ import 'cypress-slow-down/commands'
78
+
79
+ const CONFIG = {
80
+ commandDelay: 600, // ms between commands
81
+ narration: {
82
+ short: 2500,
83
+ medium: 4000,
84
+ long: 5500,
85
+ }
86
+ }
87
+
88
+ describe('Tutorial: Feature Name', { tags: ['@doc'] }, () => {
89
+ before(() => {
90
+ slowCypressDown(CONFIG.commandDelay)
91
+ })
92
+
93
+ it('demonstrates the feature', () => {
94
+ // Chapter marker
95
+ cy.log('📖 **CHAPTER: Introduction**')
96
+ cy.wait(2000)
97
+
98
+ // Narration with wait
99
+ cy.log('🎙️ Welcome to this tutorial about...')
100
+ cy.wait(4000) // Time for narration
101
+
102
+ // Your test actions...
103
+ cy.visit('/some-page')
104
+
105
+ // Highlight important elements
106
+ cy.get('[data-cy="important"]').then($el => {
107
+ $el.css({ outline: '4px solid red' })
108
+ })
109
+ cy.wait(2000) // Let viewer see highlight
110
+ })
111
+ })
112
+ ```
113
+
114
+ ### 3. Run and collect outputs
115
+
116
+ ```bash
117
+ # Generate video and narrations
118
+ NEXT_PUBLIC_ACTIVE_THEME=default pnpm cy:run --spec "**/your-feature.doc.cy.ts"
119
+ ```
120
+
121
+ ## Post-Processing Pipeline
122
+
123
+ The generated outputs can be processed with AI tools:
124
+
125
+ ### Video + Narrations → Final Documentation
126
+
127
+ ```
128
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
129
+ │ Cypress Video │ │ Narration JSON │ │ AI Service │
130
+ │ (MP4, no audio)│───►│ (timestamps) │───►│ (Guidde/HeyGen)│
131
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
132
+
133
+
134
+ ┌─────────────────┐
135
+ │ Final Video │
136
+ │ + AI Narration │
137
+ │ + Subtitles │
138
+ └─────────────────┘
139
+ ```
140
+
141
+ ### Narration JSON Format
142
+
143
+ The generated `*-narrations.json` contains:
144
+
145
+ ```json
146
+ [
147
+ {
148
+ "timestamp": 1702400000000,
149
+ "step": 1,
150
+ "text": "=== Introduction ===",
151
+ "chapter": "Introduction",
152
+ "duration": 2500
153
+ },
154
+ {
155
+ "timestamp": 1702400002500,
156
+ "step": 2,
157
+ "text": "Welcome to this tutorial...",
158
+ "duration": 4000
159
+ }
160
+ ]
161
+ ```
162
+
163
+ This can be used to:
164
+ - Generate SRT subtitle files
165
+ - Send to text-to-speech APIs (ElevenLabs, Google TTS)
166
+ - Sync audio with video using FFmpeg
167
+
168
+ ## Speed Configuration
169
+
170
+ Adjust the `commandDelay` and narration durations based on your needs:
171
+
172
+ | Setting | Value | Use Case |
173
+ |---------|-------|----------|
174
+ | `commandDelay: 300` | Fast | Quick demos |
175
+ | `commandDelay: 600` | Normal | Standard tutorials |
176
+ | `commandDelay: 1000` | Slow | Detailed explanations |
177
+
178
+ ### Narration Timing Guide
179
+
180
+ | Duration | Words | Use For |
181
+ |----------|-------|---------|
182
+ | 2500ms | ~8-10 | Short phrases |
183
+ | 4000ms | ~15-18 | Standard sentences |
184
+ | 5500ms | ~22-25 | Longer explanations |
185
+
186
+ ## Tips
187
+
188
+ 1. **Use `cy.wait()` strategically** - Add pauses after important actions
189
+ 2. **Highlight sparingly** - Only highlight what you're talking about
190
+ 3. **Chapter markers** - Help viewers navigate in longer videos
191
+ 4. **Test first without slow-down** - Ensure test passes before recording
192
+ 5. **Keep videos under 5 minutes** - Split longer tutorials into parts
193
+
194
+ ## Running Only Doc Tests
195
+
196
+ Use tags to filter:
197
+
198
+ ```bash
199
+ # Run only documentation tests
200
+ pnpm cy:run --env grepTags=@doc
201
+
202
+ # Run only tutorial tests
203
+ pnpm cy:run --env grepTags=@tutorial
204
+
205
+ # Exclude doc tests from regular test runs
206
+ pnpm cy:run --env grepTags=-@doc
207
+ ```
208
+
209
+ ## Future Enhancements
210
+
211
+ - [ ] Automated subtitle generation script
212
+ - [ ] Integration with AI narration APIs
213
+ - [ ] FFmpeg post-processing script
214
+ - [ ] Multi-language support
215
+ - [ ] Automated upload to docs site