@orion-studios/payload-studio 0.5.0-beta.7 → 0.5.0-beta.70

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 (67) hide show
  1. package/README.md +20 -0
  2. package/dist/admin/client.d.mts +2 -0
  3. package/dist/admin/client.d.ts +2 -0
  4. package/dist/admin/client.js +779 -137
  5. package/dist/admin/client.mjs +769 -129
  6. package/dist/admin/index.d.mts +1 -1
  7. package/dist/admin/index.d.ts +1 -1
  8. package/dist/admin/index.js +100 -8
  9. package/dist/admin/index.mjs +3 -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 +1262 -3
  13. package/dist/admin-app/client.mjs +1164 -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 +229 -0
  19. package/dist/blocks/index.js +633 -8
  20. package/dist/blocks/index.mjs +2 -2
  21. package/dist/{chunk-ZLLNO5FM.mjs → chunk-CKX5Y2HU.mjs} +44 -13
  22. package/dist/{chunk-J7W5EE3B.mjs → chunk-HCEPGEAI.mjs} +100 -8
  23. package/dist/chunk-HXGAG6I7.mjs +325 -0
  24. package/dist/chunk-ROTPP5CU.mjs +99 -0
  25. package/dist/{chunk-ETRRXURT.mjs → chunk-SIL2J5MF.mjs} +14 -0
  26. package/dist/chunk-VDGSMD6H.mjs +1072 -0
  27. package/dist/{chunk-PC5622T7.mjs → chunk-XK3K5GRP.mjs} +620 -9
  28. package/dist/chunk-XVH5SCBD.mjs +234 -0
  29. package/dist/{index-CmR6NInu.d.ts → index-BIwu3qIH.d.mts} +29 -3
  30. package/dist/{index-CmR6NInu.d.mts → index-BIwu3qIH.d.ts} +29 -3
  31. package/dist/index-CdnUNrvX.d.mts +134 -0
  32. package/dist/{index-DbH0Ljwp.d.ts → index-CpG3UHcS.d.mts} +1 -0
  33. package/dist/{index-DbH0Ljwp.d.mts → index-CpG3UHcS.d.ts} +1 -0
  34. package/dist/index-DyHbWliW.d.ts +134 -0
  35. package/dist/index-ZbOx4OCF.d.mts +128 -0
  36. package/dist/index-ZbOx4OCF.d.ts +128 -0
  37. package/dist/{index-DJFhANvJ.d.mts → index-cDYkEj29.d.mts} +20 -2
  38. package/dist/{index-DJFhANvJ.d.ts → index-cDYkEj29.d.ts} +20 -2
  39. package/dist/index.d.mts +5 -5
  40. package/dist/index.d.ts +5 -5
  41. package/dist/index.js +2145 -305
  42. package/dist/index.mjs +9 -9
  43. package/dist/nextjs/index.d.mts +1 -1
  44. package/dist/nextjs/index.d.ts +1 -1
  45. package/dist/nextjs/index.js +996 -13
  46. package/dist/nextjs/index.mjs +4 -1
  47. package/dist/studio/index.d.mts +2 -1
  48. package/dist/studio/index.d.ts +2 -1
  49. package/dist/studio/index.js +171 -2
  50. package/dist/studio/index.mjs +7 -3
  51. package/dist/studio-pages/builder.css +358 -8
  52. package/dist/studio-pages/client.d.mts +17 -0
  53. package/dist/studio-pages/client.d.ts +17 -0
  54. package/dist/studio-pages/client.js +5657 -1478
  55. package/dist/studio-pages/client.mjs +5549 -1461
  56. package/dist/studio-pages/index.d.mts +3 -2
  57. package/dist/studio-pages/index.d.ts +3 -2
  58. package/dist/studio-pages/index.js +799 -29
  59. package/dist/studio-pages/index.mjs +6 -2
  60. package/package.json +26 -12
  61. package/dist/chunk-AAOHJDNS.mjs +0 -67
  62. package/dist/chunk-N67KVM2S.mjs +0 -156
  63. package/dist/chunk-UJFU323N.mjs +0 -301
  64. package/dist/index-B9N5MyjF.d.mts +0 -39
  65. package/dist/index-BallJs-K.d.mts +0 -43
  66. package/dist/index-BallJs-K.d.ts +0 -43
  67. package/dist/index-g8tBHLKD.d.ts +0 -39
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sectionStyleFields
3
- } from "./chunk-ETRRXURT.mjs";
3
+ } from "./chunk-SIL2J5MF.mjs";
4
4
  import {
5
5
  __export
6
6
  } from "./chunk-6BWS3CLP.mjs";
