@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.21

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 (220) hide show
  1. package/package.json +1 -1
  2. package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
  3. package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
  4. package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
  5. package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
  6. package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
  7. package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
  8. package/tests/cypress/e2e/_docs/README.md +215 -0
  9. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
  10. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
  11. package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
  12. package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
  13. package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
  14. package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
  15. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
  16. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
  17. package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
  18. package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
  19. package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
  20. package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
  21. package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
  22. package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
  23. package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
  24. package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
  25. package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
  26. package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
  27. package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
  28. package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
  29. package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
  30. package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
  31. package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
  32. package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
  33. package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
  34. package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
  35. package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
  36. package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
  37. package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
  38. package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
  39. package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
  40. package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
  41. package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
  42. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  43. package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
  44. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  45. package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
  46. package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
  47. package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
  48. package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
  49. package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
  50. package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
  51. package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
  52. package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
  53. package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
  54. package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
  55. package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
  56. package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
  57. package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
  58. package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
  59. package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
  60. package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
  61. package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
  62. package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
  63. package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
  64. package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
  65. package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
  66. package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
  67. package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
  68. package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
  69. package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
  70. package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
  71. package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
  72. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
  73. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
  74. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  75. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  76. package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
  77. package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
  78. package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
  79. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
  80. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
  81. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
  82. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
  83. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
  84. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
  85. package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
  86. package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
  87. package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
  88. package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
  89. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
  90. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
  91. package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
  92. package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
  93. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
  94. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
  95. package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
  96. package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
  97. package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
  98. package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
  99. package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
  100. package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
  101. package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
  102. package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
  103. package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
  104. package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
  105. package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
  106. package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
  107. package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
  108. package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
  109. package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
  110. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  111. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  112. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  113. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  114. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  115. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  116. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  117. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  118. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  119. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  120. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  121. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  122. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  123. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  124. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  125. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  126. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  127. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  128. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  129. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  130. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  131. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  132. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  133. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  134. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  135. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  136. package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
  137. package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
  138. package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
  139. package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
  140. package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
  141. package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
  142. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
  143. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
  144. package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
  145. package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
  146. package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
  147. package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
  148. package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
  149. package/tests/cypress/fixtures/blocks.json +218 -0
  150. package/tests/cypress/fixtures/entities.json +78 -0
  151. package/tests/cypress/fixtures/page-builder.json +21 -0
  152. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  153. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  154. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  155. package/tests/cypress/src/components/EntityForm.ts +375 -0
  156. package/tests/cypress/src/components/EntityList.ts +389 -0
  157. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  158. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  159. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  160. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  161. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  162. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  163. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  164. package/tests/cypress/src/components/index.ts +21 -0
  165. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  166. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  167. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  168. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  169. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  170. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  171. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  172. package/tests/cypress/src/controllers/index.js +25 -0
  173. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  174. package/tests/cypress/src/core/BasePOM.ts +86 -0
  175. package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
  176. package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
  177. package/tests/cypress/src/core/index.ts +14 -0
  178. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  179. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  180. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  181. package/tests/cypress/src/entities/TasksPOM.ts +176 -0
  182. package/tests/cypress/src/entities/index.ts +14 -0
  183. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  184. package/tests/cypress/src/features/DashboardPOM.ts +245 -0
  185. package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
  186. package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
  187. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  188. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  189. package/tests/cypress/src/features/SettingsPOM.ts +362 -0
  190. package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
  191. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  192. package/tests/cypress/src/features/index.ts +28 -0
  193. package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
  194. package/tests/cypress/src/index.ts +101 -0
  195. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  196. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  197. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  198. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  199. package/tests/cypress/src/pages/index.js +5 -0
  200. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  201. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  202. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  203. package/tests/cypress/src/pages/public/index.js +6 -0
  204. package/tests/cypress/src/selectors.ts +46 -0
  205. package/tests/cypress/src/session-helpers.ts +500 -0
  206. package/tests/cypress/support/doc-commands.ts +260 -0
  207. package/tests/cypress.config.ts +150 -0
  208. package/tests/jest/components/post-header.test.tsx +377 -0
  209. package/tests/jest/config/role-config.test.ts +529 -0
  210. package/tests/jest/jest.config.ts +81 -0
  211. package/tests/jest/langchain/COVERAGE.md +372 -0
  212. package/tests/jest/langchain/guardrails.test.ts +465 -0
  213. package/tests/jest/langchain/streaming.test.ts +367 -0
  214. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  215. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  216. package/tests/jest/langchain/tracer.test.ts +823 -0
  217. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  218. package/tests/jest/validation/categories.test.ts +429 -0
  219. package/tests/jest/validation/posts.test.ts +546 -0
  220. package/tests/tsconfig.json +15 -0
