@electroplix/components 0.4.1 → 0.5.0-alpha.2

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 (173) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/LICENSE +21 -0
  3. package/README.md +88 -474
  4. package/SECURITY.md +19 -0
  5. package/cli.cjs +510 -485
  6. package/dist/config.d.ts +73 -0
  7. package/dist/config.esm.js +229 -0
  8. package/dist/index.esm.js +6531 -6668
  9. package/dist/package.json +97 -0
  10. package/dist/src/components/blog/index.d.ts +5 -5
  11. package/dist/src/components/blog/index.d.ts.map +1 -1
  12. package/dist/src/components/buttons/index.d.ts +38 -8
  13. package/dist/src/components/buttons/index.d.ts.map +1 -1
  14. package/dist/src/components/content/BlockquoteTestimonial.d.ts +1 -1
  15. package/dist/src/components/content/BlockquoteTestimonial.d.ts.map +1 -1
  16. package/dist/src/components/content/CalloutBox.d.ts +4 -3
  17. package/dist/src/components/content/CalloutBox.d.ts.map +1 -1
  18. package/dist/src/components/content/HeadingSection.d.ts +2 -2
  19. package/dist/src/components/content/HeadingSection.d.ts.map +1 -1
  20. package/dist/src/components/content/InlineCodeText.d.ts +4 -3
  21. package/dist/src/components/content/InlineCodeText.d.ts.map +1 -1
  22. package/dist/src/components/content/ParagraphBlock.d.ts +5 -4
  23. package/dist/src/components/content/ParagraphBlock.d.ts.map +1 -1
  24. package/dist/src/components/content/RichMarkdown.d.ts +4 -3
  25. package/dist/src/components/content/RichMarkdown.d.ts.map +1 -1
  26. package/dist/src/components/content/TeamGrid.d.ts.map +1 -1
  27. package/dist/src/components/content/index.d.ts +7 -7
  28. package/dist/src/components/content/index.d.ts.map +1 -1
  29. package/dist/src/components/data-display/Badge.d.ts +5 -4
  30. package/dist/src/components/data-display/Badge.d.ts.map +1 -1
  31. package/dist/src/components/data-display/BadgeGroup.d.ts +4 -3
  32. package/dist/src/components/data-display/BadgeGroup.d.ts.map +1 -1
  33. package/dist/src/components/data-display/BarChart.d.ts.map +1 -1
  34. package/dist/src/components/data-display/CalendarGrid.d.ts +1 -1
  35. package/dist/src/components/data-display/CalendarGrid.d.ts.map +1 -1
  36. package/dist/src/components/data-display/DataTable.d.ts +3 -3
  37. package/dist/src/components/data-display/DataTable.d.ts.map +1 -1
  38. package/dist/src/components/data-display/LineChart.d.ts.map +1 -1
  39. package/dist/src/components/data-display/PieChart.d.ts +1 -1
  40. package/dist/src/components/data-display/PieChart.d.ts.map +1 -1
  41. package/dist/src/components/data-display/ProgressBar.d.ts.map +1 -1
  42. package/dist/src/components/data-display/RatingStars.d.ts.map +1 -1
  43. package/dist/src/components/data-display/Sparkline.d.ts.map +1 -1
  44. package/dist/src/components/data-display/Timeline.d.ts +1 -1
  45. package/dist/src/components/data-display/Timeline.d.ts.map +1 -1
  46. package/dist/src/components/data-display/index.d.ts +11 -11
  47. package/dist/src/components/data-display/index.d.ts.map +1 -1
  48. package/dist/src/components/ecommerce/index.d.ts +8 -8
  49. package/dist/src/components/ecommerce/index.d.ts.map +1 -1
  50. package/dist/src/components/forms/AddressAutocomplete.d.ts +1 -1
  51. package/dist/src/components/forms/AddressAutocomplete.d.ts.map +1 -1
  52. package/dist/src/components/forms/Captcha.d.ts +2 -2
  53. package/dist/src/components/forms/Captcha.d.ts.map +1 -1
  54. package/dist/src/components/forms/ContactForm.d.ts +1 -1
  55. package/dist/src/components/forms/ContactForm.d.ts.map +1 -1
  56. package/dist/src/components/forms/DateTimePicker.d.ts +2 -2
  57. package/dist/src/components/forms/DateTimePicker.d.ts.map +1 -1
  58. package/dist/src/components/forms/FileUploader.d.ts +1 -1
  59. package/dist/src/components/forms/FileUploader.d.ts.map +1 -1
  60. package/dist/src/components/forms/FormShell.d.ts +1 -1
  61. package/dist/src/components/forms/FormShell.d.ts.map +1 -1
  62. package/dist/src/components/forms/InputField.d.ts +1 -1
  63. package/dist/src/components/forms/InputField.d.ts.map +1 -1
  64. package/dist/src/components/forms/MultiStepWizard.d.ts +1 -1
  65. package/dist/src/components/forms/MultiStepWizard.d.ts.map +1 -1
  66. package/dist/src/components/forms/NewsletterSignup.d.ts +1 -1
  67. package/dist/src/components/forms/NewsletterSignup.d.ts.map +1 -1
  68. package/dist/src/components/forms/RadioGroup.d.ts +1 -1
  69. package/dist/src/components/forms/RadioGroup.d.ts.map +1 -1
  70. package/dist/src/components/forms/SelectDropdown.d.ts +1 -1
  71. package/dist/src/components/forms/SelectDropdown.d.ts.map +1 -1
  72. package/dist/src/components/forms/TextAreaField.d.ts +1 -1
  73. package/dist/src/components/forms/TextAreaField.d.ts.map +1 -1
  74. package/dist/src/components/forms/ToggleSwitch.d.ts +1 -1
  75. package/dist/src/components/forms/ToggleSwitch.d.ts.map +1 -1
  76. package/dist/src/components/forms/ValidationWrapper.d.ts +1 -1
  77. package/dist/src/components/forms/ValidationWrapper.d.ts.map +1 -1
  78. package/dist/src/components/forms/index.d.ts +28 -28
  79. package/dist/src/components/forms/index.d.ts.map +1 -1
  80. package/dist/src/components/hero/CTAOverlayHero.d.ts +1 -1
  81. package/dist/src/components/hero/CTAOverlayHero.d.ts.map +1 -1
  82. package/dist/src/components/hero/CarouselHero.d.ts +1 -1
  83. package/dist/src/components/hero/CarouselHero.d.ts.map +1 -1
  84. package/dist/src/components/hero/HeroShell.d.ts +1 -1
  85. package/dist/src/components/hero/HeroShell.d.ts.map +1 -1
  86. package/dist/src/components/hero/PatternedHero.d.ts +2 -2
  87. package/dist/src/components/hero/PatternedHero.d.ts.map +1 -1
  88. package/dist/src/components/hero/SplitHero.d.ts +1 -1
  89. package/dist/src/components/hero/SplitHero.d.ts.map +1 -1
  90. package/dist/src/components/hero/StaticHero.d.ts +2 -2
  91. package/dist/src/components/hero/StaticHero.d.ts.map +1 -1
  92. package/dist/src/components/hero/VideoHeaderHero.d.ts +1 -1
  93. package/dist/src/components/hero/VideoHeaderHero.d.ts.map +1 -1
  94. package/dist/src/components/hero/index.d.ts +14 -14
  95. package/dist/src/components/hero/index.d.ts.map +1 -1
  96. package/dist/src/components/lists-cards/index.d.ts +7 -7
  97. package/dist/src/components/lists-cards/index.d.ts.map +1 -1
  98. package/dist/src/components/marketing/index.d.ts +5 -5
  99. package/dist/src/components/marketing/index.d.ts.map +1 -1
  100. package/dist/src/components/media/index.d.ts +7 -7
  101. package/dist/src/components/media/index.d.ts.map +1 -1
  102. package/dist/src/components/miscellaneous/index.d.ts +4 -4
  103. package/dist/src/components/miscellaneous/index.d.ts.map +1 -1
  104. package/dist/src/components/modals/index.d.ts +5 -5
  105. package/dist/src/components/modals/index.d.ts.map +1 -1
  106. package/dist/src/components/navigation/AnchorLinks.d.ts +2 -2
  107. package/dist/src/components/navigation/AnchorLinks.d.ts.map +1 -1
  108. package/dist/src/components/navigation/Breadcrumbs.d.ts +1 -1
  109. package/dist/src/components/navigation/Breadcrumbs.d.ts.map +1 -1
  110. package/dist/src/components/navigation/Footer.d.ts +1 -1
  111. package/dist/src/components/navigation/Footer.d.ts.map +1 -1
  112. package/dist/src/components/navigation/LanguageSelector.d.ts +1 -1
  113. package/dist/src/components/navigation/LanguageSelector.d.ts.map +1 -1
  114. package/dist/src/components/navigation/MegaMenu.d.ts +1 -1
  115. package/dist/src/components/navigation/MegaMenu.d.ts.map +1 -1
  116. package/dist/src/components/navigation/Pagination.d.ts.map +1 -1
  117. package/dist/src/components/navigation/PrimaryNav.d.ts.map +1 -1
  118. package/dist/src/components/navigation/SideDrawerNav.d.ts +2 -2
  119. package/dist/src/components/navigation/SideDrawerNav.d.ts.map +1 -1
  120. package/dist/src/components/navigation/SidebarMenu.d.ts +1 -1
  121. package/dist/src/components/navigation/SidebarMenu.d.ts.map +1 -1
  122. package/dist/src/components/navigation/Stepper.d.ts +1 -1
  123. package/dist/src/components/navigation/Stepper.d.ts.map +1 -1
  124. package/dist/src/components/navigation/Tabs.d.ts +2 -2
  125. package/dist/src/components/navigation/Tabs.d.ts.map +1 -1
  126. package/dist/src/components/navigation/index.d.ts +22 -22
  127. package/dist/src/components/navigation/index.d.ts.map +1 -1
  128. package/dist/src/components/onboarding/index.d.ts +7 -7
  129. package/dist/src/components/onboarding/index.d.ts.map +1 -1
  130. package/dist/src/components/search/index.d.ts +3 -3
  131. package/dist/src/components/search/index.d.ts.map +1 -1
  132. package/dist/src/components/site-identity/index.d.ts +5 -5
  133. package/dist/src/components/site-identity/index.d.ts.map +1 -1
  134. package/dist/src/components/social/index.d.ts +7 -7
  135. package/dist/src/components/social/index.d.ts.map +1 -1
  136. package/dist/src/components/user-accounts/index.d.ts +6 -6
  137. package/dist/src/components/user-accounts/index.d.ts.map +1 -1
  138. package/dist/src/core/config.d.ts +1 -1
  139. package/dist/src/core/config.d.ts.map +1 -1
  140. package/dist/src/core/icons.d.ts +1 -1
  141. package/dist/src/core/icons.d.ts.map +1 -1
  142. package/dist/src/core/index.d.ts +7 -7
  143. package/dist/src/core/index.d.ts.map +1 -1
  144. package/dist/src/core/provider.d.ts +20 -20
  145. package/dist/src/core/provider.d.ts.map +1 -1
  146. package/dist/src/core/types.d.ts +4 -4
  147. package/dist/src/core/types.d.ts.map +1 -1
  148. package/dist/src/core/utils.d.ts +1 -1
  149. package/dist/src/core/utils.d.ts.map +1 -1
  150. package/dist/src/index.d.ts +19 -19
  151. package/dist/src/index.d.ts.map +1 -1
  152. package/metadata/blog.json +807 -0
  153. package/metadata/buttons.json +2186 -0
  154. package/metadata/content.json +1152 -0
  155. package/metadata/data-display.json +822 -0
  156. package/metadata/ecommerce.json +1059 -0
  157. package/metadata/forms.json +2637 -0
  158. package/metadata/hero.json +1401 -0
  159. package/metadata/lists-cards.json +848 -0
  160. package/metadata/marketing.json +1235 -0
  161. package/metadata/media.json +800 -0
  162. package/metadata/miscellaneous.json +778 -0
  163. package/metadata/modals.json +954 -0
  164. package/metadata/navigation.json +1348 -0
  165. package/metadata/onboarding.json +615 -0
  166. package/metadata/search.json +559 -0
  167. package/metadata/site-identity.json +555 -0
  168. package/metadata/social.json +654 -0
  169. package/metadata/user-accounts.json +727 -0
  170. package/package.json +18 -6
  171. package/dist/README.md +0 -35
  172. package/dist/src/__tests__/test-utils.d.ts +0 -8
  173. package/dist/src/__tests__/test-utils.d.ts.map +0 -1