@@ -58,11 +58,22 @@ var BeforeAfterBlock = {
58
58
  name: "subtitle",
59
59
  type: "textarea"
60
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
+ },
61
72
  {
62
73
  name: "items",
63
74
  type: "array",
64
75
  minRows: 1,
65
- maxRows: 6,
76
+ maxRows: 30,
66
77
  fields: [
67
78
  {
68
79
  name: "label",
@@ -81,12 +92,88 @@ var BeforeAfterBlock = {
81
92
  relationTo: "media",
82
93
  required: false
83
94
  },
95
+ {
96
+ name: "imageHeight",
97
+ type: "number",
98
+ defaultValue: 160,
99
+ min: 60,
100
+ max: 600,
101
+ admin: {
102
+ description: "Overrides the before/after image height (in pixels).",
103
+ step: 10
104
+ }
105
+ },
106
+ {
107
+ name: "imageFit",
108
+ type: "select",
109
+ defaultValue: "cover",
110
+ options: [
111
+ { label: "Cover", value: "cover" },
112
+ { label: "Contain", value: "contain" }
113
+ ]
114
+ },
115
+ {
116
+ name: "imageCornerStyle",
117
+ type: "select",
118
+ defaultValue: "rounded",
119
+ options: [
120
+ { label: "Rounded", value: "rounded" },
121
+ { label: "Square", value: "square" }
122
+ ]
123
+ },
124
+ {
125
+ name: "imagePosition",
126
+ type: "select",
127
+ defaultValue: "center",
128
+ options: [
129
+ { label: "Center", value: "center" },
130
+ { label: "Top", value: "top" },
131
+ { label: "Bottom", value: "bottom" },
132
+ { label: "Left", value: "left" },
133
+ { label: "Right", value: "right" }
134
+ ]
135
+ },
136
+ {
137
+ name: "imagePositionX",
138
+ type: "number",
139
+ min: 0,
140
+ max: 100,
141
+ admin: {
142
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
143
+ step: 1
144
+ }
145
+ },
146
+ {
147
+ name: "imagePositionY",
148
+ type: "number",
149
+ min: 0,
150
+ max: 100,
151
+ admin: {
152
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
153
+ step: 1
154
+ }
155
+ },
84
156
  {
85
157
  name: "description",
86
158
  type: "textarea"
159
+ },
160
+ {
161
+ name: "settings",
162
+ type: "json",
163
+ admin: {
164
+ hidden: true
165
+ }
87
166
  }
88
167
  ]
89
168
  },
169
+ {
170
+ name: "settings",
171
+ type: "json",
172
+ admin: {
173
+ description: "Internal builder settings schema v2.",
174
+ hidden: true
175
+ }
176
+ },
90
177
  ...sectionStyleFields()
91
178
  ]
92
179
  };
@@ -124,6 +211,14 @@ var BookingEmbedBlock = {
124
211
  type: "text",
125
212
  defaultValue: "/contact"
126
213
  },
214
+ {
215
+ name: "settings",
216
+ type: "json",
217
+ admin: {
218
+ description: "Internal builder settings schema v2.",
219
+ hidden: true
220
+ }
221
+ },
127
222
  ...sectionStyleFields()
128
223
  ]
129
224
  };
@@ -185,6 +280,14 @@ var CtaBlock = {
185
280
  description: "Optional background color override for the CTA strip (example: #124a37)."
186
281
  }
187
282
  },
