@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
@@ -54,135 +54,160 @@ var sectionStyleDefaults = {
54
54
  contentGradientAngle: "135",
55
55
  contentGradientFrom: "#ffffff",
56
56
  contentGradientPreset: "none",
57
- contentGradientTo: "#f4f6f2",
57
+ contentGradientTo: "#f4f6f8",
58
58
  contentWidth: "inherit",
59
+ sectionPaddingX: "inherit",
59
60
  sectionBackgroundColor: "#ffffff",
60
61
  sectionBackgroundMode: "none",
61
62
  sectionGradientAngle: "135",
62
- sectionGradientFrom: "#124a37",
63
- sectionGradientPreset: "forest",
64
- sectionGradientTo: "#1f684f",
63
+ sectionGradientFrom: "#334b63",
64
+ sectionGradientPreset: "slate",
65
+ sectionGradientTo: "#496582",
65
66
  sectionPaddingY: "md",
66
67
  sectionWidth: "content"
67
68
  };
68
- var sectionStyleFields = () => [
69
- {
70
- name: "sectionWidth",
71
- type: "select",
72
- defaultValue: sectionStyleDefaults.sectionWidth,
73
- options: [
74
- { label: "Content", value: "content" },
75
- { label: "Wide", value: "wide" },
76
- { label: "Full", value: "full" }
77
- ]
78
- },
79
- {
80
- name: "contentWidth",
81
- type: "select",
82
- defaultValue: sectionStyleDefaults.contentWidth,
83
- options: [
84
- { label: "Inherit", value: "inherit" },
85
- { label: "Narrow", value: "narrow" },
86
- { label: "Content", value: "content" },
87
- { label: "Wide", value: "wide" },
88
- { label: "Full", value: "full" }
89
- ]
90
- },
91
- {
92
- name: "sectionPaddingY",
93
- type: "select",
94
- defaultValue: sectionStyleDefaults.sectionPaddingY,
95
- options: [
96
- { label: "Small", value: "sm" },
97
- { label: "Medium", value: "md" },
98
- { label: "Large", value: "lg" }
99
- ]
100
- },
101
- {
102
- name: "sectionBackgroundMode",
103
- type: "select",
104
- defaultValue: sectionStyleDefaults.sectionBackgroundMode,
105
- options: [
106
- { label: "None", value: "none" },
107
- { label: "Color", value: "color" },
108
- { label: "Gradient", value: "gradient" }
109
- ]
110
- },
111
- {
112
- name: "sectionBackgroundColor",
113
- type: "text",
114
- defaultValue: sectionStyleDefaults.sectionBackgroundColor
115
- },
116
- {
117
- name: "sectionGradientPreset",
118
- type: "select",
119
- defaultValue: sectionStyleDefaults.sectionGradientPreset,
120
- options: [
121
- { label: "None", value: "none" },
122
- { label: "Forest", value: "forest" },
123
- { label: "Moss", value: "moss" },
124
- { label: "Cream", value: "cream" },
125
- { label: "Slate", value: "slate" }
126
- ]
127
- },
128
- {
129
- name: "sectionGradientFrom",
130
- type: "text",
131
- defaultValue: sectionStyleDefaults.sectionGradientFrom
132
- },
133
- {
134
- name: "sectionGradientTo",
135
- type: "text",
136
- defaultValue: sectionStyleDefaults.sectionGradientTo
137
- },
138
- {
139
- name: "sectionGradientAngle",
140
- type: "text",
141
- defaultValue: sectionStyleDefaults.sectionGradientAngle
142
- },
143
- {
144
- name: "contentBackgroundMode",
145
- type: "select",
146
- defaultValue: sectionStyleDefaults.contentBackgroundMode,
147
- options: [
148
- { label: "None", value: "none" },
149
- { label: "Color", value: "color" },
150
- { label: "Gradient", value: "gradient" }
151
- ]
152
- },
153
- {
154
- name: "contentBackgroundColor",
155
- type: "text",
156
- defaultValue: sectionStyleDefaults.contentBackgroundColor
157
- },
158
- {
159
- name: "contentGradientPreset",
160
- type: "select",
161
- defaultValue: sectionStyleDefaults.contentGradientPreset,
162
- options: [
163
- { label: "None", value: "none" },
164
- { label: "Cloud", value: "cloud" },
165
- { label: "Sand", value: "sand" },
166
- { label: "Mint", value: "mint" },
167
- { label: "Night", value: "night" }
168
- ]
169
- },
170
- {
171
- name: "contentGradientFrom",
172
- type: "text",
173
- defaultValue: sectionStyleDefaults.contentGradientFrom
174
- },
175
- {
176
- name: "contentGradientTo",
177
- type: "text",
178
- defaultValue: sectionStyleDefaults.contentGradientTo
179
- },
180
- {
181
- name: "contentGradientAngle",
182
- type: "text",
183
- defaultValue: sectionStyleDefaults.contentGradientAngle
69
+ var hideFromCMS = (field) => ({
70
+ ...field,
71
+ admin: {
72
+ ...field.admin || {},
73
+ hidden: true
184
74
  }
185
- ];
75
+ });
76
+ var sectionStyleFields = () => {
77
+ const fields = [
78
+ {
79
+ name: "sectionWidth",
80
+ type: "select",
81
+ defaultValue: sectionStyleDefaults.sectionWidth,
82
+ options: [
83
+ { label: "Content", value: "content" },
84
+ { label: "Wide", value: "wide" },
85
+ { label: "Full", value: "full" }
86
+ ]
87
+ },
88
+ {
89
+ name: "contentWidth",
90
+ type: "select",
91
+ defaultValue: sectionStyleDefaults.contentWidth,
92
+ options: [
93
+ { label: "Inherit", value: "inherit" },
94
+ { label: "Narrow", value: "narrow" },
95
+ { label: "Content", value: "content" },
96
+ { label: "Wide", value: "wide" },
97
+ { label: "Full", value: "full" }
98
+ ]
99
+ },
100
+ {
101
+ name: "sectionPaddingY",
102
+ type: "select",
103
+ defaultValue: sectionStyleDefaults.sectionPaddingY,
104
+ options: [
105
+ { label: "None", value: "none" },
106
+ { label: "Small", value: "sm" },
107
+ { label: "Medium", value: "md" },
108
+ { label: "Large", value: "lg" }
109
+ ]
110
+ },
111
+ {
112
+ name: "sectionPaddingX",
113
+ type: "select",
114
+ defaultValue: sectionStyleDefaults.sectionPaddingX,
115
+ options: [
116
+ { label: "Inherit", value: "inherit" },
117
+ { label: "None", value: "none" },
118
+ { label: "Small", value: "sm" },
119
+ { label: "Medium", value: "md" },
120
+ { label: "Large", value: "lg" }
121
+ ]
122
+ },
123
+ {
124
+ name: "sectionBackgroundMode",
125
+ type: "select",
126
+ defaultValue: sectionStyleDefaults.sectionBackgroundMode,
127
+ options: [
128
+ { label: "None", value: "none" },
129
+ { label: "Color", value: "color" },
130
+ { label: "Gradient", value: "gradient" }
131
+ ]
132
+ },
133
+ {
134
+ name: "sectionBackgroundColor",
135
+ type: "text",
136
+ defaultValue: sectionStyleDefaults.sectionBackgroundColor
137
+ },
138
+ {
139
+ name: "sectionGradientPreset",
140
+ type: "select",
141
+ defaultValue: sectionStyleDefaults.sectionGradientPreset,
142
+ options: [
143
+ { label: "None", value: "none" },
144
+ { label: "Brand", value: "brand" },
145
+ { label: "Forest", value: "forest" },
146
+ { label: "Moss", value: "moss" },
147
+ { label: "Cream", value: "cream" },
148
+ { label: "Slate", value: "slate" }
149
+ ]
150
+ },
151
+ {
152
+ name: "sectionGradientFrom",
153
+ type: "text",
154
+ defaultValue: sectionStyleDefaults.sectionGradientFrom
155
+ },
156
+ {
157
+ name: "sectionGradientTo",
158
+ type: "text",
159
+ defaultValue: sectionStyleDefaults.sectionGradientTo
160
+ },
161
+ {
162
+ name: "sectionGradientAngle",
163
+ type: "text",
164
+ defaultValue: sectionStyleDefaults.sectionGradientAngle
165
+ },
166
+ {
167
+ name: "contentBackgroundMode",
168
+ type: "select",
169
+ defaultValue: sectionStyleDefaults.contentBackgroundMode,
170
+ options: [
171
+ { label: "None", value: "none" },
172
+ { label: "Color", value: "color" },
173
+ { label: "Gradient", value: "gradient" }
174
+ ]
175
+ },
176
+ {
177
+ name: "contentBackgroundColor",
178
+ type: "text",
179
+ defaultValue: sectionStyleDefaults.contentBackgroundColor
180
+ },
181
+ {
182
+ name: "contentGradientPreset",
183
+ type: "select",
184
+ defaultValue: sectionStyleDefaults.contentGradientPreset,
185
+ options: [
186
+ { label: "None", value: "none" },
187
+ { label: "Cloud", value: "cloud" },
188
+ { label: "Sand", value: "sand" },
189
+ { label: "Mint", value: "mint" },
190
+ { label: "Night", value: "night" }
191
+ ]
192
+ },
193
+ {
194
+ name: "contentGradientFrom",
195
+ type: "text",
196
+ defaultValue: sectionStyleDefaults.contentGradientFrom
197
+ },
198
+ {
199
+ name: "contentGradientTo",
200
+ type: "text",
201
+ defaultValue: sectionStyleDefaults.contentGradientTo
202
+ },
203
+ {
204
+ name: "contentGradientAngle",
205
+ type: "text",
206
+ defaultValue: sectionStyleDefaults.contentGradientAngle
207
+ }
208
+ ];
209
+ return fields.map(hideFromCMS);
210
+ };
186
211
 
187
212
  // src/blocks/blocks/BeforeAfter.ts
188
213
  var BeforeAfterBlock = {
@@ -208,11 +233,22 @@ var BeforeAfterBlock = {
208
233
  name: "subtitle",
209
234
  type: "textarea"
210
235
  },
236
+ {
237
+ name: "itemsPerRow",
238
+ type: "number",
239
+ defaultValue: 2,
240
+ min: 1,
241
+ max: 4,
242
+ admin: {
243
+ description: "How many project cards to show per row on desktop.",
244
+ step: 1
245
+ }
246
+ },
211
247
  {
212
248
  name: "items",
213
249
  type: "array",
214
250
  minRows: 1,
215
- maxRows: 6,
251
+ maxRows: 30,
216
252
  fields: [
217
253
  {
218
254
  name: "label",
@@ -225,18 +261,108 @@ var BeforeAfterBlock = {
225
261
  relationTo: "media",
226
262
  required: false
227
263
  },
264
+ {
265
+ name: "beforeImageURL",
266
+ type: "text",
267
+ admin: {
268
+ description: "Optional direct URL for the before image when using an external asset."
269
+ }
270
+ },
228
271
  {
229
272
  name: "afterMedia",
230
273
  type: "upload",
231
274
  relationTo: "media",
232
275
  required: false
233
276
  },
277
+ {
278
+ name: "afterImageURL",
279
+ type: "text",
280
+ admin: {
281
+ description: "Optional direct URL for the after image when using an external asset."
282
+ }
283
+ },
284
+ {
285
+ name: "imageHeight",
286
+ type: "number",
287
+ defaultValue: 160,
288
+ min: 60,
289
+ max: 600,
290
+ admin: {
291
+ description: "Overrides the before/after image height (in pixels).",
292
+ step: 10
293
+ }
294
+ },
295
+ {
296
+ name: "imageFit",
297
+ type: "select",
298
+ defaultValue: "cover",
299
+ options: [
300
+ { label: "Cover", value: "cover" },
301
+ { label: "Contain", value: "contain" }
302
+ ]
303
+ },
304
+ {
305
+ name: "imageCornerStyle",
306
+ type: "select",
307
+ defaultValue: "rounded",
308
+ options: [
309
+ { label: "Rounded", value: "rounded" },
310
+ { label: "Square", value: "square" }
311
+ ]
312
+ },
313
+ {
314
+ name: "imagePosition",
315
+ type: "select",
316
+ defaultValue: "center",
317
+ options: [
318
+ { label: "Center", value: "center" },
319
+ { label: "Top", value: "top" },
320
+ { label: "Bottom", value: "bottom" },
321
+ { label: "Left", value: "left" },
322
+ { label: "Right", value: "right" }
323
+ ]
324
+ },
325
+ {
326
+ name: "imagePositionX",
327
+ type: "number",
328
+ min: 0,
329
+ max: 100,
330
+ admin: {
331
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
332
+ step: 1
333
+ }
334
+ },
335
+ {
336
+ name: "imagePositionY",
337
+ type: "number",
338
+ min: 0,
339
+ max: 100,
340
+ admin: {
341
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
342
+ step: 1
343
+ }
344
+ },
234
345
  {
235
346
  name: "description",
236
347
  type: "textarea"
348
+ },
349
+ {
350
+ name: "settings",
351
+ type: "json",
352
+ admin: {
353
+ hidden: true
354
+ }
237
355
  }
238
356
  ]
239
357
  },
358
+ {
359
+ name: "settings",
360
+ type: "json",
361
+ admin: {
362
+ description: "Internal builder settings schema v2.",
363
+ hidden: true
364
+ }
365
+ },
240
366
  ...sectionStyleFields()
241
367
  ]
242
368
  };
@@ -274,6 +400,14 @@ var BookingEmbedBlock = {
274
400
  type: "text",
275
401
  defaultValue: "/contact"
276
402
  },
403
+ {
404
+ name: "settings",
405
+ type: "json",
406
+ admin: {
407
+ description: "Internal builder settings schema v2.",
408
+ hidden: true
409
+ }
410
+ },
277
411
  ...sectionStyleFields()
278
412
  ]
