@qwickapps/cms 0.2.0

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 (259) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +203 -0
  3. package/dist/admin/components/AccordionItemRowLabel.d.ts +20 -0
  4. package/dist/admin/components/AccordionItemRowLabel.d.ts.map +1 -0
  5. package/dist/admin/components/AccordionItemRowLabel.js +47 -0
  6. package/dist/admin/components/AccordionItemRowLabel.js.map +1 -0
  7. package/dist/admin/components/BlockRowLabel.d.ts +19 -0
  8. package/dist/admin/components/BlockRowLabel.d.ts.map +1 -0
  9. package/dist/admin/components/BlockRowLabel.js +52 -0
  10. package/dist/admin/components/BlockRowLabel.js.map +1 -0
  11. package/dist/admin/components/ButtonRowLabel.d.ts +23 -0
  12. package/dist/admin/components/ButtonRowLabel.d.ts.map +1 -0
  13. package/dist/admin/components/ButtonRowLabel.js +63 -0
  14. package/dist/admin/components/ButtonRowLabel.js.map +1 -0
  15. package/dist/admin/components/CardRowLabel.d.ts +23 -0
  16. package/dist/admin/components/CardRowLabel.d.ts.map +1 -0
  17. package/dist/admin/components/CardRowLabel.js +59 -0
  18. package/dist/admin/components/CardRowLabel.js.map +1 -0
  19. package/dist/admin/components/ContentPreview.d.ts +12 -0
  20. package/dist/admin/components/ContentPreview.d.ts.map +1 -0
  21. package/dist/admin/components/ContentPreview.js +95 -0
  22. package/dist/admin/components/ContentPreview.js.map +1 -0
  23. package/dist/admin/components/Dashboard.d.ts +13 -0
  24. package/dist/admin/components/Dashboard.d.ts.map +1 -0
  25. package/dist/admin/components/Dashboard.js +7 -0
  26. package/dist/admin/components/Dashboard.js.map +1 -0
  27. package/dist/admin/components/DashboardContent.d.ts +11 -0
  28. package/dist/admin/components/DashboardContent.d.ts.map +1 -0
  29. package/dist/admin/components/DashboardContent.js +129 -0
  30. package/dist/admin/components/DashboardContent.js.map +1 -0
  31. package/dist/admin/components/FormFieldRowLabel.d.ts +21 -0
  32. package/dist/admin/components/FormFieldRowLabel.d.ts.map +1 -0
  33. package/dist/admin/components/FormFieldRowLabel.js +47 -0
  34. package/dist/admin/components/FormFieldRowLabel.js.map +1 -0
  35. package/dist/admin/components/Icon.d.ts +10 -0
  36. package/dist/admin/components/Icon.d.ts.map +1 -0
  37. package/dist/admin/components/Icon.js +16 -0
  38. package/dist/admin/components/Icon.js.map +1 -0
  39. package/dist/admin/components/Logo.d.ts +10 -0
  40. package/dist/admin/components/Logo.d.ts.map +1 -0
  41. package/dist/admin/components/Logo.js +16 -0
  42. package/dist/admin/components/Logo.js.map +1 -0
  43. package/dist/admin/components/NavigationItemRowLabel.d.ts +21 -0
  44. package/dist/admin/components/NavigationItemRowLabel.d.ts.map +1 -0
  45. package/dist/admin/components/NavigationItemRowLabel.js +43 -0
  46. package/dist/admin/components/NavigationItemRowLabel.js.map +1 -0
  47. package/dist/admin/components/NavigationSubItemRowLabel.d.ts +19 -0
  48. package/dist/admin/components/NavigationSubItemRowLabel.d.ts.map +1 -0
  49. package/dist/admin/components/NavigationSubItemRowLabel.js +32 -0
  50. package/dist/admin/components/NavigationSubItemRowLabel.js.map +1 -0
  51. package/dist/admin/components/PagesListHeader.d.ts +13 -0
  52. package/dist/admin/components/PagesListHeader.d.ts.map +1 -0
  53. package/dist/admin/components/PagesListHeader.js +48 -0
  54. package/dist/admin/components/PagesListHeader.js.map +1 -0
  55. package/dist/admin/components/ProductsListHeader.d.ts +13 -0
  56. package/dist/admin/components/ProductsListHeader.d.ts.map +1 -0
  57. package/dist/admin/components/ProductsListHeader.js +55 -0
  58. package/dist/admin/components/ProductsListHeader.js.map +1 -0
  59. package/dist/admin/components/styles/CollectionListHeader.css +161 -0
  60. package/dist/admin/components/styles/ContentPreview.css +416 -0
  61. package/dist/admin/components/styles/Dashboard.css +338 -0
  62. package/dist/admin/fields/ColorInput.d.ts +13 -0
  63. package/dist/admin/fields/ColorInput.d.ts.map +1 -0
  64. package/dist/admin/fields/ColorInput.js +201 -0
  65. package/dist/admin/fields/ColorInput.js.map +1 -0
  66. package/dist/admin/fields/index.d.ts +9 -0
  67. package/dist/admin/fields/index.d.ts.map +1 -0
  68. package/dist/admin/fields/index.js +9 -0
  69. package/dist/admin/fields/index.js.map +1 -0
  70. package/dist/admin/index.d.ts +24 -0
  71. package/dist/admin/index.d.ts.map +1 -0
  72. package/dist/admin/index.js +30 -0
  73. package/dist/admin/index.js.map +1 -0
  74. package/dist/blocks/ContentBlocks.d.ts +75 -0
  75. package/dist/blocks/ContentBlocks.d.ts.map +1 -0
  76. package/dist/blocks/ContentBlocks.js +1241 -0
  77. package/dist/blocks/ContentBlocks.js.map +1 -0
  78. package/dist/blocks/index.d.ts +2 -0
  79. package/dist/blocks/index.d.ts.map +1 -0
  80. package/dist/blocks/index.js +3 -0
  81. package/dist/blocks/index.js.map +1 -0
  82. package/dist/client/PayloadAPIClient.d.ts +65 -0
  83. package/dist/client/PayloadAPIClient.d.ts.map +1 -0
  84. package/dist/client/PayloadAPIClient.js +167 -0
  85. package/dist/client/PayloadAPIClient.js.map +1 -0
  86. package/dist/collections/Automations.d.ts +12 -0
  87. package/dist/collections/Automations.d.ts.map +1 -0
  88. package/dist/collections/Automations.js +741 -0
  89. package/dist/collections/Automations.js.map +1 -0
  90. package/dist/collections/Features.d.ts +3 -0
  91. package/dist/collections/Features.d.ts.map +1 -0
  92. package/dist/collections/Features.js +69 -0
  93. package/dist/collections/Features.js.map +1 -0
  94. package/dist/collections/Footer.d.ts +11 -0
  95. package/dist/collections/Footer.d.ts.map +1 -0
  96. package/dist/collections/Footer.js +130 -0
  97. package/dist/collections/Footer.js.map +1 -0
  98. package/dist/collections/FormSubmissions.d.ts +3 -0
  99. package/dist/collections/FormSubmissions.d.ts.map +1 -0
  100. package/dist/collections/FormSubmissions.js +119 -0
  101. package/dist/collections/FormSubmissions.js.map +1 -0
  102. package/dist/collections/Forms.d.ts +16 -0
  103. package/dist/collections/Forms.d.ts.map +1 -0
  104. package/dist/collections/Forms.js +308 -0
  105. package/dist/collections/Forms.js.map +1 -0
  106. package/dist/collections/HeroBlocks.d.ts +3 -0
  107. package/dist/collections/HeroBlocks.d.ts.map +1 -0
  108. package/dist/collections/HeroBlocks.js +115 -0
  109. package/dist/collections/HeroBlocks.js.map +1 -0
  110. package/dist/collections/Media.d.ts +3 -0
  111. package/dist/collections/Media.d.ts.map +1 -0
  112. package/dist/collections/Media.js +26 -0
  113. package/dist/collections/Media.js.map +1 -0
  114. package/dist/collections/Navigation.d.ts +3 -0
  115. package/dist/collections/Navigation.d.ts.map +1 -0
  116. package/dist/collections/Navigation.js +106 -0
  117. package/dist/collections/Navigation.js.map +1 -0
  118. package/dist/collections/Pages.d.ts +3 -0
  119. package/dist/collections/Pages.d.ts.map +1 -0
  120. package/dist/collections/Pages.js +94 -0
  121. package/dist/collections/Pages.js.map +1 -0
  122. package/dist/collections/Posts.d.ts +3 -0
  123. package/dist/collections/Posts.d.ts.map +1 -0
  124. package/dist/collections/Posts.js +134 -0
  125. package/dist/collections/Posts.js.map +1 -0
  126. package/dist/collections/Products.d.ts +3 -0
  127. package/dist/collections/Products.d.ts.map +1 -0
  128. package/dist/collections/Products.js +264 -0
  129. package/dist/collections/Products.js.map +1 -0
  130. package/dist/collections/Users.d.ts +3 -0
  131. package/dist/collections/Users.d.ts.map +1 -0
  132. package/dist/collections/Users.js +53 -0
  133. package/dist/collections/Users.js.map +1 -0
  134. package/dist/collections/hooks/index.d.ts +9 -0
  135. package/dist/collections/hooks/index.d.ts.map +1 -0
  136. package/dist/collections/hooks/index.js +9 -0
  137. package/dist/collections/hooks/index.js.map +1 -0
  138. package/dist/collections/hooks/loggingHooks.d.ts +45 -0
  139. package/dist/collections/hooks/loggingHooks.d.ts.map +1 -0
  140. package/dist/collections/hooks/loggingHooks.js +109 -0
  141. package/dist/collections/hooks/loggingHooks.js.map +1 -0
  142. package/dist/collections/index.d.ts +14 -0
  143. package/dist/collections/index.d.ts.map +1 -0
  144. package/dist/collections/index.js +16 -0
  145. package/dist/collections/index.js.map +1 -0
  146. package/dist/components/index.d.ts +2 -0
  147. package/dist/components/index.d.ts.map +1 -0
  148. package/dist/components/index.js +4 -0
  149. package/dist/components/index.js.map +1 -0
  150. package/dist/globals/AdvancedSettings.d.ts +8 -0
  151. package/dist/globals/AdvancedSettings.d.ts.map +1 -0
  152. package/dist/globals/AdvancedSettings.js +157 -0
  153. package/dist/globals/AdvancedSettings.js.map +1 -0
  154. package/dist/globals/Integrations.d.ts +8 -0
  155. package/dist/globals/Integrations.d.ts.map +1 -0
  156. package/dist/globals/Integrations.js +270 -0
  157. package/dist/globals/Integrations.js.map +1 -0
  158. package/dist/globals/SiteSettings.d.ts +8 -0
  159. package/dist/globals/SiteSettings.d.ts.map +1 -0
  160. package/dist/globals/SiteSettings.js +258 -0
  161. package/dist/globals/SiteSettings.js.map +1 -0
  162. package/dist/globals/ThemeSettings.d.ts +11 -0
  163. package/dist/globals/ThemeSettings.d.ts.map +1 -0
  164. package/dist/globals/ThemeSettings.js +92 -0
  165. package/dist/globals/ThemeSettings.js.map +1 -0
  166. package/dist/globals/index.d.ts +5 -0
  167. package/dist/globals/index.d.ts.map +1 -0
  168. package/dist/globals/index.js +6 -0
  169. package/dist/globals/index.js.map +1 -0
  170. package/dist/index.d.ts +9 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +14 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/logging/index.d.ts +73 -0
  175. package/dist/logging/index.d.ts.map +1 -0
  176. package/dist/logging/index.js +190 -0
  177. package/dist/logging/index.js.map +1 -0
  178. package/dist/nextjs/BlockRenderer.d.ts +227 -0
  179. package/dist/nextjs/BlockRenderer.d.ts.map +1 -0
  180. package/dist/nextjs/BlockRenderer.js +358 -0
  181. package/dist/nextjs/BlockRenderer.js.map +1 -0
  182. package/dist/nextjs/ClientHomePage.d.ts +6 -0
  183. package/dist/nextjs/ClientHomePage.d.ts.map +1 -0
  184. package/dist/nextjs/ClientHomePage.js +17 -0
  185. package/dist/nextjs/ClientHomePage.js.map +1 -0
  186. package/dist/nextjs/ClientSideQwickApp.d.ts +23 -0
  187. package/dist/nextjs/ClientSideQwickApp.d.ts.map +1 -0
  188. package/dist/nextjs/ClientSideQwickApp.js +50 -0
  189. package/dist/nextjs/ClientSideQwickApp.js.map +1 -0
  190. package/dist/nextjs/DynamicQwickApp.d.ts +9 -0
  191. package/dist/nextjs/DynamicQwickApp.d.ts.map +1 -0
  192. package/dist/nextjs/DynamicQwickApp.js +19 -0
  193. package/dist/nextjs/DynamicQwickApp.js.map +1 -0
  194. package/dist/nextjs/FooterFromSettings.d.ts +6 -0
  195. package/dist/nextjs/FooterFromSettings.d.ts.map +1 -0
  196. package/dist/nextjs/FooterFromSettings.js +72 -0
  197. package/dist/nextjs/FooterFromSettings.js.map +1 -0
  198. package/dist/nextjs/FormBlockComponent.d.ts +25 -0
  199. package/dist/nextjs/FormBlockComponent.d.ts.map +1 -0
  200. package/dist/nextjs/FormBlockComponent.js +110 -0
  201. package/dist/nextjs/FormBlockComponent.js.map +1 -0
  202. package/dist/nextjs/HomePageContent.d.ts +6 -0
  203. package/dist/nextjs/HomePageContent.d.ts.map +1 -0
  204. package/dist/nextjs/HomePageContent.js +50 -0
  205. package/dist/nextjs/HomePageContent.js.map +1 -0
  206. package/dist/nextjs/LivePreviewClient.d.ts +40 -0
  207. package/dist/nextjs/LivePreviewClient.d.ts.map +1 -0
  208. package/dist/nextjs/LivePreviewClient.js +35 -0
  209. package/dist/nextjs/LivePreviewClient.js.map +1 -0
  210. package/dist/nextjs/RefreshRouteOnSave.d.ts +31 -0
  211. package/dist/nextjs/RefreshRouteOnSave.d.ts.map +1 -0
  212. package/dist/nextjs/RefreshRouteOnSave.js +59 -0
  213. package/dist/nextjs/RefreshRouteOnSave.js.map +1 -0
  214. package/dist/nextjs/ScriptsInjector.d.ts +2 -0
  215. package/dist/nextjs/ScriptsInjector.d.ts.map +1 -0
  216. package/dist/nextjs/ScriptsInjector.js +73 -0
  217. package/dist/nextjs/ScriptsInjector.js.map +1 -0
  218. package/dist/nextjs/ServerQwickApp.d.ts +13 -0
  219. package/dist/nextjs/ServerQwickApp.d.ts.map +1 -0
  220. package/dist/nextjs/ServerQwickApp.js +159 -0
  221. package/dist/nextjs/ServerQwickApp.js.map +1 -0
  222. package/dist/nextjs/SettingsProvider.d.ts +110 -0
  223. package/dist/nextjs/SettingsProvider.d.ts.map +1 -0
  224. package/dist/nextjs/SettingsProvider.js +107 -0
  225. package/dist/nextjs/SettingsProvider.js.map +1 -0
  226. package/dist/nextjs/SiteLogo.d.ts +35 -0
  227. package/dist/nextjs/SiteLogo.d.ts.map +1 -0
  228. package/dist/nextjs/SiteLogo.js +105 -0
  229. package/dist/nextjs/SiteLogo.js.map +1 -0
  230. package/dist/nextjs/framework.d.ts +19 -0
  231. package/dist/nextjs/framework.d.ts.map +1 -0
  232. package/dist/nextjs/framework.js +35 -0
  233. package/dist/nextjs/framework.js.map +1 -0
  234. package/dist/nextjs/index.d.ts +38 -0
  235. package/dist/nextjs/index.d.ts.map +1 -0
  236. package/dist/nextjs/index.js +47 -0
  237. package/dist/nextjs/index.js.map +1 -0
  238. package/dist/nextjs/metadata.d.ts +20 -0
  239. package/dist/nextjs/metadata.d.ts.map +1 -0
  240. package/dist/nextjs/metadata.js +107 -0
  241. package/dist/nextjs/metadata.js.map +1 -0
  242. package/dist/plugins/index.d.ts +2 -0
  243. package/dist/plugins/index.d.ts.map +1 -0
  244. package/dist/plugins/index.js +3 -0
  245. package/dist/plugins/index.js.map +1 -0
  246. package/dist/plugins/qwickapps-plugin.d.ts +78 -0
  247. package/dist/plugins/qwickapps-plugin.d.ts.map +1 -0
  248. package/dist/plugins/qwickapps-plugin.js +154 -0
  249. package/dist/plugins/qwickapps-plugin.js.map +1 -0
  250. package/dist/providers/PayloadDataProvider.d.ts +72 -0
  251. package/dist/providers/PayloadDataProvider.d.ts.map +1 -0
  252. package/dist/providers/PayloadDataProvider.js +222 -0
  253. package/dist/providers/PayloadDataProvider.js.map +1 -0
  254. package/dist/providers/index.d.ts +2 -0
  255. package/dist/providers/index.d.ts.map +1 -0
  256. package/dist/providers/index.js +3 -0
  257. package/dist/providers/index.js.map +1 -0
  258. package/dist/styles/admin-theme.css +352 -0
  259. package/package.json +104 -0
