@orion-studios/payload-blocks 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/dist/index.d.mts +51 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +844 -0
- package/dist/index.mjs +803 -0
- package/package.json +43 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,844 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
BookingEmbedBlock: () => BookingEmbedBlock,
|
|
24
|
+
BuilderBlockLabel: () => BuilderBlockLabel,
|
|
25
|
+
CtaBlock: () => CtaBlock,
|
|
26
|
+
FaqBlock: () => FaqBlock,
|
|
27
|
+
FeatureGridBlock: () => FeatureGridBlock,
|
|
28
|
+
FormEmbedBlock: () => FormEmbedBlock,
|
|
29
|
+
HeroBlock: () => HeroBlock,
|
|
30
|
+
MediaBlock: () => MediaBlock,
|
|
31
|
+
RichTextBlock: () => RichTextBlock,
|
|
32
|
+
TestimonialsBlock: () => TestimonialsBlock,
|
|
33
|
+
builderBlockLabelComponent: () => builderBlockLabelComponent,
|
|
34
|
+
clonePresetBlocks: () => clonePresetBlocks,
|
|
35
|
+
defaultPageLayoutBlocks: () => defaultPageLayoutBlocks,
|
|
36
|
+
sectionPresets: () => sectionPresets,
|
|
37
|
+
templateStarterPresets: () => templateStarterPresets
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(index_exports);
|
|
40
|
+
|
|
41
|
+
// src/blocks/adminComponents.ts
|
|
42
|
+
var builderBlockLabelComponent = {
|
|
43
|
+
exportName: "BuilderBlockLabel",
|
|
44
|
+
path: "./components/admin/BuilderBlockLabel.tsx"
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// src/blocks/BookingEmbed.ts
|
|
48
|
+
var BookingEmbedBlock = {
|
|
49
|
+
slug: "bookingEmbed",
|
|
50
|
+
imageURL: "/images/service-removal.svg",
|
|
51
|
+
imageAltText: "Booking embed section preview",
|
|
52
|
+
admin: {
|
|
53
|
+
components: {
|
|
54
|
+
Label: builderBlockLabelComponent
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
labels: {
|
|
58
|
+
singular: "Booking Embed",
|
|
59
|
+
plural: "Booking Embeds"
|
|
60
|
+
},
|
|
61
|
+
fields: [
|
|
62
|
+
{
|
|
63
|
+
name: "title",
|
|
64
|
+
type: "text"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "description",
|
|
68
|
+
type: "textarea"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "buttonLabel",
|
|
72
|
+
type: "text",
|
|
73
|
+
defaultValue: "Book Consultation"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "buttonHref",
|
|
77
|
+
type: "text",
|
|
78
|
+
defaultValue: "/contact"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/blocks/Cta.ts
|
|
84
|
+
var CtaBlock = {
|
|
85
|
+
slug: "cta",
|
|
86
|
+
imageURL: "/images/logo-mark.svg",
|
|
87
|
+
imageAltText: "Call to action section preview",
|
|
88
|
+
admin: {
|
|
89
|
+
components: {
|
|
90
|
+
Label: builderBlockLabelComponent
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
labels: {
|
|
94
|
+
singular: "CTA",
|
|
95
|
+
plural: "CTAs"
|
|
96
|
+
},
|
|
97
|
+
fields: [
|
|
98
|
+
{
|
|
99
|
+
name: "headline",
|
|
100
|
+
type: "text",
|
|
101
|
+
required: true
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "description",
|
|
105
|
+
type: "textarea"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: "buttonLabel",
|
|
109
|
+
type: "text"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "buttonHref",
|
|
113
|
+
type: "text",
|
|
114
|
+
admin: {
|
|
115
|
+
description: "Use internal links like /contact."
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: "style",
|
|
120
|
+
type: "select",
|
|
121
|
+
defaultValue: "light",
|
|
122
|
+
options: [
|
|
123
|
+
{
|
|
124
|
+
label: "Light",
|
|
125
|
+
value: "light"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
label: "Dark",
|
|
129
|
+
value: "dark"
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "backgroundColor",
|
|
135
|
+
type: "text",
|
|
136
|
+
admin: {
|
|
137
|
+
description: "Optional background color override for the CTA strip (example: #124a37)."
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// src/blocks/Faq.ts
|
|
144
|
+
var FaqBlock = {
|
|
145
|
+
slug: "faq",
|
|
146
|
+
imageURL: "/images/project-before-2.svg",
|
|
147
|
+
imageAltText: "FAQ section preview",
|
|
148
|
+
admin: {
|
|
149
|
+
components: {
|
|
150
|
+
Label: builderBlockLabelComponent
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
labels: {
|
|
154
|
+
singular: "FAQ",
|
|
155
|
+
plural: "FAQs"
|
|
156
|
+
},
|
|
157
|
+
fields: [
|
|
158
|
+
{
|
|
159
|
+
name: "title",
|
|
160
|
+
type: "text",
|
|
161
|
+
required: true
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: "items",
|
|
165
|
+
type: "array",
|
|
166
|
+
minRows: 1,
|
|
167
|
+
maxRows: 12,
|
|
168
|
+
fields: [
|
|
169
|
+
{
|
|
170
|
+
name: "question",
|
|
171
|
+
type: "text",
|
|
172
|
+
required: true
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "answer",
|
|
176
|
+
type: "textarea",
|
|
177
|
+
required: true
|
|
178
|
+
}
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
]
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// src/blocks/FeatureGrid.ts
|
|
185
|
+
var FeatureGridBlock = {
|
|
186
|
+
slug: "featureGrid",
|
|
187
|
+
imageURL: "/images/service-trimming.svg",
|
|
188
|
+
imageAltText: "Feature grid section preview",
|
|
189
|
+
admin: {
|
|
190
|
+
components: {
|
|
191
|
+
Label: builderBlockLabelComponent
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
labels: {
|
|
195
|
+
singular: "Feature Grid",
|
|
196
|
+
plural: "Feature Grids"
|
|
197
|
+
},
|
|
198
|
+
fields: [
|
|
199
|
+
{
|
|
200
|
+
name: "title",
|
|
201
|
+
type: "text",
|
|
202
|
+
required: true
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: "items",
|
|
206
|
+
type: "array",
|
|
207
|
+
minRows: 1,
|
|
208
|
+
maxRows: 6,
|
|
209
|
+
fields: [
|
|
210
|
+
{
|
|
211
|
+
name: "title",
|
|
212
|
+
type: "text",
|
|
213
|
+
required: true
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: "description",
|
|
217
|
+
type: "textarea"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: "icon",
|
|
221
|
+
type: "text",
|
|
222
|
+
admin: {
|
|
223
|
+
description: 'Optional short icon label (e.g. "01", "Leaf", "Star").'
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
name: "variant",
|
|
230
|
+
type: "select",
|
|
231
|
+
defaultValue: "cards",
|
|
232
|
+
options: [
|
|
233
|
+
{
|
|
234
|
+
label: "Cards",
|
|
235
|
+
value: "cards"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
label: "Highlight",
|
|
239
|
+
value: "highlight"
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
name: "backgroundColor",
|
|
245
|
+
type: "text",
|
|
246
|
+
admin: {
|
|
247
|
+
description: "Optional background color override when using the Highlight variant (example: #1f684f)."
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
// src/blocks/FormEmbed.ts
|
|
254
|
+
var FormEmbedBlock = {
|
|
255
|
+
slug: "formEmbed",
|
|
256
|
+
imageURL: "/images/map-placeholder.svg",
|
|
257
|
+
imageAltText: "Form embed section preview",
|
|
258
|
+
admin: {
|
|
259
|
+
components: {
|
|
260
|
+
Label: builderBlockLabelComponent
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
labels: {
|
|
264
|
+
singular: "Form Embed",
|
|
265
|
+
plural: "Form Embeds"
|
|
266
|
+
},
|
|
267
|
+
fields: [
|
|
268
|
+
{
|
|
269
|
+
name: "title",
|
|
270
|
+
type: "text"
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
name: "description",
|
|
274
|
+
type: "textarea"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
name: "formType",
|
|
278
|
+
type: "select",
|
|
279
|
+
defaultValue: "quote",
|
|
280
|
+
options: [
|
|
281
|
+
{
|
|
282
|
+
label: "Quote Form",
|
|
283
|
+
value: "quote"
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
// src/blocks/Hero.ts
|
|
291
|
+
var HeroBlock = {
|
|
292
|
+
slug: "hero",
|
|
293
|
+
imageURL: "/images/hero-tree.svg",
|
|
294
|
+
imageAltText: "Hero section preview",
|
|
295
|
+
admin: {
|
|
296
|
+
components: {
|
|
297
|
+
Label: builderBlockLabelComponent
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
labels: {
|
|
301
|
+
singular: "Hero",
|
|
302
|
+
plural: "Hero Sections"
|
|
303
|
+
},
|
|
304
|
+
fields: [
|
|
305
|
+
{
|
|
306
|
+
name: "kicker",
|
|
307
|
+
type: "text",
|
|
308
|
+
admin: {
|
|
309
|
+
description: "Optional short label above the headline."
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
name: "headline",
|
|
314
|
+
type: "text",
|
|
315
|
+
required: true
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
name: "subheadline",
|
|
319
|
+
type: "textarea"
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
name: "primaryLabel",
|
|
323
|
+
type: "text"
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
name: "primaryHref",
|
|
327
|
+
type: "text",
|
|
328
|
+
admin: {
|
|
329
|
+
description: "Use internal links like /contact."
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: "secondaryLabel",
|
|
334
|
+
type: "text"
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
name: "secondaryHref",
|
|
338
|
+
type: "text",
|
|
339
|
+
admin: {
|
|
340
|
+
description: "Use internal links like /services."
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
name: "media",
|
|
345
|
+
type: "upload",
|
|
346
|
+
relationTo: "media"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
name: "backgroundImageURL",
|
|
350
|
+
type: "text",
|
|
351
|
+
admin: {
|
|
352
|
+
description: "Optional external/background image URL override for this hero section."
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
name: "backgroundColor",
|
|
357
|
+
type: "text",
|
|
358
|
+
admin: {
|
|
359
|
+
description: "Optional background color override (example: #124a37)."
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
name: "variant",
|
|
364
|
+
type: "select",
|
|
365
|
+
defaultValue: "default",
|
|
366
|
+
options: [
|
|
367
|
+
{
|
|
368
|
+
label: "Default",
|
|
369
|
+
value: "default"
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
label: "Centered",
|
|
373
|
+
value: "centered"
|
|
374
|
+
}
|
|
375
|
+
]
|
|
376
|
+
}
|
|
377
|
+
]
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// src/blocks/Media.ts
|
|
381
|
+
var MediaBlock = {
|
|
382
|
+
slug: "media",
|
|
383
|
+
imageURL: "/images/project-after-1.svg",
|
|
384
|
+
imageAltText: "Media section preview",
|
|
385
|
+
admin: {
|
|
386
|
+
components: {
|
|
387
|
+
Label: builderBlockLabelComponent
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
labels: {
|
|
391
|
+
singular: "Media",
|
|
392
|
+
plural: "Media Sections"
|
|
393
|
+
},
|
|
394
|
+
fields: [
|
|
395
|
+
{
|
|
396
|
+
name: "image",
|
|
397
|
+
type: "upload",
|
|
398
|
+
relationTo: "media",
|
|
399
|
+
required: true
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
name: "caption",
|
|
403
|
+
type: "text"
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
name: "size",
|
|
407
|
+
type: "select",
|
|
408
|
+
defaultValue: "default",
|
|
409
|
+
options: [
|
|
410
|
+
{
|
|
411
|
+
label: "Default",
|
|
412
|
+
value: "default"
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
label: "Wide",
|
|
416
|
+
value: "wide"
|
|
417
|
+
}
|
|
418
|
+
]
|
|
419
|
+
}
|
|
420
|
+
]
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
// src/blocks/RichText.ts
|
|
424
|
+
var RichTextBlock = {
|
|
425
|
+
slug: "richText",
|
|
426
|
+
imageURL: "/window.svg",
|
|
427
|
+
imageAltText: "Rich text section preview",
|
|
428
|
+
admin: {
|
|
429
|
+
components: {
|
|
430
|
+
Label: builderBlockLabelComponent
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
labels: {
|
|
434
|
+
singular: "Rich Text",
|
|
435
|
+
plural: "Rich Text Sections"
|
|
436
|
+
},
|
|
437
|
+
fields: [
|
|
438
|
+
{
|
|
439
|
+
name: "title",
|
|
440
|
+
type: "text"
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
name: "content",
|
|
444
|
+
type: "richText",
|
|
445
|
+
required: true
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
name: "width",
|
|
449
|
+
type: "select",
|
|
450
|
+
defaultValue: "normal",
|
|
451
|
+
options: [
|
|
452
|
+
{
|
|
453
|
+
label: "Normal",
|
|
454
|
+
value: "normal"
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
label: "Narrow",
|
|
458
|
+
value: "narrow"
|
|
459
|
+
}
|
|
460
|
+
]
|
|
461
|
+
}
|
|
462
|
+
]
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
// src/blocks/Testimonials.ts
|
|
466
|
+
var TestimonialsBlock = {
|
|
467
|
+
slug: "testimonials",
|
|
468
|
+
imageURL: "/images/project-after-2.svg",
|
|
469
|
+
imageAltText: "Testimonials section preview",
|
|
470
|
+
admin: {
|
|
471
|
+
components: {
|
|
472
|
+
Label: builderBlockLabelComponent
|
|
473
|
+
}
|
|
474
|
+
},
|
|
475
|
+
labels: {
|
|
476
|
+
singular: "Testimonials",
|
|
477
|
+
plural: "Testimonials"
|
|
478
|
+
},
|
|
479
|
+
fields: [
|
|
480
|
+
{
|
|
481
|
+
name: "title",
|
|
482
|
+
type: "text",
|
|
483
|
+
required: true
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
name: "items",
|
|
487
|
+
type: "array",
|
|
488
|
+
minRows: 1,
|
|
489
|
+
maxRows: 6,
|
|
490
|
+
fields: [
|
|
491
|
+
{
|
|
492
|
+
name: "quote",
|
|
493
|
+
type: "textarea",
|
|
494
|
+
required: true
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
name: "name",
|
|
498
|
+
type: "text",
|
|
499
|
+
required: true
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
name: "location",
|
|
503
|
+
type: "text"
|
|
504
|
+
}
|
|
505
|
+
]
|
|
506
|
+
}
|
|
507
|
+
]
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
// src/components/BuilderBlockLabel.tsx
|
|
511
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
512
|
+
var blockTitles = {
|
|
513
|
+
bookingEmbed: "Booking Embed",
|
|
514
|
+
cta: "Call to Action",
|
|
515
|
+
faq: "FAQ",
|
|
516
|
+
featureGrid: "Feature Grid",
|
|
517
|
+
formEmbed: "Form Embed",
|
|
518
|
+
hero: "Hero",
|
|
519
|
+
media: "Media",
|
|
520
|
+
richText: "Rich Text",
|
|
521
|
+
testimonials: "Testimonials"
|
|
522
|
+
};
|
|
523
|
+
var blockEmojis = {
|
|
524
|
+
bookingEmbed: "Calendar",
|
|
525
|
+
cta: "Action",
|
|
526
|
+
faq: "FAQ",
|
|
527
|
+
featureGrid: "Grid",
|
|
528
|
+
formEmbed: "Form",
|
|
529
|
+
hero: "Hero",
|
|
530
|
+
media: "Media",
|
|
531
|
+
richText: "Text",
|
|
532
|
+
testimonials: "Reviews"
|
|
533
|
+
};
|
|
534
|
+
function BuilderBlockLabel({ blockType, rowLabel, rowNumber }) {
|
|
535
|
+
const fallbackTitle = blockTitles[blockType] || blockType;
|
|
536
|
+
const title = rowLabel && rowLabel.trim().length > 0 ? rowLabel : fallbackTitle;
|
|
537
|
+
const tag = blockEmojis[blockType] || "Section";
|
|
538
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { alignItems: "center", display: "flex", gap: 8 }, children: [
|
|
539
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
540
|
+
"span",
|
|
541
|
+
{
|
|
542
|
+
style: {
|
|
543
|
+
background: "var(--theme-elevation-100)",
|
|
544
|
+
border: "1px solid var(--theme-elevation-200)",
|
|
545
|
+
borderRadius: 999,
|
|
546
|
+
color: "var(--theme-text-muted)",
|
|
547
|
+
fontSize: 11,
|
|
548
|
+
fontWeight: 700,
|
|
549
|
+
padding: "2px 8px"
|
|
550
|
+
},
|
|
551
|
+
children: tag
|
|
552
|
+
}
|
|
553
|
+
),
|
|
554
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { fontWeight: 700 }, children: [
|
|
555
|
+
typeof rowNumber === "number" ? `${rowNumber + 1}. ` : "",
|
|
556
|
+
title
|
|
557
|
+
] })
|
|
558
|
+
] });
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// src/presets/index.ts
|
|
562
|
+
var sectionPresets = [
|
|
563
|
+
{
|
|
564
|
+
id: "hero-conversion",
|
|
565
|
+
title: "Hero + Conversion CTA",
|
|
566
|
+
description: "Lead section with headline and primary conversion strip.",
|
|
567
|
+
blocks: [
|
|
568
|
+
{
|
|
569
|
+
blockType: "hero",
|
|
570
|
+
kicker: "Licensed + Insured",
|
|
571
|
+
headline: "Expert Tree Care for Central Texas",
|
|
572
|
+
subheadline: "Reliable trimming, safe removals, and stump grinding for residential and commercial properties.",
|
|
573
|
+
primaryLabel: "Get Your Free Quote",
|
|
574
|
+
primaryHref: "/contact",
|
|
575
|
+
secondaryLabel: "See Our Work",
|
|
576
|
+
secondaryHref: "/portfolio"
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
blockType: "cta",
|
|
580
|
+
headline: "Need a quote this week?",
|
|
581
|
+
description: "Call (512) 555-0149 or request an on-site estimate online.",
|
|
582
|
+
buttonLabel: "Contact Us",
|
|
583
|
+
buttonHref: "/contact",
|
|
584
|
+
style: "light"
|
|
585
|
+
}
|
|
586
|
+
]
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
id: "services-grid",
|
|
590
|
+
title: "Services Grid",
|
|
591
|
+
description: "Three-card services section for fast offer communication.",
|
|
592
|
+
blocks: [
|
|
593
|
+
{
|
|
594
|
+
blockType: "featureGrid",
|
|
595
|
+
title: "Our Services",
|
|
596
|
+
variant: "cards",
|
|
597
|
+
items: [
|
|
598
|
+
{
|
|
599
|
+
title: "Tree Trimming & Pruning",
|
|
600
|
+
description: "Canopy balancing, deadwood removal, and seasonal pruning.",
|
|
601
|
+
icon: "Trim"
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
title: "Safe Tree Removal",
|
|
605
|
+
description: "Controlled removal for hazardous or unstable trees.",
|
|
606
|
+
icon: "Remove"
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
title: "Stump Grinding",
|
|
610
|
+
description: "Below-grade stump grinding and cleanup.",
|
|
611
|
+
icon: "Stump"
|
|
612
|
+
}
|
|
613
|
+
]
|
|
614
|
+
}
|
|
615
|
+
]
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
id: "social-proof",
|
|
619
|
+
title: "Testimonials + FAQ",
|
|
620
|
+
description: "Trust-building section with reviews and common questions.",
|
|
621
|
+
blocks: [
|
|
622
|
+
{
|
|
623
|
+
blockType: "testimonials",
|
|
624
|
+
title: "What Homeowners Say",
|
|
625
|
+
items: [
|
|
626
|
+
{
|
|
627
|
+
quote: "Great communication, fair pricing, and the cleanup was perfect. We will use them again.",
|
|
628
|
+
name: "Katie M.",
|
|
629
|
+
location: "Austin, TX"
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
quote: "They removed a dangerous limb over our driveway quickly and safely.",
|
|
633
|
+
name: "James R.",
|
|
634
|
+
location: "Round Rock, TX"
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
blockType: "faq",
|
|
640
|
+
title: "Common Questions",
|
|
641
|
+
items: [
|
|
642
|
+
{
|
|
643
|
+
question: "How quickly can you schedule service?",
|
|
644
|
+
answer: "Most estimate requests are scheduled within 24 hours."
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
question: "Do you provide cleanup?",
|
|
648
|
+
answer: "Yes. Debris haul-off and cleanup are included in quoted scopes."
|
|
649
|
+
}
|
|
650
|
+
]
|
|
651
|
+
}
|
|
652
|
+
]
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
id: "lead-capture",
|
|
656
|
+
title: "Lead Capture",
|
|
657
|
+
description: "Quote form and consultation CTA for conversion pages.",
|
|
658
|
+
blocks: [
|
|
659
|
+
{
|
|
660
|
+
blockType: "formEmbed",
|
|
661
|
+
title: "Request a Quote",
|
|
662
|
+
description: "Share your project details and we will follow up quickly.",
|
|
663
|
+
formType: "quote"
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
blockType: "bookingEmbed",
|
|
667
|
+
title: "Prefer to book a consultation?",
|
|
668
|
+
description: "Choose a time window and we will confirm availability.",
|
|
669
|
+
buttonLabel: "Book Consultation",
|
|
670
|
+
buttonHref: "/contact"
|
|
671
|
+
}
|
|
672
|
+
]
|
|
673
|
+
}
|
|
674
|
+
];
|
|
675
|
+
var templateStarterPresets = {
|
|
676
|
+
contact: [
|
|
677
|
+
{
|
|
678
|
+
blockType: "hero",
|
|
679
|
+
headline: "Contact Us",
|
|
680
|
+
subheadline: "Request a quote, ask a question, or book a consultation window.",
|
|
681
|
+
primaryLabel: "Call (512) 555-0149",
|
|
682
|
+
primaryHref: "tel:+15125550149"
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
blockType: "formEmbed",
|
|
686
|
+
title: "Request a Quote",
|
|
687
|
+
description: "Tell us about your project and we will follow up quickly.",
|
|
688
|
+
formType: "quote"
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
blockType: "faq",
|
|
692
|
+
title: "Common Questions",
|
|
693
|
+
items: [
|
|
694
|
+
{
|
|
695
|
+
question: "How quickly can you provide an estimate?",
|
|
696
|
+
answer: "Most estimates are scheduled within 24 hours."
|
|
697
|
+
}
|
|
698
|
+
]
|
|
699
|
+
}
|
|
700
|
+
],
|
|
701
|
+
landing: [
|
|
702
|
+
{
|
|
703
|
+
blockType: "hero",
|
|
704
|
+
kicker: "Locally Owned",
|
|
705
|
+
headline: "Expert Tree Care for Central Texas",
|
|
706
|
+
subheadline: "Premium trimming, removal, and cleanup with safety-first execution.",
|
|
707
|
+
primaryLabel: "Get Your Free Quote",
|
|
708
|
+
primaryHref: "/contact",
|
|
709
|
+
secondaryLabel: "View Services",
|
|
710
|
+
secondaryHref: "/services"
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
blockType: "featureGrid",
|
|
714
|
+
title: "Why Homeowners Choose Us",
|
|
715
|
+
variant: "highlight",
|
|
716
|
+
items: [
|
|
717
|
+
{ title: "Transparent Pricing", description: "Clear written estimates.", icon: "01" },
|
|
718
|
+
{ title: "Safety-First Crew", description: "Property protection and planning.", icon: "02" },
|
|
719
|
+
{ title: "Fast Scheduling", description: "Quick estimates and service windows.", icon: "03" }
|
|
720
|
+
]
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
blockType: "cta",
|
|
724
|
+
headline: "Need a quote this week?",
|
|
725
|
+
description: "Call (512) 555-0149 or request an estimate online.",
|
|
726
|
+
buttonLabel: "Contact Us",
|
|
727
|
+
buttonHref: "/contact",
|
|
728
|
+
style: "light"
|
|
729
|
+
}
|
|
730
|
+
],
|
|
731
|
+
services: [
|
|
732
|
+
{
|
|
733
|
+
blockType: "hero",
|
|
734
|
+
headline: "Tree Services Built for Safety and Curb Appeal",
|
|
735
|
+
subheadline: "Core offerings first, with clear scopes and scheduling.",
|
|
736
|
+
primaryLabel: "Schedule Estimate",
|
|
737
|
+
primaryHref: "/contact"
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
blockType: "featureGrid",
|
|
741
|
+
title: "Core Services",
|
|
742
|
+
variant: "cards",
|
|
743
|
+
items: [
|
|
744
|
+
{
|
|
745
|
+
title: "Tree Trimming & Pruning",
|
|
746
|
+
description: "Selective pruning for structure, clearance, and health.",
|
|
747
|
+
icon: "Trim"
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
title: "Tree Removal",
|
|
751
|
+
description: "Controlled removal for unstable or hazardous trees.",
|
|
752
|
+
icon: "Remove"
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
title: "Stump Grinding",
|
|
756
|
+
description: "Below-grade grinding and cleanup.",
|
|
757
|
+
icon: "Stump"
|
|
758
|
+
}
|
|
759
|
+
]
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
blockType: "faq",
|
|
763
|
+
title: "Frequently Asked Questions",
|
|
764
|
+
items: [
|
|
765
|
+
{
|
|
766
|
+
question: "Do you handle storm cleanup?",
|
|
767
|
+
answer: "Yes. We prioritize urgent hazards after severe weather."
|
|
768
|
+
}
|
|
769
|
+
]
|
|
770
|
+
}
|
|
771
|
+
],
|
|
772
|
+
standard: [
|
|
773
|
+
{
|
|
774
|
+
blockType: "hero",
|
|
775
|
+
headline: "Page Headline",
|
|
776
|
+
subheadline: "Use this page to communicate your primary message clearly."
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
blockType: "richText",
|
|
780
|
+
title: "Section Heading",
|
|
781
|
+
width: "normal",
|
|
782
|
+
content: {
|
|
783
|
+
root: {
|
|
784
|
+
children: [
|
|
785
|
+
{
|
|
786
|
+
children: [{ detail: 0, format: 0, mode: "normal", style: "", text: "", type: "text", version: 1 }],
|
|
787
|
+
direction: "ltr",
|
|
788
|
+
format: "",
|
|
789
|
+
indent: 0,
|
|
790
|
+
type: "paragraph",
|
|
791
|
+
version: 1
|
|
792
|
+
}
|
|
793
|
+
],
|
|
794
|
+
direction: "ltr",
|
|
795
|
+
format: "",
|
|
796
|
+
indent: 0,
|
|
797
|
+
type: "root",
|
|
798
|
+
version: 1
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
blockType: "cta",
|
|
804
|
+
headline: "Ready to take the next step?",
|
|
805
|
+
buttonLabel: "Contact Us",
|
|
806
|
+
buttonHref: "/contact",
|
|
807
|
+
style: "light"
|
|
808
|
+
}
|
|
809
|
+
]
|
|
810
|
+
};
|
|
811
|
+
function clonePresetBlocks(blocks) {
|
|
812
|
+
return JSON.parse(JSON.stringify(blocks));
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
// src/index.ts
|
|
816
|
+
var defaultPageLayoutBlocks = [
|
|
817
|
+
HeroBlock,
|
|
818
|
+
RichTextBlock,
|
|
819
|
+
FeatureGridBlock,
|
|
820
|
+
MediaBlock,
|
|
821
|
+
TestimonialsBlock,
|
|
822
|
+
FaqBlock,
|
|
823
|
+
FormEmbedBlock,
|
|
824
|
+
BookingEmbedBlock,
|
|
825
|
+
CtaBlock
|
|
826
|
+
];
|
|
827
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
828
|
+
0 && (module.exports = {
|
|
829
|
+
BookingEmbedBlock,
|
|
830
|
+
BuilderBlockLabel,
|
|
831
|
+
CtaBlock,
|
|
832
|
+
FaqBlock,
|
|
833
|
+
FeatureGridBlock,
|
|
834
|
+
FormEmbedBlock,
|
|
835
|
+
HeroBlock,
|
|
836
|
+
MediaBlock,
|
|
837
|
+
RichTextBlock,
|
|
838
|
+
TestimonialsBlock,
|
|
839
|
+
builderBlockLabelComponent,
|
|
840
|
+
clonePresetBlocks,
|
|
841
|
+
defaultPageLayoutBlocks,
|
|
842
|
+
sectionPresets,
|
|
843
|
+
templateStarterPresets
|
|
844
|
+
});
|