@@ -0,0 +1,1235 @@
1
+ {
2
+ "$schema": "electroplix-component-metadata-v1",
3
+ "category": "marketing",
4
+ "label": "Marketing",
5
+ "description": "Promotional components including comparisons, countdowns, testimonials, trust badges, and lead capture",
6
+ "themeKey": "marketing",
7
+ "icon": "megaphone",
8
+ "sortOrder": 9,
9
+ "components": [
10
+ {
11
+ "id": "marketing.ComparisonTable",
12
+ "name": "ComparisonTable",
13
+ "description": "Side-by-side plan comparison table with feature rows and optional highlighted plan. Ideal for pricing and feature comparison pages.",
14
+ "whenToUse": "Use to compare pricing plans, product tiers, or feature sets side by side. Essential for SaaS pricing pages, marketing landing pages, and product comparison views.",
15
+ "isShell": false,
16
+ "props": [
17
+ {
18
+ "name": "plans",
19
+ "type": "ComparisonPlan[]",
20
+ "required": true,
21
+ "default": null,
22
+ "description": "Array of plans to compare: {id, name, price, period?, cta?, highlighted?}"
23
+ },
24
+ {
25
+ "name": "features",
26
+ "type": "ComparisonFeature[]",
27
+ "required": true,
28
+ "default": null,
29
+ "description": "Array of feature rows: {label, values: Record<string, boolean | string>}"
30
+ },
31
+ {
32
+ "name": "title",
33
+ "type": "string",
34
+ "required": false,
35
+ "default": null,
36
+ "description": "Optional heading displayed above the comparison table"
37
+ },
38
+ {
39
+ "name": "onSelect",
40
+ "type": "(planId: string) => void",
41
+ "required": false,
42
+ "default": null,
43
+ "description": "Callback when a plan is selected"
44
+ },
45
+ {
46
+ "name": "bgColor",
47
+ "type": "string",
48
+ "required": false,
49
+ "default": "theme",
50
+ "description": "Background color override"
51
+ },
52
+ {
53
+ "name": "textColor",
54
+ "type": "string",
55
+ "required": false,
56
+ "default": "theme",
57
+ "description": "Text color override"
58
+ },
59
+ {
60
+ "name": "accentColor",
61
+ "type": "string",
62
+ "required": false,
63
+ "default": "theme",
64
+ "description": "Accent color override"
65
+ },
66
+ {
67
+ "name": "borderColor",
68
+ "type": "string",
69
+ "required": false,
70
+ "default": "theme",
71
+ "description": "Border color override"
72
+ },
73
+ {
74
+ "name": "fontFamily",
75
+ "type": "string",
76
+ "required": false,
77
+ "default": "theme",
78
+ "description": "Font family override"
79
+ },
80
+ {
81
+ "name": "cardBg",
82
+ "type": "string",
83
+ "required": false,
84
+ "default": "theme",
85
+ "description": "Card background color override"
86
+ },
87
+ {
88
+ "name": "cardRadius",
89
+ "type": "number",
90
+ "required": false,
91
+ "default": null,
92
+ "description": "Card border radius override"
93
+ },
94
+ {
95
+ "name": "cardBorder",
96
+ "type": "string",
97
+ "required": false,
98
+ "default": "theme",
99
+ "description": "Card border color override"
100
+ },
101
+ {
102
+ "name": "gridColor",
103
+ "type": "string",
104
+ "required": false,
105
+ "default": "theme",
106
+ "description": "Grid/table line color override"
107
+ },
108
+ {
109
+ "name": "mutedText",
110
+ "type": "string",
111
+ "required": false,
112
+ "default": "theme",
113
+ "description": "Muted/secondary text color override"
114
+ }
115
+ ],
116
+ "themeTokens": [
117
+ "bgColor",
118
+ "textColor",
119
+ "accentColor",
120
+ "borderColor",
121
+ "fontFamily",
122
+ "radius",
123
+ "spacing",
124
+ "cardBg",
125
+ "cardRadius",
126
+ "cardBorder",
127
+ "inputBg",
128
+ "inputText",
129
+ "mutedText",
130
+ "gridColor"
131
+ ],
132
+ "aiHints": {
133
+ "pageTypes": ["saas", "marketing", "landing", "education", "agency", "fitness"],
134
+ "placement": "body",
135
+ "priority": 8,
136
+ "sequenceOrder": 6,
137
+ "pairsWellWith": [
138
+ "marketing.MarketingHeroBlock",
139
+ "marketing.TestimonialsCarousel",
140
+ "marketing.TrustBadges"
141
+ ],
142
+ "maxPerPage": 1,
143
+ "isContainer": false
144
+ }
145
+ },
146
+ {
147
+ "id": "marketing.CountdownTimer",
148
+ "name": "CountdownTimer",
149
+ "description": "Countdown timer displaying days, hours, minutes, and seconds until a target date. Supports custom accent color and expiry callback. Great for event launch timers, product drops, flash sale clocks, hackathon countdowns.",
150
+ "whenToUse": "Use for limited-time offers, product launches, event countdowns, or flash sales. Great for creating urgency on marketing and ecommerce pages.",
151
+ "isShell": false,
152
+ "props": [
153
+ {
154
+ "name": "targetDate",
155
+ "type": "string | Date",
156
+ "required": true,
157
+ "default": null,
158
+ "description": "The target date/time to count down to"
159
+ },
160
+ {
161
+ "name": "label",
162
+ "type": "string",
163
+ "required": false,
164
+ "default": null,
165
+ "description": "Optional label displayed above or alongside the countdown"
166
+ },
167
+ {
168
+ "name": "onExpire",
169
+ "type": "() => void",
170
+ "required": false,
171
+ "default": null,
172
+ "description": "Callback fired when the countdown reaches zero"
173
+ },
174
+ {
175
+ "name": "accentColor",
176
+ "type": "string",
177
+ "required": false,
178
+ "default": "theme",
179
+ "description": "Accent color for countdown digits"
180
+ },
181
+ {
182
+ "name": "bgColor",
183
+ "type": "string",
184
+ "required": false,
185
+ "default": "theme",
186
+ "description": "Background color override"
187
+ },
188
+ {
189
+ "name": "textColor",
190
+ "type": "string",
191
+ "required": false,
192
+ "default": "theme",
193
+ "description": "Text color override"
194
+ },
195
+ {
196
+ "name": "borderColor",
197
+ "type": "string",
198
+ "required": false,
199
+ "default": "theme",
200
+ "description": "Border color override"
201
+ },
202
+ {
203
+ "name": "fontFamily",
204
+ "type": "string",
205
+ "required": false,
206
+ "default": "theme",
207
+ "description": "Font family override"
208
+ },
209
+ {
210
+ "name": "cardBg",
211
+ "type": "string",
212
+ "required": false,
213
+ "default": "theme",
214
+ "description": "Card background color for digit boxes"
215
+ },
216
+ {
217
+ "name": "cardRadius",
218
+ "type": "number",
219
+ "required": false,
220
+ "default": null,
221
+ "description": "Border radius for digit boxes"
222
+ },
223
+ {
224
+ "name": "cardBorder",
225
+ "type": "string",
226
+ "required": false,
227
+ "default": "theme",
228
+ "description": "Border color for digit boxes"
229
+ },
230
+ {
231
+ "name": "mutedText",
232
+ "type": "string",
233
+ "required": false,
234
+ "default": "theme",
235
+ "description": "Muted text color for unit labels"
236
+ }
237
+ ],
238
+ "themeTokens": [
239
+ "bgColor",
240
+ "textColor",
241
+ "accentColor",
242
+ "borderColor",
243
+ "fontFamily",
244
+ "radius",
245
+ "spacing",
246
+ "cardBg",
247
+ "cardRadius",
248
+ "cardBorder",
249
+ "inputBg",
250
+ "inputText",
251
+ "mutedText",
252
+ "gridColor"
253
+ ],
254
+ "aiHints": {
255
+ "pageTypes": ["marketing", "ecommerce", "landing", "event", "restaurant", "fitness"],
256
+ "placement": "body",
257
+ "priority": 6,
258
+ "sequenceOrder": 5,
259
+ "pairsWellWith": [
260
+ "marketing.PromoPopup",
261
+ "marketing.MarketingHeroBlock",
262
+ "marketing.LeadMagnetGate"
263
+ ],
264
+ "maxPerPage": 2,
265
+ "isContainer": false
266
+ }
267
+ },
268
+ {
269
+ "id": "marketing.FeatureHighlights",
270
+ "name": "FeatureHighlights",
271
+ "description": "Responsive grid of USP/feature cards, each with an optional icon, title, and description. Configurable column count.",
272
+ "whenToUse": "Use to showcase unique selling points, key features, or benefits in a scannable grid layout. Ideal for landing pages, SaaS marketing, and product overview sections.",
273
+ "isShell": false,
274
+ "props": [
275
+ {
276
+ "name": "items",
277
+ "type": "USP[]",
278
+ "required": true,
279
+ "default": null,
280
+ "description": "Array of feature items: {id, icon?, title, description?}"
281
+ },
282
+ {
283
+ "name": "columns",
284
+ "type": "number",
285
+ "required": false,
286
+ "default": "3",
287
+ "description": "Number of columns in the grid layout"
288
+ },
289
+ {
290
+ "name": "title",
291
+ "type": "string",
292
+ "required": false,
293
+ "default": null,
294
+ "description": "Optional heading displayed above the feature grid"
295
+ },
296
+ {
297
+ "name": "bgColor",
298
+ "type": "string",
299
+ "required": false,
300
+ "default": "theme",
301
+ "description": "Background color override"
302
+ },
303
+ {
304
+ "name": "textColor",
305
+ "type": "string",
306
+ "required": false,
307
+ "default": "theme",
308
+ "description": "Text color override"
309
+ },
310
+ {
311
+ "name": "accentColor",
312
+ "type": "string",
313
+ "required": false,
314
+ "default": "theme",
315
+ "description": "Accent color override"
316
+ },
317
+ {
318
+ "name": "borderColor",
319
+ "type": "string",
320
+ "required": false,
321
+ "default": "theme",
322
+ "description": "Border color override"
323
+ },
324
+ {
325
+ "name": "fontFamily",
326
+ "type": "string",
327
+ "required": false,
328
+ "default": "theme",
329
+ "description": "Font family override"
330
+ },
331
+ {
332
+ "name": "cardBg",
333
+ "type": "string",
334
+ "required": false,
335
+ "default": "theme",
336
+ "description": "Card background color override"
337
+ },
338
+ {
339
+ "name": "cardRadius",
340
+ "type": "number",
341
+ "required": false,
342
+ "default": null,
343
+ "description": "Card border radius override"
344
+ },
345
+ {
346
+ "name": "cardBorder",
347
+ "type": "string",
348
+ "required": false,
349
+ "default": "theme",
350
+ "description": "Card border color override"
351
+ },
352
+ {
353
+ "name": "mutedText",
354
+ "type": "string",
355
+ "required": false,
356
+ "default": "theme",
357
+ "description": "Muted text color for descriptions"
358
+ },
359
+ {
360
+ "name": "gridColor",
361
+ "type": "string",
362
+ "required": false,
363
+ "default": "theme",
364
+ "description": "Grid line/separator color override"
365
+ }
366
+ ],
367
+ "themeTokens": [
368
+ "bgColor",
369
+ "textColor",
370
+ "accentColor",
371
+ "borderColor",
372
+ "fontFamily",
373
+ "radius",
374
+ "spacing",
375
+ "cardBg",
376
+ "cardRadius",
377
+ "cardBorder",
378
+ "inputBg",
379
+ "inputText",
380
+ "mutedText",
381
+ "gridColor"
382
+ ],
383
+ "aiHints": {
384
+ "pageTypes": [
385
+ "landing",
386
+ "marketing",
387
+ "saas",
388
+ "education",
389
+ "fitness",
390
+ "agency",
391
+ "health",
392
+ "nonprofit"
393
+ ],
394
+ "placement": "body",
395
+ "priority": 8,
396
+ "sequenceOrder": 4,
397
+ "pairsWellWith": [
398
+ "marketing.MarketingHeroBlock",
399
+ "marketing.TestimonialsCarousel",
400
+ "marketing.ComparisonTable"
401
+ ],
402
+ "maxPerPage": 2,
403
+ "isContainer": false
404
+ }
405
+ },
406
+ {
407
+ "id": "marketing.LeadMagnetGate",
408
+ "name": "LeadMagnetGate",
409
+ "description": "Email gate overlay for gated content. Collects an email address before revealing the wrapped content. Includes customizable CTA and input placeholder.",
410
+ "whenToUse": "Use to gate premium content such as ebooks, whitepapers, templates, or exclusive offers behind an email capture form. Ideal for lead generation on marketing and landing pages.",
411
+ "isShell": false,
412
+ "props": [
413
+ {
414
+ "name": "title",
415
+ "type": "string",
416
+ "required": true,
417
+ "default": null,
418
+ "description": "Heading text for the lead magnet gate"
419
+ },
420
+ {
421
+ "name": "description",
422
+ "type": "string",
423
+ "required": false,
424
+ "default": null,
425
+ "description": "Supporting description text below the title"
426
+ },
427
+ {
428
+ "name": "inputPlaceholder",
429
+ "type": "string",
430
+ "required": false,
431
+ "default": "\"Enter your email\"",
432
+ "description": "Placeholder text for the email input"
433
+ },
434
+ {
435
+ "name": "ctaLabel",
436
+ "type": "string",
437
+ "required": false,
438
+ "default": "\"Get Access\"",
439
+ "description": "Label for the submit/CTA button"
440
+ },
441
+ {
442
+ "name": "onSubmit",
443
+ "type": "(email: string) => void",
444
+ "required": false,
445
+ "default": null,
446
+ "description": "Callback fired with the email when the form is submitted"
447
+ },
448
+ {
449
+ "name": "children",
450
+ "type": "ReactNode",
451
+ "required": false,
452
+ "default": null,
453
+ "description": "Gated content revealed after email submission"
454
+ },
455
+ {
456
+ "name": "bgColor",
457
+ "type": "string",
458
+ "required": false,
459
+ "default": "theme",
460
+ "description": "Background color override"
461
+ },
462
+ {
463
+ "name": "textColor",
464
+ "type": "string",
465
+ "required": false,
466
+ "default": "theme",
467
+ "description": "Text color override"
468
+ },
469
+ {
470
+ "name": "accentColor",
471
+ "type": "string",
472
+ "required": false,
473
+ "default": "theme",
474
+ "description": "Accent color override"
475
+ },
476
+ {
477
+ "name": "borderColor",
478
+ "type": "string",
479
+ "required": false,
480
+ "default": "theme",
481
+ "description": "Border color override"
482
+ },
483
+ {
484
+ "name": "fontFamily",
485
+ "type": "string",
486
+ "required": false,
487
+ "default": "theme",
488
+ "description": "Font family override"
489
+ },
490
+ {
491
+ "name": "cardBg",
492
+ "type": "string",
493
+ "required": false,
494
+ "default": "theme",
495
+ "description": "Card background color override"
496
+ },
497
+ {
498
+ "name": "cardRadius",
499
+ "type": "number",
500
+ "required": false,
501
+ "default": null,
502
+ "description": "Card border radius override"
503
+ },
504
+ {
505
+ "name": "cardBorder",
506
+ "type": "string",
507
+ "required": false,
508
+ "default": "theme",
509
+ "description": "Card border color override"
510
+ },
511
+ {
512
+ "name": "inputBg",
513
+ "type": "string",
514
+ "required": false,
515
+ "default": "theme",
516
+ "description": "Input background color override"
517
+ },
518
+ {
519
+ "name": "inputText",
520
+ "type": "string",
521
+ "required": false,
522
+ "default": "theme",
523
+ "description": "Input text color override"
524
+ },
525
+ {
526
+ "name": "mutedText",
527
+ "type": "string",
528
+ "required": false,
529
+ "default": "theme",
530
+ "description": "Muted text color for description"
531
+ }
532
+ ],
533
+ "themeTokens": [
534
+ "bgColor",
535
+ "textColor",
536
+ "accentColor",
537
+ "borderColor",
538
+ "fontFamily",
539
+ "radius",
540
+ "spacing",
541
+ "cardBg",
542
+ "cardRadius",
543
+ "cardBorder",
544
+ "inputBg",
545
+ "inputText",
546
+ "mutedText",
547
+ "gridColor"
548
+ ],
549
+ "aiHints": {
550
+ "pageTypes": ["marketing", "landing"],
551
+ "placement": "body",
552
+ "priority": 7,
553
+ "sequenceOrder": 7,
554
+ "pairsWellWith": [
555
+ "marketing.CountdownTimer",
556
+ "marketing.TestimonialsCarousel",
557
+ "marketing.TrustBadges"
558
+ ],
559
+ "maxPerPage": 1,
560
+ "isContainer": true
561
+ }
562
+ },
563
+ {
564
+ "id": "marketing.MarketingHeroBlock",
565
+ "name": "MarketingHeroBlock",
566
+ "description": "Full-width marketing hero section with eyebrow text, headline, subheadline, primary and secondary CTAs, and optional background image.",
567
+ "whenToUse": "Use as the primary hero section on marketing and landing pages. Ideal for product launches, campaign pages, and any page needing a bold above-the-fold section.",
568
+ "isShell": false,
569
+ "props": [
570
+ {
571
+ "name": "eyebrow",
572
+ "type": "string",
573
+ "required": false,
574
+ "default": null,
575
+ "description": "Small text displayed above the headline"
576
+ },
577
+ {
578
+ "name": "headline",
579
+ "type": "string",
580
+ "required": true,
581
+ "default": null,
582
+ "description": "Primary headline text"
583
+ },
584
+ {
585
+ "name": "subheadline",
586
+ "type": "string",
587
+ "required": false,
588
+ "default": null,
589
+ "description": "Supporting subheadline text below the headline"
590
+ },
591
+ {
592
+ "name": "ctaLabel",
593
+ "type": "string",
594
+ "required": false,
595
+ "default": "\"Get Started\"",
596
+ "description": "Label for the primary CTA button"
597
+ },
598
+ {
599
+ "name": "onCtaClick",
600
+ "type": "() => void",
601
+ "required": false,
602
+ "default": null,
603
+ "description": "Callback when the primary CTA is clicked"
604
+ },
605
+ {
606
+ "name": "secondaryLabel",
607
+ "type": "string",
608
+ "required": false,
609
+ "default": null,
610
+ "description": "Label for the secondary CTA button"
611
+ },
612
+ {
613
+ "name": "onSecondaryClick",
614
+ "type": "() => void",
615
+ "required": false,
616
+ "default": null,
617
+ "description": "Callback when the secondary CTA is clicked"
618
+ },
619
+ {
620
+ "name": "bgImage",
621
+ "type": "string",
622
+ "required": false,
623
+ "default": null,
624
+ "description": "URL of the background image"
625
+ },
626
+ {
627
+ "name": "bgColor",
628
+ "type": "string",
629
+ "required": false,
630
+ "default": "theme",
631
+ "description": "Background color override"
632
+ },
633
+ {
634
+ "name": "textColor",
635
+ "type": "string",
636
+ "required": false,
637
+ "default": "theme",
638
+ "description": "Text color override"
639
+ },
640
+ {
641
+ "name": "accentColor",
642
+ "type": "string",
643
+ "required": false,
644
+ "default": "theme",
645
+ "description": "Accent color override"
646
+ },
647
+ {
648
+ "name": "borderColor",
649
+ "type": "string",
650
+ "required": false,
651
+ "default": "theme",
652
+ "description": "Border color override"
653
+ },
654
+ {
655
+ "name": "fontFamily",
656
+ "type": "string",
657
+ "required": false,
658
+ "default": "theme",
659
+ "description": "Font family override"
660
+ },
661
+ {
662
+ "name": "mutedText",
663
+ "type": "string",
664
+ "required": false,
665
+ "default": "theme",
666
+ "description": "Muted text color for eyebrow and subheadline"
667
+ }
668
+ ],
669
+ "themeTokens": [
670
+ "bgColor",
671
+ "textColor",
672
+ "accentColor",
673
+ "borderColor",
674
+ "fontFamily",
675
+ "radius",
676
+ "spacing",
677
+ "cardBg",
678
+ "cardRadius",
679
+ "cardBorder",
680
+ "inputBg",
681
+ "inputText",
682
+ "mutedText",
683
+ "gridColor"
684
+ ],
685
+ "aiHints": {
686
+ "pageTypes": [
687
+ "landing",
688
+ "marketing",
689
+ "event",
690
+ "agency",
691
+ "fitness",
692
+ "education",
693
+ "nonprofit"
694
+ ],
695
+ "placement": "header",
696
+ "priority": 8,
697
+ "sequenceOrder": 2,
698
+ "pairsWellWith": [
699
+ "marketing.FeatureHighlights",
700
+ "marketing.TestimonialsCarousel",
701
+ "marketing.ComparisonTable",
702
+ "marketing.TrustBadges"
703
+ ],
704
+ "maxPerPage": 1,
705
+ "isContainer": false
706
+ }
707
+ },
708
+ {
709
+ "id": "marketing.PromoPopup",
710
+ "name": "PromoPopup",
711
+ "description": "Promotional popup overlay with title, message, optional image, and CTA button. Supports open/dismiss controls.",
712
+ "whenToUse": "Use for flash sales, special promotions, newsletter signups, or exit-intent offers. Best used sparingly to avoid disrupting user experience.",
713
+ "isShell": false,
714
+ "props": [
715
+ {
716
+ "name": "title",
717
+ "type": "string",
718
+ "required": true,
719
+ "default": null,
720
+ "description": "Popup heading text"
721
+ },
722
+ {
723
+ "name": "message",
724
+ "type": "string",
725
+ "required": false,
726
+ "default": null,
727
+ "description": "Promotional message body"
728
+ },
729
+ {
730
+ "name": "ctaLabel",
731
+ "type": "string",
732
+ "required": false,
733
+ "default": "\"Claim Offer\"",
734
+ "description": "Label for the CTA button"
735
+ },
736
+ {
737
+ "name": "onCta",
738
+ "type": "() => void",
739
+ "required": false,
740
+ "default": null,
741
+ "description": "Callback when the CTA button is clicked"
742
+ },
743
+ {
744
+ "name": "onDismiss",
745
+ "type": "() => void",
746
+ "required": false,
747
+ "default": null,
748
+ "description": "Callback when the popup is dismissed"
749
+ },
750
+ {
751
+ "name": "isOpen",
752
+ "type": "boolean",
753
+ "required": false,
754
+ "default": "true",
755
+ "description": "Whether the popup is visible"
756
+ },
757
+ {
758
+ "name": "image",
759
+ "type": "string",
760
+ "required": false,
761
+ "default": null,
762
+ "description": "URL of an optional promotional image"
763
+ },
764
+ {
765
+ "name": "bgColor",
766
+ "type": "string",
767
+ "required": false,
768
+ "default": "theme",
769
+ "description": "Background color override"
770
+ },
771
+ {
772
+ "name": "textColor",
773
+ "type": "string",
774
+ "required": false,
775
+ "default": "theme",
776
+ "description": "Text color override"
777
+ },
778
+ {
779
+ "name": "accentColor",
780
+ "type": "string",
781
+ "required": false,
782
+ "default": "theme",
783
+ "description": "Accent color override"
784
+ },
785
+ {
786
+ "name": "borderColor",
787
+ "type": "string",
788
+ "required": false,
789
+ "default": "theme",
790
+ "description": "Border color override"
791
+ },
792
+ {
793
+ "name": "fontFamily",
794
+ "type": "string",
795
+ "required": false,
796
+ "default": "theme",
797
+ "description": "Font family override"
798
+ },
799
+ {
800
+ "name": "cardBg",
801
+ "type": "string",
802
+ "required": false,
803
+ "default": "theme",
804
+ "description": "Card background color for popup panel"
805
+ },
806
+ {
807
+ "name": "cardRadius",
808
+ "type": "number",
809
+ "required": false,
810
+ "default": null,
811
+ "description": "Border radius for popup panel"
812
+ },
813
+ {
814
+ "name": "cardBorder",
815
+ "type": "string",
816
+ "required": false,
817
+ "default": "theme",
818
+ "description": "Border color for popup panel"
819
+ },
820
+ {
821
+ "name": "mutedText",
822
+ "type": "string",
823
+ "required": false,
824
+ "default": "theme",
825
+ "description": "Muted text color for message body"
826
+ }
827
+ ],
828
+ "themeTokens": [
829
+ "bgColor",
830
+ "textColor",
831
+ "accentColor",
832
+ "borderColor",
833
+ "fontFamily",
834
+ "radius",
835
+ "spacing",
836
+ "cardBg",
837
+ "cardRadius",
838
+ "cardBorder",
839
+ "inputBg",
840
+ "inputText",
841
+ "mutedText",
842
+ "gridColor"
843
+ ],
844
+ "aiHints": {
845
+ "pageTypes": ["marketing", "ecommerce"],
846
+ "placement": "overlay",
847
+ "priority": 6,
848
+ "sequenceOrder": 10,
849
+ "pairsWellWith": ["marketing.CountdownTimer", "marketing.LeadMagnetGate"],
850
+ "maxPerPage": 1,
851
+ "isContainer": false
852
+ }
853
+ },
854
+ {
855
+ "id": "marketing.TestimonialsCarousel",
856
+ "name": "TestimonialsCarousel",
857
+ "description": "Auto-playing carousel of customer testimonials with quote, author, role, avatar, and optional star rating.",
858
+ "whenToUse": "Use to build social proof by showcasing customer quotes and reviews. Essential for landing pages, SaaS marketing, and ecommerce product pages.",
859
+ "isShell": false,
860
+ "props": [
861
+ {
862
+ "name": "testimonials",
863
+ "type": "Testimonial[]",
864
+ "required": true,
865
+ "default": null,
866
+ "description": "Array of testimonials: {id, quote, author, role?, avatar?, rating?}"
867
+ },
868
+ {
869
+ "name": "autoPlay",
870
+ "type": "boolean",
871
+ "required": false,
872
+ "default": "true",
873
+ "description": "Whether the carousel auto-advances"
874
+ },
875
+ {
876
+ "name": "interval",
877
+ "type": "number",
878
+ "required": false,
879
+ "default": "5000",
880
+ "description": "Auto-play interval in milliseconds"
881
+ },
882
+ {
883
+ "name": "bgColor",
884
+ "type": "string",
885
+ "required": false,
886
+ "default": "theme",
887
+ "description": "Background color override"
888
+ },
889
+ {
890
+ "name": "textColor",
891
+ "type": "string",
892
+ "required": false,
893
+ "default": "theme",
894
+ "description": "Text color override"
895
+ },
896
+ {
897
+ "name": "accentColor",
898
+ "type": "string",
899
+ "required": false,
900
+ "default": "theme",
901
+ "description": "Accent color override"
902
+ },
903
+ {
904
+ "name": "borderColor",
905
+ "type": "string",
906
+ "required": false,
907
+ "default": "theme",
908
+ "description": "Border color override"
909
+ },
910
+ {
911
+ "name": "fontFamily",
912
+ "type": "string",
913
+ "required": false,
914
+ "default": "theme",
915
+ "description": "Font family override"
916
+ },
917
+ {
918
+ "name": "cardBg",
919
+ "type": "string",
920
+ "required": false,
921
+ "default": "theme",
922
+ "description": "Card background color for testimonial cards"
923
+ },
924
+ {
925
+ "name": "cardRadius",
926
+ "type": "number",
927
+ "required": false,
928
+ "default": null,
929
+ "description": "Border radius for testimonial cards"
930
+ },
931
+ {
932
+ "name": "cardBorder",
933
+ "type": "string",
934
+ "required": false,
935
+ "default": "theme",
936
+ "description": "Border color for testimonial cards"
937
+ },
938
+ {
939
+ "name": "mutedText",
940
+ "type": "string",
941
+ "required": false,
942
+ "default": "theme",
943
+ "description": "Muted text color for author role"
944
+ }
945
+ ],
946
+ "themeTokens": [
947
+ "bgColor",
948
+ "textColor",
949
+ "accentColor",
950
+ "borderColor",
951
+ "fontFamily",
952
+ "radius",
953
+ "spacing",
954
+ "cardBg",
955
+ "cardRadius",
956
+ "cardBorder",
957
+ "inputBg",
958
+ "inputText",
959
+ "mutedText",
960
+ "gridColor"
961
+ ],
962
+ "aiHints": {
963
+ "pageTypes": [
964
+ "landing",
965
+ "marketing",
966
+ "saas",
967
+ "ecommerce",
968
+ "agency",
969
+ "education",
970
+ "fitness",
971
+ "restaurant",
972
+ "health",
973
+ "community",
974
+ "realestate",
975
+ "nonprofit"
976
+ ],
977
+ "placement": "body",
978
+ "priority": 8,
979
+ "sequenceOrder": 6,
980
+ "pairsWellWith": [
981
+ "marketing.TrustBadges",
982
+ "marketing.FeatureHighlights",
983
+ "marketing.ComparisonTable",
984
+ "marketing.TrustBadges"
985
+ ],
986
+ "maxPerPage": 1,
987
+ "isContainer": false
988
+ }
989
+ },
990
+ {
991
+ "id": "marketing.TrustBadges",
992
+ "name": "TrustBadges",
993
+ "description": "Horizontal row of trust indicators, partner logos, or certification badges with optional icon and image support.",
994
+ "whenToUse": "Use to reinforce credibility by displaying partner logos, security certifications, awards, or 'as seen on' badges. Works well near CTAs, checkout sections, and testimonials.",
995
+ "isShell": false,
996
+ "props": [
997
+ {
998
+ "name": "badges",
999
+ "type": "TrustBadge[]",
1000
+ "required": true,
1001
+ "default": null,
1002
+ "description": "Array of badges: {id, label, icon?, image?}"
1003
+ },
1004
+ {
1005
+ "name": "title",
1006
+ "type": "string",
1007
+ "required": false,
1008
+ "default": null,
1009
+ "description": "Optional heading displayed above the badge row"
1010
+ },
1011
+ {
1012
+ "name": "bgColor",
1013
+ "type": "string",
1014
+ "required": false,
1015
+ "default": "theme",
1016
+ "description": "Background color override"
1017
+ },
1018
+ {
1019
+ "name": "textColor",
1020
+ "type": "string",
1021
+ "required": false,
1022
+ "default": "theme",
1023
+ "description": "Text color override"
1024
+ },
1025
+ {
1026
+ "name": "accentColor",
1027
+ "type": "string",
1028
+ "required": false,
1029
+ "default": "theme",
1030
+ "description": "Accent color override"
1031
+ },
1032
+ {
1033
+ "name": "borderColor",
1034
+ "type": "string",
1035
+ "required": false,
1036
+ "default": "theme",
1037
+ "description": "Border color override"
1038
+ },
1039
+ {
1040
+ "name": "fontFamily",
1041
+ "type": "string",
1042
+ "required": false,
1043
+ "default": "theme",
1044
+ "description": "Font family override"
1045
+ },
1046
+ {
1047
+ "name": "mutedText",
1048
+ "type": "string",
1049
+ "required": false,
1050
+ "default": "theme",
1051
+ "description": "Muted text color for badge labels"
1052
+ }
1053
+ ],
1054
+ "themeTokens": [
1055
+ "bgColor",
1056
+ "textColor",
1057
+ "accentColor",
1058
+ "borderColor",
1059
+ "fontFamily",
1060
+ "radius",
1061
+ "spacing",
1062
+ "cardBg",
1063
+ "cardRadius",
1064
+ "cardBorder",
1065
+ "inputBg",
1066
+ "inputText",
1067
+ "mutedText",
1068
+ "gridColor"
1069
+ ],
1070
+ "aiHints": {
1071
+ "pageTypes": [
1072
+ "landing",
1073
+ "marketing",
1074
+ "ecommerce",
1075
+ "agency",
1076
+ "education",
1077
+ "fitness",
1078
+ "nonprofit",
1079
+ "health"
1080
+ ],
1081
+ "placement": "body",
1082
+ "priority": 7,
1083
+ "sequenceOrder": 7,
1084
+ "pairsWellWith": [
1085
+ "marketing.TestimonialsCarousel",
1086
+ "marketing.ComparisonTable",
1087
+ "marketing.MarketingHeroBlock",
1088
+ "marketing.TestimonialsCarousel"
1089
+ ],
1090
+ "maxPerPage": 2,
1091
+ "isContainer": false
1092
+ }
1093
+ },
1094
+ {
1095
+ "id": "marketing.StatsCounter",
1096
+ "name": "StatsCounter",
1097
+ "description": "Grid of stat items displaying key metrics with large numbers, labels, optional suffixes, and icons. Perfect for showcasing impact numbers and KPIs.",
1098
+ "whenToUse": "Use on landing pages, nonprofit impact sections, SaaS social proof, company about pages, or any section that highlights impressive numbers (clients, downloads, revenue, etc.).",
1099
+ "isShell": false,
1100
+ "props": [
1101
+ {
1102
+ "name": "stats",
1103
+ "type": "StatItem[]",
1104
+ "required": true,
1105
+ "default": null,
1106
+ "description": "Array of stat items: {id, value: string, label, suffix?, icon?}"
1107
+ },
1108
+ {
1109
+ "name": "title",
1110
+ "type": "string",
1111
+ "required": false,
1112
+ "default": null,
1113
+ "description": "Section heading above the stats"
1114
+ },
1115
+ {
1116
+ "name": "columns",
1117
+ "type": "number",
1118
+ "required": false,
1119
+ "default": "4",
1120
+ "description": "Number of grid columns"
1121
+ }
1122
+ ],
1123
+ "themeTokens": [
1124
+ "bgColor",
1125
+ "textColor",
1126
+ "accentColor",
1127
+ "borderColor",
1128
+ "fontFamily",
1129
+ "radius",
1130
+ "spacing",
1131
+ "cardBg",
1132
+ "cardBorder",
1133
+ "cardRadius"
1134
+ ],
1135
+ "aiHints": {
1136
+ "pageTypes": [
1137
+ "landing",
1138
+ "marketing",
1139
+ "saas",
1140
+ "nonprofit",
1141
+ "agency",
1142
+ "education",
1143
+ "fitness",
1144
+ "health",
1145
+ "event",
1146
+ "community",
1147
+ "about"
1148
+ ],
1149
+ "placement": "body",
1150
+ "priority": 7,
1151
+ "sequenceOrder": 5,
1152
+ "pairsWellWith": [
1153
+ "content.HeadingSection",
1154
+ "marketing.TrustBadges",
1155
+ "marketing.TestimonialsCarousel"
1156
+ ],
1157
+ "maxPerPage": 1,
1158
+ "isContainer": false
1159
+ }
1160
+ },
1161
+ {
1162
+ "id": "marketing.HowItWorks",
1163
+ "name": "HowItWorks",
1164
+ "description": "Visual step-by-step process section with numbered steps, icons, and connector arrows. Supports horizontal and vertical layouts.",
1165
+ "whenToUse": "Use on landing pages, SaaS explainers, service pages, delivery flows, and onboarding sections to visually explain a multi-step process to users.",
1166
+ "isShell": false,
1167
+ "props": [
1168
+ {
1169
+ "name": "steps",
1170
+ "type": "HowItWorksStep[]",
1171
+ "required": true,
1172
+ "default": null,
1173
+ "description": "Array of steps: {id, title, description?, icon?}"
1174
+ },
1175
+ {
1176
+ "name": "title",
1177
+ "type": "string",
1178
+ "required": false,
1179
+ "default": null,
1180
+ "description": "Section heading"
1181
+ },
1182
+ {
1183
+ "name": "subtitle",
1184
+ "type": "string",
1185
+ "required": false,
1186
+ "default": null,
1187
+ "description": "Section subheading"
1188
+ },
1189
+ {
1190
+ "name": "layout",
1191
+ "type": "\"horizontal\" | \"vertical\"",
1192
+ "required": false,
1193
+ "default": "\"horizontal\"",
1194
+ "description": "Layout direction of the steps"
1195
+ }
1196
+ ],
1197
+ "themeTokens": [
1198
+ "bgColor",
1199
+ "textColor",
1200
+ "accentColor",
1201
+ "borderColor",
1202
+ "fontFamily",
1203
+ "radius",
1204
+ "spacing",
1205
+ "cardBg",
1206
+ "cardBorder",
1207
+ "cardRadius"
1208
+ ],
1209
+ "aiHints": {
1210
+ "pageTypes": [
1211
+ "landing",
1212
+ "marketing",
1213
+ "saas",
1214
+ "agency",
1215
+ "fitness",
1216
+ "education",
1217
+ "restaurant",
1218
+ "health",
1219
+ "ecommerce",
1220
+ "nonprofit"
1221
+ ],
1222
+ "placement": "body",
1223
+ "priority": 7,
1224
+ "sequenceOrder": 5,
1225
+ "pairsWellWith": [
1226
+ "content.HeadingSection",
1227
+ "marketing.StatsCounter",
1228
+ "marketing.FeatureHighlights"
1229
+ ],
1230
+ "maxPerPage": 1,
1231
+ "isContainer": false
1232
+ }
1233
+ }
1234
+ ]
1235
+ }