279
413
  };
@@ -302,6 +436,10 @@ var CtaBlock = {
302
436
  name: "description",
303
437
  type: "textarea"
304
438
  },
439
+ {
440
+ name: "eyebrow",
441
+ type: "text"
442
+ },
305
443
  {
306
444
  name: "buttonLabel",
307
445
  type: "text"
@@ -332,7 +470,39 @@ var CtaBlock = {
332
470
  name: "backgroundColor",
333
471
  type: "text",
334
472
  admin: {
335
- description: "Optional background color override for the CTA strip (example: #124a37)."
473
+ description: "Optional background color override for the CTA strip (example: #334b63)."
474
+ }
475
+ },
476
+ {
477
+ name: "media",
478
+ type: "upload",
479
+ relationTo: "media",
480
+ required: false
481
+ },
482
+ {
483
+ name: "imageURL",
484
+ type: "text",
485
+ admin: {
486
+ description: "Optional direct image URL when this CTA should use an external image."
487
+ }
488
+ },
489
+ {
490
+ name: "bullets",
491
+ type: "array",
492
+ fields: [
493
+ {
494
+ name: "label",
495
+ type: "text",
496
+ required: true
497
+ }
498
+ ]
499
+ },
500
+ {
501
+ name: "settings",
502
+ type: "json",
503
+ admin: {
504
+ description: "Internal builder settings schema v2.",
505
+ hidden: true
336
506
  }
337
507
  },
338
508
  ...sectionStyleFields()
@@ -354,6 +524,10 @@ var FaqBlock = {
354
524
  plural: "FAQs"
355
525
  },
356
526
  fields: [
527
+ {
528
+ name: "eyebrow",
529
+ type: "text"
530
+ },
357
531
  {
358
532
  name: "title",
359
533
  type: "text",
@@ -374,9 +548,24 @@ var FaqBlock = {
374
548
  name: "answer",
375
549
  type: "textarea",
376
550
  required: true
551
+ },
552
+ {
553
+ name: "settings",
554
+ type: "json",
555
+ admin: {
556
+ hidden: true
557
+ }
377
558
  }
378
559
  ]
379
560
  },
561
+ {
562
+ name: "settings",
563
+ type: "json",
564
+ admin: {
565
+ description: "Internal builder settings schema v2.",
566
+ hidden: true
567
+ }
568
+ },
380
569
  ...sectionStyleFields()
381
570
  ]