@@ -0,0 +1,1241 @@
1
+ /**
2
+ * Shared Content Blocks for QwickPress
3
+ *
4
+ * These blocks can be used across Pages, Posts, Products, and other collections
5
+ * to build flexible, data-driven layouts.
6
+ *
7
+ * Blocks map to QwickApps Framework components for consistent rendering.
8
+ *
9
+ * All blocks inherit from framework ViewSchema which provides comprehensive styling props.
10
+ * See: /packages/qwickapps-react-framework/src/schemas/ViewSchema.ts
11
+ *
12
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
13
+ */
14
+ /**
15
+ * Common ViewSchema fields - can be added to any block
16
+ * These map directly to framework component props
17
+ */
18
+ const commonStyleFields = [
19
+ {
20
+ type: 'collapsible',
21
+ label: 'Layout & Spacing',
22
+ admin: {
23
+ initCollapsed: true,
24
+ },
25
+ fields: [
26
+ {
27
+ name: 'padding',
28
+ type: 'select',
29
+ options: [
30
+ { label: 'None', value: 'none' },
31
+ { label: 'Tiny', value: 'tiny' },
32
+ { label: 'Small', value: 'small' },
33
+ { label: 'Medium', value: 'medium' },
34
+ { label: 'Large', value: 'large' },
35
+ { label: 'Huge', value: 'huge' },
36
+ ],
37
+ admin: {
38
+ description: 'Internal spacing',
39
+ },
40
+ },
41
+ {
42
+ name: 'marginTop',
43
+ type: 'select',
44
+ options: [
45
+ { label: 'None', value: 'none' },
46
+ { label: 'Tiny', value: 'tiny' },
47
+ { label: 'Small', value: 'small' },
48
+ { label: 'Medium', value: 'medium' },
49
+ { label: 'Large', value: 'large' },
50
+ { label: 'Huge', value: 'huge' },
51
+ ],
52
+ admin: {
53
+ description: 'Space above block',
54
+ },
55
+ },
56
+ {
57
+ name: 'marginBottom',
58
+ type: 'select',
59
+ options: [
60
+ { label: 'None', value: 'none' },
61
+ { label: 'Tiny', value: 'tiny' },
62
+ { label: 'Small', value: 'small' },
63
+ { label: 'Medium', value: 'medium' },
64
+ { label: 'Large', value: 'large' },
65
+ { label: 'Huge', value: 'huge' },
66
+ ],
67
+ admin: {
68
+ description: 'Space below block',
69
+ },
70
+ },
71
+ {
72
+ name: 'width',
73
+ type: 'text',
74
+ admin: {
75
+ description: 'Width (e.g., "100%", "large", "600px")',
76
+ placeholder: 'auto',
77
+ },
78
+ },
79
+ {
80
+ name: 'maxWidth',
81
+ type: 'select',
82
+ options: [
83
+ { label: 'Extra Small (444px)', value: 'xs' },
84
+ { label: 'Small (600px)', value: 'sm' },
85
+ { label: 'Medium (900px)', value: 'md' },
86
+ { label: 'Large (1200px)', value: 'lg' },
87
+ { label: 'Extra Large (1536px)', value: 'xl' },
88
+ { label: 'Full Width', value: 'false' },
89
+ ],
90
+ admin: {
91
+ description: 'Maximum content width',
92
+ },
93
+ },
94
+ ],
95
+ },
96
+ {
97
+ type: 'collapsible',
98
+ label: 'Colors & Background',
99
+ admin: {
100
+ initCollapsed: true,
101
+ },
102
+ fields: [
103
+ {
104
+ name: 'background',
105
+ type: 'text',
106
+ label: 'Background Color',
107
+ admin: {
108
+ description: 'Background color (theme variable or custom)',
109
+ components: {
110
+ Field: '/src/admin/fields/ColorInput#ColorInput',
111
+ },
112
+ },
113
+ },
114
+ {
115
+ name: 'color',
116
+ type: 'text',
117
+ label: 'Text Color',
118
+ admin: {
119
+ description: 'Text color (theme variable or custom)',
120
+ components: {
121
+ Field: '/src/admin/fields/ColorInput#ColorInput',
122
+ },
123
+ },
124
+ },
125
+ {
126
+ name: 'backgroundImage',
127
+ type: 'upload',
128
+ relationTo: 'media',
129
+ admin: {
130
+ description: 'Background image',
131
+ },
132
+ },
133
+ {
134
+ name: 'backgroundGradient',
135
+ type: 'textarea',
136
+ admin: {
137
+ description: 'CSS gradient',
138
+ placeholder: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
139
+ },
140
+ },
141
+ ],
142
+ },
143
+ {
144
+ type: 'collapsible',
145
+ label: 'Advanced',
146
+ admin: {
147
+ initCollapsed: true,
148
+ },
149
+ fields: [
150
+ {
151
+ name: 'className',
152
+ type: 'text',
153
+ admin: {
154
+ description: 'Additional CSS class names',
155
+ placeholder: 'custom-class',
156
+ },
157
+ },
158
+ {
159
+ name: 'sx',
160
+ type: 'textarea',
161
+ admin: {
162
+ description: 'MUI sx prop as JSON for advanced styling',
163
+ placeholder: '{"boxShadow": 2, "borderRadius": 2}',
164
+ },
165
+ },
166
+ {
167
+ name: 'id',
168
+ type: 'text',
169
+ admin: {
170
+ description: 'HTML element ID',
171
+ placeholder: 'unique-id',
172
+ },
173
+ },
174
+ ],
175
+ },
176
+ ];
177
+ /**
178
+ * Hero Block - Large header section with title, subtitle, and actions
179
+ * Maps to: @qwickapps/react-framework HeroBlock component
180
+ */
181
+ export const HeroBlock = {
182
+ slug: 'hero',
183
+ labels: {
184
+ singular: 'Hero Block',
185
+ plural: 'Hero Blocks',
186
+ },
187
+ admin: {
188
+ components: {
189
+ Label: {
190
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
191
+ clientProps: {},
192
+ },
193
+ },
194
+ },
195
+ fields: [
196
+ {
197
+ name: 'blockName',
198
+ type: 'text',
199
+ admin: {
200
+ description: 'Optional custom name for this block (e.g., "Home page hero")',
201
+ },
202
+ },
203
+ {
204
+ name: 'title',
205
+ type: 'text',
206
+ required: true,
207
+ admin: {
208
+ description: 'Main heading text',
209
+ },
210
+ },
211
+ {
212
+ name: 'subtitle',
213
+ type: 'textarea',
214
+ admin: {
215
+ description: 'Optional subtitle or description',
216
+ },
217
+ },
218
+ {
219
+ name: 'textAlign',
220
+ type: 'select',
221
+ defaultValue: 'center',
222
+ options: [
223
+ { label: 'Left', value: 'left' },
224
+ { label: 'Center', value: 'center' },
225
+ { label: 'Right', value: 'right' },
226
+ ],
227
+ admin: {
228
+ description: 'Text alignment',
229
+ },
230
+ },
231
+ {
232
+ name: 'blockHeight',
233
+ type: 'select',
234
+ defaultValue: 'medium',
235
+ options: [
236
+ { label: 'Small', value: 'small' },
237
+ { label: 'Medium', value: 'medium' },
238
+ { label: 'Large', value: 'large' },
239
+ { label: 'Full Viewport', value: 'viewport' },
240
+ ],
241
+ },
242
+ {
243
+ name: 'actions',
244
+ type: 'array',
245
+ label: 'Call-to-Action Buttons',
246
+ admin: {
247
+ description: 'Add buttons for hero actions (e.g., "Get Started", "Learn More")',
248
+ components: {
249
+ RowLabel: {
250
+ path: '/src/admin/components/ButtonRowLabel#ButtonRowLabel',
251
+ clientProps: {},
252
+ },
253
+ },
254
+ },
255
+ fields: [
256
+ {
257
+ name: 'label',
258
+ type: 'text',
259
+ required: true,
260
+ admin: {
261
+ description: 'Button text label',
262
+ },
263
+ },
264
+ {
265
+ name: 'href',
266
+ type: 'text',
267
+ required: true,
268
+ admin: {
269
+ description: 'Button destination URL',
270
+ },
271
+ },
272
+ {
273
+ name: 'variant',
274
+ type: 'select',
275
+ defaultValue: 'contained',
276
+ options: [
277
+ { label: 'Contained', value: 'contained' },
278
+ { label: 'Outlined', value: 'outlined' },
279
+ { label: 'Text', value: 'text' },
280
+ ],
281
+ admin: {
282
+ description: 'Button style variant',
283
+ },
284
+ },
285
+ {
286
+ name: 'color',
287
+ type: 'select',
288
+ defaultValue: 'primary',
289
+ options: [
290
+ { label: 'Primary', value: 'primary' },
291
+ { label: 'Secondary', value: 'secondary' },
292
+ { label: 'Error', value: 'error' },
293
+ { label: 'Warning', value: 'warning' },
294
+ { label: 'Info', value: 'info' },
295
+ { label: 'Success', value: 'success' },
296
+ ],
297
+ admin: {
298
+ description: 'Button color theme',
299
+ },
300
+ },
301
+ {
302
+ name: 'buttonSize',
303
+ type: 'select',
304
+ defaultValue: 'medium',
305
+ options: [
306
+ { label: 'Small', value: 'small' },
307
+ { label: 'Medium', value: 'medium' },
308
+ { label: 'Large', value: 'large' },
309
+ ],
310
+ admin: {
311
+ description: 'Button size',
312
+ },
313
+ },
314
+ {
315
+ name: 'icon',
316
+ type: 'text',
317
+ admin: {
318
+ description: 'Icon name for start of button (e.g., "rocket_launch", "play_arrow")',
319
+ placeholder: 'rocket_launch',
320
+ },
321
+ },
322
+ {
323
+ name: 'endIcon',
324
+ type: 'text',
325
+ admin: {
326
+ description: 'Icon name for end of button (e.g., "arrow_forward", "open_in_new")',
327
+ placeholder: 'arrow_forward',
328
+ },
329
+ },
330
+ {
331
+ name: 'fullWidth',
332
+ type: 'checkbox',
333
+ defaultValue: false,
334
+ admin: {
335
+ description: 'Make button stretch to full container width',
336
+ },
337
+ },
338
+ ],
339
+ },
340
+ ...commonStyleFields,
341
+ ],
342
+ };
343
+ /**
344
+ * Text Section Block - Simple section with heading and rich text content
345
+ * Maps to: @qwickapps/react-framework Section component
346
+ */
347
+ export const TextSectionBlock = {
348
+ slug: 'textSection',
349
+ labels: {
350
+ singular: 'Text Section',
351
+ plural: 'Text Sections',
352
+ },
353
+ admin: {
354
+ components: {
355
+ Label: {
356
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
357
+ clientProps: {},
358
+ },
359
+ },
360
+ },
361
+ fields: [
362
+ {
363
+ name: 'blockName',
364
+ type: 'text',
365
+ admin: {
366
+ description: 'Optional custom name for this block',
367
+ },
368
+ },
369
+ {
370
+ name: 'heading',
371
+ type: 'text',
372
+ admin: {
373
+ description: 'Section heading (optional)',
374
+ },
375
+ },
376
+ {
377
+ name: 'content',
378
+ type: 'richText',
379
+ required: true,
380
+ admin: {
381
+ description: 'Rich text content',
382
+ },
383
+ },
384
+ {
385
+ name: 'textAlign',
386
+ type: 'select',
387
+ defaultValue: 'left',
388
+ options: [
389
+ { label: 'Left', value: 'left' },
390
+ { label: 'Center', value: 'center' },
391
+ { label: 'Right', value: 'right' },
392
+ { label: 'Justify', value: 'justify' },
393
+ ],
394
+ admin: {
395
+ description: 'Text alignment',
396
+ },
397
+ },
398
+ ...commonStyleFields,
399
+ ],
400
+ };
401
+ /**
402
+ * Feature Grid Block - Grid of features from Features collection
403
+ * Maps to: @qwickapps/react-framework GridLayout + GridCell components
404
+ */
405
+ export const FeatureGridBlock = {
406
+ slug: 'featureGrid',
407
+ labels: {
408
+ singular: 'Feature Grid',
409
+ plural: 'Feature Grids',
410
+ },
411
+ admin: {
412
+ components: {
413
+ Label: {
414
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
415
+ clientProps: {},
416
+ },
417
+ },
418
+ },
419
+ fields: [
420
+ {
421
+ name: 'blockName',
422
+ type: 'text',
423
+ admin: {
424
+ description: 'Optional custom name for this block',
425
+ },
426
+ },
427
+ {
428
+ name: 'heading',
429
+ type: 'text',
430
+ admin: {
431
+ description: 'Optional heading above the grid',
432
+ },
433
+ },
434
+ {
435
+ name: 'features',
436
+ type: 'relationship',
437
+ relationTo: 'features',
438
+ hasMany: true,
439
+ required: true,
440
+ admin: {
441
+ description: 'Select features to display',
442
+ },
443
+ },
444
+ {
445
+ name: 'columns',
446
+ type: 'number',
447
+ defaultValue: 3,
448
+ min: 1,
449
+ max: 6,
450
+ admin: {
451
+ description: 'Number of columns (responsive)',
452
+ },
453
+ },
454
+ {
455
+ name: 'spacing',
456
+ type: 'select',
457
+ defaultValue: 'medium',
458
+ options: [
459
+ { label: 'Tiny', value: 'tiny' },
460
+ { label: 'Small', value: 'small' },
461
+ { label: 'Medium', value: 'medium' },
462
+ { label: 'Large', value: 'large' },
463
+ { label: 'Huge', value: 'huge' },
464
+ ],
465
+ admin: {
466
+ description: 'Space between grid items',
467
+ },
468
+ },
469
+ {
470
+ name: 'equalHeight',
471
+ type: 'checkbox',
472
+ defaultValue: false,
473
+ admin: {
474
+ description: 'Make all grid items the same height',
475
+ },
476
+ },
477
+ ...commonStyleFields,
478
+ ],
479
+ };
480
+ /**
481
+ * CTA Section Block - Call-to-action section with buttons
482
+ * Maps to: @qwickapps/react-framework Section component
483
+ */
484
+ export const CTASectionBlock = {
485
+ slug: 'ctaSection',
486
+ labels: {
487
+ singular: 'CTA Section',
488
+ plural: 'CTA Sections',
489
+ },
490
+ admin: {
491
+ components: {
492
+ Label: {
493
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
494
+ clientProps: {},
495
+ },
496
+ },
497
+ },
498
+ fields: [
499
+ {
500
+ name: 'blockName',
501
+ type: 'text',
502
+ admin: {
503
+ description: 'Optional custom name for this block',
504
+ },
505
+ },
506
+ {
507
+ name: 'heading',
508
+ type: 'text',
509
+ required: true,
510
+ admin: {
511
+ description: 'Main heading',
512
+ },
513
+ },
514
+ {
515
+ name: 'description',
516
+ type: 'textarea',
517
+ admin: {
518
+ description: 'Optional description text',
519
+ },
520
+ },
521
+ {
522
+ name: 'buttons',
523
+ type: 'array',
524
+ label: 'Action Buttons',
525
+ minRows: 1,
526
+ maxRows: 3,
527
+ admin: {
528
+ description: 'Add call-to-action buttons (1-3 buttons recommended)',
529
+ components: {
530
+ RowLabel: {
531
+ path: '/src/admin/components/ButtonRowLabel#ButtonRowLabel',
532
+ clientProps: {},
533
+ },
534
+ },
535
+ },
536
+ fields: [
537
+ {
538
+ name: 'label',
539
+ type: 'text',
540
+ required: true,
541
+ admin: {
542
+ description: 'Button text label',
543
+ },
544
+ },
545
+ {
546
+ name: 'href',
547
+ type: 'text',
548
+ required: true,
549
+ admin: {
550
+ description: 'Button destination URL',
551
+ },
552
+ },
553
+ {
554
+ name: 'variant',
555
+ type: 'select',
556
+ defaultValue: 'contained',
557
+ options: [
558
+ { label: 'Contained', value: 'contained' },
559
+ { label: 'Outlined', value: 'outlined' },
560
+ { label: 'Text', value: 'text' },
561
+ ],
562
+ admin: {
563
+ description: 'Button style variant',
564
+ },
565
+ },
566
+ {
567
+ name: 'color',
568
+ type: 'select',
569
+ defaultValue: 'primary',
570
+ options: [
571
+ { label: 'Primary', value: 'primary' },
572
+ { label: 'Secondary', value: 'secondary' },
573
+ { label: 'Error', value: 'error' },
574
+ { label: 'Warning', value: 'warning' },
575
+ { label: 'Info', value: 'info' },
576
+ { label: 'Success', value: 'success' },
577
+ ],
578
+ admin: {
579
+ description: 'Button color theme',
580
+ },
581
+ },
582
+ {
583
+ name: 'buttonSize',
584
+ type: 'select',
585
+ defaultValue: 'large',
586
+ options: [
587
+ { label: 'Small', value: 'small' },
588
+ { label: 'Medium', value: 'medium' },
589
+ { label: 'Large', value: 'large' },
590
+ ],
591
+ admin: {
592
+ description: 'Button size',
593
+ },
594
+ },
595
+ {
596
+ name: 'icon',
597
+ type: 'text',
598
+ admin: {
599
+ description: 'Icon name for start of button (e.g., "rocket_launch", "play_arrow")',
600
+ placeholder: 'rocket_launch',
601
+ },
602
+ },
603
+ {
604
+ name: 'endIcon',
605
+ type: 'text',
606
+ admin: {
607
+ description: 'Icon name for end of button (e.g., "arrow_forward", "open_in_new")',
608
+ placeholder: 'arrow_forward',
609
+ },
610
+ },
611
+ {
612
+ name: 'fullWidth',
613
+ type: 'checkbox',
614
+ defaultValue: false,
615
+ admin: {
616
+ description: 'Make button stretch to full container width',
617
+ },
618
+ },
619
+ ],
620
+ },
621
+ {
622
+ name: 'textAlign',
623
+ type: 'select',
624
+ defaultValue: 'center',
625
+ options: [
626
+ { label: 'Left', value: 'left' },
627
+ { label: 'Center', value: 'center' },
628
+ { label: 'Right', value: 'right' },
629
+ ],
630
+ admin: {
631
+ description: 'Text alignment',
632
+ },
633
+ },
634
+ ...commonStyleFields,
635
+ ],
636
+ };
637
+ /**
638
+ * Image Block - Single image with optional caption
639
+ * Maps to: Next.js Image component
640
+ */
641
+ export const ImageBlock = {
642
+ slug: 'image',
643
+ labels: {
644
+ singular: 'Image',
645
+ plural: 'Images',
646
+ },
647
+ admin: {
648
+ components: {
649
+ Label: {
650
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
651
+ clientProps: {},
652
+ },
653
+ },
654
+ },
655
+ fields: [
656
+ {
657
+ name: 'blockName',
658
+ type: 'text',
659
+ admin: {
660
+ description: 'Optional custom name for this block',
661
+ },
662
+ },
663
+ {
664
+ name: 'image',
665
+ type: 'upload',
666
+ relationTo: 'media',
667
+ required: true,
668
+ },
669
+ {
670
+ name: 'alt',
671
+ type: 'text',
672
+ required: true,
673
+ admin: {
674
+ description: 'Alt text for accessibility',
675
+ },
676
+ },
677
+ {
678
+ name: 'caption',
679
+ type: 'textarea',
680
+ admin: {
681
+ description: 'Optional caption',
682
+ },
683
+ },
684
+ {
685
+ name: 'size',
686
+ type: 'select',
687
+ defaultValue: 'large',
688
+ options: [
689
+ { label: 'Small', value: 'small' },
690
+ { label: 'Medium', value: 'medium' },
691
+ { label: 'Large', value: 'large' },
692
+ { label: 'Full Width', value: 'full' },
693
+ ],
694
+ admin: {
695
+ description: 'Image display size',
696
+ },
697
+ },
698
+ ...commonStyleFields,
699
+ ],
700
+ };
701
+ /**
702
+ * Spacer Block - Add vertical spacing between sections
703
+ */
704
+ export const SpacerBlock = {
705
+ slug: 'spacer',
706
+ labels: {
707
+ singular: 'Spacer',
708
+ plural: 'Spacers',
709
+ },
710
+ admin: {
711
+ components: {
712
+ Label: {
713
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
714
+ clientProps: {},
715
+ },
716
+ },
717
+ },
718
+ fields: [
719
+ {
720
+ name: 'blockName',
721
+ type: 'text',
722
+ admin: {
723
+ description: 'Optional custom name for this block',
724
+ },
725
+ },
726
+ {
727
+ name: 'height',
728
+ type: 'select',
729
+ defaultValue: 'medium',
730
+ options: [
731
+ { label: 'Small (24px)', value: 'small' },
732
+ { label: 'Medium (48px)', value: 'medium' },
733
+ { label: 'Large (96px)', value: 'large' },
734
+ { label: 'Extra Large (144px)', value: 'xlarge' },
735
+ ],
736
+ },
737
+ ],
738
+ };
739
+ /**
740
+ * Code Block - Display code snippets with syntax highlighting
741
+ * Maps to: @qwickapps/react-framework Code component
742
+ */
743
+ export const CodeBlock = {
744
+ slug: 'code',
745
+ labels: {
746
+ singular: 'Code Block',
747
+ plural: 'Code Blocks',
748
+ },
749
+ admin: {
750
+ components: {
751
+ Label: {
752
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
753
+ clientProps: {},
754
+ },
755
+ },
756
+ },
757
+ fields: [
758
+ {
759
+ name: 'blockName',
760
+ type: 'text',
761
+ admin: {
762
+ description: 'Optional custom name for this block',
763
+ },
764
+ },
765
+ {
766
+ name: 'code',
767
+ type: 'textarea',
768
+ required: true,
769
+ admin: {
770
+ description: 'Code content to display',
771
+ },
772
+ },
773
+ {
774
+ name: 'language',
775
+ type: 'select',
776
+ defaultValue: 'javascript',
777
+ options: [
778
+ { label: 'JavaScript', value: 'javascript' },
779
+ { label: 'TypeScript', value: 'typescript' },
780
+ { label: 'Python', value: 'python' },
781
+ { label: 'Java', value: 'java' },
782
+ { label: 'C#', value: 'csharp' },
783
+ { label: 'PHP', value: 'php' },
784
+ { label: 'Ruby', value: 'ruby' },
785
+ { label: 'Go', value: 'go' },
786
+ { label: 'Rust', value: 'rust' },
787
+ { label: 'HTML', value: 'html' },
788
+ { label: 'CSS', value: 'css' },
789
+ { label: 'JSON', value: 'json' },
790
+ { label: 'XML', value: 'xml' },
791
+ { label: 'SQL', value: 'sql' },
792
+ { label: 'Bash', value: 'bash' },
793
+ { label: 'Plain Text', value: 'text' },
794
+ ],
795
+ admin: {
796
+ description: 'Programming language for syntax highlighting',
797
+ },
798
+ },
799
+ {
800
+ name: 'title',
801
+ type: 'text',
802
+ admin: {
803
+ description: 'Optional title for the code block',
804
+ },
805
+ },
806
+ {
807
+ name: 'showCopy',
808
+ type: 'checkbox',
809
+ defaultValue: true,
810
+ admin: {
811
+ description: 'Show copy to clipboard button',
812
+ },
813
+ },
814
+ {
815
+ name: 'showLineNumbers',
816
+ type: 'checkbox',
817
+ defaultValue: false,
818
+ admin: {
819
+ description: 'Display line numbers',
820
+ },
821
+ },
822
+ {
823
+ name: 'wrapLines',
824
+ type: 'checkbox',
825
+ defaultValue: false,
826
+ admin: {
827
+ description: 'Wrap long lines instead of scrolling',
828
+ },
829
+ },
830
+ ...commonStyleFields,
831
+ ],
832
+ };
833
+ /**
834
+ * Product Grid Block - Display products from Products collection
835
+ * Maps to: @qwickapps/react-framework ProductCard component
836
+ */
837
+ export const ProductGridBlock = {
838
+ slug: 'productGrid',
839
+ labels: {
840
+ singular: 'Product Grid',
841
+ plural: 'Product Grids',
842
+ },
843
+ admin: {
844
+ components: {
845
+ Label: {
846
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
847
+ clientProps: {},
848
+ },
849
+ },
850
+ },
851
+ fields: [
852
+ {
853
+ name: 'blockName',
854
+ type: 'text',
855
+ admin: {
856
+ description: 'Optional custom name for this block',
857
+ },
858
+ },
859
+ {
860
+ name: 'heading',
861
+ type: 'text',
862
+ admin: {
863
+ description: 'Optional heading above the product grid',
864
+ },
865
+ },
866
+ {
867
+ name: 'products',
868
+ type: 'relationship',
869
+ relationTo: 'products',
870
+ hasMany: true,
871
+ required: true,
872
+ admin: {
873
+ description: 'Select products to display',
874
+ },
875
+ },
876
+ {
877
+ name: 'variant',
878
+ type: 'select',
879
+ defaultValue: 'compact',
880
+ options: [
881
+ { label: 'Compact', value: 'compact' },
882
+ { label: 'Detailed', value: 'detailed' },
883
+ ],
884
+ admin: {
885
+ description: 'Product card display variant',
886
+ },
887
+ },
888
+ {
889
+ name: 'columns',
890
+ type: 'number',
891
+ defaultValue: 3,
892
+ min: 1,
893
+ max: 4,
894
+ admin: {
895
+ description: 'Number of columns (responsive)',
896
+ },
897
+ },
898
+ {
899
+ name: 'spacing',
900
+ type: 'select',
901
+ defaultValue: 'medium',
902
+ options: [
903
+ { label: 'Tiny', value: 'tiny' },
904
+ { label: 'Small', value: 'small' },
905
+ { label: 'Medium', value: 'medium' },
906
+ { label: 'Large', value: 'large' },
907
+ { label: 'Huge', value: 'huge' },
908
+ ],
909
+ admin: {
910
+ description: 'Space between product cards',
911
+ },
912
+ },
913
+ {
914
+ name: 'equalHeight',
915
+ type: 'checkbox',
916
+ defaultValue: true,
917
+ admin: {
918
+ description: 'Make all product cards the same height',
919
+ },
920
+ },
921
+ ...commonStyleFields,
922
+ ],
923
+ };
924
+ /**
925
+ * Accordion Block - Collapsible content sections (FAQ style)
926
+ * Maps to: @qwickapps/react-framework CollapsibleLayout component
927
+ */
928
+ export const AccordionBlock = {
929
+ slug: 'accordion',
930
+ labels: {
931
+ singular: 'Accordion',
932
+ plural: 'Accordions',
933
+ },
934
+ admin: {
935
+ components: {
936
+ Label: {
937
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
938
+ clientProps: {},
939
+ },
940
+ },
941
+ },
942
+ fields: [
943
+ {
944
+ name: 'blockName',
945
+ type: 'text',
946
+ admin: {
947
+ description: 'Optional custom name for this block',
948
+ },
949
+ },
950
+ {
951
+ name: 'heading',
952
+ type: 'text',
953
+ admin: {
954
+ description: 'Optional heading above the accordion',
955
+ },
956
+ },
957
+ {
958
+ name: 'items',
959
+ type: 'array',
960
+ label: 'Accordion Items',
961
+ minRows: 1,
962
+ admin: {
963
+ description: 'Add accordion sections (e.g., FAQ questions)',
964
+ components: {
965
+ RowLabel: {
966
+ path: '/src/admin/components/AccordionItemRowLabel#AccordionItemRowLabel',
967
+ clientProps: {},
968
+ },
969
+ },
970
+ },
971
+ fields: [
972
+ {
973
+ name: 'title',
974
+ type: 'text',
975
+ required: true,
976
+ admin: {
977
+ description: 'Item title/question',
978
+ },
979
+ },
980
+ {
981
+ name: 'content',
982
+ type: 'richText',
983
+ required: true,
984
+ admin: {
985
+ description: 'Item content/answer',
986
+ },
987
+ },
988
+ {
989
+ name: 'defaultExpanded',
990
+ type: 'checkbox',
991
+ defaultValue: false,
992
+ admin: {
993
+ description: 'Expand this item by default',
994
+ },
995
+ },
996
+ ],
997
+ },
998
+ {
999
+ name: 'allowMultiple',
1000
+ type: 'checkbox',
1001
+ defaultValue: false,
1002
+ admin: {
1003
+ description: 'Allow multiple items to be expanded at once',
1004
+ },
1005
+ },
1006
+ {
1007
+ name: 'variant',
1008
+ type: 'select',
1009
+ defaultValue: 'outlined',
1010
+ options: [
1011
+ { label: 'Outlined', value: 'outlined' },
1012
+ { label: 'Filled', value: 'filled' },
1013
+ { label: 'Plain', value: 'plain' },
1014
+ ],
1015
+ admin: {
1016
+ description: 'Accordion visual style',
1017
+ },
1018
+ },
1019
+ ...commonStyleFields,
1020
+ ],
1021
+ };
1022
+ /**
1023
+ * Card Grid Block - Flexible card grid for custom content
1024
+ * Maps to: @qwickapps/react-framework GridLayout with custom cards
1025
+ */
1026
+ export const CardGridBlock = {
1027
+ slug: 'cardGrid',
1028
+ labels: {
1029
+ singular: 'Card Grid',
1030
+ plural: 'Card Grids',
1031
+ },
1032
+ admin: {
1033
+ components: {
1034
+ Label: {
1035
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
1036
+ clientProps: {},
1037
+ },
1038
+ },
1039
+ },
1040
+ fields: [
1041
+ {
1042
+ name: 'blockName',
1043
+ type: 'text',
1044
+ admin: {
1045
+ description: 'Optional custom name for this block',
1046
+ },
1047
+ },
1048
+ {
1049
+ name: 'heading',
1050
+ type: 'text',
1051
+ admin: {
1052
+ description: 'Optional heading above the card grid',
1053
+ },
1054
+ },
1055
+ {
1056
+ name: 'cards',
1057
+ type: 'array',
1058
+ label: 'Cards',
1059
+ minRows: 1,
1060
+ admin: {
1061
+ description: 'Add cards with icons, images, and links',
1062
+ components: {
1063
+ RowLabel: {
1064
+ path: '/src/admin/components/CardRowLabel#CardRowLabel',
1065
+ clientProps: {},
1066
+ },
1067
+ },
1068
+ },
1069
+ fields: [
1070
+ {
1071
+ name: 'title',
1072
+ type: 'text',
1073
+ required: true,
1074
+ admin: {
1075
+ description: 'Card title/heading',
1076
+ },
1077
+ },
1078
+ {
1079
+ name: 'description',
1080
+ type: 'textarea',
1081
+ admin: {
1082
+ description: 'Card description text',
1083
+ },
1084
+ },
1085
+ {
1086
+ name: 'image',
1087
+ type: 'upload',
1088
+ relationTo: 'media',
1089
+ admin: {
1090
+ description: 'Optional card image',
1091
+ },
1092
+ },
1093
+ {
1094
+ name: 'icon',
1095
+ type: 'text',
1096
+ admin: {
1097
+ description: 'Optional emoji or icon character',
1098
+ },
1099
+ },
1100
+ {
1101
+ name: 'link',
1102
+ type: 'text',
1103
+ admin: {
1104
+ description: 'Optional link URL',
1105
+ },
1106
+ },
1107
+ {
1108
+ name: 'linkText',
1109
+ type: 'text',
1110
+ admin: {
1111
+ description: 'Link button text (defaults to "Learn More")',
1112
+ },
1113
+ },
1114
+ ],
1115
+ },
1116
+ {
1117
+ name: 'columns',
1118
+ type: 'number',
1119
+ defaultValue: 3,
1120
+ min: 1,
1121
+ max: 4,
1122
+ admin: {
1123
+ description: 'Number of columns (responsive)',
1124
+ },
1125
+ },
1126
+ {
1127
+ name: 'spacing',
1128
+ type: 'select',
1129
+ defaultValue: 'medium',
1130
+ options: [
1131
+ { label: 'Tiny', value: 'tiny' },
1132
+ { label: 'Small', value: 'small' },
1133
+ { label: 'Medium', value: 'medium' },
1134
+ { label: 'Large', value: 'large' },
1135
+ { label: 'Huge', value: 'huge' },
1136
+ ],
1137
+ admin: {
1138
+ description: 'Space between cards',
1139
+ },
1140
+ },
1141
+ {
1142
+ name: 'cardVariant',
1143
+ type: 'select',
1144
+ defaultValue: 'outlined',
1145
+ options: [
1146
+ { label: 'Outlined', value: 'outlined' },
1147
+ { label: 'Elevated', value: 'elevation' },
1148
+ { label: 'Filled', value: 'filled' },
1149
+ ],
1150
+ admin: {
1151
+ description: 'Card visual style',
1152
+ },
1153
+ },
1154
+ ...commonStyleFields,
1155
+ ],
1156
+ };
1157
+ /**
1158
+ * Form Block - References a reusable form from Forms collection
1159
+ * Submissions are saved to FormSubmissions collection
1160
+ *
1161
+ * AI-First: Forms can be managed via /api/forms endpoints
1162
+ */
1163
+ export const FormBlock = {
1164
+ slug: 'form',
1165
+ labels: {
1166
+ singular: 'Form',
1167
+ plural: 'Forms',
1168
+ },
1169
+ admin: {
1170
+ components: {
1171
+ Label: {
1172
+ path: '/src/admin/components/BlockRowLabel#BlockRowLabel',
1173
+ clientProps: {},
1174
+ },
1175
+ },
1176
+ },
1177
+ fields: [
1178
+ {
1179
+ name: 'blockName',
1180
+ type: 'text',
1181
+ admin: {
1182
+ description: 'Optional custom name for this block',
1183
+ },
1184
+ },
1185
+ {
1186
+ name: 'form',
1187
+ type: 'relationship',
1188
+ relationTo: 'forms',
1189
+ required: true,
1190
+ admin: {
1191
+ description: 'Select a form from the Forms collection',
1192
+ },
1193
+ },
1194
+ {
1195
+ name: 'overrideHeading',
1196
+ type: 'text',
1197
+ admin: {
1198
+ description: 'Override the form heading for this instance (optional)',
1199
+ },
1200
+ },
1201
+ {
1202
+ name: 'overrideDescription',
1203
+ type: 'textarea',
1204
+ admin: {
1205
+ description: 'Override the form description for this instance (optional)',
1206
+ },
1207
+ },
1208
+ {
1209
+ name: 'overrideSubmitButtonText',
1210
+ type: 'text',
1211
+ admin: {
1212
+ description: 'Override the submit button text for this instance (optional)',
1213
+ },
1214
+ },
1215
+ {
1216
+ name: 'overrideSuccessMessage',
1217
+ type: 'text',
1218
+ admin: {
1219
+ description: 'Override the success message for this instance (optional)',
1220
+ },
1221
+ },
1222
+ ...commonStyleFields,
1223
+ ],
1224
+ };
1225
+ /**
1226
+ * All content blocks - export as array for easy reuse
1227
+ */
1228
+ export const contentBlocks = [
1229
+ HeroBlock,
1230
+ TextSectionBlock,
1231
+ FeatureGridBlock,
1232
+ CTASectionBlock,
1233
+ ImageBlock,
1234
+ SpacerBlock,
1235
+ CodeBlock,
1236
+ ProductGridBlock,
1237
+ AccordionBlock,
1238
+ CardGridBlock,
1239
+ FormBlock,
1240
+ ];
1241
+ //# sourceMappingURL=ContentBlocks.js.map