283
+ {
284
+ name: "settings",
285
+ type: "json",
286
+ admin: {
287
+ description: "Internal builder settings schema v2.",
288
+ hidden: true
289
+ }
290
+ },
188
291
  ...sectionStyleFields()
189
292
  ]
190
293
  };
@@ -224,9 +327,24 @@ var FaqBlock = {
224
327
  name: "answer",
225
328
  type: "textarea",
226
329
  required: true
330
+ },
331
+ {
332
+ name: "settings",
333
+ type: "json",
334
+ admin: {
335
+ hidden: true
336
+ }
227
337
  }
228
338
  ]
229
339
  },
340
+ {
341
+ name: "settings",
342
+ type: "json",
343
+ admin: {
344
+ description: "Internal builder settings schema v2.",
345
+ hidden: true
346
+ }
347
+ },
230
348
  ...sectionStyleFields()
231
349
  ]
232
350
  };
@@ -251,6 +369,17 @@ var FeatureGridBlock = {
251
369
  type: "text",
252
370
  required: true
253
371
  },
372
+ {
373
+ name: "itemsPerRow",
374
+ type: "number",
375
+ defaultValue: 3,
376
+ min: 1,
377
+ max: 6,
378
+ admin: {
379
+ description: "How many items to show per row on desktop.",
380
+ step: 1
381
+ }
382
+ },
254
383
  {
255
384
  name: "items",
256
385
  type: "array",
@@ -266,11 +395,43 @@ var FeatureGridBlock = {
266
395
  name: "description",
267
396
  type: "textarea"
268
397
  },
398
+ {
399
+ name: "iconType",
400
+ type: "select",
401
+ defaultValue: "badge",
402
+ options: [
403
+ { label: "Badge Text", value: "badge" },
404
+ { label: "Icon", value: "lucide" }
405
+ ],
406
+ admin: {
407
+ description: "Choose whether this item uses a short badge label or an icon."
408
+ }
409
+ },
269
410
  {
270
411
  name: "icon",
271
412
  type: "text",
272
413
  admin: {
273
- description: 'Optional short icon label (e.g. "01", "Leaf", "Star").'
414
+ description: 'Optional short icon label (e.g. "01", "Leaf", "Star").',
415
+ condition: (_, siblingData) => siblingData?.iconType !== "lucide"
416
+ }
417
+ },
418
+ {
419
+ name: "iconLucide",
420
+ type: "select",
421
+ options: [
422
+ { label: "Shield Check", value: "ShieldCheck" },
423
+ { label: "Clock", value: "Clock" },
424
+ { label: "Leaf", value: "Leaf" },
425
+ { label: "Dollar Sign", value: "DollarSign" },
426
+ { label: "Hard Hat", value: "HardHat" },
427
+ { label: "Sparkles", value: "Sparkles" },
428
+ { label: "Tree Pine", value: "TreePine" },
429
+ { label: "Badge Check", value: "BadgeCheck" },
430
+ { label: "Calendar Clock", value: "CalendarClock" }
431
+ ],
432
+ admin: {
433
+ description: "Select an icon for this item.",
434
+ condition: (_, siblingData) => siblingData?.iconType === "lucide"
274
435
  }
275
436
  },
276
437
  {
@@ -278,6 +439,74 @@ var FeatureGridBlock = {
278
439
  type: "upload",
279
440
  relationTo: "media",
280
441
  required: false
442
+ },
443
+ {
444
+ name: "imageHeight",
445
+ type: "number",
446
+ defaultValue: 160,
447
+ min: 40,
448
+ max: 600,
449
+ admin: {
450
+ description: "Overrides the image height in the builder/section (in pixels).",
451
+ step: 10
452
+ }
453
+ },
454
+ {
455
+ name: "imageFit",
456
+ type: "select",
457
+ defaultValue: "cover",
458
+ options: [
459
+ { label: "Cover", value: "cover" },
460
+ { label: "Contain", value: "contain" }
461
+ ]
462
+ },
463
+ {
464
+ name: "imageCornerStyle",
465
+ type: "select",
466
+ defaultValue: "rounded",
467
+ options: [
468
+ { label: "Rounded", value: "rounded" },
469
+ { label: "Square", value: "square" }
470
+ ]
471
+ },
472
+ {
473
+ name: "imagePosition",
474
+ type: "select",
475
+ defaultValue: "center",
476
+ options: [
477
+ { label: "Center", value: "center" },
478
+ { label: "Top", value: "top" },
479
+ { label: "Bottom", value: "bottom" },
480
+ { label: "Left", value: "left" },
481
+ { label: "Right", value: "right" }
482
+ ]
483
+ },
484
+ {
485
+ name: "imagePositionX",
486
+ type: "number",
487
+ min: 0,
488
+ max: 100,
489
+ admin: {
490
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
491
+ step: 1
492
+ }
493
+ },
494
+ {
495
+ name: "imagePositionY",
496
+ type: "number",
497
+ min: 0,
498
+ max: 100,
499
+ admin: {
500
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
501
+ step: 1
502
+ }
503
+ },
504
+ {
505
+ name: "settings",
506
+ type: "json",
507
+ admin: {
508
+ hidden: true
509
+ }
281
510
  }
282
511
  ]
283
512
  },