382
571
  };
@@ -396,10 +585,28 @@ var FeatureGridBlock = {
396
585
  plural: "Feature Grids"
397
586
  },
398
587
  fields: [
588
+ {
589
+ name: "eyebrow",
590
+ type: "text"
591
+ },
399
592
  {
400
593
  name: "title",
401
- type: "text",
402
- required: true
594
+ type: "text"
595
+ },
596
+ {
597
+ name: "subtitle",
598
+ type: "textarea"
599
+ },
600
+ {
601
+ name: "itemsPerRow",
602
+ type: "number",
603
+ defaultValue: 3,
604
+ min: 1,
605
+ max: 6,
606
+ admin: {
607
+ description: "How many items to show per row on desktop.",
608
+ step: 1
609
+ }
403
610
  },
404
611
  {
405
612
  name: "items",
@@ -416,11 +623,53 @@ var FeatureGridBlock = {
416
623
  name: "description",
417
624
  type: "textarea"
418
625
  },
626
+ {
627
+ name: "tone",
628
+ type: "select",
629
+ defaultValue: "warm",
630
+ options: [
631
+ { label: "Warm", value: "warm" },
632
+ { label: "Cool", value: "cool" },
633
+ { label: "Neutral", value: "neutral" }
634
+ ]
635
+ },
636
+ {
637
+ name: "iconType",
638
+ type: "select",
639
+ defaultValue: "badge",
640
+ options: [
641
+ { label: "Badge Text", value: "badge" },
642
+ { label: "Icon", value: "lucide" }
643
+ ],
644
+ admin: {
645
+ description: "Choose whether this item uses a short badge label or an icon."
646
+ }
647
+ },
419
648
  {
420
649
  name: "icon",
421
650
  type: "text",
422
651
  admin: {
423
- description: 'Optional short icon label (e.g. "01", "Leaf", "Star").'
652
+ description: 'Optional short icon label (e.g. "01", "Leaf", "Star").',
653
+ condition: (_, siblingData) => siblingData?.iconType !== "lucide"
654
+ }
655
+ },
656
+ {
657
+ name: "iconLucide",
658
+ type: "select",
659
+ options: [
660
+ { label: "Shield Check", value: "ShieldCheck" },
661
+ { label: "Clock", value: "Clock" },
662
+ { label: "Leaf", value: "Leaf" },
663
+ { label: "Dollar Sign", value: "DollarSign" },
664
+ { label: "Hard Hat", value: "HardHat" },
665
+ { label: "Sparkles", value: "Sparkles" },
666
+ { label: "Tree Pine", value: "TreePine" },
667
+ { label: "Badge Check", value: "BadgeCheck" },
668
+ { label: "Calendar Clock", value: "CalendarClock" }
669
+ ],
670
+ admin: {
671
+ description: "Select an icon for this item.",
672
+ condition: (_, siblingData) => siblingData?.iconType === "lucide"
424
673
  }
425
674
  },
426
675
  {
@@ -428,6 +677,107 @@ var FeatureGridBlock = {
428
677
  type: "upload",
429
678
  relationTo: "media",
430
679
  required: false
680
+ },
681
+ {
682
+ name: "imageURL",
683
+ type: "text",
684
+ admin: {
685
+ description: "Optional direct image URL when this item should use an external image."
686
+ }
687
+ },
688
+ {
689
+ name: "embedURL",
690
+ type: "text",
691
+ admin: {
692
+ description: "Optional iframe/embed URL for items like maps or other embedded content."
693
+ }
694
+ },
695
+ {
696
+ name: "buttonLabel",
697
+ type: "text"
698
+ },
699
+ {
700
+ name: "buttonHref",
701
+ type: "text"
702
+ },
703
+ {
704
+ name: "bullets",
705
+ type: "array",
706
+ fields: [
707
+ {
708
+ name: "label",
709
+ type: "text",
710
+ required: true
711
+ }
712
+ ]
713
+ },
714
+ {
715
+ name: "imageHeight",
716
+ type: "number",
717
+ defaultValue: 160,
718
+ min: 40,
719
+ max: 600,
720
+ admin: {
721
+ description: "Overrides the image height in the builder/section (in pixels).",
722
+ step: 10
723
+ }
724
+ },
725
+ {
726
+ name: "imageFit",
727
+ type: "select",
728
+ defaultValue: "cover",
729
+ options: [
730
+ { label: "Cover", value: "cover" },
731
+ { label: "Contain", value: "contain" }
732
+ ]
733
+ },
734
+ {
735
+ name: "imageCornerStyle",
736
+ type: "select",
737
+ defaultValue: "rounded",
738
+ options: [
739
+ { label: "Rounded", value: "rounded" },
740
+ { label: "Square", value: "square" }
741
+ ]
742
+ },
743
+ {
744
+ name: "imagePosition",
745
+ type: "select",
746
+ defaultValue: "center",
747
+ options: [
748
+ { label: "Center", value: "center" },
749
+ { label: "Top", value: "top" },
750
+ { label: "Bottom", value: "bottom" },
751
+ { label: "Left", value: "left" },
752
+ { label: "Right", value: "right" }
753
+ ]
754
+ },
755
+ {
756
+ name: "imagePositionX",
757
+ type: "number",
758
+ min: 0,
759
+ max: 100,
760
+ admin: {
761
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
762
+ step: 1
763
+ }
764
+ },
765
+ {
766
+ name: "imagePositionY",
767
+ type: "number",
768
+ min: 0,
769
+ max: 100,
770
+ admin: {
771
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
772
+ step: 1
773
+ }
774
+ },
775
+ {
776
+ name: "settings",
777
+ type: "json",
778
+ admin: {
779
+ hidden: true
780
+ }
431
781
  }
432
782
  ]
433
783
  },
@@ -441,8 +791,24 @@ var FeatureGridBlock = {
441
791
  value: "cards"
442
792
  },
443
793
  {
444
- label: "Highlight",
445
- value: "highlight"
794
+ label: "Highlight",
795
+ value: "highlight"
796
+ },
797
+ {
798
+ label: "Split List",
799
+ value: "splitList"
800
+ },
801
+ {
802
+ label: "Panels",
803
+ value: "panels"
804
+ },
805
+ {
806
+ label: "Catalog",
807
+ value: "catalog"
808
+ },
809
+ {
810
+ label: "Contact Split",
811
+ value: "contact"
446
812
  }
447
813
  ]
