@riverbankcms/sdk 0.76.0 → 0.77.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.
Files changed (144) hide show
  1. package/dist/{PreviewEditorSidebar-X2HWXFOL.mjs → PreviewEditorSidebar-XSX7QKHQ.mjs} +1019 -442
  2. package/dist/{PreviewEditorUI-AQXIXPOH.mjs → PreviewEditorUI-YZNEZ3QD.mjs} +2 -2
  3. package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +528 -20
  5. package/dist/_dts/api/src/contentRuntime.d.ts +5 -0
  6. package/dist/_dts/api/src/siteAssets.d.ts +1 -0
  7. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +26 -2
  8. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +28 -0
  9. package/dist/_dts/block-form/src/client/index.d.ts +2 -2
  10. package/dist/_dts/block-form/src/index.d.ts +2 -1
  11. package/dist/_dts/block-form/src/widgets/DateField/dateFieldSchema.d.ts +1 -1
  12. package/dist/_dts/block-form/src/widgets/DateTimeField/dateTimeFieldSchema.d.ts +1 -1
  13. package/dist/_dts/block-form/src/widgets/TimeField/timeFieldSchema.d.ts +1 -1
  14. package/dist/_dts/blocks/src/PageRenderer.d.ts +10 -10
  15. package/dist/_dts/blocks/src/client/site-chrome.d.ts +22 -0
  16. package/dist/_dts/blocks/src/customBlockRegistry.d.ts +38 -0
  17. package/dist/_dts/blocks/src/index.d.ts +2 -0
  18. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +20 -2
  19. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +25 -0
  20. package/dist/_dts/blocks/src/system/blocks/index.d.ts +2 -0
  21. package/dist/_dts/blocks/src/system/blocks/intro.d.ts +24 -0
  22. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -34
  23. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  24. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +30 -0
  25. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -1
  26. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +7 -0
  27. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +11 -2
  28. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  29. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.d.ts +2 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.server.d.ts +2 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/accordionIconTreatment.d.ts +5 -0
  32. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +1 -0
  33. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  34. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -0
  35. package/dist/_dts/content-editor/src/hooks/blockDraftLifecycle.d.ts +48 -0
  36. package/dist/_dts/content-editor/src/hooks/invalidBlockSelectors.d.ts +4 -0
  37. package/dist/_dts/content-editor/src/hooks/publishability.d.ts +47 -0
  38. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  39. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -0
  40. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +2 -1
  41. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -1
  42. package/dist/_dts/editor-blocks/src/block-editor/customBlockRegistry.d.ts +2 -0
  43. package/dist/_dts/editor-blocks/src/block-editor/sdkBlockMerger.d.ts +9 -37
  44. package/dist/_dts/editor-blocks/src/index.d.ts +2 -2
  45. package/dist/_dts/preview-next/src/client/index.d.ts +3 -0
  46. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +5 -1
  47. package/dist/_dts/preview-next/src/client/preview/PreviewDesignCoordinatorContext.d.ts +20 -0
  48. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +7 -2
  49. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +7 -2
  50. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  51. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -0
  52. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +20 -3
  53. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +6 -1
  54. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +14 -4
  55. package/dist/_dts/preview-next/src/client/preview/previewDesignCoordinator.d.ts +73 -0
  56. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +12 -4
  57. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +46 -0
  58. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +6 -1
  59. package/dist/_dts/preview-next/src/client/preview/typographySelectionInput.d.ts +14 -0
  60. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewModeRuntime.d.ts +1 -1
  61. package/dist/_dts/sdk/src/cli/commands/style.d.ts +8 -0
  62. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -1
  63. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  64. package/dist/_dts/sdk/src/client.d.ts +1 -1
  65. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +35 -0
  66. package/dist/_dts/sdk/src/index.d.ts +2 -1
  67. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -0
  68. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  69. package/dist/_dts/sdk/src/version.d.ts +1 -1
  70. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  71. package/dist/_dts/theme-core/src/buttons/personalities/earth-pill.d.ts +16 -0
  72. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  73. package/dist/_dts/theme-core/src/fonts/types.d.ts +1 -1
  74. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +45 -0
  75. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  76. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +16 -0
  77. package/dist/_dts/theme-core/src/schema.d.ts +280 -0
  78. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +81 -0
  79. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +6 -4
  80. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +81 -0
  81. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +118 -2
  82. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +13 -0
  83. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  84. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +364 -5
  85. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +6 -0
  86. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  87. package/dist/_dts/theme-core/src/site-styles/persistedIdParseResult.d.ts +9 -0
  88. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +20 -4
  89. package/dist/_dts/theme-core/src/site-styles/types.d.ts +74 -2
  90. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +189 -0
  91. package/dist/{chunk-Z7JLNTJR.mjs → chunk-6SMUFTXD.mjs} +2 -1
  92. package/dist/{chunk-V5VORNEJ.mjs → chunk-ANKDYZ2E.mjs} +1 -1
  93. package/dist/{chunk-Q4OLG66B.mjs → chunk-EAWHBECW.mjs} +476 -153
  94. package/dist/{chunk-TW2Y4RR5.mjs → chunk-GSQX43EZ.mjs} +383 -51
  95. package/dist/{chunk-LYI7TEMH.mjs → chunk-WLQBJN2Z.mjs} +3096 -354
  96. package/dist/cli/index.mjs +2023 -181
  97. package/dist/client/{accordion-2YHIBOZH.mjs → accordion-RZMQSYLR.mjs} +1 -1
  98. package/dist/client/{bookingForm-35IBDWAS.mjs → bookingForm-NF4ASVNV.mjs} +2 -2
  99. package/dist/client/bookings.mjs +92 -0
  100. package/dist/client/{carousel-K6XG7NZQ.mjs → carousel-LDX47ZIK.mjs} +1 -1
  101. package/dist/client/{cart-HCFYUTTU.mjs → cart-RGXDS5F4.mjs} +3 -3
  102. package/dist/client/{checkout-J3U4XR7K.mjs → checkout-P7WWSNNY.mjs} +3 -3
  103. package/dist/client/{chunk-BOIHIU7E.mjs → chunk-E2TDNXCL.mjs} +1 -1
  104. package/dist/client/{chunk-PFBX3IQL.mjs → chunk-GMVTOKYG.mjs} +2 -2
  105. package/dist/client/{chunk-FGUIVT2B.mjs → chunk-JNC7CGHX.mjs} +1 -1
  106. package/dist/client/{chunk-SNSWVZEP.mjs → chunk-L3DNHIJX.mjs} +3 -3
  107. package/dist/client/{chunk-7UOSCYY4.mjs → chunk-R56FQ3RR.mjs} +92 -0
  108. package/dist/client/{chunk-J227A3CQ.mjs → chunk-UFSWADAO.mjs} +1 -1
  109. package/dist/client/client.mjs +2134 -228
  110. package/dist/client/{courseRegistration-ZBXS7VGI.mjs → courseRegistration-7F65K5ZR.mjs} +2 -2
  111. package/dist/client/{eventCalendar-EQQZHJBA.mjs → eventCalendar-GLSC5KTL.mjs} +4 -4
  112. package/dist/client/{eventCombined-JCFTGBFQ.mjs → eventCombined-ZHK4WKUR.mjs} +4 -4
  113. package/dist/client/{eventDetails-HLUTQSYY.mjs → eventDetails-E3PJYBIN.mjs} +4 -4
  114. package/dist/client/{eventListing-FG4MICVB.mjs → eventListing-EMS3WC3E.mjs} +4 -4
  115. package/dist/client/{eventRegistration-GUEB7LBT.mjs → eventRegistration-NZOTVNPI.mjs} +4 -4
  116. package/dist/client/{form-YQEW4YIT.mjs → form-ETFZFATW.mjs} +1 -1
  117. package/dist/client/{headerSection-GTR3TTRM.mjs → headerSection-4LBP7ULT.mjs} +2 -2
  118. package/dist/client/hooks.mjs +1918 -293
  119. package/dist/client/{locationMap-SPC7VGUH.mjs → locationMap-5M655YSJ.mjs} +1 -1
  120. package/dist/client/{newsletterForm-4IW5BLID.mjs → newsletterForm-QOUYW44O.mjs} +1 -1
  121. package/dist/client/{productDetail-KP5H2WJO.mjs → productDetail-O4DOCWQG.mjs} +3 -3
  122. package/dist/client/{productList-3M3M72XZ.mjs → productList-A5RO5WIS.mjs} +3 -3
  123. package/dist/client/rendering/client.mjs +198 -32
  124. package/dist/client/rendering/islands.mjs +18 -18
  125. package/dist/client/rendering.mjs +2095 -208
  126. package/dist/client/{shop-ACQKVGOM.mjs → shop-L4MZH4I2.mjs} +3 -3
  127. package/dist/preview-next/client/runtime.mjs +4 -4
  128. package/dist/{sdk-runtime-K7HNB4U2.mjs → sdk-runtime-Q6MTR4KL.mjs} +5 -5
  129. package/dist/server/components.mjs +2046 -204
  130. package/dist/server/config-validation.mjs +1921 -293
  131. package/dist/server/config.mjs +1921 -293
  132. package/dist/server/data.mjs +1918 -293
  133. package/dist/server/index.mjs +31 -2
  134. package/dist/server/next.mjs +2067 -206
  135. package/dist/server/page-converter.mjs +1894 -281
  136. package/dist/server/prebuild.mjs +1 -1
  137. package/dist/server/rendering/server.mjs +2046 -204
  138. package/dist/server/rendering.mjs +2046 -204
  139. package/dist/server/routing.mjs +1963 -275
  140. package/dist/server/server.mjs +1932 -288
  141. package/dist/server/theme-bridge.mjs +158 -1
  142. package/dist/server/theme.mjs +158 -1
  143. package/package.json +1 -1
  144. package/dist/SdkPreviewModeRuntime-ZQNDCASH.mjs +0 -8
@@ -3098,10 +3098,12 @@ function defineBlockDesignCapability(capability) {
3098
3098
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
3099
3099
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
3100
3100
  tileTreatments: capability.tileTreatments ?? ["default"],
3101
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
3101
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
3102
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
3103
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
3102
3104
  };
3103
3105
  }
3104
- var plainFrame, tileTreatmentValues, eyebrowTreatmentValues;
3106
+ var plainFrame, tileTreatmentValues, eyebrowTreatmentValues, visibleHeadingDecorationFamilyValues, visibleHeadingDecorationPlacementValues, headingDecorationOverrideValues, headingDecorationColorTokenValues, accordionIconSetValues, accordionIconColorTokenValues, accordionIconMotionValues;
3105
3107
  var init_types3 = __esm({
3106
3108
  "../theme-core/src/site-styles/types.ts"() {
3107
3109
  "use strict";
@@ -3120,6 +3122,47 @@ var init_types3 = __esm({
3120
3122
  "pill-bounce",
3121
3123
  "accent-pill-bounce"
3122
3124
  ];
3125
+ visibleHeadingDecorationFamilyValues = [
3126
+ "organic-squiggle",
3127
+ "short-center-rule"
3128
+ ];
3129
+ visibleHeadingDecorationPlacementValues = [
3130
+ "after-heading",
3131
+ "between-heading-and-body",
3132
+ "under-centered-heading"
3133
+ ];
3134
+ headingDecorationOverrideValues = [
3135
+ "site-default",
3136
+ "on",
3137
+ "off"
3138
+ ];
3139
+ headingDecorationColorTokenValues = [
3140
+ "text",
3141
+ "primary",
3142
+ "secondary",
3143
+ "accent",
3144
+ "border",
3145
+ "muted"
3146
+ ];
3147
+ accordionIconSetValues = [
3148
+ "plus",
3149
+ "chevron",
3150
+ "caret",
3151
+ "minimal-cross"
3152
+ ];
3153
+ accordionIconColorTokenValues = [
3154
+ "text",
3155
+ "muted",
3156
+ "primary",
3157
+ "secondary",
3158
+ "accent",
3159
+ "current"
3160
+ ];
3161
+ accordionIconMotionValues = [
3162
+ "none",
3163
+ "rotate",
3164
+ "swap"
3165
+ ];
3123
3166
  }
3124
3167
  });
3125
3168
 
@@ -3316,6 +3359,25 @@ var init_blockAppearancePresets = __esm({
3316
3359
  emphasis: "high"
3317
3360
  }
3318
3361
  }),