@@ -303,6 +532,14 @@ var FeatureGridBlock = {
303
532
  description: "Optional background color override when using the Highlight variant (example: #1f684f)."
304
533
  }
305
534
  },
535
+ {
536
+ name: "settings",
537
+ type: "json",
538
+ admin: {
539
+ description: "Internal builder settings schema v2.",
540
+ hidden: true
541
+ }
542
+ },
306
543
  ...sectionStyleFields()
307
544
  ]
308
545
  };
@@ -341,6 +578,14 @@ var FormEmbedBlock = {
341
578
  }
342
579
  ]
343
580
  },
581
+ {
582
+ name: "settings",
583
+ type: "json",
584
+ admin: {
585
+ description: "Internal builder settings schema v2.",
586
+ hidden: true
587
+ }
588
+ },
344
589
  ...sectionStyleFields()
345
590
  ]
346
591
  };
@@ -404,10 +649,44 @@ var HeroBlock = {
404
649
  relationTo: "media"
405
650
  },
406
651
  {
407
- name: "backgroundImageURL",
408
- type: "text",
652
+ name: "backgroundImageFit",
653
+ type: "select",
654
+ defaultValue: "cover",
655
+ options: [
656
+ { label: "Cover", value: "cover" },
657
+ { label: "Cover (Square)", value: "cover-square" },
658
+ { label: "Contain", value: "contain" },
659
+ { label: "Contain (Square)", value: "contain-square" }
660
+ ],
409
661
  admin: {
410
- description: "Optional external/background image URL override for this hero section."
662
+ description: "How the hero image should be sized within the section."
663
+ }
664
+ },
665
+ {
666
+ name: "backgroundImageCornerStyle",
667
+ type: "select",
668
+ defaultValue: "rounded",
669
+ options: [
670
+ { label: "Rounded", value: "rounded" },
671
+ { label: "Square", value: "square" }
672
+ ],
673
+ admin: {
674
+ description: "How the hero image corners should appear."
675
+ }
676
+ },
677
+ {
678
+ name: "backgroundImagePosition",
679
+ type: "select",
680
+ defaultValue: "center",
681
+ options: [
682
+ { label: "Center", value: "center" },
683
+ { label: "Top", value: "top" },
684
+ { label: "Bottom", value: "bottom" },
685
+ { label: "Left", value: "left" },
686
+ { label: "Right", value: "right" }
687
+ ],
688
+ admin: {
689
+ description: "Where the hero image should anchor inside the section."
411
690
  }
412
691
  },
413
692
  {
@@ -417,6 +696,113 @@ var HeroBlock = {
417
696
  description: "Optional background color override (example: #124a37)."
418
697
  }
419
698
  },
