@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,76 @@
1
+ ---
2
+ feature: Dashboard Sidebar UI Selectors Validation
3
+ priority: medium
4
+ tags: [selectors, sidebar, dashboard, ui-validation]
5
+ grepTags: [ui-selectors, dashboard, sidebar, SEL_DBAR_001]
6
+ coverage: 1
7
+ ---
8
+
9
+ # Dashboard Sidebar UI Selectors Validation
10
+
11
+ > Validates that dashboard sidebar component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Runs as Phase 12 sub-gate before functional tests.
12
+
13
+ **IMPORTANT:** Sidebar is only visible on desktop viewports (>= 1024px) when authenticated.
14
+
15
+ **Login:** Uses Developer via `loginAsDefaultDeveloper()`.
16
+
17
+ ## @test SEL_DBAR_001: Sidebar Structure
18
+
19
+ ### Metadata
20
+ - **Priority:** High
21
+ - **Type:** Selector Validation
22
+ - **Tags:** sidebar, structure, desktop
23
+ - **Grep:** `@ui-selectors` `@dashboard` `@sidebar` `@SEL_DBAR_001`
24
+ - **Status:** Active (4 passing, 1 skipped)
25
+
26
+ ```gherkin:en
27
+ Scenario: Dashboard sidebar has required structure selectors
28
+
29
+ Given I am logged in as a developer user
30
+ And I am viewing the dashboard on desktop viewport
31
+ Then I should find the sidebar container
32
+ And I should find the sidebar header
33
+ And I should find the sidebar logo
34
+ And I should find the sidebar content
35
+ And I should find the sidebar footer (not implemented in component)
36
+ ```
37
+
38
+ ```gherkin:es
39
+ Scenario: Sidebar del dashboard tiene selectores de estructura requeridos
40
+
41
+ Given estoy logueado como usuario developer
42
+ And estoy viendo el dashboard en viewport desktop
43
+ Then deberia encontrar el contenedor del sidebar
44
+ And deberia encontrar el header del sidebar
45
+ And deberia encontrar el logo del sidebar
46
+ And deberia encontrar el contenido del sidebar
47
+ And deberia encontrar el footer del sidebar (no implementado en componente)
48
+ ```
49
+
50
+ ### Expected Results
51
+ | Selector Path | POM Accessor | data-cy Value | Status |
52
+ |---------------|--------------|---------------|--------|
53
+ | dashboard.sidebar.container | dashboard.selectors.sidebarContainer | sidebar-main | Implemented |
54
+ | dashboard.sidebar.header | dashboard.selectors.sidebarHeader | sidebar-header | Implemented |
55
+ | dashboard.sidebar.logo | dashboard.selectors.sidebarLogo | sidebar-logo | Implemented |
56
+ | dashboard.sidebar.content | dashboard.selectors.sidebarContent | sidebar-content | Implemented |
57
+ | dashboard.sidebar.footer | dashboard.selectors.sidebarFooter | sidebar-footer | **NOT IMPLEMENTED** |
58
+
59
+ ### Notes
60
+ - The sidebar footer selector is not currently implemented in Sidebar.tsx component
61
+ - Sidebar is only visible on desktop viewports when authenticated
62
+ - Component file: `packages/core/src/components/dashboard/Sidebar.tsx`
63
+
64
+ ---
65
+
66
+ ## Related Components
67
+
68
+ | Component | File | Selectors |
69
+ |-----------|------|-----------|
70
+ | Sidebar | `packages/core/src/components/dashboard/Sidebar.tsx` | sidebar-main, sidebar-header, sidebar-logo, sidebar-content |
71
+
72
+ ## Related POMs
73
+
74
+ | POM | File | Usage |
75
+ |-----|------|-------|
76
+ | DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Sidebar selectors and methods |
@@ -0,0 +1,68 @@
1
+ /**
2
+ * UI Selectors Validation: Dashboard Sidebar
3
+ *
4
+ * This test validates that dashboard sidebar selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate DashboardPOM sidebar selectors work correctly
9
+ * - Ensure all dashboard.sidebar.* selectors are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to dashboard (requires login)
14
+ * - Assert elements exist in DOM (no form submissions)
15
+ * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_DBAR_001: Sidebar Structure (4 selectors)
19
+ *
20
+ * Component: Sidebar.tsx
21
+ * Selectors:
22
+ * - dashboard.sidebar.container → 'sidebar-main'
23
+ * - dashboard.sidebar.header → 'sidebar-header'
24
+ * - dashboard.sidebar.logo → 'sidebar-logo'
25
+ * - dashboard.sidebar.content → 'sidebar-content'
26
+ * - dashboard.sidebar.footer → 'sidebar-footer' (not implemented in component)
27
+ *
28
+ * NOTE: Sidebar is only visible on desktop viewports when authenticated.
29
+ */
30
+
31
+ import { DashboardPOM } from '../../../src/features/DashboardPOM'
32
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
33
+
34
+ describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@sidebar'] }, () => {
35
+ const dashboard = DashboardPOM.create()
36
+
37
+ beforeEach(() => {
38
+ loginAsDefaultDeveloper()
39
+ cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
40
+ cy.url().should('include', '/dashboard')
41
+ })
42
+
43
+ // ============================================
44
+ // SEL_DBAR_001: SIDEBAR STRUCTURE (4 selectors)
45
+ // ============================================
46
+ describe('SEL_DBAR_001: Sidebar Structure', { tags: '@SEL_DBAR_001' }, () => {
47
+ it('should find sidebar container', () => {
48
+ cy.get(dashboard.selectors.sidebarContainer).should('exist')
49
+ })
50
+
51
+ it('should find sidebar header', () => {
52
+ cy.get(dashboard.selectors.sidebarHeader).should('exist')
53
+ })
54
+
55
+ it('should find sidebar logo', () => {
56
+ cy.get(dashboard.selectors.sidebarLogo).should('exist')
57
+ })
58
+
59
+ it('should find sidebar content', () => {
60
+ cy.get(dashboard.selectors.sidebarContent).should('exist')
61
+ })
62
+
63
+ // Not implemented in Sidebar.tsx component
64
+ it.skip('should find sidebar footer (not implemented in component)', () => {
65
+ cy.get(dashboard.selectors.sidebarFooter).should('exist')
66
+ })
67
+ })
68
+ })
@@ -0,0 +1,326 @@
1
+ ---
2
+ feature: Dashboard Topnav UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, topnav, dashboard, ui-validation]
5
+ grepTags: [ui-selectors, dashboard, topnav, SEL_TNAV_001, SEL_TNAV_002, SEL_TNAV_003, SEL_TNAV_004, SEL_TNAV_005, SEL_TNAV_006, SEL_TNAV_007]
6
+ coverage: 7
7
+ ---
8
+
9
+ # Dashboard Topnav UI Selectors Validation
10
+
11
+ > Validates that dashboard topnav component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Uses `loginAsDefaultDeveloper()` which has access to superadmin and devtools links.
12
+
13
+ **NOTE:** Public navbar tests (logo, signin, signup) are in `public.cy.ts`.
14
+
15
+ **Login:** Uses Developer via `loginAsDefaultDeveloper()`.
16
+
17
+ ## @test SEL_TNAV_001: Topnav Structure
18
+
19
+ ### Metadata
20
+ - **Priority:** High
21
+ - **Type:** Selector Validation
22
+ - **Tags:** topnav, structure, desktop
23
+ - **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_001`
24
+ - **Status:** Active (3 passing, 0 skipped)
25
+
26
+ ```gherkin:en
27
+ Scenario: Dashboard topnav has complete structure
28
+
29
+ Given I am logged in as a developer user
30
+ And I navigate to the dashboard
31
+ Then I should find the topnav container
32
+ And I should find the topnav actions container
33
+ And I should find the topnav search container
34
+ ```
35
+
36
+ ```gherkin:es
37
+ Scenario: Topnav del dashboard tiene estructura completa
38
+
39
+ Given estoy logueado como usuario developer
40
+ And navego al dashboard
41
+ Then deberia encontrar el contenedor del topnav
42
+ And deberia encontrar el contenedor de acciones del topnav
43
+ And deberia encontrar el contenedor de busqueda del topnav
44
+ ```
45
+
46
+ ### Expected Results
47
+ | Selector Path | POM Accessor | data-cy Value | Status |
48
+ |---------------|--------------|---------------|--------|
49
+ | dashboard.topnav.container | dashboard.selectors.topnavContainer | topnav-header | Implemented |
50
+ | dashboard.topnav.actions | dashboard.selectors.topnavActions | topnav-actions | Implemented |
51
+ | dashboard.topnav.searchContainer | dashboard.selectors.topnavSearchContainer | topnav-search-section | Implemented |
52
+
53
+ ---
54
+
55
+ ## @test SEL_TNAV_002: Topnav Actions
56
+
57
+ ### Metadata
58
+ - **Priority:** High
59
+ - **Type:** Selector Validation
60
+ - **Tags:** topnav, actions, buttons
61
+ - **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_002`
62
+ - **Status:** Active (4 passing, 0 skipped)
63
+
64
+ ```gherkin:en
65
+ Scenario: Dashboard topnav has all action buttons
66
+
67
+ Given I am logged in as a valid user
68
+ And I navigate to the dashboard
69
+ Then I should find the sidebar toggle button
70
+ And I should find the notifications trigger
71
+ And I should find the help button
72
+ And I should find the theme toggle button
73
+ ```
74
+
75
+ ```gherkin:es
76
+ Scenario: Topnav del dashboard tiene todos los botones de accion
77
+
78
+ Given estoy logueado como usuario valido
79
+ And navego al dashboard
80
+ Then deberia encontrar el boton de toggle del sidebar
81
+ And deberia encontrar el trigger de notificaciones
82
+ And deberia encontrar el boton de ayuda
83
+ And deberia encontrar el boton de cambio de tema
84
+ ```
85
+
86
+ ### Expected Results
87
+ | Selector Path | POM Accessor | data-cy Value | Status |
88
+ |---------------|--------------|---------------|--------|
89
+ | dashboard.topnav.sidebarToggle | dashboard.selectors.topnavSidebarToggle | topnav-sidebar-toggle | Implemented |
90
+ | dashboard.topnav.notificationsTrigger | dashboard.selectors.topnavNotificationsTrigger | topnav-notifications | Implemented |
91
+ | dashboard.topnav.help | dashboard.selectors.topnavHelp | topnav-help | Implemented |
92
+ | dashboard.topnav.themeToggle | dashboard.selectors.topnavThemeToggle | topnav-theme-toggle | Implemented |
93
+
94
+ ---
95
+
96
+ ## @test SEL_TNAV_003: Topnav Admin Links
97
+
98
+ ### Metadata
99
+ - **Priority:** Medium
100
+ - **Type:** Selector Validation
101
+ - **Tags:** topnav, admin, superadmin, devtools
102
+ - **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_003`
103
+ - **Status:** Active (2 passing, 0 skipped)
104
+
105
+ ```gherkin:en
106
+ Scenario: Topnav shows admin links for developer users
107
+
108
+ Given I am logged in as a developer user
109
+ And superadminAccess.showToDevelopers is enabled (default: true)
110
+ And devtoolsAccess is enabled (default: true)
111
+ And I navigate to the dashboard
112
+ Then I should find the superadmin link
113
+ And I should find the devtools link
114
+ ```
115
+
116
+ ```gherkin:es
117
+ Scenario: Topnav muestra links de admin para usuarios developer
118
+
119
+ Given estoy logueado como usuario developer
120
+ And superadminAccess.showToDevelopers esta habilitado (default: true)
121
+ And devtoolsAccess esta habilitado (default: true)
122
+ And navego al dashboard
123
+ Then deberia encontrar el link de superadmin
124
+ And deberia encontrar el link de devtools
125
+ ```
126
+
127
+ ### Expected Results
128
+ | Selector Path | POM Accessor | data-cy Value | Status |
129
+ |---------------|--------------|---------------|--------|
130
+ | dashboard.topnav.superadmin | dashboard.selectors.topnavSuperadmin | topnav-superadmin | Implemented |
131
+ | dashboard.topnav.devtools | dashboard.selectors.topnavDevtools | topnav-devtools | Implemented |
132
+
133
+ ### Notes
134
+ - Superadmin link: `superadminAccess.enabled && (isSuperAdmin || (isDeveloper && showToDevelopers))`
135
+ - Devtools link: `devtoolsAccess.enabled && isDeveloper`
136
+
137
+ ---
138
+
139
+ ## @test SEL_TNAV_004: User Menu
140
+
141
+ ### Metadata
142
+ - **Priority:** High
143
+ - **Type:** Selector Validation
144
+ - **Tags:** topnav, user-menu, dropdown
145
+ - **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_004`
146
+ - **Status:** Active (5 passing, 0 skipped)
147
+
148
+ ```gherkin:en
149
+ Scenario: User menu opens and shows all items
150
+
151
+ Given I am logged in as a valid user
152
+ And I navigate to the dashboard
153
+ Then I should find the user menu trigger
154
+ When I click on the user menu trigger
155
+ Then I should see the user menu content
156
+ And I should find the profile menu item (user)
157
+ And I should find the settings menu item
158
+ And I should find the signOut action
159
+ ```
160
+
161
+ ```gherkin:es
162
+ Scenario: Menu de usuario se abre y muestra todos los items
163
+
164
+ Given estoy logueado como usuario valido
165
+ And navego al dashboard
166
+ Then deberia encontrar el trigger del menu de usuario
167
+ When hago click en el trigger del menu de usuario
168
+ Then deberia ver el contenido del menu de usuario
169
+ And deberia encontrar el item de menu de perfil (user)
170
+ And deberia encontrar el item de menu de configuracion
171
+ And deberia encontrar la accion de cerrar sesion
172
+ ```
173
+
174
+ ### Expected Results
175
+ | Selector Path | POM Accessor | data-cy Value | Status |
176
+ |---------------|--------------|---------------|--------|
177
+ | dashboard.topnav.userMenuTrigger | dashboard.selectors.topnavUserMenuTrigger | topnav-user-menu-trigger | Implemented |
178
+ | dashboard.topnav.userMenuContent | dashboard.selectors.topnavUserMenuContent | topnav-user-menu | Implemented |
179
+ | dashboard.topnav.userMenuItem(item) | dashboard.selectors.topnavUserMenuItem('user') | topnav-menu-item-user | Implemented |
180
+ | dashboard.topnav.userMenuItem(item) | dashboard.selectors.topnavUserMenuItem('settings') | topnav-menu-item-settings | Implemented |
181
+ | dashboard.topnav.userMenuAction(action) | dashboard.selectors.topnavUserMenuAction('signOut') | topnav-menu-action-signOut | Implemented |
182
+
183
+ ---
184
+
185
+ ## @test SEL_TNAV_005: Quick Create
186
+
187
+ ### Metadata
188
+ - **Priority:** Medium
189
+ - **Type:** Selector Validation
190
+ - **Tags:** topnav, quick-create, dropdown
191
+ - **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_005`
192
+ - **Status:** Skipped (3 tests) - requires entity with create permission
193
+
194
+ ```gherkin:en
195
+ Scenario: Quick create dropdown shows entity options
196
+
197
+ Given I am logged in as a user with create permissions
198
+ And I navigate to the dashboard
199
+ Then I should find the quick create trigger
200
+ When I click on the quick create trigger
201
+ Then I should see the quick create content
202
+ And I should find quick create links for entities (e.g., customers)
203
+ ```
204
+
205
+ ```gherkin:es
206
+ Scenario: Dropdown de creacion rapida muestra opciones de entidad
207
+
208
+ Given estoy logueado como usuario con permisos de crear
209
+ And navego al dashboard
210
+ Then deberia encontrar el trigger de creacion rapida
211
+ When hago click en el trigger de creacion rapida
212
+ Then deberia ver el contenido de creacion rapida
213
+ And deberia encontrar links de creacion rapida para entidades (ej. customers)
214
+ ```
215
+
216
+ ### Expected Results
217
+ | Selector Path | POM Accessor | data-cy Value | Status |
218
+ |---------------|--------------|---------------|--------|
219
+ | dashboard.topnav.quickCreateTrigger | dashboard.selectors.topnavQuickCreateTrigger | topnav-quick-create-trigger | **Skipped** |
220
+ | dashboard.topnav.quickCreateContent | dashboard.selectors.topnavQuickCreateContent | topnav-quick-create-content | **Skipped** |
221
+ | dashboard.topnav.quickCreateLink(entity) | dashboard.selectors.topnavQuickCreateLink('customers') | topnav-quick-create-customers | **Skipped** |
222
+
223
+ ### Notes
224
+ - Component renders null if user has no create permissions on any entity
225
+ - Developer role may not have quickCreate entities configured
226
+ - Tests skipped because they require entity with create permission
227
+
228
+ ---
229
+
230
+ ## @test SEL_TNAV_006: Loading State
231
+
232
+ ### Metadata
233
+ - **Priority:** Low
234
+ - **Type:** Selector Validation
235
+ - **Tags:** topnav, loading, skeleton
236
+ - **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_006`
237
+ - **Status:** Skipped (1 test) - transient state cannot be reliably tested
238
+
239
+ ```gherkin:en
240
+ Scenario: Topnav shows loading state during auth
241
+
242
+ Given the authentication state is loading
243
+ And I navigate to the dashboard
244
+ Then I should find the user loading state indicator
245
+ ```
246
+
247
+ ```gherkin:es
248
+ Scenario: Topnav muestra estado de carga durante autenticacion
249
+
250
+ Given el estado de autenticacion esta cargando
251
+ And navego al dashboard
252
+ Then deberia encontrar el indicador de estado de carga del usuario
253
+ ```
254
+
255
+ ### Expected Results
256
+ | Selector Path | POM Accessor | data-cy Value | Status |
257
+ |---------------|--------------|---------------|--------|
258
+ | dashboard.topnav.userLoading | dashboard.selectors.topnavUserLoading | topnav-user-loading | **Skipped** |
259
+
260
+ ### Notes
261
+ - This transient state is only visible during auth loading
262
+ - Difficult to test reliably in normal flow
263
+
264
+ ---
265
+
266
+ ## @test SEL_TNAV_007: Settings Menu
267
+
268
+ ### Metadata
269
+ - **Priority:** Medium
270
+ - **Type:** Selector Validation
271
+ - **Tags:** topnav, settings-menu, dropdown
272
+ - **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_007`
273
+ - **Status:** Active (3 passing, 0 skipped)
274
+
275
+ ```gherkin:en
276
+ Scenario: Settings menu opens and shows links
277
+
278
+ Given I am logged in as a developer user
279
+ And the settings menu is enabled in theme config
280
+ And I navigate to the dashboard
281
+ Then I should find the settings menu trigger
282
+ When I click on the settings menu trigger
283
+ Then I should see the settings menu content
284
+ And I should find settings menu links (e.g., patterns)
285
+ ```
286
+
287
+ ```gherkin:es
288
+ Scenario: Menu de configuracion se abre y muestra links
289
+
290
+ Given estoy logueado como usuario developer
291
+ And el menu de configuracion esta habilitado en la config del tema
292
+ And navego al dashboard
293
+ Then deberia encontrar el trigger del menu de configuracion
294
+ When hago click en el trigger del menu de configuracion
295
+ Then deberia ver el contenido del menu de configuracion
296
+ And deberia encontrar links del menu de configuracion (ej. patrones)
297
+ ```
298
+
299
+ ### Expected Results
300
+ | Test ID | Selector Path | POM Accessor | data-cy Value | Status |
301
+ |---------|---------------|--------------|---------------|--------|
302
+ | SEL_TNAV_007_01 | dashboard.topnav.settingsMenu.trigger | dashboard.selectors.topnavSettingsMenuTrigger | topnav-settings-menu-trigger | Implemented |
303
+ | SEL_TNAV_007_02 | dashboard.topnav.settingsMenu.content | dashboard.selectors.topnavSettingsMenuContent | topnav-settings-menu | Implemented |
304
+ | SEL_TNAV_007_03 | dashboard.topnav.settingsMenu.link(index) | dashboard.selectors.topnavSettingsMenuLink(0) | topnav-settings-link-0 | Implemented |
305
+
306
+ ### Notes
307
+ - Settings menu must be enabled in theme config (TOPBAR_CONFIG.settingsMenu)
308
+ - Links are dynamically generated from config
309
+ - Common links include: Patterns
310
+
311
+ ---
312
+
313
+ ## Related Components
314
+
315
+ | Component | File | Selectors |
316
+ |-----------|------|-----------|
317
+ | Topnav | `packages/core/src/components/dashboard/Topnav.tsx` | topnav-header, topnav-actions, topnav-search-section |
318
+ | TopnavActions | `packages/core/src/components/dashboard/TopnavActions.tsx` | topnav-sidebar-toggle, topnav-notifications, topnav-help, topnav-theme-toggle |
319
+ | TopnavUserMenu | `packages/core/src/components/dashboard/TopnavUserMenu.tsx` | topnav-user-menu-trigger, topnav-user-menu, topnav-menu-item-*, topnav-menu-action-* |
320
+ | TopnavQuickCreate | `packages/core/src/components/dashboard/TopnavQuickCreate.tsx` | topnav-quick-create-trigger, topnav-quick-create-content, topnav-quick-create-* |
321
+
322
+ ## Related POMs
323
+
324
+ | POM | File | Usage |
325
+ |-----|------|-------|
326
+ | DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Topnav selectors and methods |
@@ -0,0 +1,177 @@
1
+ /**
2
+ * UI Selectors Validation: Dashboard Topnav
3
+ *
4
+ * This test validates that dashboard topnav selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate DashboardPOM topnav selectors work correctly
9
+ * - Ensure all dashboard.topnav.* selectors are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to dashboard (requires login)
14
+ * - Assert elements exist in DOM (no form submissions)
15
+ * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_TNAV_001: Topnav Structure (3 selectors)
19
+ * - SEL_TNAV_002: Topnav Actions (4 selectors)
20
+ * - SEL_TNAV_003: Topnav Admin Links (2 selectors - developer has access)
21
+ * - SEL_TNAV_004: User Menu (5 selectors)
22
+ * - SEL_TNAV_005: Quick Create (3 selectors)
23
+ * - SEL_TNAV_006: Loading State (1 skipped - transient state)
24
+ * - SEL_TNAV_007: Settings Menu (3 selectors)
25
+ *
26
+ * NOTE: Public navbar tests (logo, signin, signup) are in public.cy.ts
27
+ */
28
+
29
+ import { DashboardPOM } from '../../../src/features/DashboardPOM'
30
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
31
+
32
+ describe('Dashboard Topnav Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@topnav'] }, () => {
33
+ const dashboard = DashboardPOM.create()
34
+
35
+ beforeEach(() => {
36
+ loginAsDefaultDeveloper()
37
+ cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
38
+ cy.url().should('include', '/dashboard')
39
+ })
40
+
41
+ // ============================================
42
+ // SEL_TNAV_001: TOPNAV STRUCTURE (3 selectors)
43
+ // NOTE: Logo test moved to public.cy.ts (only visible when not logged in)
44
+ // ============================================
45
+ describe('SEL_TNAV_001: Topnav Structure', { tags: '@SEL_TNAV_001' }, () => {
46
+ it('should find topnav container', () => {
47
+ cy.get(dashboard.selectors.topnavContainer).should('exist')
48
+ })
49
+
50
+ it('should find topnav actions container', () => {
51
+ cy.get(dashboard.selectors.topnavActions).should('exist')
52
+ })
53
+
54
+ it('should find topnav search container', () => {
55
+ cy.get(dashboard.selectors.topnavSearchContainer).should('exist')
56
+ })
57
+ })
58
+
59
+ // ============================================
60
+ // SEL_TNAV_002: TOPNAV ACTIONS (4 selectors)
61
+ // ============================================
62
+ describe('SEL_TNAV_002: Topnav Actions', { tags: '@SEL_TNAV_002' }, () => {
63
+ it('should find sidebar toggle button', () => {
64
+ cy.get(dashboard.selectors.topnavSidebarToggle).should('exist')
65
+ })
66
+
67
+ it('should find notifications trigger', () => {
68
+ cy.get(dashboard.selectors.topnavNotificationsTrigger).should('exist')
69
+ })
70
+
71
+ it('should find help button', () => {
72
+ cy.get(dashboard.selectors.topnavHelp).should('exist')
73
+ })
74
+
75
+ it('should find theme toggle button', () => {
76
+ cy.get(dashboard.selectors.topnavThemeToggle).should('exist')
77
+ })
78
+ })
79
+
80
+ // ============================================
81
+ // SEL_TNAV_003: TOPNAV ADMIN LINKS (2 selectors)
82
+ // NOTE: Developer user has access (showToDevelopers: true by default)
83
+ // ============================================
84
+ describe('SEL_TNAV_003: Topnav Admin Links', { tags: '@SEL_TNAV_003' }, () => {
85
+ it('should find superadmin link (developer sees with showToDevelopers)', () => {
86
+ // Config: superadminAccess.enabled && (isSuperAdmin || (isDeveloper && showToDevelopers))
87
+ cy.get(dashboard.selectors.topnavSuperadmin).should('exist')
88
+ })
89
+
90
+ it('should find devtools link (developer role)', () => {
91
+ // Config: devtoolsAccess.enabled && isDeveloper
92
+ cy.get(dashboard.selectors.topnavDevtools).should('exist')
93
+ })
94
+ })
95
+
96
+ // ============================================
97
+ // SEL_TNAV_004: USER MENU (4+ selectors)
98
+ // ============================================
99
+ describe('SEL_TNAV_004: User Menu', { tags: '@SEL_TNAV_004' }, () => {
100
+ it('should find user menu trigger', () => {
101
+ cy.get(dashboard.selectors.topnavUserMenuTrigger).should('exist')
102
+ })
103
+
104
+ it('should find user menu content when opened', () => {
105
+ cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
106
+ cy.get(dashboard.selectors.topnavUserMenuContent).should('be.visible')
107
+ })
108
+
109
+ it('should find profile menu item when opened', () => {
110
+ cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
111
+ cy.get(dashboard.selectors.topnavUserMenuItem('user')).should('exist')
112
+ })
113
+
114
+ it('should find settings menu item when opened', () => {
115
+ cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
116
+ cy.get(dashboard.selectors.topnavUserMenuItem('settings')).should('exist')
117
+ })
118
+
119
+ it('should find signOut action when opened', () => {
120
+ cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
121
+ // Action is 'signOut' per dashboard.config.ts
122
+ cy.get(dashboard.selectors.topnavUserMenuAction('signOut')).should('exist')
123
+ })
124
+ })
125
+
126
+ // ============================================
127
+ // SEL_TNAV_005: QUICK CREATE (3 selectors)
128
+ // NOTE: Component renders null if user has no create permissions on any entity.
129
+ // Developer role may not have quickCreate entities configured.
130
+ // ============================================
131
+ describe('SEL_TNAV_005: Quick Create', { tags: '@SEL_TNAV_005' }, () => {
132
+ it.skip('should find quick create trigger (requires entity with create permission)', () => {
133
+ cy.get(dashboard.selectors.topnavQuickCreateTrigger).should('exist')
134
+ })
135
+
136
+ it.skip('should find quick create content when opened (requires entity with create permission)', () => {
137
+ cy.get(dashboard.selectors.topnavQuickCreateTrigger).click()
138
+ cy.get(dashboard.selectors.topnavQuickCreateContent).should('be.visible')
139
+ })
140
+
141
+ it.skip('should find quick create link for entity when opened (requires entity with create permission)', () => {
142
+ cy.get(dashboard.selectors.topnavQuickCreateTrigger).click()
143
+ // Test with 'customers' entity (common in default theme)
144
+ cy.get(dashboard.selectors.topnavQuickCreateLink('customers')).should('exist')
145
+ })
146
+ })
147
+
148
+ // ============================================
149
+ // SEL_TNAV_006: LOADING STATE SELECTOR (1 selector)
150
+ // NOTE: Only visible during auth loading - transient state
151
+ // ============================================
152
+ describe('SEL_TNAV_006: Loading State', { tags: '@SEL_TNAV_006' }, () => {
153
+ it.skip('SEL_TNAV_006_01: should find user loading state (only visible during auth loading)', { tags: '@SEL_TNAV_006_01' }, () => {
154
+ cy.get(dashboard.selectors.topnavUserLoading).should('exist')
155
+ })
156
+ })
157
+
158
+ // ============================================
159
+ // SEL_TNAV_007: SETTINGS MENU (3 selectors)
160
+ // NOTE: settingsMenu must be enabled in theme config
161
+ // ============================================
162
+ describe('SEL_TNAV_007: Settings Menu', { tags: '@SEL_TNAV_007' }, () => {
163
+ it('SEL_TNAV_007_01: should find settings menu trigger', { tags: '@SEL_TNAV_007_01' }, () => {
164
+ cy.get(dashboard.selectors.topnavSettingsMenuTrigger).should('exist')
165
+ })
166
+
167
+ it('SEL_TNAV_007_02: should find settings menu content when opened', { tags: '@SEL_TNAV_007_02' }, () => {
168
+ cy.get(dashboard.selectors.topnavSettingsMenuTrigger).click()
169
+ cy.get(dashboard.selectors.topnavSettingsMenuContent).should('be.visible')
170
+ })
171
+
172
+ it('SEL_TNAV_007_03: should find settings menu link when opened', { tags: '@SEL_TNAV_007_03' }, () => {
173
+ cy.get(dashboard.selectors.topnavSettingsMenuTrigger).click()
174
+ cy.get(dashboard.selectors.topnavSettingsMenuLink(0)).should('exist')
175
+ })
176
+ })
177
+ })