448
814
  },
@@ -450,7 +816,15 @@ var FeatureGridBlock = {
450
816
  name: "backgroundColor",
451
817
  type: "text",
452
818
  admin: {
453
- description: "Optional background color override when using the Highlight variant (example: #1f684f)."
819
+ description: "Optional background color override when using the Highlight variant (example: #334b63)."
820
+ }
821
+ },
822
+ {
823
+ name: "settings",
824
+ type: "json",
825
+ admin: {
826
+ description: "Internal builder settings schema v2.",
827
+ hidden: true
454
828
  }
455
829
  },
456
830
  ...sectionStyleFields()
@@ -472,6 +846,10 @@ var FormEmbedBlock = {
472
846
  plural: "Form Embeds"
473
847
  },
474
848
  fields: [
849
+ {
850
+ name: "eyebrow",
851
+ type: "text"
852
+ },
475
853
  {
476
854
  name: "title",
477
855
  type: "text"
@@ -480,6 +858,10 @@ var FormEmbedBlock = {
480
858
  name: "description",
481
859
  type: "textarea"
482
860
  },
861
+ {
862
+ name: "submitLabel",
863
+ type: "text"
864
+ },
483
865
  {
484
866
  name: "formType",
485
867
  type: "select",
@@ -491,6 +873,14 @@ var FormEmbedBlock = {
491
873
  }
492
874
  ]
493
875
  },
876
+ {
877
+ name: "settings",
878
+ type: "json",
879
+ admin: {
880
+ description: "Internal builder settings schema v2.",
881
+ hidden: true
882
+ }
883
+ },
494
884
  ...sectionStyleFields()
495
885
  ]
496
886
  };
@@ -553,18 +943,39 @@ var HeroBlock = {
553
943
  type: "upload",
554
944
  relationTo: "media"
555
945
  },
946
+ {
947
+ name: "backgroundImageURL",
948
+ type: "text",
949
+ admin: {
950
+ description: "Optional direct image URL when the hero should use an external image source."
951
+ }
952
+ },
556
953
  {
557
954
  name: "backgroundImageFit",
558
955
  type: "select",
559
956
  defaultValue: "cover",
560
957
  options: [
561
958
  { label: "Cover", value: "cover" },
562
- { label: "Contain", value: "contain" }
959
+ { label: "Cover (Square)", value: "cover-square" },
960
+ { label: "Contain", value: "contain" },
961
+ { label: "Contain (Square)", value: "contain-square" }
563
962
  ],
564
963
  admin: {
565
964
  description: "How the hero image should be sized within the section."
566
965
  }
567
966
  },
