@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
@@ -7197,6 +7197,7 @@ var init_validation_constants = __esm({
7197
7197
  "layout.headerRootClass",
7198
7198
  "layout.footerRootClass",
7199
7199
  "layout.headerRootStyle",
7200
+ "layout.headerSectionBackground",
7200
7201
  "layout.footerRootStyle",
7201
7202
  // UI (ui.ts)
7202
7203
  "ui.headerNavLinkClass",
@@ -8252,10 +8253,12 @@ function defineBlockDesignCapability(capability) {
8252
8253
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
8253
8254
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
8254
8255
  tileTreatments: capability.tileTreatments ?? ["default"],
8255
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
8256
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
8257
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
8258
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
8256
8259
  };
8257
8260
  }
8258
- var plainFrame, tileTreatmentValues, eyebrowTreatmentValues;
8261
+ var plainFrame, tileTreatmentValues, eyebrowTreatmentValues, visibleHeadingDecorationFamilyValues, visibleHeadingDecorationPlacementValues, headingDecorationOverrideValues, headingDecorationColorTokenValues, accordionIconSetValues, accordionIconColorTokenValues, accordionIconMotionValues;
8259
8262
  var init_types2 = __esm({
8260
8263
  "../theme-core/src/site-styles/types.ts"() {
8261
8264
  "use strict";
@@ -8274,6 +8277,47 @@ var init_types2 = __esm({
8274
8277
  "pill-bounce",
8275
8278
  "accent-pill-bounce"
8276
8279
  ];
8280
+ visibleHeadingDecorationFamilyValues = [
8281
+ "organic-squiggle",
8282
+ "short-center-rule"
8283
+ ];
8284
+ visibleHeadingDecorationPlacementValues = [
8285
+ "after-heading",
8286
+ "between-heading-and-body",
8287
+ "under-centered-heading"
8288
+ ];
8289
+ headingDecorationOverrideValues = [
8290
+ "site-default",
8291
+ "on",
8292
+ "off"
8293
+ ];
8294
+ headingDecorationColorTokenValues = [
8295
+ "text",
8296
+ "primary",
8297
+ "secondary",
8298
+ "accent",
8299
+ "border",
8300
+ "muted"
8301
+ ];
8302
+ accordionIconSetValues = [
8303
+ "plus",
8304
+ "chevron",
8305
+ "caret",
8306
+ "minimal-cross"
8307
+ ];
8308
+ accordionIconColorTokenValues = [
8309
+ "text",
8310
+ "muted",
8311
+ "primary",
8312
+ "secondary",
8313
+ "accent",
8314
+ "current"
8315
+ ];
8316
+ accordionIconMotionValues = [
8317
+ "none",
8318
+ "rotate",
8319
+ "swap"
8320
+ ];
8277
8321
  }
8278
8322
  });
8279
8323
 
@@ -8470,6 +8514,25 @@ var init_blockAppearancePresets = __esm({
8470
8514
  emphasis: "high"
8471
8515
  }
8472
8516
  }),
8517
+ defineBlockAppearancePreset({
8518
+ kind: "block-design",
8519
+ id: "intro-soft-earth-statement",
8520
+ target: "intro",
8521
+ label: "Soft Earth intro statement",
8522
+ blockKinds: ["block.intro"],
8523
+ design: {
8524
+ sectionSurface: "base",
8525
+ contentFrame: plainFrame,
8526
+ itemSurface: "none",
8527
+ transitionAfter: "soft-fade-short",
8528
+ emphasis: "high",
8529
+ headingDecoration: {
8530
+ family: "organic-squiggle",
8531
+ placement: "after-heading",
8532
+ colorToken: "primary"
8533
+ }
8534
+ }
8535
+ }),
8473
8536
  defineBlockAppearancePreset({
8474
8537
  kind: "block-design",
8475
8538
  id: "offerings-calm-list",
@@ -8484,6 +8547,25 @@ var init_blockAppearancePresets = __esm({
8484
8547
  emphasis: "medium"
8485
8548
  }
8486
8549
  }),
8550
+ defineBlockAppearancePreset({
8551
+ kind: "block-design",
8552
+ id: "feature-cards-soft-earth-offerings",
8553
+ target: "feature-cards",
8554
+ label: "Soft Earth offering cards",
8555
+ blockKinds: ["block.feature-cards"],
8556
+ design: {
8557
+ sectionSurface: "base",
8558
+ contentFrame: plainFrame,
8559
+ itemSurface: "raised",
8560
+ transitionAfter: "none",
8561
+ emphasis: "high",
8562
+ headingDecoration: {
8563
+ family: "short-center-rule",
8564
+ placement: "under-centered-heading",
8565
+ colorToken: "primary"
8566
+ }
8567
+ }
8568
+ }),
8487
8569
  defineBlockAppearancePreset({
8488
8570
  kind: "block-design",
8489
8571
  id: "events-base-calendar",
@@ -8612,6 +8694,26 @@ var init_blockAppearancePresets = __esm({
8612
8694
  testimonialCardTreatment: "accent-quote"
8613
8695
  }
8614
8696
  }),
8697
+ defineBlockAppearancePreset({
8698
+ kind: "block-design",
8699
+ id: "testimonials-soft-earth-proof-band",
8700
+ target: "testimonials",
8701
+ label: "Soft Earth proof band",
8702
+ blockKinds: ["block.testimonials"],
8703
+ design: {
8704
+ sectionSurface: "brand-depth-band",
8705
+ contentFrame: plainFrame,
8706
+ itemSurface: "none",
8707
+ transitionAfter: "soft-fade-short",
8708
+ emphasis: "high",
8709
+ testimonialCardTreatment: "accent-quote",
8710
+ headingDecoration: {
8711
+ family: "short-center-rule",
8712
+ placement: "under-centered-heading",
8713
+ colorToken: "border"
8714
+ }
8715
+ }
8716
+ }),
8615
8717
  defineBlockAppearancePreset({
8616
8718
  kind: "block-design",
8617
8719
  id: "faq-base-accordion",
@@ -8640,6 +8742,25 @@ var init_blockAppearancePresets = __esm({
8640
8742
  emphasis: "low"
8641
8743
  }
8642
8744
  }),
8745
+ defineBlockAppearancePreset({
8746
+ kind: "block-design",
8747
+ id: "faq-soft-earth-two-column",
8748
+ target: "faq",
8749
+ label: "Soft Earth two-column FAQ",
8750
+ blockKinds: ["block.faq"],
8751
+ design: {
8752
+ sectionSurface: "base",
8753
+ contentFrame: plainFrame,
8754
+ itemSurface: "flat",
8755
+ transitionAfter: "none",
8756
+ emphasis: "medium",
8757
+ accordionIconTreatment: {
8758
+ iconSet: "plus",
8759
+ colorToken: "primary",
8760
+ motion: "swap"
8761
+ }
8762
+ }
8763
+ }),
8643
8764
  defineBlockAppearancePreset({
8644
8765
  kind: "block-design",
8645
8766
  id: "contact-form-panel",
@@ -9445,6 +9566,104 @@ var init_confident_chip = __esm({
9445
9566
  }
9446
9567
  });
9447
9568
 
9569
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
9570
+ var earthPill;
9571
+ var init_earth_pill = __esm({
9572
+ "../theme-core/src/buttons/personalities/earth-pill.ts"() {
9573
+ "use strict";
9574
+ init_types4();
9575
+ earthPill = defineButtonPersonality({
9576
+ id: "earth-pill",
9577
+ name: "Earth Pill",
9578
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
9579
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
9580
+ buttonSystem: {
9581
+ global: {
9582
+ cornerStyle: "pill",
9583
+ shadow: "low",
9584
+ textTransform: "none",
9585
+ fontWeight: 500,
9586
+ borderWidth: 1,
9587
+ hoverTransform: "lift",
9588
+ hoverColor: "none",
9589
+ typography: "body",
9590
+ paddingPreset: "default"
9591
+ },
9592
+ sizes: {
9593
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
9594
+ md: { padding: "0.625rem 1.35rem" },
9595
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
9596
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
9597
+ },
9598
+ variants: [
9599
+ {
9600
+ id: "primary",
9601
+ name: "Primary",
9602
+ enabled: true,
9603
+ priority: 1,
9604
+ background: { type: "solid", colorToken: "primary" },
9605
+ textColorToken: "primaryForeground",
9606
+ borderRadius: "rounded-full",
9607
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
9608
+ effects: {
9609
+ hover: [
9610
+ { effectId: "lift", options: { translateY: "-1px" } },
9611
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
9612
+ ],
9613
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
9614
+ }
9615
+ },
9616
+ {
9617
+ id: "secondary",
9618
+ name: "Secondary",
9619
+ enabled: true,
9620
+ priority: 2,
9621
+ background: { type: "transparent" },
9622
+ textColorToken: "primary",
9623
+ borderRadius: "rounded-full",
9624
+ border: { widthClass: "border", colorToken: "primary" },
9625
+ effects: {
9626
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
9627
+ }
9628
+ },
9629
+ {
9630
+ id: "outline",
9631
+ name: "Outline",
9632
+ enabled: true,
9633
+ priority: 3,
9634
+ background: { type: "transparent" },
9635
+ textColorToken: "text",
9636
+ borderRadius: "rounded-full",
9637
+ border: { widthClass: "border", colorToken: "border" },
9638
+ effects: {
9639
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
9640
+ }
9641
+ },
9642
+ {
9643
+ id: "ghost",
9644
+ name: "Ghost",
9645
+ enabled: true,
9646
+ priority: 3,
9647
+ background: { type: "transparent" },
9648
+ textColorToken: "primary",
9649
+ borderRadius: "rounded-full",
9650
+ shadow: { elevation: "none", softness: null, position: "bottom" },
9651
+ sizes: {
9652
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
9653
+ md: { padding: "0.375rem 0" },
9654
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
9655
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
9656
+ },
9657
+ effects: {
9658
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
9659
+ }
9660
+ }
9661
+ ]
9662
+ }
9663
+ });
9664
+ }
9665
+ });
9666
+
9448
9667
  // ../theme-core/src/buttons/personalities/editorial-link.ts
9449
9668
  var editorialLink;
9450
9669
  var init_editorial_link = __esm({
@@ -9942,6 +10161,7 @@ var init_personalities = __esm({
9942
10161
  "use strict";
9943
10162
  init_brushed_wash();
9944
10163
  init_confident_chip();
10164
+ init_earth_pill();
9945
10165
  init_editorial_link();
9946
10166
  init_ink_stamp();
9947
10167
  init_pebble();
@@ -9950,6 +10170,7 @@ var init_personalities = __esm({
9950
10170
  init_types4();
9951
10171
  buttonPersonalities = [
9952
10172
  softPill,
10173
+ earthPill,
9953
10174
  confidentChip,
9954
10175
  editorialLink,
9955
10176
  pebble,
@@ -10867,7 +11088,7 @@ var init_tokenOrColor = __esm({
10867
11088
 
10868
11089
  // ../theme-core/src/schema.ts
10869
11090
  import { z as z24 } from "zod";
10870
- 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;
11091
+ 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;
10871
11092
  var init_schema3 = __esm({
10872
11093
  "../theme-core/src/schema.ts"() {
10873
11094
  "use strict";
@@ -10962,12 +11183,36 @@ var init_schema3 = __esm({
10962
11183
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
10963
11184
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
10964
11185
  });
11186
+ noHeadingDecorationSchema = z24.object({
11187
+ family: z24.literal("none"),
11188
+ placement: z24.literal("none")
11189
+ });
11190
+ visibleHeadingDecorationSchema = z24.object({
11191
+ family: z24.enum(visibleHeadingDecorationFamilyValues),
11192
+ placement: z24.enum(visibleHeadingDecorationPlacementValues),
11193
+ colorToken: z24.enum(headingDecorationColorTokenValues).optional()
11194
+ });
11195
+ headingDecorationSchema = z24.union([
11196
+ noHeadingDecorationSchema,
11197
+ visibleHeadingDecorationSchema
11198
+ ]);
11199
+ accordionIconTreatmentSchema = z24.object({
11200
+ iconSet: z24.enum(accordionIconSetValues),
11201
+ colorToken: z24.enum(accordionIconColorTokenValues),
11202
+ openColorToken: z24.enum(accordionIconColorTokenValues).optional(),
11203
+ motion: z24.enum(accordionIconMotionValues)
11204
+ });
10965
11205
  sectionStylesOverrideSchema = z24.object({
10966
11206
  background: boxBackgroundSchema.nullable().optional(),
10967
11207
  spacing: semanticSpacingSchema.nullable().optional(),
10968
11208
  minHeight: z24.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10969
11209
  tileTreatment: z24.enum(tileTreatmentValues).nullable().optional(),
10970
- eyebrowTreatment: z24.enum(eyebrowTreatmentValues).nullable().optional()
11210
+ eyebrowTreatment: z24.enum(eyebrowTreatmentValues).nullable().optional(),
11211
+ headingDecoration: headingDecorationSchema.nullable().optional(),
11212
+ // Author-level override consumed by later block/editor rendering phases.
11213
+ // Keeping it in section styles lets existing block save APIs persist it.
11214
+ headingDecorationOverride: z24.enum(headingDecorationOverrideValues).nullable().optional(),
11215
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
10971
11216
  });
10972
11217
  containerStylesOverrideSchema = z24.object({
10973
11218
  background: boxBackgroundSchema.nullable().optional(),
@@ -11664,7 +11909,7 @@ var init_soft_natural = __esm({
11664
11909
  });
11665
11910
 
11666
11911
  // ../theme-core/src/palette/variants/warm-neutral.ts
11667
- var warmNeutralClay, warmNeutralCream, warmNeutralForest;
11912
+ var warmNeutralClay, warmNeutralCream, warmNeutralSoftEarth, warmNeutralForest;
11668
11913
  var init_warm_neutral = __esm({
11669
11914
  "../theme-core/src/palette/variants/warm-neutral.ts"() {
11670
11915
  "use strict";
@@ -11713,6 +11958,28 @@ var init_warm_neutral = __esm({
11713
11958
  { name: "border", hex: "#e0d2b8" }
11714
11959
  ]
11715
11960
  });
11961
+ warmNeutralSoftEarth = definePaletteVariant({
11962
+ id: "warm-neutral-soft-earth",
11963
+ name: "Warm Neutral \u2014 Soft Earth",
11964
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
11965
+ tags: { tone: "classic", energy: "calm", era: "organic" },
11966
+ mode: "light",
11967
+ colors: [
11968
+ { name: "primary", hex: "#a8573d" },
11969
+ { name: "secondary", hex: "#72765c" },
11970
+ { name: "accent", hex: "#c87557" },
11971
+ { name: "success", hex: "#687854" },
11972
+ { name: "warning", hex: "#b7863e" },
11973
+ { name: "destructive", hex: "#a54b3c" },
11974
+ { name: "background", hex: "#fbf6eb" },
11975
+ { name: "surface", hex: "#fffdf7" },
11976
+ { name: "surfaceAlt", hex: "#f0e4d3" },
11977
+ { name: "muted", hex: "#eadbc6" },
11978
+ { name: "text", hex: "#30281f" },
11979
+ { name: "primaryForeground", hex: "#fffaf3" },
11980
+ { name: "border", hex: "#d9c8b2" }
11981
+ ]
11982
+ });
11716
11983
  warmNeutralForest = definePaletteVariant({
11717
11984
  id: "warm-neutral-forest",
11718
11985
  name: "Warm Neutral \u2014 Forest",
@@ -11757,6 +12024,7 @@ var init_variants = __esm({
11757
12024
  // Warm-neutral family
11758
12025
  warmNeutralClay,
11759
12026
  warmNeutralCream,
12027
+ warmNeutralSoftEarth,
11760
12028
  warmNeutralForest,
11761
12029
  // High-contrast family
11762
12030
  highContrastInk,
@@ -11785,6 +12053,12 @@ var init_customizableSurfaces = __esm({
11785
12053
  function asHeaderLookId(value) {
11786
12054
  return value;
11787
12055
  }
12056
+ function asHeaderLayoutId(value) {
12057
+ return value;
12058
+ }
12059
+ function asHeaderStyleId(value) {
12060
+ return value;
12061
+ }
11788
12062
  function baseHeader(theme) {
11789
12063
  const {
11790
12064
  navLinkStyle: _navLinkStyle,
@@ -11803,6 +12077,34 @@ function baseHeader(theme) {
11803
12077
  navContainer: { type: "none", tint: null, opacity: 0.15 }
11804
12078
  };
11805
12079
  }
12080
+ function supportedLayouts(ids) {
12081
+ return ids.map(asHeaderLayoutId);
12082
+ }
12083
+ function headerStyleRepairChain(values) {
12084
+ return values.map(asHeaderStyleId);
12085
+ }
12086
+ function getHeaderStyle(id) {
12087
+ return headerStylesById.get(id) ?? null;
12088
+ }
12089
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
12090
+ return style.supportedLayoutIds.includes(layoutId);
12091
+ }
12092
+ function getHeaderStyleOrThrow(id) {
12093
+ const style = getHeaderStyle(id);
12094
+ if (!style) {
12095
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
12096
+ }
12097
+ return style;
12098
+ }
12099
+ function resolveLegacyHeaderLookAlias(lookId) {
12100
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
12101
+ }
12102
+ function getCompatibleHeaderStyleIds(layoutId) {
12103
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
12104
+ const style = getHeaderStyleOrThrow(styleId);
12105
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
12106
+ });
12107
+ }
11806
12108
  function solidBrandHeader(theme) {
11807
12109
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11808
12110
  return {
@@ -12033,19 +12335,302 @@ function floatingGlassHeader(theme) {
12033
12335
  }
12034
12336
  };
12035
12337
  }
12036
- var headerLookCatalog, guaranteedFallbackHeaderLookId, headerLooksById;
12338
+ function headerConfigurationKey(configuration) {
12339
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
12340
+ }
12341
+ var headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, headerStyleRepairOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLookId, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, allowedHeaderConfigurationKeys, headerLooksById;
12037
12342
  var init_headerLooks = __esm({
12038
12343
  "../theme-core/src/site-styles/headerLooks.ts"() {
12039
12344
  "use strict";
12040
12345
  init_headerCtaVariants();
12041
12346
  init_customizableSurfaces();
12042
12347
  init_types2();
12348
+ headerLayoutCatalog = [
12349
+ {
12350
+ id: asHeaderLayoutId("classic"),
12351
+ label: "Classic",
12352
+ description: "Logo and navigation in one practical horizontal row.",
12353
+ structure: "inline-classic",
12354
+ variant: "classic",
12355
+ defaultPositioning: "sticky",
12356
+ shrinkOnScroll: false
12357
+ },
12358
+ {
12359
+ id: asHeaderLayoutId("centered"),
12360
+ label: "Centered",
12361
+ description: "Logo centered above a balanced navigation row.",
12362
+ structure: "centered-stack",
12363
+ variant: "centered",
12364
+ defaultPositioning: "static",
12365
+ shrinkOnScroll: false,
12366
+ maxRecommendedNavItems: 5,
12367
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
12368
+ },
12369
+ {
12370
+ id: asHeaderLayoutId("editorial"),
12371
+ label: "Editorial",
12372
+ description: "A composed, magazine-like stacked header treatment.",
12373
+ structure: "editorial-stack",
12374
+ variant: "editorial",
12375
+ defaultPositioning: "static",
12376
+ shrinkOnScroll: false,
12377
+ maxRecommendedNavItems: 6
12378
+ },
12379
+ {
12380
+ id: asHeaderLayoutId("floating"),
12381
+ label: "Floating",
12382
+ description: "Detached header chrome that sits over the opening section.",
12383
+ structure: "floating-shell",
12384
+ variant: "floating",
12385
+ defaultPositioning: "fixed",
12386
+ shrinkOnScroll: true,
12387
+ maxRecommendedNavItems: 5,
12388
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
12389
+ }
12390
+ ];
12391
+ headerStyleCatalog = [
12392
+ {
12393
+ id: asHeaderStyleId("minimal"),
12394
+ label: "Minimal",
12395
+ description: "Quiet surface with simple color-change navigation.",
12396
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12397
+ navInteraction: "color-change",
12398
+ surface: "neutral"
12399
+ },
12400
+ {
12401
+ id: asHeaderStyleId("fine-line"),
12402
+ label: "Fine Line",
12403
+ description: "Light surface with a crisp lower rule and underline hover.",
12404
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12405
+ navInteraction: "underline-grow",
12406
+ surface: "bordered"
12407
+ },
12408
+ {
12409
+ id: asHeaderStyleId("soft-bar"),
12410
+ label: "Soft Bar",
12411
+ description: "Soft tinted surface with gentle pill hover states.",
12412
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12413
+ navInteraction: "pill-background",
12414
+ surface: "soft"
12415
+ },
12416
+ {
12417
+ id: asHeaderStyleId("pill-nav"),
12418
+ label: "Pill Nav",
12419
+ description: "A calm pill navigation rail over a neutral header.",
12420
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12421
+ navInteraction: "pill-background",
12422
+ surface: "soft"
12423
+ },
12424
+ {
12425
+ id: asHeaderStyleId("brand-bar"),
12426
+ label: "Brand Bar",
12427
+ description: "Solid brand surface with high-contrast navigation.",
12428
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12429
+ navInteraction: "color-change",
12430
+ surface: "brand-solid"
12431
+ },
12432
+ {
12433
+ id: asHeaderStyleId("brand-underline"),
12434
+ label: "Brand Underline",
12435
+ description: "Brand surface with underline-grow navigation.",
12436
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
12437
+ navInteraction: "underline-grow",
12438
+ surface: "brand-solid"
12439
+ },
12440
+ {
12441
+ id: asHeaderStyleId("brand-pill"),
12442
+ label: "Brand Pill",
12443
+ description: "Solid brand surface with rounded active and hover states.",
12444
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
12445
+ navInteraction: "pill-background",
12446
+ surface: "brand-solid"
12447
+ },
12448
+ {
12449
+ id: asHeaderStyleId("editorial-line"),
12450
+ label: "Editorial Line",
12451
+ description: "Typographic logo treatment with understated underline navigation.",
12452
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12453
+ navInteraction: "underline-grow",
12454
+ surface: "bordered"
12455
+ },
12456
+ {
12457
+ id: asHeaderStyleId("flat-tabs"),
12458
+ label: "Flat Tabs",
12459
+ description: "Flat block hover and active states with a Swiss utility feel.",
12460
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12461
+ navInteraction: "flat-block",
12462
+ surface: "bordered"
12463
+ },
12464
+ {
12465
+ id: asHeaderStyleId("glass"),
12466
+ label: "Glass",
12467
+ description: "Floating translucent chrome with frosted navigation backing.",
12468
+ supportedLayoutIds: supportedLayouts(["floating"]),
12469
+ navInteraction: "glass-backed",
12470
+ surface: "floating",
12471
+ requiresFloatingLayout: true
12472
+ },
12473
+ {
12474
+ id: asHeaderStyleId("minimal-surface"),
12475
+ label: "Minimal Surface",
12476
+ description: "Floating chrome with a restrained translucent surface.",
12477
+ supportedLayoutIds: supportedLayouts(["floating"]),
12478
+ navInteraction: "color-change",
12479
+ surface: "floating",
12480
+ requiresFloatingLayout: true
12481
+ },
12482
+ {
12483
+ id: asHeaderStyleId("soft-shell"),
12484
+ label: "Soft Shell",
12485
+ description: "Floating rounded shell with soft pill navigation states.",
12486
+ supportedLayoutIds: supportedLayouts(["floating"]),
12487
+ navInteraction: "pill-background",
12488
+ surface: "floating",
12489
+ requiresFloatingLayout: true
12490
+ }
12491
+ ];
12492
+ headerLayoutsById = new Map(
12493
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
12494
+ );
12495
+ headerStylesById = new Map(
12496
+ headerStyleCatalog.map((style) => [style.id, style])
12497
+ );
12498
+ headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12499
+ [
12500
+ asHeaderLayoutId("classic"),
12501
+ headerStyleRepairChain([
12502
+ "minimal",
12503
+ "fine-line",
12504
+ "soft-bar",
12505
+ "pill-nav",
12506
+ "brand-bar",
12507
+ "brand-underline",
12508
+ "brand-pill",
12509
+ "editorial-line",
12510
+ "flat-tabs"
12511
+ ])
12512
+ ],
12513
+ [
12514
+ asHeaderLayoutId("centered"),
12515
+ headerStyleRepairChain([
12516
+ "minimal",
12517
+ "fine-line",
12518
+ "soft-bar",
12519
+ "pill-nav",
12520
+ "brand-bar",
12521
+ "brand-pill",
12522
+ "editorial-line",
12523
+ "flat-tabs"
12524
+ ])
12525
+ ],
12526
+ [
12527
+ asHeaderLayoutId("editorial"),
12528
+ headerStyleRepairChain([
12529
+ "minimal",
12530
+ "fine-line",
12531
+ "soft-bar",
12532
+ "brand-bar",
12533
+ "brand-underline",
12534
+ "editorial-line",
12535
+ "flat-tabs"
12536
+ ])
12537
+ ],
12538
+ [
12539
+ asHeaderLayoutId("floating"),
12540
+ headerStyleRepairChain([
12541
+ "glass",
12542
+ "minimal-surface",
12543
+ "soft-shell",
12544
+ "brand-pill"
12545
+ ])
12546
+ ]
12547
+ ]);
12548
+ headerStyleRepairOrder = /* @__PURE__ */ new Map([
12549
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
12550
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
12551
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
12552
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
12553
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
12554
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
12555
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
12556
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
12557
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
12558
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
12559
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
12560
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
12561
+ ]);
12562
+ legacyHeaderLookAliases = [
12563
+ {
12564
+ lookId: asHeaderLookId("clean-base"),
12565
+ selection: {
12566
+ layoutId: asHeaderLayoutId("classic"),
12567
+ styleId: asHeaderStyleId("minimal")
12568
+ }
12569
+ },
12570
+ {
12571
+ lookId: asHeaderLookId("brand-solid"),
12572
+ selection: {
12573
+ layoutId: asHeaderLayoutId("classic"),
12574
+ styleId: asHeaderStyleId("brand-bar")
12575
+ }
12576
+ },
12577
+ {
12578
+ lookId: asHeaderLookId("editorial-line"),
12579
+ selection: {
12580
+ layoutId: asHeaderLayoutId("editorial"),
12581
+ styleId: asHeaderStyleId("editorial-line")
12582
+ }
12583
+ },
12584
+ {
12585
+ lookId: asHeaderLookId("centered-calm"),
12586
+ selection: {
12587
+ layoutId: asHeaderLayoutId("centered"),
12588
+ styleId: asHeaderStyleId("minimal")
12589
+ }
12590
+ },
12591
+ {
12592
+ lookId: asHeaderLookId("practical-utility"),
12593
+ selection: {
12594
+ layoutId: asHeaderLayoutId("classic"),
12595
+ styleId: asHeaderStyleId("flat-tabs")
12596
+ }
12597
+ },
12598
+ {
12599
+ lookId: asHeaderLookId("minimal-transparent"),
12600
+ selection: {
12601
+ layoutId: asHeaderLayoutId("classic"),
12602
+ styleId: asHeaderStyleId("minimal")
12603
+ }
12604
+ },
12605
+ {
12606
+ lookId: asHeaderLookId("transparent-overlay"),
12607
+ selection: {
12608
+ layoutId: asHeaderLayoutId("floating"),
12609
+ styleId: asHeaderStyleId("glass")
12610
+ }
12611
+ },
12612
+ {
12613
+ lookId: asHeaderLookId("floating-glass"),
12614
+ selection: {
12615
+ layoutId: asHeaderLayoutId("floating"),
12616
+ styleId: asHeaderStyleId("glass")
12617
+ }
12618
+ }
12619
+ ];
12620
+ legacyHeaderLookAliasesById = new Map(
12621
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
12622
+ );
12043
12623
  headerLookCatalog = [
12044
12624
  {
12045
12625
  id: asHeaderLookId("clean-base"),
12046
12626
  label: "Clean base",
12047
12627
  visualTreatment: "solid-neutral",
12048
12628
  layoutBehavior: "sticky",
12629
+ configuration: {
12630
+ structure: "inline-classic",
12631
+ treatment: "solid-neutral",
12632
+ behavior: "sticky"
12633
+ },
12049
12634
  openingRequirement: "none",
12050
12635
  compile: cleanBaseHeader
12051
12636
  },
@@ -12054,6 +12639,11 @@ var init_headerLooks = __esm({
12054
12639
  label: "Brand solid",
12055
12640
  visualTreatment: "solid-brand",
12056
12641
  layoutBehavior: "sticky-shrink",
12642
+ configuration: {
12643
+ structure: "inline-classic",
12644
+ treatment: "solid-brand",
12645
+ behavior: "sticky-shrink"
12646
+ },
12057
12647
  openingRequirement: "none",
12058
12648
  compile: solidBrandHeader
12059
12649
  },
@@ -12062,6 +12652,11 @@ var init_headerLooks = __esm({
12062
12652
  label: "Editorial line",
12063
12653
  visualTreatment: "light-editorial",
12064
12654
  layoutBehavior: "sticky",
12655
+ configuration: {
12656
+ structure: "editorial-stack",
12657
+ treatment: "light-editorial",
12658
+ behavior: "sticky"
12659
+ },
12065
12660
  openingRequirement: "none",
12066
12661
  maxRecommendedNavItems: 6,
12067
12662
  compile: editorialLineHeader
@@ -12071,6 +12666,11 @@ var init_headerLooks = __esm({
12071
12666
  label: "Centered calm",
12072
12667
  visualTreatment: "light-editorial",
12073
12668
  layoutBehavior: "normal-flow",
12669
+ configuration: {
12670
+ structure: "centered-stack",
12671
+ treatment: "light-editorial",
12672
+ behavior: "normal-flow"
12673
+ },
12074
12674
  openingRequirement: "none",
12075
12675
  maxRecommendedNavItems: 5,
12076
12676
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -12081,6 +12681,11 @@ var init_headerLooks = __esm({
12081
12681
  label: "Practical utility",
12082
12682
  visualTreatment: "solid-neutral",
12083
12683
  layoutBehavior: "sticky-shrink",
12684
+ configuration: {
12685
+ structure: "inline-classic",
12686
+ treatment: "solid-neutral",
12687
+ behavior: "sticky-shrink"
12688
+ },
12084
12689
  openingRequirement: "none",
12085
12690
  requiresProminentCta: true,
12086
12691
  compile: practicalUtilityHeader
@@ -12090,6 +12695,11 @@ var init_headerLooks = __esm({
12090
12695
  label: "Minimal transparent",
12091
12696
  visualTreatment: "minimal-transparent",
12092
12697
  layoutBehavior: "normal-flow",
12698
+ configuration: {
12699
+ structure: "inline-classic",
12700
+ treatment: "minimal-transparent",
12701
+ behavior: "normal-flow"
12702
+ },
12093
12703
  openingRequirement: "reserved-space-ok",
12094
12704
  compile: minimalTransparentHeader
12095
12705
  },
@@ -12098,6 +12708,11 @@ var init_headerLooks = __esm({
12098
12708
  label: "Transparent overlay",
12099
12709
  visualTreatment: "transparent-overlay",
12100
12710
  layoutBehavior: "fixed-overlay",
12711
+ configuration: {
12712
+ structure: "inline-classic",
12713
+ treatment: "transparent-overlay",
12714
+ behavior: "fixed-overlay"
12715
+ },
12101
12716
  openingRequirement: "requires-image-hero-with-contrast-overlay",
12102
12717
  maxRecommendedNavItems: 5,
12103
12718
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -12108,6 +12723,11 @@ var init_headerLooks = __esm({
12108
12723
  label: "Floating glass",
12109
12724
  visualTreatment: "floating-glass",
12110
12725
  layoutBehavior: "fixed-floating",
12726
+ configuration: {
12727
+ structure: "floating-shell",
12728
+ treatment: "floating-glass",
12729
+ behavior: "fixed-floating"
12730
+ },
12111
12731
  openingRequirement: "requires-image-hero-with-contrast-overlay",
12112
12732
  maxRecommendedNavItems: 5,
12113
12733
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -12115,6 +12735,11 @@ var init_headerLooks = __esm({
12115
12735
  }
12116
12736
  ];
12117
12737
  guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
12738
+ guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
12739
+ guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
12740
+ allowedHeaderConfigurationKeys = new Set(
12741
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
12742
+ );
12118
12743
  headerLooksById = new Map(
12119
12744
  headerLookCatalog.map((look) => [look.id, look])
12120
12745
  );
@@ -12274,6 +12899,270 @@ var init_sourceCatalogs = __esm({
12274
12899
  }
12275
12900
  });
12276
12901
 
12902
+ // ../theme-core/src/site-styles/typographyPresets.ts
12903
+ function asTypographyPresetId(value) {
12904
+ if (!value.startsWith("typography-preset:")) {
12905
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
12906
+ }
12907
+ return value;
12908
+ }
12909
+ function defineTypographyPreset(preset2) {
12910
+ return {
12911
+ ...preset2,
12912
+ id: asTypographyPresetId(preset2.id)
12913
+ };
12914
+ }
12915
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, boldDisplayTypography, typographyPresets, typographyPresetsById;
12916
+ var init_typographyPresets = __esm({
12917
+ "../theme-core/src/site-styles/typographyPresets.ts"() {
12918
+ "use strict";
12919
+ bodyReadablePolicy = {
12920
+ recommendedCategories: ["sans-serif", "serif"],
12921
+ allowedCategories: ["sans-serif", "serif"],
12922
+ requiresItalicForBody: true,
12923
+ requiresBoldForBody: true
12924
+ };
12925
+ headingFlexiblePolicy = {
12926
+ recommendedCategories: ["sans-serif", "serif", "display"],
12927
+ allowedCategories: ["sans-serif", "serif", "display"]
12928
+ };
12929
+ displayHeadingPolicy = {
12930
+ recommendedCategories: ["display", "sans-serif", "serif"],
12931
+ allowedCategories: ["display", "sans-serif", "serif"]
12932
+ };
12933
+ modernSansTypography = {
12934
+ body: {
12935
+ family: "Inter, system-ui, sans-serif",
12936
+ size: "md",
12937
+ weight: "regular",
12938
+ lineHeight: "relaxed",
12939
+ letterSpacing: "normal"
12940
+ },
12941
+ headings: {
12942
+ default: {
12943
+ family: "Inter, system-ui, sans-serif",
12944
+ weight: "semibold",
12945
+ lineHeight: "normal",
12946
+ letterSpacing: "tight",
12947
+ italic: null,
12948
+ case: null
12949
+ },
12950
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
12951
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
12952
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
12953
+ },
12954
+ scale: "balanced"
12955
+ };
12956
+ warmRoundedTypography = {
12957
+ body: {
12958
+ family: "Nunito Sans, system-ui, sans-serif",
12959
+ size: "lg",
12960
+ weight: "regular",
12961
+ lineHeight: "relaxed",
12962
+ letterSpacing: "normal"
12963
+ },
12964
+ headings: {
12965
+ default: {
12966
+ family: "Nunito Sans, system-ui, sans-serif",
12967
+ weight: "bold",
12968
+ lineHeight: "normal",
12969
+ letterSpacing: "normal",
12970
+ italic: null,
12971
+ case: null
12972
+ },
12973
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
12974
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
12975
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
12976
+ },
12977
+ scale: "balanced"
12978
+ };
12979
+ editorialSerifTypography = {
12980
+ body: {
12981
+ family: "Lora, Georgia, serif",
12982
+ size: "lg",
12983
+ weight: "regular",
12984
+ lineHeight: "loose",
12985
+ letterSpacing: "normal"
12986
+ },
12987
+ headings: {
12988
+ default: {
12989
+ family: "Playfair Display, Georgia, serif",
12990
+ weight: "semibold",
12991
+ lineHeight: "normal",
12992
+ letterSpacing: "tight",
12993
+ italic: null,
12994
+ case: null
12995
+ },
12996
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
12997
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
12998
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
12999
+ },
13000
+ scale: "spacious"
13001
+ };
13002
+ classicSerifTypography = {
13003
+ body: {
13004
+ family: "Libre Baskerville, Georgia, serif",
13005
+ size: "md",
13006
+ weight: "regular",
13007
+ lineHeight: "relaxed",
13008
+ letterSpacing: "normal"
13009
+ },
13010
+ headings: {
13011
+ default: {
13012
+ family: "Cormorant Garamond, Georgia, serif",
13013
+ weight: "semibold",
13014
+ lineHeight: "normal",
13015
+ letterSpacing: "normal",
13016
+ italic: null,
13017
+ case: null
13018
+ },
13019
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13020
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13021
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13022
+ },
13023
+ scale: "balanced"
13024
+ };
13025
+ luxeContrastTypography = {
13026
+ body: {
13027
+ family: "Manrope, system-ui, sans-serif",
13028
+ size: "md",
13029
+ weight: "regular",
13030
+ lineHeight: "relaxed",
13031
+ letterSpacing: "normal"
13032
+ },
13033
+ headings: {
13034
+ default: {
13035
+ family: "Cormorant Garamond, Georgia, serif",
13036
+ weight: "semibold",
13037
+ lineHeight: "normal",
13038
+ letterSpacing: "tight",
13039
+ italic: null,
13040
+ case: null
13041
+ },
13042
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13043
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13044
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13045
+ },
13046
+ scale: "spacious"
13047
+ };
13048
+ boldDisplayTypography = {
13049
+ body: {
13050
+ family: "Manrope, system-ui, sans-serif",
13051
+ size: "lg",
13052
+ weight: "regular",
13053
+ lineHeight: "relaxed",
13054
+ letterSpacing: "normal"
13055
+ },
13056
+ headings: {
13057
+ default: {
13058
+ family: '"TAN - PEARL", sans-serif',
13059
+ weight: "bold",
13060
+ lineHeight: "normal",
13061
+ letterSpacing: "tight",
13062
+ colorToken: "primary",
13063
+ italic: null,
13064
+ case: null
13065
+ },
13066
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13067
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13068
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
13069
+ },
13070
+ scale: "balanced"
13071
+ };
13072
+ typographyPresets = [
13073
+ defineTypographyPreset({
13074
+ id: "typography-preset:modern-sans",
13075
+ name: "Modern Sans",
13076
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
13077
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
13078
+ recommendedFonts: {
13079
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
13080
+ heading: ["Inter", "Manrope", "Source Sans 3"]
13081
+ },
13082
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13083
+ typography: modernSansTypography
13084
+ }),
13085
+ defineTypographyPreset({
13086
+ id: "typography-preset:warm-rounded",
13087
+ name: "Warm Rounded",
13088
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
13089
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
13090
+ recommendedFonts: {
13091
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
13092
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
13093
+ },
13094
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13095
+ typography: warmRoundedTypography
13096
+ }),
13097
+ defineTypographyPreset({
13098
+ id: "typography-preset:editorial-serif",
13099
+ name: "Editorial Serif",
13100
+ description: "Story-led type with warm reading rhythm and expressive headings.",
13101
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
13102
+ recommendedFonts: {
13103
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
13104
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
13105
+ },
13106
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13107
+ typography: editorialSerifTypography
13108
+ }),
13109
+ defineTypographyPreset({
13110
+ id: "typography-preset:classic-serif",
13111
+ name: "Classic Serif",
13112
+ description: "Measured, polished type for premium and established offers.",
13113
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
13114
+ recommendedFonts: {
13115
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
13116
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
13117
+ },
13118
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13119
+ typography: classicSerifTypography
13120
+ }),
13121
+ defineTypographyPreset({
13122
+ id: "typography-preset:luxe-contrast",
13123
+ name: "Luxe Contrast",
13124
+ description: "A restrained sans body paired with elegant high-contrast headings.",
13125
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
13126
+ recommendedFonts: {
13127
+ body: ["Manrope", "Inter", "Source Sans 3"],
13128
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
13129
+ },
13130
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13131
+ typography: luxeContrastTypography
13132
+ }),
13133
+ defineTypographyPreset({
13134
+ id: "typography-preset:bold-display",
13135
+ name: "Bold Display",
13136
+ description: "Punchy display headings with readable sans body copy for branded launches.",
13137
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
13138
+ recommendedFonts: {
13139
+ body: ["Manrope", "Inter", "Space Grotesk"],
13140
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
13141
+ },
13142
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13143
+ typography: boldDisplayTypography,
13144
+ heroTypography: {
13145
+ headlineSize: "6xl",
13146
+ headlineLineHeight: "tight",
13147
+ subheadlineSize: "editorial",
13148
+ subheadlineLineHeight: "normal",
13149
+ microHeadlineSize: "6xl",
13150
+ microHeadlineLineHeight: "tight",
13151
+ microSubheadlineSize: "xl",
13152
+ microSubheadlineLineHeight: "normal",
13153
+ responsive: {
13154
+ tablet: { headlineSize: "5xl" },
13155
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
13156
+ }
13157
+ }
13158
+ })
13159
+ ];
13160
+ typographyPresetsById = new Map(
13161
+ typographyPresets.map((preset2) => [preset2.id, preset2])
13162
+ );
13163
+ }
13164
+ });
13165
+
12277
13166
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12278
13167
  function uniqueContentFrameKinds() {
12279
13168
  const kinds = [...new Set(
@@ -12286,6 +13175,15 @@ function uniqueContentFrameKinds() {
12286
13175
  return [firstKind, ...kinds.slice(1)];
12287
13176
  }
12288
13177
  function defineCuratedSiteStyle(input) {
13178
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
13179
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
13180
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
13181
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
13182
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
13183
+ throw new Error(
13184
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
13185
+ );
13186
+ }
12289
13187
  return {
12290
13188
  id: asSiteStyleId(input.id),
12291
13189
  name: input.name,
@@ -12306,11 +13204,23 @@ function defineCuratedSiteStyle(input) {
12306
13204
  },
12307
13205
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12308
13206
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12309
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
13207
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
13208
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
13209
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
13210
+ } : inferredHeaderCuration.defaultHeaderSelection,
13211
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
13212
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
13213
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
13214
+ layoutId: asHeaderLayoutId(selection.layoutId),
13215
+ styleId: asHeaderStyleId(selection.styleId)
13216
+ })),
13217
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
12310
13218
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
12311
13219
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
12312
13220
  buttonPersonalityChoices: input.buttonPersonalityChoices,
12313
- paletteVariantChoices: input.paletteVariantChoices
13221
+ paletteVariantChoices: input.paletteVariantChoices,
13222
+ typographyPresetChoices,
13223
+ defaultTypographyPresetId
12314
13224
  };
12315
13225
  }
12316
13226
  function buttonChoice(id, note) {
@@ -12319,6 +13229,88 @@ function buttonChoice(id, note) {
12319
13229
  function paletteChoice(id, note) {
12320
13230
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
12321
13231
  }
13232
+ function headerLayoutChoice(id, note) {
13233
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
13234
+ }
13235
+ function headerStyleChoice(id, note) {
13236
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
13237
+ }
13238
+ function headerLayoutRecordKey(id) {
13239
+ return id;
13240
+ }
13241
+ function uniqueHeaderLayoutChoices(choices) {
13242
+ const seen = /* @__PURE__ */ new Set();
13243
+ const unique = choices.filter((choice) => {
13244
+ if (seen.has(choice.id)) return false;
13245
+ seen.add(choice.id);
13246
+ return true;
13247
+ });
13248
+ const first = unique[0];
13249
+ if (!first) {
13250
+ throw new Error("Expected at least one curated header layout choice.");
13251
+ }
13252
+ return [first, ...unique.slice(1)];
13253
+ }
13254
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
13255
+ const first = choices[0] ?? {
13256
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
13257
+ };
13258
+ return [first, ...choices.slice(1)];
13259
+ }
13260
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
13261
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
13262
+ const defaultHeaderSelection = selections[0] ?? {
13263
+ layoutId: asHeaderLayoutId("classic"),
13264
+ styleId: asHeaderStyleId("minimal")
13265
+ };
13266
+ const layoutChoices = uniqueHeaderLayoutChoices(
13267
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
13268
+ );
13269
+ const stylesByLayout = {};
13270
+ for (const layoutChoice of layoutChoices) {
13271
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
13272
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
13273
+ styleChoices,
13274
+ layoutChoice.id
13275
+ );
13276
+ }
13277
+ return {
13278
+ defaultHeaderSelection,
13279
+ recommendedHeaderLayoutChoices: layoutChoices,
13280
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
13281
+ };
13282
+ }
13283
+ function typographyChoice(id, note) {
13284
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
13285
+ }
13286
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
13287
+ switch (recipe) {
13288
+ case "clean-sans":
13289
+ return [
13290
+ typographyChoice("typography-preset:modern-sans"),
13291
+ typographyChoice("typography-preset:luxe-contrast"),
13292
+ typographyChoice("typography-preset:bold-display")
13293
+ ];
13294
+ case "friendly-sans":
13295
+ return [
13296
+ typographyChoice("typography-preset:warm-rounded"),
13297
+ typographyChoice("typography-preset:modern-sans"),
13298
+ typographyChoice("typography-preset:editorial-serif")
13299
+ ];
13300
+ case "serif-editorial":
13301
+ return [
13302
+ typographyChoice("typography-preset:editorial-serif"),
13303
+ typographyChoice("typography-preset:classic-serif"),
13304
+ typographyChoice("typography-preset:warm-rounded")
13305
+ ];
13306
+ case "classic-serif":
13307
+ return [
13308
+ typographyChoice("typography-preset:classic-serif"),
13309
+ typographyChoice("typography-preset:luxe-contrast"),
13310
+ typographyChoice("typography-preset:editorial-serif")
13311
+ ];
13312
+ }
13313
+ }
12322
13314
  var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
12323
13315
  var init_curatedSiteStyles = __esm({
12324
13316
  "../theme-core/src/site-styles/curatedSiteStyles.ts"() {
@@ -12330,6 +13322,7 @@ var init_curatedSiteStyles = __esm({
12330
13322
  init_curatedChoices();
12331
13323
  init_sourceCatalogs();
12332
13324
  init_types2();
13325
+ init_typographyPresets();
12333
13326
  curatedSiteStyleIdValues = [
12334
13327
  "site-style:calm-studio",
12335
13328
  "site-style:clear-professional",
@@ -12341,6 +13334,7 @@ var init_curatedSiteStyles = __esm({
12341
13334
  "site-style:personal-retreat-journal",
12342
13335
  "site-style:tactile-workshop",
12343
13336
  "site-style:modern-wellness",
13337
+ "site-style:soft-earth",
12344
13338
  "site-style:bold-launch",
12345
13339
  "site-style:south-west-twerk-school"
12346
13340
  ];
@@ -12731,6 +13725,102 @@ var init_curatedSiteStyles = __esm({
12731
13725
  paletteChoice("warm-neutral-clay")
12732
13726
  ]
12733
13727
  }),
13728
+ defineCuratedSiteStyle({
13729
+ id: "site-style:soft-earth",
13730
+ name: "Soft Earth",
13731
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
13732
+ 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.",
13733
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
13734
+ selectionKeywordRules: [
13735
+ { kind: "word", value: "meditation" },
13736
+ { kind: "word", value: "wellbeing" },
13737
+ { kind: "substring", value: "retreat" },
13738
+ { kind: "phrase", value: "yoga studio" },
13739
+ { kind: "phrase", value: "mindful movement" }
13740
+ ],
13741
+ tokenRecipes: {
13742
+ palette: "warm-neutral",
13743
+ contrast: "standard",
13744
+ radius: "soft",
13745
+ shadow: "subtle",
13746
+ typography: "serif-editorial",
13747
+ spacing: "airy",
13748
+ motion: "subtle"
13749
+ },
13750
+ compositionBudget: balancedBudget,
13751
+ themeOverrides: {
13752
+ typography: {
13753
+ body: {
13754
+ family: "Inter, system-ui, sans-serif",
13755
+ size: "md",
13756
+ weight: "regular",
13757
+ lineHeight: "relaxed",
13758
+ letterSpacing: "normal"
13759
+ },
13760
+ headings: {
13761
+ default: {
13762
+ family: '"Cormorant Garamond", Georgia, serif',
13763
+ weight: "regular",
13764
+ lineHeight: "normal",
13765
+ letterSpacing: "normal",
13766
+ colorToken: "text",
13767
+ italic: null,
13768
+ case: null
13769
+ },
13770
+ h1: {
13771
+ size: "xl",
13772
+ weight: "regular",
13773
+ lineHeight: "normal",
13774
+ letterSpacing: "normal",
13775
+ italic: null
13776
+ },
13777
+ h2: {
13778
+ size: "lg",
13779
+ weight: "regular",
13780
+ lineHeight: "normal",
13781
+ letterSpacing: "normal",
13782
+ italic: null
13783
+ },
13784
+ h3: {
13785
+ size: "md",
13786
+ weight: "regular",
13787
+ lineHeight: "normal",
13788
+ letterSpacing: "normal",
13789
+ italic: null
13790
+ }
13791
+ },
13792
+ scale: "majorThird"
13793
+ },
13794
+ bodyText: {
13795
+ intro: {
13796
+ paragraphSize: "default",
13797
+ headingSize: "editorial"
13798
+ }
13799
+ }
13800
+ },
13801
+ recommendedAppearancePresetIds: [
13802
+ "hero-brand-scrim",
13803
+ "intro-soft-earth-statement",
13804
+ "feature-cards-soft-earth-offerings",
13805
+ "testimonials-soft-earth-proof-band",
13806
+ "faq-soft-earth-two-column",
13807
+ "contact-form-panel"
13808
+ ],
13809
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
13810
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
13811
+ buttonPersonalityChoices: [
13812
+ buttonChoice("earth-pill"),
13813
+ buttonChoice("soft-pill"),
13814
+ buttonChoice("pebble"),
13815
+ buttonChoice("editorial-link")
13816
+ ],
13817
+ paletteVariantChoices: [
13818
+ paletteChoice("warm-neutral-soft-earth"),
13819
+ paletteChoice("warm-neutral-clay"),
13820
+ paletteChoice("warm-neutral-forest"),
13821
+ paletteChoice("soft-natural-sage")
13822
+ ]
13823
+ }),
12734
13824
  defineCuratedSiteStyle({
12735
13825
  id: "site-style:bold-launch",
12736
13826
  name: "Bold Launch",
@@ -12784,49 +13874,13 @@ var init_curatedSiteStyles = __esm({
12784
13874
  motion: "expressive"
12785
13875
  },
12786
13876
  compositionBudget: expressiveBudget,
13877
+ typographyPresetChoices: [
13878
+ typographyChoice("typography-preset:bold-display"),
13879
+ typographyChoice("typography-preset:modern-sans"),
13880
+ typographyChoice("typography-preset:luxe-contrast")
13881
+ ],
13882
+ defaultTypographyPresetId: "typography-preset:bold-display",
12787
13883
  themeOverrides: {
12788
- typography: {
12789
- body: {
12790
- family: "Manrope, system-ui, sans-serif",
12791
- size: "lg",
12792
- weight: "regular",
12793
- lineHeight: "relaxed",
12794
- letterSpacing: "normal"
12795
- },
12796
- headings: {
12797
- default: {
12798
- family: '"TAN - PEARL", sans-serif',
12799
- weight: "bold",
12800
- lineHeight: "normal",
12801
- letterSpacing: "tight",
12802
- colorToken: "primary",
12803
- italic: null,
12804
- case: null
12805
- },
12806
- h1: {
12807
- size: "xl",
12808
- weight: "bold",
12809
- lineHeight: "normal",
12810
- letterSpacing: "tight",
12811
- italic: null
12812
- },
12813
- h2: {
12814
- size: "lg",
12815
- weight: "bold",
12816
- lineHeight: "normal",
12817
- letterSpacing: "normal",
12818
- italic: null
12819
- },
12820
- h3: {
12821
- size: "md",
12822
- weight: "bold",
12823
- lineHeight: "normal",
12824
- letterSpacing: "normal",
12825
- italic: null
12826
- }
12827
- },
12828
- scale: "balanced"
12829
- },
12830
13884
  bodyText: {
12831
13885
  intro: {
12832
13886
  paragraphSize: "editorial",
@@ -13340,6 +14394,7 @@ var init_previewCompiler = __esm({
13340
14394
  init_variants();
13341
14395
  init_curatedChoices();
13342
14396
  init_curatedSiteStyles();
14397
+ init_typographyPresets();
13343
14398
  init_resolver2();
13344
14399
  init_types2();
13345
14400
  init_footerLooks();
@@ -13353,6 +14408,7 @@ var init_previewCompiler = __esm({
13353
14408
  init_runtimeCompiler();
13354
14409
  init_curatedChoices();
13355
14410
  init_curatedSiteStyles();
14411
+ init_typographyPresets();
13356
14412
  init_types2();
13357
14413
  }
13358
14414
  });
@@ -13633,6 +14689,13 @@ var init_pageDesignEditorErrors = __esm({
13633
14689
  }
13634
14690
  });
13635
14691
 
14692
+ // ../theme-core/src/site-styles/persistedIdParseResult.ts
14693
+ var init_persistedIdParseResult = __esm({
14694
+ "../theme-core/src/site-styles/persistedIdParseResult.ts"() {
14695
+ "use strict";
14696
+ }
14697
+ });
14698
+
13636
14699
  // ../theme-core/src/site-styles/tokenRecipes.ts
13637
14700
  import { z as z29 } from "zod";
13638
14701
  var themeTokenRecipeOptions, themeTokenRecipesSchema;
@@ -13690,6 +14753,7 @@ var init_site_styles = __esm({
13690
14753
  init_pageDesignEditorModel();
13691
14754
  init_pageDesignIntent();
13692
14755
  init_previewCustomization();
14756
+ init_persistedIdParseResult();
13693
14757
  init_rawStyleFields();
13694
14758
  init_records();
13695
14759
  init_resolver2();
@@ -13698,6 +14762,7 @@ var init_site_styles = __esm({
13698
14762
  init_sourceCatalogs();
13699
14763
  init_styleTags();
13700
14764
  init_tokenRecipes();
14765
+ init_typographyPresets();
13701
14766
  init_types2();
13702
14767
  }
13703
14768
  });
@@ -17869,8 +18934,9 @@ var init_faqAccordion = __esm({
17869
18934
  },
17870
18935
  fallback: "rb-faq-item"
17871
18936
  },
17872
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
17873
- // Pass icon style from theme
18937
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
18938
+ // Legacy theme accordion style
18939
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17874
18940
  },
17875
18941
  triggerFrom: "faqItem.question",
17876
18942
  contentFrom: "faqItem.answer"
@@ -19404,68 +20470,419 @@ var init_hero = __esm({
19404
20470
  }
19405
20471
  });
19406
20472
 
19407
- // ../blocks/src/system/blocks/body-text.ts
19408
- var bodyCopyComposition, proseLayout, introLayout, narrowLayout, bodyTextManifest, bodyTextBlockDefinition;
19409
- var init_body_text = __esm({
19410
- "../blocks/src/system/blocks/body-text.ts"() {
20473
+ // ../blocks/src/system/fields/aspectRatio.ts
20474
+ function createAspectRatioField(options = {}) {
20475
+ return {
20476
+ id: options.id ?? "aspectRatio",
20477
+ type: "select",
20478
+ label: options.label ?? "Aspect ratio",
20479
+ ...options.description ? { description: options.description } : {},
20480
+ required: false,
20481
+ defaultValue: options.defaultValue ?? "auto",
20482
+ multiple: false,
20483
+ options: [...standardAspectRatioOptions],
20484
+ ui: {
20485
+ intent: options.uiIntent ?? "display",
20486
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
20487
+ }
20488
+ };
20489
+ }
20490
+ var standardAspectRatioOptions;
20491
+ var init_aspectRatio = __esm({
20492
+ "../blocks/src/system/fields/aspectRatio.ts"() {
19411
20493
  "use strict";
19412
- init_styledSection();
19413
- init_defineBlock();
19414
- init_fragments2();
19415
- init_builder();
19416
- bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
19417
- proseLayout = styledSection({
19418
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
19419
- spacing: "medium",
19420
- baseClass: ""
19421
- });
19422
- introLayout = styledSection({
19423
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
19424
- spacing: "medium",
19425
- baseClass: ""
19426
- });
19427
- narrowLayout = styledSection({
19428
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
19429
- spacing: "medium",
19430
- baseClass: ""
19431
- });
19432
- bodyTextManifest = createBlockManifest({
19433
- id: "block.body-text",
19434
- title: "Body Text",
19435
- titleSource: "heading",
19436
- category: "content",
19437
- fragments: [
19438
- { fragment: bodyCopyFragment, fieldPriority: 0 }
19439
- ],
19440
- layout: proseLayout,
19441
- variants: {
19442
- prose: proseLayout,
19443
- intro: introLayout,
19444
- narrow: narrowLayout
19445
- },
19446
- defaultVariant: "prose",
19447
- variantOptions: {
19448
- prose: {
19449
- label: "Prose",
19450
- description: "Long-form rich text for pages and posts.",
19451
- icon: "Type"
19452
- },
19453
- intro: {
19454
- label: "Intro",
19455
- description: "Narrower, larger text for above-the-fold intros.",
19456
- icon: "AlignCenter"
19457
- },
19458
- narrow: {
19459
- label: "Narrow",
19460
- description: "Left-aligned lead copy with a shorter max width.",
19461
- icon: "AlignLeft"
19462
- }
19463
- },
19464
- description: "Simple text block with optional heading and alignment controls.",
19465
- tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
19466
- icon: "Type",
19467
- styleTokens: {
19468
- spacing: "md"
20494
+ standardAspectRatioOptions = [
20495
+ { value: "auto", label: "Auto (original)" },
20496
+ { value: "16/9", label: "16:9 (Landscape)" },
20497
+ { value: "4/3", label: "4:3 (Standard)" },
20498
+ { value: "1/1", label: "1:1 (Square)" },
20499
+ { value: "3/4", label: "3:4 (Portrait)" }
20500
+ ];
20501
+ }
20502
+ });
20503
+
20504
+ // ../blocks/src/system/fields/imageLayout.ts
20505
+ function createImageColSizeField(options = {}) {
20506
+ const {
20507
+ id = "imageColSize",
20508
+ label = "Image column size",
20509
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
20510
+ defaultValue = "1/3",
20511
+ uiIntent = "display",
20512
+ visibleWhen
20513
+ } = options;
20514
+ return {
20515
+ id,
20516
+ type: "select",
20517
+ label,
20518
+ description,
20519
+ required: false,
20520
+ defaultValue,
20521
+ multiple: false,
20522
+ options: [
20523
+ { value: "1/4", label: "Small (1/4)" },
20524
+ { value: "1/3", label: "Medium (1/3)" },
20525
+ { value: "2/5", label: "Large (2/5)" },
20526
+ { value: "1/2", label: "Extra large (1/2)" },
20527
+ { value: "2/3", label: "Huge (2/3)" }
20528
+ ],
20529
+ ui: {
20530
+ intent: uiIntent,
20531
+ ...visibleWhen ? { visibleWhen } : {}
20532
+ }
20533
+ };
20534
+ }
20535
+ function createImagePositionField(options = {}) {
20536
+ const {
20537
+ id = "imagePosition",
20538
+ label = "Image position",
20539
+ description = "Choose which side the image appears on.",
20540
+ defaultValue = "left",
20541
+ includeAlternate = false,
20542
+ uiIntent = "display",
20543
+ visibleWhen
20544
+ } = options;
20545
+ const positionOptions = [
20546
+ { value: "left", label: "Left" },
20547
+ { value: "right", label: "Right" },
20548
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
20549
+ ];
20550
+ return {
20551
+ id,
20552
+ type: "select",
20553
+ label,
20554
+ description,
20555
+ required: false,
20556
+ defaultValue,
20557
+ multiple: false,
20558
+ // Spread to get a mutable array type without unsafe casts.
20559
+ options: [...positionOptions],
20560
+ ui: {
20561
+ intent: uiIntent,
20562
+ ...visibleWhen ? { visibleWhen } : {}
20563
+ }
20564
+ };
20565
+ }
20566
+ var init_imageLayout = __esm({
20567
+ "../blocks/src/system/fields/imageLayout.ts"() {
20568
+ "use strict";
20569
+ }
20570
+ });
20571
+
20572
+ // ../blocks/src/system/blocks/intro.ts
20573
+ function introHeading(className) {
20574
+ return text(
20575
+ {
20576
+ as: "h2",
20577
+ className
20578
+ },
20579
+ when("content.title"),
20580
+ bind("content.title")
20581
+ );
20582
+ }
20583
+ function introBody(className = "rb-prose rb-max-w-none") {
20584
+ return richText({ className }, bind("content.body"));
20585
+ }
20586
+ function introCtas(justify = "start") {
20587
+ return ctaRow({
20588
+ justify,
20589
+ gap: "md",
20590
+ containerClassName: "rb-mt-2"
20591
+ });
20592
+ }
20593
+ function introCopyStack(options = {}) {
20594
+ return stack(
20595
+ {
20596
+ gap: "md",
20597
+ className: options.className ?? "rb-intro-copy"
20598
+ },
20599
+ [
20600
+ introHeading(options.headingClassName ?? "rb-intro-title"),
20601
+ introBody(options.bodyClassName),
20602
+ introCtas(options.ctaJustify)
20603
+ ]
20604
+ );
20605
+ }
20606
+ var introMedia, centeredCopyLayout, statementCopyLayout, statementMediaLayout, mediaCopyLayout, introConfig, introManifest, introBlockDefinition;
20607
+ var init_intro = __esm({
20608
+ "../blocks/src/system/blocks/intro.ts"() {
20609
+ "use strict";
20610
+ init_defineBlock();
20611
+ init_aspectRatio();
20612
+ init_ctas();
20613
+ init_imageLayout();
20614
+ init_builder();
20615
+ init_fragments();
20616
+ introMedia = media(
20617
+ {
20618
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
20619
+ style: {
20620
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
20621
+ }
20622
+ },
20623
+ bind("content.media")
20624
+ );
20625
+ centeredCopyLayout = styledSection({
20626
+ children: styledContainer({
20627
+ rootType: "stack",
20628
+ rootProps: { gap: "lg" },
20629
+ children: [
20630
+ introCopyStack({
20631
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
20632
+ headingClassName: "rb-intro-title rb-text-center",
20633
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
20634
+ ctaJustify: "center"
20635
+ })
20636
+ ]
20637
+ }),
20638
+ baseClass: "",
20639
+ spacing: "medium"
20640
+ });
20641
+ statementCopyLayout = styledSection({
20642
+ children: styledContainer({
20643
+ children: [
20644
+ el(
20645
+ "div",
20646
+ {
20647
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
20648
+ },
20649
+ [
20650
+ introHeading("rb-intro-title rb-max-w-xl"),
20651
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20652
+ introBody(),
20653
+ introCtas("start")
20654
+ ])
20655
+ ]
20656
+ )
20657
+ ]
20658
+ }),
20659
+ baseClass: "",
20660
+ spacing: "medium"
20661
+ });
20662
+ statementMediaLayout = styledSection({
20663
+ children: styledContainer({
20664
+ children: [
20665
+ el(
20666
+ "div",
20667
+ {
20668
+ 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"
20669
+ },
20670
+ [
20671
+ introHeading("rb-intro-title rb-max-w-xl"),
20672
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20673
+ introBody(),
20674
+ introCtas("start")
20675
+ ]),
20676
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
20677
+ ]
20678
+ )
20679
+ ]
20680
+ }),
20681
+ baseClass: "",
20682
+ spacing: "medium"
20683
+ });
20684
+ mediaCopyLayout = styledSection({
20685
+ children: styledContainer({
20686
+ children: [
20687
+ responsiveTwoColumn({
20688
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
20689
+ text: introCopyStack({
20690
+ className: "rb-intro-copy rb-max-w-xl",
20691
+ headingClassName: "rb-intro-title"
20692
+ }),
20693
+ ratioFrom: "content.ratio",
20694
+ imagePositionFrom: "content.imagePosition",
20695
+ gapFrom: "content.gap",
20696
+ gapFallback: "comfortable",
20697
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
20698
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
20699
+ })
20700
+ ]
20701
+ }),
20702
+ baseClass: "",
20703
+ spacing: "medium"
20704
+ });
20705
+ introConfig = {
20706
+ id: "block.intro",
20707
+ title: "Intro",
20708
+ category: "layout",
20709
+ includeContainerStyles: true,
20710
+ titleSource: "title",
20711
+ additionalFields: [
20712
+ {
20713
+ id: "title",
20714
+ type: "text",
20715
+ label: "Statement",
20716
+ required: false,
20717
+ multiline: true,
20718
+ maxLength: 160
20719
+ },
20720
+ {
20721
+ id: "body",
20722
+ type: "richText",
20723
+ label: "Text",
20724
+ required: true,
20725
+ ui: {
20726
+ richTextVariant: "limited"
20727
+ }
20728
+ },
20729
+ {
20730
+ id: "media",
20731
+ type: "media",
20732
+ label: "Media",
20733
+ required: false,
20734
+ mediaKinds: ["image"],
20735
+ ui: {
20736
+ intent: "content",
20737
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
20738
+ }
20739
+ },
20740
+ createImagePositionField({
20741
+ id: "imagePosition",
20742
+ label: "Image position",
20743
+ defaultValue: "left",
20744
+ uiIntent: "display",
20745
+ visibleWhen: { field: "variant", equals: "media-copy" }
20746
+ }),
20747
+ {
20748
+ id: "gap",
20749
+ type: "select",
20750
+ label: "Gap between media and text",
20751
+ required: false,
20752
+ defaultValue: "comfortable",
20753
+ multiple: false,
20754
+ options: [
20755
+ { value: "none", label: "None" },
20756
+ { value: "compact", label: "Compact" },
20757
+ { value: "cozy", label: "Cozy" },
20758
+ { value: "medium", label: "Medium" },
20759
+ { value: "comfortable", label: "Comfortable" },
20760
+ { value: "spacious", label: "Spacious" }
20761
+ ],
20762
+ ui: {
20763
+ intent: "display",
20764
+ visibleWhen: { field: "variant", equals: "media-copy" }
20765
+ }
20766
+ },
20767
+ createImageColSizeField({
20768
+ id: "ratio",
20769
+ label: "Media column size",
20770
+ defaultValue: "1/2",
20771
+ uiIntent: "display",
20772
+ visibleWhen: { field: "variant", equals: "media-copy" }
20773
+ }),
20774
+ createAspectRatioField({
20775
+ id: "aspectRatio",
20776
+ label: "Media aspect ratio",
20777
+ description: "Crop media to a consistent aspect ratio.",
20778
+ defaultValue: "auto",
20779
+ visibleWhen: { field: "media", notEquals: null }
20780
+ }),
20781
+ createCtasRepeater({
20782
+ label: "Calls to action",
20783
+ itemLabel: "CTA",
20784
+ maxItems: 2
20785
+ })
20786
+ ],
20787
+ layout: centeredCopyLayout,
20788
+ variants: {
20789
+ "centered-copy": centeredCopyLayout,
20790
+ "statement-copy": statementCopyLayout,
20791
+ "statement-media": statementMediaLayout,
20792
+ "media-copy": mediaCopyLayout
20793
+ },
20794
+ defaultVariant: "statement-copy",
20795
+ variantOptions: {
20796
+ "centered-copy": {
20797
+ label: "Centered copy",
20798
+ description: "A focused intro with centered text and optional calls to action."
20799
+ },
20800
+ "statement-copy": {
20801
+ label: "Statement and copy",
20802
+ description: "A large statement on the left with supporting copy on the right."
20803
+ },
20804
+ "statement-media": {
20805
+ label: "Statement, copy and media",
20806
+ description: "A three-part intro with statement, copy and a small image."
20807
+ },
20808
+ "media-copy": {
20809
+ label: "Media and copy",
20810
+ description: "A compact media/text intro for softer transitions after a hero."
20811
+ }
20812
+ },
20813
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
20814
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
20815
+ icon: "PanelTopOpen"
20816
+ };
20817
+ introManifest = createBlockManifest(introConfig);
20818
+ introBlockDefinition = {
20819
+ manifest: introManifest
20820
+ };
20821
+ }
20822
+ });
20823
+
20824
+ // ../blocks/src/system/blocks/body-text.ts
20825
+ var bodyCopyComposition, proseLayout, introLayout, narrowLayout, bodyTextManifest, bodyTextBlockDefinition;
20826
+ var init_body_text = __esm({
20827
+ "../blocks/src/system/blocks/body-text.ts"() {
20828
+ "use strict";
20829
+ init_styledSection();
20830
+ init_defineBlock();
20831
+ init_fragments2();
20832
+ init_builder();
20833
+ bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
20834
+ proseLayout = styledSection({
20835
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
20836
+ spacing: "medium",
20837
+ baseClass: ""
20838
+ });
20839
+ introLayout = styledSection({
20840
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
20841
+ spacing: "medium",
20842
+ baseClass: ""
20843
+ });
20844
+ narrowLayout = styledSection({
20845
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
20846
+ spacing: "medium",
20847
+ baseClass: ""
20848
+ });
20849
+ bodyTextManifest = createBlockManifest({
20850
+ id: "block.body-text",
20851
+ title: "Body Text",
20852
+ titleSource: "heading",
20853
+ category: "content",
20854
+ fragments: [
20855
+ { fragment: bodyCopyFragment, fieldPriority: 0 }
20856
+ ],
20857
+ layout: proseLayout,
20858
+ variants: {
20859
+ prose: proseLayout,
20860
+ intro: introLayout,
20861
+ narrow: narrowLayout
20862
+ },
20863
+ defaultVariant: "prose",
20864
+ variantOptions: {
20865
+ prose: {
20866
+ label: "Prose",
20867
+ description: "Long-form rich text for pages and posts.",
20868
+ icon: "Type"
20869
+ },
20870
+ intro: {
20871
+ label: "Intro",
20872
+ description: "Narrower, larger text for above-the-fold intros.",
20873
+ icon: "AlignCenter"
20874
+ },
20875
+ narrow: {
20876
+ label: "Narrow",
20877
+ description: "Left-aligned lead copy with a shorter max width.",
20878
+ icon: "AlignLeft"
20879
+ }
20880
+ },
20881
+ description: "Simple text block with optional heading and alignment controls.",
20882
+ tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
20883
+ icon: "Type",
20884
+ styleTokens: {
20885
+ spacing: "md"
19469
20886
  }
19470
20887
  });
19471
20888
  bodyTextBlockDefinition = {
@@ -20326,7 +21743,13 @@ var init_form = __esm({
20326
21743
  });
20327
21744
 
20328
21745
  // ../blocks/src/system/blocks/faq.ts
20329
- var faqComposition, faqManifest, faqBlockDefinition;
21746
+ function fragmentLayoutNode(layout) {
21747
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
21748
+ }
21749
+ function isNodeDefinitionArray(layout) {
21750
+ return Array.isArray(layout);
21751
+ }
21752
+ var faqComposition, headingLayout, accordionLayout, defaultLayout, twoColumnLayout, faqManifest, faqBlockDefinition;
20330
21753
  var init_faq = __esm({
20331
21754
  "../blocks/src/system/blocks/faq.ts"() {
20332
21755
  "use strict";
@@ -20340,6 +21763,31 @@ var init_faq = __esm({
20340
21763
  { fragment: faqHeadingFragment, fieldPriority: 0 },
20341
21764
  { fragment: faqAccordionFragment, fieldPriority: 1 }
20342
21765
  ]);
21766
+ headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
21767
+ accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
21768
+ defaultLayout = styledSection({
21769
+ children: styledContainer({
21770
+ baseClassName: "rb-relative rb-isolate",
21771
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
21772
+ }),
21773
+ baseClass: ""
21774
+ });
21775
+ twoColumnLayout = styledSection({
21776
+ children: styledContainer({
21777
+ baseClassName: "rb-relative rb-isolate",
21778
+ children: el(
21779
+ "div",
21780
+ {
21781
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
21782
+ },
21783
+ [
21784
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
21785
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
21786
+ ]
21787
+ )
21788
+ }),
21789
+ baseClass: ""
21790
+ });
20343
21791
  faqManifest = createBlockManifest({
20344
21792
  id: "block.faq",
20345
21793
  title: "FAQ",
@@ -20356,13 +21804,22 @@ var init_faq = __esm({
20356
21804
  label: "FAQ item styles"
20357
21805
  })
20358
21806
  ],
20359
- layout: styledSection({
20360
- children: styledContainer({
20361
- baseClassName: "rb-relative rb-isolate",
20362
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
20363
- }),
20364
- baseClass: ""
20365
- }),
21807
+ layout: defaultLayout,
21808
+ variants: {
21809
+ default: defaultLayout,
21810
+ "two-column": twoColumnLayout
21811
+ },
21812
+ defaultVariant: "default",
21813
+ variantOptions: {
21814
+ default: {
21815
+ label: "Default",
21816
+ description: "A centered heading above one FAQ accordion."
21817
+ },
21818
+ "two-column": {
21819
+ label: "Two column",
21820
+ description: "A left heading column with FAQ items on the right."
21821
+ }
21822
+ },
20366
21823
  description: "Accordion of frequently asked questions and answers.",
20367
21824
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
20368
21825
  icon: "HelpCircle"
@@ -21003,7 +22460,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
21003
22460
  function resolveHeaderVisualStyles(header, tokens) {
21004
22461
  const navContainerType = header?.navContainer?.type ?? "none";
21005
22462
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
21006
- if (hasContainedNav) {
22463
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
22464
+ if (hasContainedNav || hasTransparentVariant) {
21007
22465
  return {
21008
22466
  backgroundToken: "transparent",
21009
22467
  paletteHex: null,
@@ -21052,7 +22510,7 @@ function extractBackgroundColorToken(background, fallback) {
21052
22510
  }
21053
22511
  return fallback;
21054
22512
  }
21055
- var joinClasses4, maxWidthClassSchema, maxWidthClassTransform, headerRootClassSchema, headerRootClassTransform, footerRootClassSchema, footerRootClassTransform, headerRootStyleTransform, footerRootStyleTransform, footerSpacingClassXMap, footerSpacingClassYMap, footerGapXClassMap, footerGapYClassMap, footerAlignClassMap, footerBottomBarClassSchema, footerBottomBarClassTransform, footerBottomBarContainerClassSchema, footerBottomBarContainerClassTransform, footerBottomBarStyleTransform, footerSplitNavSingleClassTransform, footerSplitMainClassSchema, footerSplitMainClassTransform, footerLogoClassSchema, footerLogoClassTransform, footerLogoMediaClassSchema, footerLogoMediaClassTransform, footerLogoTextVisibleTransform, layoutTransforms;
22513
+ var joinClasses4, maxWidthClassSchema, maxWidthClassTransform, headerRootClassSchema, headerRootClassTransform, footerRootClassSchema, footerRootClassTransform, headerRootStyleTransform, headerSectionBackgroundTransform, footerRootStyleTransform, footerSpacingClassXMap, footerSpacingClassYMap, footerGapXClassMap, footerGapYClassMap, footerAlignClassMap, footerBottomBarClassSchema, footerBottomBarClassTransform, footerBottomBarContainerClassSchema, footerBottomBarContainerClassTransform, footerBottomBarStyleTransform, footerSplitNavSingleClassTransform, footerSplitMainClassSchema, footerSplitMainClassTransform, footerLogoClassSchema, footerLogoClassTransform, footerLogoMediaClassSchema, footerLogoMediaClassTransform, footerLogoTextVisibleTransform, layoutTransforms;
21056
22514
  var init_layout = __esm({
21057
22515
  "../blocks/src/system/transforms/registry/layout.ts"() {
21058
22516
  "use strict";
@@ -21185,6 +22643,17 @@ var init_layout = __esm({
21185
22643
  return mergeStyles(...styleParts);
21186
22644
  }
21187
22645
  };
22646
+ headerSectionBackgroundTransform = {
22647
+ id: "layout.headerSectionBackground",
22648
+ kind: "string",
22649
+ summary: "Resolve the inner site-header section background token",
22650
+ run: (value) => {
22651
+ const header = asPartialObject(value);
22652
+ const navContainerType = header?.navContainer?.type ?? "none";
22653
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
22654
+ return usesTransparentRoot ? "raw:transparent" : "background";
22655
+ }
22656
+ };
21188
22657
  footerRootStyleTransform = {
21189
22658
  id: "layout.footerRootStyle",
21190
22659
  kind: "formatter",
@@ -21425,6 +22894,7 @@ var init_layout = __esm({
21425
22894
  headerRootClassTransform,
21426
22895
  footerRootClassTransform,
21427
22896
  headerRootStyleTransform,
22897
+ headerSectionBackgroundTransform,
21428
22898
  footerRootStyleTransform,
21429
22899
  footerBottomBarClassTransform,
21430
22900
  footerBottomBarContainerClassTransform,
@@ -21985,7 +23455,10 @@ var init_site_header = __esm({
21985
23455
  );
21986
23456
  headerLayout = headerSection(
21987
23457
  {
21988
- background: "background",
23458
+ background: bindProp("$root.theme.header", {
23459
+ transforms: pipe(tx("layout.headerSectionBackground")),
23460
+ fallback: "background"
23461
+ }),
21989
23462
  allowOverflow: true,
21990
23463
  className: bindProp("$root.theme.header", {
21991
23464
  transforms: pipe(tx("layout.headerRootClass")),
@@ -22884,79 +24357,311 @@ var init_collection = __esm({
22884
24357
  { gap: "md" }
22885
24358
  ),
22886
24359
  baseClass: "",
22887
- spacing: "comfortable"
24360
+ spacing: "comfortable"
24361
+ });
24362
+ collectionManifest = createBlockManifest({
24363
+ id: "block.collection",
24364
+ title: "Collection",
24365
+ category: "layout",
24366
+ additionalFields: [
24367
+ parseFieldDefinition({
24368
+ id: "layout",
24369
+ type: "select",
24370
+ label: "Layout",
24371
+ defaultValue: "grid",
24372
+ options: [
24373
+ { value: "grid", label: "Grid" },
24374
+ { value: "stack", label: "Stack" }
24375
+ ],
24376
+ ui: { intent: "display" }
24377
+ }),
24378
+ parseFieldDefinition({
24379
+ id: "columns",
24380
+ type: "select",
24381
+ label: "Columns",
24382
+ description: "Number of columns in the grid layout.",
24383
+ defaultValue: "3",
24384
+ options: [
24385
+ { value: "2", label: "2 columns" },
24386
+ { value: "3", label: "3 columns" },
24387
+ { value: "4", label: "4 columns" }
24388
+ ],
24389
+ ui: {
24390
+ intent: "display",
24391
+ visibleWhen: { field: "layout", equals: "grid" }
24392
+ }
24393
+ }),
24394
+ parseFieldDefinition({
24395
+ id: "gap",
24396
+ type: "select",
24397
+ label: "Gap",
24398
+ defaultValue: "medium",
24399
+ options: [
24400
+ { value: "none", label: "None" },
24401
+ { value: "compact", label: "Compact" },
24402
+ { value: "cozy", label: "Cozy" },
24403
+ { value: "medium", label: "Medium" },
24404
+ { value: "comfortable", label: "Comfortable" },
24405
+ { value: "spacious", label: "Spacious" }
24406
+ ],
24407
+ ui: { intent: "display" }
24408
+ }),
24409
+ fragmentsToRepeaterField(
24410
+ "items",
24411
+ "Items",
24412
+ collectionFragments,
24413
+ {
24414
+ minItems: 0,
24415
+ maxItems: 50,
24416
+ itemLabel: "Item",
24417
+ description: "Add items to this collection."
24418
+ }
24419
+ ),
24420
+ cardStylesField({
24421
+ id: "_cardStyles",
24422
+ label: "Item styles"
24423
+ })
24424
+ ],
24425
+ layout: collectionLayout,
24426
+ description: "Repeat items in a grid or stack layout.",
24427
+ tags: ["collection", "grid", "stack", "repeater"],
24428
+ icon: "LayoutList",
24429
+ styleTokens: { spacing: "lg" }
24430
+ });
24431
+ collectionBlockDefinition = {
24432
+ manifest: collectionManifest
24433
+ };
24434
+ }
24435
+ });
24436
+
24437
+ // ../blocks/src/system/blocks/feature-cards.ts
24438
+ function grid3(props2, children) {
24439
+ return el("grid", props2 ?? void 0, children ?? void 0);
24440
+ }
24441
+ var sectionHeading, featureCard, cardsLayout, featureCardsConfig, featureCardsManifest, featureCardsBlockDefinition;
24442
+ var init_feature_cards = __esm({
24443
+ "../blocks/src/system/blocks/feature-cards.ts"() {
24444
+ "use strict";
24445
+ init_defineBlock();
24446
+ init_aspectRatio();
24447
+ init_boxStyles();
24448
+ init_ctas();
24449
+ init_builder();
24450
+ init_fragments();
24451
+ init_colorStyles();
24452
+ sectionHeading = stack(
24453
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
24454
+ [
24455
+ text(
24456
+ {
24457
+ as: "h2",
24458
+ className: "rb-feature-cards-title rb-text-center"
24459
+ },
24460
+ when("content.title"),
24461
+ bind("content.title")
24462
+ ),
24463
+ richText(
24464
+ {
24465
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
24466
+ style: textColorStyle("mutedText")
24467
+ },
24468
+ when("content.description"),
24469
+ bind("content.description")
24470
+ )
24471
+ ]
24472
+ );
24473
+ featureCard = styledCard(
24474
+ [
24475
+ media(
24476
+ {
24477
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
24478
+ style: {
24479
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
24480
+ }
24481
+ },
24482
+ when("card.media"),
24483
+ bind("card.media")
24484
+ ),
24485
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
24486
+ text(
24487
+ {
24488
+ as: "h3",
24489
+ className: "rb-feature-card-title"
24490
+ },
24491
+ bind("card.title")
24492
+ ),
24493
+ richText(
24494
+ {
24495
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
24496
+ style: textColorStyle("mutedText")
24497
+ },
24498
+ when("card.body"),
24499
+ bind("card.body")
24500
+ ),
24501
+ ctaRow({
24502
+ collectionPath: "ctas",
24503
+ itemName: "cta",
24504
+ gap: "sm",
24505
+ justify: "start",
24506
+ containerClassName: "rb-mt-auto"
24507
+ })
24508
+ ])
24509
+ ],
24510
+ {
24511
+ stylesFrom: "content._cardStyles",
24512
+ backgroundFrom: "content._cardStyles.background",
24513
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
24514
+ },
24515
+ repeat("content.cards", "card")
24516
+ );
24517
+ cardsLayout = styledSection({
24518
+ children: styledContainer({
24519
+ rootType: "stack",
24520
+ rootProps: { gap: "xl" },
24521
+ children: [
24522
+ sectionHeading,
24523
+ grid3(
24524
+ {
24525
+ cols: {
24526
+ $bind: {
24527
+ from: "content.columns",
24528
+ fallback: 3,
24529
+ coerce: "number"
24530
+ }
24531
+ },
24532
+ gap: "lg"
24533
+ },
24534
+ [featureCard]
24535
+ )
24536
+ ]
24537
+ }),
24538
+ baseClass: "",
24539
+ spacing: "medium"
22888
24540
  });
22889
- collectionManifest = createBlockManifest({
22890
- id: "block.collection",
22891
- title: "Collection",
24541
+ featureCardsConfig = {
24542
+ id: "block.feature-cards",
24543
+ title: "Feature Cards",
22892
24544
  category: "layout",
24545
+ includeContainerStyles: true,
24546
+ titleSource: "title",
22893
24547
  additionalFields: [
22894
- parseFieldDefinition({
22895
- id: "layout",
22896
- type: "select",
22897
- label: "Layout",
22898
- defaultValue: "grid",
22899
- options: [
22900
- { value: "grid", label: "Grid" },
22901
- { value: "stack", label: "Stack" }
22902
- ],
22903
- ui: { intent: "display" }
22904
- }),
22905
- parseFieldDefinition({
24548
+ {
24549
+ id: "title",
24550
+ type: "text",
24551
+ label: "Title",
24552
+ required: false,
24553
+ multiline: false,
24554
+ maxLength: 120
24555
+ },
24556
+ {
24557
+ id: "description",
24558
+ type: "richText",
24559
+ label: "Description",
24560
+ required: false,
24561
+ ui: {
24562
+ richTextVariant: "limited"
24563
+ }
24564
+ },
24565
+ {
22906
24566
  id: "columns",
22907
24567
  type: "select",
22908
24568
  label: "Columns",
22909
- description: "Number of columns in the grid layout.",
24569
+ required: false,
22910
24570
  defaultValue: "3",
24571
+ multiple: false,
22911
24572
  options: [
22912
24573
  { value: "2", label: "2 columns" },
22913
24574
  { value: "3", label: "3 columns" },
22914
24575
  { value: "4", label: "4 columns" }
22915
24576
  ],
22916
- ui: {
22917
- intent: "display",
22918
- visibleWhen: { field: "layout", equals: "grid" }
22919
- }
22920
- }),
22921
- parseFieldDefinition({
22922
- id: "gap",
22923
- type: "select",
22924
- label: "Gap",
22925
- defaultValue: "medium",
22926
- options: [
22927
- { value: "none", label: "None" },
22928
- { value: "compact", label: "Compact" },
22929
- { value: "cozy", label: "Cozy" },
22930
- { value: "medium", label: "Medium" },
22931
- { value: "comfortable", label: "Comfortable" },
22932
- { value: "spacious", label: "Spacious" }
22933
- ],
22934
24577
  ui: { intent: "display" }
22935
- }),
22936
- fragmentsToRepeaterField(
22937
- "items",
22938
- "Items",
22939
- collectionFragments,
22940
- {
22941
- minItems: 0,
22942
- maxItems: 50,
22943
- itemLabel: "Item",
22944
- description: "Add items to this collection."
24578
+ },
24579
+ {
24580
+ id: "cards",
24581
+ type: "repeater",
24582
+ label: "Cards",
24583
+ required: false,
24584
+ minItems: 1,
24585
+ maxItems: 8,
24586
+ itemLabel: "Card",
24587
+ itemLabelSource: "title",
24588
+ allowConversion: true,
24589
+ ui: {
24590
+ intent: "content"
24591
+ },
24592
+ schema: {
24593
+ fields: [
24594
+ {
24595
+ id: "media",
24596
+ type: "media",
24597
+ label: "Image",
24598
+ required: false,
24599
+ mediaKinds: ["image"]
24600
+ },
24601
+ createAspectRatioField({
24602
+ id: "aspectRatio",
24603
+ label: "Image aspect ratio",
24604
+ defaultValue: "4/3",
24605
+ visibleWhen: { field: "media", notEquals: null }
24606
+ }),
24607
+ {
24608
+ id: "title",
24609
+ type: "text",
24610
+ label: "Title",
24611
+ required: true,
24612
+ multiline: false,
24613
+ maxLength: 120
24614
+ },
24615
+ {
24616
+ id: "body",
24617
+ type: "richText",
24618
+ label: "Text",
24619
+ required: false,
24620
+ ui: {
24621
+ richTextVariant: "limited"
24622
+ }
24623
+ },
24624
+ createCtasRepeater({
24625
+ label: "Calls to action",
24626
+ itemLabel: "CTA",
24627
+ maxItems: 1,
24628
+ button: {
24629
+ variants: [
24630
+ { value: "primary", label: "Primary" },
24631
+ { value: "secondary", label: "Secondary" },
24632
+ { value: "outline", label: "Outline" },
24633
+ { value: "ghost", label: "Ghost" },
24634
+ { value: "link", label: "Link" }
24635
+ ],
24636
+ defaultVariant: "ghost"
24637
+ }
24638
+ })
24639
+ ]
22945
24640
  }
22946
- ),
24641
+ },
22947
24642
  cardStylesField({
22948
24643
  id: "_cardStyles",
22949
- label: "Item styles"
24644
+ label: "Card styles"
22950
24645
  })
22951
24646
  ],
22952
- layout: collectionLayout,
22953
- description: "Repeat items in a grid or stack layout.",
22954
- tags: ["collection", "grid", "stack", "repeater"],
22955
- icon: "LayoutList",
22956
- styleTokens: { spacing: "lg" }
22957
- });
22958
- collectionBlockDefinition = {
22959
- manifest: collectionManifest
24647
+ layout: cardsLayout,
24648
+ variants: {
24649
+ cards: cardsLayout
24650
+ },
24651
+ defaultVariant: "cards",
24652
+ variantOptions: {
24653
+ cards: {
24654
+ label: "Cards",
24655
+ description: "A responsive grid of image cards with optional calls to action."
24656
+ }
24657
+ },
24658
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
24659
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
24660
+ icon: "PanelsTopLeft"
24661
+ };
24662
+ featureCardsManifest = createBlockManifest(featureCardsConfig);
24663
+ featureCardsBlockDefinition = {
24664
+ manifest: featureCardsManifest
22960
24665
  };
22961
24666
  }
22962
24667
  });
@@ -23060,74 +24765,6 @@ var init_carousel = __esm({
23060
24765
  }
23061
24766
  });
23062
24767
 
23063
- // ../blocks/src/system/fields/imageLayout.ts
23064
- function createImageColSizeField(options = {}) {
23065
- const {
23066
- id = "imageColSize",
23067
- label = "Image column size",
23068
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
23069
- defaultValue = "1/3",
23070
- uiIntent = "display",
23071
- visibleWhen
23072
- } = options;
23073
- return {
23074
- id,
23075
- type: "select",
23076
- label,
23077
- description,
23078
- required: false,
23079
- defaultValue,
23080
- multiple: false,
23081
- options: [
23082
- { value: "1/4", label: "Small (1/4)" },
23083
- { value: "1/3", label: "Medium (1/3)" },
23084
- { value: "2/5", label: "Large (2/5)" },
23085
- { value: "1/2", label: "Extra large (1/2)" },
23086
- { value: "2/3", label: "Huge (2/3)" }
23087
- ],
23088
- ui: {
23089
- intent: uiIntent,
23090
- ...visibleWhen ? { visibleWhen } : {}
23091
- }
23092
- };
23093
- }
23094
- function createImagePositionField(options = {}) {
23095
- const {
23096
- id = "imagePosition",
23097
- label = "Image position",
23098
- description = "Choose which side the image appears on.",
23099
- defaultValue = "left",
23100
- includeAlternate = false,
23101
- uiIntent = "display",
23102
- visibleWhen
23103
- } = options;
23104
- const positionOptions = [
23105
- { value: "left", label: "Left" },
23106
- { value: "right", label: "Right" },
23107
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
23108
- ];
23109
- return {
23110
- id,
23111
- type: "select",
23112
- label,
23113
- description,
23114
- required: false,
23115
- defaultValue,
23116
- multiple: false,
23117
- // Spread to get a mutable array type without unsafe casts.
23118
- options: [...positionOptions],
23119
- ui: {
23120
- intent: uiIntent,
23121
- ...visibleWhen ? { visibleWhen } : {}
23122
- }
23123
- };
23124
- }
23125
- var init_imageLayout = __esm({
23126
- "../blocks/src/system/fields/imageLayout.ts"() {
23127
- "use strict";
23128
- }
23129
- });
23130
-
23131
24768
  // ../blocks/src/system/blocks/media-text.ts
23132
24769
  var mediaTextFrameCapability, textCardStylesField, mediaTextManifest, mediaTextBlockDefinition;
23133
24770
  var init_media_text = __esm({
@@ -23137,6 +24774,7 @@ var init_media_text = __esm({
23137
24774
  init_frameStyles();
23138
24775
  init_fragments();
23139
24776
  init_builder();
24777
+ init_aspectRatio();
23140
24778
  init_boxStyles();
23141
24779
  init_carousel();
23142
24780
  init_imageLayout();
@@ -23262,26 +24900,13 @@ var init_media_text = __esm({
23262
24900
  },
23263
24901
  ui: { intent: "behavior" }
23264
24902
  }),
23265
- {
24903
+ createAspectRatioField({
23266
24904
  id: "aspectRatio",
23267
- type: "select",
23268
24905
  label: "Media aspect ratio",
23269
24906
  description: "Crop media to a consistent aspect ratio.",
23270
- required: false,
23271
24907
  defaultValue: "auto",
23272
- multiple: false,
23273
- options: [
23274
- { value: "auto", label: "Auto (original)" },
23275
- { value: "16/9", label: "16:9 (Landscape)" },
23276
- { value: "4/3", label: "4:3 (Standard)" },
23277
- { value: "1/1", label: "1:1 (Square)" },
23278
- { value: "3/4", label: "3:4 (Portrait)" }
23279
- ],
23280
- ui: {
23281
- intent: "display",
23282
- visibleWhen: { field: "images", notEquals: null }
23283
- }
23284
- },
24908
+ visibleWhen: { field: "images", notEquals: null }
24909
+ }),
23285
24910
  {
23286
24911
  id: "text",
23287
24912
  type: "richText",
@@ -23411,7 +25036,7 @@ var init_media_text = __esm({
23411
25036
  whenImagesLength(0)
23412
25037
  );
23413
25038
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
23414
- const defaultLayout = styledSection({
25039
+ const defaultLayout2 = styledSection({
23415
25040
  children: styledContainer({
23416
25041
  rootType: "stack",
23417
25042
  rootProps: { gap: "lg" },
@@ -23443,9 +25068,9 @@ var init_media_text = __esm({
23443
25068
  spacing: "medium"
23444
25069
  });
23445
25070
  return {
23446
- layout: defaultLayout,
25071
+ layout: defaultLayout2,
23447
25072
  variants: {
23448
- default: defaultLayout
25073
+ default: defaultLayout2
23449
25074
  },
23450
25075
  defaultVariant: "default",
23451
25076
  variantOptions: {
@@ -27156,7 +28781,7 @@ var init_embed = __esm({
27156
28781
  });
27157
28782
 
27158
28783
  // ../blocks/src/system/blocks/image-gallery.ts
27159
- var grid3, galleryContainer, galleryItem, gridLayout3, carouselLayout2, masonryLayout, marqueeTileBase, marqueeTile, marqueeLayout, emptyState2, wrapVariant2, fields, baseImageGalleryManifest, imageGalleryManifest, imageGalleryBlockDefinition;
28784
+ var grid4, galleryContainer, galleryItem, gridLayout3, carouselLayout2, masonryLayout, marqueeTileBase, marqueeTile, marqueeLayout, emptyState2, wrapVariant2, fields, baseImageGalleryManifest, imageGalleryManifest, imageGalleryBlockDefinition;
27160
28785
  var init_image_gallery = __esm({
27161
28786
  "../blocks/src/system/blocks/image-gallery.ts"() {
27162
28787
  "use strict";
@@ -27165,7 +28790,7 @@ var init_image_gallery = __esm({
27165
28790
  init_colorStyles();
27166
28791
  init_defineBlock();
27167
28792
  init_fragments();
27168
- grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28793
+ grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
27169
28794
  galleryContainer = (children, opts) => {
27170
28795
  const gap = opts?.gap ?? "md";
27171
28796
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -27245,7 +28870,7 @@ var init_image_gallery = __esm({
27245
28870
  ],
27246
28871
  repeat("content.images", "item")
27247
28872
  );
27248
- gridLayout3 = grid3(
28873
+ gridLayout3 = grid4(
27249
28874
  {
27250
28875
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
27251
28876
  },
@@ -27850,7 +29475,7 @@ var init_image_gallery = __esm({
27850
29475
  });
27851
29476
 
27852
29477
  // ../blocks/src/system/blocks/video-grid.ts
27853
- var grid4, videoItem, gridColumnsClass, createGridLayout, gridLayout1, gridLayout22, gridLayout32, gridLayout4, emptyState3, headingSection, videoGridLayout, fields2, videoGridManifest, videoGridBlockDefinition;
29478
+ var grid5, videoItem, gridColumnsClass, createGridLayout, gridLayout1, gridLayout22, gridLayout32, gridLayout4, emptyState3, headingSection, videoGridLayout, fields2, videoGridManifest, videoGridBlockDefinition;
27854
29479
  var init_video_grid = __esm({
27855
29480
  "../blocks/src/system/blocks/video-grid.ts"() {
27856
29481
  "use strict";
@@ -27859,7 +29484,7 @@ var init_video_grid = __esm({
27859
29484
  init_fragments();
27860
29485
  init_colorStyles();
27861
29486
  init_defineBlock();
27862
- grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
29487
+ grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
27863
29488
  videoItem = (options) => stack(
27864
29489
  { gap: "xs", className: options.containerClassName },
27865
29490
  [
@@ -27909,7 +29534,7 @@ var init_video_grid = __esm({
27909
29534
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
27910
29535
  }
27911
29536
  };
27912
- createGridLayout = (columns) => grid4(
29537
+ createGridLayout = (columns) => grid5(
27913
29538
  {
27914
29539
  className: gridColumnsClass(columns)
27915
29540
  },
@@ -31156,6 +32781,7 @@ var init_blocks = __esm({
31156
32781
  init_designCapabilities();
31157
32782
  init_registry4();
31158
32783
  init_hero();
32784
+ init_intro();
31159
32785
  init_body_text();
31160
32786
  init_blog_post();
31161
32787
  init_blog_listing();
@@ -31168,6 +32794,7 @@ var init_blocks = __esm({
31168
32794
  init_testimonials();
31169
32795
  init_columns();
31170
32796
  init_collection();
32797
+ init_feature_cards();
31171
32798
  init_media_text();
31172
32799
  init_appointment_booking();
31173
32800
  init_event_registration();
@@ -31190,6 +32817,7 @@ var init_blocks = __esm({
31190
32817
  init_team_members();
31191
32818
  init_location_map();
31192
32819
  init_hero();
32820
+ init_intro();
31193
32821
  init_body_text();
31194
32822
  init_location_map();
31195
32823
  init_blog_post();
@@ -31203,6 +32831,7 @@ var init_blocks = __esm({
31203
32831
  init_testimonials();
31204
32832
  init_columns();
31205
32833
  init_collection();
32834
+ init_feature_cards();
31206
32835
  init_media_text();
31207
32836
  init_appointment_booking();
31208
32837
  init_event_registration();
@@ -31358,6 +32987,40 @@ var init_blocks = __esm({
31358
32987
  })
31359
32988
  ]
31360
32989
  })),
32990
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
32991
+ sectionSurfaces: "supported",
32992
+ contentFrames: ["plain", "panel"],
32993
+ itemSurfaces: "unsupported",
32994
+ headingDecorations: ["organic-squiggle"]
32995
+ }), defineBlockDesignMetadata({
32996
+ flow: bodyFlow,
32997
+ layoutProfiles: [
32998
+ layoutProfile({
32999
+ variantKey: "centered-copy",
33000
+ family: "centered",
33001
+ weight: "featured",
33002
+ bias: "soft"
33003
+ }),
33004
+ layoutProfile({
33005
+ variantKey: "statement-copy",
33006
+ family: "split",
33007
+ weight: "featured",
33008
+ bias: "merge"
33009
+ }),
33010
+ layoutProfile({
33011
+ variantKey: "statement-media",
33012
+ family: "media-text",
33013
+ weight: "featured",
33014
+ bias: "soft"
33015
+ }),
33016
+ layoutProfile({
33017
+ variantKey: "media-copy",
33018
+ family: "media-text",
33019
+ weight: "featured",
33020
+ bias: "soft"
33021
+ })
33022
+ ]
33023
+ })),
31361
33024
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
31362
33025
  flow: bodyFlow,
31363
33026
  layoutProfiles: [
@@ -31418,9 +33081,17 @@ var init_blocks = __esm({
31418
33081
  flow: conversionFlow,
31419
33082
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
31420
33083
  })),
31421
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
33084
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
33085
+ sectionSurfaces: "supported",
33086
+ contentFrames: ["plain", "panel"],
33087
+ itemSurfaces: "supported",
33088
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
33089
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
31422
33090
  flow: bodyFlow,
31423
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
33091
+ layoutProfiles: [
33092
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
33093
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
33094
+ ]
31424
33095
  })),
31425
33096
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
31426
33097
  flow: siteChromeFlow,
@@ -31434,7 +33105,8 @@ var init_blocks = __esm({
31434
33105
  sectionSurfaces: "supported",
31435
33106
  contentFrames: ["plain", "panel"],
31436
33107
  itemSurfaces: "supported",
31437
- testimonialCardTreatments: ["default", "accent-quote"]
33108
+ testimonialCardTreatments: ["default", "accent-quote"],
33109
+ headingDecorations: ["short-center-rule"]
31438
33110
  }), defineBlockDesignMetadata({
31439
33111
  flow: proofFlow,
31440
33112
  layoutProfiles: [
@@ -31460,6 +33132,22 @@ var init_blocks = __esm({
31460
33132
  flow: offeringsFlow,
31461
33133
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
31462
33134
  })),
33135
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
33136
+ sectionSurfaces: "supported",
33137
+ contentFrames: ["plain", "panel"],
33138
+ itemSurfaces: "supported",
33139
+ headingDecorations: ["short-center-rule"]
33140
+ }), defineBlockDesignMetadata({
33141
+ flow: offeringsFlow,
33142
+ layoutProfiles: [
33143
+ layoutProfile({
33144
+ variantKey: "cards",
33145
+ family: "grid",
33146
+ weight: "standard",
33147
+ bias: "soft"
33148
+ })
33149
+ ]
33150
+ })),
31463
33151
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
31464
33152
  flow: mediaFlow,
31465
33153
  layoutProfiles: [