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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/api/ai/chat/stream/route.ts +4 -1
  2. package/api/ai/orchestrator/route.ts +10 -3
  3. package/api/ai/single-agent/route.ts +10 -3
  4. package/api/ai/usage/route.ts +4 -1
  5. package/blocks/benefits/component.tsx +4 -4
  6. package/blocks/cta-section/component.tsx +4 -4
  7. package/blocks/faq-accordion/component.tsx +2 -2
  8. package/blocks/features-grid/component.tsx +5 -5
  9. package/blocks/hero/component.tsx +2 -2
  10. package/blocks/hero/fields.ts +1 -1
  11. package/blocks/hero-with-form/component.tsx +7 -7
  12. package/blocks/hero-with-form/fields.ts +1 -1
  13. package/blocks/jumbotron/component.tsx +7 -7
  14. package/blocks/jumbotron/fields.ts +1 -1
  15. package/blocks/logo-cloud/component.tsx +6 -6
  16. package/blocks/logo-cloud/fields.ts +1 -1
  17. package/blocks/post-content/component.tsx +2 -2
  18. package/blocks/pricing-table/component.tsx +5 -5
  19. package/blocks/split-content/component.tsx +5 -5
  20. package/blocks/split-content/fields.ts +1 -1
  21. package/blocks/stats-counter/component.tsx +9 -9
  22. package/blocks/testimonials/component.tsx +4 -4
  23. package/blocks/testimonials/fields.ts +1 -1
  24. package/blocks/text-content/component.tsx +12 -10
  25. package/blocks/timeline/component.tsx +12 -12
  26. package/blocks/video-hero/component.tsx +7 -7
  27. package/blocks/video-hero/fields.ts +1 -1
  28. package/components/ai-chat/ChatPanel.tsx +7 -7
  29. package/components/ai-chat/Message.tsx +2 -2
  30. package/components/ai-chat/MessageInput.tsx +3 -3
  31. package/components/ai-chat/MessageList.tsx +3 -3
  32. package/components/ai-chat/TypingIndicator.tsx +2 -2
  33. package/config/app.config.ts +90 -62
  34. package/config/billing.config.ts +5 -10
  35. package/config/dashboard.config.ts +14 -0
  36. package/config/features.config.ts +10 -0
  37. package/config/permissions.config.ts +22 -23
  38. package/docs/{01-overview → public/01-overview}/01-introduction.md +5 -0
  39. package/docs/{01-overview → public/01-overview}/02-customization.md +5 -0
  40. package/docs/{02-features → public/02-features}/03-tasks-entity.md +5 -0
  41. package/docs/{03-ai → public/03-ai}/01-overview.md +5 -0
  42. package/docs/{03-ai → public/03-ai}/02-customization.md +5 -0
  43. package/docs/superadmin/01-setup/01-configuration.md +79 -0
  44. package/docs/superadmin/01-setup/02-deployment.md +82 -0
  45. package/docs/superadmin/02-management/01-users.md +83 -0
  46. package/docs/superadmin/03-integrations/01-langchain.md +139 -0
  47. package/emails/verify-email.ts +33 -0
  48. package/entities/customers/api/docs.md +107 -0
  49. package/entities/customers/api/presets.ts +80 -0
  50. package/entities/pages/api/docs.md +114 -0
  51. package/entities/pages/api/presets.ts +72 -0
  52. package/entities/posts/api/docs.md +120 -0
  53. package/entities/posts/api/presets.ts +74 -0
  54. package/entities/tasks/api/docs.md +126 -0
  55. package/entities/tasks/api/presets.ts +84 -0
  56. package/lib/selectors.ts +7 -4
  57. package/messages/de/admin.json +45 -0
  58. package/messages/en/admin.json +56 -0
  59. package/messages/en/navigation.json +2 -1
  60. package/messages/es/admin.json +56 -0
  61. package/messages/es/navigation.json +2 -1
  62. package/messages/fr/admin.json +45 -0
  63. package/messages/it/admin.json +45 -0
  64. package/messages/pt/admin.json +45 -0
  65. package/migrations/089_add_editor_team_role.sql +15 -23
  66. package/migrations/090_demo_users_teams.sql +11 -11
  67. package/migrations/091_greek_teams_billing.sql +15 -15
  68. package/migrations/093_pages_sample_data.sql +7 -7
  69. package/migrations/098_patterns_sample_data.sql +234 -0
  70. package/nextsparkjs-theme-default-0.1.0-beta.137.tgz +0 -0
  71. package/package.json +4 -3
  72. package/styles/globals.css +42 -0
  73. package/templates/(public)/page.tsx +1 -1
  74. package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
  75. package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
  76. package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
  77. package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
  78. package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
  79. package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
  80. package/tests/cypress/e2e/_utils/docs/README.md +215 -0
  81. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  82. package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
  83. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  84. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  85. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
  86. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
  87. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  88. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  89. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  90. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  91. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  92. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
  93. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
  94. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
  95. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
  96. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  97. package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
  98. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  99. package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
  100. package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
  101. package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
  102. package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
  103. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  104. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
  105. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  106. package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
  107. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
  108. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
  109. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  110. package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
  111. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  112. package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
  113. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  114. package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
  115. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  116. package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
  117. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
  118. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
  119. package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
  120. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  121. package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
  122. package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
  123. package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
  124. package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
  125. package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
  126. package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
  127. package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
  128. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
  129. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
  130. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  131. package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
  132. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  133. package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
  134. package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
  135. package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
  136. package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
  137. package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
  138. package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
  139. package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
  140. package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
  141. package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
  142. package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
  143. package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
  144. package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
  145. package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
  146. package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
  147. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
  148. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
  149. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  150. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  151. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
  152. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
  153. package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
  154. package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
  155. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  156. package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
  157. package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
  158. package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
  159. package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
  160. package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
  161. package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
  162. package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
  163. package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
  164. package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
  165. package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
  166. package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
  167. package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
  168. package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
  169. package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
  170. package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
  171. package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
  172. package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
  173. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
  174. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
  175. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
  176. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
  177. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
  178. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
  179. package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
  180. package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
  181. package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
  182. package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
  183. package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
  184. package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
  185. package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
  186. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
  187. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
  188. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
  189. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
  190. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
  191. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
  192. package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
  193. package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
  194. package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
  195. package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
  196. package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
  197. package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
  198. package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
  199. package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
  200. package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
  201. package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
  202. package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
  203. package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
  204. package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
  205. package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
  206. package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
  207. package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
  208. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
  209. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
  210. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  211. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
  212. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
  213. package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
  214. package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
  215. package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
  216. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  217. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  218. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  219. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  220. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  221. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  222. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  223. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  224. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  225. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  226. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  227. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  228. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  229. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  230. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  231. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  232. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  233. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  234. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  235. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  236. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  237. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  238. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  239. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  240. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  241. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  242. package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
  243. package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
  244. package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
  245. package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
  246. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
  247. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
  248. package/tests/cypress/fixtures/blocks.json +218 -0
  249. package/tests/cypress/fixtures/entities.json +87 -0
  250. package/tests/cypress/fixtures/page-builder.json +21 -0
  251. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  252. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  253. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  254. package/tests/cypress/src/components/EntityForm.ts +375 -0
  255. package/tests/cypress/src/components/EntityList.ts +389 -0
  256. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  257. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  258. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  259. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  260. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  261. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  262. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  263. package/tests/cypress/src/components/index.ts +21 -0
  264. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  265. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  266. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  267. package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
  268. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  269. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  270. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  271. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  272. package/tests/cypress/src/controllers/index.js +25 -0
  273. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  274. package/tests/cypress/src/core/BasePOM.ts +33 -0
  275. package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
  276. package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
  277. package/tests/cypress/src/core/index.ts +14 -0
  278. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  279. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  280. package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
  281. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  282. package/tests/cypress/src/entities/TasksPOM.ts +246 -0
  283. package/tests/cypress/src/entities/index.ts +16 -0
  284. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  285. package/tests/cypress/src/features/DashboardPOM.ts +271 -0
  286. package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
  287. package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
  288. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  289. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  290. package/tests/cypress/src/features/SettingsPOM.ts +707 -0
  291. package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
  292. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  293. package/tests/cypress/src/features/index.ts +28 -0
  294. package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
  295. package/tests/cypress/src/index.ts +101 -0
  296. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  297. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  298. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  299. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  300. package/tests/cypress/src/pages/index.js +5 -0
  301. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  302. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  303. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  304. package/tests/cypress/src/pages/public/index.js +6 -0
  305. package/tests/cypress/src/selectors.ts +46 -0
  306. package/tests/cypress/src/session-helpers.ts +518 -0
  307. package/tests/cypress/support/doc-commands.ts +260 -0
  308. package/tests/cypress/support/e2e.ts +90 -0
  309. package/tests/cypress.config.ts +178 -0
  310. package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
  311. package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
  312. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
  313. package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
  314. package/tests/jest/__mocks__/jose.js +22 -0
  315. package/tests/jest/__mocks__/next/image.js +15 -0
  316. package/tests/jest/__mocks__/next-server.js +56 -0
  317. package/tests/jest/components/post-header.test.tsx +377 -0
  318. package/tests/jest/jest.config.cjs +154 -0
  319. package/tests/jest/langchain/COVERAGE.md +372 -0
  320. package/tests/jest/langchain/guardrails.test.ts +465 -0
  321. package/tests/jest/langchain/streaming.test.ts +370 -0
  322. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  323. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  324. package/tests/jest/langchain/tracer.test.ts +823 -0
  325. package/tests/jest/services/tasks.service.test.ts +707 -0
  326. package/tests/jest/setup.ts +170 -0
  327. package/tests/jest/tsconfig.jest.json +6 -0
  328. package/tests/jest/validation/categories.test.ts +429 -0
  329. package/tests/jest/validation/posts.test.ts +546 -0
  330. package/tests/tsconfig.json +21 -0
  331. /package/docs/{02-features → public/02-features}/01-components.md +0 -0
  332. /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * UI Selectors Validation: Global Search