967
+ {
968
+ name: "backgroundImageCornerStyle",
969
+ type: "select",
970
+ defaultValue: "rounded",
971
+ options: [
972
+ { label: "Rounded", value: "rounded" },
973
+ { label: "Square", value: "square" }
974
+ ],
975
+ admin: {
976
+ description: "How the hero image corners should appear."
977
+ }
978
+ },
568
979
  {
569
980
  name: "backgroundImagePosition",
570
981
  type: "select",
@@ -584,7 +995,114 @@ var HeroBlock = {
584
995
  name: "backgroundColor",
585
996
  type: "text",
586
997
  admin: {
587
- description: "Optional background color override (example: #124a37)."
998
+ description: "Optional background color override (example: #334b63)."
999
+ }
1000
+ },
1001
+ {
1002
+ name: "backgroundOverlayMode",
1003
+ type: "select",
1004
+ defaultValue: "none",
1005
+ options: [
1006
+ { label: "None", value: "none" },
1007
+ { label: "Solid", value: "solid" },
1008
+ { label: "Gradient", value: "gradient" }
1009
+ ],
1010
+ admin: {
1011
+ description: "Optional overlay on top of the hero image (applies when an image is present)."
1012
+ }
1013
+ },
1014
+ {
1015
+ name: "backgroundOverlayOpacity",
1016
+ type: "number",
1017
+ defaultValue: 45,
1018
+ min: 0,
1019
+ max: 100,
1020
+ admin: {
1021
+ description: "Overlay opacity (0-100).",
1022
+ step: 1
1023
+ }
1024
+ },
1025
+ {
1026
+ name: "backgroundOverlayColor",
1027
+ type: "text",
1028
+ admin: {
1029
+ description: "Overlay solid color (example: #000000). Used when Overlay Mode is Solid."
1030
+ }
1031
+ },
1032
+ {
1033
+ name: "backgroundOverlayGradientFrom",
1034
+ type: "text",
1035
+ admin: {
1036
+ description: "Gradient overlay start color (example: #334b63). Used when Overlay Mode is Gradient."
1037
+ }
1038
+ },
1039
+ {
1040
+ name: "backgroundOverlayGradientTo",
1041
+ type: "text",
1042
+ admin: {
1043
+ description: "Gradient overlay end color (example: #496582). Used when Overlay Mode is Gradient."
1044
+ }
1045
+ },
1046
+ {
1047
+ name: "backgroundOverlayGradientAngle",
1048
+ type: "text",
1049
+ admin: {
1050
+ description: "Gradient overlay angle in degrees (0-360). Used when Overlay Mode is Gradient."
1051
+ }
1052
+ },
1053
+ {
1054
+ name: "backgroundOverlayGradientFromStrength",
1055
+ type: "number",
1056
+ defaultValue: 100,
1057
+ min: 0,
1058
+ max: 100,
1059
+ admin: {
1060
+ description: "Gradient start strength (0-100). Set to 0 for transparent.",
1061
+ step: 1
1062
+ }
1063
+ },
1064
+ {
1065
+ name: "backgroundOverlayGradientToStrength",
1066
+ type: "number",
1067
+ defaultValue: 100,
1068
+ min: 0,
1069
+ max: 100,
1070
+ admin: {
1071
+ description: "Gradient end strength (0-100). Set to 0 for transparent.",
1072
+ step: 1
1073
+ }
1074
+ },
1075
+ {
1076
+ name: "backgroundOverlayGradientStart",
1077
+ type: "number",
1078
+ defaultValue: 0,
1079
+ min: 0,
1080
+ max: 100,
1081
+ admin: {
1082
+ description: "Where the gradient starts (0-100).",
1083
+ step: 1
1084
+ }
1085
+ },
1086
+ {
1087
+ name: "backgroundOverlayGradientEnd",
1088
+ type: "number",
1089
+ defaultValue: 100,
1090
+ min: 0,
1091
+ max: 100,
1092
+ admin: {
1093
+ description: "Where the gradient ends (0-100).",
1094
+ step: 1
1095
+ }
1096
+ },
1097
+ {
1098
+ name: "backgroundOverlayGradientFeather",
1099
+ type: "number",
1100
+ defaultValue: 100,
1101
+ min: 0,
1102
+ max: 100,
1103
+ admin: {
1104
+ description: "How soft the transition is (0 = hard edge, 100 = smooth).",
1105
+ step: 1
588
1106
  }
589
1107
  },
590
1108
  {
@@ -602,6 +1120,36 @@ var HeroBlock = {
602
1120
  }
603
1121
  ]
604
1122
  },
1123
+ {
1124
+ name: "heroHeight",
1125
+ type: "select",
1126
+ defaultValue: "sm",
1127
+ options: [
1128
+ {
1129
+ label: "Small",
1130
+ value: "sm"
1131
+ },
1132
+ {
1133
+ label: "Medium (Half Screen)",
1134
+ value: "md"
1135
+ },
1136
+ {
1137
+ label: "Full Screen",
1138
+ value: "full"
1139
+ }
1140
+ ],
1141
+ admin: {
1142
+ description: "Controls the vertical height of the hero section."
1143
+ }
1144
+ },
1145
+ {
1146
+ name: "settings",
1147
+ type: "json",
1148
+ admin: {
1149
+ description: "Internal builder settings schema v2.",
1150
+ hidden: true
1151
+ }
1152
+ },
605
1153
  ...sectionStyleFields()
606
1154
  ]
607
1155
  };
@@ -647,12 +1195,95 @@ var LogoWallBlock = {
647
1195
  relationTo: "media",
648
1196
  required: false
649
1197
  },