3362
+ defineBlockAppearancePreset({
3363
+ kind: "block-design",
3364
+ id: "intro-soft-earth-statement",
3365
+ target: "intro",
3366
+ label: "Soft Earth intro statement",
3367
+ blockKinds: ["block.intro"],
3368
+ design: {
3369
+ sectionSurface: "base",
3370
+ contentFrame: plainFrame,
3371
+ itemSurface: "none",
3372
+ transitionAfter: "soft-fade-short",
3373
+ emphasis: "high",
3374
+ headingDecoration: {
3375
+ family: "organic-squiggle",
3376
+ placement: "after-heading",
3377
+ colorToken: "primary"
3378
+ }
3379
+ }
3380
+ }),
3319
3381
  defineBlockAppearancePreset({
3320
3382
  kind: "block-design",
3321
3383
  id: "offerings-calm-list",
@@ -3330,6 +3392,25 @@ var init_blockAppearancePresets = __esm({
3330
3392
  emphasis: "medium"
3331
3393
  }
3332
3394
  }),
3395
+ defineBlockAppearancePreset({
3396
+ kind: "block-design",
3397
+ id: "feature-cards-soft-earth-offerings",
3398
+ target: "feature-cards",
3399
+ label: "Soft Earth offering cards",
3400
+ blockKinds: ["block.feature-cards"],
3401
+ design: {
3402
+ sectionSurface: "base",
3403
+ contentFrame: plainFrame,
3404
+ itemSurface: "raised",
3405
+ transitionAfter: "none",
3406
+ emphasis: "high",
3407
+ headingDecoration: {
3408
+ family: "short-center-rule",
3409
+ placement: "under-centered-heading",
3410
+ colorToken: "primary"
3411
+ }
3412
+ }
3413
+ }),
3333
3414
  defineBlockAppearancePreset({
3334
3415
  kind: "block-design",
3335
3416
  id: "events-base-calendar",
@@ -3458,6 +3539,26 @@ var init_blockAppearancePresets = __esm({
3458
3539
  testimonialCardTreatment: "accent-quote"
3459
3540
  }
3460
3541
  }),
3542
+ defineBlockAppearancePreset({
3543
+ kind: "block-design",
3544
+ id: "testimonials-soft-earth-proof-band",
3545
+ target: "testimonials",
3546
+ label: "Soft Earth proof band",
3547
+ blockKinds: ["block.testimonials"],
3548
+ design: {
3549
+ sectionSurface: "brand-depth-band",
3550
+ contentFrame: plainFrame,
3551
+ itemSurface: "none",
3552
+ transitionAfter: "soft-fade-short",
3553
+ emphasis: "high",
3554
+ testimonialCardTreatment: "accent-quote",
3555
+ headingDecoration: {
3556
+ family: "short-center-rule",
3557
+ placement: "under-centered-heading",
3558
+ colorToken: "border"
3559
+ }
3560
+ }
3561
+ }),
3461
3562
  defineBlockAppearancePreset({
3462
3563
  kind: "block-design",
3463
3564
  id: "faq-base-accordion",
@@ -3486,6 +3587,25 @@ var init_blockAppearancePresets = __esm({
3486
3587
  emphasis: "low"
3487
3588
  }
3488
3589
  }),
3590
+ defineBlockAppearancePreset({
3591
+ kind: "block-design",
3592
+ id: "faq-soft-earth-two-column",
3593
+ target: "faq",
3594
+ label: "Soft Earth two-column FAQ",
3595
+ blockKinds: ["block.faq"],
3596
+ design: {
3597
+ sectionSurface: "base",
3598
+ contentFrame: plainFrame,
3599
+ itemSurface: "flat",
3600
+ transitionAfter: "none",
3601
+ emphasis: "medium",
3602
+ accordionIconTreatment: {
3603
+ iconSet: "plus",
3604
+ colorToken: "primary",
3605
+ motion: "swap"
3606
+ }
3607
+ }
3608
+ }),
3489
3609
  defineBlockAppearancePreset({
3490
3610
  kind: "block-design",
3491
3611
  id: "contact-form-panel",
@@ -4267,6 +4387,104 @@ var init_confident_chip = __esm({
4267
4387
  }
4268
4388
  });
4269
4389
 
4390
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
4391
+ var earthPill;
4392
+ var init_earth_pill = __esm({
4393
+ "../theme-core/src/buttons/personalities/earth-pill.ts"() {
4394
+ "use strict";
4395
+ init_types5();
4396
+ earthPill = defineButtonPersonality({
4397
+ id: "earth-pill",
4398
+ name: "Earth Pill",
4399
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
4400
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
4401
+ buttonSystem: {
4402
+ global: {
4403
+ cornerStyle: "pill",
4404
+ shadow: "low",
4405
+ textTransform: "none",
4406
+ fontWeight: 500,
4407
+ borderWidth: 1,
4408
+ hoverTransform: "lift",
4409
+ hoverColor: "none",
4410
+ typography: "body",
4411
+ paddingPreset: "default"
4412
+ },
4413
+ sizes: {
4414
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
4415
+ md: { padding: "0.625rem 1.35rem" },
4416
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
4417
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
4418
+ },
4419
+ variants: [
4420
+ {
4421
+ id: "primary",
4422
+ name: "Primary",
4423
+ enabled: true,
4424
+ priority: 1,
4425
+ background: { type: "solid", colorToken: "primary" },
4426
+ textColorToken: "primaryForeground",
4427
+ borderRadius: "rounded-full",
4428
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
4429
+ effects: {
4430
+ hover: [
4431
+ { effectId: "lift", options: { translateY: "-1px" } },
4432
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
4433
+ ],
4434
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
4435
+ }
4436
+ },
4437
+ {
4438
+ id: "secondary",
4439
+ name: "Secondary",
4440
+ enabled: true,
4441
+ priority: 2,
4442
+ background: { type: "transparent" },
4443
+ textColorToken: "primary",
4444
+ borderRadius: "rounded-full",
4445
+ border: { widthClass: "border", colorToken: "primary" },
4446
+ effects: {
4447
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
4448
+ }
4449
+ },
4450
+ {
4451
+ id: "outline",
4452
+ name: "Outline",
4453
+ enabled: true,
4454
+ priority: 3,
4455
+ background: { type: "transparent" },
4456
+ textColorToken: "text",
4457
+ borderRadius: "rounded-full",
4458
+ border: { widthClass: "border", colorToken: "border" },
4459
+ effects: {
4460
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
4461
+ }
4462
+ },
4463
+ {
4464
+ id: "ghost",
4465
+ name: "Ghost",
4466
+ enabled: true,
4467
+ priority: 3,
4468
+ background: { type: "transparent" },
4469
+ textColorToken: "primary",
4470
+ borderRadius: "rounded-full",
4471
+ shadow: { elevation: "none", softness: null, position: "bottom" },
4472
+ sizes: {
4473
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
4474
+ md: { padding: "0.375rem 0" },
4475
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
4476
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
4477
+ },
4478
+ effects: {
4479
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
4480
+ }
4481
+ }
4482
+ ]
4483
+ }
4484
+ });
4485
+ }
4486
+ });
4487
+
4270
4488
  // ../theme-core/src/buttons/personalities/editorial-link.ts
4271
4489
  var editorialLink;
4272
4490
  var init_editorial_link = __esm({
@@ -4764,6 +4982,7 @@ var init_personalities = __esm({
4764
4982
  "use strict";
4765
4983
  init_brushed_wash();
4766
4984
  init_confident_chip();
4985
+ init_earth_pill();
4767
4986
  init_editorial_link();
4768
4987
  init_ink_stamp();
4769
4988
  init_pebble();
@@ -4772,6 +4991,7 @@ var init_personalities = __esm({
4772
4991
  init_types5();
4773
4992
  buttonPersonalities = [
4774
4993
  softPill,
4994
+ earthPill,
4775
4995
  confidentChip,
4776
4996
  editorialLink,
4777
4997
  pebble,
@@ -7696,7 +7916,7 @@ var init_tokenOrColor = __esm({
7696
7916
 
7697
7917
  // ../theme-core/src/schema.ts
7698
7918
  import { z as z23 } from "zod";
7699
- var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, buttonStyle, cardStyle, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema, themesTurnSchema;
7919
+ var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, buttonStyle, cardStyle, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema, themesTurnSchema;
7700
7920
  var init_schema2 = __esm({
7701
7921
  "../theme-core/src/schema.ts"() {
7702
7922
  "use strict";
@@ -7791,12 +8011,36 @@ var init_schema2 = __esm({
7791
8011
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
7792
8012
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
7793
8013
  });
8014
+ noHeadingDecorationSchema = z23.object({
8015
+ family: z23.literal("none"),
8016
+ placement: z23.literal("none")
8017
+ });
8018
+ visibleHeadingDecorationSchema = z23.object({
8019
+ family: z23.enum(visibleHeadingDecorationFamilyValues),
8020
+ placement: z23.enum(visibleHeadingDecorationPlacementValues),
8021
+ colorToken: z23.enum(headingDecorationColorTokenValues).optional()
8022
+ });
8023
+ headingDecorationSchema = z23.union([
8024
+ noHeadingDecorationSchema,
8025
+ visibleHeadingDecorationSchema
8026
+ ]);
8027
+ accordionIconTreatmentSchema = z23.object({
8028
+ iconSet: z23.enum(accordionIconSetValues),
8029
+ colorToken: z23.enum(accordionIconColorTokenValues),
8030
+ openColorToken: z23.enum(accordionIconColorTokenValues).optional(),
8031
+ motion: z23.enum(accordionIconMotionValues)
8032
+ });
7794
8033
  sectionStylesOverrideSchema = z23.object({
7795
8034
  background: boxBackgroundSchema.nullable().optional(),
7796
8035
  spacing: semanticSpacingSchema.nullable().optional(),
7797
8036
  minHeight: z23.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
7798
8037
  tileTreatment: z23.enum(tileTreatmentValues).nullable().optional(),
7799
- eyebrowTreatment: z23.enum(eyebrowTreatmentValues).nullable().optional()
8038
+ eyebrowTreatment: z23.enum(eyebrowTreatmentValues).nullable().optional(),
8039
+ headingDecoration: headingDecorationSchema.nullable().optional(),
8040
+ // Author-level override consumed by later block/editor rendering phases.
8041
+ // Keeping it in section styles lets existing block save APIs persist it.
8042
+ headingDecorationOverride: z23.enum(headingDecorationOverrideValues).nullable().optional(),
8043
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
7800
8044
  });
7801
8045
  containerStylesOverrideSchema = z23.object({
7802
8046
  background: boxBackgroundSchema.nullable().optional(),
@@ -8493,7 +8737,7 @@ var init_soft_natural = __esm({
8493
8737
  });
8494
8738
 
8495
8739
  // ../theme-core/src/palette/variants/warm-neutral.ts
8496
- var warmNeutralClay, warmNeutralCream, warmNeutralForest;
8740
+ var warmNeutralClay, warmNeutralCream, warmNeutralSoftEarth, warmNeutralForest;
8497
8741
  var init_warm_neutral = __esm({
8498
8742
  "../theme-core/src/palette/variants/warm-neutral.ts"() {
8499
8743
  "use strict";
@@ -8542,6 +8786,28 @@ var init_warm_neutral = __esm({
8542
8786
  { name: "border", hex: "#e0d2b8" }
8543
8787
  ]
8544
8788
  });
8789
+ warmNeutralSoftEarth = definePaletteVariant({
8790
+ id: "warm-neutral-soft-earth",
8791
+ name: "Warm Neutral \u2014 Soft Earth",
8792
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
8793
+ tags: { tone: "classic", energy: "calm", era: "organic" },
8794
+ mode: "light",
8795
+ colors: [
8796
+ { name: "primary", hex: "#a8573d" },
8797
+ { name: "secondary", hex: "#72765c" },
8798
+ { name: "accent", hex: "#c87557" },
8799
+ { name: "success", hex: "#687854" },
8800
+ { name: "warning", hex: "#b7863e" },
8801
+ { name: "destructive", hex: "#a54b3c" },
8802
+ { name: "background", hex: "#fbf6eb" },
8803
+ { name: "surface", hex: "#fffdf7" },
8804
+ { name: "surfaceAlt", hex: "#f0e4d3" },
8805
+ { name: "muted", hex: "#eadbc6" },
8806
+ { name: "text", hex: "#30281f" },
8807
+ { name: "primaryForeground", hex: "#fffaf3" },
8808
+ { name: "border", hex: "#d9c8b2" }
8809
+ ]
8810
+ });
8545
8811
  warmNeutralForest = definePaletteVariant({
8546
8812
  id: "warm-neutral-forest",
8547
8813
  name: "Warm Neutral \u2014 Forest",
@@ -8586,6 +8852,7 @@ var init_variants = __esm({
8586
8852
  // Warm-neutral family
8587
8853
  warmNeutralClay,
8588
8854
  warmNeutralCream,
8855
+ warmNeutralSoftEarth,
8589
8856
  warmNeutralForest,
8590
8857
  // High-contrast family
8591
8858
  highContrastInk,
@@ -8614,6 +8881,12 @@ var init_customizableSurfaces = __esm({
8614
8881
  function asHeaderLookId(value) {
8615
8882
  return value;
8616
8883
  }
8884
+ function asHeaderLayoutId(value) {
8885
+ return value;
8886
+ }
8887
+ function asHeaderStyleId(value) {
8888
+ return value;
8889
+ }
8617
8890
  function baseHeader(theme) {
8618
8891
  const {
8619
8892
  navLinkStyle: _navLinkStyle,
@@ -8632,6 +8905,34 @@ function baseHeader(theme) {
8632
8905
  navContainer: { type: "none", tint: null, opacity: 0.15 }
8633
8906
  };
8634
8907
  }
8908
+ function supportedLayouts(ids) {
8909
+ return ids.map(asHeaderLayoutId);
8910
+ }
8911
+ function headerStyleRepairChain(values) {
8912
+ return values.map(asHeaderStyleId);
8913
+ }
8914
+ function getHeaderStyle(id) {
8915
+ return headerStylesById.get(id) ?? null;
8916
+ }
8917
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
8918
+ return style.supportedLayoutIds.includes(layoutId);
8919
+ }
8920
+ function getHeaderStyleOrThrow(id) {
8921
+ const style = getHeaderStyle(id);
8922
+ if (!style) {
8923
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
8924
+ }
8925
+ return style;
8926
+ }
8927
+ function resolveLegacyHeaderLookAlias(lookId) {
8928
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
8929
+ }
8930
+ function getCompatibleHeaderStyleIds(layoutId) {
8931
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
8932
+ const style = getHeaderStyleOrThrow(styleId);
8933
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
8934
+ });
8935
+ }
8635
8936
  function solidBrandHeader(theme) {
8636
8937
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
8637
8938
  return {
@@ -8862,19 +9163,302 @@ function floatingGlassHeader(theme) {
8862
9163
  }
8863
9164
  };
8864
9165
  }
8865
- var headerLookCatalog, guaranteedFallbackHeaderLookId, headerLooksById;
9166
+ function headerConfigurationKey(configuration) {
9167
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
9168
+ }
9169
+ var headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, headerStyleRepairOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLookId, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, allowedHeaderConfigurationKeys, headerLooksById;
8866
9170
  var init_headerLooks = __esm({
8867
9171
  "../theme-core/src/site-styles/headerLooks.ts"() {
8868
9172
  "use strict";
8869
9173
  init_headerCtaVariants();
8870
9174
  init_customizableSurfaces();
8871
9175
  init_types3();
9176
+ headerLayoutCatalog = [
9177
+ {
9178
+ id: asHeaderLayoutId("classic"),
9179
+ label: "Classic",
9180
+ description: "Logo and navigation in one practical horizontal row.",
9181
+ structure: "inline-classic",
9182
+ variant: "classic",
9183
+ defaultPositioning: "sticky",
9184
+ shrinkOnScroll: false
9185
+ },
9186
+ {
9187
+ id: asHeaderLayoutId("centered"),
9188
+ label: "Centered",
9189
+ description: "Logo centered above a balanced navigation row.",
9190
+ structure: "centered-stack",
9191
+ variant: "centered",
9192
+ defaultPositioning: "static",
9193
+ shrinkOnScroll: false,
9194
+ maxRecommendedNavItems: 5,
9195
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
9196
+ },
9197
+ {
9198
+ id: asHeaderLayoutId("editorial"),
9199
+ label: "Editorial",
9200
+ description: "A composed, magazine-like stacked header treatment.",
9201
+ structure: "editorial-stack",
9202
+ variant: "editorial",
9203
+ defaultPositioning: "static",
9204
+ shrinkOnScroll: false,
9205
+ maxRecommendedNavItems: 6
9206
+ },
9207
+ {
9208
+ id: asHeaderLayoutId("floating"),
9209
+ label: "Floating",
9210
+ description: "Detached header chrome that sits over the opening section.",
9211
+ structure: "floating-shell",
9212
+ variant: "floating",
9213
+ defaultPositioning: "fixed",
9214
+ shrinkOnScroll: true,
9215
+ maxRecommendedNavItems: 5,
9216
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
9217
+ }
9218
+ ];
9219
+ headerStyleCatalog = [
9220
+ {
9221
+ id: asHeaderStyleId("minimal"),
9222
+ label: "Minimal",
9223
+ description: "Quiet surface with simple color-change navigation.",
9224
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
9225
+ navInteraction: "color-change",
9226
+ surface: "neutral"
9227
+ },
9228
+ {
9229
+ id: asHeaderStyleId("fine-line"),
9230
+ label: "Fine Line",
9231
+ description: "Light surface with a crisp lower rule and underline hover.",
9232
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
9233
+ navInteraction: "underline-grow",
9234
+ surface: "bordered"
9235
+ },
9236
+ {
9237
+ id: asHeaderStyleId("soft-bar"),
9238
+ label: "Soft Bar",
9239
+ description: "Soft tinted surface with gentle pill hover states.",
9240
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
9241
+ navInteraction: "pill-background",
9242
+ surface: "soft"
9243
+ },
9244
+ {
9245
+ id: asHeaderStyleId("pill-nav"),
9246
+ label: "Pill Nav",
9247
+ description: "A calm pill navigation rail over a neutral header.",
9248
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
9249
+ navInteraction: "pill-background",
9250
+ surface: "soft"
9251
+ },
9252
+ {
9253
+ id: asHeaderStyleId("brand-bar"),
9254
+ label: "Brand Bar",
9255
+ description: "Solid brand surface with high-contrast navigation.",
9256
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
9257
+ navInteraction: "color-change",
9258
+ surface: "brand-solid"
9259
+ },
9260
+ {
9261
+ id: asHeaderStyleId("brand-underline"),
9262
+ label: "Brand Underline",
9263
+ description: "Brand surface with underline-grow navigation.",
9264
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
9265
+ navInteraction: "underline-grow",
9266
+ surface: "brand-solid"
9267
+ },
9268
+ {
9269
+ id: asHeaderStyleId("brand-pill"),
9270
+ label: "Brand Pill",
9271
+ description: "Solid brand surface with rounded active and hover states.",
9272
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
9273
+ navInteraction: "pill-background",
9274
+ surface: "brand-solid"
9275
+ },
9276
+ {
9277
+ id: asHeaderStyleId("editorial-line"),
9278
+ label: "Editorial Line",
9279
+ description: "Typographic logo treatment with understated underline navigation.",
9280
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
9281
+ navInteraction: "underline-grow",
9282
+ surface: "bordered"
9283
+ },
9284
+ {
9285
+ id: asHeaderStyleId("flat-tabs"),
9286
+ label: "Flat Tabs",
9287
+ description: "Flat block hover and active states with a Swiss utility feel.",
9288
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
9289
+ navInteraction: "flat-block",
9290
+ surface: "bordered"
9291
+ },
9292
+ {
9293
+ id: asHeaderStyleId("glass"),
9294
+ label: "Glass",
9295
+ description: "Floating translucent chrome with frosted navigation backing.",
9296
+ supportedLayoutIds: supportedLayouts(["floating"]),
9297
+ navInteraction: "glass-backed",
9298
+ surface: "floating",
9299
+ requiresFloatingLayout: true
9300
+ },
9301
+ {
9302
+ id: asHeaderStyleId("minimal-surface"),
9303
+ label: "Minimal Surface",
9304
+ description: "Floating chrome with a restrained translucent surface.",
9305
+ supportedLayoutIds: supportedLayouts(["floating"]),
9306
+ navInteraction: "color-change",
9307
+ surface: "floating",
9308
+ requiresFloatingLayout: true
9309
+ },
9310
+ {
9311
+ id: asHeaderStyleId("soft-shell"),
9312
+ label: "Soft Shell",
9313
+ description: "Floating rounded shell with soft pill navigation states.",
9314
+ supportedLayoutIds: supportedLayouts(["floating"]),
9315
+ navInteraction: "pill-background",
9316
+ surface: "floating",
9317
+ requiresFloatingLayout: true
9318
+ }
9319
+ ];
9320
+ headerLayoutsById = new Map(
9321
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
9322
+ );
9323
+ headerStylesById = new Map(
9324
+ headerStyleCatalog.map((style) => [style.id, style])
9325
+ );
9326
+ headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
9327
+ [
9328
+ asHeaderLayoutId("classic"),
9329
+ headerStyleRepairChain([
9330
+ "minimal",
9331
+ "fine-line",
9332
+ "soft-bar",
9333
+ "pill-nav",
9334
+ "brand-bar",
9335
+ "brand-underline",
9336
+ "brand-pill",
9337
+ "editorial-line",
9338
+ "flat-tabs"
9339
+ ])
9340
+ ],
9341
+ [
9342
+ asHeaderLayoutId("centered"),
9343
+ headerStyleRepairChain([
9344
+ "minimal",
9345
+ "fine-line",
9346
+ "soft-bar",
9347
+ "pill-nav",
9348
+ "brand-bar",
9349
+ "brand-pill",
9350
+ "editorial-line",
9351
+ "flat-tabs"
9352
+ ])
9353
+ ],
9354
+ [
9355
+ asHeaderLayoutId("editorial"),
9356
+ headerStyleRepairChain([
9357
+ "minimal",
9358
+ "fine-line",
9359
+ "soft-bar",
9360
+ "brand-bar",
9361
+ "brand-underline",
9362
+ "editorial-line",
9363
+ "flat-tabs"
9364
+ ])
9365
+ ],
9366
+ [
9367
+ asHeaderLayoutId("floating"),
9368
+ headerStyleRepairChain([
9369
+ "glass",
9370
+ "minimal-surface",
9371
+ "soft-shell",
9372
+ "brand-pill"
9373
+ ])
9374
+ ]
9375
+ ]);
9376
+ headerStyleRepairOrder = /* @__PURE__ */ new Map([
9377
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
9378
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
9379
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
9380
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
9381
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
9382
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
9383
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
9384
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
9385
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
9386
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
9387
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
9388
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
9389
+ ]);
9390
+ legacyHeaderLookAliases = [
9391
+ {
9392
+ lookId: asHeaderLookId("clean-base"),
9393
+ selection: {
9394
+ layoutId: asHeaderLayoutId("classic"),
9395
+ styleId: asHeaderStyleId("minimal")
9396
+ }
9397
+ },
9398
+ {
9399
+ lookId: asHeaderLookId("brand-solid"),
9400
+ selection: {
9401
+ layoutId: asHeaderLayoutId("classic"),
9402
+ styleId: asHeaderStyleId("brand-bar")
9403
+ }
9404
+ },
9405
+ {
9406
+ lookId: asHeaderLookId("editorial-line"),
9407
+ selection: {
9408
+ layoutId: asHeaderLayoutId("editorial"),
9409
+ styleId: asHeaderStyleId("editorial-line")
9410
+ }
9411
+ },
9412
+ {
9413
+ lookId: asHeaderLookId("centered-calm"),
9414
+ selection: {
9415
+ layoutId: asHeaderLayoutId("centered"),
9416
+ styleId: asHeaderStyleId("minimal")
9417
+ }
9418
+ },
9419
+ {
9420
+ lookId: asHeaderLookId("practical-utility"),
9421
+ selection: {
9422
+ layoutId: asHeaderLayoutId("classic"),
9423
+ styleId: asHeaderStyleId("flat-tabs")
9424
+ }
9425
+ },
9426
+ {
9427
+ lookId: asHeaderLookId("minimal-transparent"),
9428
+ selection: {
9429
+ layoutId: asHeaderLayoutId("classic"),
9430
+ styleId: asHeaderStyleId("minimal")
9431
+ }
9432
+ },
9433
+ {
9434
+ lookId: asHeaderLookId("transparent-overlay"),
9435
+ selection: {
9436
+ layoutId: asHeaderLayoutId("floating"),
9437
+ styleId: asHeaderStyleId("glass")
9438
+ }
9439
+ },
9440
+ {
9441
+ lookId: asHeaderLookId("floating-glass"),
9442
+ selection: {
9443
+ layoutId: asHeaderLayoutId("floating"),
9444
+ styleId: asHeaderStyleId("glass")
9445
+ }
9446
+ }
9447
+ ];
9448
+ legacyHeaderLookAliasesById = new Map(
9449
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
9450
+ );
8872
9451
  headerLookCatalog = [
8873
9452
  {
8874
9453
  id: asHeaderLookId("clean-base"),
8875
9454
  label: "Clean base",
8876
9455
  visualTreatment: "solid-neutral",
8877
9456
  layoutBehavior: "sticky",
9457
+ configuration: {
9458
+ structure: "inline-classic",
9459
+ treatment: "solid-neutral",
9460
+ behavior: "sticky"
9461
+ },
8878
9462
  openingRequirement: "none",
8879
9463
  compile: cleanBaseHeader
8880
9464
  },
@@ -8883,6 +9467,11 @@ var init_headerLooks = __esm({
8883
9467
  label: "Brand solid",
8884
9468
  visualTreatment: "solid-brand",
8885
9469
  layoutBehavior: "sticky-shrink",
9470
+ configuration: {
9471
+ structure: "inline-classic",
9472
+ treatment: "solid-brand",
9473
+ behavior: "sticky-shrink"
9474
+ },
8886
9475
  openingRequirement: "none",
8887
9476
  compile: solidBrandHeader
8888
9477
  },
@@ -8891,6 +9480,11 @@ var init_headerLooks = __esm({
8891
9480
  label: "Editorial line",
8892
9481
  visualTreatment: "light-editorial",
8893
9482
  layoutBehavior: "sticky",
9483
+ configuration: {
9484
+ structure: "editorial-stack",
9485
+ treatment: "light-editorial",
9486
+ behavior: "sticky"
9487
+ },
8894
9488
  openingRequirement: "none",
8895
9489
  maxRecommendedNavItems: 6,
8896
9490
  compile: editorialLineHeader
@@ -8900,6 +9494,11 @@ var init_headerLooks = __esm({
8900
9494
  label: "Centered calm",
8901
9495
  visualTreatment: "light-editorial",
8902
9496
  layoutBehavior: "normal-flow",
9497
+ configuration: {
9498
+ structure: "centered-stack",
9499
+ treatment: "light-editorial",
9500
+ behavior: "normal-flow"
9501
+ },
8903
9502
  openingRequirement: "none",
8904
9503
  maxRecommendedNavItems: 5,
8905
9504
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -8910,6 +9509,11 @@ var init_headerLooks = __esm({
8910
9509
  label: "Practical utility",
8911
9510
  visualTreatment: "solid-neutral",
8912
9511
  layoutBehavior: "sticky-shrink",
9512
+ configuration: {
9513
+ structure: "inline-classic",
9514
+ treatment: "solid-neutral",
9515
+ behavior: "sticky-shrink"
9516
+ },
8913
9517
  openingRequirement: "none",
8914
9518
  requiresProminentCta: true,
8915
9519
  compile: practicalUtilityHeader
@@ -8919,6 +9523,11 @@ var init_headerLooks = __esm({
8919
9523
  label: "Minimal transparent",
8920
9524
  visualTreatment: "minimal-transparent",
8921
9525
  layoutBehavior: "normal-flow",
9526
+ configuration: {
9527
+ structure: "inline-classic",
9528
+ treatment: "minimal-transparent",
9529
+ behavior: "normal-flow"
9530
+ },
8922
9531
  openingRequirement: "reserved-space-ok",
8923
9532
  compile: minimalTransparentHeader
8924
9533
  },
@@ -8927,6 +9536,11 @@ var init_headerLooks = __esm({
8927
9536
  label: "Transparent overlay",
8928
9537
  visualTreatment: "transparent-overlay",
8929
9538
  layoutBehavior: "fixed-overlay",
9539
+ configuration: {
9540
+ structure: "inline-classic",
9541
+ treatment: "transparent-overlay",
9542
+ behavior: "fixed-overlay"
9543
+ },
8930
9544
  openingRequirement: "requires-image-hero-with-contrast-overlay",
8931
9545
  maxRecommendedNavItems: 5,
8932
9546
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -8937,6 +9551,11 @@ var init_headerLooks = __esm({
8937
9551
  label: "Floating glass",
8938
9552
  visualTreatment: "floating-glass",
8939
9553
  layoutBehavior: "fixed-floating",
9554
+ configuration: {
9555
+ structure: "floating-shell",
9556
+ treatment: "floating-glass",
9557
+ behavior: "fixed-floating"
9558
+ },
8940
9559
  openingRequirement: "requires-image-hero-with-contrast-overlay",
8941
9560
  maxRecommendedNavItems: 5,
8942
9561
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -8944,6 +9563,11 @@ var init_headerLooks = __esm({
8944
9563
  }
8945
9564
  ];
8946
9565
  guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
9566
+ guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
9567
+ guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
9568
+ allowedHeaderConfigurationKeys = new Set(
9569
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
9570
+ );
8947
9571
  headerLooksById = new Map(
8948
9572
  headerLookCatalog.map((look) => [look.id, look])
8949
9573
  );
@@ -9103,6 +9727,270 @@ var init_sourceCatalogs = __esm({
9103
9727
  }
9104
9728
  });
9105
9729
 
9730
+ // ../theme-core/src/site-styles/typographyPresets.ts
9731
+ function asTypographyPresetId(value) {
9732
+ if (!value.startsWith("typography-preset:")) {
9733
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
9734
+ }
9735
+ return value;
9736
+ }
9737
+ function defineTypographyPreset(preset2) {
9738
+ return {
9739
+ ...preset2,
9740
+ id: asTypographyPresetId(preset2.id)
9741
+ };
9742
+ }
9743
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, boldDisplayTypography, typographyPresets, typographyPresetsById;
9744
+ var init_typographyPresets = __esm({
9745
+ "../theme-core/src/site-styles/typographyPresets.ts"() {
9746
+ "use strict";
9747
+ bodyReadablePolicy = {
9748
+ recommendedCategories: ["sans-serif", "serif"],
9749
+ allowedCategories: ["sans-serif", "serif"],
9750
+ requiresItalicForBody: true,
9751
+ requiresBoldForBody: true
9752
+ };
9753
+ headingFlexiblePolicy = {
9754
+ recommendedCategories: ["sans-serif", "serif", "display"],
9755
+ allowedCategories: ["sans-serif", "serif", "display"]
9756
+ };
9757
+ displayHeadingPolicy = {
9758
+ recommendedCategories: ["display", "sans-serif", "serif"],
9759
+ allowedCategories: ["display", "sans-serif", "serif"]
9760
+ };
9761
+ modernSansTypography = {
9762
+ body: {
9763
+ family: "Inter, system-ui, sans-serif",
9764
+ size: "md",
9765
+ weight: "regular",
9766
+ lineHeight: "relaxed",
9767
+ letterSpacing: "normal"
9768
+ },
9769
+ headings: {
9770
+ default: {
9771
+ family: "Inter, system-ui, sans-serif",
9772
+ weight: "semibold",
9773
+ lineHeight: "normal",
9774
+ letterSpacing: "tight",
9775
+ italic: null,
9776
+ case: null
9777
+ },
9778
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9779
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9780
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
9781
+ },
9782
+ scale: "balanced"
9783
+ };
9784
+ warmRoundedTypography = {
9785
+ body: {
9786
+ family: "Nunito Sans, system-ui, sans-serif",
9787
+ size: "lg",
9788
+ weight: "regular",
9789
+ lineHeight: "relaxed",
9790
+ letterSpacing: "normal"
9791
+ },
9792
+ headings: {
9793
+ default: {
9794
+ family: "Nunito Sans, system-ui, sans-serif",
9795
+ weight: "bold",
9796
+ lineHeight: "normal",
9797
+ letterSpacing: "normal",
9798
+ italic: null,
9799
+ case: null
9800
+ },
9801
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9802
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9803
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
9804
+ },
9805
+ scale: "balanced"
9806
+ };
9807
+ editorialSerifTypography = {
9808
+ body: {
9809
+ family: "Lora, Georgia, serif",
9810
+ size: "lg",
9811
+ weight: "regular",
9812
+ lineHeight: "loose",
9813
+ letterSpacing: "normal"
9814
+ },
9815
+ headings: {
9816
+ default: {
9817
+ family: "Playfair Display, Georgia, serif",
9818
+ weight: "semibold",
9819
+ lineHeight: "normal",
9820
+ letterSpacing: "tight",
9821
+ italic: null,
9822
+ case: null
9823
+ },
9824
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9825
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9826
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
9827
+ },
9828
+ scale: "spacious"
9829
+ };
9830
+ classicSerifTypography = {
9831
+ body: {
9832
+ family: "Libre Baskerville, Georgia, serif",
9833
+ size: "md",
9834
+ weight: "regular",
9835
+ lineHeight: "relaxed",
9836
+ letterSpacing: "normal"
9837
+ },
9838
+ headings: {
9839
+ default: {
9840
+ family: "Cormorant Garamond, Georgia, serif",
9841
+ weight: "semibold",
9842
+ lineHeight: "normal",
9843
+ letterSpacing: "normal",
9844
+ italic: null,
9845
+ case: null
9846
+ },
9847
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9848
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9849
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
9850
+ },
9851
+ scale: "balanced"
9852
+ };
9853
+ luxeContrastTypography = {
9854
+ body: {
9855
+ family: "Manrope, system-ui, sans-serif",
9856
+ size: "md",
9857
+ weight: "regular",
9858
+ lineHeight: "relaxed",
9859
+ letterSpacing: "normal"
9860
+ },
9861
+ headings: {
9862
+ default: {
9863
+ family: "Cormorant Garamond, Georgia, serif",
9864
+ weight: "semibold",
9865
+ lineHeight: "normal",
9866
+ letterSpacing: "tight",
9867
+ italic: null,
9868
+ case: null
9869
+ },
9870
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9871
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9872
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
9873
+ },
9874
+ scale: "spacious"
9875
+ };
9876
+ boldDisplayTypography = {
9877
+ body: {
9878
+ family: "Manrope, system-ui, sans-serif",
9879
+ size: "lg",
9880
+ weight: "regular",
9881
+ lineHeight: "relaxed",
9882
+ letterSpacing: "normal"
9883
+ },
9884
+ headings: {
9885
+ default: {
9886
+ family: '"TAN - PEARL", sans-serif',
9887
+ weight: "bold",
9888
+ lineHeight: "normal",
9889
+ letterSpacing: "tight",
9890
+ colorToken: "primary",
9891
+ italic: null,
9892
+ case: null
9893
+ },
9894
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9895
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9896
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
9897
+ },
9898
+ scale: "balanced"
9899
+ };
9900
+ typographyPresets = [
9901
+ defineTypographyPreset({
9902
+ id: "typography-preset:modern-sans",
9903
+ name: "Modern Sans",
9904
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
9905
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
9906
+ recommendedFonts: {
9907
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
9908
+ heading: ["Inter", "Manrope", "Source Sans 3"]
9909
+ },
9910
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
9911
+ typography: modernSansTypography
9912
+ }),
9913
+ defineTypographyPreset({
9914
+ id: "typography-preset:warm-rounded",
9915
+ name: "Warm Rounded",
9916
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
9917
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
9918
+ recommendedFonts: {
9919
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
9920
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
9921
+ },
9922
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
9923
+ typography: warmRoundedTypography
9924
+ }),
9925
+ defineTypographyPreset({
9926
+ id: "typography-preset:editorial-serif",
9927
+ name: "Editorial Serif",
9928
+ description: "Story-led type with warm reading rhythm and expressive headings.",
9929
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
9930
+ recommendedFonts: {
9931
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
9932
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
9933
+ },
9934
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9935
+ typography: editorialSerifTypography
9936
+ }),
9937
+ defineTypographyPreset({
9938
+ id: "typography-preset:classic-serif",
9939
+ name: "Classic Serif",
9940
+ description: "Measured, polished type for premium and established offers.",
9941
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
9942
+ recommendedFonts: {
9943
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
9944
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
9945
+ },
9946
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9947
+ typography: classicSerifTypography
9948
+ }),
9949
+ defineTypographyPreset({
9950
+ id: "typography-preset:luxe-contrast",
9951
+ name: "Luxe Contrast",
9952
+ description: "A restrained sans body paired with elegant high-contrast headings.",
9953
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
9954
+ recommendedFonts: {
9955
+ body: ["Manrope", "Inter", "Source Sans 3"],
9956
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
9957
+ },
9958
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9959
+ typography: luxeContrastTypography
9960
+ }),
9961
+ defineTypographyPreset({
9962
+ id: "typography-preset:bold-display",
9963
+ name: "Bold Display",
9964
+ description: "Punchy display headings with readable sans body copy for branded launches.",
9965
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
9966
+ recommendedFonts: {
9967
+ body: ["Manrope", "Inter", "Space Grotesk"],
9968
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
9969
+ },
9970
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9971
+ typography: boldDisplayTypography,
9972
+ heroTypography: {
9973
+ headlineSize: "6xl",
9974
+ headlineLineHeight: "tight",
9975
+ subheadlineSize: "editorial",
9976
+ subheadlineLineHeight: "normal",
9977
+ microHeadlineSize: "6xl",
9978
+ microHeadlineLineHeight: "tight",
9979
+ microSubheadlineSize: "xl",
9980
+ microSubheadlineLineHeight: "normal",
9981
+ responsive: {
9982
+ tablet: { headlineSize: "5xl" },
9983
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
9984
+ }
9985
+ }
9986
+ })
9987
+ ];
9988
+ typographyPresetsById = new Map(
9989
+ typographyPresets.map((preset2) => [preset2.id, preset2])
9990
+ );
9991
+ }
9992
+ });
9993
+
9106
9994
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
9107
9995
  function uniqueContentFrameKinds() {
9108
9996
  const kinds = [...new Set(
@@ -9115,6 +10003,15 @@ function uniqueContentFrameKinds() {
9115
10003
  return [firstKind, ...kinds.slice(1)];
9116
10004
  }
9117
10005
  function defineCuratedSiteStyle(input) {
10006
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
10007
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
10008
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
10009
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
10010
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
10011
+ throw new Error(
10012
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
10013
+ );
10014
+ }
9118
10015
  return {
9119
10016
  id: asSiteStyleId(input.id),
9120
10017
  name: input.name,
@@ -9135,11 +10032,23 @@ function defineCuratedSiteStyle(input) {
9135
10032
  },
9136
10033
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
9137
10034
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
9138
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
10035
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
10036
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
10037
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
10038
+ } : inferredHeaderCuration.defaultHeaderSelection,
10039
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
10040
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
10041
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
10042
+ layoutId: asHeaderLayoutId(selection.layoutId),
10043
+ styleId: asHeaderStyleId(selection.styleId)
10044
+ })),
10045
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
9139
10046
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
9140
10047
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
9141
10048
  buttonPersonalityChoices: input.buttonPersonalityChoices,
9142
- paletteVariantChoices: input.paletteVariantChoices
10049
+ paletteVariantChoices: input.paletteVariantChoices,
10050
+ typographyPresetChoices,
10051
+ defaultTypographyPresetId
9143
10052
  };
9144
10053
  }
9145
10054
  function buttonChoice(id, note) {
@@ -9148,6 +10057,88 @@ function buttonChoice(id, note) {
9148
10057
  function paletteChoice(id, note) {
9149
10058
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
9150
10059
  }
10060
+ function headerLayoutChoice(id, note) {
10061
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
10062
+ }
10063
+ function headerStyleChoice(id, note) {
10064
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
10065
+ }
10066
+ function headerLayoutRecordKey(id) {
10067
+ return id;
10068
+ }
10069
+ function uniqueHeaderLayoutChoices(choices) {
10070
+ const seen = /* @__PURE__ */ new Set();
10071
+ const unique = choices.filter((choice) => {
10072
+ if (seen.has(choice.id)) return false;
10073
+ seen.add(choice.id);
10074
+ return true;
10075
+ });
10076
+ const first = unique[0];
10077
+ if (!first) {
10078
+ throw new Error("Expected at least one curated header layout choice.");
10079
+ }
10080
+ return [first, ...unique.slice(1)];
10081
+ }
10082
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
10083
+ const first = choices[0] ?? {
10084
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
10085
+ };
10086
+ return [first, ...choices.slice(1)];
10087
+ }
10088
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
10089
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
10090
+ const defaultHeaderSelection = selections[0] ?? {
10091
+ layoutId: asHeaderLayoutId("classic"),
10092
+ styleId: asHeaderStyleId("minimal")
10093
+ };
10094
+ const layoutChoices = uniqueHeaderLayoutChoices(
10095
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
10096
+ );
10097
+ const stylesByLayout = {};
10098
+ for (const layoutChoice of layoutChoices) {
10099
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
10100
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
10101
+ styleChoices,
10102
+ layoutChoice.id
10103
+ );
10104
+ }
10105
+ return {
10106
+ defaultHeaderSelection,
10107
+ recommendedHeaderLayoutChoices: layoutChoices,
10108
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
10109
+ };
10110
+ }
10111
+ function typographyChoice(id, note) {
10112
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
10113
+ }
10114
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
10115
+ switch (recipe) {
10116
+ case "clean-sans":
10117
+ return [
10118
+ typographyChoice("typography-preset:modern-sans"),
10119
+ typographyChoice("typography-preset:luxe-contrast"),
10120
+ typographyChoice("typography-preset:bold-display")
10121
+ ];
10122
+ case "friendly-sans":
10123
+ return [
10124
+ typographyChoice("typography-preset:warm-rounded"),
10125
+ typographyChoice("typography-preset:modern-sans"),
10126
+ typographyChoice("typography-preset:editorial-serif")
10127
+ ];
10128
+ case "serif-editorial":
10129
+ return [
10130
+ typographyChoice("typography-preset:editorial-serif"),
10131
+ typographyChoice("typography-preset:classic-serif"),
10132
+ typographyChoice("typography-preset:warm-rounded")
10133
+ ];
10134
+ case "classic-serif":
10135
+ return [
10136
+ typographyChoice("typography-preset:classic-serif"),
10137
+ typographyChoice("typography-preset:luxe-contrast"),
10138
+ typographyChoice("typography-preset:editorial-serif")
10139
+ ];
10140
+ }
10141
+ }
9151
10142
  var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
9152
10143
  var init_curatedSiteStyles = __esm({
9153
10144
  "../theme-core/src/site-styles/curatedSiteStyles.ts"() {
@@ -9159,6 +10150,7 @@ var init_curatedSiteStyles = __esm({
9159
10150
  init_curatedChoices();
9160
10151
  init_sourceCatalogs();
9161
10152
  init_types3();
10153
+ init_typographyPresets();
9162
10154
  curatedSiteStyleIdValues = [
9163
10155
  "site-style:calm-studio",
9164
10156
  "site-style:clear-professional",
@@ -9170,6 +10162,7 @@ var init_curatedSiteStyles = __esm({
9170
10162
  "site-style:personal-retreat-journal",
9171
10163
  "site-style:tactile-workshop",
9172
10164
  "site-style:modern-wellness",
10165
+ "site-style:soft-earth",
9173
10166
  "site-style:bold-launch",
9174
10167
  "site-style:south-west-twerk-school"
9175
10168
  ];
@@ -9560,6 +10553,102 @@ var init_curatedSiteStyles = __esm({
9560
10553
  paletteChoice("warm-neutral-clay")
9561
10554
  ]
9562
10555
  }),
10556
+ defineCuratedSiteStyle({
10557
+ id: "site-style:soft-earth",
10558
+ name: "Soft Earth",
10559
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
10560
+ generationBrief: "Use cream space, terracotta CTAs, olive proof bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community proof, and a simple two-column FAQ when content allows.",
10561
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
10562
+ selectionKeywordRules: [
10563
+ { kind: "word", value: "meditation" },
10564
+ { kind: "word", value: "wellbeing" },
10565
+ { kind: "substring", value: "retreat" },
10566
+ { kind: "phrase", value: "yoga studio" },
10567
+ { kind: "phrase", value: "mindful movement" }
10568
+ ],
10569
+ tokenRecipes: {
10570
+ palette: "warm-neutral",
10571
+ contrast: "standard",
10572
+ radius: "soft",
10573
+ shadow: "subtle",
10574
+ typography: "serif-editorial",
10575
+ spacing: "airy",
10576
+ motion: "subtle"
10577
+ },
10578
+ compositionBudget: balancedBudget,
10579
+ themeOverrides: {
10580
+ typography: {
10581
+ body: {
10582
+ family: "Inter, system-ui, sans-serif",
10583
+ size: "md",
10584
+ weight: "regular",
10585
+ lineHeight: "relaxed",
10586
+ letterSpacing: "normal"
10587
+ },
10588
+ headings: {
10589
+ default: {
10590
+ family: '"Cormorant Garamond", Georgia, serif',
10591
+ weight: "regular",
10592
+ lineHeight: "normal",
10593
+ letterSpacing: "normal",
10594
+ colorToken: "text",
10595
+ italic: null,
10596
+ case: null
10597
+ },
10598
+ h1: {
10599
+ size: "xl",
10600
+ weight: "regular",
10601
+ lineHeight: "normal",
10602
+ letterSpacing: "normal",
10603
+ italic: null
10604
+ },
10605
+ h2: {
10606
+ size: "lg",
10607
+ weight: "regular",
10608
+ lineHeight: "normal",
10609
+ letterSpacing: "normal",
10610
+ italic: null
10611
+ },
10612
+ h3: {
10613
+ size: "md",
10614
+ weight: "regular",
10615
+ lineHeight: "normal",
10616
+ letterSpacing: "normal",
10617
+ italic: null
10618
+ }
10619
+ },
10620
+ scale: "majorThird"
10621
+ },
10622
+ bodyText: {
10623
+ intro: {
10624
+ paragraphSize: "default",
10625
+ headingSize: "editorial"
10626
+ }
10627
+ }
10628
+ },
10629
+ recommendedAppearancePresetIds: [
10630
+ "hero-brand-scrim",
10631
+ "intro-soft-earth-statement",
10632
+ "feature-cards-soft-earth-offerings",
10633
+ "testimonials-soft-earth-proof-band",
10634
+ "faq-soft-earth-two-column",
10635
+ "contact-form-panel"
10636
+ ],
10637
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
10638
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
10639
+ buttonPersonalityChoices: [
10640
+ buttonChoice("earth-pill"),
10641
+ buttonChoice("soft-pill"),
10642
+ buttonChoice("pebble"),
10643
+ buttonChoice("editorial-link")
10644
+ ],
10645
+ paletteVariantChoices: [
10646
+ paletteChoice("warm-neutral-soft-earth"),
10647
+ paletteChoice("warm-neutral-clay"),
10648
+ paletteChoice("warm-neutral-forest"),
10649
+ paletteChoice("soft-natural-sage")
10650
+ ]
10651
+ }),
9563
10652
  defineCuratedSiteStyle({
9564
10653
  id: "site-style:bold-launch",
9565
10654
  name: "Bold Launch",
@@ -9613,49 +10702,13 @@ var init_curatedSiteStyles = __esm({
9613
10702
  motion: "expressive"
9614
10703
  },
9615
10704
  compositionBudget: expressiveBudget,
10705
+ typographyPresetChoices: [
10706
+ typographyChoice("typography-preset:bold-display"),
10707
+ typographyChoice("typography-preset:modern-sans"),
10708
+ typographyChoice("typography-preset:luxe-contrast")
10709
+ ],
10710
+ defaultTypographyPresetId: "typography-preset:bold-display",
9616
10711
  themeOverrides: {
9617
- typography: {
9618
- body: {
9619
- family: "Manrope, system-ui, sans-serif",
9620
- size: "lg",
9621
- weight: "regular",
9622
- lineHeight: "relaxed",
9623
- letterSpacing: "normal"
9624
- },
9625
- headings: {
9626
- default: {
9627
- family: '"TAN - PEARL", sans-serif',
9628
- weight: "bold",
9629
- lineHeight: "normal",
9630
- letterSpacing: "tight",
9631
- colorToken: "primary",
9632
- italic: null,
9633
- case: null
9634
- },
9635
- h1: {
9636
- size: "xl",
9637
- weight: "bold",
9638
- lineHeight: "normal",
9639
- letterSpacing: "tight",
9640
- italic: null
9641
- },
9642
- h2: {
9643
- size: "lg",
9644
- weight: "bold",
9645
- lineHeight: "normal",
9646
- letterSpacing: "normal",
9647
- italic: null
9648
- },
9649
- h3: {
9650
- size: "md",
9651
- weight: "bold",
9652
- lineHeight: "normal",
9653
- letterSpacing: "normal",
9654
- italic: null
9655
- }
9656
- },
9657
- scale: "balanced"
9658
- },
9659
10712
  bodyText: {
9660
10713
  intro: {
9661
10714
  paragraphSize: "editorial",
@@ -10406,6 +11459,7 @@ var init_previewCompiler = __esm({
10406
11459
  init_variants();
10407
11460
  init_curatedChoices();
10408
11461
  init_curatedSiteStyles();
11462
+ init_typographyPresets();
10409
11463
  init_resolver2();
10410
11464
  init_types3();
10411
11465
  init_footerLooks();
@@ -10419,6 +11473,7 @@ var init_previewCompiler = __esm({
10419
11473
  init_runtimeCompiler();
10420
11474
  init_curatedChoices();
10421
11475
  init_curatedSiteStyles();
11476
+ init_typographyPresets();
10422
11477
  init_types3();
10423
11478
  }
10424
11479
  });
@@ -10699,6 +11754,13 @@ var init_pageDesignEditorErrors = __esm({
10699
11754
  }
10700
11755
  });
10701
11756
 
11757
+ // ../theme-core/src/site-styles/persistedIdParseResult.ts
11758
+ var init_persistedIdParseResult = __esm({
11759
+ "../theme-core/src/site-styles/persistedIdParseResult.ts"() {
11760
+ "use strict";
11761
+ }
11762
+ });
11763
+
10702
11764
  // ../theme-core/src/site-styles/tokenRecipes.ts
10703
11765
  import { z as z28 } from "zod";
10704
11766
  var themeTokenRecipeOptions, themeTokenRecipesSchema;
@@ -10756,6 +11818,7 @@ var init_site_styles = __esm({
10756
11818
  init_pageDesignEditorModel();
10757
11819
  init_pageDesignIntent();
10758
11820
  init_previewCustomization();
11821
+ init_persistedIdParseResult();
10759
11822
  init_rawStyleFields();
10760
11823
  init_records();
10761
11824
  init_resolver2();
@@ -10764,6 +11827,7 @@ var init_site_styles = __esm({
10764
11827
  init_sourceCatalogs();
10765
11828
  init_styleTags();
10766
11829
  init_tokenRecipes();
11830
+ init_typographyPresets();
10767
11831
  init_types3();
10768
11832
  }
10769
11833
  });
@@ -12008,6 +13072,7 @@ var init_validation_constants = __esm({
12008
13072
  "layout.headerRootClass",
12009
13073
  "layout.footerRootClass",
12010
13074
  "layout.headerRootStyle",
13075
+ "layout.headerSectionBackground",
12011
13076
  "layout.footerRootStyle",
12012
13077
  // UI (ui.ts)
12013
13078
  "ui.headerNavLinkClass",
@@ -14405,8 +15470,9 @@ var init_faqAccordion = __esm({
14405
15470
  },
14406
15471
  fallback: "rb-faq-item"
14407
15472
  },
14408
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
14409
- // Pass icon style from theme
15473
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
15474
+ // Legacy theme accordion style
15475
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
14410
15476
  },
14411
15477
  triggerFrom: "faqItem.question",
14412
15478
  contentFrom: "faqItem.answer"
@@ -46799,6 +47865,9 @@ init_schema3();
46799
47865
  var TEL_RE = /^[+()0-9\s-]{3,}$/;
46800
47866
  var SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
46801
47867
  var ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
47868
+ var DATE_PATTERN = /^(?<year>[1-9]\d{3})-(?<month>\d{2})-(?<day>\d{2})$/;
47869
+ var TIME_PATTERN = /^(?<hours>[01]\d|2[0-3]):(?<minutes>[0-5]\d)$/;
47870
+ var DATETIME_PATTERN = /^(?<date>[1-9]\d{3}-\d{2}-\d{2})T(?<time>(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)(?:\.\d+)?(?<offset>Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/;
46802
47871
  function assertNever6(value) {
46803
47872
  throw new Error(`Unhandled field validation variant: ${JSON.stringify(value)}`);
46804
47873
  }
@@ -46831,6 +47900,12 @@ function fieldIssueToMessage(issue2) {
46831
47900
  return "Check the format and try again";
46832
47901
  case "invalidUrl":
46833
47902
  return "Enter a valid web address";
47903
+ case "invalidDate":
47904
+ return "Choose a valid date";
47905
+ case "invalidTime":
47906
+ return "Choose a valid time";
47907
+ case "invalidDateTime":
47908
+ return "Choose a valid date and time";
46834
47909
  case "invalidNumber":
46835
47910
  return `${issue2.label} needs a number`;
46836
47911
  case "tooSmall":
@@ -46867,12 +47942,16 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
46867
47942
  case "text": {
46868
47943
  const inputType = field.ui?.inputType;
46869
47944
  if (inputType === "number") {
46870
- const constraints2 = commonConstraints(required, { kind: "numberType" });
47945
+ const constraints2 = commonConstraints(required, {
47946
+ kind: "numberType"
47947
+ });
46871
47948
  if (typeof field.ui?.min === "number") constraints2.push({ kind: "numberMin", minimum: field.ui.min });
46872
47949
  if (typeof field.ui?.max === "number") constraints2.push({ kind: "numberMax", maximum: field.ui.max });
46873
47950
  return makePlan("number", "number", field, path, required, constraints2);
46874
47951
  }
46875
- const constraints = commonConstraints(required, { kind: "textType" });
47952
+ const constraints = commonConstraints(required, {
47953
+ kind: "textType"
47954
+ });
46876
47955
  if (inputType === "email") constraints.push({ kind: "emailFormat" });
46877
47956
  if (inputType === "tel") constraints.push({ kind: "phoneFormat" });
46878
47957
  if (field.ui?.pattern) constraints.push({ kind: "patternFormat", pattern: field.ui.pattern });
@@ -46880,7 +47959,9 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
46880
47959
  return makePlan("string", "string", field, path, required, constraints);
46881
47960
  }
46882
47961
  case "number": {
46883
- const constraints = commonConstraints(required, { kind: "numberType" });
47962
+ const constraints = commonConstraints(required, {
47963
+ kind: "numberType"
47964
+ });
46884
47965
  if (typeof field.min === "number") constraints.push({ kind: "numberMin", minimum: field.min });
46885
47966
  if (typeof field.max === "number") constraints.push({ kind: "numberMax", maximum: field.max });
46886
47967
  return makePlan("number", "number", field, path, required, constraints);
@@ -46891,23 +47972,42 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
46891
47972
  return makePlan("string", "string", field, path, required, constraints);
46892
47973
  }
46893
47974
  case "url":
46894
- return makePlan("string", "string", field, path, required, commonConstraints(
47975
+ return makePlan(
47976
+ "string",
47977
+ "string",
47978
+ field,
47979
+ path,
46895
47980
  required,
46896
- { kind: "textType" },
46897
- { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) }
46898
- ));
47981
+ commonConstraints(required, { kind: "textType" }, { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) })
47982
+ );
46899
47983
  case "reference":
46900
47984
  return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "referenceText" }));
46901
47985
  case "date":
47986
+ return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "textType" }, { kind: "dateFormat" }));
46902
47987
  case "time":
47988
+ return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "textType" }, { kind: "timeFormat" }));
46903
47989
  case "datetime":
46904
- return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "textType" }));
47990
+ return makePlan(
47991
+ "string",
47992
+ "string",
47993
+ field,
47994
+ path,
47995
+ required,
47996
+ commonConstraints(required, { kind: "textType" }, { kind: "datetimeFormat" })
47997
+ );
46905
47998
  case "select":
46906
- return makePlan("select", "select", field, path, required, commonConstraints(required, {
46907
- kind: "selectOption",
46908
- source: resolveSelectConstraintSource(field),
46909
- multiple: Boolean(field.multiple)
46910
- }));
47999
+ return makePlan(
48000
+ "select",
48001
+ "select",
48002
+ field,
48003
+ path,
48004
+ required,
48005
+ commonConstraints(required, {
48006
+ kind: "selectOption",
48007
+ source: resolveSelectConstraintSource(field),
48008
+ multiple: Boolean(field.multiple)
48009
+ })
48010
+ );
46911
48011
  case "richText":
46912
48012
  return makePlan("richText", "object", field, path, required, commonConstraints(required, { kind: "richTextDoc" }));
46913
48013
  case "media":
@@ -46920,7 +48020,11 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
46920
48020
  case "repeater":
46921
48021
  return {
46922
48022
  ...makePlan("repeater", "array", field, path, required, commonConstraints(required, { kind: "arrayType" })),
46923
- ...field.polymorphic && field.itemTypes ? { repeatedItemVariants: deriveRepeatedItemVariants(field, [...path, 0]) } : { repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path, 0]) },
48023
+ ...field.polymorphic && field.itemTypes ? {
48024
+ repeatedItemVariants: deriveRepeatedItemVariants(field, [...path, 0])
48025
+ } : {
48026
+ repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path, 0])
48027
+ },
46924
48028
  constraints: withRepeaterItemConstraints(field, commonConstraints(required, { kind: "arrayType" }))
46925
48029
  };
46926
48030
  case "group":
@@ -47005,7 +48109,10 @@ function resolveSelectConstraintSource(field) {
47005
48109
  const source = normalizeSelectSource(field);
47006
48110
  switch (source.kind) {
47007
48111
  case "static":
47008
- return { kind: "static", values: field.options.map((option) => option.value) };
48112
+ return {
48113
+ kind: "static",
48114
+ values: field.options.map((option) => option.value)
48115
+ };
47009
48116
  case "site":
47010
48117
  case "sdk":
47011
48118
  return { kind: "runtime", source: source.kind };
@@ -47101,7 +48208,9 @@ function normalizeFieldValue(plan, value, ctx) {
47101
48208
  }
47102
48209
  function normalizeObjectChildren(children, value, ctx) {
47103
48210
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
47104
- const normalized = { ...value };
48211
+ const normalized = {
48212
+ ...value
48213
+ };
47105
48214
  for (const child of children) {
47106
48215
  normalized[child.fieldId] = normalizeFieldValue(child, normalized[child.fieldId], ctx);
47107
48216
  }
@@ -47195,6 +48304,12 @@ function validateStringConstraint(plan, constraint, value) {
47195
48304
  }
47196
48305
  case "urlFormat":
47197
48306
  return isValidUrl(value, constraint.allowRelative) ? [] : [issue(plan, "invalidUrl")];
48307
+ case "dateFormat":
48308
+ return isValidDateString(value) ? [] : [issue(plan, "invalidDate")];
48309
+ case "timeFormat":
48310
+ return isValidTimeString(value) ? [] : [issue(plan, "invalidTime")];
48311
+ case "datetimeFormat":
48312
+ return isValidDateTimeInstantString(value) ? [] : [issue(plan, "invalidDateTime")];
47198
48313
  case "slugFormat":
47199
48314
  return SLUG_PATTERN.test(value) ? [] : [issue(plan, "invalidSlug")];
47200
48315
  default:
@@ -47231,17 +48346,24 @@ function validateRepeaterPlan(plan, value, ctx) {
47231
48346
  case "arrayType":
47232
48347
  return [];
47233
48348
  case "minItems":
47234
- return value.length < constraint.minimum ? [issue(plan, "tooFewItems", { minimum: constraint.minimum, itemLabel: "item" })] : [];
48349
+ return value.length < constraint.minimum ? [
48350
+ issue(plan, "tooFewItems", {
48351
+ minimum: constraint.minimum,
48352
+ itemLabel: "item"
48353
+ })
48354
+ ] : [];
47235
48355
  case "maxItems":
47236
- return value.length > constraint.maximum ? [issue(plan, "tooManyItems", { maximum: constraint.maximum, itemLabel: "item" })] : [];
48356
+ return value.length > constraint.maximum ? [
48357
+ issue(plan, "tooManyItems", {
48358
+ maximum: constraint.maximum,
48359
+ itemLabel: "item"
48360
+ })
48361
+ ] : [];
47237
48362
  default:
47238
48363
  return assertNever6(constraint);
47239
48364
  }
47240
48365
  });
47241
- return [
47242
- ...constraintIssues,
47243
- ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))
47244
- ];
48366
+ return [...constraintIssues, ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))];
47245
48367
  }
47246
48368
  function validateRepeaterItem(plan, item, index, ctx) {
47247
48369
  if (!isPlainObject(item)) return [];
@@ -47284,9 +48406,7 @@ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
47284
48406
  }))
47285
48407
  } : {},
47286
48408
  ...plan.repeatedItemPlan ? {
47287
- repeatedItemPlan: plan.repeatedItemPlan.map(
47288
- (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
47289
- )
48409
+ repeatedItemPlan: plan.repeatedItemPlan.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
47290
48410
  } : {}
47291
48411
  };
47292
48412
  case "string":
@@ -47373,6 +48493,9 @@ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
47373
48493
  case "invalidPhone":
47374
48494
  case "invalidPattern":
47375
48495
  case "invalidUrl":
48496
+ case "invalidDate":
48497
+ case "invalidTime":
48498
+ case "invalidDateTime":
47376
48499
  case "invalidNumber":
47377
48500
  case "tooSmall":
47378
48501
  case "tooLarge":
@@ -47412,6 +48535,53 @@ function isValidUrl(value, allowRelative) {
47412
48535
  return false;
47413
48536
  }
47414
48537
  }
48538
+ function isValidDateString(value) {
48539
+ const match = DATE_PATTERN.exec(value);
48540
+ if (!match?.groups) return false;
48541
+ const year = Number(match.groups.year);
48542
+ const month = Number(match.groups.month);
48543
+ const day = Number(match.groups.day);
48544
+ return isValidCalendarDate(year, month, day);
48545
+ }
48546
+ function isValidTimeString(value) {
48547
+ return TIME_PATTERN.test(value);
48548
+ }
48549
+ function isValidDateTimeInstantString(value) {
48550
+ const match = DATETIME_PATTERN.exec(value);
48551
+ if (!match?.groups) return false;
48552
+ const datePart = match.groups.date;
48553
+ if (!datePart || !isValidDateString(datePart)) return false;
48554
+ return !Number.isNaN(Date.parse(value));
48555
+ }
48556
+ function isValidCalendarDate(year, month, day) {
48557
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) return false;
48558
+ if (year < 1 || month < 1 || month > 12) return false;
48559
+ return day >= 1 && day <= daysInMonth(year, month);
48560
+ }
48561
+ function daysInMonth(year, month) {
48562
+ switch (month) {
48563
+ case 2:
48564
+ return isLeapYear(year) ? 29 : 28;
48565
+ case 4:
48566
+ case 6:
48567
+ case 9:
48568
+ case 11:
48569
+ return 30;
48570
+ case 1:
48571
+ case 3:
48572
+ case 5:
48573
+ case 7:
48574
+ case 8:
48575
+ case 10:
48576
+ case 12:
48577
+ return 31;
48578
+ default:
48579
+ return 0;
48580
+ }
48581
+ }
48582
+ function isLeapYear(year) {
48583
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
48584
+ }
47415
48585
  function isValidSelectValue(value, values, multiple) {
47416
48586
  if (multiple) {
47417
48587
  return Array.isArray(value) && value.every((item) => typeof item === "string" && values.includes(item));
@@ -47731,6 +48901,342 @@ var heroBlockDefinition = {
47731
48901
  manifest: heroManifest
47732
48902
  };
47733
48903
 
48904
+ // ../blocks/src/system/blocks/intro.ts
48905
+ init_defineBlock();
48906
+
48907
+ // ../blocks/src/system/fields/aspectRatio.ts
48908
+ var standardAspectRatioOptions = [
48909
+ { value: "auto", label: "Auto (original)" },
48910
+ { value: "16/9", label: "16:9 (Landscape)" },
48911
+ { value: "4/3", label: "4:3 (Standard)" },
48912
+ { value: "1/1", label: "1:1 (Square)" },
48913
+ { value: "3/4", label: "3:4 (Portrait)" }
48914
+ ];
48915
+ function createAspectRatioField(options = {}) {
48916
+ return {
48917
+ id: options.id ?? "aspectRatio",
48918
+ type: "select",
48919
+ label: options.label ?? "Aspect ratio",
48920
+ ...options.description ? { description: options.description } : {},
48921
+ required: false,
48922
+ defaultValue: options.defaultValue ?? "auto",
48923
+ multiple: false,
48924
+ options: [...standardAspectRatioOptions],
48925
+ ui: {
48926
+ intent: options.uiIntent ?? "display",
48927
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
48928
+ }
48929
+ };
48930
+ }
48931
+
48932
+ // ../blocks/src/system/blocks/intro.ts
48933
+ init_ctas();
48934
+
48935
+ // ../blocks/src/system/fields/imageLayout.ts
48936
+ function createImageColSizeField(options = {}) {
48937
+ const {
48938
+ id = "imageColSize",
48939
+ label = "Image column size",
48940
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
48941
+ defaultValue = "1/3",
48942
+ uiIntent = "display",
48943
+ visibleWhen
48944
+ } = options;
48945
+ return {
48946
+ id,
48947
+ type: "select",
48948
+ label,
48949
+ description,
48950
+ required: false,
48951
+ defaultValue,
48952
+ multiple: false,
48953
+ options: [
48954
+ { value: "1/4", label: "Small (1/4)" },
48955
+ { value: "1/3", label: "Medium (1/3)" },
48956
+ { value: "2/5", label: "Large (2/5)" },
48957
+ { value: "1/2", label: "Extra large (1/2)" },
48958
+ { value: "2/3", label: "Huge (2/3)" }
48959
+ ],
48960
+ ui: {
48961
+ intent: uiIntent,
48962
+ ...visibleWhen ? { visibleWhen } : {}
48963
+ }
48964
+ };
48965
+ }
48966
+ function createImagePositionField(options = {}) {
48967
+ const {
48968
+ id = "imagePosition",
48969
+ label = "Image position",
48970
+ description = "Choose which side the image appears on.",
48971
+ defaultValue = "left",
48972
+ includeAlternate = false,
48973
+ uiIntent = "display",
48974
+ visibleWhen
48975
+ } = options;
48976
+ const positionOptions = [
48977
+ { value: "left", label: "Left" },
48978
+ { value: "right", label: "Right" },
48979
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
48980
+ ];
48981
+ return {
48982
+ id,
48983
+ type: "select",
48984
+ label,
48985
+ description,
48986
+ required: false,
48987
+ defaultValue,
48988
+ multiple: false,
48989
+ // Spread to get a mutable array type without unsafe casts.
48990
+ options: [...positionOptions],
48991
+ ui: {
48992
+ intent: uiIntent,
48993
+ ...visibleWhen ? { visibleWhen } : {}
48994
+ }
48995
+ };
48996
+ }
48997
+
48998
+ // ../blocks/src/system/blocks/intro.ts
48999
+ init_builder();
49000
+ init_fragments();
49001
+ function introHeading(className) {
49002
+ return text(
49003
+ {
49004
+ as: "h2",
49005
+ className
49006
+ },
49007
+ when("content.title"),
49008
+ bind("content.title")
49009
+ );
49010
+ }
49011
+ function introBody(className = "rb-prose rb-max-w-none") {
49012
+ return richText({ className }, bind("content.body"));
49013
+ }
49014
+ function introCtas(justify = "start") {
49015
+ return ctaRow({
49016
+ justify,
49017
+ gap: "md",
49018
+ containerClassName: "rb-mt-2"
49019
+ });
49020
+ }
49021
+ function introCopyStack(options = {}) {
49022
+ return stack(
49023
+ {
49024
+ gap: "md",
49025
+ className: options.className ?? "rb-intro-copy"
49026
+ },
49027
+ [
49028
+ introHeading(options.headingClassName ?? "rb-intro-title"),
49029
+ introBody(options.bodyClassName),
49030
+ introCtas(options.ctaJustify)
49031
+ ]
49032
+ );
49033
+ }
49034
+ var introMedia = media(
49035
+ {
49036
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
49037
+ style: {
49038
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
49039
+ }
49040
+ },
49041
+ bind("content.media")
49042
+ );
49043
+ var centeredCopyLayout = styledSection({
49044
+ children: styledContainer({
49045
+ rootType: "stack",
49046
+ rootProps: { gap: "lg" },
49047
+ children: [
49048
+ introCopyStack({
49049
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
49050
+ headingClassName: "rb-intro-title rb-text-center",
49051
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
49052
+ ctaJustify: "center"
49053
+ })
49054
+ ]
49055
+ }),
49056
+ baseClass: "",
49057
+ spacing: "medium"
49058
+ });
49059
+ var statementCopyLayout = styledSection({
49060
+ children: styledContainer({
49061
+ children: [
49062
+ el(
49063
+ "div",
49064
+ {
49065
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
49066
+ },
49067
+ [
49068
+ introHeading("rb-intro-title rb-max-w-xl"),
49069
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
49070
+ introBody(),
49071
+ introCtas("start")
49072
+ ])
49073
+ ]
49074
+ )
49075
+ ]
49076
+ }),
49077
+ baseClass: "",
49078
+ spacing: "medium"
49079
+ });
49080
+ var statementMediaLayout = styledSection({
49081
+ children: styledContainer({
49082
+ children: [
49083
+ el(
49084
+ "div",
49085
+ {
49086
+ className: "rb-intro rb-intro-statement-media rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-3 rb-lg-items-center"
49087
+ },
49088
+ [
49089
+ introHeading("rb-intro-title rb-max-w-xl"),
49090
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
49091
+ introBody(),
49092
+ introCtas("start")
49093
+ ]),
49094
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
49095
+ ]
49096
+ )
49097
+ ]
49098
+ }),
49099
+ baseClass: "",
49100
+ spacing: "medium"
49101
+ });
49102
+ var mediaCopyLayout = styledSection({
49103
+ children: styledContainer({
49104
+ children: [
49105
+ responsiveTwoColumn({
49106
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
49107
+ text: introCopyStack({
49108
+ className: "rb-intro-copy rb-max-w-xl",
49109
+ headingClassName: "rb-intro-title"
49110
+ }),
49111
+ ratioFrom: "content.ratio",
49112
+ imagePositionFrom: "content.imagePosition",
49113
+ gapFrom: "content.gap",
49114
+ gapFallback: "comfortable",
49115
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
49116
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
49117
+ })
49118
+ ]
49119
+ }),
49120
+ baseClass: "",
49121
+ spacing: "medium"
49122
+ });
49123
+ var introConfig = {
49124
+ id: "block.intro",
49125
+ title: "Intro",
49126
+ category: "layout",
49127
+ includeContainerStyles: true,
49128
+ titleSource: "title",
49129
+ additionalFields: [
49130
+ {
49131
+ id: "title",
49132
+ type: "text",
49133
+ label: "Statement",
49134
+ required: false,
49135
+ multiline: true,
49136
+ maxLength: 160
49137
+ },
49138
+ {
49139
+ id: "body",
49140
+ type: "richText",
49141
+ label: "Text",
49142
+ required: true,
49143
+ ui: {
49144
+ richTextVariant: "limited"
49145
+ }
49146
+ },
49147
+ {
49148
+ id: "media",
49149
+ type: "media",
49150
+ label: "Media",
49151
+ required: false,
49152
+ mediaKinds: ["image"],
49153
+ ui: {
49154
+ intent: "content",
49155
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
49156
+ }
49157
+ },
49158
+ createImagePositionField({
49159
+ id: "imagePosition",
49160
+ label: "Image position",
49161
+ defaultValue: "left",
49162
+ uiIntent: "display",
49163
+ visibleWhen: { field: "variant", equals: "media-copy" }
49164
+ }),
49165
+ {
49166
+ id: "gap",
49167
+ type: "select",
49168
+ label: "Gap between media and text",
49169
+ required: false,
49170
+ defaultValue: "comfortable",
49171
+ multiple: false,
49172
+ options: [
49173
+ { value: "none", label: "None" },
49174
+ { value: "compact", label: "Compact" },
49175
+ { value: "cozy", label: "Cozy" },
49176
+ { value: "medium", label: "Medium" },
49177
+ { value: "comfortable", label: "Comfortable" },
49178
+ { value: "spacious", label: "Spacious" }
49179
+ ],
49180
+ ui: {
49181
+ intent: "display",
49182
+ visibleWhen: { field: "variant", equals: "media-copy" }
49183
+ }
49184
+ },
49185
+ createImageColSizeField({
49186
+ id: "ratio",
49187
+ label: "Media column size",
49188
+ defaultValue: "1/2",
49189
+ uiIntent: "display",
49190
+ visibleWhen: { field: "variant", equals: "media-copy" }
49191
+ }),
49192
+ createAspectRatioField({
49193
+ id: "aspectRatio",
49194
+ label: "Media aspect ratio",
49195
+ description: "Crop media to a consistent aspect ratio.",
49196
+ defaultValue: "auto",
49197
+ visibleWhen: { field: "media", notEquals: null }
49198
+ }),
49199
+ createCtasRepeater({
49200
+ label: "Calls to action",
49201
+ itemLabel: "CTA",
49202
+ maxItems: 2
49203
+ })
49204
+ ],
49205
+ layout: centeredCopyLayout,
49206
+ variants: {
49207
+ "centered-copy": centeredCopyLayout,
49208
+ "statement-copy": statementCopyLayout,
49209
+ "statement-media": statementMediaLayout,
49210
+ "media-copy": mediaCopyLayout
49211
+ },
49212
+ defaultVariant: "statement-copy",
49213
+ variantOptions: {
49214
+ "centered-copy": {
49215
+ label: "Centered copy",
49216
+ description: "A focused intro with centered text and optional calls to action."
49217
+ },
49218
+ "statement-copy": {
49219
+ label: "Statement and copy",
49220
+ description: "A large statement on the left with supporting copy on the right."
49221
+ },
49222
+ "statement-media": {
49223
+ label: "Statement, copy and media",
49224
+ description: "A three-part intro with statement, copy and a small image."
49225
+ },
49226
+ "media-copy": {
49227
+ label: "Media and copy",
49228
+ description: "A compact media/text intro for softer transitions after a hero."
49229
+ }
49230
+ },
49231
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
49232
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
49233
+ icon: "PanelTopOpen"
49234
+ };
49235
+ var introManifest = createBlockManifest(introConfig);
49236
+ var introBlockDefinition = {
49237
+ manifest: introManifest
49238
+ };
49239
+
47734
49240
  // ../blocks/src/system/blocks/body-text.ts
47735
49241
  init_styledSection();
47736
49242
  init_defineBlock();
@@ -48328,6 +49834,37 @@ var faqComposition = composeFragments([
48328
49834
  { fragment: faqHeadingFragment, fieldPriority: 0 },
48329
49835
  { fragment: faqAccordionFragment, fieldPriority: 1 }
48330
49836
  ]);
49837
+ function fragmentLayoutNode(layout) {
49838
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
49839
+ }
49840
+ function isNodeDefinitionArray(layout) {
49841
+ return Array.isArray(layout);
49842
+ }
49843
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
49844
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
49845
+ var defaultLayout = styledSection({
49846
+ children: styledContainer({
49847
+ baseClassName: "rb-relative rb-isolate",
49848
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
49849
+ }),
49850
+ baseClass: ""
49851
+ });
49852
+ var twoColumnLayout = styledSection({
49853
+ children: styledContainer({
49854
+ baseClassName: "rb-relative rb-isolate",
49855
+ children: el(
49856
+ "div",
49857
+ {
49858
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
49859
+ },
49860
+ [
49861
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
49862
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
49863
+ ]
49864
+ )
49865
+ }),
49866
+ baseClass: ""
49867
+ });
48331
49868
  var faqManifest = createBlockManifest({
48332
49869
  id: "block.faq",
48333
49870
  title: "FAQ",
@@ -48344,13 +49881,22 @@ var faqManifest = createBlockManifest({
48344
49881
  label: "FAQ item styles"
48345
49882
  })
48346
49883
  ],
48347
- layout: styledSection({
48348
- children: styledContainer({
48349
- baseClassName: "rb-relative rb-isolate",
48350
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
48351
- }),
48352
- baseClass: ""
48353
- }),
49884
+ layout: defaultLayout,
49885
+ variants: {
49886
+ default: defaultLayout,
49887
+ "two-column": twoColumnLayout
49888
+ },
49889
+ defaultVariant: "default",
49890
+ variantOptions: {
49891
+ default: {
49892
+ label: "Default",
49893
+ description: "A centered heading above one FAQ accordion."
49894
+ },
49895
+ "two-column": {
49896
+ label: "Two column",
49897
+ description: "A left heading column with FAQ items on the right."
49898
+ }
49899
+ },
48354
49900
  description: "Accordion of frequently asked questions and answers.",
48355
49901
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
48356
49902
  icon: "HelpCircle"
@@ -49012,7 +50558,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
49012
50558
  function resolveHeaderVisualStyles(header, tokens) {
49013
50559
  const navContainerType = header?.navContainer?.type ?? "none";
49014
50560
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
49015
- if (hasContainedNav) {
50561
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
50562
+ if (hasContainedNav || hasTransparentVariant) {
49016
50563
  return {
49017
50564
  backgroundToken: "transparent",
49018
50565
  paletteHex: null,
@@ -49141,6 +50688,17 @@ var headerRootStyleTransform = {
49141
50688
  return mergeStyles(...styleParts);
49142
50689
  }
49143
50690
  };
50691
+ var headerSectionBackgroundTransform = {
50692
+ id: "layout.headerSectionBackground",
50693
+ kind: "string",
50694
+ summary: "Resolve the inner site-header section background token",
50695
+ run: (value) => {
50696
+ const header = asPartialObject(value);
50697
+ const navContainerType = header?.navContainer?.type ?? "none";
50698
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
50699
+ return usesTransparentRoot ? "raw:transparent" : "background";
50700
+ }
50701
+ };
49144
50702
  var footerRootStyleTransform = {
49145
50703
  id: "layout.footerRootStyle",
49146
50704
  kind: "formatter",
@@ -49399,6 +50957,7 @@ var layoutTransforms = [
49399
50957
  headerRootClassTransform,
49400
50958
  footerRootClassTransform,
49401
50959
  headerRootStyleTransform,
50960
+ headerSectionBackgroundTransform,
49402
50961
  footerRootStyleTransform,
49403
50962
  footerBottomBarClassTransform,
49404
50963
  footerBottomBarContainerClassTransform,
@@ -49938,7 +51497,10 @@ var editorialLayout = stack(
49938
51497
  );
49939
51498
  var headerLayout = headerSection(
49940
51499
  {
49941
- background: "background",
51500
+ background: bindProp("$root.theme.header", {
51501
+ transforms: pipe(tx("layout.headerSectionBackground")),
51502
+ fallback: "background"
51503
+ }),
49942
51504
  allowOverflow: true,
49943
51505
  className: bindProp("$root.theme.header", {
49944
51506
  transforms: pipe(tx("layout.headerRootClass")),
@@ -50879,6 +52441,231 @@ var collectionBlockDefinition = {
50879
52441
  manifest: collectionManifest
50880
52442
  };
50881
52443
 
52444
+ // ../blocks/src/system/blocks/feature-cards.ts
52445
+ init_defineBlock();
52446
+ init_boxStyles2();
52447
+ init_ctas();
52448
+ init_builder();
52449
+ init_fragments();
52450
+ init_colorStyles();
52451
+ function grid3(props2, children) {
52452
+ return el("grid", props2 ?? void 0, children ?? void 0);
52453
+ }
52454
+ var sectionHeading = stack(
52455
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
52456
+ [
52457
+ text(
52458
+ {
52459
+ as: "h2",
52460
+ className: "rb-feature-cards-title rb-text-center"
52461
+ },
52462
+ when("content.title"),
52463
+ bind("content.title")
52464
+ ),
52465
+ richText(
52466
+ {
52467
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
52468
+ style: textColorStyle("mutedText")
52469
+ },
52470
+ when("content.description"),
52471
+ bind("content.description")
52472
+ )
52473
+ ]
52474
+ );
52475
+ var featureCard = styledCard(
52476
+ [
52477
+ media(
52478
+ {
52479
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
52480
+ style: {
52481
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
52482
+ }
52483
+ },
52484
+ when("card.media"),
52485
+ bind("card.media")
52486
+ ),
52487
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
52488
+ text(
52489
+ {
52490
+ as: "h3",
52491
+ className: "rb-feature-card-title"
52492
+ },
52493
+ bind("card.title")
52494
+ ),
52495
+ richText(
52496
+ {
52497
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
52498
+ style: textColorStyle("mutedText")
52499
+ },
52500
+ when("card.body"),
52501
+ bind("card.body")
52502
+ ),
52503
+ ctaRow({
52504
+ collectionPath: "ctas",
52505
+ itemName: "cta",
52506
+ gap: "sm",
52507
+ justify: "start",
52508
+ containerClassName: "rb-mt-auto"
52509
+ })
52510
+ ])
52511
+ ],
52512
+ {
52513
+ stylesFrom: "content._cardStyles",
52514
+ backgroundFrom: "content._cardStyles.background",
52515
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
52516
+ },
52517
+ repeat("content.cards", "card")
52518
+ );
52519
+ var cardsLayout = styledSection({
52520
+ children: styledContainer({
52521
+ rootType: "stack",
52522
+ rootProps: { gap: "xl" },
52523
+ children: [
52524
+ sectionHeading,
52525
+ grid3(
52526
+ {
52527
+ cols: {
52528
+ $bind: {
52529
+ from: "content.columns",
52530
+ fallback: 3,
52531
+ coerce: "number"
52532
+ }
52533
+ },
52534
+ gap: "lg"
52535
+ },
52536
+ [featureCard]
52537
+ )
52538
+ ]
52539
+ }),
52540
+ baseClass: "",
52541
+ spacing: "medium"
52542
+ });
52543
+ var featureCardsConfig = {
52544
+ id: "block.feature-cards",
52545
+ title: "Feature Cards",
52546
+ category: "layout",
52547
+ includeContainerStyles: true,
52548
+ titleSource: "title",
52549
+ additionalFields: [
52550
+ {
52551
+ id: "title",
52552
+ type: "text",
52553
+ label: "Title",
52554
+ required: false,
52555
+ multiline: false,
52556
+ maxLength: 120
52557
+ },
52558
+ {
52559
+ id: "description",
52560
+ type: "richText",
52561
+ label: "Description",
52562
+ required: false,
52563
+ ui: {
52564
+ richTextVariant: "limited"
52565
+ }
52566
+ },
52567
+ {
52568
+ id: "columns",
52569
+ type: "select",
52570
+ label: "Columns",
52571
+ required: false,
52572
+ defaultValue: "3",
52573
+ multiple: false,
52574
+ options: [
52575
+ { value: "2", label: "2 columns" },
52576
+ { value: "3", label: "3 columns" },
52577
+ { value: "4", label: "4 columns" }
52578
+ ],
52579
+ ui: { intent: "display" }
52580
+ },
52581
+ {
52582
+ id: "cards",
52583
+ type: "repeater",
52584
+ label: "Cards",
52585
+ required: false,
52586
+ minItems: 1,
52587
+ maxItems: 8,
52588
+ itemLabel: "Card",
52589
+ itemLabelSource: "title",
52590
+ allowConversion: true,
52591
+ ui: {
52592
+ intent: "content"
52593
+ },
52594
+ schema: {
52595
+ fields: [
52596
+ {
52597
+ id: "media",
52598
+ type: "media",
52599
+ label: "Image",
52600
+ required: false,
52601
+ mediaKinds: ["image"]
52602
+ },
52603
+ createAspectRatioField({
52604
+ id: "aspectRatio",
52605
+ label: "Image aspect ratio",
52606
+ defaultValue: "4/3",
52607
+ visibleWhen: { field: "media", notEquals: null }
52608
+ }),
52609
+ {
52610
+ id: "title",
52611
+ type: "text",
52612
+ label: "Title",
52613
+ required: true,
52614
+ multiline: false,
52615
+ maxLength: 120
52616
+ },
52617
+ {
52618
+ id: "body",
52619
+ type: "richText",
52620
+ label: "Text",
52621
+ required: false,
52622
+ ui: {
52623
+ richTextVariant: "limited"
52624
+ }
52625
+ },
52626
+ createCtasRepeater({
52627
+ label: "Calls to action",
52628
+ itemLabel: "CTA",
52629
+ maxItems: 1,
52630
+ button: {
52631
+ variants: [
52632
+ { value: "primary", label: "Primary" },
52633
+ { value: "secondary", label: "Secondary" },
52634
+ { value: "outline", label: "Outline" },
52635
+ { value: "ghost", label: "Ghost" },
52636
+ { value: "link", label: "Link" }
52637
+ ],
52638
+ defaultVariant: "ghost"
52639
+ }
52640
+ })
52641
+ ]
52642
+ }
52643
+ },
52644
+ cardStylesField({
52645
+ id: "_cardStyles",
52646
+ label: "Card styles"
52647
+ })
52648
+ ],
52649
+ layout: cardsLayout,
52650
+ variants: {
52651
+ cards: cardsLayout
52652
+ },
52653
+ defaultVariant: "cards",
52654
+ variantOptions: {
52655
+ cards: {
52656
+ label: "Cards",
52657
+ description: "A responsive grid of image cards with optional calls to action."
52658
+ }
52659
+ },
52660
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
52661
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
52662
+ icon: "PanelsTopLeft"
52663
+ };
52664
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
52665
+ var featureCardsBlockDefinition = {
52666
+ manifest: featureCardsManifest
52667
+ };
52668
+
50882
52669
  // ../blocks/src/system/blocks/media-text.ts
50883
52670
  init_defineBlock();
50884
52671
 
@@ -50975,69 +52762,6 @@ function createCarouselBehaviorFields(options = {}) {
50975
52762
  return fields3;
50976
52763
  }
50977
52764
 
50978
- // ../blocks/src/system/fields/imageLayout.ts
50979
- function createImageColSizeField(options = {}) {
50980
- const {
50981
- id = "imageColSize",
50982
- label = "Image column size",
50983
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
50984
- defaultValue = "1/3",
50985
- uiIntent = "display",
50986
- visibleWhen
50987
- } = options;
50988
- return {
50989
- id,
50990
- type: "select",
50991
- label,
50992
- description,
50993
- required: false,
50994
- defaultValue,
50995
- multiple: false,
50996
- options: [
50997
- { value: "1/4", label: "Small (1/4)" },
50998
- { value: "1/3", label: "Medium (1/3)" },
50999
- { value: "2/5", label: "Large (2/5)" },
51000
- { value: "1/2", label: "Extra large (1/2)" },
51001
- { value: "2/3", label: "Huge (2/3)" }
51002
- ],
51003
- ui: {
51004
- intent: uiIntent,
51005
- ...visibleWhen ? { visibleWhen } : {}
51006
- }
51007
- };
51008
- }
51009
- function createImagePositionField(options = {}) {
51010
- const {
51011
- id = "imagePosition",
51012
- label = "Image position",
51013
- description = "Choose which side the image appears on.",
51014
- defaultValue = "left",
51015
- includeAlternate = false,
51016
- uiIntent = "display",
51017
- visibleWhen
51018
- } = options;
51019
- const positionOptions = [
51020
- { value: "left", label: "Left" },
51021
- { value: "right", label: "Right" },
51022
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
51023
- ];
51024
- return {
51025
- id,
51026
- type: "select",
51027
- label,
51028
- description,
51029
- required: false,
51030
- defaultValue,
51031
- multiple: false,
51032
- // Spread to get a mutable array type without unsafe casts.
51033
- options: [...positionOptions],
51034
- ui: {
51035
- intent: uiIntent,
51036
- ...visibleWhen ? { visibleWhen } : {}
51037
- }
51038
- };
51039
- }
51040
-
51041
52765
  // ../blocks/src/system/blocks/media-text.ts
51042
52766
  var mediaTextFrameCapability = defineFrameCapability([
51043
52767
  "plain",
@@ -51161,26 +52885,13 @@ var mediaTextManifest = createBlockManifest({
51161
52885
  },
51162
52886
  ui: { intent: "behavior" }
51163
52887
  }),
51164
- {
52888
+ createAspectRatioField({
51165
52889
  id: "aspectRatio",
51166
- type: "select",
51167
52890
  label: "Media aspect ratio",
51168
52891
  description: "Crop media to a consistent aspect ratio.",
51169
- required: false,
51170
52892
  defaultValue: "auto",
51171
- multiple: false,
51172
- options: [
51173
- { value: "auto", label: "Auto (original)" },
51174
- { value: "16/9", label: "16:9 (Landscape)" },
51175
- { value: "4/3", label: "4:3 (Standard)" },
51176
- { value: "1/1", label: "1:1 (Square)" },
51177
- { value: "3/4", label: "3:4 (Portrait)" }
51178
- ],
51179
- ui: {
51180
- intent: "display",
51181
- visibleWhen: { field: "images", notEquals: null }
51182
- }
51183
- },
52893
+ visibleWhen: { field: "images", notEquals: null }
52894
+ }),
51184
52895
  {
51185
52896
  id: "text",
51186
52897
  type: "richText",
@@ -51310,7 +53021,7 @@ var mediaTextManifest = createBlockManifest({
51310
53021
  whenImagesLength(0)
51311
53022
  );
51312
53023
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
51313
- const defaultLayout = styledSection({
53024
+ const defaultLayout2 = styledSection({
51314
53025
  children: styledContainer({
51315
53026
  rootType: "stack",
51316
53027
  rootProps: { gap: "lg" },
@@ -51342,9 +53053,9 @@ var mediaTextManifest = createBlockManifest({
51342
53053
  spacing: "medium"
51343
53054
  });
51344
53055
  return {
51345
- layout: defaultLayout,
53056
+ layout: defaultLayout2,
51346
53057
  variants: {
51347
- default: defaultLayout
53058
+ default: defaultLayout2
51348
53059
  },
51349
53060
  defaultVariant: "default",
51350
53061
  variantOptions: {
@@ -53373,7 +55084,7 @@ init_builder();
53373
55084
  init_colorStyles();
53374
55085
  init_defineBlock();
53375
55086
  init_fragments();
53376
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
55087
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
53377
55088
  var galleryContainer = (children, opts) => {
53378
55089
  const gap = opts?.gap ?? "md";
53379
55090
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -53453,7 +55164,7 @@ var galleryItem = (options) => stack(
53453
55164
  ],
53454
55165
  repeat("content.images", "item")
53455
55166
  );
53456
- var gridLayout3 = grid3(
55167
+ var gridLayout3 = grid4(
53457
55168
  {
53458
55169
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
53459
55170
  },
@@ -54061,7 +55772,7 @@ init_builder();
54061
55772
  init_fragments();
54062
55773
  init_colorStyles();
54063
55774
  init_defineBlock();
54064
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
55775
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
54065
55776
  var videoItem = (options) => stack(
54066
55777
  { gap: "xs", className: options.containerClassName },
54067
55778
  [
@@ -54111,7 +55822,7 @@ var gridColumnsClass = (columns) => {
54111
55822
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
54112
55823
  }
54113
55824
  };
54114
- var createGridLayout = (columns) => grid4(
55825
+ var createGridLayout = (columns) => grid5(
54115
55826
  {
54116
55827
  className: gridColumnsClass(columns)
54117
55828
  },
@@ -56200,6 +57911,40 @@ var systemBlockDefinitionsRaw = [
56200
57911
  })
56201
57912
  ]
56202
57913
  })),
57914
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
57915
+ sectionSurfaces: "supported",
57916
+ contentFrames: ["plain", "panel"],
57917
+ itemSurfaces: "unsupported",
57918
+ headingDecorations: ["organic-squiggle"]
57919
+ }), defineBlockDesignMetadata({
57920
+ flow: bodyFlow,
57921
+ layoutProfiles: [
57922
+ layoutProfile({
57923
+ variantKey: "centered-copy",
57924
+ family: "centered",
57925
+ weight: "featured",
57926
+ bias: "soft"
57927
+ }),
57928
+ layoutProfile({
57929
+ variantKey: "statement-copy",
57930
+ family: "split",
57931
+ weight: "featured",
57932
+ bias: "merge"
57933
+ }),
57934
+ layoutProfile({
57935
+ variantKey: "statement-media",
57936
+ family: "media-text",
57937
+ weight: "featured",
57938
+ bias: "soft"
57939
+ }),
57940
+ layoutProfile({
57941
+ variantKey: "media-copy",
57942
+ family: "media-text",
57943
+ weight: "featured",
57944
+ bias: "soft"
57945
+ })
57946
+ ]
57947
+ })),
56203
57948
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
56204
57949
  flow: bodyFlow,
56205
57950
  layoutProfiles: [
@@ -56260,9 +58005,17 @@ var systemBlockDefinitionsRaw = [
56260
58005
  flow: conversionFlow,
56261
58006
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
56262
58007
  })),
56263
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
58008
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
58009
+ sectionSurfaces: "supported",
58010
+ contentFrames: ["plain", "panel"],
58011
+ itemSurfaces: "supported",
58012
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
58013
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
56264
58014
  flow: bodyFlow,
56265
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
58015
+ layoutProfiles: [
58016
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
58017
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
58018
+ ]
56266
58019
  })),
56267
58020
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
56268
58021
  flow: siteChromeFlow,
@@ -56276,7 +58029,8 @@ var systemBlockDefinitionsRaw = [
56276
58029
  sectionSurfaces: "supported",
56277
58030
  contentFrames: ["plain", "panel"],
56278
58031
  itemSurfaces: "supported",
56279
- testimonialCardTreatments: ["default", "accent-quote"]
58032
+ testimonialCardTreatments: ["default", "accent-quote"],
58033
+ headingDecorations: ["short-center-rule"]
56280
58034
  }), defineBlockDesignMetadata({
56281
58035
  flow: proofFlow,
56282
58036
  layoutProfiles: [
@@ -56302,6 +58056,22 @@ var systemBlockDefinitionsRaw = [
56302
58056
  flow: offeringsFlow,
56303
58057
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
56304
58058
  })),
58059
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
58060
+ sectionSurfaces: "supported",
58061
+ contentFrames: ["plain", "panel"],
58062
+ itemSurfaces: "supported",
58063
+ headingDecorations: ["short-center-rule"]
58064
+ }), defineBlockDesignMetadata({
58065
+ flow: offeringsFlow,
58066
+ layoutProfiles: [
58067
+ layoutProfile({
58068
+ variantKey: "cards",
58069
+ family: "grid",
58070
+ weight: "standard",
58071
+ bias: "soft"
58072
+ })
58073
+ ]
58074
+ })),
56305
58075
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
56306
58076
  flow: mediaFlow,
56307
58077
  layoutProfiles: [
@@ -57956,6 +59726,46 @@ init_RichText();
57956
59726
  init_richText_coerce();
57957
59727
  init_lucide_react();
57958
59728
  init_types8();
59729
+
59730
+ // ../blocks/src/system/runtime/nodes/accordionIconTreatment.ts
59731
+ init_types8();
59732
+ init_colorStyles();
59733
+ function resolveAccordionIconStyle(iconStyle, iconTreatment) {
59734
+ if (iconTreatment) {
59735
+ switch (iconTreatment.iconSet) {
59736
+ case "plus":
59737
+ return "plus-minus";
59738
+ case "chevron":
59739
+ return "chevron";
59740
+ case "caret":
59741
+ return "caret";
59742
+ case "minimal-cross":
59743
+ return "plus-minus";
59744
+ default:
59745
+ return assertNever7(iconTreatment.iconSet);
59746
+ }
59747
+ }
59748
+ return iconStyle && iconStyle in ICON_CONFIG ? iconStyle : "chevron";
59749
+ }
59750
+ function accordionIconColorStyle(iconTreatment) {
59751
+ const token = iconTreatment?.colorToken;
59752
+ if (!token || token === "current") return void 0;
59753
+ const themeToken = resolveIconColorToken(token);
59754
+ return {
59755
+ color: rgbColorValue(themeToken),
59756
+ ...iconTreatment.openColorToken && iconTreatment.openColorToken !== "current" ? {
59757
+ "--accordion-icon-open-color": rgbColorValue(resolveIconColorToken(iconTreatment.openColorToken))
59758
+ } : {}
59759
+ };
59760
+ }
59761
+ function resolveIconColorToken(token) {
59762
+ return token === "muted" ? "mutedText" : token;
59763
+ }
59764
+ function assertNever7(value) {
59765
+ throw new Error(`Unhandled accordion icon set: ${String(value)}`);
59766
+ }
59767
+
59768
+ // ../blocks/src/system/runtime/nodes/accordion.server.tsx
57959
59769
  import { jsx as jsx125, jsxs as jsxs71 } from "react/jsx-runtime";
57960
59770
  var ACCORDION_ICONS = {
57961
59771
  Plus,
@@ -57994,15 +59804,17 @@ var AccordionItemNodeSSR = ({
57994
59804
  content,
57995
59805
  question,
57996
59806
  answer,
57997
- iconStyle
59807
+ iconStyle,
59808
+ iconTreatment
57998
59809
  }) => {
57999
59810
  const resolvedValue = value !== void 0 && value !== null ? String(value) : void 0;
58000
59811
  const triggerSource = trigger ?? question;
58001
59812
  const contentSource = content ?? answer;
58002
- const resolvedIconStyle = iconStyle && iconStyle in ICON_CONFIG ? iconStyle : "chevron";
59813
+ const resolvedIconStyle = resolveAccordionIconStyle(iconStyle, iconTreatment);
58003
59814
  const iconConfig = ICON_CONFIG[resolvedIconStyle];
58004
59815
  const ClosedIconComponent = ACCORDION_ICONS[iconConfig.closedIcon];
58005
59816
  const OpenIconComponent = iconConfig.openIcon ? ACCORDION_ICONS[iconConfig.openIcon] : null;
59817
+ const iconColorStyle = accordionIconColorStyle(iconTreatment);
58006
59818
  return /* @__PURE__ */ jsxs71(
58007
59819
  "div",
58008
59820
  {
@@ -58012,10 +59824,20 @@ var AccordionItemNodeSSR = ({
58012
59824
  children: [
58013
59825
  /* @__PURE__ */ jsxs71("div", { className: "accordion-trigger", role: "button", tabIndex: 0, "aria-expanded": "false", children: [
58014
59826
  /* @__PURE__ */ jsx125("span", { className: "accordion-trigger-text", children: resolveNode(triggerSource) }),
58015
- /* @__PURE__ */ jsxs71("span", { className: "accordion-icon", "aria-hidden": "true", children: [
58016
- ClosedIconComponent && /* @__PURE__ */ jsx125(ClosedIconComponent, { className: "accordion-icon-closed" }),
58017
- OpenIconComponent && /* @__PURE__ */ jsx125(OpenIconComponent, { className: "accordion-icon-open" })
58018
- ] })
59827
+ /* @__PURE__ */ jsxs71(
59828
+ "span",
59829
+ {
59830
+ className: "accordion-icon",
59831
+ "aria-hidden": "true",
59832
+ "data-accordion-icon-set": iconTreatment?.iconSet,
59833
+ "data-accordion-icon-motion": iconTreatment?.motion,
59834
+ style: iconColorStyle,
59835
+ children: [
59836
+ ClosedIconComponent && /* @__PURE__ */ jsx125(ClosedIconComponent, { className: "accordion-icon-closed" }),
59837
+ OpenIconComponent && /* @__PURE__ */ jsx125(OpenIconComponent, { className: "accordion-icon-open" })
59838
+ ]
59839
+ }
59840
+ )
58019
59841
  ] }),
58020
59842
  /* @__PURE__ */ jsx125(
58021
59843
  "div",
@@ -64285,6 +66107,67 @@ function transformSdkBlockToDefinition(sdkBlock) {
64285
66107
  };
64286
66108
  }
64287
66109
 
66110
+ // ../blocks/src/customBlockRegistry.ts
66111
+ function isCustomBlockKind(blockKind) {
66112
+ return blockKind.startsWith("custom.");
66113
+ }
66114
+ function transformToBlockDescriptor(sdkBlock, source = "sdk") {
66115
+ return {
66116
+ name: sdkBlock.id,
66117
+ title: sdkBlock.title,
66118
+ description: sdkBlock.description,
66119
+ category: sdkBlock.category,
66120
+ tags: sdkBlock.tags,
66121
+ icon: sdkBlock.icon,
66122
+ definition: transformSdkBlockToDefinition(sdkBlock),
66123
+ source
66124
+ };
66125
+ }
66126
+ function toResolvedCustomBlock(manifest, source) {
66127
+ return {
66128
+ blockKind: manifest.id,
66129
+ manifest: transformSdkBlockToManifest(manifest),
66130
+ source,
66131
+ descriptor: transformToBlockDescriptor(
66132
+ manifest,
66133
+ source.kind === "managed-database" ? "database" : "sdk"
66134
+ )
66135
+ };
66136
+ }
66137
+ function createCustomBlockRegistry({
66138
+ sdkConfig,
66139
+ customBlocks = [],
66140
+ onConflict
66141
+ }) {
66142
+ const entriesByKind = /* @__PURE__ */ new Map();
66143
+ for (const sdkBlock of sdkConfig?.customBlocks ?? []) {
66144
+ entriesByKind.set(
66145
+ sdkBlock.id,
66146
+ toResolvedCustomBlock(sdkBlock, { kind: "sdk-config" })
66147
+ );
66148
+ }
66149
+ for (const customBlock of customBlocks) {
66150
+ const existing = entriesByKind.get(customBlock.manifest.id);
66151
+ if (existing) {
66152
+ onConflict?.(
66153
+ `Skipping DB custom block "${customBlock.manifest.id}" - conflicts with SDK config block`
66154
+ );
66155
+ continue;
66156
+ }
66157
+ entriesByKind.set(
66158
+ customBlock.manifest.id,
66159
+ toResolvedCustomBlock(customBlock.manifest, customBlock.source)
66160
+ );
66161
+ }
66162
+ return {
66163
+ entries: Array.from(entriesByKind.values()),
66164
+ findManifest: (blockKind) => {
66165
+ if (!isCustomBlockKind(blockKind)) return void 0;
66166
+ return entriesByKind.get(blockKind);
66167
+ }
66168
+ };
66169
+ }
66170
+
64288
66171
  // ../blocks/src/PageRenderer.tsx
64289
66172
  init_typeGuards2();
64290
66173
  init_media3();
@@ -64454,17 +66337,14 @@ var MemoBlockSection = React34.memo(
64454
66337
  }
64455
66338
  const OverrideComponent = getBlockOverride(block.kind, blockOverrides);
64456
66339
  let definition = getBlockDefinition(block.kind);
64457
- if (!definition && block.kind.startsWith("custom.") && sdkConfig?.customBlocks) {
64458
- const sdkBlock = sdkConfig.customBlocks.find((b2) => b2.id === block.kind);
64459
- if (sdkBlock) {
64460
- definition = transformSdkBlockToDefinition(sdkBlock);
64461
- }
64462
- }
64463
- if (!definition && block.kind.startsWith("custom.") && customBlocks) {
64464
- const dbBlock = customBlocks.find((b2) => b2.id === block.kind);
64465
- if (dbBlock) {
64466
- definition = transformSdkBlockToDefinition(dbBlock);
64467
- }
66340
+ if (!definition && block.kind.startsWith("custom.")) {
66341
+ definition = createCustomBlockRegistry({
66342
+ sdkConfig,
66343
+ customBlocks: (customBlocks ?? []).map((manifest) => ({
66344
+ manifest,
66345
+ source: { kind: "managed-database" }
66346
+ }))
66347
+ }).findManifest(block.kind)?.descriptor.definition;
64468
66348
  }
64469
66349
  if (!definition) {
64470
66350
  if (OverrideComponent) {
@@ -64491,13 +66371,16 @@ var MemoBlockSection = React34.memo(
64491
66371
  }
64492
66372
  if (block.kind.startsWith("custom.") && shouldDebugCustomBlocks()) {
64493
66373
  try {
64494
- console.warn("[blocks:PageRenderer] custom block definition missing", {
64495
- blockId: block.id ?? null,
64496
- blockKind: block.kind,
64497
- hasOverride: Boolean(OverrideComponent),
64498
- sdkCustomBlocksCount: sdkConfig?.customBlocks?.length ?? 0,
64499
- dbCustomBlocksCount: customBlocks?.length ?? 0
64500
- });
66374
+ console.warn(
66375
+ "[blocks:PageRenderer] custom block definition missing",
66376
+ {
66377
+ blockId: block.id ?? null,
66378
+ blockKind: block.kind,
66379
+ hasOverride: Boolean(OverrideComponent),
66380
+ sdkCustomBlocksCount: sdkConfig?.customBlocks?.length ?? 0,
66381
+ dbCustomBlocksCount: customBlocks?.length ?? 0
66382
+ }
66383
+ );
64501
66384
  } catch {
64502
66385
  }
64503
66386
  }
@@ -64511,12 +66394,15 @@ var MemoBlockSection = React34.memo(
64511
66394
  if (!OverrideComponent && !manifestHasLayout) {
64512
66395
  if (block.kind.startsWith("custom.") && shouldDebugCustomBlocks()) {
64513
66396
  try {
64514
- console.warn("[blocks:PageRenderer] custom block has no layout/variants and no override", {
64515
- blockId: block.id ?? null,
64516
- blockKind: block.kind,
64517
- hasOverride: false,
64518
- manifestKeys: Object.keys(definition.manifest ?? {}).sort()
64519
- });
66397
+ console.warn(
66398
+ "[blocks:PageRenderer] custom block has no layout/variants and no override",
66399
+ {
66400
+ blockId: block.id ?? null,
66401
+ blockKind: block.kind,
66402
+ hasOverride: false,
66403
+ manifestKeys: Object.keys(definition.manifest ?? {}).sort()
66404
+ }
66405
+ );
64520
66406
  } catch {
64521
66407
  }
64522
66408
  }
@@ -64550,9 +66436,10 @@ var MemoBlockSection = React34.memo(
64550
66436
  if (parsed.success) {
64551
66437
  data = parsed.data;
64552
66438
  } else if (usePlaceholders) {
64553
- const relaxed = getCachedValidator(definition.manifest, "relaxed").safeParse(
64554
- content
64555
- );
66439
+ const relaxed = getCachedValidator(
66440
+ definition.manifest,
66441
+ "relaxed"
66442
+ ).safeParse(content);
64556
66443
  if (relaxed.success) {
64557
66444
  data = relaxed.data;
64558
66445
  } else {