3
+ *
4
+ * This test validates that global search selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate globalSearch.* selectors work correctly
9
+ * - Ensure search modal and components are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to dashboard (requires login)
14
+ * - Open search modal
15
+ * - Assert elements exist in DOM (no actual search)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_GSRCH_001: Search Trigger
19
+ * - SEL_GSRCH_002: Search Modal (when open)
20
+ * - SEL_GSRCH_003: Search Modal (opened via click)
21
+ *
22
+ * NOTE: Search modal must be opened via keyboard shortcut or trigger button.
23
+ */
24
+
25
+ import { cySelector } from '../../../src/selectors'
26
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
27
+
28
+ describe('Global Search Selectors Validation', { tags: ['@ui-selectors', '@search'] }, () => {
29
+ // Define selectors locally since globalSearch might not be in selectors.ts
30
+ const selectors = {
31
+ modal: cySelector('globalSearch.modal'),
32
+ trigger: cySelector('globalSearch.trigger'),
33
+ input: cySelector('globalSearch.input'),
34
+ results: cySelector('globalSearch.results'),
35
+ result: cySelector('globalSearch.result'),
36
+ }
37
+
38
+ beforeEach(() => {
39
+ loginAsDefaultDeveloper()
40
+ cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
41
+ cy.url().should('include', '/dashboard')
42
+ })
43
+
44
+ // ============================================
45
+ // SEL_GSRCH_001: SEARCH TRIGGER (1 selector)
46
+ // ============================================
47
+ describe('SEL_GSRCH_001: Search Trigger', { tags: '@SEL_GSRCH_001' }, () => {
48
+ it.skip('should find search trigger button (selector not implemented)', () => {
49
+ cy.get(selectors.trigger).should('exist')
50
+ })
51
+ })
52
+
53
+ // ============================================
54
+ // SEL_GSRCH_002: SEARCH MODAL (4 selectors)
55
+ // These require the modal to be open
56
+ // ============================================
57
+ describe('SEL_GSRCH_002: Search Modal (when open)', { tags: '@SEL_GSRCH_002' }, () => {
58
+ beforeEach(() => {
59
+ // Try to open search modal via keyboard shortcut (Cmd+K or Ctrl+K)
60
+ cy.get('body').type('{meta}k')
61
+ // Wait a bit for modal to open
62
+ cy.wait(500)
63
+ })
64
+
65
+ it.skip('should find search modal container (selector not implemented)', () => {
66
+ cy.get(selectors.modal).should('exist')
67
+ })
68
+
69
+ it('should find search input', () => {
70
+ cy.get(selectors.input).should('exist')
71
+ })
72
+
73
+ it.skip('should find search results container (requires search query)', () => {
74
+ cy.get(selectors.results).should('exist')
75
+ })
76
+
77
+ it.skip('should find search result item (requires search query with results)', () => {
78
+ cy.get(selectors.result).should('exist')
79
+ })
80
+ })
81
+
82
+ // ============================================
83
+ // SEL_GSRCH_003: SEARCH MODAL VIA CLICK
84
+ // ============================================
85
+ describe('SEL_GSRCH_003: Search Modal (opened via click)', { tags: '@SEL_GSRCH_003' }, () => {
86
+ it.skip('should open search modal when clicking trigger (trigger selector not implemented)', () => {
87
+ cy.get(selectors.trigger).click()
88
+ cy.wait(500)
89
+ cy.get(selectors.modal).should('exist')
90
+ cy.get(selectors.input).should('exist')
91
+ })
92
+ })
93
+ })
@@ -0,0 +1,388 @@
1
+ ---
2
+ feature: Patterns UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, patterns, ui-validation]
5
+ grepTags: [ui-selectors, patterns, feat-patterns, SEL_PAT_001, SEL_PAT_002, SEL_PAT_003, SEL_PAT_004, SEL_PAT_005, SEL_PAT_006, SEL_PAT_007, SEL_PAT_008]
6
+ coverage: 8
7
+ ---
8
+
9
+ # Patterns UI Selectors Validation
10
+
11
+ > Validates that patterns-specific selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Validates KEY DIFFERENCES from standard entity editor: no slug input and no patterns tab in block picker.
12
+
13
+ **Login:** Uses Developer via `loginAsDefaultDeveloper()`.
14
+
15
+ **Dependencies:**
16
+ - Sample patterns must exist (from seed data)
17
+ - At least one pattern must have usages (for reports tests)
18
+
19
+ ## @test SEL_PAT_001: Patterns List Page Selectors
20
+
21
+ ### Metadata
22
+ - **Priority:** High
23
+ - **Type:** Selector Validation
24
+ - **Tags:** patterns, list, page
25
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_001`
26
+ - **Status:** Active (5 passing, 0 skipped)
27
+
28
+ ```gherkin:en
29
+ Scenario: Patterns list page has complete selector coverage
30
+
31
+ Given I am logged in as a developer user
32
+ And I navigate to the patterns list page
33
+ Then I should find the page container
34
+ And I should find the page title
35
+ And I should find the add button
36
+ And I should find the search container
37
+ And I should find the table container
38
+ ```
39
+
40
+ ```gherkin:es
41
+ Scenario: Pagina de lista de patrones tiene cobertura completa de selectores
42
+
43
+ Given estoy logueado como usuario developer
44
+ And navego a la pagina de lista de patrones
45
+ Then deberia encontrar el contenedor de pagina
46
+ And deberia encontrar el titulo de pagina
47
+ And deberia encontrar el boton de agregar
48
+ And deberia encontrar el contenedor de busqueda
49
+ And deberia encontrar el contenedor de tabla
50
+ ```
51
+
52
+ ### Expected Results
53
+ | Test ID | Selector Path | Status |
54
+ |---------|---------------|--------|
55
+ | SEL_PAT_001_01 | patterns.selectors.page | Implemented |
56
+ | SEL_PAT_001_02 | patterns.selectors.title | Implemented |
57
+ | SEL_PAT_001_03 | patterns.selectors.addBtn | Implemented |
58
+ | SEL_PAT_001_04 | patterns.selectors.searchContainer | Implemented |
59
+ | SEL_PAT_001_05 | patterns.selectors.table | Implemented |
60
+
61
+ ---
62
+
63
+ ## @test SEL_PAT_002: Patterns List Table Actions
64
+
65
+ ### Metadata
66
+ - **Priority:** High
67
+ - **Type:** Selector Validation
68
+ - **Tags:** patterns, list, actions, table
69
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_002`
70
+ - **Status:** Active (4 passing, 0 skipped)
71
+
72
+ ```gherkin:en
73
+ Scenario: Patterns list table has all row action selectors
74
+
75
+ Given I am logged in as a developer user
76
+ And I navigate to the patterns list page
77
+ And at least one pattern exists in the database
78
+ Then I should find the row menu for the first pattern
79
+ When I click the row menu
80
+ Then I should find the edit action
81
+ And I should find the delete action
82
+ And I should find the usages quick action
83
+ ```
84
+
85
+ ```gherkin:es
86
+ Scenario: Tabla de lista de patrones tiene todos los selectores de acciones de fila
87
+
88
+ Given estoy logueado como usuario developer
89
+ And navego a la pagina de lista de patrones
90
+ And al menos un patron existe en la base de datos
91
+ Then deberia encontrar el menu de fila del primer patron
92
+ When hago click en el menu de fila
93
+ Then deberia encontrar la accion de editar
94
+ And deberia encontrar la accion de eliminar
95
+ And deberia encontrar la accion rapida de usos
96
+ ```
97
+
98
+ ### Expected Results
99
+ | Test ID | Selector Path | Status |
100
+ |---------|---------------|--------|
101
+ | SEL_PAT_002_01 | patterns.selectors.rowMenu(id) | Implemented |
102
+ | SEL_PAT_002_02 | patterns.selectors.rowAction('edit', id) | Implemented |
103
+ | SEL_PAT_002_03 | patterns.selectors.rowAction('delete', id) | Implemented |
104
+ | SEL_PAT_002_04 | patterns.selectors.rowAction('usages', id) | Implemented |
105
+
106
+ ---
107
+
108
+ ## @test SEL_PAT_003: Patterns Editor Header - KEY DIFFERENCES
109
+
110
+ ### Metadata
111
+ - **Priority:** High
112
+ - **Type:** Selector Validation
113
+ - **Tags:** patterns, editor, header, differences
114
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_003`
115
+ - **Status:** Active (5 passing, 0 skipped)
116
+
117
+ ```gherkin:en
118
+ Scenario: Patterns editor header validates key differences from standard editor
119
+
120
+ Given I am logged in as a developer user
121
+ And I navigate to create a new pattern
122
+ And the editor is loaded
123
+ Then I should find the header container
124
+ And I should find the title input
125
+ And I should NOT find the slug input (patterns-specific)
126
+ And I should find the save button
127
+ And I should find the view mode toggle
128
+ ```
129
+
130
+ ```gherkin:es
131
+ Scenario: Header del editor de patrones valida diferencias clave del editor estandar
132
+
133
+ Given estoy logueado como usuario developer
134
+ And navego a crear un nuevo patron
135
+ And el editor esta cargado
136
+ Then deberia encontrar el contenedor del header
137
+ And deberia encontrar el input de titulo
138
+ And NO deberia encontrar el input de slug (especifico de patrones)
139
+ And deberia encontrar el boton de guardar
140
+ And deberia encontrar el toggle de modo de vista
141
+ ```
142
+
143
+ ### Expected Results
144
+ | Test ID | Selector Path | Assertion | Status |
145
+ |---------|---------------|-----------|--------|
146
+ | SEL_PAT_003_01 | blockEditor.header.container | should exist | Implemented |
147
+ | SEL_PAT_003_02 | blockEditor.header.titleInput | should exist | Implemented |
148
+ | SEL_PAT_003_03 | blockEditor.header.slugInput | should NOT exist | **KEY DIFFERENCE** |
149
+ | SEL_PAT_003_04 | blockEditor.header.saveButton | should exist | Implemented |
150
+ | SEL_PAT_003_05 | blockEditor.header.viewToggle | should exist | Implemented |
151
+
152
+ ### Notes
153
+ - **KEY DIFFERENCE:** Patterns do not have slugs, so the slug input should NOT exist.
154
+
155
+ ---
156
+
157
+ ## @test SEL_PAT_004: Patterns Editor Block Picker - KEY DIFFERENCES
158
+
159
+ ### Metadata
160
+ - **Priority:** High
161
+ - **Type:** Selector Validation
162
+ - **Tags:** patterns, editor, block-picker, differences
163
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_004`
164
+ - **Status:** Active (5 passing, 0 skipped)
165
+
166
+ ```gherkin:en
167
+ Scenario: Patterns block picker validates key differences from standard editor
168
+
169
+ Given I am logged in as a developer user
170
+ And I navigate to create a new pattern
171
+ And the editor is loaded
172
+ Then I should find the block picker container
173
+ And I should find the blocks tab
174
+ And I should NOT find the patterns tab (patterns-specific)
175
+ And I should find the config tab
176
+ And I should find the search input
177
+ ```
178
+
179
+ ```gherkin:es
180
+ Scenario: Block picker de patrones valida diferencias clave del editor estandar
181
+
182
+ Given estoy logueado como usuario developer
183
+ And navego a crear un nuevo patron
184
+ And el editor esta cargado
185
+ Then deberia encontrar el contenedor del block picker
186
+ And deberia encontrar la pestana de bloques
187
+ And NO deberia encontrar la pestana de patrones (especifico de patrones)
188
+ And deberia encontrar la pestana de configuracion
189
+ And deberia encontrar el input de busqueda
190
+ ```
191
+
192
+ ### Expected Results
193
+ | Test ID | Selector Path | Assertion | Status |
194
+ |---------|---------------|-----------|--------|
195
+ | SEL_PAT_004_01 | blockEditor.blockPicker.container | should exist | Implemented |
196
+ | SEL_PAT_004_02 | blockEditor.blockPicker.tabBlocks | should exist | Implemented |
197
+ | SEL_PAT_004_03 | blockEditor.blockPicker.tabPatterns | should NOT exist | **KEY DIFFERENCE** |
198
+ | SEL_PAT_004_04 | blockEditor.blockPicker.tabConfig | should exist | **Skipped** (patterns have no sidebarFields/taxonomies) |
199
+ | SEL_PAT_004_05 | blockEditor.blockPicker.searchInput | should exist | Implemented |
200
+
201
+ ### Notes
202
+ - **KEY DIFFERENCE:** Patterns cannot contain other patterns (to prevent recursion), so the patterns tab should NOT exist.
203
+
204
+ ---
205
+
206
+ ## @test SEL_PAT_005: Patterns Reports Page
207
+
208
+ ### Metadata
209
+ - **Priority:** Medium
210
+ - **Type:** Selector Validation
211
+ - **Tags:** patterns, reports, usages
212
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_005`
213
+ - **Status:** Active (4 passing, 0 skipped)
214
+
215
+ ```gherkin:en
216
+ Scenario: Pattern usages report page has complete structure
217
+
218
+ Given I am logged in as a developer user
219
+ And I navigate to the patterns list page
220
+ And I click the usages action on the first pattern
221
+ Then I should find the report container
222
+ And I should find the back button
223
+ And I should find the page title
224
+ And I should find the edit button
225
+ ```
226
+
227
+ ```gherkin:es
228
+ Scenario: Pagina de reporte de usos de patrones tiene estructura completa
229
+
230
+ Given estoy logueado como usuario developer
231
+ And navego a la pagina de lista de patrones
232
+ And hago click en la accion de usos del primer patron
233
+ Then deberia encontrar el contenedor del reporte
234
+ And deberia encontrar el boton de volver
235
+ And deberia encontrar el titulo de pagina
236
+ And deberia encontrar el boton de editar
237
+ ```
238
+
239
+ ### Expected Results
240
+ | Test ID | Selector Path | Status |
241
+ |---------|---------------|--------|
242
+ | SEL_PAT_005_01 | patterns.patternSelectors.usageReport.container | Implemented |
243
+ | SEL_PAT_005_02 | patterns.selectors.backButton | Implemented |
244
+ | SEL_PAT_005_03 | patterns.selectors.headerTitle | Implemented |
245
+ | SEL_PAT_005_04 | patterns.selectors.editButton | Implemented |
246
+
247
+ ---
248
+
249
+ ## @test SEL_PAT_006: Pattern Usage Stats
250
+
251
+ ### Metadata
252
+ - **Priority:** Medium
253
+ - **Type:** Selector Validation
254
+ - **Tags:** patterns, reports, stats
255
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_006`
256
+ - **Status:** Active (3 passing, 0 skipped)
257
+
258
+ ```gherkin:en
259
+ Scenario: Pattern usage stats have all required selectors
260
+
261
+ Given I am logged in as a developer user
262
+ And I navigate to a pattern's usages page
263
+ Then I should find the stats container
264
+ And I should find the total usage card
265
+ And I should find usage by type cards (if usages exist)
266
+ ```
267
+
268
+ ```gherkin:es
269
+ Scenario: Estadisticas de uso de patron tienen todos los selectores requeridos
270
+
271
+ Given estoy logueado como usuario developer
272
+ And navego a la pagina de usos de un patron
273
+ Then deberia encontrar el contenedor de estadisticas
274
+ And deberia encontrar la tarjeta de uso total
275
+ And deberia encontrar las tarjetas de uso por tipo (si existen usos)
276
+ ```
277
+
278
+ ### Expected Results
279
+ | Test ID | Selector Path | Status |
280
+ |---------|---------------|--------|
281
+ | SEL_PAT_006_01 | patterns.patternSelectors.usageStats.container | Implemented |
282
+ | SEL_PAT_006_02 | patterns.patternSelectors.usageStats.total | Implemented |
283
+ | SEL_PAT_006_03 | patterns.patternSelectors.usageStats.byType(type) | Conditional |
284
+
285
+ ---
286
+
287
+ ## @test SEL_PAT_007: Pattern Usage Report Controls
288
+
289
+ ### Metadata
290
+ - **Priority:** Medium
291
+ - **Type:** Selector Validation
292
+ - **Tags:** patterns, reports, controls, pagination
293
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_007`
294
+ - **Status:** Active (6 passing, 0 skipped)
295
+
296
+ ```gherkin:en
297
+ Scenario: Pattern usage report controls have all required selectors
298
+
299
+ Given I am logged in as a developer user
300
+ And I navigate to a pattern's usages page
301
+ Then I should find the report container
302
+ And I should find the filter select
303
+ And I should find the pagination container
304
+ And I should find the prev page button
305
+ And I should find the next page button
306
+ And I should find the results info
307
+ ```
308
+
309
+ ```gherkin:es
310
+ Scenario: Controles de reporte de uso de patron tienen todos los selectores requeridos
311
+
312
+ Given estoy logueado como usuario developer
313
+ And navego a la pagina de usos de un patron
314
+ Then deberia encontrar el contenedor del reporte
315
+ And deberia encontrar el select de filtro
316
+ And deberia encontrar el contenedor de paginacion
317
+ And deberia encontrar el boton de pagina anterior
318
+ And deberia encontrar el boton de pagina siguiente
319
+ And deberia encontrar la info de resultados
320
+ ```
321
+
322
+ ### Expected Results
323
+ | Test ID | Selector Path | Status |
324
+ |---------|---------------|--------|
325
+ | SEL_PAT_007_01 | patterns.patternSelectors.usageReport.container | Implemented |
326
+ | SEL_PAT_007_02 | patterns.patternSelectors.usageReport.filterSelect | Implemented |
327
+ | SEL_PAT_007_03 | patterns.patternSelectors.usageReport.pagination | Implemented |
328
+ | SEL_PAT_007_04 | patterns.patternSelectors.usageReport.prevPage | Implemented |
329
+ | SEL_PAT_007_05 | patterns.patternSelectors.usageReport.nextPage | Implemented |
330
+ | SEL_PAT_007_06 | patterns.patternSelectors.usageReport.resultsInfo | Implemented |
331
+
332
+ ---
333
+
334
+ ## @test SEL_PAT_008: Pattern Usage Table
335
+
336
+ ### Metadata
337
+ - **Priority:** Medium
338
+ - **Type:** Selector Validation
339
+ - **Tags:** patterns, reports, table
340
+ - **Grep:** `@ui-selectors` `@patterns` `@feat-patterns` `@SEL_PAT_008`
341
+ - **Status:** Partial (1 passing, 2 skipped)
342
+
343
+ ```gherkin:en
344
+ Scenario: Pattern usage table has all required selectors
345
+
346
+ Given I am logged in as a developer user
347
+ And I navigate to a pattern's usages page
348
+ Then I should find the usage table container (or empty state)
349
+ And I should find usage rows (if pattern has usages)
350
+ And I should find view links in usage rows (if pattern has usages)
351
+ ```
352
+
353
+ ```gherkin:es
354
+ Scenario: Tabla de usos de patron tiene todos los selectores requeridos
355
+
356
+ Given estoy logueado como usuario developer
357
+ And navego a la pagina de usos de un patron
358
+ Then deberia encontrar el contenedor de tabla de usos (o estado vacio)
359
+ And deberia encontrar filas de uso (si el patron tiene usos)
360
+ And deberia encontrar links de ver en filas de uso (si el patron tiene usos)
361
+ ```
362
+
363
+ ### Expected Results
364
+ | Test ID | Selector Path | Status |
365
+ |---------|---------------|--------|
366
+ | SEL_PAT_008_01 | patterns.patternSelectors.usageTable.container/empty | Implemented |
367
+ | SEL_PAT_008_02 | [data-cy^="pattern-usage-row-"] | **Skipped** |
368
+ | SEL_PAT_008_03 | [data-cy^="pattern-usage-view-"] | **Skipped** |
369
+
370
+ ### Notes
371
+ - Tests SEL_PAT_008_02 and SEL_PAT_008_03 are skipped because they require the pattern to have actual usages.
372
+
373
+ ---
374
+
375
+ ## Related Components
376
+
377
+ | Component | File | Key Selectors |
378
+ |-----------|------|---------------|
379
+ | PatternsListPage | `packages/core/src/app/[locale]/(auth)/dashboard/patterns/page.tsx` | page, title, addBtn, table |
380
+ | PatternEditor | `packages/core/src/components/page-builder/PageBuilder.tsx` | header.*, blockPicker.* |
381
+ | PatternUsagesPage | `packages/core/src/app/[locale]/(auth)/dashboard/patterns/[id]/usages/page.tsx` | usageReport.*, usageStats.* |
382
+
383
+ ## Related POMs
384
+
385
+ | POM | File | Usage |
386
+ |-----|------|-------|
387
+ | PatternsPOM | `themes/default/tests/cypress/src/entities/PatternsPOM.ts` | List operations, entity selectors |
388
+ | PageBuilderPOM | `themes/default/tests/cypress/src/features/PageBuilderPOM.ts` | Editor selectors |