1198
+ {
1199
+ name: "imageURL",
1200
+ type: "text",
1201
+ admin: {
1202
+ description: "Optional direct image URL for this logo when using an external asset."
1203
+ }
1204
+ },
1205
+ {
1206
+ name: "imageHeight",
1207
+ type: "number",
1208
+ defaultValue: 64,
1209
+ min: 24,
1210
+ max: 200,
1211
+ admin: {
1212
+ description: "Overrides the logo image height (in pixels).",
1213
+ step: 4
1214
+ }
1215
+ },
1216
+ {
1217
+ name: "imageFit",
1218
+ type: "select",
1219
+ defaultValue: "contain",
1220
+ options: [
1221
+ { label: "Cover", value: "cover" },
1222
+ { label: "Contain", value: "contain" }
1223
+ ]
1224
+ },
1225
+ {
1226
+ name: "imageCornerStyle",
1227
+ type: "select",
1228
+ defaultValue: "rounded",
1229
+ options: [
1230
+ { label: "Rounded", value: "rounded" },
1231
+ { label: "Square", value: "square" }
1232
+ ]
1233
+ },
1234
+ {
1235
+ name: "imagePosition",
1236
+ type: "select",
1237
+ defaultValue: "center",
1238
+ options: [
1239
+ { label: "Center", value: "center" },
1240
+ { label: "Top", value: "top" },
1241
+ { label: "Bottom", value: "bottom" },
1242
+ { label: "Left", value: "left" },
1243
+ { label: "Right", value: "right" }
1244
+ ]
1245
+ },
1246
+ {
1247
+ name: "imagePositionX",
1248
+ type: "number",
1249
+ min: 0,
1250
+ max: 100,
1251
+ admin: {
1252
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
1253
+ step: 1
1254
+ }
1255
+ },
1256
+ {
1257
+ name: "imagePositionY",
1258
+ type: "number",
1259
+ min: 0,
1260
+ max: 100,
1261
+ admin: {
1262
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
1263
+ step: 1
1264
+ }
1265
+ },
650
1266
  {
651
1267
  name: "href",
652
1268
  type: "text"
1269
+ },
1270
+ {
1271
+ name: "settings",
1272
+ type: "json",
1273
+ admin: {
1274
+ hidden: true
1275
+ }
653
1276
  }
654
1277
  ]
655
1278
  },
1279
+ {
1280
+ name: "settings",
1281
+ type: "json",
1282
+ admin: {
1283
+ description: "Internal builder settings schema v2.",
1284
+ hidden: true
1285
+ }
1286
+ },
656
1287
  ...sectionStyleFields()
657
1288
  ]
658
1289
  };
@@ -676,7 +1307,14 @@ var MediaBlock = {
676
1307
  name: "image",
677
1308
  type: "upload",
678
1309
  relationTo: "media",
679
- required: true
1310
+ required: false
1311
+ },
1312
+ {
1313
+ name: "imageURL",
1314
+ type: "text",
1315
+ admin: {
1316
+ description: "Optional direct image URL when this section should use an external image."
1317
+ }
680
1318
  },
681
1319
  {
682
1320
  name: "caption",
@@ -697,6 +1335,44 @@ var MediaBlock = {
697
1335
  }
698
1336
  ]
699
1337
  },
1338
+ {
1339
+ name: "imageFit",
1340
+ type: "select",
1341
+ defaultValue: "cover",
1342
+ options: [
1343
+ { label: "Cover", value: "cover" },
1344
+ { label: "Contain", value: "contain" }
1345
+ ]
1346
+ },
1347
+ {
1348
+ name: "imageCornerStyle",
1349
+ type: "select",
1350
+ defaultValue: "rounded",
1351
+ options: [
1352
+ { label: "Rounded", value: "rounded" },
1353
+ { label: "Square", value: "square" }
1354
+ ]
1355
+ },
1356
+ {
1357
+ name: "imagePosition",
1358
+ type: "select",
1359
+ defaultValue: "center",
1360
+ options: [
1361
+ { label: "Center", value: "center" },
1362
+ { label: "Top", value: "top" },
1363
+ { label: "Bottom", value: "bottom" },
1364
+ { label: "Left", value: "left" },
1365
+ { label: "Right", value: "right" }
1366
+ ]
1367
+ },
1368
+ {
1369
+ name: "settings",
1370
+ type: "json",
1371
+ admin: {
1372
+ description: "Internal builder settings schema v2.",
1373
+ hidden: true
1374
+ }
1375
+ },
700
1376
  ...sectionStyleFields()
701
1377
  ]
702
1378
  };
@@ -716,6 +1392,21 @@ var RichTextBlock = {
716
1392
  plural: "Rich Text Sections"
717
1393
  },
718
1394
  fields: [
1395
+ {
1396
+ name: "variant",
1397
+ type: "select",
1398
+ defaultValue: "default",
1399
+ options: [
1400
+ {
1401
+ label: "Default",
1402
+ value: "default"
1403
+ },
1404
+ {
1405
+ label: "Quote Banner",
1406
+ value: "quoteBanner"
1407
+ }
1408
+ ]
1409
+ },
719
1410
  {
720
1411
  name: "title",
721
1412
  type: "text"
@@ -725,6 +1416,54 @@ var RichTextBlock = {
725
1416
  type: "richText",
726
1417
  required: true
727
1418
  },
1419
+ {
1420
+ name: "statsItems",
1421
+ type: "array",
1422
+ fields: [
1423
+ {
1424
+ name: "value",
1425
+ type: "text",
1426
+ required: true
1427
+ },
1428
+ {
1429
+ name: "label",
1430
+ type: "text",
1431
+ required: true
1432
+ }
1433
+ ]
1434
+ },
1435
+ {
1436
+ name: "cards",
1437
+ type: "array",
1438
+ fields: [
1439
+ {
1440
+ name: "eyebrow",
1441
+ type: "text"
1442
+ },
1443
+ {
1444
+ name: "title",
1445
+ type: "text",
1446
+ required: true
1447
+ },
1448
+ {
1449
+ name: "description",
1450
+ type: "textarea"
1451
+ },
1452
+ {
1453
+ name: "media",
1454
+ type: "upload",
1455
+ relationTo: "media",
1456
+ required: false
1457
+ },
1458
+ {
1459
+ name: "imageURL",
1460
+ type: "text",
1461
+ admin: {
1462
+ description: "Optional direct image URL when this card should use an external image."
1463
+ }
1464
+ }
1465
+ ]
1466
+ },
728
1467
  {
729
1468
  name: "width",
730
1469
  type: "select",
@@ -740,6 +1479,14 @@ var RichTextBlock = {
740
1479
  }
741
1480
  ]
742
1481
  },
1482
+ {
1483
+ name: "settings",
1484
+ type: "json",
1485
+ admin: {
1486
+ description: "Internal builder settings schema v2.",
1487
+ hidden: true
1488
+ }
1489
+ },
743
1490
  ...sectionStyleFields()
744
1491
  ]
745
1492
  };
@@ -787,9 +1534,24 @@ var StatsBlock = {
787
1534
  {
788
1535
  name: "description",
789
1536
  type: "text"
1537
+ },
1538
+ {
1539
+ name: "settings",
1540
+ type: "json",
1541
+ admin: {
1542
+ hidden: true
1543
+ }
790
1544
  }
791
1545
  ]
792
1546
  },
1547
+ {
1548
+ name: "settings",
1549
+ type: "json",
1550
+ admin: {
1551
+ description: "Internal builder settings schema v2.",
1552
+ hidden: true
1553
+ }
1554
+ },
793
1555
  ...sectionStyleFields()
