@orion-studios/payload-studio 0.5.0-beta.11 → 0.5.0-beta.111

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 (77) hide show
  1. package/README.md +54 -0
  2. package/dist/admin/client.d.mts +3 -0
  3. package/dist/admin/client.d.ts +3 -0
  4. package/dist/admin/client.js +1745 -200
  5. package/dist/admin/client.mjs +1756 -214
  6. package/dist/admin/index.d.mts +2 -1
  7. package/dist/admin/index.d.ts +2 -1
  8. package/dist/admin/index.js +424 -11
  9. package/dist/admin/index.mjs +19 -1
  10. package/dist/admin-app/client.d.mts +7 -0
  11. package/dist/admin-app/client.d.ts +7 -0
  12. package/dist/admin-app/client.js +1270 -3
  13. package/dist/admin-app/client.mjs +1172 -2
  14. package/dist/admin-app/index.d.mts +1 -1
  15. package/dist/admin-app/index.d.ts +1 -1
  16. package/dist/admin-app/index.js +167 -0
  17. package/dist/admin-app/index.mjs +13 -1
  18. package/dist/admin-app/styles.css +247 -0
  19. package/dist/admin.css +8 -0
  20. package/dist/blocks/index.js +1011 -191
  21. package/dist/blocks/index.mjs +2 -2
  22. package/dist/chunk-ADIIWIYL.mjs +322 -0
  23. package/dist/{chunk-ZLLNO5FM.mjs → chunk-BET2YLAS.mjs} +104 -15
  24. package/dist/chunk-DAIZDGHL.mjs +614 -0
  25. package/dist/chunk-GKMBYYXF.mjs +776 -0
  26. package/dist/chunk-JQAHXYAM.mjs +1829 -0
  27. package/dist/chunk-OQSEJXC4.mjs +166 -0
  28. package/dist/chunk-PF3EBZXF.mjs +326 -0
  29. package/dist/chunk-ROTPP5CU.mjs +99 -0
  30. package/dist/chunk-XVH5SCBD.mjs +234 -0
  31. package/dist/chunk-ZTXJG4K5.mjs +85 -0
  32. package/dist/index-7lxTrxSG.d.mts +128 -0
  33. package/dist/index-7lxTrxSG.d.ts +128 -0
  34. package/dist/index-B7QvY3yF.d.mts +245 -0
  35. package/dist/index-BK03FiEM.d.ts +245 -0
  36. package/dist/{index-CmR6NInu.d.ts → index-BzKOThsI.d.mts} +30 -3
  37. package/dist/{index-CmR6NInu.d.mts → index-BzKOThsI.d.ts} +30 -3
  38. package/dist/{index-DbH0Ljwp.d.mts → index-D8BNfUJb.d.mts} +17 -2
  39. package/dist/{index-DbH0Ljwp.d.ts → index-DD_E2UfJ.d.ts} +17 -2
  40. package/dist/index-DUi_XND6.d.ts +193 -0
  41. package/dist/index-gLl_358v.d.mts +193 -0
  42. package/dist/index.d.mts +6 -5
  43. package/dist/index.d.ts +6 -5
  44. package/dist/index.js +2876 -460
  45. package/dist/index.mjs +12 -10
  46. package/dist/nextjs/index.d.mts +2 -1
  47. package/dist/nextjs/index.d.ts +2 -1
  48. package/dist/nextjs/index.js +497 -16
  49. package/dist/nextjs/index.mjs +8 -3
  50. package/dist/socialMedia-C05Iy-SV.d.mts +21 -0
  51. package/dist/socialMedia-C05Iy-SV.d.ts +21 -0
  52. package/dist/studio/index.d.mts +2 -1
  53. package/dist/studio/index.d.ts +2 -1
  54. package/dist/studio/index.js +171 -5
  55. package/dist/studio/index.mjs +7 -3
  56. package/dist/studio-pages/builder.css +517 -32
  57. package/dist/studio-pages/client.d.mts +75 -1
  58. package/dist/studio-pages/client.d.ts +75 -1
  59. package/dist/studio-pages/client.js +5662 -2759
  60. package/dist/studio-pages/client.mjs +5578 -2767
  61. package/dist/studio-pages/index.d.mts +4 -2
  62. package/dist/studio-pages/index.d.ts +4 -2
  63. package/dist/studio-pages/index.js +859 -71
  64. package/dist/studio-pages/index.mjs +10 -4
  65. package/package.json +35 -13
  66. package/dist/chunk-AAOHJDNS.mjs +0 -67
  67. package/dist/chunk-ETRRXURT.mjs +0 -141
  68. package/dist/chunk-J7W5EE3B.mjs +0 -278
  69. package/dist/chunk-N67KVM2S.mjs +0 -156
  70. package/dist/chunk-NESLJZFE.mjs +0 -303
  71. package/dist/chunk-U5BSPWAD.mjs +0 -1034
  72. package/dist/index-B9N5MyjF.d.mts +0 -39
  73. package/dist/index-BallJs-K.d.mts +0 -43
  74. package/dist/index-BallJs-K.d.ts +0 -43
  75. package/dist/index-DJFhANvJ.d.mts +0 -128
  76. package/dist/index-DJFhANvJ.d.ts +0 -128
  77. package/dist/index-g8tBHLKD.d.ts +0 -39
