@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
@@ -6614,6 +6614,7 @@ var ALLOWED_TRANSFORM_IDS = [
6614
6614
  "layout.headerRootClass",
6615
6615
  "layout.footerRootClass",
6616
6616
  "layout.headerRootStyle",
6617
+ "layout.headerSectionBackground",
6617
6618
  "layout.footerRootStyle",
6618
6619
  // UI (ui.ts)
6619
6620
  "ui.headerNavLinkClass",
@@ -7562,6 +7563,47 @@ var eyebrowTreatmentValues = [
7562
7563
  "pill-bounce",
7563
7564
  "accent-pill-bounce"
7564
7565
  ];
7566
+ var visibleHeadingDecorationFamilyValues = [
7567
+ "organic-squiggle",
7568
+ "short-center-rule"
7569
+ ];
7570
+ var visibleHeadingDecorationPlacementValues = [
7571
+ "after-heading",
7572
+ "between-heading-and-body",
7573
+ "under-centered-heading"
7574
+ ];
7575
+ var headingDecorationOverrideValues = [
7576
+ "site-default",
7577
+ "on",
7578
+ "off"
7579
+ ];
7580
+ var headingDecorationColorTokenValues = [
7581
+ "text",
7582
+ "primary",
7583
+ "secondary",
7584
+ "accent",
7585
+ "border",
7586
+ "muted"
7587
+ ];
7588
+ var accordionIconSetValues = [
7589
+ "plus",
7590
+ "chevron",
7591
+ "caret",
7592
+ "minimal-cross"
7593
+ ];
7594
+ var accordionIconColorTokenValues = [
7595
+ "text",
7596
+ "muted",
7597
+ "primary",
7598
+ "secondary",
7599
+ "accent",
7600
+ "current"
7601
+ ];
7602
+ var accordionIconMotionValues = [
7603
+ "none",
7604
+ "rotate",
7605
+ "swap"
7606
+ ];
7565
7607
  function defineBlockDesignCapability(capability) {
7566
7608
  return {
7567
7609
  ...capability,
@@ -7571,7 +7613,9 @@ function defineBlockDesignCapability(capability) {
7571
7613
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7572
7614
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7573
7615
  tileTreatments: capability.tileTreatments ?? ["default"],
7574
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7616
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7617
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7618
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
7575
7619
  };
7576
7620
  }
7577
7621
 
@@ -7762,6 +7806,25 @@ var blockAppearancePresets = [
7762
7806
  emphasis: "high"
7763
7807
  }
7764
7808
  }),
7809
+ defineBlockAppearancePreset({
7810
+ kind: "block-design",
7811
+ id: "intro-soft-earth-statement",
7812
+ target: "intro",
7813
+ label: "Soft Earth intro statement",
7814
+ blockKinds: ["block.intro"],
7815
+ design: {
7816
+ sectionSurface: "base",
7817
+ contentFrame: plainFrame,
7818
+ itemSurface: "none",
7819
+ transitionAfter: "soft-fade-short",
7820
+ emphasis: "high",
7821
+ headingDecoration: {
7822
+ family: "organic-squiggle",
7823
+ placement: "after-heading",
7824
+ colorToken: "primary"
7825
+ }
7826
+ }
7827
+ }),
7765
7828
  defineBlockAppearancePreset({
7766
7829
  kind: "block-design",
7767
7830
  id: "offerings-calm-list",
@@ -7776,6 +7839,25 @@ var blockAppearancePresets = [
7776
7839
  emphasis: "medium"
7777
7840
  }
7778
7841
  }),
7842
+ defineBlockAppearancePreset({
7843
+ kind: "block-design",
7844
+ id: "feature-cards-soft-earth-offerings",
7845
+ target: "feature-cards",
7846
+ label: "Soft Earth offering cards",
7847
+ blockKinds: ["block.feature-cards"],
7848
+ design: {
7849
+ sectionSurface: "base",
7850
+ contentFrame: plainFrame,
7851
+ itemSurface: "raised",
7852
+ transitionAfter: "none",
7853
+ emphasis: "high",
7854
+ headingDecoration: {
7855
+ family: "short-center-rule",
7856
+ placement: "under-centered-heading",
7857
+ colorToken: "primary"
7858
+ }
7859
+ }
7860
+ }),
7779
7861
  defineBlockAppearancePreset({
7780
7862
  kind: "block-design",
7781
7863
  id: "events-base-calendar",
@@ -7904,6 +7986,26 @@ var blockAppearancePresets = [
7904
7986
  testimonialCardTreatment: "accent-quote"
7905
7987
  }
7906
7988
  }),
7989
+ defineBlockAppearancePreset({
7990
+ kind: "block-design",
7991
+ id: "testimonials-soft-earth-proof-band",
7992
+ target: "testimonials",
7993
+ label: "Soft Earth proof band",
7994
+ blockKinds: ["block.testimonials"],
7995
+ design: {
7996
+ sectionSurface: "brand-depth-band",
7997
+ contentFrame: plainFrame,
7998
+ itemSurface: "none",
7999
+ transitionAfter: "soft-fade-short",
8000
+ emphasis: "high",
8001
+ testimonialCardTreatment: "accent-quote",
8002
+ headingDecoration: {
8003
+ family: "short-center-rule",
8004
+ placement: "under-centered-heading",
8005
+ colorToken: "border"
8006
+ }
8007
+ }
8008
+ }),
7907
8009
  defineBlockAppearancePreset({
7908
8010
  kind: "block-design",
7909
8011
  id: "faq-base-accordion",
@@ -7932,6 +8034,25 @@ var blockAppearancePresets = [
7932
8034
  emphasis: "low"
7933
8035
  }
7934
8036
  }),