794
1556
  ]
795
1557
  };
@@ -814,11 +1576,41 @@ var TestimonialsBlock = {
814
1576
  type: "text",
815
1577
  required: true
816
1578
  },
1579
+ {
1580
+ name: "visibleCount",
1581
+ type: "number",
1582
+ defaultValue: 3,
1583
+ min: 1,
1584
+ max: 6,
1585
+ admin: {
1586
+ description: "How many testimonials to show at once.",
1587
+ step: 1
1588
+ }
1589
+ },
1590
+ {
1591
+ name: "autoRotate",
1592
+ type: "checkbox",
1593
+ defaultValue: true,
1594
+ admin: {
1595
+ description: "Automatically rotates through all testimonials."
1596
+ }
1597
+ },
1598
+ {
1599
+ name: "rotateIntervalSeconds",
1600
+ type: "number",
1601
+ defaultValue: 7,
1602
+ min: 2,
1603
+ max: 30,
1604
+ admin: {
1605
+ description: "How often to rotate (in seconds).",
1606
+ step: 1
1607
+ }
1608
+ },
817
1609
  {
818
1610
  name: "items",
819
1611
  type: "array",
820
1612
  minRows: 1,
821
- maxRows: 6,
1613
+ maxRows: 30,
822
1614
  fields: [
823
1615
  {
824
1616
  name: "quote",
@@ -833,9 +1625,35 @@ var TestimonialsBlock = {
833
1625
  {
834
1626
  name: "location",
835
1627
  type: "text"
1628
+ },
1629
+ {
1630
+ name: "rating",
1631
+ type: "number",
1632
+ defaultValue: 5,
1633
+ min: 1,
1634
+ max: 5,
1635
+ admin: {
1636
+ description: "Star rating (1-5).",
1637
+ step: 1
1638
+ }
1639
+ },
1640
+ {
1641
+ name: "settings",
1642
+ type: "json",
1643
+ admin: {
1644
+ hidden: true
1645
+ }
836
1646
  }
837
1647
  ]
838
1648
  },
1649
+ {
1650
+ name: "settings",
1651
+ type: "json",
1652
+ admin: {
1653
+ description: "Internal builder settings schema v2.",
1654
+ hidden: true
1655
+ }
1656
+ },
839
1657
  ...sectionStyleFields()
840
1658
  ]
841
1659
  };