699
+ {
700
+ name: "backgroundOverlayMode",
701
+ type: "select",
702
+ defaultValue: "none",
703
+ options: [
704
+ { label: "None", value: "none" },
705
+ { label: "Solid", value: "solid" },
706
+ { label: "Gradient", value: "gradient" }
707
+ ],
708
+ admin: {
709
+ description: "Optional overlay on top of the hero image (applies when an image is present)."
710
+ }
711
+ },
712
+ {
713
+ name: "backgroundOverlayOpacity",
714
+ type: "number",
715
+ defaultValue: 45,
716
+ min: 0,
717
+ max: 100,
718
+ admin: {
719
+ description: "Overlay opacity (0-100).",
720
+ step: 1
721
+ }
722
+ },
723
+ {
724
+ name: "backgroundOverlayColor",
725
+ type: "text",
726
+ admin: {
727
+ description: "Overlay solid color (example: #000000). Used when Overlay Mode is Solid."
728
+ }
729
+ },
730
+ {
731
+ name: "backgroundOverlayGradientFrom",
732
+ type: "text",
733
+ admin: {
734
+ description: "Gradient overlay start color (example: #0d4a37). Used when Overlay Mode is Gradient."
735
+ }
736
+ },
737
+ {
738
+ name: "backgroundOverlayGradientTo",
739
+ type: "text",
740
+ admin: {
741
+ description: "Gradient overlay end color (example: #1f684f). Used when Overlay Mode is Gradient."
742
+ }
743
+ },
744
+ {
745
+ name: "backgroundOverlayGradientAngle",
746
+ type: "text",
747
+ admin: {
748
+ description: "Gradient overlay angle in degrees (0-360). Used when Overlay Mode is Gradient."
749
+ }
750
+ },
751
+ {
752
+ name: "backgroundOverlayGradientFromStrength",
753
+ type: "number",
754
+ defaultValue: 100,
755
+ min: 0,
756
+ max: 100,
757
+ admin: {
758
+ description: "Gradient start strength (0-100). Set to 0 for transparent.",
759
+ step: 1
760
+ }
761
+ },
762
+ {
763
+ name: "backgroundOverlayGradientToStrength",
764
+ type: "number",
765
+ defaultValue: 100,
766
+ min: 0,
767
+ max: 100,
768
+ admin: {
769
+ description: "Gradient end strength (0-100). Set to 0 for transparent.",
770
+ step: 1
771
+ }
772
+ },
773
+ {
774
+ name: "backgroundOverlayGradientStart",
775
+ type: "number",
776
+ defaultValue: 0,
777
+ min: 0,
778
+ max: 100,
779
+ admin: {
780
+ description: "Where the gradient starts (0-100).",
781
+ step: 1
782
+ }
783
+ },
784
+ {
785
+ name: "backgroundOverlayGradientEnd",
786
+ type: "number",
787
+ defaultValue: 100,
788
+ min: 0,
789
+ max: 100,
790
+ admin: {
791
+ description: "Where the gradient ends (0-100).",
792
+ step: 1
793
+ }
794
+ },
795
+ {
796
+ name: "backgroundOverlayGradientFeather",
797
+ type: "number",
798
+ defaultValue: 100,
799
+ min: 0,
800
+ max: 100,
801
+ admin: {
802
+ description: "How soft the transition is (0 = hard edge, 100 = smooth).",
803
+ step: 1
804
+ }
805
+ },
420
806
  {
421
807
  name: "variant",
422
808
  type: "select",
@@ -432,6 +818,36 @@ var HeroBlock = {
432
818
  }
433
819
  ]
434
820
  },
821
+ {
822
+ name: "heroHeight",
823
+ type: "select",
824
+ defaultValue: "sm",
825
+ options: [
826
+ {
827
+ label: "Small",
828
+ value: "sm"
829
+ },
830
+ {
831
+ label: "Medium (Half Screen)",
832
+ value: "md"
833
+ },
834
+ {
835
+ label: "Full Screen",
836
+ value: "full"
837
+ }
838
+ ],
839
+ admin: {
840
+ description: "Controls the vertical height of the hero section."
841
+ }
842
+ },
843
+ {
844
+ name: "settings",
845
+ type: "json",
846
+ admin: {
847
+ description: "Internal builder settings schema v2.",
848
+ hidden: true
849
+ }
850
+ },
435
851
  ...sectionStyleFields()