@@ -0,0 +1,1829 @@
1
+ import {
2
+ sectionStyleFields
3
+ } from "./chunk-OQSEJXC4.mjs";
4
+ import {
5
+ __export
6
+ } from "./chunk-6BWS3CLP.mjs";
7
+
8
+ // src/blocks/index.ts
9
+ var blocks_exports = {};
10
+ __export(blocks_exports, {
11
+ BeforeAfterBlock: () => BeforeAfterBlock,
12
+ BookingEmbedBlock: () => BookingEmbedBlock,
13
+ BuilderBlockLabel: () => BuilderBlockLabel,
14
+ CtaBlock: () => CtaBlock,
15
+ FaqBlock: () => FaqBlock,
16
+ FeatureGridBlock: () => FeatureGridBlock,
17
+ FormEmbedBlock: () => FormEmbedBlock,
18
+ HeroBlock: () => HeroBlock,
19
+ LogoWallBlock: () => LogoWallBlock,
20
+ MediaBlock: () => MediaBlock,
21
+ RichTextBlock: () => RichTextBlock,
22
+ StatsBlock: () => StatsBlock,
23
+ TestimonialsBlock: () => TestimonialsBlock,
24
+ builderBlockLabelComponent: () => builderBlockLabelComponent,
25
+ clonePresetBlocks: () => clonePresetBlocks,
26
+ defaultPageLayoutBlocks: () => defaultPageLayoutBlocks,
27
+ sectionPresets: () => sectionPresets,
28
+ templateStarterPresets: () => templateStarterPresets
29
+ });
30
+
31
+ // src/blocks/blocks/adminComponents.ts
32
+ var builderBlockLabelComponent = {
33
+ exportName: "BuilderBlockLabel",
34
+ path: "@orion-studios/payload-studio/blocks"
35
+ };
36
+
37
+ // src/blocks/blocks/BeforeAfter.ts
38
+ var BeforeAfterBlock = {
39
+ slug: "beforeAfter",
40
+ imageURL: "/images/project-before-2.svg",
41
+ imageAltText: "Before and after section preview",
42
+ admin: {
43
+ components: {
44
+ Label: builderBlockLabelComponent
45
+ }
46
+ },
47
+ labels: {
48
+ singular: "Before / After",
49
+ plural: "Before / After"
50
+ },
51
+ fields: [
52
+ {
53
+ name: "title",
54
+ type: "text",
55
+ required: true
56
+ },
57
+ {
58
+ name: "subtitle",
59
+ type: "textarea"
60
+ },
61
+ {
62
+ name: "itemsPerRow",
63
+ type: "number",
64
+ defaultValue: 2,
65
+ min: 1,
66
+ max: 4,
67
+ admin: {
68
+ description: "How many project cards to show per row on desktop.",
69
+ step: 1
70
+ }
71
+ },
72
+ {
73
+ name: "items",
74
+ type: "array",
75
+ minRows: 1,
76
+ maxRows: 30,
77
+ fields: [
78
+ {
79
+ name: "label",
80
+ type: "text",
81
+ required: true
82
+ },
83
+ {
84
+ name: "beforeMedia",
85
+ type: "upload",
86
+ relationTo: "media",
87
+ required: false
88
+ },
89
+ {
90
+ name: "beforeImageURL",
91
+ type: "text",
92
+ admin: {
93
+ description: "Optional direct URL for the before image when using an external asset."
94
+ }
95
+ },
96
+ {
97
+ name: "afterMedia",
98
+ type: "upload",
99
+ relationTo: "media",
100
+ required: false
101
+ },
102
+ {
103
+ name: "afterImageURL",
104
+ type: "text",
105
+ admin: {
106
+ description: "Optional direct URL for the after image when using an external asset."
107
+ }
108
+ },
109
+ {
110
+ name: "imageHeight",
111
+ type: "number",
112
+ defaultValue: 160,
113
+ min: 60,
114
+ max: 600,
115
+ admin: {
116
+ description: "Overrides the before/after image height (in pixels).",
117
+ step: 10
118
+ }
119
+ },
120
+ {
121
+ name: "imageFit",
122
+ type: "select",
123
+ defaultValue: "cover",
124
+ options: [
125
+ { label: "Cover", value: "cover" },
126
+ { label: "Contain", value: "contain" }
127
+ ]
128
+ },
129
+ {
130
+ name: "imageCornerStyle",
131
+ type: "select",
132
+ defaultValue: "rounded",
133
+ options: [
134
+ { label: "Rounded", value: "rounded" },
135
+ { label: "Square", value: "square" }
136
+ ]
137
+ },
138
+ {
139
+ name: "imagePosition",
140
+ type: "select",
141
+ defaultValue: "center",
142
+ options: [
143
+ { label: "Center", value: "center" },
144
+ { label: "Top", value: "top" },
145
+ { label: "Bottom", value: "bottom" },
146
+ { label: "Left", value: "left" },
147
+ { label: "Right", value: "right" }
148
+ ]
149
+ },
150
+ {
151
+ name: "imagePositionX",
152
+ type: "number",
153
+ min: 0,
154
+ max: 100,
155
+ admin: {
156
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
157
+ step: 1
158
+ }
159
+ },
160
+ {
161
+ name: "imagePositionY",
162
+ type: "number",
163
+ min: 0,
164
+ max: 100,
165
+ admin: {
166
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
167
+ step: 1
168
+ }
169
+ },
170
+ {
171
+ name: "description",
172
+ type: "textarea"
173
+ },
174
+ {
175
+ name: "settings",
176
+ type: "json",
177
+ admin: {
178
+ hidden: true
179
+ }
180
+ }
181
+ ]
182
+ },
183
+ {
184
+ name: "settings",
185
+ type: "json",
186
+ admin: {
187
+ description: "Internal builder settings schema v2.",
188
+ hidden: true
189
+ }
190
+ },
191
+ ...sectionStyleFields()
192
+ ]
193
+ };
194
+
195
+ // src/blocks/blocks/BookingEmbed.ts
196
+ var BookingEmbedBlock = {
197
+ slug: "bookingEmbed",
198
+ imageURL: "/images/service-removal.svg",
199
+ imageAltText: "Booking embed section preview",
200
+ admin: {
201
+ components: {
202
+ Label: builderBlockLabelComponent
203
+ }
204
+ },
205
+ labels: {
206
+ singular: "Booking Embed",
207
+ plural: "Booking Embeds"
208
+ },
209
+ fields: [
210
+ {
211
+ name: "title",
212
+ type: "text"
213
+ },
214
+ {
215
+ name: "description",
216
+ type: "textarea"
217
+ },
218
+ {
219
+ name: "buttonLabel",
220
+ type: "text",
221
+ defaultValue: "Book Consultation"
222
+ },
223
+ {
224
+ name: "buttonHref",
225
+ type: "text",
226
+ defaultValue: "/contact"
227
+ },
228
+ {
229
+ name: "settings",
230
+ type: "json",
231
+ admin: {
232
+ description: "Internal builder settings schema v2.",
233
+ hidden: true
234
+ }
235
+ },
236
+ ...sectionStyleFields()
237
+ ]
238
+ };
239
+
240
+ // src/blocks/blocks/Cta.ts
241
+ var CtaBlock = {
242
+ slug: "cta",
243
+ imageURL: "/images/logo-mark.svg",
244
+ imageAltText: "Call to action section preview",
245
+ admin: {
246
+ components: {
247
+ Label: builderBlockLabelComponent
248
+ }
249
+ },
250
+ labels: {
251
+ singular: "CTA",
252
+ plural: "CTAs"
253
+ },
254
+ fields: [
255
+ {
256
+ name: "headline",
257
+ type: "text",
258
+ required: true
259
+ },
260
+ {
261
+ name: "description",
262
+ type: "textarea"
263
+ },
264
+ {
265
+ name: "eyebrow",
266
+ type: "text"
267
+ },
268
+ {
269
+ name: "buttonLabel",
270
+ type: "text"
271
+ },
272
+ {
273
+ name: "buttonHref",
274
+ type: "text",
275
+ admin: {
276
+ description: "Use internal links like /contact."
277
+ }
278
+ },
279
+ {
280
+ name: "style",
281
+ type: "select",
282
+ defaultValue: "light",
283
+ options: [
284
+ {
285
+ label: "Light",
286
+ value: "light"
287
+ },
288
+ {
289
+ label: "Dark",
290
+ value: "dark"
291
+ }
292
+ ]
293
+ },
294
+ {
295
+ name: "backgroundColor",
296
+ type: "text",
297
+ admin: {
298
+ description: "Optional background color override for the CTA strip (example: #334b63)."
299
+ }
300
+ },
301
+ {
302
+ name: "media",
303
+ type: "upload",
304
+ relationTo: "media",
305
+ required: false
306
+ },
307
+ {
308
+ name: "imageURL",
309
+ type: "text",
310
+ admin: {
311
+ description: "Optional direct image URL when this CTA should use an external image."
312
+ }
313
+ },
314
+ {
315
+ name: "bullets",
316
+ type: "array",
317
+ fields: [
318
+ {
319
+ name: "label",
320
+ type: "text",
321
+ required: true
322
+ }
323
+ ]
324
+ },
325
+ {
326
+ name: "settings",
327
+ type: "json",
328
+ admin: {
329
+ description: "Internal builder settings schema v2.",
330
+ hidden: true
331
+ }
332
+ },
333
+ ...sectionStyleFields()
334
+ ]
335
+ };
336
+
337
+ // src/blocks/blocks/Faq.ts
338
+ var FaqBlock = {
339
+ slug: "faq",
340
+ imageURL: "/images/project-before-2.svg",
341
+ imageAltText: "FAQ section preview",
342
+ admin: {
343
+ components: {
344
+ Label: builderBlockLabelComponent
345
+ }
346
+ },
347
+ labels: {
348
+ singular: "FAQ",
349
+ plural: "FAQs"
350
+ },
351
+ fields: [
352
+ {
353
+ name: "eyebrow",
354
+ type: "text"
355
+ },
356
+ {
357
+ name: "title",
358
+ type: "text",
359
+ required: true
360
+ },
361
+ {
362
+ name: "items",
363
+ type: "array",
364
+ minRows: 1,
365
+ maxRows: 12,
366
+ fields: [
367
+ {
368
+ name: "question",
369
+ type: "text",
370
+ required: true
371
+ },
372
+ {
373
+ name: "answer",
374
+ type: "textarea",
375
+ required: true
376
+ },
377
+ {
378
+ name: "settings",
379
+ type: "json",
380
+ admin: {
381
+ hidden: true
382
+ }
383
+ }
384
+ ]
385
+ },
386
+ {
387
+ name: "settings",
388
+ type: "json",
389
+ admin: {
390
+ description: "Internal builder settings schema v2.",
391
+ hidden: true
392
+ }
393
+ },
394
+ ...sectionStyleFields()
395
+ ]
396
+ };
397
+
398
+ // src/blocks/blocks/FeatureGrid.ts
399
+ var FeatureGridBlock = {
400
+ slug: "featureGrid",
401
+ imageURL: "/images/service-trimming.svg",
402
+ imageAltText: "Feature grid section preview",
403
+ admin: {
404
+ components: {
405
+ Label: builderBlockLabelComponent
406
+ }
407
+ },
408
+ labels: {
409
+ singular: "Feature Grid",
410
+ plural: "Feature Grids"
411
+ },
412
+ fields: [
413
+ {
414
+ name: "eyebrow",
415
+ type: "text"
416
+ },
417
+ {
418
+ name: "title",
419
+ type: "text"
420
+ },
421
+ {
422
+ name: "subtitle",
423
+ type: "textarea"
424
+ },
425
+ {
426
+ name: "itemsPerRow",
427
+ type: "number",
428
+ defaultValue: 3,
429
+ min: 1,
430
+ max: 6,
431
+ admin: {
432
+ description: "How many items to show per row on desktop.",
433
+ step: 1
434
+ }
435
+ },
436
+ {
437
+ name: "items",
438
+ type: "array",
439
+ minRows: 1,
440
+ maxRows: 6,
441
+ fields: [
442
+ {
443
+ name: "title",
444
+ type: "text",
445
+ required: true
446
+ },
447
+ {
448
+ name: "description",
449
+ type: "textarea"
450
+ },
451
+ {
452
+ name: "tone",
453
+ type: "select",
454
+ defaultValue: "warm",
455
+ options: [
456
+ { label: "Warm", value: "warm" },
457
+ { label: "Cool", value: "cool" },
458
+ { label: "Neutral", value: "neutral" }
459
+ ]
460
+ },
461
+ {
462
+ name: "iconType",
463
+ type: "select",
464
+ defaultValue: "badge",
465
+ options: [
466
+ { label: "Badge Text", value: "badge" },
467
+ { label: "Icon", value: "lucide" }
468
+ ],
469
+ admin: {
470
+ description: "Choose whether this item uses a short badge label or an icon."
471
+ }
472
+ },
473
+ {
474
+ name: "icon",
475
+ type: "text",
476
+ admin: {
477
+ description: 'Optional short icon label (e.g. "01", "Leaf", "Star").',
478
+ condition: (_, siblingData) => siblingData?.iconType !== "lucide"
479
+ }
480
+ },
481
+ {
482
+ name: "iconLucide",
483
+ type: "select",
484
+ options: [
485
+ { label: "Shield Check", value: "ShieldCheck" },
486
+ { label: "Clock", value: "Clock" },
487
+ { label: "Leaf", value: "Leaf" },
488
+ { label: "Dollar Sign", value: "DollarSign" },
489
+ { label: "Hard Hat", value: "HardHat" },
490
+ { label: "Sparkles", value: "Sparkles" },
491
+ { label: "Tree Pine", value: "TreePine" },
492
+ { label: "Badge Check", value: "BadgeCheck" },
493
+ { label: "Calendar Clock", value: "CalendarClock" }
494
+ ],
495
+ admin: {
496
+ description: "Select an icon for this item.",
497
+ condition: (_, siblingData) => siblingData?.iconType === "lucide"
498
+ }
499
+ },
500
+ {
501
+ name: "media",
502
+ type: "upload",
503
+ relationTo: "media",
504
+ required: false
505
+ },
506
+ {
507
+ name: "imageURL",
508
+ type: "text",
509
+ admin: {
510
+ description: "Optional direct image URL when this item should use an external image."
511
+ }
512
+ },
513
+ {
514
+ name: "embedURL",
515
+ type: "text",
516
+ admin: {
517
+ description: "Optional iframe/embed URL for items like maps or other embedded content."
518
+ }
519
+ },
520
+ {
521
+ name: "buttonLabel",
522
+ type: "text"
523
+ },
524
+ {
525
+ name: "buttonHref",
526
+ type: "text"
527
+ },
528
+ {
529
+ name: "bullets",
530
+ type: "array",
531
+ fields: [
532
+ {
533
+ name: "label",
534
+ type: "text",
535
+ required: true
536
+ }
537
+ ]
538
+ },
539
+ {
540
+ name: "imageHeight",
541
+ type: "number",
542
+ defaultValue: 160,
543
+ min: 40,
544
+ max: 600,
545
+ admin: {
546
+ description: "Overrides the image height in the builder/section (in pixels).",
547
+ step: 10
548
+ }
549
+ },
550
+ {
551
+ name: "imageFit",
552
+ type: "select",
553
+ defaultValue: "cover",
554
+ options: [
555
+ { label: "Cover", value: "cover" },
556
+ { label: "Contain", value: "contain" }
557
+ ]
558
+ },
559
+ {
560
+ name: "imageCornerStyle",
561
+ type: "select",
562
+ defaultValue: "rounded",
563
+ options: [
564
+ { label: "Rounded", value: "rounded" },
565
+ { label: "Square", value: "square" }
566
+ ]
567
+ },
568
+ {
569
+ name: "imagePosition",
570
+ type: "select",
571
+ defaultValue: "center",
572
+ options: [
573
+ { label: "Center", value: "center" },
574
+ { label: "Top", value: "top" },
575
+ { label: "Bottom", value: "bottom" },
576
+ { label: "Left", value: "left" },
577
+ { label: "Right", value: "right" }
578
+ ]
579
+ },
580
+ {
581
+ name: "imagePositionX",
582
+ type: "number",
583
+ min: 0,
584
+ max: 100,
585
+ admin: {
586
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
587
+ step: 1
588
+ }
589
+ },
590
+ {
591
+ name: "imagePositionY",
592
+ type: "number",
593
+ min: 0,
594
+ max: 100,
595
+ admin: {
596
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
597
+ step: 1
598
+ }
599
+ },
600
+ {
601
+ name: "settings",
602
+ type: "json",
603
+ admin: {
604
+ hidden: true
605
+ }
606
+ }
607
+ ]
608
+ },
609
+ {
610
+ name: "variant",
611
+ type: "select",
612
+ defaultValue: "cards",
613
+ options: [
614
+ {
615
+ label: "Cards",
616
+ value: "cards"
617
+ },
618
+ {
619
+ label: "Highlight",
620
+ value: "highlight"
621
+ },
622
+ {
623
+ label: "Split List",
624
+ value: "splitList"
625
+ },
626
+ {
627
+ label: "Panels",
628
+ value: "panels"
629
+ },
630
+ {
631
+ label: "Catalog",
632
+ value: "catalog"
633
+ },
634
+ {
635
+ label: "Contact Split",
636
+ value: "contact"
637
+ }
638
+ ]
639
+ },
640
+ {
641
+ name: "backgroundColor",
642
+ type: "text",
643
+ admin: {
644
+ description: "Optional background color override when using the Highlight variant (example: #334b63)."
645
+ }
646
+ },
647
+ {
648
+ name: "settings",
649
+ type: "json",
650
+ admin: {
651
+ description: "Internal builder settings schema v2.",
652
+ hidden: true
653
+ }
654
+ },
655
+ ...sectionStyleFields()
656
+ ]
657
+ };
658
+
659
+ // src/blocks/blocks/FormEmbed.ts
660
+ var FormEmbedBlock = {
661
+ slug: "formEmbed",
662
+ imageURL: "/images/map-placeholder.svg",
663
+ imageAltText: "Form embed section preview",
664
+ admin: {
665
+ components: {
666
+ Label: builderBlockLabelComponent
667
+ }
668
+ },
669
+ labels: {
670
+ singular: "Form Embed",
671
+ plural: "Form Embeds"
672
+ },
673
+ fields: [
674
+ {
675
+ name: "eyebrow",
676
+ type: "text"
677
+ },
678
+ {
679
+ name: "title",
680
+ type: "text"
681
+ },
682
+ {
683
+ name: "description",
684
+ type: "textarea"
685
+ },
686
+ {
687
+ name: "submitLabel",
688
+ type: "text"
689
+ },
690
+ {
691
+ name: "formType",
692
+ type: "select",
693
+ defaultValue: "quote",
694
+ options: [
695
+ {
696
+ label: "Quote Form",
697
+ value: "quote"
698
+ }
699
+ ]
700
+ },
701
+ {
702
+ name: "settings",
703
+ type: "json",
704
+ admin: {
705
+ description: "Internal builder settings schema v2.",
706
+ hidden: true
707
+ }
708
+ },
709
+ ...sectionStyleFields()
710
+ ]
711
+ };
712
+
713
+ // src/blocks/blocks/Hero.ts
714
+ var HeroBlock = {
715
+ slug: "hero",
716
+ imageURL: "/images/hero-tree.svg",
717
+ imageAltText: "Hero section preview",
718
+ admin: {
719
+ components: {
720
+ Label: builderBlockLabelComponent
721
+ }
722
+ },
723
+ labels: {
724
+ singular: "Hero",
725
+ plural: "Hero Sections"
726
+ },
727
+ fields: [
728
+ {
729
+ name: "kicker",
730
+ type: "text",
731
+ admin: {
732
+ description: "Optional short label above the headline."
733
+ }
734
+ },
735
+ {
736
+ name: "headline",
737
+ type: "text",
738
+ required: true
739
+ },
740
+ {
741
+ name: "subheadline",
742
+ type: "textarea"
743
+ },
744
+ {
745
+ name: "primaryLabel",
746
+ type: "text"
747
+ },
748
+ {
749
+ name: "primaryHref",
750
+ type: "text",
751
+ admin: {
752
+ description: "Use internal links like /contact."
753
+ }
754
+ },
755
+ {
756
+ name: "secondaryLabel",
757
+ type: "text"
758
+ },
759
+ {
760
+ name: "secondaryHref",
761
+ type: "text",
762
+ admin: {
763
+ description: "Use internal links like /services."
764
+ }
765
+ },
766
+ {
767
+ name: "media",
768
+ type: "upload",
769
+ relationTo: "media"
770
+ },
771
+ {
772
+ name: "backgroundImageURL",
773
+ type: "text",
774
+ admin: {
775
+ description: "Optional direct image URL when the hero should use an external image source."
776
+ }
777
+ },
778
+ {
779
+ name: "backgroundImageFit",
780
+ type: "select",
781
+ defaultValue: "cover",
782
+ options: [
783
+ { label: "Cover", value: "cover" },
784
+ { label: "Cover (Square)", value: "cover-square" },
785
+ { label: "Contain", value: "contain" },
786
+ { label: "Contain (Square)", value: "contain-square" }
787
+ ],
788
+ admin: {
789
+ description: "How the hero image should be sized within the section."
790
+ }
791
+ },
792
+ {
793
+ name: "backgroundImageCornerStyle",
794
+ type: "select",
795
+ defaultValue: "rounded",
796
+ options: [
797
+ { label: "Rounded", value: "rounded" },
798
+ { label: "Square", value: "square" }
799
+ ],
800
+ admin: {
801
+ description: "How the hero image corners should appear."
802
+ }
803
+ },
804
+ {
805
+ name: "backgroundImagePosition",
806
+ type: "select",
807
+ defaultValue: "center",
808
+ options: [
809
+ { label: "Center", value: "center" },
810
+ { label: "Top", value: "top" },
811
+ { label: "Bottom", value: "bottom" },
812
+ { label: "Left", value: "left" },
813
+ { label: "Right", value: "right" }
814
+ ],
815
+ admin: {
816
+ description: "Where the hero image should anchor inside the section."
817
+ }
818
+ },
819
+ {
820
+ name: "backgroundColor",
821
+ type: "text",
822
+ admin: {
823
+ description: "Optional background color override (example: #334b63)."
824
+ }
825
+ },
826
+ {
827
+ name: "backgroundOverlayMode",
828
+ type: "select",
829
+ defaultValue: "none",
830
+ options: [
831
+ { label: "None", value: "none" },
832
+ { label: "Solid", value: "solid" },
833
+ { label: "Gradient", value: "gradient" }
834
+ ],
835
+ admin: {
836
+ description: "Optional overlay on top of the hero image (applies when an image is present)."
837
+ }
838
+ },
839
+ {
840
+ name: "backgroundOverlayOpacity",
841
+ type: "number",
842
+ defaultValue: 45,
843
+ min: 0,
844
+ max: 100,
845
+ admin: {
846
+ description: "Overlay opacity (0-100).",
847
+ step: 1
848
+ }
849
+ },
850
+ {
851
+ name: "backgroundOverlayColor",
852
+ type: "text",
853
+ admin: {
854
+ description: "Overlay solid color (example: #000000). Used when Overlay Mode is Solid."
855
+ }
856
+ },
857
+ {
858
+ name: "backgroundOverlayGradientFrom",
859
+ type: "text",
860
+ admin: {
861
+ description: "Gradient overlay start color (example: #334b63). Used when Overlay Mode is Gradient."
862
+ }
863
+ },
864
+ {
865
+ name: "backgroundOverlayGradientTo",
866
+ type: "text",
867
+ admin: {
868
+ description: "Gradient overlay end color (example: #496582). Used when Overlay Mode is Gradient."
869
+ }
870
+ },
871
+ {
872
+ name: "backgroundOverlayGradientAngle",
873
+ type: "text",
874
+ admin: {
875
+ description: "Gradient overlay angle in degrees (0-360). Used when Overlay Mode is Gradient."
876
+ }
877
+ },
878
+ {
879
+ name: "backgroundOverlayGradientFromStrength",
880
+ type: "number",
881
+ defaultValue: 100,
882
+ min: 0,
883
+ max: 100,
884
+ admin: {
885
+ description: "Gradient start strength (0-100). Set to 0 for transparent.",
886
+ step: 1
887
+ }
888
+ },
889
+ {
890
+ name: "backgroundOverlayGradientToStrength",
891
+ type: "number",
892
+ defaultValue: 100,
893
+ min: 0,
894
+ max: 100,
895
+ admin: {
896
+ description: "Gradient end strength (0-100). Set to 0 for transparent.",
897
+ step: 1
898
+ }
899
+ },
900
+ {
901
+ name: "backgroundOverlayGradientStart",
902
+ type: "number",
903
+ defaultValue: 0,
904
+ min: 0,
905
+ max: 100,
906
+ admin: {
907
+ description: "Where the gradient starts (0-100).",
908
+ step: 1
909
+ }
910
+ },
911
+ {
912
+ name: "backgroundOverlayGradientEnd",
913
+ type: "number",
914
+ defaultValue: 100,
915
+ min: 0,
916
+ max: 100,
917
+ admin: {
918
+ description: "Where the gradient ends (0-100).",
919
+ step: 1
920
+ }
921
+ },
922
+ {
923
+ name: "backgroundOverlayGradientFeather",
924
+ type: "number",
925
+ defaultValue: 100,
926
+ min: 0,
927
+ max: 100,
928
+ admin: {
929
+ description: "How soft the transition is (0 = hard edge, 100 = smooth).",
930
+ step: 1
931
+ }
932
+ },
933
+ {
934
+ name: "variant",
935
+ type: "select",
936
+ defaultValue: "default",
937
+ options: [
938
+ {
939
+ label: "Default",
940
+ value: "default"
941
+ },
942
+ {
943
+ label: "Centered",
944
+ value: "centered"
945
+ }
946
+ ]
947
+ },
948
+ {
949
+ name: "heroHeight",
950
+ type: "select",
951
+ defaultValue: "sm",
952
+ options: [
953
+ {
954
+ label: "Small",
955
+ value: "sm"
956
+ },
957
+ {
958
+ label: "Medium (Half Screen)",
959
+ value: "md"
960
+ },
961
+ {
962
+ label: "Full Screen",
963
+ value: "full"
964
+ }
965
+ ],
966
+ admin: {
967
+ description: "Controls the vertical height of the hero section."
968
+ }
969
+ },
970
+ {
971
+ name: "settings",
972
+ type: "json",
973
+ admin: {
974
+ description: "Internal builder settings schema v2.",
975
+ hidden: true
976
+ }
977
+ },
978
+ ...sectionStyleFields()
979
+ ]
980
+ };
981
+
982
+ // src/blocks/blocks/LogoWall.ts
983
+ var LogoWallBlock = {
984
+ slug: "logoWall",
985
+ imageURL: "/images/logo-mark.svg",
986
+ imageAltText: "Logo wall section preview",
987
+ admin: {
988
+ components: {
989
+ Label: builderBlockLabelComponent
990
+ }
991
+ },
992
+ labels: {
993
+ singular: "Logo Wall",
994
+ plural: "Logo Walls"
995
+ },
996
+ fields: [
997
+ {
998
+ name: "title",
999
+ type: "text",
1000
+ required: true
1001
+ },
1002
+ {
1003
+ name: "subtitle",
1004
+ type: "textarea"
1005
+ },
1006
+ {
1007
+ name: "items",
1008
+ type: "array",
1009
+ minRows: 1,
1010
+ maxRows: 12,
1011
+ fields: [
1012
+ {
1013
+ name: "name",
1014
+ type: "text",
1015
+ required: true
1016
+ },
1017
+ {
1018
+ name: "media",
1019
+ type: "upload",
1020
+ relationTo: "media",
1021
+ required: false
1022
+ },
1023
+ {
1024
+ name: "imageURL",
1025
+ type: "text",
1026
+ admin: {
1027
+ description: "Optional direct image URL for this logo when using an external asset."
1028
+ }
1029
+ },
1030
+ {
1031
+ name: "imageHeight",
1032
+ type: "number",
1033
+ defaultValue: 64,
1034
+ min: 24,
1035
+ max: 200,
1036
+ admin: {
1037
+ description: "Overrides the logo image height (in pixels).",
1038
+ step: 4
1039
+ }
1040
+ },
1041
+ {
1042
+ name: "imageFit",
1043
+ type: "select",
1044
+ defaultValue: "contain",
1045
+ options: [
1046
+ { label: "Cover", value: "cover" },
1047
+ { label: "Contain", value: "contain" }
1048
+ ]
1049
+ },
1050
+ {
1051
+ name: "imageCornerStyle",
1052
+ type: "select",
1053
+ defaultValue: "rounded",
1054
+ options: [
1055
+ { label: "Rounded", value: "rounded" },
1056
+ { label: "Square", value: "square" }
1057
+ ]
1058
+ },
1059
+ {
1060
+ name: "imagePosition",
1061
+ type: "select",
1062
+ defaultValue: "center",
1063
+ options: [
1064
+ { label: "Center", value: "center" },
1065
+ { label: "Top", value: "top" },
1066
+ { label: "Bottom", value: "bottom" },
1067
+ { label: "Left", value: "left" },
1068
+ { label: "Right", value: "right" }
1069
+ ]
1070
+ },
1071
+ {
1072
+ name: "imagePositionX",
1073
+ type: "number",
1074
+ min: 0,
1075
+ max: 100,
1076
+ admin: {
1077
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
1078
+ step: 1
1079
+ }
1080
+ },
1081
+ {
1082
+ name: "imagePositionY",
1083
+ type: "number",
1084
+ min: 0,
1085
+ max: 100,
1086
+ admin: {
1087
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
1088
+ step: 1
1089
+ }
1090
+ },
1091
+ {
1092
+ name: "href",
1093
+ type: "text"
1094
+ },
1095
+ {
1096
+ name: "settings",
1097
+ type: "json",
1098
+ admin: {
1099
+ hidden: true
1100
+ }
1101
+ }
1102
+ ]
1103
+ },
1104
+ {
1105
+ name: "settings",
1106
+ type: "json",
1107
+ admin: {
1108
+ description: "Internal builder settings schema v2.",
1109
+ hidden: true
1110
+ }
1111
+ },
1112
+ ...sectionStyleFields()
1113
+ ]
1114
+ };
1115
+
1116
+ // src/blocks/blocks/Media.ts
1117
+ var MediaBlock = {
1118
+ slug: "media",
1119
+ imageURL: "/images/project-after-1.svg",
1120
+ imageAltText: "Media section preview",
1121
+ admin: {
1122
+ components: {
1123
+ Label: builderBlockLabelComponent
1124
+ }
1125
+ },
1126
+ labels: {
1127
+ singular: "Media",
1128
+ plural: "Media Sections"
1129
+ },
1130
+ fields: [
1131
+ {
1132
+ name: "image",
1133
+ type: "upload",
1134
+ relationTo: "media",
1135
+ required: false
1136
+ },
1137
+ {
1138
+ name: "imageURL",
1139
+ type: "text",
1140
+ admin: {
1141
+ description: "Optional direct image URL when this section should use an external image."
1142
+ }
1143
+ },
1144
+ {
1145
+ name: "caption",
1146
+ type: "text"
1147
+ },
1148
+ {
1149
+ name: "size",
1150
+ type: "select",
1151
+ defaultValue: "default",
1152
+ options: [
1153
+ {
1154
+ label: "Default",
1155
+ value: "default"
1156
+ },
1157
+ {
1158
+ label: "Wide",
1159
+ value: "wide"
1160
+ }
1161
+ ]
1162
+ },
1163
+ {
1164
+ name: "imageFit",
1165
+ type: "select",
1166
+ defaultValue: "cover",
1167
+ options: [
1168
+ { label: "Cover", value: "cover" },
1169
+ { label: "Contain", value: "contain" }
1170
+ ]
1171
+ },
1172
+ {
1173
+ name: "imageCornerStyle",
1174
+ type: "select",
1175
+ defaultValue: "rounded",
1176
+ options: [
1177
+ { label: "Rounded", value: "rounded" },
1178
+ { label: "Square", value: "square" }
1179
+ ]
1180
+ },
1181
+ {
1182
+ name: "imagePosition",
1183
+ type: "select",
1184
+ defaultValue: "center",
1185
+ options: [
1186
+ { label: "Center", value: "center" },
1187
+ { label: "Top", value: "top" },
1188
+ { label: "Bottom", value: "bottom" },
1189
+ { label: "Left", value: "left" },
1190
+ { label: "Right", value: "right" }
1191
+ ]
1192
+ },
1193
+ {
1194
+ name: "settings",
1195
+ type: "json",
1196
+ admin: {
1197
+ description: "Internal builder settings schema v2.",
1198
+ hidden: true
1199
+ }
1200
+ },
1201
+ ...sectionStyleFields()
1202
+ ]
1203
+ };
1204
+
1205
+ // src/blocks/blocks/RichText.ts
1206
+ var RichTextBlock = {
1207
+ slug: "richText",
1208
+ imageURL: "/window.svg",
1209
+ imageAltText: "Rich text section preview",
1210
+ admin: {
1211
+ components: {
1212
+ Label: builderBlockLabelComponent
1213
+ }
1214
+ },
1215
+ labels: {
1216
+ singular: "Rich Text",
1217
+ plural: "Rich Text Sections"
1218
+ },
1219
+ fields: [
1220
+ {
1221
+ name: "variant",
1222
+ type: "select",
1223
+ defaultValue: "default",
1224
+ options: [
1225
+ {
1226
+ label: "Default",
1227
+ value: "default"
1228
+ },
1229
+ {
1230
+ label: "Quote Banner",
1231
+ value: "quoteBanner"
1232
+ }
1233
+ ]
1234
+ },
1235
+ {
1236
+ name: "title",
1237
+ type: "text"
1238
+ },
1239
+ {
1240
+ name: "content",
1241
+ type: "richText",
1242
+ required: true
1243
+ },
1244
+ {
1245
+ name: "statsItems",
1246
+ type: "array",
1247
+ fields: [
1248
+ {
1249
+ name: "value",
1250
+ type: "text",
1251
+ required: true
1252
+ },
1253
+ {
1254
+ name: "label",
1255
+ type: "text",
1256
+ required: true
1257
+ }
1258
+ ]
1259
+ },
1260
+ {
1261
+ name: "cards",
1262
+ type: "array",
1263
+ fields: [
1264
+ {
1265
+ name: "eyebrow",
1266
+ type: "text"
1267
+ },
1268
+ {
1269
+ name: "title",
1270
+ type: "text",
1271
+ required: true
1272
+ },
1273
+ {
1274
+ name: "description",
1275
+ type: "textarea"
1276
+ },
1277
+ {
1278
+ name: "media",
1279
+ type: "upload",
1280
+ relationTo: "media",
1281
+ required: false
1282
+ },
1283
+ {
1284
+ name: "imageURL",
1285
+ type: "text",
1286
+ admin: {
1287
+ description: "Optional direct image URL when this card should use an external image."
1288
+ }
1289
+ }
1290
+ ]
1291
+ },
1292
+ {
1293
+ name: "width",
1294
+ type: "select",
1295
+ defaultValue: "normal",
1296
+ options: [
1297
+ {
1298
+ label: "Normal",
1299
+ value: "normal"
1300
+ },
1301
+ {
1302
+ label: "Narrow",
1303
+ value: "narrow"
1304
+ }
1305
+ ]
1306
+ },
1307
+ {
1308
+ name: "settings",
1309
+ type: "json",
1310
+ admin: {
1311
+ description: "Internal builder settings schema v2.",
1312
+ hidden: true
1313
+ }
1314
+ },
1315
+ ...sectionStyleFields()
1316
+ ]
1317
+ };
1318
+
1319
+ // src/blocks/blocks/Stats.ts
1320
+ var StatsBlock = {
1321
+ slug: "stats",
1322
+ imageURL: "/images/service-removal.svg",
1323
+ imageAltText: "Stats section preview",
1324
+ admin: {
1325
+ components: {
1326
+ Label: builderBlockLabelComponent
1327
+ }
1328
+ },
1329
+ labels: {
1330
+ singular: "Stats",
1331
+ plural: "Stats"
1332
+ },
1333
+ fields: [
1334
+ {
1335
+ name: "title",
1336
+ type: "text",
1337
+ required: true
1338
+ },
1339
+ {
1340
+ name: "subtitle",
1341
+ type: "textarea"
1342
+ },
1343
+ {
1344
+ name: "items",
1345
+ type: "array",
1346
+ minRows: 1,
1347
+ maxRows: 6,
1348
+ fields: [
1349
+ {
1350
+ name: "value",
1351
+ type: "text",
1352
+ required: true
1353
+ },
1354
+ {
1355
+ name: "label",
1356
+ type: "text",
1357
+ required: true
1358
+ },
1359
+ {
1360
+ name: "description",
1361
+ type: "text"
1362
+ },
1363
+ {
1364
+ name: "settings",
1365
+ type: "json",
1366
+ admin: {
1367
+ hidden: true
1368
+ }
1369
+ }
1370
+ ]
1371
+ },
1372
+ {
1373
+ name: "settings",
1374
+ type: "json",
1375
+ admin: {
1376
+ description: "Internal builder settings schema v2.",
1377
+ hidden: true
1378
+ }
1379
+ },
1380
+ ...sectionStyleFields()
1381
+ ]
1382
+ };
1383
+
1384
+ // src/blocks/blocks/Testimonials.ts
1385
+ var TestimonialsBlock = {
1386
+ slug: "testimonials",
1387
+ imageURL: "/images/project-after-2.svg",
1388
+ imageAltText: "Testimonials section preview",
1389
+ admin: {
1390
+ components: {
1391
+ Label: builderBlockLabelComponent
1392
+ }
1393
+ },
1394
+ labels: {
1395
+ singular: "Testimonials",
1396
+ plural: "Testimonials"
1397
+ },
1398
+ fields: [
1399
+ {
1400
+ name: "title",
1401
+ type: "text",
1402
+ required: true
1403
+ },
1404
+ {
1405
+ name: "visibleCount",
1406
+ type: "number",
1407
+ defaultValue: 3,
1408
+ min: 1,
1409
+ max: 6,
1410
+ admin: {
1411
+ description: "How many testimonials to show at once.",
1412
+ step: 1
1413
+ }
1414
+ },
1415
+ {
1416
+ name: "autoRotate",
1417
+ type: "checkbox",
1418
+ defaultValue: true,
1419
+ admin: {
1420
+ description: "Automatically rotates through all testimonials."
1421
+ }
1422
+ },
1423
+ {
1424
+ name: "rotateIntervalSeconds",
1425
+ type: "number",
1426
+ defaultValue: 7,
1427
+ min: 2,
1428
+ max: 30,
1429
+ admin: {
1430
+ description: "How often to rotate (in seconds).",
1431
+ step: 1
1432
+ }
1433
+ },
1434
+ {
1435
+ name: "items",
1436
+ type: "array",
1437
+ minRows: 1,
1438
+ maxRows: 30,
1439
+ fields: [
1440
+ {
1441
+ name: "quote",
1442
+ type: "textarea",
1443
+ required: true
1444
+ },
1445
+ {
1446
+ name: "name",
1447
+ type: "text",
1448
+ required: true
1449
+ },
1450
+ {
1451
+ name: "location",
1452
+ type: "text"
1453
+ },
1454
+ {
1455
+ name: "rating",
1456
+ type: "number",
1457
+ defaultValue: 5,
1458
+ min: 1,
1459
+ max: 5,
1460
+ admin: {
1461
+ description: "Star rating (1-5).",
1462
+ step: 1
1463
+ }
1464
+ },
1465
+ {
1466
+ name: "settings",
1467
+ type: "json",
1468
+ admin: {
1469
+ hidden: true
1470
+ }
1471
+ }
1472
+ ]
1473
+ },
1474
+ {
1475
+ name: "settings",
1476
+ type: "json",
1477
+ admin: {
1478
+ description: "Internal builder settings schema v2.",
1479
+ hidden: true
1480
+ }
1481
+ },
1482
+ ...sectionStyleFields()
1483
+ ]
1484
+ };
1485
+
1486
+ // src/blocks/components/BuilderBlockLabel.tsx
1487
+ import { jsx, jsxs } from "react/jsx-runtime";
1488
+ var blockTitles = {
1489
+ bookingEmbed: "Booking Embed",
1490
+ cta: "Call to Action",
1491
+ faq: "FAQ",
1492
+ featureGrid: "Feature Grid",
1493
+ formEmbed: "Form Embed",
1494
+ hero: "Hero",
1495
+ media: "Media",
1496
+ richText: "Rich Text",
1497
+ testimonials: "Testimonials"
1498
+ };
1499
+ var blockEmojis = {
1500
+ bookingEmbed: "Calendar",
1501
+ cta: "Action",
1502
+ faq: "FAQ",
1503
+ featureGrid: "Grid",
1504
+ formEmbed: "Form",
1505
+ hero: "Hero",
1506
+ media: "Media",
1507
+ richText: "Text",
1508
+ testimonials: "Reviews"
1509
+ };
1510
+ function BuilderBlockLabel({ blockType, rowLabel, rowNumber }) {
1511
+ const fallbackTitle = blockTitles[blockType] || blockType;
1512
+ const title = rowLabel && rowLabel.trim().length > 0 ? rowLabel : fallbackTitle;
1513
+ const tag = blockEmojis[blockType] || "Section";
1514
+ return /* @__PURE__ */ jsxs("div", { style: { alignItems: "center", display: "flex", gap: 8 }, children: [
1515
+ /* @__PURE__ */ jsx(
1516
+ "span",
1517
+ {
1518
+ style: {
1519
+ background: "var(--theme-elevation-100)",
1520
+ border: "1px solid var(--theme-elevation-200)",
1521
+ borderRadius: 999,
1522
+ color: "var(--theme-text-muted)",
1523
+ fontSize: 11,
1524
+ fontWeight: 700,
1525
+ padding: "2px 8px"
1526
+ },
1527
+ children: tag
1528
+ }
1529
+ ),
1530
+ /* @__PURE__ */ jsxs("span", { style: { fontWeight: 700 }, children: [
1531
+ typeof rowNumber === "number" ? `${rowNumber + 1}. ` : "",
1532
+ title
1533
+ ] })
1534
+ ] });
1535
+ }
1536
+
1537
+ // src/blocks/presets/index.ts
1538
+ var sectionPresets = [
1539
+ {
1540
+ id: "hero-conversion",
1541
+ title: "Hero + Conversion CTA",
1542
+ description: "Lead section with headline and primary conversion strip.",
1543
+ blocks: [
1544
+ {
1545
+ blockType: "hero",
1546
+ kicker: "Trusted Team",
1547
+ headline: "A clear headline for your primary offer",
1548
+ subheadline: "Explain what you offer, who it is for, and why it matters in one strong supporting sentence.",
1549
+ primaryLabel: "Get Started",
1550
+ primaryHref: "/contact",
1551
+ secondaryLabel: "Learn More",
1552
+ secondaryHref: "/about"
1553
+ },
1554
+ {
1555
+ blockType: "cta",
1556
+ headline: "Ready for the next step?",
1557
+ description: "Use a short call to action with a direct path to contact or purchase.",
1558
+ buttonLabel: "Contact Us",
1559
+ buttonHref: "/contact",
1560
+ style: "light"
1561
+ }
1562
+ ]
1563
+ },
1564
+ {
1565
+ id: "services-grid",
1566
+ title: "Services Grid",
1567
+ description: "Three-card services section for fast offer communication.",
1568
+ blocks: [
1569
+ {
1570
+ blockType: "featureGrid",
1571
+ title: "Our Services",
1572
+ variant: "cards",
1573
+ items: [
1574
+ {
1575
+ title: "Service One",
1576
+ description: "Briefly describe this offer or outcome.",
1577
+ icon: "01"
1578
+ },
1579
+ {
1580
+ title: "Service Two",
1581
+ description: "Briefly describe this offer or outcome.",
1582
+ icon: "02"
1583
+ },
1584
+ {
1585
+ title: "Service Three",
1586
+ description: "Briefly describe this offer or outcome.",
1587
+ icon: "03"
1588
+ }
1589
+ ]
1590
+ }
1591
+ ]
1592
+ },
1593
+ {
1594
+ id: "social-proof",
1595
+ title: "Testimonials + FAQ",
1596
+ description: "Trust-building section with reviews and common questions.",
1597
+ blocks: [
1598
+ {
1599
+ blockType: "testimonials",
1600
+ title: "What Homeowners Say",
1601
+ items: [
1602
+ {
1603
+ quote: "The experience was smooth, thoughtful, and exactly what we hoped for.",
1604
+ name: "Customer Name",
1605
+ location: "City, ST",
1606
+ rating: 5
1607
+ },
1608
+ {
1609
+ quote: "Fast communication, strong service, and a result we would happily recommend.",
1610
+ name: "Customer Name",
1611
+ location: "City, ST",
1612
+ rating: 5
1613
+ }
1614
+ ]
1615
+ },
1616
+ {
1617
+ blockType: "faq",
1618
+ title: "Common Questions",
1619
+ items: [
1620
+ {
1621
+ question: "How quickly do you respond?",
1622
+ answer: "Replace this with a concise answer to a common customer question."
1623
+ },
1624
+ {
1625
+ question: "What is included?",
1626
+ answer: "Replace this with another concise answer that reduces buying friction."
1627
+ }
1628
+ ]
1629
+ }
1630
+ ]
1631
+ },
1632
+ {
1633
+ id: "lead-capture",
1634
+ title: "Lead Capture",
1635
+ description: "Quote form and consultation CTA for conversion pages.",
1636
+ blocks: [
1637
+ {
1638
+ blockType: "formEmbed",
1639
+ title: "Request a Quote",
1640
+ description: "Share a few details and your team can follow up with next steps.",
1641
+ formType: "quote"
1642
+ },
1643
+ {
1644
+ blockType: "bookingEmbed",
1645
+ title: "Prefer to book a consultation?",
1646
+ description: "Offer an alternative scheduling path for visitors who prefer to book directly.",
1647
+ buttonLabel: "Book Consultation",
1648
+ buttonHref: "/contact"
1649
+ }
1650
+ ]
1651
+ }
1652
+ ];
1653
+ var templateStarterPresets = {
1654
+ contact: [
1655
+ {
1656
+ blockType: "hero",
1657
+ headline: "Contact Us",
1658
+ subheadline: "Tell visitors exactly how to reach you and what to expect next.",
1659
+ primaryLabel: "Email Us",
1660
+ primaryHref: "mailto:hello@example.com"
1661
+ },
1662
+ {
1663
+ blockType: "formEmbed",
1664
+ title: "Request a Quote",
1665
+ description: "Use this space for a form embed or lead capture flow.",
1666
+ formType: "quote"
1667
+ },
1668
+ {
1669
+ blockType: "faq",
1670
+ title: "Common Questions",
1671
+ items: [
1672
+ {
1673
+ question: "How quickly will you respond?",
1674
+ answer: "Replace with the answer that best fits your operating process."
1675
+ }
1676
+ ]
1677
+ }
1678
+ ],
1679
+ landing: [
1680
+ {
1681
+ blockType: "hero",
1682
+ kicker: "Locally Owned",
1683
+ headline: "Lead with your strongest offer",
1684
+ subheadline: "Support the headline with a concise sentence that clarifies benefits and audience.",
1685
+ primaryLabel: "Get Started",
1686
+ primaryHref: "/contact",
1687
+ secondaryLabel: "View Services",
1688
+ secondaryHref: "/services"
1689
+ },
1690
+ {
1691
+ blockType: "featureGrid",
1692
+ title: "Why clients choose us",
1693
+ variant: "highlight",
1694
+ items: [
1695
+ { title: "Clear Value", description: "Explain your first differentiator.", icon: "01" },
1696
+ { title: "Reliable Process", description: "Explain your second differentiator.", icon: "02" },
1697
+ { title: "Strong Results", description: "Explain your third differentiator.", icon: "03" }
1698
+ ]
1699
+ },
1700
+ {
1701
+ blockType: "cta",
1702
+ headline: "Ready to take the next step?",
1703
+ description: "Add a direct conversion prompt with a clear primary action.",
1704
+ buttonLabel: "Contact Us",
1705
+ buttonHref: "/contact",
1706
+ style: "light"
1707
+ }
1708
+ ],
1709
+ services: [
1710
+ {
1711
+ blockType: "hero",
1712
+ headline: "Services Built Around Your Process",
1713
+ subheadline: "Summarize the core offerings with a short clarity-first introduction.",
1714
+ primaryLabel: "Request Info",
1715
+ primaryHref: "/contact"
1716
+ },
1717
+ {
1718
+ blockType: "featureGrid",
1719
+ title: "Core Services",
1720
+ variant: "cards",
1721
+ items: [
1722
+ {
1723
+ title: "Service One",
1724
+ description: "Replace with a short description.",
1725
+ icon: "01"
1726
+ },
1727
+ {
1728
+ title: "Service Two",
1729
+ description: "Replace with a short description.",
1730
+ icon: "02"
1731
+ },
1732
+ {
1733
+ title: "Service Three",
1734
+ description: "Replace with a short description.",
1735
+ icon: "03"
1736
+ }
1737
+ ]
1738
+ },
1739
+ {
1740
+ blockType: "faq",
1741
+ title: "Frequently Asked Questions",
1742
+ items: [
1743
+ {
1744
+ question: "Do you offer custom scopes?",
1745
+ answer: "Replace this with an answer that fits your business."
1746
+ }
1747
+ ]
1748
+ }
1749
+ ],
1750
+ standard: [
1751
+ {
1752
+ blockType: "hero",
1753
+ headline: "Page Headline",
1754
+ subheadline: "Use this page to communicate your primary message clearly."
1755
+ },
1756
+ {
1757
+ blockType: "richText",
1758
+ title: "Section Heading",
1759
+ width: "normal",
1760
+ content: {
1761
+ root: {
1762
+ children: [
1763
+ {
1764
+ children: [{ detail: 0, format: 0, mode: "normal", style: "", text: "", type: "text", version: 1 }],
1765
+ direction: "ltr",
1766
+ format: "",
1767
+ indent: 0,
1768
+ type: "paragraph",
1769
+ version: 1
1770
+ }
1771
+ ],
1772
+ direction: "ltr",
1773
+ format: "",
1774
+ indent: 0,
1775
+ type: "root",
1776
+ version: 1
1777
+ }
1778
+ }
1779
+ },
1780
+ {
1781
+ blockType: "cta",
1782
+ headline: "Ready to take the next step?",
1783
+ buttonLabel: "Contact Us",
1784
+ buttonHref: "/contact",
1785
+ style: "light"
1786
+ }
1787
+ ]
1788
+ };
1789
+ function clonePresetBlocks(blocks) {
1790
+ return JSON.parse(JSON.stringify(blocks));
1791
+ }
1792
+
1793
+ // src/blocks/index.ts
1794
+ var defaultPageLayoutBlocks = [
1795
+ HeroBlock,
1796
+ RichTextBlock,
1797
+ FeatureGridBlock,
1798
+ StatsBlock,
1799
+ LogoWallBlock,
1800
+ BeforeAfterBlock,
1801
+ MediaBlock,
1802
+ TestimonialsBlock,
1803
+ FaqBlock,
1804
+ FormEmbedBlock,
1805
+ BookingEmbedBlock,
1806
+ CtaBlock
1807
+ ];
1808
+
1809
+ export {
1810
+ builderBlockLabelComponent,
1811
+ BeforeAfterBlock,
1812
+ BookingEmbedBlock,
1813
+ CtaBlock,
1814
+ FaqBlock,
1815
+ FeatureGridBlock,
1816
+ FormEmbedBlock,
1817
+ HeroBlock,
1818
+ LogoWallBlock,
1819
+ MediaBlock,
1820
+ RichTextBlock,
1821
+ StatsBlock,
1822
+ TestimonialsBlock,
1823
+ BuilderBlockLabel,
1824
+ sectionPresets,
1825
+ templateStarterPresets,
1826
+ clonePresetBlocks,
1827
+ defaultPageLayoutBlocks,
1828
+ blocks_exports
1829
+ };