@@ -900,18 +1718,18 @@ var sectionPresets = [
900
1718
  blocks: [
901
1719
  {
902
1720
  blockType: "hero",
903
- kicker: "Licensed + Insured",
904
- headline: "Expert Tree Care for Central Texas",
905
- subheadline: "Reliable trimming, safe removals, and stump grinding for residential and commercial properties.",
906
- primaryLabel: "Get Your Free Quote",
1721
+ kicker: "Trusted Team",
1722
+ headline: "A clear headline for your primary offer",
1723
+ subheadline: "Explain what you offer, who it is for, and why it matters in one strong supporting sentence.",
1724
+ primaryLabel: "Get Started",
907
1725
  primaryHref: "/contact",
908
- secondaryLabel: "See Our Work",
909
- secondaryHref: "/portfolio"
1726
+ secondaryLabel: "Learn More",
1727
+ secondaryHref: "/about"
910
1728
  },
911
1729
  {
912
1730
  blockType: "cta",
913
- headline: "Need a quote this week?",
914
- description: "Call (512) 555-0149 or request an on-site estimate online.",
1731
+ headline: "Ready for the next step?",
1732
+ description: "Use a short call to action with a direct path to contact or purchase.",
915
1733
  buttonLabel: "Contact Us",
916
1734
  buttonHref: "/contact",
917
1735
  style: "light"
@@ -929,19 +1747,19 @@ var sectionPresets = [
929
1747
  variant: "cards",
930
1748
  items: [
931
1749
  {
932
- title: "Tree Trimming & Pruning",
933
- description: "Canopy balancing, deadwood removal, and seasonal pruning.",
934
- icon: "Trim"
1750
+ title: "Service One",
1751
+ description: "Briefly describe this offer or outcome.",
1752
+ icon: "01"
935
1753
  },
936
1754
  {
937
- title: "Safe Tree Removal",
938
- description: "Controlled removal for hazardous or unstable trees.",
939
- icon: "Remove"
1755
+ title: "Service Two",
1756
+ description: "Briefly describe this offer or outcome.",
1757
+ icon: "02"
940
1758
  },
941
1759
  {
942
- title: "Stump Grinding",
943
- description: "Below-grade stump grinding and cleanup.",
944
- icon: "Stump"
1760
+ title: "Service Three",
1761
+ description: "Briefly describe this offer or outcome.",
1762
+ icon: "03"
945
1763
  }
946
1764
  ]
947
1765
  }
@@ -957,14 +1775,16 @@ var sectionPresets = [
957
1775
  title: "What Homeowners Say",
958
1776
  items: [
959
1777
  {
960
- quote: "Great communication, fair pricing, and the cleanup was perfect. We will use them again.",
961
- name: "Katie M.",
962
- location: "Austin, TX"
1778
+ quote: "The experience was smooth, thoughtful, and exactly what we hoped for.",
1779
+ name: "Customer Name",
1780
+ location: "City, ST",
1781
+ rating: 5
963
1782
  },
964
1783
  {
965
- quote: "They removed a dangerous limb over our driveway quickly and safely.",
966
- name: "James R.",
967
- location: "Round Rock, TX"
1784
+ quote: "Fast communication, strong service, and a result we would happily recommend.",
1785
+ name: "Customer Name",
1786
+ location: "City, ST",
1787
+ rating: 5
968
1788
  }
969
1789
  ]
970
1790
  },
@@ -973,12 +1793,12 @@ var sectionPresets = [
973
1793
  title: "Common Questions",
974
1794
  items: [
975
1795
  {
976
- question: "How quickly can you schedule service?",
977
- answer: "Most estimate requests are scheduled within 24 hours."
1796
+ question: "How quickly do you respond?",
1797
+ answer: "Replace this with a concise answer to a common customer question."
978
1798
  },
979
1799
  {
980
- question: "Do you provide cleanup?",
981
- answer: "Yes. Debris haul-off and cleanup are included in quoted scopes."
1800
+ question: "What is included?",
1801
+ answer: "Replace this with another concise answer that reduces buying friction."
982
1802
  }
983
1803
  ]
984
1804
  }
@@ -992,13 +1812,13 @@ var sectionPresets = [
992
1812
  {
993
1813
  blockType: "formEmbed",
994
1814
  title: "Request a Quote",
995
- description: "Share your project details and we will follow up quickly.",
1815
+ description: "Share a few details and your team can follow up with next steps.",
996
1816
  formType: "quote"
997
1817
  },
998
1818
  {
999
1819
  blockType: "bookingEmbed",
1000
1820
  title: "Prefer to book a consultation?",
1001
- description: "Choose a time window and we will confirm availability.",
1821
+ description: "Offer an alternative scheduling path for visitors who prefer to book directly.",
1002
1822
  buttonLabel: "Book Consultation",
1003
1823
  buttonHref: "/contact"
1004
1824
  }
@@ -1010,14 +1830,14 @@ var templateStarterPresets = {
1010
1830
  {
1011
1831
  blockType: "hero",
1012
1832
  headline: "Contact Us",
1013
- subheadline: "Request a quote, ask a question, or book a consultation window.",
1014
- primaryLabel: "Call (512) 555-0149",
1015
- primaryHref: "tel:+15125550149"
1833
+ subheadline: "Tell visitors exactly how to reach you and what to expect next.",
1834
+ primaryLabel: "Email Us",
1835
+ primaryHref: "mailto:hello@example.com"
1016
1836
  },
1017
1837
  {
1018
1838
  blockType: "formEmbed",
1019
1839
  title: "Request a Quote",
1020
- description: "Tell us about your project and we will follow up quickly.",
1840
+ description: "Use this space for a form embed or lead capture flow.",
1021
1841
  formType: "quote"
1022
1842
  },
1023
1843
  {
@@ -1025,8 +1845,8 @@ var templateStarterPresets = {
1025
1845
  title: "Common Questions",
1026
1846
  items: [
1027
1847
  {
1028
- question: "How quickly can you provide an estimate?",
1029
- answer: "Most estimates are scheduled within 24 hours."
1848
+ question: "How quickly will you respond?",
1849
+ answer: "Replace with the answer that best fits your operating process."
1030
1850
  }
1031
1851
  ]
1032
1852
  }
@@ -1035,27 +1855,27 @@ var templateStarterPresets = {
1035
1855
  {
1036
1856
  blockType: "hero",
1037
1857
  kicker: "Locally Owned",
1038
- headline: "Expert Tree Care for Central Texas",
1039
- subheadline: "Premium trimming, removal, and cleanup with safety-first execution.",
1040
- primaryLabel: "Get Your Free Quote",
1858
+ headline: "Lead with your strongest offer",
1859
+ subheadline: "Support the headline with a concise sentence that clarifies benefits and audience.",
1860
+ primaryLabel: "Get Started",
1041
1861
  primaryHref: "/contact",
1042
1862
  secondaryLabel: "View Services",
1043
1863
  secondaryHref: "/services"
1044
1864
  },
1045
1865
  {
1046
1866
  blockType: "featureGrid",
1047
- title: "Why Homeowners Choose Us",
1867
+ title: "Why clients choose us",
1048
1868
  variant: "highlight",
1049
1869
  items: [
1050
- { title: "Transparent Pricing", description: "Clear written estimates.", icon: "01" },
1051
- { title: "Safety-First Crew", description: "Property protection and planning.", icon: "02" },
1052
- { title: "Fast Scheduling", description: "Quick estimates and service windows.", icon: "03" }
1870
+ { title: "Clear Value", description: "Explain your first differentiator.", icon: "01" },
1871
+ { title: "Reliable Process", description: "Explain your second differentiator.", icon: "02" },
1872
+ { title: "Strong Results", description: "Explain your third differentiator.", icon: "03" }
1053
1873
  ]
1054
1874
  },
1055
1875
  {
1056
1876
  blockType: "cta",
1057
- headline: "Need a quote this week?",
1058
- description: "Call (512) 555-0149 or request an estimate online.",
1877
+ headline: "Ready to take the next step?",
1878
+ description: "Add a direct conversion prompt with a clear primary action.",
1059
1879
  buttonLabel: "Contact Us",
1060
1880
  buttonHref: "/contact",
1061
1881
  style: "light"
@@ -1064,9 +1884,9 @@ var templateStarterPresets = {
1064
1884
  services: [
1065
1885
  {
1066
1886
  blockType: "hero",
1067
- headline: "Tree Services Built for Safety and Curb Appeal",
1068
- subheadline: "Core offerings first, with clear scopes and scheduling.",
1069
- primaryLabel: "Schedule Estimate",
1887
+ headline: "Services Built Around Your Process",
1888
+ subheadline: "Summarize the core offerings with a short clarity-first introduction.",
1889
+ primaryLabel: "Request Info",
1070
1890
  primaryHref: "/contact"
1071
1891
  },
1072
1892
  {
@@ -1075,19 +1895,19 @@ var templateStarterPresets = {
1075
1895
  variant: "cards",
1076
1896
  items: [
1077
1897
  {
1078
- title: "Tree Trimming & Pruning",
1079
- description: "Selective pruning for structure, clearance, and health.",
1080
- icon: "Trim"
1898
+ title: "Service One",
1899
+ description: "Replace with a short description.",
1900
+ icon: "01"
1081
1901
  },
1082
1902
  {
1083
- title: "Tree Removal",
1084
- description: "Controlled removal for unstable or hazardous trees.",
1085
- icon: "Remove"
1903
+ title: "Service Two",
1904
+ description: "Replace with a short description.",
1905
+ icon: "02"
1086
1906
  },
1087
1907
  {
1088
- title: "Stump Grinding",
1089
- description: "Below-grade grinding and cleanup.",
1090
- icon: "Stump"
1908
+ title: "Service Three",
1909
+ description: "Replace with a short description.",
1910
+ icon: "03"
1091
1911
  }
1092
1912
  ]
1093
1913
  },
@@ -1096,8 +1916,8 @@ var templateStarterPresets = {
1096
1916
  title: "Frequently Asked Questions",
1097
1917
  items: [
1098
1918
  {
1099
- question: "Do you handle storm cleanup?",
1100
- answer: "Yes. We prioritize urgent hazards after severe weather."
1919
+ question: "Do you offer custom scopes?",
1920
+ answer: "Replace this with an answer that fits your business."
1101
1921
  }
1102
1922
  ]
1103
1923
  }