436
852
  ]
437
853
  };
@@ -477,12 +893,88 @@ var LogoWallBlock = {
477
893
  relationTo: "media",
478
894
  required: false
479
895
  },
896
+ {
897
+ name: "imageHeight",
898
+ type: "number",
899
+ defaultValue: 64,
900
+ min: 24,
901
+ max: 200,
902
+ admin: {
903
+ description: "Overrides the logo image height (in pixels).",
904
+ step: 4
905
+ }
906
+ },
907
+ {
908
+ name: "imageFit",
909
+ type: "select",
910
+ defaultValue: "contain",
911
+ options: [
912
+ { label: "Cover", value: "cover" },
913
+ { label: "Contain", value: "contain" }
914
+ ]
915
+ },
916
+ {
917
+ name: "imageCornerStyle",
918
+ type: "select",
919
+ defaultValue: "rounded",
920
+ options: [
921
+ { label: "Rounded", value: "rounded" },
922
+ { label: "Square", value: "square" }
923
+ ]
924
+ },
925
+ {
926
+ name: "imagePosition",
927
+ type: "select",
928
+ defaultValue: "center",
929
+ options: [
930
+ { label: "Center", value: "center" },
931
+ { label: "Top", value: "top" },
932
+ { label: "Bottom", value: "bottom" },
933
+ { label: "Left", value: "left" },
934
+ { label: "Right", value: "right" }
935
+ ]
936
+ },
937
+ {
938
+ name: "imagePositionX",
939
+ type: "number",
940
+ min: 0,
941
+ max: 100,
942
+ admin: {
943
+ description: "Optional custom horizontal focus (0-100). Overrides Image Position when set.",
944
+ step: 1
945
+ }
946
+ },
947
+ {
948
+ name: "imagePositionY",
949
+ type: "number",
950
+ min: 0,
951
+ max: 100,
952
+ admin: {
953
+ description: "Optional custom vertical focus (0-100). Overrides Image Position when set.",
954
+ step: 1
955
+ }
956
+ },
480
957
  {
481
958
  name: "href",
482
959
  type: "text"
960
+ },
961
+ {
962
+ name: "settings",
963
+ type: "json",
964
+ admin: {
965
+ hidden: true
966
+ }
483
967
  }
484
968
  ]
485
969
  },
970
+ {
971
+ name: "settings",
972
+ type: "json",
973
+ admin: {
974
+ description: "Internal builder settings schema v2.",
975
+ hidden: true
976
+ }
977
+ },
486
978
  ...sectionStyleFields()
487
979
  ]
488
980
  };
@@ -527,6 +1019,44 @@ var MediaBlock = {
527
1019
  }
528
1020
  ]
529
1021
  },
1022
+ {
1023
+ name: "imageFit",
1024
+ type: "select",
1025
+ defaultValue: "cover",
1026
+ options: [
1027
+ { label: "Cover", value: "cover" },
1028
+ { label: "Contain", value: "contain" }
1029
+ ]
1030
+ },
1031
+ {
1032
+ name: "imageCornerStyle",
1033
+ type: "select",
1034
+ defaultValue: "rounded",
1035
+ options: [
1036
+ { label: "Rounded", value: "rounded" },
1037
+ { label: "Square", value: "square" }
1038
+ ]
1039
+ },
1040
+ {
1041
+ name: "imagePosition",
1042
+ type: "select",
1043
+ defaultValue: "center",
1044
+ options: [
1045
+ { label: "Center", value: "center" },
1046
+ { label: "Top", value: "top" },
1047
+ { label: "Bottom", value: "bottom" },
1048
+ { label: "Left", value: "left" },
1049
+ { label: "Right", value: "right" }
1050
+ ]
1051
+ },
1052
+ {
1053
+ name: "settings",
1054
+ type: "json",
1055
+ admin: {
1056
+ description: "Internal builder settings schema v2.",
1057
+ hidden: true
1058
+ }
1059
+ },
530
1060
  ...sectionStyleFields()
531
1061
  ]
532
1062
  };