8037
+ defineBlockAppearancePreset({
8038
+ kind: "block-design",
8039
+ id: "faq-soft-earth-two-column",
8040
+ target: "faq",
8041
+ label: "Soft Earth two-column FAQ",
8042
+ blockKinds: ["block.faq"],
8043
+ design: {
8044
+ sectionSurface: "base",
8045
+ contentFrame: plainFrame,
8046
+ itemSurface: "flat",
8047
+ transitionAfter: "none",
8048
+ emphasis: "medium",
8049
+ accordionIconTreatment: {
8050
+ iconSet: "plus",
8051
+ colorToken: "primary",
8052
+ motion: "swap"
8053
+ }
8054
+ }
8055
+ }),
7935
8056
  defineBlockAppearancePreset({
7936
8057
  kind: "block-design",
7937
8058
  id: "contact-form-panel",
@@ -8617,6 +8738,97 @@ var confidentChip = defineButtonPersonality({
8617
8738
  }
8618
8739
  });
8619
8740
 
8741
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
8742
+ var earthPill = defineButtonPersonality({
8743
+ id: "earth-pill",
8744
+ name: "Earth Pill",
8745
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
8746
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
8747
+ buttonSystem: {
8748
+ global: {
8749
+ cornerStyle: "pill",
8750
+ shadow: "low",
8751
+ textTransform: "none",
8752
+ fontWeight: 500,
8753
+ borderWidth: 1,
8754
+ hoverTransform: "lift",
8755
+ hoverColor: "none",
8756
+ typography: "body",
8757
+ paddingPreset: "default"
8758
+ },
8759
+ sizes: {
8760
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
8761
+ md: { padding: "0.625rem 1.35rem" },
8762
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
8763
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
8764
+ },
8765
+ variants: [
8766
+ {
8767
+ id: "primary",
8768
+ name: "Primary",
8769
+ enabled: true,
8770
+ priority: 1,
8771
+ background: { type: "solid", colorToken: "primary" },
8772
+ textColorToken: "primaryForeground",
8773
+ borderRadius: "rounded-full",
8774
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8775
+ effects: {
8776
+ hover: [
8777
+ { effectId: "lift", options: { translateY: "-1px" } },
8778
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
8779
+ ],
8780
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8781
+ }
8782
+ },
8783
+ {
8784
+ id: "secondary",
8785
+ name: "Secondary",
8786
+ enabled: true,
8787
+ priority: 2,
8788
+ background: { type: "transparent" },
8789
+ textColorToken: "primary",
8790
+ borderRadius: "rounded-full",
8791
+ border: { widthClass: "border", colorToken: "primary" },
8792
+ effects: {
8793
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
8794
+ }
8795
+ },
8796
+ {
8797
+ id: "outline",
8798
+ name: "Outline",
8799
+ enabled: true,
8800
+ priority: 3,
8801
+ background: { type: "transparent" },
8802
+ textColorToken: "text",
8803
+ borderRadius: "rounded-full",
8804
+ border: { widthClass: "border", colorToken: "border" },
8805
+ effects: {
8806
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
8807
+ }
8808
+ },
8809
+ {
8810
+ id: "ghost",
8811
+ name: "Ghost",
8812
+ enabled: true,
8813
+ priority: 3,
8814
+ background: { type: "transparent" },
8815
+ textColorToken: "primary",
8816
+ borderRadius: "rounded-full",
8817
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8818
+ sizes: {
8819
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
8820
+ md: { padding: "0.375rem 0" },
8821
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
8822
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
8823
+ },
8824
+ effects: {
8825
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
8826
+ }
8827
+ }
8828
+ ]
8829
+ }
8830
+ });
8831
+
8620
8832
  // ../theme-core/src/buttons/personalities/editorial-link.ts
8621
8833
  var editorialLink = defineButtonPersonality({
8622
8834
  id: "editorial-link",
@@ -9075,6 +9287,7 @@ var softPill = defineButtonPersonality({
9075
9287
  // ../theme-core/src/buttons/personalities/index.ts
9076
9288
  var buttonPersonalities = [
9077
9289
  softPill,
9290
+ earthPill,
9078
9291
  confidentChip,
9079
9292
  editorialLink,
9080
9293
  pebble,
@@ -9750,12 +9963,36 @@ var boxBackgroundSchema = z21.object({
9750
9963
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
9751
9964
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
9752
9965
  });
9966
+ var noHeadingDecorationSchema = z21.object({
9967
+ family: z21.literal("none"),
9968
+ placement: z21.literal("none")
9969
+ });
9970
+ var visibleHeadingDecorationSchema = z21.object({
9971
+ family: z21.enum(visibleHeadingDecorationFamilyValues),
9972
+ placement: z21.enum(visibleHeadingDecorationPlacementValues),
9973
+ colorToken: z21.enum(headingDecorationColorTokenValues).optional()
9974
+ });
9975
+ var headingDecorationSchema = z21.union([
9976
+ noHeadingDecorationSchema,
9977
+ visibleHeadingDecorationSchema
9978
+ ]);
9979
+ var accordionIconTreatmentSchema = z21.object({
9980
+ iconSet: z21.enum(accordionIconSetValues),
9981
+ colorToken: z21.enum(accordionIconColorTokenValues),
9982
+ openColorToken: z21.enum(accordionIconColorTokenValues).optional(),
9983
+ motion: z21.enum(accordionIconMotionValues)
9984
+ });
9753
9985
  var sectionStylesOverrideSchema = z21.object({
9754
9986
  background: boxBackgroundSchema.nullable().optional(),
9755
9987
  spacing: semanticSpacingSchema.nullable().optional(),
9756
9988
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
9757
9989
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
9758
- eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional()
9990
+ eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
9991
+ headingDecoration: headingDecorationSchema.nullable().optional(),
9992
+ // Author-level override consumed by later block/editor rendering phases.
9993
+ // Keeping it in section styles lets existing block save APIs persist it.
9994
+ headingDecorationOverride: z21.enum(headingDecorationOverrideValues).nullable().optional(),
9995
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
9759
9996
  });
9760
9997
  var containerStylesOverrideSchema = z21.object({
9761
9998
  background: boxBackgroundSchema.nullable().optional(),
@@ -10463,6 +10700,28 @@ var warmNeutralCream = definePaletteVariant({
10463
10700
  { name: "border", hex: "#e0d2b8" }
10464
10701
  ]
10465
10702
  });
10703
+ var warmNeutralSoftEarth = definePaletteVariant({
10704
+ id: "warm-neutral-soft-earth",
10705
+ name: "Warm Neutral \u2014 Soft Earth",
10706
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
10707
+ tags: { tone: "classic", energy: "calm", era: "organic" },
10708
+ mode: "light",
10709
+ colors: [
10710
+ { name: "primary", hex: "#a8573d" },
10711
+ { name: "secondary", hex: "#72765c" },
10712
+ { name: "accent", hex: "#c87557" },
10713
+ { name: "success", hex: "#687854" },
10714
+ { name: "warning", hex: "#b7863e" },
10715
+ { name: "destructive", hex: "#a54b3c" },
10716
+ { name: "background", hex: "#fbf6eb" },
10717
+ { name: "surface", hex: "#fffdf7" },
10718
+ { name: "surfaceAlt", hex: "#f0e4d3" },
10719
+ { name: "muted", hex: "#eadbc6" },
10720
+ { name: "text", hex: "#30281f" },
10721
+ { name: "primaryForeground", hex: "#fffaf3" },
10722
+ { name: "border", hex: "#d9c8b2" }
10723
+ ]
10724
+ });
10466
10725
  var warmNeutralForest = definePaletteVariant({
10467
10726
  id: "warm-neutral-forest",
10468
10727
  name: "Warm Neutral \u2014 Forest",
@@ -10496,6 +10755,7 @@ var paletteVariants = [
10496
10755
  // Warm-neutral family
10497
10756
  warmNeutralClay,
10498
10757
  warmNeutralCream,
10758
+ warmNeutralSoftEarth,
10499
10759
  warmNeutralForest,
10500
10760
  // High-contrast family
10501
10761
  highContrastInk,
@@ -10514,6 +10774,12 @@ var paletteVariantsById = new Map(
10514
10774
  function asHeaderLookId(value) {
10515
10775
  return value;
10516
10776
  }
10777
+ function asHeaderLayoutId(value) {
10778
+ return value;
10779
+ }
10780
+ function asHeaderStyleId(value) {
10781
+ return value;
10782
+ }
10517
10783
  function baseHeader(theme) {
10518
10784
  const {
10519
10785
  navLinkStyle: _navLinkStyle,
@@ -10532,6 +10798,309 @@ function baseHeader(theme) {
10532
10798
  navContainer: { type: "none", tint: null, opacity: 0.15 }
10533
10799
  };
10534
10800
  }
10801
+ var headerLayoutCatalog = [
10802
+ {
10803
+ id: asHeaderLayoutId("classic"),
10804
+ label: "Classic",
10805
+ description: "Logo and navigation in one practical horizontal row.",
10806
+ structure: "inline-classic",
10807
+ variant: "classic",
10808
+ defaultPositioning: "sticky",
10809
+ shrinkOnScroll: false
10810
+ },
10811
+ {
10812
+ id: asHeaderLayoutId("centered"),
10813
+ label: "Centered",
10814
+ description: "Logo centered above a balanced navigation row.",
10815
+ structure: "centered-stack",
10816
+ variant: "centered",
10817
+ defaultPositioning: "static",
10818
+ shrinkOnScroll: false,
10819
+ maxRecommendedNavItems: 5,
10820
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
10821
+ },
10822
+ {
10823
+ id: asHeaderLayoutId("editorial"),
10824
+ label: "Editorial",
10825
+ description: "A composed, magazine-like stacked header treatment.",
10826
+ structure: "editorial-stack",
10827
+ variant: "editorial",
10828
+ defaultPositioning: "static",
10829
+ shrinkOnScroll: false,
10830
+ maxRecommendedNavItems: 6
10831
+ },
10832
+ {
10833
+ id: asHeaderLayoutId("floating"),
10834
+ label: "Floating",
10835
+ description: "Detached header chrome that sits over the opening section.",
10836
+ structure: "floating-shell",
10837
+ variant: "floating",
10838
+ defaultPositioning: "fixed",
10839
+ shrinkOnScroll: true,
10840
+ maxRecommendedNavItems: 5,
10841
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
10842
+ }
10843
+ ];
10844
+ function supportedLayouts(ids) {
10845
+ return ids.map(asHeaderLayoutId);
10846
+ }
10847
+ var headerStyleCatalog = [
10848
+ {
10849
+ id: asHeaderStyleId("minimal"),
10850
+ label: "Minimal",
10851
+ description: "Quiet surface with simple color-change navigation.",
10852
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10853
+ navInteraction: "color-change",
10854
+ surface: "neutral"
10855
+ },
10856
+ {
10857
+ id: asHeaderStyleId("fine-line"),
10858
+ label: "Fine Line",
10859
+ description: "Light surface with a crisp lower rule and underline hover.",
10860
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10861
+ navInteraction: "underline-grow",
10862
+ surface: "bordered"
10863
+ },
10864
+ {
10865
+ id: asHeaderStyleId("soft-bar"),
10866
+ label: "Soft Bar",
10867
+ description: "Soft tinted surface with gentle pill hover states.",
10868
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10869
+ navInteraction: "pill-background",
10870
+ surface: "soft"
10871
+ },
10872
+ {
10873
+ id: asHeaderStyleId("pill-nav"),
10874
+ label: "Pill Nav",
10875
+ description: "A calm pill navigation rail over a neutral header.",
10876
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10877
+ navInteraction: "pill-background",
10878
+ surface: "soft"
10879
+ },
10880
+ {
10881
+ id: asHeaderStyleId("brand-bar"),
10882
+ label: "Brand Bar",
10883
+ description: "Solid brand surface with high-contrast navigation.",
10884
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10885
+ navInteraction: "color-change",
10886
+ surface: "brand-solid"
10887
+ },
10888
+ {
10889
+ id: asHeaderStyleId("brand-underline"),
10890
+ label: "Brand Underline",
10891
+ description: "Brand surface with underline-grow navigation.",
10892
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
10893
+ navInteraction: "underline-grow",
10894
+ surface: "brand-solid"
10895
+ },
10896
+ {
10897
+ id: asHeaderStyleId("brand-pill"),
10898
+ label: "Brand Pill",
10899
+ description: "Solid brand surface with rounded active and hover states.",
10900
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
10901
+ navInteraction: "pill-background",
10902
+ surface: "brand-solid"
10903
+ },
10904
+ {
10905
+ id: asHeaderStyleId("editorial-line"),
10906
+ label: "Editorial Line",
10907
+ description: "Typographic logo treatment with understated underline navigation.",
10908
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10909
+ navInteraction: "underline-grow",
10910
+ surface: "bordered"
10911
+ },
10912
+ {
10913
+ id: asHeaderStyleId("flat-tabs"),
10914
+ label: "Flat Tabs",
10915
+ description: "Flat block hover and active states with a Swiss utility feel.",
10916
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10917
+ navInteraction: "flat-block",
10918
+ surface: "bordered"
10919
+ },
10920
+ {
10921
+ id: asHeaderStyleId("glass"),
10922
+ label: "Glass",
10923
+ description: "Floating translucent chrome with frosted navigation backing.",
10924
+ supportedLayoutIds: supportedLayouts(["floating"]),
10925
+ navInteraction: "glass-backed",
10926
+ surface: "floating",
10927
+ requiresFloatingLayout: true
10928
+ },
10929
+ {
10930
+ id: asHeaderStyleId("minimal-surface"),
10931
+ label: "Minimal Surface",
10932
+ description: "Floating chrome with a restrained translucent surface.",
10933
+ supportedLayoutIds: supportedLayouts(["floating"]),
10934
+ navInteraction: "color-change",
10935
+ surface: "floating",
10936
+ requiresFloatingLayout: true
10937
+ },
10938
+ {
10939
+ id: asHeaderStyleId("soft-shell"),
10940
+ label: "Soft Shell",
10941
+ description: "Floating rounded shell with soft pill navigation states.",
10942
+ supportedLayoutIds: supportedLayouts(["floating"]),
10943
+ navInteraction: "pill-background",
10944
+ surface: "floating",
10945
+ requiresFloatingLayout: true
10946
+ }
10947
+ ];
10948
+ var headerLayoutsById = new Map(
10949
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
10950
+ );
10951
+ var headerStylesById = new Map(
10952
+ headerStyleCatalog.map((style) => [style.id, style])
10953
+ );
10954
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
10955
+ [
10956
+ asHeaderLayoutId("classic"),
10957
+ headerStyleRepairChain([
10958
+ "minimal",
10959
+ "fine-line",
10960
+ "soft-bar",
10961
+ "pill-nav",
10962
+ "brand-bar",
10963
+ "brand-underline",
10964
+ "brand-pill",
10965
+ "editorial-line",
10966
+ "flat-tabs"
10967
+ ])
10968
+ ],
10969
+ [
10970
+ asHeaderLayoutId("centered"),
10971
+ headerStyleRepairChain([
10972
+ "minimal",
10973
+ "fine-line",
10974
+ "soft-bar",
10975
+ "pill-nav",
10976
+ "brand-bar",
10977
+ "brand-pill",
10978
+ "editorial-line",
10979
+ "flat-tabs"
10980
+ ])
10981
+ ],
10982
+ [
10983
+ asHeaderLayoutId("editorial"),
10984
+ headerStyleRepairChain([
10985
+ "minimal",
10986
+ "fine-line",
10987
+ "soft-bar",
10988
+ "brand-bar",
10989
+ "brand-underline",
10990
+ "editorial-line",
10991
+ "flat-tabs"
10992
+ ])
10993
+ ],
10994
+ [
10995
+ asHeaderLayoutId("floating"),
10996
+ headerStyleRepairChain([
10997
+ "glass",
10998
+ "minimal-surface",
10999
+ "soft-shell",
11000
+ "brand-pill"
11001
+ ])
11002
+ ]
11003
+ ]);
11004
+ function headerStyleRepairChain(values) {
11005
+ return values.map(asHeaderStyleId);
11006
+ }
11007
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map([
11008
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
11009
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
11010
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
11011
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
11012
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
11013
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
11014
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
11015
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
11016
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
11017
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
11018
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
11019
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
11020
+ ]);
11021
+ var legacyHeaderLookAliases = [
11022
+ {
11023
+ lookId: asHeaderLookId("clean-base"),
11024
+ selection: {
11025
+ layoutId: asHeaderLayoutId("classic"),
11026
+ styleId: asHeaderStyleId("minimal")
11027
+ }
11028
+ },
11029
+ {
11030
+ lookId: asHeaderLookId("brand-solid"),
11031
+ selection: {
11032
+ layoutId: asHeaderLayoutId("classic"),
11033
+ styleId: asHeaderStyleId("brand-bar")
11034
+ }
11035
+ },
11036
+ {
11037
+ lookId: asHeaderLookId("editorial-line"),
11038
+ selection: {
11039
+ layoutId: asHeaderLayoutId("editorial"),
11040
+ styleId: asHeaderStyleId("editorial-line")
11041
+ }
11042
+ },
11043
+ {
11044
+ lookId: asHeaderLookId("centered-calm"),
11045
+ selection: {
11046
+ layoutId: asHeaderLayoutId("centered"),
11047
+ styleId: asHeaderStyleId("minimal")
11048
+ }
11049
+ },
11050
+ {
11051
+ lookId: asHeaderLookId("practical-utility"),
11052
+ selection: {
11053
+ layoutId: asHeaderLayoutId("classic"),
11054
+ styleId: asHeaderStyleId("flat-tabs")
11055
+ }
11056
+ },
11057
+ {
11058
+ lookId: asHeaderLookId("minimal-transparent"),
11059
+ selection: {
11060
+ layoutId: asHeaderLayoutId("classic"),
11061
+ styleId: asHeaderStyleId("minimal")
11062
+ }
11063
+ },
11064
+ {
11065
+ lookId: asHeaderLookId("transparent-overlay"),
11066
+ selection: {
11067
+ layoutId: asHeaderLayoutId("floating"),
11068
+ styleId: asHeaderStyleId("glass")
11069
+ }
11070
+ },
11071
+ {
11072
+ lookId: asHeaderLookId("floating-glass"),
11073
+ selection: {
11074
+ layoutId: asHeaderLayoutId("floating"),
11075
+ styleId: asHeaderStyleId("glass")
11076
+ }
11077
+ }
11078
+ ];
11079
+ var legacyHeaderLookAliasesById = new Map(
11080
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
11081
+ );
11082
+ function getHeaderStyle(id) {
11083
+ return headerStylesById.get(id) ?? null;
11084
+ }
11085
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
11086
+ return style.supportedLayoutIds.includes(layoutId);
11087
+ }
11088
+ function getHeaderStyleOrThrow(id) {
11089
+ const style = getHeaderStyle(id);
11090
+ if (!style) {
11091
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
11092
+ }
11093
+ return style;
11094
+ }
11095
+ function resolveLegacyHeaderLookAlias(lookId) {
11096
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
11097
+ }
11098
+ function getCompatibleHeaderStyleIds(layoutId) {
11099
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
11100
+ const style = getHeaderStyleOrThrow(styleId);
11101
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
11102
+ });
11103
+ }
10535
11104
  function solidBrandHeader(theme) {
10536
11105
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
10537
11106
  return {
@@ -10768,6 +11337,11 @@ var headerLookCatalog = [
10768
11337
  label: "Clean base",
10769
11338
  visualTreatment: "solid-neutral",
10770
11339
  layoutBehavior: "sticky",
11340
+ configuration: {
11341
+ structure: "inline-classic",
11342
+ treatment: "solid-neutral",
11343
+ behavior: "sticky"
11344
+ },
10771
11345
  openingRequirement: "none",
10772
11346
  compile: cleanBaseHeader
10773
11347
  },
@@ -10776,6 +11350,11 @@ var headerLookCatalog = [
10776
11350
  label: "Brand solid",
10777
11351
  visualTreatment: "solid-brand",
10778
11352
  layoutBehavior: "sticky-shrink",
11353
+ configuration: {
11354
+ structure: "inline-classic",
11355
+ treatment: "solid-brand",
11356
+ behavior: "sticky-shrink"
11357
+ },
10779
11358
  openingRequirement: "none",
10780
11359
  compile: solidBrandHeader
10781
11360
  },
@@ -10784,6 +11363,11 @@ var headerLookCatalog = [
10784
11363
  label: "Editorial line",
10785
11364
  visualTreatment: "light-editorial",
10786
11365
  layoutBehavior: "sticky",
11366
+ configuration: {
11367
+ structure: "editorial-stack",
11368
+ treatment: "light-editorial",
11369
+ behavior: "sticky"
11370
+ },
10787
11371
  openingRequirement: "none",
10788
11372
  maxRecommendedNavItems: 6,
10789
11373
  compile: editorialLineHeader
@@ -10793,6 +11377,11 @@ var headerLookCatalog = [
10793
11377
  label: "Centered calm",
10794
11378
  visualTreatment: "light-editorial",
10795
11379
  layoutBehavior: "normal-flow",
11380
+ configuration: {
11381
+ structure: "centered-stack",
11382
+ treatment: "light-editorial",
11383
+ behavior: "normal-flow"
11384
+ },
10796
11385
  openingRequirement: "none",
10797
11386
  maxRecommendedNavItems: 5,
10798
11387
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -10803,6 +11392,11 @@ var headerLookCatalog = [
10803
11392
  label: "Practical utility",
10804
11393
  visualTreatment: "solid-neutral",
10805
11394
  layoutBehavior: "sticky-shrink",
11395
+ configuration: {
11396
+ structure: "inline-classic",
11397
+ treatment: "solid-neutral",
11398
+ behavior: "sticky-shrink"
11399
+ },
10806
11400
  openingRequirement: "none",
10807
11401
  requiresProminentCta: true,
10808
11402
  compile: practicalUtilityHeader
@@ -10812,6 +11406,11 @@ var headerLookCatalog = [
10812
11406
  label: "Minimal transparent",
10813
11407
  visualTreatment: "minimal-transparent",
10814
11408
  layoutBehavior: "normal-flow",
11409
+ configuration: {
11410
+ structure: "inline-classic",
11411
+ treatment: "minimal-transparent",
11412
+ behavior: "normal-flow"
11413
+ },
10815
11414
  openingRequirement: "reserved-space-ok",
10816
11415
  compile: minimalTransparentHeader
10817
11416
  },
@@ -10820,6 +11419,11 @@ var headerLookCatalog = [
10820
11419
  label: "Transparent overlay",
10821
11420
  visualTreatment: "transparent-overlay",
10822
11421
  layoutBehavior: "fixed-overlay",
11422
+ configuration: {
11423
+ structure: "inline-classic",
11424
+ treatment: "transparent-overlay",
11425
+ behavior: "fixed-overlay"
11426
+ },
10823
11427
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10824
11428
  maxRecommendedNavItems: 5,
10825
11429
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10830,6 +11434,11 @@ var headerLookCatalog = [
10830
11434
  label: "Floating glass",
10831
11435
  visualTreatment: "floating-glass",
10832
11436
  layoutBehavior: "fixed-floating",
11437
+ configuration: {
11438
+ structure: "floating-shell",
11439
+ treatment: "floating-glass",
11440
+ behavior: "fixed-floating"
11441
+ },
10833
11442
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10834
11443
  maxRecommendedNavItems: 5,
10835
11444
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10837,9 +11446,17 @@ var headerLookCatalog = [
10837
11446
  }
10838
11447
  ];
10839
11448
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
11449
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
11450
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
11451
+ var allowedHeaderConfigurationKeys = new Set(
11452
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
11453
+ );
10840
11454
  var headerLooksById = new Map(
10841
11455
  headerLookCatalog.map((look) => [look.id, look])
10842
11456
  );
11457
+ function headerConfigurationKey(configuration) {
11458
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
11459
+ }
10843
11460
 
10844
11461
  // ../theme-core/src/site-styles/footerLooks.ts
10845
11462
  function asFooterLookId(value) {
@@ -10972,6 +11589,264 @@ var advancedDesignOptionCatalog = {
10972
11589
  detachedCustom: true
10973
11590
  };
10974
11591
 
11592
+ // ../theme-core/src/site-styles/typographyPresets.ts
11593
+ var bodyReadablePolicy = {
11594
+ recommendedCategories: ["sans-serif", "serif"],
11595
+ allowedCategories: ["sans-serif", "serif"],
11596
+ requiresItalicForBody: true,
11597
+ requiresBoldForBody: true
11598
+ };
11599
+ var headingFlexiblePolicy = {
11600
+ recommendedCategories: ["sans-serif", "serif", "display"],
11601
+ allowedCategories: ["sans-serif", "serif", "display"]
11602
+ };
11603
+ var displayHeadingPolicy = {
11604
+ recommendedCategories: ["display", "sans-serif", "serif"],
11605
+ allowedCategories: ["display", "sans-serif", "serif"]
11606
+ };
11607
+ function asTypographyPresetId(value) {
11608
+ if (!value.startsWith("typography-preset:")) {
11609
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
11610
+ }
11611
+ return value;
11612
+ }
11613
+ function defineTypographyPreset(preset2) {
11614
+ return {
11615
+ ...preset2,
11616
+ id: asTypographyPresetId(preset2.id)
11617
+ };
11618
+ }
11619
+ var modernSansTypography = {
11620
+ body: {
11621
+ family: "Inter, system-ui, sans-serif",
11622
+ size: "md",
11623
+ weight: "regular",
11624
+ lineHeight: "relaxed",
11625
+ letterSpacing: "normal"
11626
+ },
11627
+ headings: {
11628
+ default: {
11629
+ family: "Inter, system-ui, sans-serif",
11630
+ weight: "semibold",
11631
+ lineHeight: "normal",
11632
+ letterSpacing: "tight",
11633
+ italic: null,
11634
+ case: null
11635
+ },
11636
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11637
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11638
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11639
+ },
11640
+ scale: "balanced"
11641
+ };
11642
+ var warmRoundedTypography = {
11643
+ body: {
11644
+ family: "Nunito Sans, system-ui, sans-serif",
11645
+ size: "lg",
11646
+ weight: "regular",
11647
+ lineHeight: "relaxed",
11648
+ letterSpacing: "normal"
11649
+ },
11650
+ headings: {
11651
+ default: {
11652
+ family: "Nunito Sans, system-ui, sans-serif",
11653
+ weight: "bold",
11654
+ lineHeight: "normal",
11655
+ letterSpacing: "normal",
11656
+ italic: null,
11657
+ case: null
11658
+ },
11659
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11660
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11661
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11662
+ },
11663
+ scale: "balanced"
11664
+ };
11665
+ var editorialSerifTypography = {
11666
+ body: {
11667
+ family: "Lora, Georgia, serif",
11668
+ size: "lg",
11669
+ weight: "regular",
11670
+ lineHeight: "loose",
11671
+ letterSpacing: "normal"
11672
+ },
11673
+ headings: {
11674
+ default: {
11675
+ family: "Playfair Display, Georgia, serif",
11676
+ weight: "semibold",
11677
+ lineHeight: "normal",
11678
+ letterSpacing: "tight",
11679
+ italic: null,
11680
+ case: null
11681
+ },
11682
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11683
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11684
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
11685
+ },
11686
+ scale: "spacious"
11687
+ };
11688
+ var classicSerifTypography = {
11689
+ body: {
11690
+ family: "Libre Baskerville, Georgia, serif",
11691
+ size: "md",
11692
+ weight: "regular",
11693
+ lineHeight: "relaxed",
11694
+ letterSpacing: "normal"
11695
+ },
11696
+ headings: {
11697
+ default: {
11698
+ family: "Cormorant Garamond, Georgia, serif",
11699
+ weight: "semibold",
11700
+ lineHeight: "normal",
11701
+ letterSpacing: "normal",
11702
+ italic: null,
11703
+ case: null
11704
+ },
11705
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11706
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11707
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11708
+ },
11709
+ scale: "balanced"
11710
+ };
11711
+ var luxeContrastTypography = {
11712
+ body: {
11713
+ family: "Manrope, system-ui, sans-serif",
11714
+ size: "md",
11715
+ weight: "regular",
11716
+ lineHeight: "relaxed",
11717
+ letterSpacing: "normal"
11718
+ },
11719
+ headings: {
11720
+ default: {
11721
+ family: "Cormorant Garamond, Georgia, serif",
11722
+ weight: "semibold",
11723
+ lineHeight: "normal",
11724
+ letterSpacing: "tight",
11725
+ italic: null,
11726
+ case: null
11727
+ },
11728
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11729
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11730
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11731
+ },
11732
+ scale: "spacious"
11733
+ };
11734
+ var boldDisplayTypography = {
11735
+ body: {
11736
+ family: "Manrope, system-ui, sans-serif",
11737
+ size: "lg",
11738
+ weight: "regular",
11739
+ lineHeight: "relaxed",
11740
+ letterSpacing: "normal"
11741
+ },
11742
+ headings: {
11743
+ default: {
11744
+ family: '"TAN - PEARL", sans-serif',
11745
+ weight: "bold",
11746
+ lineHeight: "normal",
11747
+ letterSpacing: "tight",
11748
+ colorToken: "primary",
11749
+ italic: null,
11750
+ case: null
11751
+ },
11752
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11753
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11754
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11755
+ },
11756
+ scale: "balanced"
11757
+ };
11758
+ var typographyPresets = [
11759
+ defineTypographyPreset({
11760
+ id: "typography-preset:modern-sans",
11761
+ name: "Modern Sans",
11762
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
11763
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
11764
+ recommendedFonts: {
11765
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
11766
+ heading: ["Inter", "Manrope", "Source Sans 3"]
11767
+ },
11768
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11769
+ typography: modernSansTypography
11770
+ }),
11771
+ defineTypographyPreset({
11772
+ id: "typography-preset:warm-rounded",
11773
+ name: "Warm Rounded",
11774
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
11775
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
11776
+ recommendedFonts: {
11777
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
11778
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
11779
+ },
11780
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11781
+ typography: warmRoundedTypography
11782
+ }),
11783
+ defineTypographyPreset({
11784
+ id: "typography-preset:editorial-serif",
11785
+ name: "Editorial Serif",
11786
+ description: "Story-led type with warm reading rhythm and expressive headings.",
11787
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
11788
+ recommendedFonts: {
11789
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
11790
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
11791
+ },
11792
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11793
+ typography: editorialSerifTypography
11794
+ }),
11795
+ defineTypographyPreset({
11796
+ id: "typography-preset:classic-serif",
11797
+ name: "Classic Serif",
11798
+ description: "Measured, polished type for premium and established offers.",
11799
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
11800
+ recommendedFonts: {
11801
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
11802
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
11803
+ },
11804
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11805
+ typography: classicSerifTypography
11806
+ }),
11807
+ defineTypographyPreset({
11808
+ id: "typography-preset:luxe-contrast",
11809
+ name: "Luxe Contrast",
11810
+ description: "A restrained sans body paired with elegant high-contrast headings.",
11811
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
11812
+ recommendedFonts: {
11813
+ body: ["Manrope", "Inter", "Source Sans 3"],
11814
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
11815
+ },
11816
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11817
+ typography: luxeContrastTypography
11818
+ }),
11819
+ defineTypographyPreset({
11820
+ id: "typography-preset:bold-display",
11821
+ name: "Bold Display",
11822
+ description: "Punchy display headings with readable sans body copy for branded launches.",
11823
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
11824
+ recommendedFonts: {
11825
+ body: ["Manrope", "Inter", "Space Grotesk"],
11826
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
11827
+ },
11828
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11829
+ typography: boldDisplayTypography,
11830
+ heroTypography: {
11831
+ headlineSize: "6xl",
11832
+ headlineLineHeight: "tight",
11833
+ subheadlineSize: "editorial",
11834
+ subheadlineLineHeight: "normal",
11835
+ microHeadlineSize: "6xl",
11836
+ microHeadlineLineHeight: "tight",
11837
+ microSubheadlineSize: "xl",
11838
+ microSubheadlineLineHeight: "normal",
11839
+ responsive: {
11840
+ tablet: { headlineSize: "5xl" },
11841
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
11842
+ }
11843
+ }
11844
+ })
11845
+ ];
11846
+ var typographyPresetsById = new Map(
11847
+ typographyPresets.map((preset2) => [preset2.id, preset2])
11848
+ );
11849
+
10975
11850
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
10976
11851
  var curatedSiteStyleIdValues = [
10977
11852
  "site-style:calm-studio",
@@ -10984,6 +11859,7 @@ var curatedSiteStyleIdValues = [
10984
11859
  "site-style:personal-retreat-journal",
10985
11860
  "site-style:tactile-workshop",
10986
11861
  "site-style:modern-wellness",
11862
+ "site-style:soft-earth",
10987
11863
  "site-style:bold-launch",
10988
11864
  "site-style:south-west-twerk-school"
10989
11865
  ];
@@ -11060,6 +11936,15 @@ function uniqueContentFrameKinds() {
11060
11936
  }
11061
11937
  var generatedContentFrameKinds = uniqueContentFrameKinds();
11062
11938
  function defineCuratedSiteStyle(input) {
11939
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
11940
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
11941
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
11942
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
11943
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
11944
+ throw new Error(
11945
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
11946
+ );
11947
+ }
11063
11948
  return {
11064
11949
  id: asSiteStyleId(input.id),
11065
11950
  name: input.name,
@@ -11080,11 +11965,23 @@ function defineCuratedSiteStyle(input) {
11080
11965
  },
11081
11966
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
11082
11967
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
11083
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
11968
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
11969
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
11970
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
11971
+ } : inferredHeaderCuration.defaultHeaderSelection,
11972
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
11973
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
11974
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
11975
+ layoutId: asHeaderLayoutId(selection.layoutId),
11976
+ styleId: asHeaderStyleId(selection.styleId)
11977
+ })),
11978
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
11084
11979
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
11085
11980
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
11086
11981
  buttonPersonalityChoices: input.buttonPersonalityChoices,
11087
- paletteVariantChoices: input.paletteVariantChoices
11982
+ paletteVariantChoices: input.paletteVariantChoices,
11983
+ typographyPresetChoices,
11984
+ defaultTypographyPresetId
11088
11985
  };
11089
11986
  }
11090
11987
  function buttonChoice(id, note) {
@@ -11093,6 +11990,88 @@ function buttonChoice(id, note) {
11093
11990
  function paletteChoice(id, note) {
11094
11991
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
11095
11992
  }
11993
+ function headerLayoutChoice(id, note) {
11994
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
11995
+ }
11996
+ function headerStyleChoice(id, note) {
11997
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
11998
+ }
11999
+ function headerLayoutRecordKey(id) {
12000
+ return id;
12001
+ }
12002
+ function uniqueHeaderLayoutChoices(choices) {
12003
+ const seen = /* @__PURE__ */ new Set();
12004
+ const unique = choices.filter((choice) => {
12005
+ if (seen.has(choice.id)) return false;
12006
+ seen.add(choice.id);
12007
+ return true;
12008
+ });
12009
+ const first = unique[0];
12010
+ if (!first) {
12011
+ throw new Error("Expected at least one curated header layout choice.");
12012
+ }
12013
+ return [first, ...unique.slice(1)];
12014
+ }
12015
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12016
+ const first = choices[0] ?? {
12017
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
12018
+ };
12019
+ return [first, ...choices.slice(1)];
12020
+ }
12021
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
12022
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
12023
+ const defaultHeaderSelection = selections[0] ?? {
12024
+ layoutId: asHeaderLayoutId("classic"),
12025
+ styleId: asHeaderStyleId("minimal")
12026
+ };
12027
+ const layoutChoices = uniqueHeaderLayoutChoices(
12028
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
12029
+ );
12030
+ const stylesByLayout = {};
12031
+ for (const layoutChoice of layoutChoices) {
12032
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12033
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
12034
+ styleChoices,
12035
+ layoutChoice.id
12036
+ );
12037
+ }
12038
+ return {
12039
+ defaultHeaderSelection,
12040
+ recommendedHeaderLayoutChoices: layoutChoices,
12041
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
12042
+ };
12043
+ }
12044
+ function typographyChoice(id, note) {
12045
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
12046
+ }
12047
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
12048
+ switch (recipe) {
12049
+ case "clean-sans":
12050
+ return [
12051
+ typographyChoice("typography-preset:modern-sans"),
12052
+ typographyChoice("typography-preset:luxe-contrast"),
12053
+ typographyChoice("typography-preset:bold-display")
12054
+ ];
12055
+ case "friendly-sans":
12056
+ return [
12057
+ typographyChoice("typography-preset:warm-rounded"),
12058
+ typographyChoice("typography-preset:modern-sans"),
12059
+ typographyChoice("typography-preset:editorial-serif")
12060
+ ];
12061
+ case "serif-editorial":
12062
+ return [
12063
+ typographyChoice("typography-preset:editorial-serif"),
12064
+ typographyChoice("typography-preset:classic-serif"),
12065
+ typographyChoice("typography-preset:warm-rounded")
12066
+ ];
12067
+ case "classic-serif":
12068
+ return [
12069
+ typographyChoice("typography-preset:classic-serif"),
12070
+ typographyChoice("typography-preset:luxe-contrast"),
12071
+ typographyChoice("typography-preset:editorial-serif")
12072
+ ];
12073
+ }
12074
+ }
11096
12075
  var curatedSiteStyles = [
11097
12076
  defineCuratedSiteStyle({
11098
12077
  id: "site-style:calm-studio",
@@ -11418,6 +12397,102 @@ var curatedSiteStyles = [
11418
12397
  paletteChoice("warm-neutral-clay")
11419
12398
  ]
11420
12399
  }),
12400
+ defineCuratedSiteStyle({
12401
+ id: "site-style:soft-earth",
12402
+ name: "Soft Earth",
12403
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12404
+ 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.",
12405
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
12406
+ selectionKeywordRules: [
12407
+ { kind: "word", value: "meditation" },
12408
+ { kind: "word", value: "wellbeing" },
12409
+ { kind: "substring", value: "retreat" },
12410
+ { kind: "phrase", value: "yoga studio" },
12411
+ { kind: "phrase", value: "mindful movement" }
12412
+ ],
12413
+ tokenRecipes: {
12414
+ palette: "warm-neutral",
12415
+ contrast: "standard",
12416
+ radius: "soft",
12417
+ shadow: "subtle",
12418
+ typography: "serif-editorial",
12419
+ spacing: "airy",
12420
+ motion: "subtle"
12421
+ },
12422
+ compositionBudget: balancedBudget,
12423
+ themeOverrides: {
12424
+ typography: {
12425
+ body: {
12426
+ family: "Inter, system-ui, sans-serif",
12427
+ size: "md",
12428
+ weight: "regular",
12429
+ lineHeight: "relaxed",
12430
+ letterSpacing: "normal"
12431
+ },
12432
+ headings: {
12433
+ default: {
12434
+ family: '"Cormorant Garamond", Georgia, serif',
12435
+ weight: "regular",
12436
+ lineHeight: "normal",
12437
+ letterSpacing: "normal",
12438
+ colorToken: "text",
12439
+ italic: null,
12440
+ case: null
12441
+ },
12442
+ h1: {
12443
+ size: "xl",
12444
+ weight: "regular",
12445
+ lineHeight: "normal",
12446
+ letterSpacing: "normal",
12447
+ italic: null
12448
+ },
12449
+ h2: {
12450
+ size: "lg",
12451
+ weight: "regular",
12452
+ lineHeight: "normal",
12453
+ letterSpacing: "normal",
12454
+ italic: null
12455
+ },
12456
+ h3: {
12457
+ size: "md",
12458
+ weight: "regular",
12459
+ lineHeight: "normal",
12460
+ letterSpacing: "normal",
12461
+ italic: null
12462
+ }
12463
+ },
12464
+ scale: "majorThird"
12465
+ },
12466
+ bodyText: {
12467
+ intro: {
12468
+ paragraphSize: "default",
12469
+ headingSize: "editorial"
12470
+ }
12471
+ }
12472
+ },
12473
+ recommendedAppearancePresetIds: [
12474
+ "hero-brand-scrim",
12475
+ "intro-soft-earth-statement",
12476
+ "feature-cards-soft-earth-offerings",
12477
+ "testimonials-soft-earth-proof-band",
12478
+ "faq-soft-earth-two-column",
12479
+ "contact-form-panel"
12480
+ ],
12481
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
12482
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
12483
+ buttonPersonalityChoices: [
12484
+ buttonChoice("earth-pill"),
12485
+ buttonChoice("soft-pill"),
12486
+ buttonChoice("pebble"),
12487
+ buttonChoice("editorial-link")
12488
+ ],
12489
+ paletteVariantChoices: [
12490
+ paletteChoice("warm-neutral-soft-earth"),
12491
+ paletteChoice("warm-neutral-clay"),
12492
+ paletteChoice("warm-neutral-forest"),
12493
+ paletteChoice("soft-natural-sage")
12494
+ ]
12495
+ }),
11421
12496
  defineCuratedSiteStyle({
11422
12497
  id: "site-style:bold-launch",
11423
12498
  name: "Bold Launch",
@@ -11471,49 +12546,13 @@ var curatedSiteStyles = [
11471
12546
  motion: "expressive"
11472
12547
  },
11473
12548
  compositionBudget: expressiveBudget,
12549
+ typographyPresetChoices: [
12550
+ typographyChoice("typography-preset:bold-display"),
12551
+ typographyChoice("typography-preset:modern-sans"),
12552
+ typographyChoice("typography-preset:luxe-contrast")
12553
+ ],
12554
+ defaultTypographyPresetId: "typography-preset:bold-display",
11474
12555
  themeOverrides: {
11475
- typography: {
11476
- body: {
11477
- family: "Manrope, system-ui, sans-serif",
11478
- size: "lg",
11479
- weight: "regular",
11480
- lineHeight: "relaxed",
11481
- letterSpacing: "normal"
11482
- },
11483
- headings: {
11484
- default: {
11485
- family: '"TAN - PEARL", sans-serif',
11486
- weight: "bold",
11487
- lineHeight: "normal",
11488
- letterSpacing: "tight",
11489
- colorToken: "primary",
11490
- italic: null,
11491
- case: null
11492
- },
11493
- h1: {
11494
- size: "xl",
11495
- weight: "bold",
11496
- lineHeight: "normal",
11497
- letterSpacing: "tight",
11498
- italic: null
11499
- },
11500
- h2: {
11501
- size: "lg",
11502
- weight: "bold",
11503
- lineHeight: "normal",
11504
- letterSpacing: "normal",
11505
- italic: null
11506
- },
11507
- h3: {
11508
- size: "md",
11509
- weight: "bold",
11510
- lineHeight: "normal",
11511
- letterSpacing: "normal",
11512
- italic: null
11513
- }
11514
- },
11515
- scale: "balanced"
11516
- },
11517
12556
  bodyText: {
11518
12557
  intro: {
11519
12558
  paragraphSize: "editorial",
@@ -15845,8 +16884,9 @@ var faqAccordionFragment = defineFragment({
15845
16884
  },
15846
16885
  fallback: "rb-faq-item"
15847
16886
  },
15848
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
15849
- // Pass icon style from theme
16887
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
16888
+ // Legacy theme accordion style
16889
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
15850
16890
  },
15851
16891
  triggerFrom: "faqItem.question",
15852
16892
  contentFrom: "faqItem.answer"
@@ -16981,100 +18021,428 @@ var heroBlockDefinition = {
16981
18021
  manifest: heroManifest
16982
18022
  };
16983
18023
 
16984
- // ../blocks/src/system/blocks/body-text.ts
16985
- var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
16986
- var proseLayout = styledSection({
16987
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
16988
- spacing: "medium",
16989
- baseClass: ""
16990
- });
16991
- var introLayout = styledSection({
16992
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
16993
- spacing: "medium",
16994
- baseClass: ""
16995
- });
16996
- var narrowLayout = styledSection({
16997
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
16998
- spacing: "medium",
16999
- baseClass: ""
17000
- });
17001
- var bodyTextManifest = createBlockManifest({
17002
- id: "block.body-text",
17003
- title: "Body Text",
17004
- titleSource: "heading",
17005
- category: "content",
17006
- fragments: [
17007
- { fragment: bodyCopyFragment, fieldPriority: 0 }
17008
- ],
17009
- layout: proseLayout,
17010
- variants: {
17011
- prose: proseLayout,
17012
- intro: introLayout,
17013
- narrow: narrowLayout
17014
- },
17015
- defaultVariant: "prose",
17016
- variantOptions: {
17017
- prose: {
17018
- label: "Prose",
17019
- description: "Long-form rich text for pages and posts.",
17020
- icon: "Type"
17021
- },
17022
- intro: {
17023
- label: "Intro",
17024
- description: "Narrower, larger text for above-the-fold intros.",
17025
- icon: "AlignCenter"
17026
- },
17027
- narrow: {
17028
- label: "Narrow",
17029
- description: "Left-aligned lead copy with a shorter max width.",
17030
- icon: "AlignLeft"
18024
+ // ../blocks/src/system/fields/aspectRatio.ts
18025
+ var standardAspectRatioOptions = [
18026
+ { value: "auto", label: "Auto (original)" },
18027
+ { value: "16/9", label: "16:9 (Landscape)" },
18028
+ { value: "4/3", label: "4:3 (Standard)" },
18029
+ { value: "1/1", label: "1:1 (Square)" },
18030
+ { value: "3/4", label: "3:4 (Portrait)" }
18031
+ ];
18032
+ function createAspectRatioField(options = {}) {
18033
+ return {
18034
+ id: options.id ?? "aspectRatio",
18035
+ type: "select",
18036
+ label: options.label ?? "Aspect ratio",
18037
+ ...options.description ? { description: options.description } : {},
18038
+ required: false,
18039
+ defaultValue: options.defaultValue ?? "auto",
18040
+ multiple: false,
18041
+ options: [...standardAspectRatioOptions],
18042
+ ui: {
18043
+ intent: options.uiIntent ?? "display",
18044
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
17031
18045
  }
17032
- },
17033
- description: "Simple text block with optional heading and alignment controls.",
17034
- tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
17035
- icon: "Type",
17036
- styleTokens: {
17037
- spacing: "md"
17038
- }
17039
- });
17040
- var bodyTextBlockDefinition = {
17041
- manifest: bodyTextManifest
17042
- };
18046
+ };
18047
+ }
17043
18048
 
17044
- // ../blocks/src/system/blocks/blog-post.tsx
17045
- import { z as z28 } from "zod";
17046
- var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
17047
- var blogPostLayout = section(
17048
- { background: "background", className: "rb-px-6 rb-py-12" },
17049
- [...composition.layout]
17050
- );
17051
- var blogPostManifest = createBlockManifest({
17052
- id: "block.blog-post",
17053
- version: "0.1.0",
17054
- title: "Blog post",
17055
- description: "Highlights a single blog post with title, image, and excerpt.",
17056
- category: "blog",
17057
- contentTypes: ["post"],
17058
- tags: ["blog", "post", "featured", "highlight", "article", "single"],
17059
- icon: "FileText",
17060
- styleTokens: {
17061
- background: "surface",
17062
- typography: "body",
17063
- spacing: "md"
17064
- },
17065
- behaviours: {
17066
- supportsThemeSwitching: true,
17067
- inlineEditing: false,
17068
- animation: false,
17069
- paletteHidden: false
17070
- },
17071
- additionalFields: composition.fields,
17072
- layout: blogPostLayout
17073
- });
17074
- var blogPostDataSchema = z28.object({
17075
- id: z28.string(),
17076
- title: z28.string(),
17077
- slug: z28.string(),
18049
+ // ../blocks/src/system/fields/imageLayout.ts
18050
+ function createImageColSizeField(options = {}) {
18051
+ const {
18052
+ id = "imageColSize",
18053
+ label = "Image column size",
18054
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
18055
+ defaultValue = "1/3",
18056
+ uiIntent = "display",
18057
+ visibleWhen
18058
+ } = options;
18059
+ return {
18060
+ id,
18061
+ type: "select",
18062
+ label,
18063
+ description,
18064
+ required: false,
18065
+ defaultValue,
18066
+ multiple: false,
18067
+ options: [
18068
+ { value: "1/4", label: "Small (1/4)" },
18069
+ { value: "1/3", label: "Medium (1/3)" },
18070
+ { value: "2/5", label: "Large (2/5)" },
18071
+ { value: "1/2", label: "Extra large (1/2)" },
18072
+ { value: "2/3", label: "Huge (2/3)" }
18073
+ ],
18074
+ ui: {
18075
+ intent: uiIntent,
18076
+ ...visibleWhen ? { visibleWhen } : {}
18077
+ }
18078
+ };
18079
+ }
18080
+ function createImagePositionField(options = {}) {
18081
+ const {
18082
+ id = "imagePosition",
18083
+ label = "Image position",
18084
+ description = "Choose which side the image appears on.",
18085
+ defaultValue = "left",
18086
+ includeAlternate = false,
18087
+ uiIntent = "display",
18088
+ visibleWhen
18089
+ } = options;
18090
+ const positionOptions = [
18091
+ { value: "left", label: "Left" },
18092
+ { value: "right", label: "Right" },
18093
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
18094
+ ];
18095
+ return {
18096
+ id,
18097
+ type: "select",
18098
+ label,
18099
+ description,
18100
+ required: false,
18101
+ defaultValue,
18102
+ multiple: false,
18103
+ // Spread to get a mutable array type without unsafe casts.
18104
+ options: [...positionOptions],
18105
+ ui: {
18106
+ intent: uiIntent,
18107
+ ...visibleWhen ? { visibleWhen } : {}
18108
+ }
18109
+ };
18110
+ }
18111
+
18112
+ // ../blocks/src/system/blocks/intro.ts
18113
+ function introHeading(className) {
18114
+ return text(
18115
+ {
18116
+ as: "h2",
18117
+ className
18118
+ },
18119
+ when("content.title"),
18120
+ bind("content.title")
18121
+ );
18122
+ }
18123
+ function introBody(className = "rb-prose rb-max-w-none") {
18124
+ return richText({ className }, bind("content.body"));
18125
+ }
18126
+ function introCtas(justify = "start") {
18127
+ return ctaRow({
18128
+ justify,
18129
+ gap: "md",
18130
+ containerClassName: "rb-mt-2"
18131
+ });
18132
+ }
18133
+ function introCopyStack(options = {}) {
18134
+ return stack(
18135
+ {
18136
+ gap: "md",
18137
+ className: options.className ?? "rb-intro-copy"
18138
+ },
18139
+ [
18140
+ introHeading(options.headingClassName ?? "rb-intro-title"),
18141
+ introBody(options.bodyClassName),
18142
+ introCtas(options.ctaJustify)
18143
+ ]
18144
+ );
18145
+ }
18146
+ var introMedia = media(
18147
+ {
18148
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
18149
+ style: {
18150
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
18151
+ }
18152
+ },
18153
+ bind("content.media")
18154
+ );
18155
+ var centeredCopyLayout = styledSection({
18156
+ children: styledContainer({
18157
+ rootType: "stack",
18158
+ rootProps: { gap: "lg" },
18159
+ children: [
18160
+ introCopyStack({
18161
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
18162
+ headingClassName: "rb-intro-title rb-text-center",
18163
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
18164
+ ctaJustify: "center"
18165
+ })
18166
+ ]
18167
+ }),
18168
+ baseClass: "",
18169
+ spacing: "medium"
18170
+ });
18171
+ var statementCopyLayout = styledSection({
18172
+ children: styledContainer({
18173
+ children: [
18174
+ el(
18175
+ "div",
18176
+ {
18177
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18178
+ },
18179
+ [
18180
+ introHeading("rb-intro-title rb-max-w-xl"),
18181
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18182
+ introBody(),
18183
+ introCtas("start")
18184
+ ])
18185
+ ]
18186
+ )
18187
+ ]
18188
+ }),
18189
+ baseClass: "",
18190
+ spacing: "medium"
18191
+ });
18192
+ var statementMediaLayout = styledSection({
18193
+ children: styledContainer({
18194
+ children: [
18195
+ el(
18196
+ "div",
18197
+ {
18198
+ 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"
18199
+ },
18200
+ [
18201
+ introHeading("rb-intro-title rb-max-w-xl"),
18202
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18203
+ introBody(),
18204
+ introCtas("start")
18205
+ ]),
18206
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
18207
+ ]
18208
+ )
18209
+ ]
18210
+ }),
18211
+ baseClass: "",
18212
+ spacing: "medium"
18213
+ });
18214
+ var mediaCopyLayout = styledSection({
18215
+ children: styledContainer({
18216
+ children: [
18217
+ responsiveTwoColumn({
18218
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
18219
+ text: introCopyStack({
18220
+ className: "rb-intro-copy rb-max-w-xl",
18221
+ headingClassName: "rb-intro-title"
18222
+ }),
18223
+ ratioFrom: "content.ratio",
18224
+ imagePositionFrom: "content.imagePosition",
18225
+ gapFrom: "content.gap",
18226
+ gapFallback: "comfortable",
18227
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
18228
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
18229
+ })
18230
+ ]
18231
+ }),
18232
+ baseClass: "",
18233
+ spacing: "medium"
18234
+ });
18235
+ var introConfig = {
18236
+ id: "block.intro",
18237
+ title: "Intro",
18238
+ category: "layout",
18239
+ includeContainerStyles: true,
18240
+ titleSource: "title",
18241
+ additionalFields: [
18242
+ {
18243
+ id: "title",
18244
+ type: "text",
18245
+ label: "Statement",
18246
+ required: false,
18247
+ multiline: true,
18248
+ maxLength: 160
18249
+ },
18250
+ {
18251
+ id: "body",
18252
+ type: "richText",
18253
+ label: "Text",
18254
+ required: true,
18255
+ ui: {
18256
+ richTextVariant: "limited"
18257
+ }
18258
+ },
18259
+ {
18260
+ id: "media",
18261
+ type: "media",
18262
+ label: "Media",
18263
+ required: false,
18264
+ mediaKinds: ["image"],
18265
+ ui: {
18266
+ intent: "content",
18267
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
18268
+ }
18269
+ },
18270
+ createImagePositionField({
18271
+ id: "imagePosition",
18272
+ label: "Image position",
18273
+ defaultValue: "left",
18274
+ uiIntent: "display",
18275
+ visibleWhen: { field: "variant", equals: "media-copy" }
18276
+ }),
18277
+ {
18278
+ id: "gap",
18279
+ type: "select",
18280
+ label: "Gap between media and text",
18281
+ required: false,
18282
+ defaultValue: "comfortable",
18283
+ multiple: false,
18284
+ options: [
18285
+ { value: "none", label: "None" },
18286
+ { value: "compact", label: "Compact" },
18287
+ { value: "cozy", label: "Cozy" },
18288
+ { value: "medium", label: "Medium" },
18289
+ { value: "comfortable", label: "Comfortable" },
18290
+ { value: "spacious", label: "Spacious" }
18291
+ ],
18292
+ ui: {
18293
+ intent: "display",
18294
+ visibleWhen: { field: "variant", equals: "media-copy" }
18295
+ }
18296
+ },
18297
+ createImageColSizeField({
18298
+ id: "ratio",
18299
+ label: "Media column size",
18300
+ defaultValue: "1/2",
18301
+ uiIntent: "display",
18302
+ visibleWhen: { field: "variant", equals: "media-copy" }
18303
+ }),
18304
+ createAspectRatioField({
18305
+ id: "aspectRatio",
18306
+ label: "Media aspect ratio",
18307
+ description: "Crop media to a consistent aspect ratio.",
18308
+ defaultValue: "auto",
18309
+ visibleWhen: { field: "media", notEquals: null }
18310
+ }),
18311
+ createCtasRepeater({
18312
+ label: "Calls to action",
18313
+ itemLabel: "CTA",
18314
+ maxItems: 2
18315
+ })
18316
+ ],
18317
+ layout: centeredCopyLayout,
18318
+ variants: {
18319
+ "centered-copy": centeredCopyLayout,
18320
+ "statement-copy": statementCopyLayout,
18321
+ "statement-media": statementMediaLayout,
18322
+ "media-copy": mediaCopyLayout
18323
+ },
18324
+ defaultVariant: "statement-copy",
18325
+ variantOptions: {
18326
+ "centered-copy": {
18327
+ label: "Centered copy",
18328
+ description: "A focused intro with centered text and optional calls to action."
18329
+ },
18330
+ "statement-copy": {
18331
+ label: "Statement and copy",
18332
+ description: "A large statement on the left with supporting copy on the right."
18333
+ },
18334
+ "statement-media": {
18335
+ label: "Statement, copy and media",
18336
+ description: "A three-part intro with statement, copy and a small image."
18337
+ },
18338
+ "media-copy": {
18339
+ label: "Media and copy",
18340
+ description: "A compact media/text intro for softer transitions after a hero."
18341
+ }
18342
+ },
18343
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
18344
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
18345
+ icon: "PanelTopOpen"
18346
+ };
18347
+ var introManifest = createBlockManifest(introConfig);
18348
+ var introBlockDefinition = {
18349
+ manifest: introManifest
18350
+ };
18351
+
18352
+ // ../blocks/src/system/blocks/body-text.ts
18353
+ var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
18354
+ var proseLayout = styledSection({
18355
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18356
+ spacing: "medium",
18357
+ baseClass: ""
18358
+ });
18359
+ var introLayout = styledSection({
18360
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18361
+ spacing: "medium",
18362
+ baseClass: ""
18363
+ });
18364
+ var narrowLayout = styledSection({
18365
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18366
+ spacing: "medium",
18367
+ baseClass: ""
18368
+ });
18369
+ var bodyTextManifest = createBlockManifest({
18370
+ id: "block.body-text",
18371
+ title: "Body Text",
18372
+ titleSource: "heading",
18373
+ category: "content",
18374
+ fragments: [
18375
+ { fragment: bodyCopyFragment, fieldPriority: 0 }
18376
+ ],
18377
+ layout: proseLayout,
18378
+ variants: {
18379
+ prose: proseLayout,
18380
+ intro: introLayout,
18381
+ narrow: narrowLayout
18382
+ },
18383
+ defaultVariant: "prose",
18384
+ variantOptions: {
18385
+ prose: {
18386
+ label: "Prose",
18387
+ description: "Long-form rich text for pages and posts.",
18388
+ icon: "Type"
18389
+ },
18390
+ intro: {
18391
+ label: "Intro",
18392
+ description: "Narrower, larger text for above-the-fold intros.",
18393
+ icon: "AlignCenter"
18394
+ },
18395
+ narrow: {
18396
+ label: "Narrow",
18397
+ description: "Left-aligned lead copy with a shorter max width.",
18398
+ icon: "AlignLeft"
18399
+ }
18400
+ },
18401
+ description: "Simple text block with optional heading and alignment controls.",
18402
+ tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
18403
+ icon: "Type",
18404
+ styleTokens: {
18405
+ spacing: "md"
18406
+ }
18407
+ });
18408
+ var bodyTextBlockDefinition = {
18409
+ manifest: bodyTextManifest
18410
+ };
18411
+
18412
+ // ../blocks/src/system/blocks/blog-post.tsx
18413
+ import { z as z28 } from "zod";
18414
+ var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
18415
+ var blogPostLayout = section(
18416
+ { background: "background", className: "rb-px-6 rb-py-12" },
18417
+ [...composition.layout]
18418
+ );
18419
+ var blogPostManifest = createBlockManifest({
18420
+ id: "block.blog-post",
18421
+ version: "0.1.0",
18422
+ title: "Blog post",
18423
+ description: "Highlights a single blog post with title, image, and excerpt.",
18424
+ category: "blog",
18425
+ contentTypes: ["post"],
18426
+ tags: ["blog", "post", "featured", "highlight", "article", "single"],
18427
+ icon: "FileText",
18428
+ styleTokens: {
18429
+ background: "surface",
18430
+ typography: "body",
18431
+ spacing: "md"
18432
+ },
18433
+ behaviours: {
18434
+ supportsThemeSwitching: true,
18435
+ inlineEditing: false,
18436
+ animation: false,
18437
+ paletteHidden: false
18438
+ },
18439
+ additionalFields: composition.fields,
18440
+ layout: blogPostLayout
18441
+ });
18442
+ var blogPostDataSchema = z28.object({
18443
+ id: z28.string(),
18444
+ title: z28.string(),
18445
+ slug: z28.string(),
17078
18446
  path: z28.string(),
17079
18447
  excerpt: z28.string().nullable().optional(),
17080
18448
  image: z28.object({
@@ -17824,6 +19192,37 @@ var faqComposition = composeFragments([
17824
19192
  { fragment: faqHeadingFragment, fieldPriority: 0 },
17825
19193
  { fragment: faqAccordionFragment, fieldPriority: 1 }
17826
19194
  ]);
19195
+ function fragmentLayoutNode(layout) {
19196
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
19197
+ }
19198
+ function isNodeDefinitionArray(layout) {
19199
+ return Array.isArray(layout);
19200
+ }
19201
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19202
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19203
+ var defaultLayout = styledSection({
19204
+ children: styledContainer({
19205
+ baseClassName: "rb-relative rb-isolate",
19206
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
19207
+ }),
19208
+ baseClass: ""
19209
+ });
19210
+ var twoColumnLayout = styledSection({
19211
+ children: styledContainer({
19212
+ baseClassName: "rb-relative rb-isolate",
19213
+ children: el(
19214
+ "div",
19215
+ {
19216
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19217
+ },
19218
+ [
19219
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19220
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19221
+ ]
19222
+ )
19223
+ }),
19224
+ baseClass: ""
19225
+ });
17827
19226
  var faqManifest = createBlockManifest({
17828
19227
  id: "block.faq",
17829
19228
  title: "FAQ",
@@ -17840,13 +19239,22 @@ var faqManifest = createBlockManifest({
17840
19239
  label: "FAQ item styles"
17841
19240
  })
17842
19241
  ],
17843
- layout: styledSection({
17844
- children: styledContainer({
17845
- baseClassName: "rb-relative rb-isolate",
17846
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
17847
- }),
17848
- baseClass: ""
17849
- }),
19242
+ layout: defaultLayout,
19243
+ variants: {
19244
+ default: defaultLayout,
19245
+ "two-column": twoColumnLayout
19246
+ },
19247
+ defaultVariant: "default",
19248
+ variantOptions: {
19249
+ default: {
19250
+ label: "Default",
19251
+ description: "A centered heading above one FAQ accordion."
19252
+ },
19253
+ "two-column": {
19254
+ label: "Two column",
19255
+ description: "A left heading column with FAQ items on the right."
19256
+ }
19257
+ },
17850
19258
  description: "Accordion of frequently asked questions and answers.",
17851
19259
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
17852
19260
  icon: "HelpCircle"
@@ -18496,7 +19904,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
18496
19904
  function resolveHeaderVisualStyles(header, tokens) {
18497
19905
  const navContainerType = header?.navContainer?.type ?? "none";
18498
19906
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
18499
- if (hasContainedNav) {
19907
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
19908
+ if (hasContainedNav || hasTransparentVariant) {
18500
19909
  return {
18501
19910
  backgroundToken: "transparent",
18502
19911
  paletteHex: null,
@@ -18625,6 +20034,17 @@ var headerRootStyleTransform = {
18625
20034
  return mergeStyles(...styleParts);
18626
20035
  }
18627
20036
  };
20037
+ var headerSectionBackgroundTransform = {
20038
+ id: "layout.headerSectionBackground",
20039
+ kind: "string",
20040
+ summary: "Resolve the inner site-header section background token",
20041
+ run: (value) => {
20042
+ const header = asPartialObject(value);
20043
+ const navContainerType = header?.navContainer?.type ?? "none";
20044
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
20045
+ return usesTransparentRoot ? "raw:transparent" : "background";
20046
+ }
20047
+ };
18628
20048
  var footerRootStyleTransform = {
18629
20049
  id: "layout.footerRootStyle",
18630
20050
  kind: "formatter",
@@ -18883,6 +20303,7 @@ var layoutTransforms = [
18883
20303
  headerRootClassTransform,
18884
20304
  footerRootClassTransform,
18885
20305
  headerRootStyleTransform,
20306
+ headerSectionBackgroundTransform,
18886
20307
  footerRootStyleTransform,
18887
20308
  footerBottomBarClassTransform,
18888
20309
  footerBottomBarContainerClassTransform,
@@ -19393,7 +20814,10 @@ var editorialLayout = stack(
19393
20814
  );
19394
20815
  var headerLayout = headerSection(
19395
20816
  {
19396
- background: "background",
20817
+ background: bindProp("$root.theme.header", {
20818
+ transforms: pipe(tx("layout.headerSectionBackground")),
20819
+ fallback: "background"
20820
+ }),
19397
20821
  allowOverflow: true,
19398
20822
  className: bindProp("$root.theme.header", {
19399
20823
  transforms: pipe(tx("layout.headerRootClass")),
@@ -20228,79 +21652,298 @@ var collectionLayout = styledSection({
20228
21652
  { gap: "md" }
20229
21653
  ),
20230
21654
  baseClass: "",
20231
- spacing: "comfortable"
21655
+ spacing: "comfortable"
21656
+ });
21657
+ var collectionManifest = createBlockManifest({
21658
+ id: "block.collection",
21659
+ title: "Collection",
21660
+ category: "layout",
21661
+ additionalFields: [
21662
+ parseFieldDefinition({
21663
+ id: "layout",
21664
+ type: "select",
21665
+ label: "Layout",
21666
+ defaultValue: "grid",
21667
+ options: [
21668
+ { value: "grid", label: "Grid" },
21669
+ { value: "stack", label: "Stack" }
21670
+ ],
21671
+ ui: { intent: "display" }
21672
+ }),
21673
+ parseFieldDefinition({
21674
+ id: "columns",
21675
+ type: "select",
21676
+ label: "Columns",
21677
+ description: "Number of columns in the grid layout.",
21678
+ defaultValue: "3",
21679
+ options: [
21680
+ { value: "2", label: "2 columns" },
21681
+ { value: "3", label: "3 columns" },
21682
+ { value: "4", label: "4 columns" }
21683
+ ],
21684
+ ui: {
21685
+ intent: "display",
21686
+ visibleWhen: { field: "layout", equals: "grid" }
21687
+ }
21688
+ }),
21689
+ parseFieldDefinition({
21690
+ id: "gap",
21691
+ type: "select",
21692
+ label: "Gap",
21693
+ defaultValue: "medium",
21694
+ options: [
21695
+ { value: "none", label: "None" },
21696
+ { value: "compact", label: "Compact" },
21697
+ { value: "cozy", label: "Cozy" },
21698
+ { value: "medium", label: "Medium" },
21699
+ { value: "comfortable", label: "Comfortable" },
21700
+ { value: "spacious", label: "Spacious" }
21701
+ ],
21702
+ ui: { intent: "display" }
21703
+ }),
21704
+ fragmentsToRepeaterField(
21705
+ "items",
21706
+ "Items",
21707
+ collectionFragments,
21708
+ {
21709
+ minItems: 0,
21710
+ maxItems: 50,
21711
+ itemLabel: "Item",
21712
+ description: "Add items to this collection."
21713
+ }
21714
+ ),
21715
+ cardStylesField({
21716
+ id: "_cardStyles",
21717
+ label: "Item styles"
21718
+ })
21719
+ ],
21720
+ layout: collectionLayout,
21721
+ description: "Repeat items in a grid or stack layout.",
21722
+ tags: ["collection", "grid", "stack", "repeater"],
21723
+ icon: "LayoutList",
21724
+ styleTokens: { spacing: "lg" }
21725
+ });
21726
+ var collectionBlockDefinition = {
21727
+ manifest: collectionManifest
21728
+ };
21729
+
21730
+ // ../blocks/src/system/blocks/feature-cards.ts
21731
+ function grid3(props2, children) {
21732
+ return el("grid", props2 ?? void 0, children ?? void 0);
21733
+ }
21734
+ var sectionHeading = stack(
21735
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
21736
+ [
21737
+ text(
21738
+ {
21739
+ as: "h2",
21740
+ className: "rb-feature-cards-title rb-text-center"
21741
+ },
21742
+ when("content.title"),
21743
+ bind("content.title")
21744
+ ),
21745
+ richText(
21746
+ {
21747
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
21748
+ style: textColorStyle("mutedText")
21749
+ },
21750
+ when("content.description"),
21751
+ bind("content.description")
21752
+ )
21753
+ ]
21754
+ );
21755
+ var featureCard = styledCard(
21756
+ [
21757
+ media(
21758
+ {
21759
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
21760
+ style: {
21761
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
21762
+ }
21763
+ },
21764
+ when("card.media"),
21765
+ bind("card.media")
21766
+ ),
21767
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
21768
+ text(
21769
+ {
21770
+ as: "h3",
21771
+ className: "rb-feature-card-title"
21772
+ },
21773
+ bind("card.title")
21774
+ ),
21775
+ richText(
21776
+ {
21777
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
21778
+ style: textColorStyle("mutedText")
21779
+ },
21780
+ when("card.body"),
21781
+ bind("card.body")
21782
+ ),
21783
+ ctaRow({
21784
+ collectionPath: "ctas",
21785
+ itemName: "cta",
21786
+ gap: "sm",
21787
+ justify: "start",
21788
+ containerClassName: "rb-mt-auto"
21789
+ })
21790
+ ])
21791
+ ],
21792
+ {
21793
+ stylesFrom: "content._cardStyles",
21794
+ backgroundFrom: "content._cardStyles.background",
21795
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
21796
+ },
21797
+ repeat("content.cards", "card")
21798
+ );
21799
+ var cardsLayout = styledSection({
21800
+ children: styledContainer({
21801
+ rootType: "stack",
21802
+ rootProps: { gap: "xl" },
21803
+ children: [
21804
+ sectionHeading,
21805
+ grid3(
21806
+ {
21807
+ cols: {
21808
+ $bind: {
21809
+ from: "content.columns",
21810
+ fallback: 3,
21811
+ coerce: "number"
21812
+ }
21813
+ },
21814
+ gap: "lg"
21815
+ },
21816
+ [featureCard]
21817
+ )
21818
+ ]
21819
+ }),
21820
+ baseClass: "",
21821
+ spacing: "medium"
20232
21822
  });
20233
- var collectionManifest = createBlockManifest({
20234
- id: "block.collection",
20235
- title: "Collection",
21823
+ var featureCardsConfig = {
21824
+ id: "block.feature-cards",
21825
+ title: "Feature Cards",
20236
21826
  category: "layout",
21827
+ includeContainerStyles: true,
21828
+ titleSource: "title",
20237
21829
  additionalFields: [
20238
- parseFieldDefinition({
20239
- id: "layout",
20240
- type: "select",
20241
- label: "Layout",
20242
- defaultValue: "grid",
20243
- options: [
20244
- { value: "grid", label: "Grid" },
20245
- { value: "stack", label: "Stack" }
20246
- ],
20247
- ui: { intent: "display" }
20248
- }),
20249
- parseFieldDefinition({
21830
+ {
21831
+ id: "title",
21832
+ type: "text",
21833
+ label: "Title",
21834
+ required: false,
21835
+ multiline: false,
21836
+ maxLength: 120
21837
+ },
21838
+ {
21839
+ id: "description",
21840
+ type: "richText",
21841
+ label: "Description",
21842
+ required: false,
21843
+ ui: {
21844
+ richTextVariant: "limited"
21845
+ }
21846
+ },
21847
+ {
20250
21848
  id: "columns",
20251
21849
  type: "select",
20252
21850
  label: "Columns",
20253
- description: "Number of columns in the grid layout.",
21851
+ required: false,
20254
21852
  defaultValue: "3",
21853
+ multiple: false,
20255
21854
  options: [
20256
21855
  { value: "2", label: "2 columns" },
20257
21856
  { value: "3", label: "3 columns" },
20258
21857
  { value: "4", label: "4 columns" }
20259
21858
  ],
20260
- ui: {
20261
- intent: "display",
20262
- visibleWhen: { field: "layout", equals: "grid" }
20263
- }
20264
- }),
20265
- parseFieldDefinition({
20266
- id: "gap",
20267
- type: "select",
20268
- label: "Gap",
20269
- defaultValue: "medium",
20270
- options: [
20271
- { value: "none", label: "None" },
20272
- { value: "compact", label: "Compact" },
20273
- { value: "cozy", label: "Cozy" },
20274
- { value: "medium", label: "Medium" },
20275
- { value: "comfortable", label: "Comfortable" },
20276
- { value: "spacious", label: "Spacious" }
20277
- ],
20278
21859
  ui: { intent: "display" }
20279
- }),
20280
- fragmentsToRepeaterField(
20281
- "items",
20282
- "Items",
20283
- collectionFragments,
20284
- {
20285
- minItems: 0,
20286
- maxItems: 50,
20287
- itemLabel: "Item",
20288
- description: "Add items to this collection."
21860
+ },
21861
+ {
21862
+ id: "cards",
21863
+ type: "repeater",
21864
+ label: "Cards",
21865
+ required: false,
21866
+ minItems: 1,
21867
+ maxItems: 8,
21868
+ itemLabel: "Card",
21869
+ itemLabelSource: "title",
21870
+ allowConversion: true,
21871
+ ui: {
21872
+ intent: "content"
21873
+ },
21874
+ schema: {
21875
+ fields: [
21876
+ {
21877
+ id: "media",
21878
+ type: "media",
21879
+ label: "Image",
21880
+ required: false,
21881
+ mediaKinds: ["image"]
21882
+ },
21883
+ createAspectRatioField({
21884
+ id: "aspectRatio",
21885
+ label: "Image aspect ratio",
21886
+ defaultValue: "4/3",
21887
+ visibleWhen: { field: "media", notEquals: null }
21888
+ }),
21889
+ {
21890
+ id: "title",
21891
+ type: "text",
21892
+ label: "Title",
21893
+ required: true,
21894
+ multiline: false,
21895
+ maxLength: 120
21896
+ },
21897
+ {
21898
+ id: "body",
21899
+ type: "richText",
21900
+ label: "Text",
21901
+ required: false,
21902
+ ui: {
21903
+ richTextVariant: "limited"
21904
+ }
21905
+ },
21906
+ createCtasRepeater({
21907
+ label: "Calls to action",
21908
+ itemLabel: "CTA",
21909
+ maxItems: 1,
21910
+ button: {
21911
+ variants: [
21912
+ { value: "primary", label: "Primary" },
21913
+ { value: "secondary", label: "Secondary" },
21914
+ { value: "outline", label: "Outline" },
21915
+ { value: "ghost", label: "Ghost" },
21916
+ { value: "link", label: "Link" }
21917
+ ],
21918
+ defaultVariant: "ghost"
21919
+ }
21920
+ })
21921
+ ]
20289
21922
  }
20290
- ),
21923
+ },
20291
21924
  cardStylesField({
20292
21925
  id: "_cardStyles",
20293
- label: "Item styles"
21926
+ label: "Card styles"
20294
21927
  })
20295
21928
  ],
20296
- layout: collectionLayout,
20297
- description: "Repeat items in a grid or stack layout.",
20298
- tags: ["collection", "grid", "stack", "repeater"],
20299
- icon: "LayoutList",
20300
- styleTokens: { spacing: "lg" }
20301
- });
20302
- var collectionBlockDefinition = {
20303
- manifest: collectionManifest
21929
+ layout: cardsLayout,
21930
+ variants: {
21931
+ cards: cardsLayout
21932
+ },
21933
+ defaultVariant: "cards",
21934
+ variantOptions: {
21935
+ cards: {
21936
+ label: "Cards",
21937
+ description: "A responsive grid of image cards with optional calls to action."
21938
+ }
21939
+ },
21940
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
21941
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
21942
+ icon: "PanelsTopLeft"
21943
+ };
21944
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
21945
+ var featureCardsBlockDefinition = {
21946
+ manifest: featureCardsManifest
20304
21947
  };
20305
21948
 
20306
21949
  // ../blocks/src/system/fields/carousel.ts
@@ -20388,69 +22031,6 @@ function createCarouselBehaviorFields(options = {}) {
20388
22031
  return fields3;
20389
22032
  }
20390
22033
 
20391
- // ../blocks/src/system/fields/imageLayout.ts
20392
- function createImageColSizeField(options = {}) {
20393
- const {
20394
- id = "imageColSize",
20395
- label = "Image column size",
20396
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
20397
- defaultValue = "1/3",
20398
- uiIntent = "display",
20399
- visibleWhen
20400
- } = options;
20401
- return {
20402
- id,
20403
- type: "select",
20404
- label,
20405
- description,
20406
- required: false,
20407
- defaultValue,
20408
- multiple: false,
20409
- options: [
20410
- { value: "1/4", label: "Small (1/4)" },
20411
- { value: "1/3", label: "Medium (1/3)" },
20412
- { value: "2/5", label: "Large (2/5)" },
20413
- { value: "1/2", label: "Extra large (1/2)" },
20414
- { value: "2/3", label: "Huge (2/3)" }
20415
- ],
20416
- ui: {
20417
- intent: uiIntent,
20418
- ...visibleWhen ? { visibleWhen } : {}
20419
- }
20420
- };
20421
- }
20422
- function createImagePositionField(options = {}) {
20423
- const {
20424
- id = "imagePosition",
20425
- label = "Image position",
20426
- description = "Choose which side the image appears on.",
20427
- defaultValue = "left",
20428
- includeAlternate = false,
20429
- uiIntent = "display",
20430
- visibleWhen
20431
- } = options;
20432
- const positionOptions = [
20433
- { value: "left", label: "Left" },
20434
- { value: "right", label: "Right" },
20435
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
20436
- ];
20437
- return {
20438
- id,
20439
- type: "select",
20440
- label,
20441
- description,
20442
- required: false,
20443
- defaultValue,
20444
- multiple: false,
20445
- // Spread to get a mutable array type without unsafe casts.
20446
- options: [...positionOptions],
20447
- ui: {
20448
- intent: uiIntent,
20449
- ...visibleWhen ? { visibleWhen } : {}
20450
- }
20451
- };
20452
- }
20453
-
20454
22034
  // ../blocks/src/system/blocks/media-text.ts
20455
22035
  var mediaTextFrameCapability = defineFrameCapability([
20456
22036
  "plain",
@@ -20574,26 +22154,13 @@ var mediaTextManifest = createBlockManifest({
20574
22154
  },
20575
22155
  ui: { intent: "behavior" }
20576
22156
  }),
20577
- {
22157
+ createAspectRatioField({
20578
22158
  id: "aspectRatio",
20579
- type: "select",
20580
22159
  label: "Media aspect ratio",
20581
22160
  description: "Crop media to a consistent aspect ratio.",
20582
- required: false,
20583
22161
  defaultValue: "auto",
20584
- multiple: false,
20585
- options: [
20586
- { value: "auto", label: "Auto (original)" },
20587
- { value: "16/9", label: "16:9 (Landscape)" },
20588
- { value: "4/3", label: "4:3 (Standard)" },
20589
- { value: "1/1", label: "1:1 (Square)" },
20590
- { value: "3/4", label: "3:4 (Portrait)" }
20591
- ],
20592
- ui: {
20593
- intent: "display",
20594
- visibleWhen: { field: "images", notEquals: null }
20595
- }
20596
- },
22162
+ visibleWhen: { field: "images", notEquals: null }
22163
+ }),
20597
22164
  {
20598
22165
  id: "text",
20599
22166
  type: "richText",
@@ -20723,7 +22290,7 @@ var mediaTextManifest = createBlockManifest({
20723
22290
  whenImagesLength(0)
20724
22291
  );
20725
22292
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
20726
- const defaultLayout = styledSection({
22293
+ const defaultLayout2 = styledSection({
20727
22294
  children: styledContainer({
20728
22295
  rootType: "stack",
20729
22296
  rootProps: { gap: "lg" },
@@ -20755,9 +22322,9 @@ var mediaTextManifest = createBlockManifest({
20755
22322
  spacing: "medium"
20756
22323
  });
20757
22324
  return {
20758
- layout: defaultLayout,
22325
+ layout: defaultLayout2,
20759
22326
  variants: {
20760
- default: defaultLayout
22327
+ default: defaultLayout2
20761
22328
  },
20762
22329
  defaultVariant: "default",
20763
22330
  variantOptions: {
@@ -24157,7 +25724,7 @@ var embedBlockDefinition = {
24157
25724
  };
24158
25725
 
24159
25726
  // ../blocks/src/system/blocks/image-gallery.ts
24160
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
25727
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24161
25728
  var galleryContainer = (children, opts) => {
24162
25729
  const gap = opts?.gap ?? "md";
24163
25730
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -24237,7 +25804,7 @@ var galleryItem = (options) => stack(
24237
25804
  ],
24238
25805
  repeat("content.images", "item")
24239
25806
  );
24240
- var gridLayout3 = grid3(
25807
+ var gridLayout3 = grid4(
24241
25808
  {
24242
25809
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
24243
25810
  },
@@ -24840,7 +26407,7 @@ var imageGalleryBlockDefinition = {
24840
26407
  };
24841
26408
 
24842
26409
  // ../blocks/src/system/blocks/video-grid.ts
24843
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
26410
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24844
26411
  var videoItem = (options) => stack(
24845
26412
  { gap: "xs", className: options.containerClassName },
24846
26413
  [
@@ -24890,7 +26457,7 @@ var gridColumnsClass = (columns) => {
24890
26457
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
24891
26458
  }
24892
26459
  };
24893
- var createGridLayout = (columns) => grid4(
26460
+ var createGridLayout = (columns) => grid5(
24894
26461
  {
24895
26462
  className: gridColumnsClass(columns)
24896
26463
  },
@@ -28054,6 +29621,40 @@ var systemBlockDefinitionsRaw = [
28054
29621
  })
28055
29622
  ]
28056
29623
  })),
29624
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
29625
+ sectionSurfaces: "supported",
29626
+ contentFrames: ["plain", "panel"],
29627
+ itemSurfaces: "unsupported",
29628
+ headingDecorations: ["organic-squiggle"]
29629
+ }), defineBlockDesignMetadata({
29630
+ flow: bodyFlow,
29631
+ layoutProfiles: [
29632
+ layoutProfile({
29633
+ variantKey: "centered-copy",
29634
+ family: "centered",
29635
+ weight: "featured",
29636
+ bias: "soft"
29637
+ }),
29638
+ layoutProfile({
29639
+ variantKey: "statement-copy",
29640
+ family: "split",
29641
+ weight: "featured",
29642
+ bias: "merge"
29643
+ }),
29644
+ layoutProfile({
29645
+ variantKey: "statement-media",
29646
+ family: "media-text",
29647
+ weight: "featured",
29648
+ bias: "soft"
29649
+ }),
29650
+ layoutProfile({
29651
+ variantKey: "media-copy",
29652
+ family: "media-text",
29653
+ weight: "featured",
29654
+ bias: "soft"
29655
+ })
29656
+ ]
29657
+ })),
28057
29658
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
28058
29659
  flow: bodyFlow,
28059
29660
  layoutProfiles: [
@@ -28114,9 +29715,17 @@ var systemBlockDefinitionsRaw = [
28114
29715
  flow: conversionFlow,
28115
29716
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
28116
29717
  })),
28117
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
29718
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
29719
+ sectionSurfaces: "supported",
29720
+ contentFrames: ["plain", "panel"],
29721
+ itemSurfaces: "supported",
29722
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
29723
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
28118
29724
  flow: bodyFlow,
28119
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29725
+ layoutProfiles: [
29726
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29727
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
29728
+ ]
28120
29729
  })),
28121
29730
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
28122
29731
  flow: siteChromeFlow,
@@ -28130,7 +29739,8 @@ var systemBlockDefinitionsRaw = [
28130
29739
  sectionSurfaces: "supported",
28131
29740
  contentFrames: ["plain", "panel"],
28132
29741
  itemSurfaces: "supported",
28133
- testimonialCardTreatments: ["default", "accent-quote"]
29742
+ testimonialCardTreatments: ["default", "accent-quote"],
29743
+ headingDecorations: ["short-center-rule"]
28134
29744
  }), defineBlockDesignMetadata({
28135
29745
  flow: proofFlow,
28136
29746
  layoutProfiles: [
@@ -28156,6 +29766,22 @@ var systemBlockDefinitionsRaw = [
28156
29766
  flow: offeringsFlow,
28157
29767
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
28158
29768
  })),
29769
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
29770
+ sectionSurfaces: "supported",
29771
+ contentFrames: ["plain", "panel"],
29772
+ itemSurfaces: "supported",
29773
+ headingDecorations: ["short-center-rule"]
29774
+ }), defineBlockDesignMetadata({
29775
+ flow: offeringsFlow,
29776
+ layoutProfiles: [
29777
+ layoutProfile({
29778
+ variantKey: "cards",
29779
+ family: "grid",
29780
+ weight: "standard",
29781
+ bias: "soft"
29782
+ })
29783
+ ]
29784
+ })),
28159
29785
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
28160
29786
  flow: mediaFlow,
28161
29787
  layoutProfiles: [
@@ -31767,8 +33393,10 @@ import { z as z66 } from "zod";
31767
33393
  var SYSTEM_BLOCK_KINDS = [
31768
33394
  // Layout blocks
31769
33395
  "block.hero",
33396
+ "block.intro",
31770
33397
  "block.columns",
31771
33398
  "block.collection",
33399
+ "block.feature-cards",
31772
33400
  "block.media-text",
31773
33401
  "block.cta-full",
31774
33402
  "block.single-button",