@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
@@ -830,6 +830,7 @@ var init_validation_constants = __esm({
830
830
  "layout.headerRootClass",
831
831
  "layout.footerRootClass",
832
832
  "layout.headerRootStyle",
833
+ "layout.headerSectionBackground",
833
834
  "layout.footerRootStyle",
834
835
  // UI (ui.ts)
835
836
  "ui.headerNavLinkClass",
@@ -1791,10 +1792,12 @@ function defineBlockDesignCapability(capability) {
1791
1792
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
1792
1793
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
1793
1794
  tileTreatments: capability.tileTreatments ?? ["default"],
1794
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
1795
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
1796
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
1797
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
1795
1798
  };
1796
1799
  }
1797
- var plainFrame, tileTreatmentValues, eyebrowTreatmentValues;
1800
+ var plainFrame, tileTreatmentValues, eyebrowTreatmentValues, visibleHeadingDecorationFamilyValues, visibleHeadingDecorationPlacementValues, headingDecorationOverrideValues, headingDecorationColorTokenValues, accordionIconSetValues, accordionIconColorTokenValues, accordionIconMotionValues;
1798
1801
  var init_types2 = __esm({
1799
1802
  "../theme-core/src/site-styles/types.ts"() {
1800
1803
  plainFrame = {
@@ -1812,6 +1815,47 @@ var init_types2 = __esm({
1812
1815
  "pill-bounce",
1813
1816
  "accent-pill-bounce"
1814
1817
  ];
1818
+ visibleHeadingDecorationFamilyValues = [
1819
+ "organic-squiggle",
1820
+ "short-center-rule"
1821
+ ];
1822
+ visibleHeadingDecorationPlacementValues = [
1823
+ "after-heading",
1824
+ "between-heading-and-body",
1825
+ "under-centered-heading"
1826
+ ];
1827
+ headingDecorationOverrideValues = [
1828
+ "site-default",
1829
+ "on",
1830
+ "off"
1831
+ ];
1832
+ headingDecorationColorTokenValues = [
1833
+ "text",
1834
+ "primary",
1835
+ "secondary",
1836
+ "accent",
1837
+ "border",
1838
+ "muted"
1839
+ ];
1840
+ accordionIconSetValues = [
1841
+ "plus",
1842
+ "chevron",
1843
+ "caret",
1844
+ "minimal-cross"
1845
+ ];
1846
+ accordionIconColorTokenValues = [
1847
+ "text",
1848
+ "muted",
1849
+ "primary",
1850
+ "secondary",
1851
+ "accent",
1852
+ "current"
1853
+ ];
1854
+ accordionIconMotionValues = [
1855
+ "none",
1856
+ "rotate",
1857
+ "swap"
1858
+ ];
1815
1859
  }
1816
1860
  });
1817
1861
 
@@ -2007,6 +2051,25 @@ var init_blockAppearancePresets = __esm({
2007
2051
  emphasis: "high"
2008
2052
  }
2009
2053
  }),
2054
+ defineBlockAppearancePreset({
2055
+ kind: "block-design",
2056
+ id: "intro-soft-earth-statement",
2057
+ target: "intro",
2058
+ label: "Soft Earth intro statement",
2059
+ blockKinds: ["block.intro"],
2060
+ design: {
2061
+ sectionSurface: "base",
2062
+ contentFrame: plainFrame,
2063
+ itemSurface: "none",
2064
+ transitionAfter: "soft-fade-short",
2065
+ emphasis: "high",
2066
+ headingDecoration: {
2067
+ family: "organic-squiggle",
2068
+ placement: "after-heading",
2069
+ colorToken: "primary"
2070
+ }
2071
+ }
2072
+ }),
2010
2073
  defineBlockAppearancePreset({
2011
2074
  kind: "block-design",
2012
2075
  id: "offerings-calm-list",
@@ -2021,6 +2084,25 @@ var init_blockAppearancePresets = __esm({
2021
2084
  emphasis: "medium"
2022
2085
  }
2023
2086
  }),
2087
+ defineBlockAppearancePreset({
2088
+ kind: "block-design",
2089
+ id: "feature-cards-soft-earth-offerings",
2090
+ target: "feature-cards",
2091
+ label: "Soft Earth offering cards",
2092
+ blockKinds: ["block.feature-cards"],
2093
+ design: {
2094
+ sectionSurface: "base",
2095
+ contentFrame: plainFrame,
2096
+ itemSurface: "raised",
2097
+ transitionAfter: "none",
2098
+ emphasis: "high",
2099
+ headingDecoration: {
2100
+ family: "short-center-rule",
2101
+ placement: "under-centered-heading",
2102
+ colorToken: "primary"
2103
+ }
2104
+ }
2105
+ }),
2024
2106
  defineBlockAppearancePreset({
2025
2107
  kind: "block-design",
2026
2108
  id: "events-base-calendar",
@@ -2149,6 +2231,26 @@ var init_blockAppearancePresets = __esm({
2149
2231
  testimonialCardTreatment: "accent-quote"
2150
2232
  }
2151
2233
  }),
2234
+ defineBlockAppearancePreset({
2235
+ kind: "block-design",
2236
+ id: "testimonials-soft-earth-proof-band",
2237
+ target: "testimonials",
2238
+ label: "Soft Earth proof band",
2239
+ blockKinds: ["block.testimonials"],
2240
+ design: {
2241
+ sectionSurface: "brand-depth-band",
2242
+ contentFrame: plainFrame,
2243
+ itemSurface: "none",
2244
+ transitionAfter: "soft-fade-short",
2245
+ emphasis: "high",
2246
+ testimonialCardTreatment: "accent-quote",
2247
+ headingDecoration: {
2248
+ family: "short-center-rule",
2249
+ placement: "under-centered-heading",
2250
+ colorToken: "border"
2251
+ }
2252
+ }
2253
+ }),
2152
2254
  defineBlockAppearancePreset({
2153
2255
  kind: "block-design",
2154
2256
  id: "faq-base-accordion",
@@ -2177,6 +2279,25 @@ var init_blockAppearancePresets = __esm({
2177
2279
  emphasis: "low"
2178
2280
  }
2179
2281
  }),
2282
+ defineBlockAppearancePreset({
2283
+ kind: "block-design",
2284
+ id: "faq-soft-earth-two-column",
2285
+ target: "faq",
2286
+ label: "Soft Earth two-column FAQ",
2287
+ blockKinds: ["block.faq"],
2288
+ design: {
2289
+ sectionSurface: "base",
2290
+ contentFrame: plainFrame,
2291
+ itemSurface: "flat",
2292
+ transitionAfter: "none",
2293
+ emphasis: "medium",
2294
+ accordionIconTreatment: {
2295
+ iconSet: "plus",
2296
+ colorToken: "primary",
2297
+ motion: "swap"
2298
+ }
2299
+ }
2300
+ }),
2180
2301
  defineBlockAppearancePreset({
2181
2302
  kind: "block-design",
2182
2303
  id: "contact-form-panel",
@@ -2947,6 +3068,103 @@ var init_confident_chip = __esm({
2947
3068
  }
2948
3069
  });
2949
3070
 
3071
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
3072
+ var earthPill;
3073
+ var init_earth_pill = __esm({
3074
+ "../theme-core/src/buttons/personalities/earth-pill.ts"() {
3075
+ init_types4();
3076
+ earthPill = defineButtonPersonality({
3077
+ id: "earth-pill",
3078
+ name: "Earth Pill",
3079
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
3080
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
3081
+ buttonSystem: {
3082
+ global: {
3083
+ cornerStyle: "pill",
3084
+ shadow: "low",
3085
+ textTransform: "none",
3086
+ fontWeight: 500,
3087
+ borderWidth: 1,
3088
+ hoverTransform: "lift",
3089
+ hoverColor: "none",
3090
+ typography: "body",
3091
+ paddingPreset: "default"
3092
+ },
3093
+ sizes: {
3094
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
3095
+ md: { padding: "0.625rem 1.35rem" },
3096
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
3097
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
3098
+ },
3099
+ variants: [
3100
+ {
3101
+ id: "primary",
3102
+ name: "Primary",
3103
+ enabled: true,
3104
+ priority: 1,
3105
+ background: { type: "solid", colorToken: "primary" },
3106
+ textColorToken: "primaryForeground",
3107
+ borderRadius: "rounded-full",
3108
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
3109
+ effects: {
3110
+ hover: [
3111
+ { effectId: "lift", options: { translateY: "-1px" } },
3112
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
3113
+ ],
3114
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
3115
+ }
3116
+ },
3117
+ {
3118
+ id: "secondary",
3119
+ name: "Secondary",
3120
+ enabled: true,
3121
+ priority: 2,
3122
+ background: { type: "transparent" },
3123
+ textColorToken: "primary",
3124
+ borderRadius: "rounded-full",
3125
+ border: { widthClass: "border", colorToken: "primary" },
3126
+ effects: {
3127
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
3128
+ }
3129
+ },
3130
+ {
3131
+ id: "outline",
3132
+ name: "Outline",
3133
+ enabled: true,
3134
+ priority: 3,
3135
+ background: { type: "transparent" },
3136
+ textColorToken: "text",
3137
+ borderRadius: "rounded-full",
3138
+ border: { widthClass: "border", colorToken: "border" },
3139
+ effects: {
3140
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
3141
+ }
3142
+ },
3143
+ {
3144
+ id: "ghost",
3145
+ name: "Ghost",
3146
+ enabled: true,
3147
+ priority: 3,
3148
+ background: { type: "transparent" },
3149
+ textColorToken: "primary",
3150
+ borderRadius: "rounded-full",
3151
+ shadow: { elevation: "none", softness: null, position: "bottom" },
3152
+ sizes: {
3153
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
3154
+ md: { padding: "0.375rem 0" },
3155
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
3156
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
3157
+ },
3158
+ effects: {
3159
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
3160
+ }
3161
+ }
3162
+ ]
3163
+ }
3164
+ });
3165
+ }
3166
+ });
3167
+
2950
3168
  // ../theme-core/src/buttons/personalities/editorial-link.ts
2951
3169
  var editorialLink;
2952
3170
  var init_editorial_link = __esm({
@@ -3441,6 +3659,7 @@ var init_personalities = __esm({
3441
3659
  "../theme-core/src/buttons/personalities/index.ts"() {
3442
3660
  init_brushed_wash();
3443
3661
  init_confident_chip();
3662
+ init_earth_pill();
3444
3663
  init_editorial_link();
3445
3664
  init_ink_stamp();
3446
3665
  init_pebble();
@@ -3449,6 +3668,7 @@ var init_personalities = __esm({
3449
3668
  init_types4();
3450
3669
  buttonPersonalities = [
3451
3670
  softPill,
3671
+ earthPill,
3452
3672
  confidentChip,
3453
3673
  editorialLink,
3454
3674
  pebble,
@@ -4286,7 +4506,7 @@ var init_tokenOrColor = __esm({
4286
4506
  ]);
4287
4507
  }
4288
4508
  });
4289
- var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema;
4509
+ var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema;
4290
4510
  var init_schema3 = __esm({
4291
4511
  "../theme-core/src/schema.ts"() {
4292
4512
  init_media();
@@ -4380,12 +4600,36 @@ var init_schema3 = __esm({
4380
4600
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
4381
4601
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
4382
4602
  });
4603
+ noHeadingDecorationSchema = z.object({
4604
+ family: z.literal("none"),
4605
+ placement: z.literal("none")
4606
+ });
4607
+ visibleHeadingDecorationSchema = z.object({
4608
+ family: z.enum(visibleHeadingDecorationFamilyValues),
4609
+ placement: z.enum(visibleHeadingDecorationPlacementValues),
4610
+ colorToken: z.enum(headingDecorationColorTokenValues).optional()
4611
+ });
4612
+ headingDecorationSchema = z.union([
4613
+ noHeadingDecorationSchema,
4614
+ visibleHeadingDecorationSchema
4615
+ ]);
4616
+ accordionIconTreatmentSchema = z.object({
4617
+ iconSet: z.enum(accordionIconSetValues),
4618
+ colorToken: z.enum(accordionIconColorTokenValues),
4619
+ openColorToken: z.enum(accordionIconColorTokenValues).optional(),
4620
+ motion: z.enum(accordionIconMotionValues)
4621
+ });
4383
4622
  sectionStylesOverrideSchema = z.object({
4384
4623
  background: boxBackgroundSchema.nullable().optional(),
4385
4624
  spacing: semanticSpacingSchema.nullable().optional(),
4386
4625
  minHeight: z.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
4387
4626
  tileTreatment: z.enum(tileTreatmentValues).nullable().optional(),
4388
- eyebrowTreatment: z.enum(eyebrowTreatmentValues).nullable().optional()
4627
+ eyebrowTreatment: z.enum(eyebrowTreatmentValues).nullable().optional(),
4628
+ headingDecoration: headingDecorationSchema.nullable().optional(),
4629
+ // Author-level override consumed by later block/editor rendering phases.
4630
+ // Keeping it in section styles lets existing block save APIs persist it.
4631
+ headingDecorationOverride: z.enum(headingDecorationOverrideValues).nullable().optional(),
4632
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
4389
4633
  });
4390
4634
  containerStylesOverrideSchema = z.object({
4391
4635
  background: boxBackgroundSchema.nullable().optional(),
@@ -5075,7 +5319,7 @@ var init_soft_natural = __esm({
5075
5319
  });
5076
5320
 
5077
5321
  // ../theme-core/src/palette/variants/warm-neutral.ts
5078
- var warmNeutralClay, warmNeutralCream, warmNeutralForest;
5322
+ var warmNeutralClay, warmNeutralCream, warmNeutralSoftEarth, warmNeutralForest;
5079
5323
  var init_warm_neutral = __esm({
5080
5324
  "../theme-core/src/palette/variants/warm-neutral.ts"() {
5081
5325
  init_types11();
@@ -5123,6 +5367,28 @@ var init_warm_neutral = __esm({
5123
5367
  { name: "border", hex: "#e0d2b8" }
5124
5368
  ]
5125
5369
  });
5370
+ warmNeutralSoftEarth = definePaletteVariant({
5371
+ id: "warm-neutral-soft-earth",
5372
+ name: "Warm Neutral \u2014 Soft Earth",
5373
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
5374
+ tags: { tone: "classic", energy: "calm", era: "organic" },
5375
+ mode: "light",
5376
+ colors: [
5377
+ { name: "primary", hex: "#a8573d" },
5378
+ { name: "secondary", hex: "#72765c" },
5379
+ { name: "accent", hex: "#c87557" },
5380
+ { name: "success", hex: "#687854" },
5381
+ { name: "warning", hex: "#b7863e" },
5382
+ { name: "destructive", hex: "#a54b3c" },
5383
+ { name: "background", hex: "#fbf6eb" },
5384
+ { name: "surface", hex: "#fffdf7" },
5385
+ { name: "surfaceAlt", hex: "#f0e4d3" },
5386
+ { name: "muted", hex: "#eadbc6" },
5387
+ { name: "text", hex: "#30281f" },
5388
+ { name: "primaryForeground", hex: "#fffaf3" },
5389
+ { name: "border", hex: "#d9c8b2" }
5390
+ ]
5391
+ });
5126
5392
  warmNeutralForest = definePaletteVariant({
5127
5393
  id: "warm-neutral-forest",
5128
5394
  name: "Warm Neutral \u2014 Forest",
@@ -5169,6 +5435,7 @@ var init_variants = __esm({
5169
5435
  // Warm-neutral family
5170
5436
  warmNeutralClay,
5171
5437
  warmNeutralCream,
5438
+ warmNeutralSoftEarth,
5172
5439
  warmNeutralForest,
5173
5440
  // High-contrast family
5174
5441
  highContrastInk,
@@ -5196,6 +5463,12 @@ var init_customizableSurfaces = __esm({
5196
5463
  function asHeaderLookId(value) {
5197
5464
  return value;
5198
5465
  }
5466
+ function asHeaderLayoutId(value) {
5467
+ return value;
5468
+ }
5469
+ function asHeaderStyleId(value) {
5470
+ return value;
5471
+ }
5199
5472
  function baseHeader(theme) {
5200
5473
  const {
5201
5474
  navLinkStyle: _navLinkStyle,
@@ -5214,6 +5487,37 @@ function baseHeader(theme) {
5214
5487
  navContainer: { type: "none", tint: null, opacity: 0.15 }
5215
5488
  };
5216
5489
  }
5490
+ function supportedLayouts(ids) {
5491
+ return ids.map(asHeaderLayoutId);
5492
+ }
5493
+ function headerStyleRepairChain(values) {
5494
+ return values.map(asHeaderStyleId);
5495
+ }
5496
+ function getHeaderLayout(id) {
5497
+ return headerLayoutsById.get(id) ?? null;
5498
+ }
5499
+ function getHeaderStyle(id) {
5500
+ return headerStylesById.get(id) ?? null;
5501
+ }
5502
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
5503
+ return style.supportedLayoutIds.includes(layoutId);
5504
+ }
5505
+ function getHeaderStyleOrThrow(id) {
5506
+ const style = getHeaderStyle(id);
5507
+ if (!style) {
5508
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
5509
+ }
5510
+ return style;
5511
+ }
5512
+ function resolveLegacyHeaderLookAlias(lookId) {
5513
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
5514
+ }
5515
+ function getCompatibleHeaderStyleIds(layoutId) {
5516
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
5517
+ const style = getHeaderStyleOrThrow(styleId);
5518
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
5519
+ });
5520
+ }
5217
5521
  function solidBrandHeader(theme) {
5218
5522
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
5219
5523
  return {
@@ -5444,21 +5748,304 @@ function floatingGlassHeader(theme) {
5444
5748
  }
5445
5749
  };
5446
5750
  }
5751
+ function headerConfigurationKey(configuration) {
5752
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
5753
+ }
5447
5754
  function findHeaderLook(id) {
5448
5755
  return headerLooksById.get(id);
5449
5756
  }
5450
- var headerLookCatalog, headerLooksById;
5757
+ var headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, headerLooksById;
5451
5758
  var init_headerLooks = __esm({
5452
5759
  "../theme-core/src/site-styles/headerLooks.ts"() {
5453
5760
  init_headerCtaVariants();
5454
5761
  init_customizableSurfaces();
5455
5762
  init_types2();
5763
+ headerLayoutCatalog = [
5764
+ {
5765
+ id: asHeaderLayoutId("classic"),
5766
+ label: "Classic",
5767
+ description: "Logo and navigation in one practical horizontal row.",
5768
+ structure: "inline-classic",
5769
+ variant: "classic",
5770
+ defaultPositioning: "sticky",
5771
+ shrinkOnScroll: false
5772
+ },
5773
+ {
5774
+ id: asHeaderLayoutId("centered"),
5775
+ label: "Centered",
5776
+ description: "Logo centered above a balanced navigation row.",
5777
+ structure: "centered-stack",
5778
+ variant: "centered",
5779
+ defaultPositioning: "static",
5780
+ shrinkOnScroll: false,
5781
+ maxRecommendedNavItems: 5,
5782
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
5783
+ },
5784
+ {
5785
+ id: asHeaderLayoutId("editorial"),
5786
+ label: "Editorial",
5787
+ description: "A composed, magazine-like stacked header treatment.",
5788
+ structure: "editorial-stack",
5789
+ variant: "editorial",
5790
+ defaultPositioning: "static",
5791
+ shrinkOnScroll: false,
5792
+ maxRecommendedNavItems: 6
5793
+ },
5794
+ {
5795
+ id: asHeaderLayoutId("floating"),
5796
+ label: "Floating",
5797
+ description: "Detached header chrome that sits over the opening section.",
5798
+ structure: "floating-shell",
5799
+ variant: "floating",
5800
+ defaultPositioning: "fixed",
5801
+ shrinkOnScroll: true,
5802
+ maxRecommendedNavItems: 5,
5803
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
5804
+ }
5805
+ ];
5806
+ headerStyleCatalog = [
5807
+ {
5808
+ id: asHeaderStyleId("minimal"),
5809
+ label: "Minimal",
5810
+ description: "Quiet surface with simple color-change navigation.",
5811
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
5812
+ navInteraction: "color-change",
5813
+ surface: "neutral"
5814
+ },
5815
+ {
5816
+ id: asHeaderStyleId("fine-line"),
5817
+ label: "Fine Line",
5818
+ description: "Light surface with a crisp lower rule and underline hover.",
5819
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
5820
+ navInteraction: "underline-grow",
5821
+ surface: "bordered"
5822
+ },
5823
+ {
5824
+ id: asHeaderStyleId("soft-bar"),
5825
+ label: "Soft Bar",
5826
+ description: "Soft tinted surface with gentle pill hover states.",
5827
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5828
+ navInteraction: "pill-background",
5829
+ surface: "soft"
5830
+ },
5831
+ {
5832
+ id: asHeaderStyleId("pill-nav"),
5833
+ label: "Pill Nav",
5834
+ description: "A calm pill navigation rail over a neutral header.",
5835
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5836
+ navInteraction: "pill-background",
5837
+ surface: "soft"
5838
+ },
5839
+ {
5840
+ id: asHeaderStyleId("brand-bar"),
5841
+ label: "Brand Bar",
5842
+ description: "Solid brand surface with high-contrast navigation.",
5843
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
5844
+ navInteraction: "color-change",
5845
+ surface: "brand-solid"
5846
+ },
5847
+ {
5848
+ id: asHeaderStyleId("brand-underline"),
5849
+ label: "Brand Underline",
5850
+ description: "Brand surface with underline-grow navigation.",
5851
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
5852
+ navInteraction: "underline-grow",
5853
+ surface: "brand-solid"
5854
+ },
5855
+ {
5856
+ id: asHeaderStyleId("brand-pill"),
5857
+ label: "Brand Pill",
5858
+ description: "Solid brand surface with rounded active and hover states.",
5859
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
5860
+ navInteraction: "pill-background",
5861
+ surface: "brand-solid"
5862
+ },
5863
+ {
5864
+ id: asHeaderStyleId("editorial-line"),
5865
+ label: "Editorial Line",
5866
+ description: "Typographic logo treatment with understated underline navigation.",
5867
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
5868
+ navInteraction: "underline-grow",
5869
+ surface: "bordered"
5870
+ },
5871
+ {
5872
+ id: asHeaderStyleId("flat-tabs"),
5873
+ label: "Flat Tabs",
5874
+ description: "Flat block hover and active states with a Swiss utility feel.",
5875
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
5876
+ navInteraction: "flat-block",
5877
+ surface: "bordered"
5878
+ },
5879
+ {
5880
+ id: asHeaderStyleId("glass"),
5881
+ label: "Glass",
5882
+ description: "Floating translucent chrome with frosted navigation backing.",
5883
+ supportedLayoutIds: supportedLayouts(["floating"]),
5884
+ navInteraction: "glass-backed",
5885
+ surface: "floating",
5886
+ requiresFloatingLayout: true
5887
+ },
5888
+ {
5889
+ id: asHeaderStyleId("minimal-surface"),
5890
+ label: "Minimal Surface",
5891
+ description: "Floating chrome with a restrained translucent surface.",
5892
+ supportedLayoutIds: supportedLayouts(["floating"]),
5893
+ navInteraction: "color-change",
5894
+ surface: "floating",
5895
+ requiresFloatingLayout: true
5896
+ },
5897
+ {
5898
+ id: asHeaderStyleId("soft-shell"),
5899
+ label: "Soft Shell",
5900
+ description: "Floating rounded shell with soft pill navigation states.",
5901
+ supportedLayoutIds: supportedLayouts(["floating"]),
5902
+ navInteraction: "pill-background",
5903
+ surface: "floating",
5904
+ requiresFloatingLayout: true
5905
+ }
5906
+ ];
5907
+ headerLayoutsById = new Map(
5908
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
5909
+ );
5910
+ headerStylesById = new Map(
5911
+ headerStyleCatalog.map((style) => [style.id, style])
5912
+ );
5913
+ headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
5914
+ [
5915
+ asHeaderLayoutId("classic"),
5916
+ headerStyleRepairChain([
5917
+ "minimal",
5918
+ "fine-line",
5919
+ "soft-bar",
5920
+ "pill-nav",
5921
+ "brand-bar",
5922
+ "brand-underline",
5923
+ "brand-pill",
5924
+ "editorial-line",
5925
+ "flat-tabs"
5926
+ ])
5927
+ ],
5928
+ [
5929
+ asHeaderLayoutId("centered"),
5930
+ headerStyleRepairChain([
5931
+ "minimal",
5932
+ "fine-line",
5933
+ "soft-bar",
5934
+ "pill-nav",
5935
+ "brand-bar",
5936
+ "brand-pill",
5937
+ "editorial-line",
5938
+ "flat-tabs"
5939
+ ])
5940
+ ],
5941
+ [
5942
+ asHeaderLayoutId("editorial"),
5943
+ headerStyleRepairChain([
5944
+ "minimal",
5945
+ "fine-line",
5946
+ "soft-bar",
5947
+ "brand-bar",
5948
+ "brand-underline",
5949
+ "editorial-line",
5950
+ "flat-tabs"
5951
+ ])
5952
+ ],
5953
+ [
5954
+ asHeaderLayoutId("floating"),
5955
+ headerStyleRepairChain([
5956
+ "glass",
5957
+ "minimal-surface",
5958
+ "soft-shell",
5959
+ "brand-pill"
5960
+ ])
5961
+ ]
5962
+ ]);
5963
+ /* @__PURE__ */ new Map([
5964
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
5965
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
5966
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
5967
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
5968
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
5969
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
5970
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
5971
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
5972
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
5973
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
5974
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
5975
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
5976
+ ]);
5977
+ legacyHeaderLookAliases = [
5978
+ {
5979
+ lookId: asHeaderLookId("clean-base"),
5980
+ selection: {
5981
+ layoutId: asHeaderLayoutId("classic"),
5982
+ styleId: asHeaderStyleId("minimal")
5983
+ }
5984
+ },
5985
+ {
5986
+ lookId: asHeaderLookId("brand-solid"),
5987
+ selection: {
5988
+ layoutId: asHeaderLayoutId("classic"),
5989
+ styleId: asHeaderStyleId("brand-bar")
5990
+ }
5991
+ },
5992
+ {
5993
+ lookId: asHeaderLookId("editorial-line"),
5994
+ selection: {
5995
+ layoutId: asHeaderLayoutId("editorial"),
5996
+ styleId: asHeaderStyleId("editorial-line")
5997
+ }
5998
+ },
5999
+ {
6000
+ lookId: asHeaderLookId("centered-calm"),
6001
+ selection: {
6002
+ layoutId: asHeaderLayoutId("centered"),
6003
+ styleId: asHeaderStyleId("minimal")
6004
+ }
6005
+ },
6006
+ {
6007
+ lookId: asHeaderLookId("practical-utility"),
6008
+ selection: {
6009
+ layoutId: asHeaderLayoutId("classic"),
6010
+ styleId: asHeaderStyleId("flat-tabs")
6011
+ }
6012
+ },
6013
+ {
6014
+ lookId: asHeaderLookId("minimal-transparent"),
6015
+ selection: {
6016
+ layoutId: asHeaderLayoutId("classic"),
6017
+ styleId: asHeaderStyleId("minimal")
6018
+ }
6019
+ },
6020
+ {
6021
+ lookId: asHeaderLookId("transparent-overlay"),
6022
+ selection: {
6023
+ layoutId: asHeaderLayoutId("floating"),
6024
+ styleId: asHeaderStyleId("glass")
6025
+ }
6026
+ },
6027
+ {
6028
+ lookId: asHeaderLookId("floating-glass"),
6029
+ selection: {
6030
+ layoutId: asHeaderLayoutId("floating"),
6031
+ styleId: asHeaderStyleId("glass")
6032
+ }
6033
+ }
6034
+ ];
6035
+ legacyHeaderLookAliasesById = new Map(
6036
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
6037
+ );
5456
6038
  headerLookCatalog = [
5457
6039
  {
5458
6040
  id: asHeaderLookId("clean-base"),
5459
6041
  label: "Clean base",
5460
6042
  visualTreatment: "solid-neutral",
5461
6043
  layoutBehavior: "sticky",
6044
+ configuration: {
6045
+ structure: "inline-classic",
6046
+ treatment: "solid-neutral",
6047
+ behavior: "sticky"
6048
+ },
5462
6049
  openingRequirement: "none",
5463
6050
  compile: cleanBaseHeader
5464
6051
  },
@@ -5467,6 +6054,11 @@ var init_headerLooks = __esm({
5467
6054
  label: "Brand solid",
5468
6055
  visualTreatment: "solid-brand",
5469
6056
  layoutBehavior: "sticky-shrink",
6057
+ configuration: {
6058
+ structure: "inline-classic",
6059
+ treatment: "solid-brand",
6060
+ behavior: "sticky-shrink"
6061
+ },
5470
6062
  openingRequirement: "none",
5471
6063
  compile: solidBrandHeader
5472
6064
  },
@@ -5475,6 +6067,11 @@ var init_headerLooks = __esm({
5475
6067
  label: "Editorial line",
5476
6068
  visualTreatment: "light-editorial",
5477
6069
  layoutBehavior: "sticky",
6070
+ configuration: {
6071
+ structure: "editorial-stack",
6072
+ treatment: "light-editorial",
6073
+ behavior: "sticky"
6074
+ },
5478
6075
  openingRequirement: "none",
5479
6076
  maxRecommendedNavItems: 6,
5480
6077
  compile: editorialLineHeader
@@ -5484,6 +6081,11 @@ var init_headerLooks = __esm({
5484
6081
  label: "Centered calm",
5485
6082
  visualTreatment: "light-editorial",
5486
6083
  layoutBehavior: "normal-flow",
6084
+ configuration: {
6085
+ structure: "centered-stack",
6086
+ treatment: "light-editorial",
6087
+ behavior: "normal-flow"
6088
+ },
5487
6089
  openingRequirement: "none",
5488
6090
  maxRecommendedNavItems: 5,
5489
6091
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -5494,6 +6096,11 @@ var init_headerLooks = __esm({
5494
6096
  label: "Practical utility",
5495
6097
  visualTreatment: "solid-neutral",
5496
6098
  layoutBehavior: "sticky-shrink",
6099
+ configuration: {
6100
+ structure: "inline-classic",
6101
+ treatment: "solid-neutral",
6102
+ behavior: "sticky-shrink"
6103
+ },
5497
6104
  openingRequirement: "none",
5498
6105
  requiresProminentCta: true,
5499
6106
  compile: practicalUtilityHeader
@@ -5503,6 +6110,11 @@ var init_headerLooks = __esm({
5503
6110
  label: "Minimal transparent",
5504
6111
  visualTreatment: "minimal-transparent",
5505
6112
  layoutBehavior: "normal-flow",
6113
+ configuration: {
6114
+ structure: "inline-classic",
6115
+ treatment: "minimal-transparent",
6116
+ behavior: "normal-flow"
6117
+ },
5506
6118
  openingRequirement: "reserved-space-ok",
5507
6119
  compile: minimalTransparentHeader
5508
6120
  },
@@ -5511,6 +6123,11 @@ var init_headerLooks = __esm({
5511
6123
  label: "Transparent overlay",
5512
6124
  visualTreatment: "transparent-overlay",
5513
6125
  layoutBehavior: "fixed-overlay",
6126
+ configuration: {
6127
+ structure: "inline-classic",
6128
+ treatment: "transparent-overlay",
6129
+ behavior: "fixed-overlay"
6130
+ },
5514
6131
  openingRequirement: "requires-image-hero-with-contrast-overlay",
5515
6132
  maxRecommendedNavItems: 5,
5516
6133
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -5521,12 +6138,22 @@ var init_headerLooks = __esm({
5521
6138
  label: "Floating glass",
5522
6139
  visualTreatment: "floating-glass",
5523
6140
  layoutBehavior: "fixed-floating",
6141
+ configuration: {
6142
+ structure: "floating-shell",
6143
+ treatment: "floating-glass",
6144
+ behavior: "fixed-floating"
6145
+ },
5524
6146
  openingRequirement: "requires-image-hero-with-contrast-overlay",
5525
6147
  maxRecommendedNavItems: 5,
5526
6148
  allowedLogoShapes: ["none", "text-only", "horizontal"],
5527
6149
  compile: floatingGlassHeader
5528
6150
  }
5529
6151
  ];
6152
+ guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
6153
+ guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
6154
+ new Set(
6155
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
6156
+ );
5530
6157
  headerLooksById = new Map(
5531
6158
  headerLookCatalog.map((look) => [look.id, look])
5532
6159
  );
@@ -5685,6 +6312,272 @@ var init_sourceCatalogs = __esm({
5685
6312
  }
5686
6313
  });
5687
6314
 
6315
+ // ../theme-core/src/site-styles/typographyPresets.ts
6316
+ function asTypographyPresetId(value) {
6317
+ if (!value.startsWith("typography-preset:")) {
6318
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
6319
+ }
6320
+ return value;
6321
+ }
6322
+ function defineTypographyPreset(preset2) {
6323
+ return {
6324
+ ...preset2,
6325
+ id: asTypographyPresetId(preset2.id)
6326
+ };
6327
+ }
6328
+ function findTypographyPreset(id) {
6329
+ return typographyPresetsById.get(id);
6330
+ }
6331
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, boldDisplayTypography, typographyPresets, typographyPresetsById;
6332
+ var init_typographyPresets = __esm({
6333
+ "../theme-core/src/site-styles/typographyPresets.ts"() {
6334
+ bodyReadablePolicy = {
6335
+ recommendedCategories: ["sans-serif", "serif"],
6336
+ allowedCategories: ["sans-serif", "serif"],
6337
+ requiresItalicForBody: true,
6338
+ requiresBoldForBody: true
6339
+ };
6340
+ headingFlexiblePolicy = {
6341
+ recommendedCategories: ["sans-serif", "serif", "display"],
6342
+ allowedCategories: ["sans-serif", "serif", "display"]
6343
+ };
6344
+ displayHeadingPolicy = {
6345
+ recommendedCategories: ["display", "sans-serif", "serif"],
6346
+ allowedCategories: ["display", "sans-serif", "serif"]
6347
+ };
6348
+ modernSansTypography = {
6349
+ body: {
6350
+ family: "Inter, system-ui, sans-serif",
6351
+ size: "md",
6352
+ weight: "regular",
6353
+ lineHeight: "relaxed",
6354
+ letterSpacing: "normal"
6355
+ },
6356
+ headings: {
6357
+ default: {
6358
+ family: "Inter, system-ui, sans-serif",
6359
+ weight: "semibold",
6360
+ lineHeight: "normal",
6361
+ letterSpacing: "tight",
6362
+ italic: null,
6363
+ case: null
6364
+ },
6365
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6366
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6367
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
6368
+ },
6369
+ scale: "balanced"
6370
+ };
6371
+ warmRoundedTypography = {
6372
+ body: {
6373
+ family: "Nunito Sans, system-ui, sans-serif",
6374
+ size: "lg",
6375
+ weight: "regular",
6376
+ lineHeight: "relaxed",
6377
+ letterSpacing: "normal"
6378
+ },
6379
+ headings: {
6380
+ default: {
6381
+ family: "Nunito Sans, system-ui, sans-serif",
6382
+ weight: "bold",
6383
+ lineHeight: "normal",
6384
+ letterSpacing: "normal",
6385
+ italic: null,
6386
+ case: null
6387
+ },
6388
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6389
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6390
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
6391
+ },
6392
+ scale: "balanced"
6393
+ };
6394
+ editorialSerifTypography = {
6395
+ body: {
6396
+ family: "Lora, Georgia, serif",
6397
+ size: "lg",
6398
+ weight: "regular",
6399
+ lineHeight: "loose",
6400
+ letterSpacing: "normal"
6401
+ },
6402
+ headings: {
6403
+ default: {
6404
+ family: "Playfair Display, Georgia, serif",
6405
+ weight: "semibold",
6406
+ lineHeight: "normal",
6407
+ letterSpacing: "tight",
6408
+ italic: null,
6409
+ case: null
6410
+ },
6411
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6412
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6413
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
6414
+ },
6415
+ scale: "spacious"
6416
+ };
6417
+ classicSerifTypography = {
6418
+ body: {
6419
+ family: "Libre Baskerville, Georgia, serif",
6420
+ size: "md",
6421
+ weight: "regular",
6422
+ lineHeight: "relaxed",
6423
+ letterSpacing: "normal"
6424
+ },
6425
+ headings: {
6426
+ default: {
6427
+ family: "Cormorant Garamond, Georgia, serif",
6428
+ weight: "semibold",
6429
+ lineHeight: "normal",
6430
+ letterSpacing: "normal",
6431
+ italic: null,
6432
+ case: null
6433
+ },
6434
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6435
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6436
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
6437
+ },
6438
+ scale: "balanced"
6439
+ };
6440
+ luxeContrastTypography = {
6441
+ body: {
6442
+ family: "Manrope, system-ui, sans-serif",
6443
+ size: "md",
6444
+ weight: "regular",
6445
+ lineHeight: "relaxed",
6446
+ letterSpacing: "normal"
6447
+ },
6448
+ headings: {
6449
+ default: {
6450
+ family: "Cormorant Garamond, Georgia, serif",
6451
+ weight: "semibold",
6452
+ lineHeight: "normal",
6453
+ letterSpacing: "tight",
6454
+ italic: null,
6455
+ case: null
6456
+ },
6457
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6458
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6459
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
6460
+ },
6461
+ scale: "spacious"
6462
+ };
6463
+ boldDisplayTypography = {
6464
+ body: {
6465
+ family: "Manrope, system-ui, sans-serif",
6466
+ size: "lg",
6467
+ weight: "regular",
6468
+ lineHeight: "relaxed",
6469
+ letterSpacing: "normal"
6470
+ },
6471
+ headings: {
6472
+ default: {
6473
+ family: '"TAN - PEARL", sans-serif',
6474
+ weight: "bold",
6475
+ lineHeight: "normal",
6476
+ letterSpacing: "tight",
6477
+ colorToken: "primary",
6478
+ italic: null,
6479
+ case: null
6480
+ },
6481
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6482
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6483
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
6484
+ },
6485
+ scale: "balanced"
6486
+ };
6487
+ typographyPresets = [
6488
+ defineTypographyPreset({
6489
+ id: "typography-preset:modern-sans",
6490
+ name: "Modern Sans",
6491
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
6492
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
6493
+ recommendedFonts: {
6494
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
6495
+ heading: ["Inter", "Manrope", "Source Sans 3"]
6496
+ },
6497
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
6498
+ typography: modernSansTypography
6499
+ }),
6500
+ defineTypographyPreset({
6501
+ id: "typography-preset:warm-rounded",
6502
+ name: "Warm Rounded",
6503
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
6504
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
6505
+ recommendedFonts: {
6506
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
6507
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
6508
+ },
6509
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
6510
+ typography: warmRoundedTypography
6511
+ }),
6512
+ defineTypographyPreset({
6513
+ id: "typography-preset:editorial-serif",
6514
+ name: "Editorial Serif",
6515
+ description: "Story-led type with warm reading rhythm and expressive headings.",
6516
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
6517
+ recommendedFonts: {
6518
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
6519
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
6520
+ },
6521
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6522
+ typography: editorialSerifTypography
6523
+ }),
6524
+ defineTypographyPreset({
6525
+ id: "typography-preset:classic-serif",
6526
+ name: "Classic Serif",
6527
+ description: "Measured, polished type for premium and established offers.",
6528
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
6529
+ recommendedFonts: {
6530
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
6531
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
6532
+ },
6533
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6534
+ typography: classicSerifTypography
6535
+ }),
6536
+ defineTypographyPreset({
6537
+ id: "typography-preset:luxe-contrast",
6538
+ name: "Luxe Contrast",
6539
+ description: "A restrained sans body paired with elegant high-contrast headings.",
6540
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
6541
+ recommendedFonts: {
6542
+ body: ["Manrope", "Inter", "Source Sans 3"],
6543
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
6544
+ },
6545
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6546
+ typography: luxeContrastTypography
6547
+ }),
6548
+ defineTypographyPreset({
6549
+ id: "typography-preset:bold-display",
6550
+ name: "Bold Display",
6551
+ description: "Punchy display headings with readable sans body copy for branded launches.",
6552
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
6553
+ recommendedFonts: {
6554
+ body: ["Manrope", "Inter", "Space Grotesk"],
6555
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
6556
+ },
6557
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6558
+ typography: boldDisplayTypography,
6559
+ heroTypography: {
6560
+ headlineSize: "6xl",
6561
+ headlineLineHeight: "tight",
6562
+ subheadlineSize: "editorial",
6563
+ subheadlineLineHeight: "normal",
6564
+ microHeadlineSize: "6xl",
6565
+ microHeadlineLineHeight: "tight",
6566
+ microSubheadlineSize: "xl",
6567
+ microSubheadlineLineHeight: "normal",
6568
+ responsive: {
6569
+ tablet: { headlineSize: "5xl" },
6570
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
6571
+ }
6572
+ }
6573
+ })
6574
+ ];
6575
+ typographyPresetsById = new Map(
6576
+ typographyPresets.map((preset2) => [preset2.id, preset2])
6577
+ );
6578
+ }
6579
+ });
6580
+
5688
6581
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
5689
6582
  function uniqueContentFrameKinds() {
5690
6583
  const kinds = [...new Set(
@@ -5697,6 +6590,15 @@ function uniqueContentFrameKinds() {
5697
6590
  return [firstKind, ...kinds.slice(1)];
5698
6591
  }
5699
6592
  function defineCuratedSiteStyle(input) {
6593
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
6594
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
6595
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
6596
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
6597
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
6598
+ throw new Error(
6599
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
6600
+ );
6601
+ }
5700
6602
  return {
5701
6603
  id: asSiteStyleId(input.id),
5702
6604
  name: input.name,
@@ -5717,11 +6619,23 @@ function defineCuratedSiteStyle(input) {
5717
6619
  },
5718
6620
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
5719
6621
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
5720
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
6622
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
6623
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
6624
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
6625
+ } : inferredHeaderCuration.defaultHeaderSelection,
6626
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
6627
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
6628
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
6629
+ layoutId: asHeaderLayoutId(selection.layoutId),
6630
+ styleId: asHeaderStyleId(selection.styleId)
6631
+ })),
6632
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
5721
6633
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
5722
6634
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
5723
6635
  buttonPersonalityChoices: input.buttonPersonalityChoices,
5724
- paletteVariantChoices: input.paletteVariantChoices
6636
+ paletteVariantChoices: input.paletteVariantChoices,
6637
+ typographyPresetChoices,
6638
+ defaultTypographyPresetId
5725
6639
  };
5726
6640
  }
5727
6641
  function buttonChoice(id, note) {
@@ -5730,7 +6644,92 @@ function buttonChoice(id, note) {
5730
6644
  function paletteChoice(id, note) {
5731
6645
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
5732
6646
  }
5733
- var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles;
6647
+ function headerLayoutChoice(id, note) {
6648
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
6649
+ }
6650
+ function headerStyleChoice(id, note) {
6651
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
6652
+ }
6653
+ function headerLayoutRecordKey(id) {
6654
+ return id;
6655
+ }
6656
+ function uniqueHeaderLayoutChoices(choices) {
6657
+ const seen = /* @__PURE__ */ new Set();
6658
+ const unique = choices.filter((choice) => {
6659
+ if (seen.has(choice.id)) return false;
6660
+ seen.add(choice.id);
6661
+ return true;
6662
+ });
6663
+ const first = unique[0];
6664
+ if (!first) {
6665
+ throw new Error("Expected at least one curated header layout choice.");
6666
+ }
6667
+ return [first, ...unique.slice(1)];
6668
+ }
6669
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
6670
+ const first = choices[0] ?? {
6671
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
6672
+ };
6673
+ return [first, ...choices.slice(1)];
6674
+ }
6675
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
6676
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
6677
+ const defaultHeaderSelection = selections[0] ?? {
6678
+ layoutId: asHeaderLayoutId("classic"),
6679
+ styleId: asHeaderStyleId("minimal")
6680
+ };
6681
+ const layoutChoices = uniqueHeaderLayoutChoices(
6682
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
6683
+ );
6684
+ const stylesByLayout = {};
6685
+ for (const layoutChoice of layoutChoices) {
6686
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
6687
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
6688
+ styleChoices,
6689
+ layoutChoice.id
6690
+ );
6691
+ }
6692
+ return {
6693
+ defaultHeaderSelection,
6694
+ recommendedHeaderLayoutChoices: layoutChoices,
6695
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
6696
+ };
6697
+ }
6698
+ function typographyChoice(id, note) {
6699
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
6700
+ }
6701
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
6702
+ switch (recipe) {
6703
+ case "clean-sans":
6704
+ return [
6705
+ typographyChoice("typography-preset:modern-sans"),
6706
+ typographyChoice("typography-preset:luxe-contrast"),
6707
+ typographyChoice("typography-preset:bold-display")
6708
+ ];
6709
+ case "friendly-sans":
6710
+ return [
6711
+ typographyChoice("typography-preset:warm-rounded"),
6712
+ typographyChoice("typography-preset:modern-sans"),
6713
+ typographyChoice("typography-preset:editorial-serif")
6714
+ ];
6715
+ case "serif-editorial":
6716
+ return [
6717
+ typographyChoice("typography-preset:editorial-serif"),
6718
+ typographyChoice("typography-preset:classic-serif"),
6719
+ typographyChoice("typography-preset:warm-rounded")
6720
+ ];
6721
+ case "classic-serif":
6722
+ return [
6723
+ typographyChoice("typography-preset:classic-serif"),
6724
+ typographyChoice("typography-preset:luxe-contrast"),
6725
+ typographyChoice("typography-preset:editorial-serif")
6726
+ ];
6727
+ }
6728
+ }
6729
+ function getCuratedSiteStyle(id) {
6730
+ return curatedSiteStylesById.get(id) ?? null;
6731
+ }
6732
+ var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
5734
6733
  var init_curatedSiteStyles = __esm({
5735
6734
  "../theme-core/src/site-styles/curatedSiteStyles.ts"() {
5736
6735
  init_personalities();
@@ -5740,6 +6739,7 @@ var init_curatedSiteStyles = __esm({
5740
6739
  init_curatedChoices();
5741
6740
  init_sourceCatalogs();
5742
6741
  init_types2();
6742
+ init_typographyPresets();
5743
6743
  curatedSiteStyleIdValues = [
5744
6744
  "site-style:calm-studio",
5745
6745
  "site-style:clear-professional",
@@ -5751,6 +6751,7 @@ var init_curatedSiteStyles = __esm({
5751
6751
  "site-style:personal-retreat-journal",
5752
6752
  "site-style:tactile-workshop",
5753
6753
  "site-style:modern-wellness",
6754
+ "site-style:soft-earth",
5754
6755
  "site-style:bold-launch",
5755
6756
  "site-style:south-west-twerk-school"
5756
6757
  ];
@@ -6141,6 +7142,102 @@ var init_curatedSiteStyles = __esm({
6141
7142
  paletteChoice("warm-neutral-clay")
6142
7143
  ]
6143
7144
  }),
7145
+ defineCuratedSiteStyle({
7146
+ id: "site-style:soft-earth",
7147
+ name: "Soft Earth",
7148
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
7149
+ 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.",
7150
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
7151
+ selectionKeywordRules: [
7152
+ { kind: "word", value: "meditation" },
7153
+ { kind: "word", value: "wellbeing" },
7154
+ { kind: "substring", value: "retreat" },
7155
+ { kind: "phrase", value: "yoga studio" },
7156
+ { kind: "phrase", value: "mindful movement" }
7157
+ ],
7158
+ tokenRecipes: {
7159
+ palette: "warm-neutral",
7160
+ contrast: "standard",
7161
+ radius: "soft",
7162
+ shadow: "subtle",
7163
+ typography: "serif-editorial",
7164
+ spacing: "airy",
7165
+ motion: "subtle"
7166
+ },
7167
+ compositionBudget: balancedBudget,
7168
+ themeOverrides: {
7169
+ typography: {
7170
+ body: {
7171
+ family: "Inter, system-ui, sans-serif",
7172
+ size: "md",
7173
+ weight: "regular",
7174
+ lineHeight: "relaxed",
7175
+ letterSpacing: "normal"
7176
+ },
7177
+ headings: {
7178
+ default: {
7179
+ family: '"Cormorant Garamond", Georgia, serif',
7180
+ weight: "regular",
7181
+ lineHeight: "normal",
7182
+ letterSpacing: "normal",
7183
+ colorToken: "text",
7184
+ italic: null,
7185
+ case: null
7186
+ },
7187
+ h1: {
7188
+ size: "xl",
7189
+ weight: "regular",
7190
+ lineHeight: "normal",
7191
+ letterSpacing: "normal",
7192
+ italic: null
7193
+ },
7194
+ h2: {
7195
+ size: "lg",
7196
+ weight: "regular",
7197
+ lineHeight: "normal",
7198
+ letterSpacing: "normal",
7199
+ italic: null
7200
+ },
7201
+ h3: {
7202
+ size: "md",
7203
+ weight: "regular",
7204
+ lineHeight: "normal",
7205
+ letterSpacing: "normal",
7206
+ italic: null
7207
+ }
7208
+ },
7209
+ scale: "majorThird"
7210
+ },
7211
+ bodyText: {
7212
+ intro: {
7213
+ paragraphSize: "default",
7214
+ headingSize: "editorial"
7215
+ }
7216
+ }
7217
+ },
7218
+ recommendedAppearancePresetIds: [
7219
+ "hero-brand-scrim",
7220
+ "intro-soft-earth-statement",
7221
+ "feature-cards-soft-earth-offerings",
7222
+ "testimonials-soft-earth-proof-band",
7223
+ "faq-soft-earth-two-column",
7224
+ "contact-form-panel"
7225
+ ],
7226
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
7227
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
7228
+ buttonPersonalityChoices: [
7229
+ buttonChoice("earth-pill"),
7230
+ buttonChoice("soft-pill"),
7231
+ buttonChoice("pebble"),
7232
+ buttonChoice("editorial-link")
7233
+ ],
7234
+ paletteVariantChoices: [
7235
+ paletteChoice("warm-neutral-soft-earth"),
7236
+ paletteChoice("warm-neutral-clay"),
7237
+ paletteChoice("warm-neutral-forest"),
7238
+ paletteChoice("soft-natural-sage")
7239
+ ]
7240
+ }),
6144
7241
  defineCuratedSiteStyle({
6145
7242
  id: "site-style:bold-launch",
6146
7243
  name: "Bold Launch",
@@ -6194,49 +7291,13 @@ var init_curatedSiteStyles = __esm({
6194
7291
  motion: "expressive"
6195
7292
  },
6196
7293
  compositionBudget: expressiveBudget,
7294
+ typographyPresetChoices: [
7295
+ typographyChoice("typography-preset:bold-display"),
7296
+ typographyChoice("typography-preset:modern-sans"),
7297
+ typographyChoice("typography-preset:luxe-contrast")
7298
+ ],
7299
+ defaultTypographyPresetId: "typography-preset:bold-display",
6197
7300
  themeOverrides: {
6198
- typography: {
6199
- body: {
6200
- family: "Manrope, system-ui, sans-serif",
6201
- size: "lg",
6202
- weight: "regular",
6203
- lineHeight: "relaxed",
6204
- letterSpacing: "normal"
6205
- },
6206
- headings: {
6207
- default: {
6208
- family: '"TAN - PEARL", sans-serif',
6209
- weight: "bold",
6210
- lineHeight: "normal",
6211
- letterSpacing: "tight",
6212
- colorToken: "primary",
6213
- italic: null,
6214
- case: null
6215
- },
6216
- h1: {
6217
- size: "xl",
6218
- weight: "bold",
6219
- lineHeight: "normal",
6220
- letterSpacing: "tight",
6221
- italic: null
6222
- },
6223
- h2: {
6224
- size: "lg",
6225
- weight: "bold",
6226
- lineHeight: "normal",
6227
- letterSpacing: "normal",
6228
- italic: null
6229
- },
6230
- h3: {
6231
- size: "md",
6232
- weight: "bold",
6233
- lineHeight: "normal",
6234
- letterSpacing: "normal",
6235
- italic: null
6236
- }
6237
- },
6238
- scale: "balanced"
6239
- },
6240
7301
  bodyText: {
6241
7302
  intro: {
6242
7303
  paragraphSize: "editorial",
@@ -6268,7 +7329,7 @@ var init_curatedSiteStyles = __esm({
6268
7329
  ]
6269
7330
  })
6270
7331
  ];
6271
- new Map(
7332
+ curatedSiteStylesById = new Map(
6272
7333
  curatedSiteStyles.map((style) => [style.id, style])
6273
7334
  );
6274
7335
  }
@@ -6586,6 +7647,7 @@ var init_previewCompiler = __esm({
6586
7647
  init_variants();
6587
7648
  init_curatedChoices();
6588
7649
  init_curatedSiteStyles();
7650
+ init_typographyPresets();
6589
7651
  init_resolver2();
6590
7652
  init_types2();
6591
7653
  init_footerLooks();
@@ -6599,6 +7661,7 @@ var init_previewCompiler = __esm({
6599
7661
  init_runtimeCompiler();
6600
7662
  init_curatedChoices();
6601
7663
  init_curatedSiteStyles();
7664
+ init_typographyPresets();
6602
7665
  init_types2();
6603
7666
  }
6604
7667
  });
@@ -6865,6 +7928,12 @@ var init_pageDesignEditorErrors = __esm({
6865
7928
  "../theme-core/src/site-styles/pageDesignEditorErrors.ts"() {
6866
7929
  }
6867
7930
  });
7931
+
7932
+ // ../theme-core/src/site-styles/persistedIdParseResult.ts
7933
+ var init_persistedIdParseResult = __esm({
7934
+ "../theme-core/src/site-styles/persistedIdParseResult.ts"() {
7935
+ }
7936
+ });
6868
7937
  var themeTokenRecipeOptions;
6869
7938
  var init_tokenRecipes = __esm({
6870
7939
  "../theme-core/src/site-styles/tokenRecipes.ts"() {
@@ -6918,6 +7987,7 @@ var init_site_styles = __esm({
6918
7987
  init_pageDesignEditorModel();
6919
7988
  init_pageDesignIntent();
6920
7989
  init_previewCustomization();
7990
+ init_persistedIdParseResult();
6921
7991
  init_rawStyleFields();
6922
7992
  init_records();
6923
7993
  init_resolver2();
@@ -6926,6 +7996,7 @@ var init_site_styles = __esm({
6926
7996
  init_sourceCatalogs();
6927
7997
  init_styleTags();
6928
7998
  init_tokenRecipes();
7999
+ init_typographyPresets();
6929
8000
  init_types2();
6930
8001
  }
6931
8002
  });
@@ -10998,8 +12069,9 @@ var init_faqAccordion = __esm({
10998
12069
  },
10999
12070
  fallback: "rb-faq-item"
11000
12071
  },
11001
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
11002
- // Pass icon style from theme
12072
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
12073
+ // Legacy theme accordion style
12074
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
11003
12075
  },
11004
12076
  triggerFrom: "faqItem.question",
11005
12077
  contentFrom: "faqItem.answer"
@@ -21643,6 +22715,9 @@ init_schema2();
21643
22715
  var TEL_RE = /^[+()0-9\s-]{3,}$/;
21644
22716
  var SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
21645
22717
  var ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
22718
+ var DATE_PATTERN = /^(?<year>[1-9]\d{3})-(?<month>\d{2})-(?<day>\d{2})$/;
22719
+ var TIME_PATTERN = /^(?<hours>[01]\d|2[0-3]):(?<minutes>[0-5]\d)$/;
22720
+ var DATETIME_PATTERN = /^(?<date>[1-9]\d{3}-\d{2}-\d{2})T(?<time>(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)(?:\.\d+)?(?<offset>Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/;
21646
22721
  function assertNever2(value) {
21647
22722
  throw new Error(`Unhandled field validation variant: ${JSON.stringify(value)}`);
21648
22723
  }
@@ -21675,6 +22750,12 @@ function fieldIssueToMessage(issue2) {
21675
22750
  return "Check the format and try again";
21676
22751
  case "invalidUrl":
21677
22752
  return "Enter a valid web address";
22753
+ case "invalidDate":
22754
+ return "Choose a valid date";
22755
+ case "invalidTime":
22756
+ return "Choose a valid time";
22757
+ case "invalidDateTime":
22758
+ return "Choose a valid date and time";
21678
22759
  case "invalidNumber":
21679
22760
  return `${issue2.label} needs a number`;
21680
22761
  case "tooSmall":
@@ -21711,12 +22792,16 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21711
22792
  case "text": {
21712
22793
  const inputType = field.ui?.inputType;
21713
22794
  if (inputType === "number") {
21714
- const constraints2 = commonConstraints(required, { kind: "numberType" });
22795
+ const constraints2 = commonConstraints(required, {
22796
+ kind: "numberType"
22797
+ });
21715
22798
  if (typeof field.ui?.min === "number") constraints2.push({ kind: "numberMin", minimum: field.ui.min });
21716
22799
  if (typeof field.ui?.max === "number") constraints2.push({ kind: "numberMax", maximum: field.ui.max });
21717
22800
  return makePlan("number", "number", field, path24, required, constraints2);
21718
22801
  }
21719
- const constraints = commonConstraints(required, { kind: "textType" });
22802
+ const constraints = commonConstraints(required, {
22803
+ kind: "textType"
22804
+ });
21720
22805
  if (inputType === "email") constraints.push({ kind: "emailFormat" });
21721
22806
  if (inputType === "tel") constraints.push({ kind: "phoneFormat" });
21722
22807
  if (field.ui?.pattern) constraints.push({ kind: "patternFormat", pattern: field.ui.pattern });
@@ -21724,7 +22809,9 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21724
22809
  return makePlan("string", "string", field, path24, required, constraints);
21725
22810
  }
21726
22811
  case "number": {
21727
- const constraints = commonConstraints(required, { kind: "numberType" });
22812
+ const constraints = commonConstraints(required, {
22813
+ kind: "numberType"
22814
+ });
21728
22815
  if (typeof field.min === "number") constraints.push({ kind: "numberMin", minimum: field.min });
21729
22816
  if (typeof field.max === "number") constraints.push({ kind: "numberMax", maximum: field.max });
21730
22817
  return makePlan("number", "number", field, path24, required, constraints);
@@ -21735,23 +22822,42 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21735
22822
  return makePlan("string", "string", field, path24, required, constraints);
21736
22823
  }
21737
22824
  case "url":
21738
- return makePlan("string", "string", field, path24, required, commonConstraints(
22825
+ return makePlan(
22826
+ "string",
22827
+ "string",
22828
+ field,
22829
+ path24,
21739
22830
  required,
21740
- { kind: "textType" },
21741
- { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) }
21742
- ));
22831
+ commonConstraints(required, { kind: "textType" }, { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) })
22832
+ );
21743
22833
  case "reference":
21744
22834
  return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "referenceText" }));
21745
22835
  case "date":
22836
+ return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }, { kind: "dateFormat" }));
21746
22837
  case "time":
22838
+ return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }, { kind: "timeFormat" }));
21747
22839
  case "datetime":
21748
- return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }));
22840
+ return makePlan(
22841
+ "string",
22842
+ "string",
22843
+ field,
22844
+ path24,
22845
+ required,
22846
+ commonConstraints(required, { kind: "textType" }, { kind: "datetimeFormat" })
22847
+ );
21749
22848
  case "select":
21750
- return makePlan("select", "select", field, path24, required, commonConstraints(required, {
21751
- kind: "selectOption",
21752
- source: resolveSelectConstraintSource(field),
21753
- multiple: Boolean(field.multiple)
21754
- }));
22849
+ return makePlan(
22850
+ "select",
22851
+ "select",
22852
+ field,
22853
+ path24,
22854
+ required,
22855
+ commonConstraints(required, {
22856
+ kind: "selectOption",
22857
+ source: resolveSelectConstraintSource(field),
22858
+ multiple: Boolean(field.multiple)
22859
+ })
22860
+ );
21755
22861
  case "richText":
21756
22862
  return makePlan("richText", "object", field, path24, required, commonConstraints(required, { kind: "richTextDoc" }));
21757
22863
  case "media":
@@ -21764,7 +22870,11 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21764
22870
  case "repeater":
21765
22871
  return {
21766
22872
  ...makePlan("repeater", "array", field, path24, required, commonConstraints(required, { kind: "arrayType" })),
21767
- ...field.polymorphic && field.itemTypes ? { repeatedItemVariants: deriveRepeatedItemVariants(field, [...path24, 0]) } : { repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path24, 0]) },
22873
+ ...field.polymorphic && field.itemTypes ? {
22874
+ repeatedItemVariants: deriveRepeatedItemVariants(field, [...path24, 0])
22875
+ } : {
22876
+ repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path24, 0])
22877
+ },
21768
22878
  constraints: withRepeaterItemConstraints(field, commonConstraints(required, { kind: "arrayType" }))
21769
22879
  };
21770
22880
  case "group":
@@ -21849,7 +22959,10 @@ function resolveSelectConstraintSource(field) {
21849
22959
  const source = normalizeSelectSource(field);
21850
22960
  switch (source.kind) {
21851
22961
  case "static":
21852
- return { kind: "static", values: field.options.map((option) => option.value) };
22962
+ return {
22963
+ kind: "static",
22964
+ values: field.options.map((option) => option.value)
22965
+ };
21853
22966
  case "site":
21854
22967
  case "sdk":
21855
22968
  return { kind: "runtime", source: source.kind };
@@ -21945,7 +23058,9 @@ function normalizeFieldValue(plan, value, ctx) {
21945
23058
  }
21946
23059
  function normalizeObjectChildren(children, value, ctx) {
21947
23060
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
21948
- const normalized = { ...value };
23061
+ const normalized = {
23062
+ ...value
23063
+ };
21949
23064
  for (const child of children) {
21950
23065
  normalized[child.fieldId] = normalizeFieldValue(child, normalized[child.fieldId], ctx);
21951
23066
  }
@@ -22039,6 +23154,12 @@ function validateStringConstraint(plan, constraint, value) {
22039
23154
  }
22040
23155
  case "urlFormat":
22041
23156
  return isValidUrl(value, constraint.allowRelative) ? [] : [issue(plan, "invalidUrl")];
23157
+ case "dateFormat":
23158
+ return isValidDateString(value) ? [] : [issue(plan, "invalidDate")];
23159
+ case "timeFormat":
23160
+ return isValidTimeString(value) ? [] : [issue(plan, "invalidTime")];
23161
+ case "datetimeFormat":
23162
+ return isValidDateTimeInstantString(value) ? [] : [issue(plan, "invalidDateTime")];
22042
23163
  case "slugFormat":
22043
23164
  return SLUG_PATTERN.test(value) ? [] : [issue(plan, "invalidSlug")];
22044
23165
  default:
@@ -22075,17 +23196,24 @@ function validateRepeaterPlan(plan, value, ctx) {
22075
23196
  case "arrayType":
22076
23197
  return [];
22077
23198
  case "minItems":
22078
- return value.length < constraint.minimum ? [issue(plan, "tooFewItems", { minimum: constraint.minimum, itemLabel: "item" })] : [];
23199
+ return value.length < constraint.minimum ? [
23200
+ issue(plan, "tooFewItems", {
23201
+ minimum: constraint.minimum,
23202
+ itemLabel: "item"
23203
+ })
23204
+ ] : [];
22079
23205
  case "maxItems":
22080
- return value.length > constraint.maximum ? [issue(plan, "tooManyItems", { maximum: constraint.maximum, itemLabel: "item" })] : [];
23206
+ return value.length > constraint.maximum ? [
23207
+ issue(plan, "tooManyItems", {
23208
+ maximum: constraint.maximum,
23209
+ itemLabel: "item"
23210
+ })
23211
+ ] : [];
22081
23212
  default:
22082
23213
  return assertNever2(constraint);
22083
23214
  }
22084
23215
  });
22085
- return [
22086
- ...constraintIssues,
22087
- ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))
22088
- ];
23216
+ return [...constraintIssues, ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))];
22089
23217
  }
22090
23218
  function validateRepeaterItem(plan, item, index, ctx) {
22091
23219
  if (!isPlainObject(item)) return [];
@@ -22128,9 +23256,7 @@ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
22128
23256
  }))
22129
23257
  } : {},
22130
23258
  ...plan.repeatedItemPlan ? {
22131
- repeatedItemPlan: plan.repeatedItemPlan.map(
22132
- (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
22133
- )
23259
+ repeatedItemPlan: plan.repeatedItemPlan.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
22134
23260
  } : {}
22135
23261
  };
22136
23262
  case "string":
@@ -22217,6 +23343,9 @@ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
22217
23343
  case "invalidPhone":
22218
23344
  case "invalidPattern":
22219
23345
  case "invalidUrl":
23346
+ case "invalidDate":
23347
+ case "invalidTime":
23348
+ case "invalidDateTime":
22220
23349
  case "invalidNumber":
22221
23350
  case "tooSmall":
22222
23351
  case "tooLarge":
@@ -22256,6 +23385,53 @@ function isValidUrl(value, allowRelative) {
22256
23385
  return false;
22257
23386
  }
22258
23387
  }
23388
+ function isValidDateString(value) {
23389
+ const match = DATE_PATTERN.exec(value);
23390
+ if (!match?.groups) return false;
23391
+ const year = Number(match.groups.year);
23392
+ const month = Number(match.groups.month);
23393
+ const day = Number(match.groups.day);
23394
+ return isValidCalendarDate(year, month, day);
23395
+ }
23396
+ function isValidTimeString(value) {
23397
+ return TIME_PATTERN.test(value);
23398
+ }
23399
+ function isValidDateTimeInstantString(value) {
23400
+ const match = DATETIME_PATTERN.exec(value);
23401
+ if (!match?.groups) return false;
23402
+ const datePart = match.groups.date;
23403
+ if (!datePart || !isValidDateString(datePart)) return false;
23404
+ return !Number.isNaN(Date.parse(value));
23405
+ }
23406
+ function isValidCalendarDate(year, month, day) {
23407
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) return false;
23408
+ if (year < 1 || month < 1 || month > 12) return false;
23409
+ return day >= 1 && day <= daysInMonth(year, month);
23410
+ }
23411
+ function daysInMonth(year, month) {
23412
+ switch (month) {
23413
+ case 2:
23414
+ return isLeapYear(year) ? 29 : 28;
23415
+ case 4:
23416
+ case 6:
23417
+ case 9:
23418
+ case 11:
23419
+ return 30;
23420
+ case 1:
23421
+ case 3:
23422
+ case 5:
23423
+ case 7:
23424
+ case 8:
23425
+ case 10:
23426
+ case 12:
23427
+ return 31;
23428
+ default:
23429
+ return 0;
23430
+ }
23431
+ }
23432
+ function isLeapYear(year) {
23433
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
23434
+ }
22259
23435
  function isValidSelectValue(value, values, multiple) {
22260
23436
  if (multiple) {
22261
23437
  return Array.isArray(value) && value.every((item) => typeof item === "string" && values.includes(item));
@@ -22548,6 +23724,342 @@ var heroBlockDefinition = {
22548
23724
  manifest: heroManifest
22549
23725
  };
22550
23726
 
23727
+ // ../blocks/src/system/blocks/intro.ts
23728
+ init_defineBlock();
23729
+
23730
+ // ../blocks/src/system/fields/aspectRatio.ts
23731
+ var standardAspectRatioOptions = [
23732
+ { value: "auto", label: "Auto (original)" },
23733
+ { value: "16/9", label: "16:9 (Landscape)" },
23734
+ { value: "4/3", label: "4:3 (Standard)" },
23735
+ { value: "1/1", label: "1:1 (Square)" },
23736
+ { value: "3/4", label: "3:4 (Portrait)" }
23737
+ ];
23738
+ function createAspectRatioField(options = {}) {
23739
+ return {
23740
+ id: options.id ?? "aspectRatio",
23741
+ type: "select",
23742
+ label: options.label ?? "Aspect ratio",
23743
+ ...options.description ? { description: options.description } : {},
23744
+ required: false,
23745
+ defaultValue: options.defaultValue ?? "auto",
23746
+ multiple: false,
23747
+ options: [...standardAspectRatioOptions],
23748
+ ui: {
23749
+ intent: options.uiIntent ?? "display",
23750
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
23751
+ }
23752
+ };
23753
+ }
23754
+
23755
+ // ../blocks/src/system/blocks/intro.ts
23756
+ init_ctas();
23757
+
23758
+ // ../blocks/src/system/fields/imageLayout.ts
23759
+ function createImageColSizeField(options = {}) {
23760
+ const {
23761
+ id = "imageColSize",
23762
+ label = "Image column size",
23763
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
23764
+ defaultValue = "1/3",
23765
+ uiIntent = "display",
23766
+ visibleWhen
23767
+ } = options;
23768
+ return {
23769
+ id,
23770
+ type: "select",
23771
+ label,
23772
+ description,
23773
+ required: false,
23774
+ defaultValue,
23775
+ multiple: false,
23776
+ options: [
23777
+ { value: "1/4", label: "Small (1/4)" },
23778
+ { value: "1/3", label: "Medium (1/3)" },
23779
+ { value: "2/5", label: "Large (2/5)" },
23780
+ { value: "1/2", label: "Extra large (1/2)" },
23781
+ { value: "2/3", label: "Huge (2/3)" }
23782
+ ],
23783
+ ui: {
23784
+ intent: uiIntent,
23785
+ ...visibleWhen ? { visibleWhen } : {}
23786
+ }
23787
+ };
23788
+ }
23789
+ function createImagePositionField(options = {}) {
23790
+ const {
23791
+ id = "imagePosition",
23792
+ label = "Image position",
23793
+ description = "Choose which side the image appears on.",
23794
+ defaultValue = "left",
23795
+ includeAlternate = false,
23796
+ uiIntent = "display",
23797
+ visibleWhen
23798
+ } = options;
23799
+ const positionOptions = [
23800
+ { value: "left", label: "Left" },
23801
+ { value: "right", label: "Right" },
23802
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
23803
+ ];
23804
+ return {
23805
+ id,
23806
+ type: "select",
23807
+ label,
23808
+ description,
23809
+ required: false,
23810
+ defaultValue,
23811
+ multiple: false,
23812
+ // Spread to get a mutable array type without unsafe casts.
23813
+ options: [...positionOptions],
23814
+ ui: {
23815
+ intent: uiIntent,
23816
+ ...visibleWhen ? { visibleWhen } : {}
23817
+ }
23818
+ };
23819
+ }
23820
+
23821
+ // ../blocks/src/system/blocks/intro.ts
23822
+ init_builder();
23823
+ init_fragments();
23824
+ function introHeading(className) {
23825
+ return text(
23826
+ {
23827
+ as: "h2",
23828
+ className
23829
+ },
23830
+ when("content.title"),
23831
+ bind("content.title")
23832
+ );
23833
+ }
23834
+ function introBody(className = "rb-prose rb-max-w-none") {
23835
+ return richText({ className }, bind("content.body"));
23836
+ }
23837
+ function introCtas(justify = "start") {
23838
+ return ctaRow({
23839
+ justify,
23840
+ gap: "md",
23841
+ containerClassName: "rb-mt-2"
23842
+ });
23843
+ }
23844
+ function introCopyStack(options = {}) {
23845
+ return stack(
23846
+ {
23847
+ gap: "md",
23848
+ className: options.className ?? "rb-intro-copy"
23849
+ },
23850
+ [
23851
+ introHeading(options.headingClassName ?? "rb-intro-title"),
23852
+ introBody(options.bodyClassName),
23853
+ introCtas(options.ctaJustify)
23854
+ ]
23855
+ );
23856
+ }
23857
+ var introMedia = media(
23858
+ {
23859
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
23860
+ style: {
23861
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
23862
+ }
23863
+ },
23864
+ bind("content.media")
23865
+ );
23866
+ var centeredCopyLayout = styledSection({
23867
+ children: styledContainer({
23868
+ rootType: "stack",
23869
+ rootProps: { gap: "lg" },
23870
+ children: [
23871
+ introCopyStack({
23872
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
23873
+ headingClassName: "rb-intro-title rb-text-center",
23874
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
23875
+ ctaJustify: "center"
23876
+ })
23877
+ ]
23878
+ }),
23879
+ baseClass: "",
23880
+ spacing: "medium"
23881
+ });
23882
+ var statementCopyLayout = styledSection({
23883
+ children: styledContainer({
23884
+ children: [
23885
+ el(
23886
+ "div",
23887
+ {
23888
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
23889
+ },
23890
+ [
23891
+ introHeading("rb-intro-title rb-max-w-xl"),
23892
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
23893
+ introBody(),
23894
+ introCtas("start")
23895
+ ])
23896
+ ]
23897
+ )
23898
+ ]
23899
+ }),
23900
+ baseClass: "",
23901
+ spacing: "medium"
23902
+ });
23903
+ var statementMediaLayout = styledSection({
23904
+ children: styledContainer({
23905
+ children: [
23906
+ el(
23907
+ "div",
23908
+ {
23909
+ 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"
23910
+ },
23911
+ [
23912
+ introHeading("rb-intro-title rb-max-w-xl"),
23913
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
23914
+ introBody(),
23915
+ introCtas("start")
23916
+ ]),
23917
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
23918
+ ]
23919
+ )
23920
+ ]
23921
+ }),
23922
+ baseClass: "",
23923
+ spacing: "medium"
23924
+ });
23925
+ var mediaCopyLayout = styledSection({
23926
+ children: styledContainer({
23927
+ children: [
23928
+ responsiveTwoColumn({
23929
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
23930
+ text: introCopyStack({
23931
+ className: "rb-intro-copy rb-max-w-xl",
23932
+ headingClassName: "rb-intro-title"
23933
+ }),
23934
+ ratioFrom: "content.ratio",
23935
+ imagePositionFrom: "content.imagePosition",
23936
+ gapFrom: "content.gap",
23937
+ gapFallback: "comfortable",
23938
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
23939
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
23940
+ })
23941
+ ]
23942
+ }),
23943
+ baseClass: "",
23944
+ spacing: "medium"
23945
+ });
23946
+ var introConfig = {
23947
+ id: "block.intro",
23948
+ title: "Intro",
23949
+ category: "layout",
23950
+ includeContainerStyles: true,
23951
+ titleSource: "title",
23952
+ additionalFields: [
23953
+ {
23954
+ id: "title",
23955
+ type: "text",
23956
+ label: "Statement",
23957
+ required: false,
23958
+ multiline: true,
23959
+ maxLength: 160
23960
+ },
23961
+ {
23962
+ id: "body",
23963
+ type: "richText",
23964
+ label: "Text",
23965
+ required: true,
23966
+ ui: {
23967
+ richTextVariant: "limited"
23968
+ }
23969
+ },
23970
+ {
23971
+ id: "media",
23972
+ type: "media",
23973
+ label: "Media",
23974
+ required: false,
23975
+ mediaKinds: ["image"],
23976
+ ui: {
23977
+ intent: "content",
23978
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
23979
+ }
23980
+ },
23981
+ createImagePositionField({
23982
+ id: "imagePosition",
23983
+ label: "Image position",
23984
+ defaultValue: "left",
23985
+ uiIntent: "display",
23986
+ visibleWhen: { field: "variant", equals: "media-copy" }
23987
+ }),
23988
+ {
23989
+ id: "gap",
23990
+ type: "select",
23991
+ label: "Gap between media and text",
23992
+ required: false,
23993
+ defaultValue: "comfortable",
23994
+ multiple: false,
23995
+ options: [
23996
+ { value: "none", label: "None" },
23997
+ { value: "compact", label: "Compact" },
23998
+ { value: "cozy", label: "Cozy" },
23999
+ { value: "medium", label: "Medium" },
24000
+ { value: "comfortable", label: "Comfortable" },
24001
+ { value: "spacious", label: "Spacious" }
24002
+ ],
24003
+ ui: {
24004
+ intent: "display",
24005
+ visibleWhen: { field: "variant", equals: "media-copy" }
24006
+ }
24007
+ },
24008
+ createImageColSizeField({
24009
+ id: "ratio",
24010
+ label: "Media column size",
24011
+ defaultValue: "1/2",
24012
+ uiIntent: "display",
24013
+ visibleWhen: { field: "variant", equals: "media-copy" }
24014
+ }),
24015
+ createAspectRatioField({
24016
+ id: "aspectRatio",
24017
+ label: "Media aspect ratio",
24018
+ description: "Crop media to a consistent aspect ratio.",
24019
+ defaultValue: "auto",
24020
+ visibleWhen: { field: "media", notEquals: null }
24021
+ }),
24022
+ createCtasRepeater({
24023
+ label: "Calls to action",
24024
+ itemLabel: "CTA",
24025
+ maxItems: 2
24026
+ })
24027
+ ],
24028
+ layout: centeredCopyLayout,
24029
+ variants: {
24030
+ "centered-copy": centeredCopyLayout,
24031
+ "statement-copy": statementCopyLayout,
24032
+ "statement-media": statementMediaLayout,
24033
+ "media-copy": mediaCopyLayout
24034
+ },
24035
+ defaultVariant: "statement-copy",
24036
+ variantOptions: {
24037
+ "centered-copy": {
24038
+ label: "Centered copy",
24039
+ description: "A focused intro with centered text and optional calls to action."
24040
+ },
24041
+ "statement-copy": {
24042
+ label: "Statement and copy",
24043
+ description: "A large statement on the left with supporting copy on the right."
24044
+ },
24045
+ "statement-media": {
24046
+ label: "Statement, copy and media",
24047
+ description: "A three-part intro with statement, copy and a small image."
24048
+ },
24049
+ "media-copy": {
24050
+ label: "Media and copy",
24051
+ description: "A compact media/text intro for softer transitions after a hero."
24052
+ }
24053
+ },
24054
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
24055
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
24056
+ icon: "PanelTopOpen"
24057
+ };
24058
+ var introManifest = createBlockManifest(introConfig);
24059
+ var introBlockDefinition = {
24060
+ manifest: introManifest
24061
+ };
24062
+
22551
24063
  // ../blocks/src/system/blocks/body-text.ts
22552
24064
  init_styledSection();
22553
24065
  init_defineBlock();
@@ -23142,6 +24654,37 @@ var faqComposition = composeFragments([
23142
24654
  { fragment: faqHeadingFragment, fieldPriority: 0 },
23143
24655
  { fragment: faqAccordionFragment, fieldPriority: 1 }
23144
24656
  ]);
24657
+ function fragmentLayoutNode(layout) {
24658
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
24659
+ }
24660
+ function isNodeDefinitionArray(layout) {
24661
+ return Array.isArray(layout);
24662
+ }
24663
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
24664
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
24665
+ var defaultLayout = styledSection({
24666
+ children: styledContainer({
24667
+ baseClassName: "rb-relative rb-isolate",
24668
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
24669
+ }),
24670
+ baseClass: ""
24671
+ });
24672
+ var twoColumnLayout = styledSection({
24673
+ children: styledContainer({
24674
+ baseClassName: "rb-relative rb-isolate",
24675
+ children: el(
24676
+ "div",
24677
+ {
24678
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
24679
+ },
24680
+ [
24681
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
24682
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
24683
+ ]
24684
+ )
24685
+ }),
24686
+ baseClass: ""
24687
+ });
23145
24688
  var faqManifest = createBlockManifest({
23146
24689
  id: "block.faq",
23147
24690
  title: "FAQ",
@@ -23158,13 +24701,22 @@ var faqManifest = createBlockManifest({
23158
24701
  label: "FAQ item styles"
23159
24702
  })
23160
24703
  ],
23161
- layout: styledSection({
23162
- children: styledContainer({
23163
- baseClassName: "rb-relative rb-isolate",
23164
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
23165
- }),
23166
- baseClass: ""
23167
- }),
24704
+ layout: defaultLayout,
24705
+ variants: {
24706
+ default: defaultLayout,
24707
+ "two-column": twoColumnLayout
24708
+ },
24709
+ defaultVariant: "default",
24710
+ variantOptions: {
24711
+ default: {
24712
+ label: "Default",
24713
+ description: "A centered heading above one FAQ accordion."
24714
+ },
24715
+ "two-column": {
24716
+ label: "Two column",
24717
+ description: "A left heading column with FAQ items on the right."
24718
+ }
24719
+ },
23168
24720
  description: "Accordion of frequently asked questions and answers.",
23169
24721
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
23170
24722
  icon: "HelpCircle"
@@ -23821,7 +25373,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
23821
25373
  function resolveHeaderVisualStyles(header, tokens) {
23822
25374
  const navContainerType = header?.navContainer?.type ?? "none";
23823
25375
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
23824
- if (hasContainedNav) {
25376
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
25377
+ if (hasContainedNav || hasTransparentVariant) {
23825
25378
  return {
23826
25379
  backgroundToken: "transparent",
23827
25380
  paletteHex: null,
@@ -23950,6 +25503,17 @@ var headerRootStyleTransform = {
23950
25503
  return mergeStyles(...styleParts);
23951
25504
  }
23952
25505
  };
25506
+ var headerSectionBackgroundTransform = {
25507
+ id: "layout.headerSectionBackground",
25508
+ kind: "string",
25509
+ summary: "Resolve the inner site-header section background token",
25510
+ run: (value) => {
25511
+ const header = asPartialObject(value);
25512
+ const navContainerType = header?.navContainer?.type ?? "none";
25513
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
25514
+ return usesTransparentRoot ? "raw:transparent" : "background";
25515
+ }
25516
+ };
23953
25517
  var footerRootStyleTransform = {
23954
25518
  id: "layout.footerRootStyle",
23955
25519
  kind: "formatter",
@@ -24208,6 +25772,7 @@ var layoutTransforms = [
24208
25772
  headerRootClassTransform,
24209
25773
  footerRootClassTransform,
24210
25774
  headerRootStyleTransform,
25775
+ headerSectionBackgroundTransform,
24211
25776
  footerRootStyleTransform,
24212
25777
  footerBottomBarClassTransform,
24213
25778
  footerBottomBarContainerClassTransform,
@@ -24712,7 +26277,10 @@ var editorialLayout = stack(
24712
26277
  );
24713
26278
  var headerLayout = headerSection(
24714
26279
  {
24715
- background: "background",
26280
+ background: bindProp("$root.theme.header", {
26281
+ transforms: pipe(tx("layout.headerSectionBackground")),
26282
+ fallback: "background"
26283
+ }),
24716
26284
  allowOverflow: true,
24717
26285
  className: bindProp("$root.theme.header", {
24718
26286
  transforms: pipe(tx("layout.headerRootClass")),
@@ -25653,6 +27221,231 @@ var collectionBlockDefinition = {
25653
27221
  manifest: collectionManifest
25654
27222
  };
25655
27223
 
27224
+ // ../blocks/src/system/blocks/feature-cards.ts
27225
+ init_defineBlock();
27226
+ init_boxStyles();
27227
+ init_ctas();
27228
+ init_builder();
27229
+ init_fragments();
27230
+ init_colorStyles();
27231
+ function grid3(props2, children) {
27232
+ return el("grid", props2 ?? void 0, children ?? void 0);
27233
+ }
27234
+ var sectionHeading = stack(
27235
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
27236
+ [
27237
+ text(
27238
+ {
27239
+ as: "h2",
27240
+ className: "rb-feature-cards-title rb-text-center"
27241
+ },
27242
+ when("content.title"),
27243
+ bind("content.title")
27244
+ ),
27245
+ richText(
27246
+ {
27247
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
27248
+ style: textColorStyle("mutedText")
27249
+ },
27250
+ when("content.description"),
27251
+ bind("content.description")
27252
+ )
27253
+ ]
27254
+ );
27255
+ var featureCard = styledCard(
27256
+ [
27257
+ media(
27258
+ {
27259
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
27260
+ style: {
27261
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
27262
+ }
27263
+ },
27264
+ when("card.media"),
27265
+ bind("card.media")
27266
+ ),
27267
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
27268
+ text(
27269
+ {
27270
+ as: "h3",
27271
+ className: "rb-feature-card-title"
27272
+ },
27273
+ bind("card.title")
27274
+ ),
27275
+ richText(
27276
+ {
27277
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
27278
+ style: textColorStyle("mutedText")
27279
+ },
27280
+ when("card.body"),
27281
+ bind("card.body")
27282
+ ),
27283
+ ctaRow({
27284
+ collectionPath: "ctas",
27285
+ itemName: "cta",
27286
+ gap: "sm",
27287
+ justify: "start",
27288
+ containerClassName: "rb-mt-auto"
27289
+ })
27290
+ ])
27291
+ ],
27292
+ {
27293
+ stylesFrom: "content._cardStyles",
27294
+ backgroundFrom: "content._cardStyles.background",
27295
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
27296
+ },
27297
+ repeat("content.cards", "card")
27298
+ );
27299
+ var cardsLayout = styledSection({
27300
+ children: styledContainer({
27301
+ rootType: "stack",
27302
+ rootProps: { gap: "xl" },
27303
+ children: [
27304
+ sectionHeading,
27305
+ grid3(
27306
+ {
27307
+ cols: {
27308
+ $bind: {
27309
+ from: "content.columns",
27310
+ fallback: 3,
27311
+ coerce: "number"
27312
+ }
27313
+ },
27314
+ gap: "lg"
27315
+ },
27316
+ [featureCard]
27317
+ )
27318
+ ]
27319
+ }),
27320
+ baseClass: "",
27321
+ spacing: "medium"
27322
+ });
27323
+ var featureCardsConfig = {
27324
+ id: "block.feature-cards",
27325
+ title: "Feature Cards",
27326
+ category: "layout",
27327
+ includeContainerStyles: true,
27328
+ titleSource: "title",
27329
+ additionalFields: [
27330
+ {
27331
+ id: "title",
27332
+ type: "text",
27333
+ label: "Title",
27334
+ required: false,
27335
+ multiline: false,
27336
+ maxLength: 120
27337
+ },
27338
+ {
27339
+ id: "description",
27340
+ type: "richText",
27341
+ label: "Description",
27342
+ required: false,
27343
+ ui: {
27344
+ richTextVariant: "limited"
27345
+ }
27346
+ },
27347
+ {
27348
+ id: "columns",
27349
+ type: "select",
27350
+ label: "Columns",
27351
+ required: false,
27352
+ defaultValue: "3",
27353
+ multiple: false,
27354
+ options: [
27355
+ { value: "2", label: "2 columns" },
27356
+ { value: "3", label: "3 columns" },
27357
+ { value: "4", label: "4 columns" }
27358
+ ],
27359
+ ui: { intent: "display" }
27360
+ },
27361
+ {
27362
+ id: "cards",
27363
+ type: "repeater",
27364
+ label: "Cards",
27365
+ required: false,
27366
+ minItems: 1,
27367
+ maxItems: 8,
27368
+ itemLabel: "Card",
27369
+ itemLabelSource: "title",
27370
+ allowConversion: true,
27371
+ ui: {
27372
+ intent: "content"
27373
+ },
27374
+ schema: {
27375
+ fields: [
27376
+ {
27377
+ id: "media",
27378
+ type: "media",
27379
+ label: "Image",
27380
+ required: false,
27381
+ mediaKinds: ["image"]
27382
+ },
27383
+ createAspectRatioField({
27384
+ id: "aspectRatio",
27385
+ label: "Image aspect ratio",
27386
+ defaultValue: "4/3",
27387
+ visibleWhen: { field: "media", notEquals: null }
27388
+ }),
27389
+ {
27390
+ id: "title",
27391
+ type: "text",
27392
+ label: "Title",
27393
+ required: true,
27394
+ multiline: false,
27395
+ maxLength: 120
27396
+ },
27397
+ {
27398
+ id: "body",
27399
+ type: "richText",
27400
+ label: "Text",
27401
+ required: false,
27402
+ ui: {
27403
+ richTextVariant: "limited"
27404
+ }
27405
+ },
27406
+ createCtasRepeater({
27407
+ label: "Calls to action",
27408
+ itemLabel: "CTA",
27409
+ maxItems: 1,
27410
+ button: {
27411
+ variants: [
27412
+ { value: "primary", label: "Primary" },
27413
+ { value: "secondary", label: "Secondary" },
27414
+ { value: "outline", label: "Outline" },
27415
+ { value: "ghost", label: "Ghost" },
27416
+ { value: "link", label: "Link" }
27417
+ ],
27418
+ defaultVariant: "ghost"
27419
+ }
27420
+ })
27421
+ ]
27422
+ }
27423
+ },
27424
+ cardStylesField({
27425
+ id: "_cardStyles",
27426
+ label: "Card styles"
27427
+ })
27428
+ ],
27429
+ layout: cardsLayout,
27430
+ variants: {
27431
+ cards: cardsLayout
27432
+ },
27433
+ defaultVariant: "cards",
27434
+ variantOptions: {
27435
+ cards: {
27436
+ label: "Cards",
27437
+ description: "A responsive grid of image cards with optional calls to action."
27438
+ }
27439
+ },
27440
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
27441
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
27442
+ icon: "PanelsTopLeft"
27443
+ };
27444
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
27445
+ var featureCardsBlockDefinition = {
27446
+ manifest: featureCardsManifest
27447
+ };
27448
+
25656
27449
  // ../blocks/src/system/blocks/media-text.ts
25657
27450
  init_defineBlock();
25658
27451
 
@@ -25748,69 +27541,6 @@ function createCarouselBehaviorFields(options = {}) {
25748
27541
  ];
25749
27542
  return fields3;
25750
27543
  }
25751
-
25752
- // ../blocks/src/system/fields/imageLayout.ts
25753
- function createImageColSizeField(options = {}) {
25754
- const {
25755
- id = "imageColSize",
25756
- label = "Image column size",
25757
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
25758
- defaultValue = "1/3",
25759
- uiIntent = "display",
25760
- visibleWhen
25761
- } = options;
25762
- return {
25763
- id,
25764
- type: "select",
25765
- label,
25766
- description,
25767
- required: false,
25768
- defaultValue,
25769
- multiple: false,
25770
- options: [
25771
- { value: "1/4", label: "Small (1/4)" },
25772
- { value: "1/3", label: "Medium (1/3)" },
25773
- { value: "2/5", label: "Large (2/5)" },
25774
- { value: "1/2", label: "Extra large (1/2)" },
25775
- { value: "2/3", label: "Huge (2/3)" }
25776
- ],
25777
- ui: {
25778
- intent: uiIntent,
25779
- ...visibleWhen ? { visibleWhen } : {}
25780
- }
25781
- };
25782
- }
25783
- function createImagePositionField(options = {}) {
25784
- const {
25785
- id = "imagePosition",
25786
- label = "Image position",
25787
- description = "Choose which side the image appears on.",
25788
- defaultValue = "left",
25789
- includeAlternate = false,
25790
- uiIntent = "display",
25791
- visibleWhen
25792
- } = options;
25793
- const positionOptions = [
25794
- { value: "left", label: "Left" },
25795
- { value: "right", label: "Right" },
25796
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
25797
- ];
25798
- return {
25799
- id,
25800
- type: "select",
25801
- label,
25802
- description,
25803
- required: false,
25804
- defaultValue,
25805
- multiple: false,
25806
- // Spread to get a mutable array type without unsafe casts.
25807
- options: [...positionOptions],
25808
- ui: {
25809
- intent: uiIntent,
25810
- ...visibleWhen ? { visibleWhen } : {}
25811
- }
25812
- };
25813
- }
25814
27544
  var textCardStylesField = (() => {
25815
27545
  const field = cardStylesField({
25816
27546
  id: "_textCardStyles",
@@ -25928,26 +27658,13 @@ var mediaTextManifest = createBlockManifest({
25928
27658
  },
25929
27659
  ui: { intent: "behavior" }
25930
27660
  }),
25931
- {
27661
+ createAspectRatioField({
25932
27662
  id: "aspectRatio",
25933
- type: "select",
25934
27663
  label: "Media aspect ratio",
25935
27664
  description: "Crop media to a consistent aspect ratio.",
25936
- required: false,
25937
27665
  defaultValue: "auto",
25938
- multiple: false,
25939
- options: [
25940
- { value: "auto", label: "Auto (original)" },
25941
- { value: "16/9", label: "16:9 (Landscape)" },
25942
- { value: "4/3", label: "4:3 (Standard)" },
25943
- { value: "1/1", label: "1:1 (Square)" },
25944
- { value: "3/4", label: "3:4 (Portrait)" }
25945
- ],
25946
- ui: {
25947
- intent: "display",
25948
- visibleWhen: { field: "images", notEquals: null }
25949
- }
25950
- },
27666
+ visibleWhen: { field: "images", notEquals: null }
27667
+ }),
25951
27668
  {
25952
27669
  id: "text",
25953
27670
  type: "richText",
@@ -26077,7 +27794,7 @@ var mediaTextManifest = createBlockManifest({
26077
27794
  whenImagesLength(0)
26078
27795
  );
26079
27796
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
26080
- const defaultLayout = styledSection({
27797
+ const defaultLayout2 = styledSection({
26081
27798
  children: styledContainer({
26082
27799
  rootType: "stack",
26083
27800
  rootProps: { gap: "lg" },
@@ -26109,9 +27826,9 @@ var mediaTextManifest = createBlockManifest({
26109
27826
  spacing: "medium"
26110
27827
  });
26111
27828
  return {
26112
- layout: defaultLayout,
27829
+ layout: defaultLayout2,
26113
27830
  variants: {
26114
- default: defaultLayout
27831
+ default: defaultLayout2
26115
27832
  },
26116
27833
  defaultVariant: "default",
26117
27834
  variantOptions: {
@@ -28102,7 +29819,7 @@ init_builder();
28102
29819
  init_colorStyles();
28103
29820
  init_defineBlock();
28104
29821
  init_fragments();
28105
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
29822
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28106
29823
  var galleryContainer = (children, opts) => {
28107
29824
  const gap = opts?.gap;
28108
29825
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -28182,7 +29899,7 @@ var galleryItem = (options) => stack(
28182
29899
  ],
28183
29900
  repeat("content.images", "item")
28184
29901
  );
28185
- var gridLayout3 = grid3(
29902
+ var gridLayout3 = grid4(
28186
29903
  {
28187
29904
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
28188
29905
  },
@@ -28790,7 +30507,7 @@ init_builder();
28790
30507
  init_fragments();
28791
30508
  init_colorStyles();
28792
30509
  init_defineBlock();
28793
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
30510
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28794
30511
  var videoItem = (options) => stack(
28795
30512
  { gap: "xs", className: options.containerClassName },
28796
30513
  [
@@ -28840,7 +30557,7 @@ var gridColumnsClass = (columns) => {
28840
30557
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
28841
30558
  }
28842
30559
  };
28843
- var createGridLayout = (columns) => grid4(
30560
+ var createGridLayout = (columns) => grid5(
28844
30561
  {
28845
30562
  className: gridColumnsClass(columns)
28846
30563
  },
@@ -30926,6 +32643,40 @@ var systemBlockDefinitionsRaw = [
30926
32643
  })
30927
32644
  ]
30928
32645
  })),
32646
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
32647
+ sectionSurfaces: "supported",
32648
+ contentFrames: ["plain", "panel"],
32649
+ itemSurfaces: "unsupported",
32650
+ headingDecorations: ["organic-squiggle"]
32651
+ }), defineBlockDesignMetadata({
32652
+ flow: bodyFlow,
32653
+ layoutProfiles: [
32654
+ layoutProfile({
32655
+ variantKey: "centered-copy",
32656
+ family: "centered",
32657
+ weight: "featured",
32658
+ bias: "soft"
32659
+ }),
32660
+ layoutProfile({
32661
+ variantKey: "statement-copy",
32662
+ family: "split",
32663
+ weight: "featured",
32664
+ bias: "merge"
32665
+ }),
32666
+ layoutProfile({
32667
+ variantKey: "statement-media",
32668
+ family: "media-text",
32669
+ weight: "featured",
32670
+ bias: "soft"
32671
+ }),
32672
+ layoutProfile({
32673
+ variantKey: "media-copy",
32674
+ family: "media-text",
32675
+ weight: "featured",
32676
+ bias: "soft"
32677
+ })
32678
+ ]
32679
+ })),
30929
32680
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30930
32681
  flow: bodyFlow,
30931
32682
  layoutProfiles: [
@@ -30986,9 +32737,17 @@ var systemBlockDefinitionsRaw = [
30986
32737
  flow: conversionFlow,
30987
32738
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
30988
32739
  })),
30989
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
32740
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
32741
+ sectionSurfaces: "supported",
32742
+ contentFrames: ["plain", "panel"],
32743
+ itemSurfaces: "supported",
32744
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
32745
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
30990
32746
  flow: bodyFlow,
30991
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
32747
+ layoutProfiles: [
32748
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
32749
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
32750
+ ]
30992
32751
  })),
30993
32752
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
30994
32753
  flow: siteChromeFlow,
@@ -31002,7 +32761,8 @@ var systemBlockDefinitionsRaw = [
31002
32761
  sectionSurfaces: "supported",
31003
32762
  contentFrames: ["plain", "panel"],
31004
32763
  itemSurfaces: "supported",
31005
- testimonialCardTreatments: ["default", "accent-quote"]
32764
+ testimonialCardTreatments: ["default", "accent-quote"],
32765
+ headingDecorations: ["short-center-rule"]
31006
32766
  }), defineBlockDesignMetadata({
31007
32767
  flow: proofFlow,
31008
32768
  layoutProfiles: [
@@ -31028,6 +32788,22 @@ var systemBlockDefinitionsRaw = [
31028
32788
  flow: offeringsFlow,
31029
32789
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
31030
32790
  })),
32791
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
32792
+ sectionSurfaces: "supported",
32793
+ contentFrames: ["plain", "panel"],
32794
+ itemSurfaces: "supported",
32795
+ headingDecorations: ["short-center-rule"]
32796
+ }), defineBlockDesignMetadata({
32797
+ flow: offeringsFlow,
32798
+ layoutProfiles: [
32799
+ layoutProfile({
32800
+ variantKey: "cards",
32801
+ family: "grid",
32802
+ weight: "standard",
32803
+ bias: "soft"
32804
+ })
32805
+ ]
32806
+ })),
31031
32807
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
31032
32808
  flow: mediaFlow,
31033
32809
  layoutProfiles: [
@@ -34881,8 +36657,10 @@ z.object({
34881
36657
  var SYSTEM_BLOCK_KINDS = [
34882
36658
  // Layout blocks
34883
36659
  "block.hero",
36660
+ "block.intro",
34884
36661
  "block.columns",
34885
36662
  "block.collection",
36663
+ "block.feature-cards",
34886
36664
  "block.media-text",
34887
36665
  "block.cta-full",
34888
36666
  "block.single-button",
@@ -36336,7 +38114,12 @@ function buildApplySiteStyleSelectionCommand(input) {
36336
38114
  buttonPersonalityId: input.buttonPersonalityId,
36337
38115
  paletteVariantId: input.paletteVariantId,
36338
38116
  paletteOverrides: input.paletteOverrides,
38117
+ typographyPresetId: input.typographyPresetId,
38118
+ typographyBodyFontOverride: input.typographyBodyFontOverride,
38119
+ typographyHeadingFontOverride: input.typographyHeadingFontOverride,
36339
38120
  headerLookId: input.headerLookId,
38121
+ headerLayoutId: input.headerLayoutId,
38122
+ headerStyleId: input.headerStyleId,
36340
38123
  footerLookId: input.footerLookId,
36341
38124
  baseSelectionVersion: input.baseSelectionVersion
36342
38125
  }
@@ -36352,7 +38135,12 @@ function applySiteStyleSelectionBodyFromCommand(command, selectionId) {
36352
38135
  buttonPersonalityId: command.input.buttonPersonalityId,
36353
38136
  paletteVariantId: command.input.paletteVariantId,
36354
38137
  paletteOverrides: command.input.paletteOverrides,
38138
+ typographyPresetId: command.input.typographyPresetId,
38139
+ typographyBodyFontOverride: command.input.typographyBodyFontOverride,
38140
+ typographyHeadingFontOverride: command.input.typographyHeadingFontOverride,
36355
38141
  headerLookId: command.input.headerLookId,
38142
+ headerLayoutId: command.input.headerLayoutId,
38143
+ headerStyleId: command.input.headerStyleId,
36356
38144
  footerLookId: command.input.footerLookId,
36357
38145
  baseSelectionVersion,
36358
38146
  selectionId
@@ -44194,7 +45982,12 @@ var applySiteStyleSelectionCommandSchema = z.object({
44194
45982
  buttonPersonalityId: styleCatalogIdSchema.nullable(),
44195
45983
  paletteVariantId: styleCatalogIdSchema.nullable(),
44196
45984
  paletteOverrides: paletteOverridesSchema2.nullable(),
45985
+ typographyPresetId: styleCatalogIdSchema.nullable().optional(),
45986
+ typographyBodyFontOverride: z.string().trim().min(1).nullable().optional(),
45987
+ typographyHeadingFontOverride: z.string().trim().min(1).nullable().optional(),
44197
45988
  headerLookId: styleCatalogIdSchema.nullable(),
45989
+ headerLayoutId: styleCatalogIdSchema,
45990
+ headerStyleId: styleCatalogIdSchema,
44198
45991
  footerLookId: styleCatalogIdSchema.nullable(),
44199
45992
  baseSelectionVersion: styleSelectionVersionSchema.optional()
44200
45993
  }).strict()
@@ -54508,7 +56301,7 @@ var SimpleCache = class {
54508
56301
  };
54509
56302
 
54510
56303
  // src/version.ts
54511
- var SDK_VERSION = "0.76.0";
56304
+ var SDK_VERSION = "0.77.0";
54512
56305
 
54513
56306
  // src/client/error.ts
54514
56307
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -54936,6 +56729,24 @@ function getPrebuildModule() {
54936
56729
  return null;
54937
56730
  }
54938
56731
  }
56732
+ function mergeDefaultHeaders(defaultHeaders, options) {
56733
+ if (!defaultHeaders || Object.keys(defaultHeaders).length === 0) {
56734
+ return options;
56735
+ }
56736
+ return {
56737
+ ...options,
56738
+ headers: {
56739
+ ...defaultHeaders,
56740
+ ...Object.fromEntries(new Headers(options?.headers).entries())
56741
+ }
56742
+ };
56743
+ }
56744
+ function withDefaultHeaders(apiClient, defaultHeaders) {
56745
+ return async (params) => apiClient({
56746
+ ...params,
56747
+ options: mergeDefaultHeaders(defaultHeaders, params.options)
56748
+ });
56749
+ }
54939
56750
  setSdkVersion(SDK_VERSION);
54940
56751
  var DEFAULT_BROWSER_TIMEOUT_MS = 5e3;
54941
56752
  var DEFAULT_SERVER_TIMEOUT_MS = 8e3;
@@ -55135,7 +56946,8 @@ function createRiverbankClient(config2) {
55135
56946
  keyType = "preview";
55136
56947
  break;
55137
56948
  }
55138
- const apiClient = authConfig.type === "none" ? createInternalAPIClient(config2.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config2.baseUrl) : createBearerAPIClient(authConfig.token, config2.baseUrl);
56949
+ const baseApiClient = authConfig.type === "none" ? createInternalAPIClient(config2.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config2.baseUrl) : createBearerAPIClient(authConfig.token, config2.baseUrl);
56950
+ const apiClient = withDefaultHeaders(baseApiClient, config2.defaultHeaders);
55139
56951
  const cache = new SimpleCache({
55140
56952
  maxSize: cacheMaxSize,
55141
56953
  ttl: cacheTTL,
@@ -61294,12 +63106,19 @@ function buildStyleSelectionApplyInputFromOptions(options) {
61294
63106
  if (!Number.isInteger(baseSelectionVersion) || baseSelectionVersion < 0) {
61295
63107
  throw new Error("--base-selection-version must be a non-negative integer");
61296
63108
  }
63109
+ const siteStyle = getCuratedSiteStyle(asSiteStyleId(options.siteStyleId));
63110
+ const defaultHeaderSelection = siteStyle?.defaultHeaderSelection;
61297
63111
  return {
61298
63112
  siteStyleId: options.siteStyleId,
61299
63113
  buttonPersonalityId: options.buttonPersonalityId ?? null,
61300
63114
  paletteVariantId: options.paletteVariantId ?? null,
61301
63115
  paletteOverrides: parsePaletteOverrides(options.paletteOverrides),
63116
+ typographyPresetId: options.typographyPresetId ?? null,
63117
+ typographyBodyFontOverride: options.typographyBodyFontOverride ?? null,
63118
+ typographyHeadingFontOverride: options.typographyHeadingFontOverride ?? null,
61302
63119
  headerLookId: options.headerLookId ?? null,
63120
+ headerLayoutId: options.headerLayoutId ?? defaultHeaderSelection?.layoutId ?? guaranteedFallbackHeaderLayoutId,
63121
+ headerStyleId: options.headerStyleId ?? defaultHeaderSelection?.styleId ?? guaranteedFallbackHeaderStyleId,
61303
63122
  footerLookId: options.footerLookId ?? null,
61304
63123
  baseSelectionVersion,
61305
63124
  selectionId: options.selectionId ?? null
@@ -61334,6 +63153,18 @@ function buildStyleCatalogListRows(styles = curatedSiteStyles, options = {}) {
61334
63153
  id: choice.id,
61335
63154
  label: findButtonPersonality(choice.id)?.name ?? choice.id
61336
63155
  })),
63156
+ typographyPresets: style.typographyPresetChoices.map((choice) => ({
63157
+ id: choice.id,
63158
+ label: findTypographyPreset(choice.id)?.name ?? choice.id
63159
+ })),
63160
+ headerLayouts: style.recommendedHeaderLayoutChoices.map((choice) => ({
63161
+ id: choice.id,
63162
+ label: getHeaderLayout(choice.id)?.label ?? choice.id
63163
+ })),
63164
+ headerStyles: uniqueChoiceIds(Object.values(style.recommendedHeaderStyleChoicesByLayout).flatMap((choices) => choices?.map((choice) => choice.id) ?? [])).map((styleId) => ({
63165
+ id: styleId,
63166
+ label: getHeaderStyle(styleId)?.label ?? styleId
63167
+ })),
61337
63168
  headerLooks: style.recommendedHeaderLookIds.map((lookId) => ({
61338
63169
  id: lookId,
61339
63170
  label: findHeaderLook(lookId)?.label ?? lookId
@@ -61350,10 +63181,21 @@ function formatStyleCatalogListRow(row) {
61350
63181
  row.name,
61351
63182
  formatChoiceList(row.palettes),
61352
63183
  formatChoiceList(row.buttonPersonalities),
63184
+ formatChoiceList(row.typographyPresets),
63185
+ formatChoiceList(row.headerLayouts),
63186
+ formatChoiceList(row.headerStyles),
61353
63187
  formatChoiceList(row.headerLooks),
61354
63188
  formatChoiceList(row.footerLooks)
61355
63189
  ];
61356
63190
  }
63191
+ function uniqueChoiceIds(choices) {
63192
+ const seen = /* @__PURE__ */ new Set();
63193
+ return choices.filter((choice) => {
63194
+ if (seen.has(choice)) return false;
63195
+ seen.add(choice);
63196
+ return true;
63197
+ });
63198
+ }
61357
63199
  function formatChoiceList(choices) {
61358
63200
  return choices.map((choice) => `${choice.id} (${choice.label})`).join(", ");
61359
63201
  }
@@ -61365,12 +63207,12 @@ var listCommand8 = new Command("list").description("List curated site styles and
61365
63207
  output.error(`Unknown site style: ${options.siteStyleId}`);
61366
63208
  }
61367
63209
  output.table(
61368
- ["Site Style ID", "Name", "Palettes", "Buttons", "Header Looks", "Footer Looks"],
63210
+ ["Site Style ID", "Name", "Palettes", "Buttons", "Typography", "Header Layouts", "Header Styles", "Header Looks", "Footer Looks"],
61369
63211
  rows.map(formatStyleCatalogListRow)
61370
63212
  );
61371
63213
  })
61372
63214
  );
61373
- var applyCommand = new Command("apply").description("Apply a curated site-style selection").requiredOption("--site-style-id <id>", "Site style ID, e.g. site-style:calm-studio").requiredOption("--base-selection-version <version>", "Current style selection version").option("--selection-id <id>", "Current style selection row ID").option("--button-personality-id <id>", "Button personality ID").option("--palette-variant-id <id>", "Palette variant ID").option("--palette-overrides <json>", "JSON object of palette token overrides").option("--header-look-id <id>", "Header look ID").option("--footer-look-id <id>", "Footer look ID").action(
63215
+ var applyCommand = new Command("apply").description("Apply a curated site-style selection").requiredOption("--site-style-id <id>", "Site style ID, e.g. site-style:calm-studio").requiredOption("--base-selection-version <version>", "Current style selection version").option("--selection-id <id>", "Current style selection row ID").option("--button-personality-id <id>", "Button personality ID").option("--palette-variant-id <id>", "Palette variant ID").option("--palette-overrides <json>", "JSON object of palette token overrides").option("--typography-preset-id <id>", "Typography preset ID").option("--typography-body-font-override <family>", "Body font family override").option("--typography-heading-font-override <family>", "Heading font family override").option("--header-look-id <id>", "Legacy header look bridge ID").option("--header-layout-id <id>", "Header layout ID").option("--header-style-id <id>", "Header style ID").option("--footer-look-id <id>", "Footer look ID").action(
61374
63216
  withErrorHandling(async (options, command) => {
61375
63217
  const { output, client } = createCommandContext(command);
61376
63218
  const input = buildStyleSelectionApplyInputFromOptions(options);