@@ -570,6 +1100,14 @@ var RichTextBlock = {
570
1100
  }
571
1101
  ]
572
1102
  },
1103
+ {
1104
+ name: "settings",
1105
+ type: "json",
1106
+ admin: {
1107
+ description: "Internal builder settings schema v2.",
1108
+ hidden: true
1109
+ }
1110
+ },
573
1111
  ...sectionStyleFields()
574
1112
  ]
575
1113
  };
@@ -617,9 +1155,24 @@ var StatsBlock = {
617
1155
  {
618
1156
  name: "description",
619
1157
  type: "text"
1158
+ },
1159
+ {
1160
+ name: "settings",
1161
+ type: "json",
1162
+ admin: {
1163
+ hidden: true
1164
+ }
620
1165
  }
621
1166
  ]
622
1167
  },
1168
+ {
1169
+ name: "settings",
1170
+ type: "json",
1171
+ admin: {
1172
+ description: "Internal builder settings schema v2.",
1173
+ hidden: true
1174
+ }
1175
+ },
623
1176
  ...sectionStyleFields()
624
1177
  ]
625
1178
  };
@@ -644,11 +1197,41 @@ var TestimonialsBlock = {
644
1197
  type: "text",
645
1198
  required: true
646
1199
  },
1200
+ {
1201
+ name: "visibleCount",
1202
+ type: "number",
1203
+ defaultValue: 3,
1204
+ min: 1,
1205
+ max: 6,
1206
+ admin: {
1207
+ description: "How many testimonials to show at once.",
1208
+ step: 1
1209
+ }
1210
+ },
1211
+ {
1212
+ name: "autoRotate",
1213
+ type: "checkbox",
1214
+ defaultValue: true,
1215
+ admin: {
1216
+ description: "Automatically rotates through all testimonials."
1217
+ }
1218
+ },
1219
+ {
1220
+ name: "rotateIntervalSeconds",
1221
+ type: "number",
1222
+ defaultValue: 7,
1223
+ min: 2,
1224
+ max: 30,
1225
+ admin: {
1226
+ description: "How often to rotate (in seconds).",
1227
+ step: 1
1228
+ }
1229
+ },
647
1230
  {
648
1231
  name: "items",
649
1232
  type: "array",
650
1233
  minRows: 1,
651
- maxRows: 6,
1234
+ maxRows: 30,
652
1235
  fields: [
653
1236
  {
654
1237
  name: "quote",
@@ -663,9 +1246,35 @@ var TestimonialsBlock = {
663
1246
  {
664
1247
  name: "location",
665
1248
  type: "text"
1249
+ },
1250
+ {
1251
+ name: "rating",
1252
+ type: "number",
1253
+ defaultValue: 5,
1254
+ min: 1,
1255
+ max: 5,
1256
+ admin: {
1257
+ description: "Star rating (1-5).",
1258
+ step: 1
1259
+ }
1260
+ },
1261
+ {
1262
+ name: "settings",
1263
+ type: "json",
1264
+ admin: {
1265
+ hidden: true
1266
+ }
666
1267
  }
667
1268
  ]
668
1269
  },
1270
+ {
1271
+ name: "settings",
1272
+ type: "json",
1273
+ admin: {
1274
+ description: "Internal builder settings schema v2.",
1275
+ hidden: true
1276
+ }
1277
+ },
669
1278
  ...sectionStyleFields()
670
1279
  ]
671
1280
  };
@@ -789,12 +1398,14 @@ var sectionPresets = [
789
1398
  {
790
1399
  quote: "Great communication, fair pricing, and the cleanup was perfect. We will use them again.",
791
1400
  name: "Katie M.",
792
- location: "Austin, TX"
1401
+ location: "Austin, TX",
1402
+ rating: 5
793
1403
  },
794
1404
  {
795
1405
  quote: "They removed a dangerous limb over our driveway quickly and safely.",
796
1406
  name: "James R.",
797
- location: "Round Rock, TX"
1407
+ location: "Round Rock, TX",
1408
+ rating: 5
798
1409
  }
799
1410
  ]
800
1411
  },