@@ -0,0 +1,218 @@
1
+ {
2
+ "$schema": "./blocks.schema.json",
3
+ "_warning": "AUTO-GENERATED by build-registry.mjs - DO NOT EDIT MANUALLY",
4
+ "_theme": "default",
5
+ "_totalBlocks": 16,
6
+ "available": [
7
+ {
8
+ "slug": "benefits",
9
+ "name": "Benefits Grid",
10
+ "description": "3-column grid showcasing benefits with optional colored top borders",
11
+ "category": "features",
12
+ "icon": "LayoutGrid",
13
+ "scope": [
14
+ "pages"
15
+ ]
16
+ },
17
+ {
18
+ "slug": "cta-section",
19
+ "name": "CTA Section",
20
+ "description": "Call-to-action section with title, description, and action buttons",
21
+ "category": "cta",
22
+ "icon": "Megaphone",
23
+ "scope": [
24
+ "pages"
25
+ ]
26
+ },
27
+ {
28
+ "slug": "faq-accordion",
29
+ "name": "FAQ Accordion",
30
+ "description": "A frequently asked questions section with expandable/collapsible accordion items",
31
+ "category": "faq",
32
+ "icon": "HelpCircle",
33
+ "scope": [
34
+ "pages"
35
+ ]
36
+ },
37
+ {
38
+ "slug": "features-grid",
39
+ "name": "Features Grid",
40
+ "description": "Grid layout displaying multiple features with icons, titles, and descriptions",
41
+ "category": "content",
42
+ "icon": "Grid",
43
+ "scope": [
44
+ "pages"
45
+ ]
46
+ },
47
+ {
48
+ "slug": "hero",
49
+ "name": "Hero Section",
50
+ "description": "Full-width hero section with title, subtitle, CTA button, and background image",
51
+ "category": "hero",
52
+ "icon": "Rocket",
53
+ "scope": [
54
+ "pages",
55
+ "posts"
56
+ ]
57
+ },
58
+ {
59
+ "slug": "hero-with-form",
60
+ "name": "Hero With Form",
61
+ "description": "Full-width hero section with background image, title/subtitle on the left, and a lead capture form card on the right",
62
+ "category": "hero",
63
+ "icon": "FileText",
64
+ "scope": [
65
+ "pages"
66
+ ]
67
+ },
68
+ {
69
+ "slug": "jumbotron",
70
+ "name": "Jumbotron",
71
+ "description": "A large, attention-grabbing hero block with optional fullscreen mode that takes 100% of the viewport height when enabled. Features centered content with support for 1-2 CTAs that automatically center based on count.",
72
+ "category": "hero",
73
+ "icon": "Maximize2",
74
+ "scope": [
75
+ "pages",
76
+ "posts"
77
+ ]
78
+ },
79
+ {
80
+ "slug": "logo-cloud",
81
+ "name": "Logo Cloud",
82
+ "description": "A section displaying client/partner logos in a grid or row layout (",
83
+ "category": "content",
84
+ "icon": "Building2",
85
+ "scope": [
86
+ "pages"
87
+ ]
88
+ },
89
+ {
90
+ "slug": "post-content",
91
+ "name": "Post Content",
92
+ "description": "A rich text content block designed for long-form blog posts with editorial styling similar to Medium. Features beautiful typography, proper spacing, and optional elements like drop caps, pull quotes, and images.",
93
+ "category": "content",
94
+ "icon": "FileText",
95
+ "scope": [
96
+ "posts"
97
+ ]
98
+ },
99
+ {
100
+ "slug": "pricing-table",
101
+ "name": "Pricing Table",
102
+ "description": "A pricing comparison table showing different plans with features list, price, CTA button, and optional ",
103
+ "category": "pricing",
104
+ "icon": "DollarSign",
105
+ "scope": [
106
+ "pages"
107
+ ]
108
+ },
109
+ {
110
+ "slug": "split-content",
111
+ "name": "Split Content",
112
+ "description": "A two-column section with image on one side and text content on the other, with option to reverse the order",
113
+ "category": "content",
114
+ "icon": "LayoutGrid",
115
+ "scope": [
116
+ "pages",
117
+ "posts"
118
+ ]
119
+ },
120
+ {
121
+ "slug": "stats-counter",
122
+ "name": "Stats Counter",
123
+ "description": "A section displaying key metrics/statistics with large numbers and labels (e.g., ",
124
+ "category": "stats",
125
+ "icon": "TrendingUp",
126
+ "scope": [
127
+ "pages",
128
+ "posts"
129
+ ]
130
+ },
131
+ {
132
+ "slug": "testimonials",
133
+ "name": "Testimonials",
134
+ "description": "Display customer testimonials with quotes, authors, and avatars",
135
+ "category": "testimonials",
136
+ "icon": "Quote",
137
+ "scope": [
138
+ "pages"
139
+ ]
140
+ },
141
+ {
142
+ "slug": "text-content",
143
+ "name": "Text Content",
144
+ "description": "Rich text content block for paragraphs, lists, and formatted text",
145
+ "category": "content",
146
+ "icon": "FileText",
147
+ "scope": [
148
+ "pages"
149
+ ]
150
+ },
151
+ {
152
+ "slug": "timeline",
153
+ "name": "Timeline",
154
+ "description": "A vertical or horizontal timeline showing chronological events, process steps, or history",
155
+ "category": "content",
156
+ "icon": "GitBranch",
157
+ "scope": [
158
+ "pages",
159
+ "posts"
160
+ ]
161
+ },
162
+ {
163
+ "slug": "video-hero",
164
+ "name": "Video Hero",
165
+ "description": "A hero section with embedded video (YouTube/Vimeo) either as background or inline, with title, subtitle, and optional CTA",
166
+ "category": "hero",
167
+ "icon": "Video",
168
+ "scope": [
169
+ "pages",
170
+ "posts"
171
+ ]
172
+ }
173
+ ],
174
+ "categories": [
175
+ "content",
176
+ "cta",
177
+ "faq",
178
+ "features",
179
+ "hero",
180
+ "pricing",
181
+ "stats",
182
+ "testimonials"
183
+ ],
184
+ "byCategory": {
185
+ "features": [
186
+ "benefits"
187
+ ],
188
+ "cta": [
189
+ "cta-section"
190
+ ],
191
+ "faq": [
192
+ "faq-accordion"
193
+ ],
194
+ "content": [
195
+ "features-grid",
196
+ "logo-cloud",
197
+ "post-content",
198
+ "split-content",
199
+ "text-content",
200
+ "timeline"
201
+ ],
202
+ "hero": [
203
+ "hero",
204
+ "hero-with-form",
205
+ "jumbotron",
206
+ "video-hero"
207
+ ],
208
+ "pricing": [
209
+ "pricing-table"
210
+ ],
211
+ "stats": [
212
+ "stats-counter"
213
+ ],
214
+ "testimonials": [
215
+ "testimonials"
216
+ ]
217
+ }
218
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "$schema": "./entities.schema.json",
3
+ "_warning": "AUTO-GENERATED by build-registry.mjs - DO NOT EDIT MANUALLY",
4
+ "_theme": "default",
5
+ "entities": {
6
+ "customers": {
7
+ "slug": "customers",
8
+ "singular": "customer",
9
+ "plural": "Customers",
10
+ "tableName": "customers",
11
+ "fields": [
12
+ "name",
13
+ "account",
14
+ "office",
15
+ "phone",
16
+ "salesRep",
17
+ "visitDays",
18
+ "contactDays"
19
+ ],
20
+ "filters": [],
21
+ "source": "theme"
22
+ },
23
+ "pages": {
24
+ "slug": "pages",
25
+ "singular": "page",
26
+ "plural": "Pages",
27
+ "tableName": "pages",
28
+ "fields": [
29
+ "title",
30
+ "slug",
31
+ "status",
32
+ "locale"
33
+ ],
34
+ "filters": [
35
+ "status"
36
+ ],
37
+ "source": "theme"
38
+ },
39
+ "posts": {
40
+ "slug": "posts",
41
+ "singular": "post",
42
+ "plural": "Posts",
43
+ "tableName": "posts",
44
+ "fields": [
45
+ "title",
46
+ "slug",
47
+ "status",
48
+ "excerpt",
49
+ "featuredImage"
50
+ ],
51
+ "filters": [
52
+ "status"
53
+ ],
54
+ "source": "theme"
55
+ },
56
+ "tasks": {
57
+ "slug": "tasks",
58
+ "singular": "task",
59
+ "plural": "Tasks",
60
+ "tableName": "tasks",
61
+ "fields": [
62
+ "title",
63
+ "description",
64
+ "status",
65
+ "priority",
66
+ "tags",
67
+ "dueDate",
68
+ "estimatedHours",
69
+ "completed"
70
+ ],
71
+ "filters": [
72
+ "status",
73
+ "priority"
74
+ ],
75
+ "source": "theme"
76
+ }
77
+ }
78
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "./page-builder.schema.json",
3
+ "_comment": "Test data for existing pages (from sample data). API/routes handled by POMs.",
4
+ "_lastUpdated": "2025-12-27",
5
+
6
+ "existingPages": {
7
+ "aboutUs": {
8
+ "slug": "about-us",
9
+ "locale": "en",
10
+ "expectedBlocks": ["hero", "text-content", "features-grid", "cta-section", "testimonials", "cta-section", "benefits"]
11
+ },
12
+ "contact": {
13
+ "slug": "contact",
14
+ "locale": "en"
15
+ },
16
+ "services": {
17
+ "slug": "services",
18
+ "locale": "en"
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Categories POM
3
+ *
4
+ * Page Object Model for Post Categories management.
5
+ * Uses the generic Taxonomies UI component but intercepts the post-categories API.
6
+ *
7
+ * Architecture Note:
8
+ * - UI Path: /dashboard/taxonomies (generic taxonomy manager component)
9
+ * - UI Selectors: taxonomies-* / taxonomy-* (match React component data-cy)
10
+ * - API Path: /api/v1/post-categories (specific endpoint for post categories)
11
+ *
12
+ * This separation allows the UI to be reusable while the API is entity-specific.
13
+ *
14
+ * @version 3.0 - Uses centralized selectors from cySelector()
15
+ */
16
+
17
+ import { cySelector } from '../selectors'
18
+ import { ApiInterceptor } from '../helpers/ApiInterceptor'
19
+
20
+ export interface CategoryFormData {
21
+ name: string
22
+ slug?: string
23
+ description?: string
24
+ icon?: string
25
+ color?: string
26
+ parentId?: string
27
+ order?: number
28
+ }
29
+
30
+ export class CategoriesPOM {
31
+ // ============================================
32
+ // API INTERCEPTOR (for deterministic waits)
33
+ // ============================================
34
+
35
+ private static _api: ApiInterceptor | null = null
36
+
37
+ /**
38
+ * Get the API interceptor instance for post-categories
39
+ * Uses custom path since it's not a generic entity route
40
+ */
41
+ static get api(): ApiInterceptor {
42
+ if (!this._api) {
43
+ this._api = new ApiInterceptor({
44
+ slug: 'categories',
45
+ customPath: '/api/v1/post-categories'
46
+ })
47
+ }
48
+ return this._api
49
+ }
50
+
51
+ /**
52
+ * Setup API intercepts for CRUD operations
53
+ * Call this in beforeEach BEFORE navigation
54
+ */
55
+ static setupApiIntercepts(): typeof CategoriesPOM {
56
+ this.api.setupCrudIntercepts()
57
+ return this
58
+ }
59
+
60
+ // ============================================
61
+ // SELECTORS - Categories List (using centralized cySelector)
62
+ // ============================================
63
+
64
+ static get listSelectors() {
65
+ return {
66
+ page: cySelector('taxonomies.list.container'),
67
+ table: 'table',
68
+ createBtn: cySelector('taxonomies.list.createButton'),
69
+ row: (id: string) => cySelector('taxonomies.list.row', { id }),
70
+ rowGeneric: 'table tbody tr',
71
+ editBtn: (id: string) => cySelector('taxonomies.list.editButton', { id }),
72
+ deleteBtn: (id: string) => cySelector('taxonomies.list.deleteButton', { id }),
73
+ confirmDelete: '[role="dialog"]',
74
+ confirmDeleteBtn: '[role="dialog"] button:contains("Delete"), button.bg-destructive',
75
+ cancelDeleteBtn: '[role="dialog"] button:contains("Cancel"),[role="dialog"] button[type="button"]:not(.bg-destructive)',
76
+ emptyState: 'h3:contains("No"), div:contains("No categories")',
77
+ }
78
+ }
79
+
80
+ // ============================================
81
+ // SELECTORS - Category Form (using centralized cySelector)
82
+ // ============================================
83
+
84
+ static get formSelectors() {
85
+ return {
86
+ dialog: cySelector('taxonomies.form.dialog'),
87
+ dialogFallback: '[role="dialog"]', // Fallback if data-cy not implemented
88
+ nameInput: cySelector('taxonomies.form.nameInput'),
89
+ slugInput: cySelector('taxonomies.form.slugInput'),
90
+ descriptionInput: cySelector('taxonomies.form.descriptionInput'),
91
+ iconInput: cySelector('taxonomies.form.iconInput'),
92
+ colorInput: cySelector('taxonomies.form.colorInput'),
93
+ parentSelect: cySelector('taxonomies.form.parentSelect'),
94
+ orderInput: cySelector('taxonomies.form.orderInput'),
95
+ saveButton: cySelector('taxonomies.form.saveButton'),
96
+ cancelButton: cySelector('taxonomies.form.cancelButton'),
97
+ cancelButtonFallback: '[role="dialog"] button:contains("Cancel")',
98
+ }
99
+ }
100
+
101
+ // ============================================
102
+ // SELECTORS - Confirm Delete Dialog (using centralized cySelector)
103
+ // ============================================
104
+
105
+ static get confirmDeleteSelectors() {
106
+ return {
107
+ dialog: cySelector('taxonomies.confirmDelete.dialog'),
108
+ confirmButton: cySelector('taxonomies.confirmDelete.confirmButton'),
109
+ cancelButton: cySelector('taxonomies.confirmDelete.cancelButton'),
110
+ }
111
+ }
112
+
113
+ // ============================================
114
+ // NAVIGATION
115
+ // ============================================
116
+
117
+ static visitCategoriesPage() {
118
+ cy.visit('/dashboard/taxonomies')
119
+ return this
120
+ }
121
+
122
+ // ============================================
123
+ // API-AWARE NAVIGATION
124
+ // ============================================
125
+
126
+ /**
127
+ * Visit categories page with API intercepts and wait for data load
128
+ * Replaces: visitCategoriesPage() + waitForPageLoad() + cy.wait(...)
129
+ */
130
+ static visitWithApiWait(): typeof CategoriesPOM {
131
+ this.setupApiIntercepts()
132
+ this.visitCategoriesPage()
133
+ this.waitForPageLoad()
134
+ this.api.waitForList()
135
+ return this
136
+ }
137
+
138
+ // ============================================
139
+ // API-AWARE CRUD WORKFLOWS
140
+ // ============================================
141
+
142
+ /**
143
+ * Create category with deterministic API waits
144
+ * Replaces: createCategory() + cy.wait(2000)
145
+ */
146
+ static createCategoryWithApiWait(data: CategoryFormData): typeof CategoriesPOM {
147
+ this.clickCreate()
148
+ this.waitForDialogOpen()
149
+
150
+ this.fillName(data.name)
151
+ if (data.slug) this.fillSlug(data.slug)
152
+ if (data.description) this.fillDescription(data.description)
153
+ if (data.icon) this.fillIcon(data.icon)
154
+ if (data.color) this.fillColor(data.color)
155
+
156
+ this.saveCategory()
157
+ this.api.waitForCreate()
158
+ this.api.waitForRefresh()
159
+ this.waitForDialogClose()
160
+
161
+ return this
162
+ }
163
+
164
+ /**
165
+ * Delete category with deterministic API waits
166
+ */
167
+ static deleteCategoryWithApiWait(id: string): typeof CategoriesPOM {
168
+ this.clickDelete(id)
169
+ this.confirmDelete()
170
+ this.api.waitForDelete()
171
+ this.api.waitForRefresh()
172
+ return this
173
+ }
174
+
175
+ // ============================================
176
+ // WAIT METHODS
177
+ // ============================================
178
+
179
+ static waitForPageLoad() {
180
+ cy.url().should('include', '/dashboard/taxonomies')
181
+ cy.get(this.listSelectors.page, { timeout: 15000 }).should('exist')
182
+ return this
183
+ }
184
+
185
+ static waitForDialogOpen() {
186
+ cy.get(this.formSelectors.dialog, { timeout: 10000 }).should('be.visible')
187
+ return this
188
+ }
189
+
190
+ static waitForDialogClose() {
191
+ cy.get(this.formSelectors.dialog, { timeout: 10000 }).should('not.exist')
192
+ return this
193
+ }
194
+
195
+ // ============================================
196
+ // LIST PAGE INTERACTIONS
197
+ // ============================================
198
+
199
+ static clickCreate() {
200
+ cy.get(this.listSelectors.createBtn).click()
201
+ return this
202
+ }
203
+
204
+ static clickEdit(id: string) {
205
+ cy.get(this.listSelectors.editBtn(id)).click()
206
+ return this
207
+ }
208
+
209
+ static clickDelete(id: string) {
210
+ cy.get(this.listSelectors.deleteBtn(id)).click()
211
+ return this
212
+ }
213
+
214
+ static confirmDelete() {
215
+ cy.get(this.listSelectors.confirmDeleteBtn).click()
216
+ return this
217
+ }
218
+
219
+ static cancelDelete() {
220
+ cy.get(this.listSelectors.cancelDeleteBtn).click()
221
+ return this
222
+ }
223
+
224
+ // ============================================
225
+ // FORM INTERACTIONS
226
+ // ============================================
227
+
228
+ static fillName(name: string) {
229
+ cy.get(this.formSelectors.nameInput).clear().type(name)
230
+ return this
231
+ }
232
+
233
+ static fillSlug(slug: string) {
234
+ cy.get(this.formSelectors.slugInput).clear().type(slug)
235
+ return this
236
+ }
237
+
238
+ static fillDescription(description: string) {
239
+ cy.get(this.formSelectors.descriptionInput).clear().type(description)
240
+ return this
241
+ }
242
+
243
+ static fillIcon(icon: string) {
244
+ cy.get(this.formSelectors.iconInput).clear().type(icon)
245
+ return this
246
+ }
247
+
248
+ static fillColor(color: string) {
249
+ cy.get(this.formSelectors.colorInput).clear().type(color)
250
+ return this
251
+ }
252
+
253
+ static saveCategory() {
254
+ cy.get(this.formSelectors.saveButton).click()
255
+ return this
256
+ }
257
+
258
+ static cancelForm() {
259
+ cy.get(this.formSelectors.cancelButton).click()
260
+ return this
261
+ }
262
+
263
+ // ============================================
264
+ // COMPLETE WORKFLOWS
265
+ // ============================================
266
+
267
+ /**
268
+ * Create a new category with specified data
269
+ */
270
+ static createCategory(data: CategoryFormData) {
271
+ this.clickCreate()
272
+ this.waitForDialogOpen()
273
+
274
+ this.fillName(data.name)
275
+
276
+ if (data.slug) {
277
+ this.fillSlug(data.slug)
278
+ }
279
+
280
+ if (data.description) {
281
+ this.fillDescription(data.description)
282
+ }
283
+
284
+ if (data.icon) {
285
+ this.fillIcon(data.icon)
286
+ }
287
+
288
+ if (data.color) {
289
+ this.fillColor(data.color)
290
+ }
291
+
292
+ this.saveCategory()
293
+ return this
294
+ }
295
+
296
+ /**
297
+ * Edit an existing category
298
+ */
299
+ static editCategory(id: string, data: Partial<CategoryFormData>) {
300
+ this.clickEdit(id)
301
+ this.waitForDialogOpen()
302
+
303
+ if (data.name) {
304
+ this.fillName(data.name)
305
+ }
306
+
307
+ if (data.slug) {
308
+ this.fillSlug(data.slug)
309
+ }
310
+
311
+ if (data.description) {
312
+ this.fillDescription(data.description)
313
+ }
314
+
315
+ if (data.icon) {
316
+ this.fillIcon(data.icon)
317
+ }
318
+
319
+ if (data.color) {
320
+ this.fillColor(data.color)
321
+ }
322
+
323
+ this.saveCategory()
324
+ return this
325
+ }
326
+
327
+ /**
328
+ * Delete a category
329
+ */
330
+ static deleteCategory(id: string) {
331
+ this.clickDelete(id)
332
+ this.confirmDelete()
333
+ return this
334
+ }
335
+
336
+ // ============================================
337
+ // ASSERTIONS
338
+ // ============================================
339
+
340
+ static assertPageVisible() {
341
+ cy.get(this.listSelectors.page).should('exist')
342
+ return this
343
+ }
344
+
345
+ static assertCategoryInList(name: string) {
346
+ cy.contains(this.listSelectors.rowGeneric, name).should('be.visible')
347
+ return this
348
+ }
349
+
350
+ static assertCategoryNotInList(name: string) {
351
+ cy.contains(this.listSelectors.rowGeneric, name).should('not.exist')
352
+ return this
353
+ }
354
+
355
+ static assertEmptyList() {
356
+ cy.get(this.listSelectors.emptyState).should('be.visible')
357
+ return this
358
+ }
359
+
360
+ static assertDialogOpen() {
361
+ cy.get(this.formSelectors.dialog).should('be.visible')
362
+ return this
363
+ }
364
+
365
+ static assertDialogClosed() {
366
+ cy.get(this.formSelectors.dialog).should('not.exist')
367
+ return this
368
+ }
369
+
370
+ static assertColorBadgeVisible(color: string) {
371
+ // Check for badge with the specified color (as background or border)
372
+ cy.get(this.listSelectors.table).find(`[style*="${color}"]`).should('exist')
373
+ return this
374
+ }
375
+
376
+ static assertSaveSuccess() {
377
+ cy.contains('saved', { matchCase: false }).should('be.visible')
378
+ return this
379
+ }
380
+ }
381
+
382
+ export default CategoriesPOM