@riverbankcms/sdk 0.76.0 → 0.77.1

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 (151) hide show
  1. package/dist/{PreviewEditorSidebar-X2HWXFOL.mjs → PreviewEditorSidebar-DVUG7GK4.mjs} +1019 -442
  2. package/dist/{PreviewEditorUI-AQXIXPOH.mjs → PreviewEditorUI-P7RN4CDS.mjs} +2 -2
  3. package/dist/SdkPreviewModeRuntime-KLPX47SE.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +538 -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 +57 -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/blocks/site-header.d.ts +2 -2
  24. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  25. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +30 -0
  26. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -1
  27. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +7 -0
  28. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +16 -2
  29. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  30. package/dist/_dts/blocks/src/system/runtime/components/multi-step/runtimeFormValidation.d.ts +28 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.d.ts +2 -0
  32. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.server.d.ts +2 -0
  33. package/dist/_dts/blocks/src/system/runtime/nodes/accordionIconTreatment.d.ts +5 -0
  34. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +5 -4
  35. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  36. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -0
  37. package/dist/_dts/content-editor/src/hooks/blockDraftLifecycle.d.ts +48 -0
  38. package/dist/_dts/content-editor/src/hooks/invalidBlockSelectors.d.ts +4 -0
  39. package/dist/_dts/content-editor/src/hooks/publishability.d.ts +47 -0
  40. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  41. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -0
  42. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +2 -1
  43. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -1
  44. package/dist/_dts/editor-blocks/src/block-editor/customBlockRegistry.d.ts +2 -0
  45. package/dist/_dts/editor-blocks/src/block-editor/sdkBlockMerger.d.ts +9 -37
  46. package/dist/_dts/editor-blocks/src/index.d.ts +2 -2
  47. package/dist/_dts/preview-next/src/client/index.d.ts +3 -0
  48. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +5 -1
  49. package/dist/_dts/preview-next/src/client/preview/PreviewDesignCoordinatorContext.d.ts +20 -0
  50. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +7 -2
  51. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +7 -2
  52. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  53. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -0
  54. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +20 -3
  55. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +6 -1
  56. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +14 -4
  57. package/dist/_dts/preview-next/src/client/preview/previewDesignCoordinator.d.ts +73 -0
  58. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +12 -4
  59. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +46 -0
  60. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +6 -1
  61. package/dist/_dts/preview-next/src/client/preview/typographySelectionInput.d.ts +14 -0
  62. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewModeRuntime.d.ts +1 -1
  63. package/dist/_dts/sdk/src/cli/commands/style.d.ts +8 -0
  64. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -1
  65. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  66. package/dist/_dts/sdk/src/client.d.ts +1 -1
  67. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +35 -0
  68. package/dist/_dts/sdk/src/contracts/theme.d.ts +1 -1
  69. package/dist/_dts/sdk/src/index.d.ts +2 -1
  70. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -0
  71. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -2
  72. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  73. package/dist/_dts/sdk/src/version.d.ts +1 -1
  74. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  75. package/dist/_dts/theme-core/src/buttons/personalities/earth-pill.d.ts +16 -0
  76. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  77. package/dist/_dts/theme-core/src/fonts/types.d.ts +1 -1
  78. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  79. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +72 -27
  80. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  81. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +16 -0
  82. package/dist/_dts/theme-core/src/schema.d.ts +306 -30
  83. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +81 -0
  84. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +6 -4
  85. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +81 -0
  86. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +119 -3
  87. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +4 -4
  88. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +13 -0
  89. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  90. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +402 -13
  91. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +6 -0
  92. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  93. package/dist/_dts/theme-core/src/site-styles/persistedIdParseResult.d.ts +9 -0
  94. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +20 -4
  95. package/dist/_dts/theme-core/src/site-styles/types.d.ts +74 -2
  96. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +189 -0
  97. package/dist/{chunk-Q4OLG66B.mjs → chunk-2SPENC5M.mjs} +476 -153
  98. package/dist/{chunk-Z7JLNTJR.mjs → chunk-6SMUFTXD.mjs} +2 -1
  99. package/dist/{chunk-TW2Y4RR5.mjs → chunk-IENWFSLO.mjs} +365 -52
  100. package/dist/{chunk-LYI7TEMH.mjs → chunk-KWJPDZH2.mjs} +4682 -1463
  101. package/dist/{chunk-V5VORNEJ.mjs → chunk-ZYEJLCTN.mjs} +1 -1
  102. package/dist/cli/index.mjs +2314 -267
  103. package/dist/client/{accordion-2YHIBOZH.mjs → accordion-RZMQSYLR.mjs} +1 -1
  104. package/dist/client/{bookingForm-35IBDWAS.mjs → bookingForm-NF4ASVNV.mjs} +2 -2
  105. package/dist/client/bookings.mjs +92 -0
  106. package/dist/client/{carousel-K6XG7NZQ.mjs → carousel-LDX47ZIK.mjs} +1 -1
  107. package/dist/client/{cart-HCFYUTTU.mjs → cart-RGXDS5F4.mjs} +3 -3
  108. package/dist/client/{checkout-J3U4XR7K.mjs → checkout-P7WWSNNY.mjs} +3 -3
  109. package/dist/client/{chunk-BOIHIU7E.mjs → chunk-E2TDNXCL.mjs} +1 -1
  110. package/dist/client/{chunk-PFBX3IQL.mjs → chunk-GMVTOKYG.mjs} +2 -2
  111. package/dist/client/{chunk-FGUIVT2B.mjs → chunk-JNC7CGHX.mjs} +1 -1
  112. package/dist/client/{chunk-SNSWVZEP.mjs → chunk-L3DNHIJX.mjs} +3 -3
  113. package/dist/client/{chunk-7UOSCYY4.mjs → chunk-R56FQ3RR.mjs} +92 -0
  114. package/dist/client/{chunk-J227A3CQ.mjs → chunk-UFSWADAO.mjs} +1 -1
  115. package/dist/client/client.mjs +3579 -1351
  116. package/dist/client/{courseRegistration-ZBXS7VGI.mjs → courseRegistration-7F65K5ZR.mjs} +2 -2
  117. package/dist/client/{eventCalendar-EQQZHJBA.mjs → eventCalendar-GLSC5KTL.mjs} +4 -4
  118. package/dist/client/{eventCombined-JCFTGBFQ.mjs → eventCombined-ZHK4WKUR.mjs} +4 -4
  119. package/dist/client/{eventDetails-HLUTQSYY.mjs → eventDetails-E3PJYBIN.mjs} +4 -4
  120. package/dist/client/{eventListing-FG4MICVB.mjs → eventListing-EMS3WC3E.mjs} +4 -4
  121. package/dist/client/{eventRegistration-GUEB7LBT.mjs → eventRegistration-NZOTVNPI.mjs} +4 -4
  122. package/dist/client/{form-YQEW4YIT.mjs → form-ETFZFATW.mjs} +1 -1
  123. package/dist/client/{headerSection-GTR3TTRM.mjs → headerSection-4LBP7ULT.mjs} +2 -2
  124. package/dist/client/hooks.mjs +2226 -402
  125. package/dist/client/{locationMap-SPC7VGUH.mjs → locationMap-5M655YSJ.mjs} +1 -1
  126. package/dist/client/{newsletterForm-4IW5BLID.mjs → newsletterForm-QOUYW44O.mjs} +1 -1
  127. package/dist/client/{productDetail-KP5H2WJO.mjs → productDetail-O4DOCWQG.mjs} +3 -3
  128. package/dist/client/{productList-3M3M72XZ.mjs → productList-A5RO5WIS.mjs} +3 -3
  129. package/dist/client/rendering/client.mjs +198 -32
  130. package/dist/client/rendering/islands.mjs +18 -18
  131. package/dist/client/rendering.mjs +3573 -1355
  132. package/dist/client/{shop-ACQKVGOM.mjs → shop-L4MZH4I2.mjs} +3 -3
  133. package/dist/preview-next/client/runtime.mjs +4 -4
  134. package/dist/{sdk-runtime-K7HNB4U2.mjs → sdk-runtime-6UT2S7KZ.mjs} +5 -5
  135. package/dist/server/components.mjs +3497 -1333
  136. package/dist/server/config-validation.mjs +2229 -402
  137. package/dist/server/config.mjs +2229 -402
  138. package/dist/server/data.mjs +2226 -402
  139. package/dist/server/index.mjs +31 -2
  140. package/dist/server/next.mjs +3503 -1329
  141. package/dist/server/page-converter.mjs +2213 -403
  142. package/dist/server/prebuild.mjs +1 -1
  143. package/dist/server/rendering/server.mjs +3497 -1333
  144. package/dist/server/rendering.mjs +3497 -1333
  145. package/dist/server/routing.mjs +2250 -363
  146. package/dist/server/server.mjs +2243 -400
  147. package/dist/server/theme-bridge.mjs +1313 -1035
  148. package/dist/server/theme.mjs +237 -12
  149. package/dist/styles/index.css +1081 -1028
  150. package/package.json +1 -1
  151. 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();
@@ -4346,8 +4566,19 @@ var init_schema3 = __esm({
4346
4566
  colorToken: themeColorTokenSchema.nullable().optional()
4347
4567
  });
4348
4568
  proseLinkUnderlineStyleSchema = z.enum(["solid", "dotted", "dashed"]);
4349
- proseLinkUnderlineThicknessSchema = z.enum(["auto", "fromFont", "thin", "medium", "thick"]);
4350
- proseLinkUnderlineOffsetSchema = z.enum(["auto", "tight", "normal", "loose"]);
4569
+ proseLinkUnderlineThicknessSchema = z.enum([
4570
+ "auto",
4571
+ "fromFont",
4572
+ "thin",
4573
+ "medium",
4574
+ "thick"
4575
+ ]);
4576
+ proseLinkUnderlineOffsetSchema = z.enum([
4577
+ "auto",
4578
+ "tight",
4579
+ "normal",
4580
+ "loose"
4581
+ ]);
4351
4582
  proseLinkStyleSchema = z.object({
4352
4583
  colorToken: themeColorTokenSchema.optional(),
4353
4584
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -4358,7 +4589,14 @@ var init_schema3 = __esm({
4358
4589
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
4359
4590
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
4360
4591
  });
4361
- semanticSpacingSchema = z.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
4592
+ semanticSpacingSchema = z.enum([
4593
+ "none",
4594
+ "compact",
4595
+ "cozy",
4596
+ "medium",
4597
+ "comfortable",
4598
+ "spacious"
4599
+ ]);
4362
4600
  boxRoundedSchema = z.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
4363
4601
  boxBackgroundOverlaySchema = z.object({
4364
4602
  type: z.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -4380,12 +4618,36 @@ var init_schema3 = __esm({
4380
4618
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
4381
4619
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
4382
4620
  });
4621
+ noHeadingDecorationSchema = z.object({
4622
+ family: z.literal("none"),
4623
+ placement: z.literal("none")
4624
+ });
4625
+ visibleHeadingDecorationSchema = z.object({
4626
+ family: z.enum(visibleHeadingDecorationFamilyValues),
4627
+ placement: z.enum(visibleHeadingDecorationPlacementValues),
4628
+ colorToken: z.enum(headingDecorationColorTokenValues).optional()
4629
+ });
4630
+ headingDecorationSchema = z.union([
4631
+ noHeadingDecorationSchema,
4632
+ visibleHeadingDecorationSchema
4633
+ ]);
4634
+ accordionIconTreatmentSchema = z.object({
4635
+ iconSet: z.enum(accordionIconSetValues),
4636
+ colorToken: z.enum(accordionIconColorTokenValues),
4637
+ openColorToken: z.enum(accordionIconColorTokenValues).optional(),
4638
+ motion: z.enum(accordionIconMotionValues)
4639
+ });
4383
4640
  sectionStylesOverrideSchema = z.object({
4384
4641
  background: boxBackgroundSchema.nullable().optional(),
4385
4642
  spacing: semanticSpacingSchema.nullable().optional(),
4386
4643
  minHeight: z.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
4387
4644
  tileTreatment: z.enum(tileTreatmentValues).nullable().optional(),
4388
- eyebrowTreatment: z.enum(eyebrowTreatmentValues).nullable().optional()
4645
+ eyebrowTreatment: z.enum(eyebrowTreatmentValues).nullable().optional(),
4646
+ headingDecoration: headingDecorationSchema.nullable().optional(),
4647
+ // Author-level override consumed by later block/editor rendering phases.
4648
+ // Keeping it in section styles lets existing block save APIs persist it.
4649
+ headingDecorationOverride: z.enum(headingDecorationOverrideValues).nullable().optional(),
4650
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
4389
4651
  });
4390
4652
  containerStylesOverrideSchema = z.object({
4391
4653
  background: boxBackgroundSchema.nullable().optional(),
@@ -4478,9 +4740,17 @@ var init_schema3 = __esm({
4478
4740
  focus: z.enum(["glow", "ring", "underline"]),
4479
4741
  label: z.enum(["inside", "above"])
4480
4742
  });
4481
- headerVariant = z.enum(["classic", "centered", "transparent", "floating", "editorial"]);
4743
+ headerVariant = z.enum(["classic", "centered", "transparent", "floating"]);
4482
4744
  headerPositioning = z.enum(["static", "sticky", "fixed"]);
4483
- headerNavStyle = z.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
4745
+ headerNavStyle = z.enum([
4746
+ "minimal",
4747
+ "underline",
4748
+ "underline-grow",
4749
+ "capsule",
4750
+ "scale",
4751
+ "frosted",
4752
+ "solid"
4753
+ ]);
4484
4754
  navFontWeight = z.enum(["regular", "medium", "semibold", "bold"]);
4485
4755
  headerMaxWidth = z.enum(["container", "full"]);
4486
4756
  headerContainerSchema = z.object({
@@ -4528,8 +4798,22 @@ var init_schema3 = __esm({
4528
4798
  textSize: z.enum(["xs", "sm", "base", "lg"]).optional()
4529
4799
  // optional = no override (browser default)
4530
4800
  }).optional();
4531
- headerCtaGapSchema = z.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
4532
- headerCtaTreatmentSchema = z.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
4801
+ headerCtaGapSchema = z.enum([
4802
+ "none",
4803
+ "tight",
4804
+ "compact",
4805
+ "default",
4806
+ "relaxed",
4807
+ "spacious"
4808
+ ]);
4809
+ headerCtaTreatmentSchema = z.enum([
4810
+ "default",
4811
+ "primary",
4812
+ "secondary",
4813
+ "inverted",
4814
+ "outline",
4815
+ "ghost"
4816
+ ]);
4533
4817
  navContainerSchema = z.object({
4534
4818
  type: z.enum(["none", "pill", "glass"]).default("none"),
4535
4819
  tint: z.string().nullable().optional(),
@@ -4584,7 +4868,14 @@ var init_schema3 = __esm({
4584
4868
  footerMode = z.enum(["default", "blocks", "default+blocks", "none"]);
4585
4869
  footerNavLayoutMode = z.enum(["stack", "inline", "inline-wrap"]);
4586
4870
  footerNavLayoutAlign = z.enum(["start", "center", "end", "space-between"]);
4587
- footerSpacing = z.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
4871
+ footerSpacing = z.enum([
4872
+ "none",
4873
+ "tight",
4874
+ "compact",
4875
+ "default",
4876
+ "relaxed",
4877
+ "spacious"
4878
+ ]);
4588
4879
  footerLogoPlacement = z.enum(["left", "right", "above", "below"]);
4589
4880
  footerLogoSize = z.enum(["sm", "md", "lg", "xl"]);
4590
4881
  footerLogoMaxHeight = z.enum(["sm", "md", "lg", "xl"]);
@@ -4649,7 +4940,12 @@ var init_schema3 = __esm({
4649
4940
  logo: footerLogoSchema.optional(),
4650
4941
  bottomBar: footerBottomBarSchema.optional()
4651
4942
  });
4652
- containerPaddingPresetSchema = z.enum(["tight", "compact", "default", "relaxed"]);
4943
+ containerPaddingPresetSchema = z.enum([
4944
+ "tight",
4945
+ "compact",
4946
+ "default",
4947
+ "relaxed"
4948
+ ]);
4653
4949
  layoutSchema = z.object({
4654
4950
  containerPadding: z.object({
4655
4951
  mobile: containerPaddingPresetSchema.optional(),
@@ -4657,8 +4953,24 @@ var init_schema3 = __esm({
4657
4953
  desktop: containerPaddingPresetSchema.optional()
4658
4954
  }).optional()
4659
4955
  }).optional();
4660
- heroTypographySizeSchema = z.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
4661
- heroTypographyLineHeightSchema = z.enum(["tight", "snug", "normal", "relaxed"]);
4956
+ heroTypographySizeSchema = z.enum([
4957
+ "sm",
4958
+ "base",
4959
+ "lg",
4960
+ "xl",
4961
+ "2xl",
4962
+ "3xl",
4963
+ "4xl",
4964
+ "5xl",
4965
+ "6xl",
4966
+ "editorial"
4967
+ ]);
4968
+ heroTypographyLineHeightSchema = z.enum([
4969
+ "tight",
4970
+ "snug",
4971
+ "normal",
4972
+ "relaxed"
4973
+ ]);
4662
4974
  heroResponsiveTypographySchema = z.object({
4663
4975
  headlineSize: heroTypographySizeSchema.optional(),
4664
4976
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -5075,7 +5387,7 @@ var init_soft_natural = __esm({
5075
5387
  });
5076
5388
 
5077
5389
  // ../theme-core/src/palette/variants/warm-neutral.ts
5078
- var warmNeutralClay, warmNeutralCream, warmNeutralForest;
5390
+ var warmNeutralClay, warmNeutralCream, warmNeutralSoftEarth, warmNeutralForest;
5079
5391
  var init_warm_neutral = __esm({
5080
5392
  "../theme-core/src/palette/variants/warm-neutral.ts"() {
5081
5393
  init_types11();
@@ -5123,6 +5435,28 @@ var init_warm_neutral = __esm({
5123
5435
  { name: "border", hex: "#e0d2b8" }
5124
5436
  ]
5125
5437
  });
5438
+ warmNeutralSoftEarth = definePaletteVariant({
5439
+ id: "warm-neutral-soft-earth",
5440
+ name: "Warm Neutral \u2014 Soft Earth",
5441
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
5442
+ tags: { tone: "classic", energy: "calm", era: "organic" },
5443
+ mode: "light",
5444
+ colors: [
5445
+ { name: "primary", hex: "#a8573d" },
5446
+ { name: "secondary", hex: "#72765c" },
5447
+ { name: "accent", hex: "#c87557" },
5448
+ { name: "success", hex: "#687854" },
5449
+ { name: "warning", hex: "#b7863e" },
5450
+ { name: "destructive", hex: "#a54b3c" },
5451
+ { name: "background", hex: "#fbf6eb" },
5452
+ { name: "surface", hex: "#fffdf7" },
5453
+ { name: "surfaceAlt", hex: "#f0e4d3" },
5454
+ { name: "muted", hex: "#eadbc6" },
5455
+ { name: "text", hex: "#30281f" },
5456
+ { name: "primaryForeground", hex: "#fffaf3" },
5457
+ { name: "border", hex: "#d9c8b2" }
5458
+ ]
5459
+ });
5126
5460
  warmNeutralForest = definePaletteVariant({
5127
5461
  id: "warm-neutral-forest",
5128
5462
  name: "Warm Neutral \u2014 Forest",
@@ -5169,6 +5503,7 @@ var init_variants = __esm({
5169
5503
  // Warm-neutral family
5170
5504
  warmNeutralClay,
5171
5505
  warmNeutralCream,
5506
+ warmNeutralSoftEarth,
5172
5507
  warmNeutralForest,
5173
5508
  // High-contrast family
5174
5509
  highContrastInk,
@@ -5196,6 +5531,12 @@ var init_customizableSurfaces = __esm({
5196
5531
  function asHeaderLookId(value) {
5197
5532
  return value;
5198
5533
  }
5534
+ function asHeaderLayoutId(value) {
5535
+ return value;
5536
+ }
5537
+ function asHeaderStyleId(value) {
5538
+ return value;
5539
+ }
5199
5540
  function baseHeader(theme) {
5200
5541
  const {
5201
5542
  navLinkStyle: _navLinkStyle,
@@ -5214,6 +5555,39 @@ function baseHeader(theme) {
5214
5555
  navContainer: { type: "none", tint: null, opacity: 0.15 }
5215
5556
  };
5216
5557
  }
5558
+ function supportedLayouts(ids) {
5559
+ return ids.map(asHeaderLayoutId);
5560
+ }
5561
+ function headerStyleRepairChain(values) {
5562
+ return values.map(asHeaderStyleId);
5563
+ }
5564
+ function getHeaderLayout(id) {
5565
+ return headerLayoutsById.get(id) ?? null;
5566
+ }
5567
+ function getHeaderStyle(id) {
5568
+ return headerStylesById.get(id) ?? null;
5569
+ }
5570
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
5571
+ return style.supportedLayoutIds.includes(layoutId);
5572
+ }
5573
+ function getHeaderStyleOrThrow(id) {
5574
+ const style = getHeaderStyle(id);
5575
+ if (!style) {
5576
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
5577
+ }
5578
+ return style;
5579
+ }
5580
+ function resolveLegacyHeaderLookAlias(lookId) {
5581
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
5582
+ }
5583
+ function getCompatibleHeaderStyleIds(layoutId) {
5584
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
5585
+ (styleId) => {
5586
+ const style = getHeaderStyleOrThrow(styleId);
5587
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
5588
+ }
5589
+ );
5590
+ }
5217
5591
  function solidBrandHeader(theme) {
5218
5592
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
5219
5593
  return {
@@ -5243,8 +5617,14 @@ function solidBrandHeader(theme) {
5243
5617
  borderRadius: "none",
5244
5618
  effects: {
5245
5619
  hover: [
5246
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
5247
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
5620
+ {
5621
+ effectId: "text-color-change",
5622
+ options: { hoverColorToken: "secondary" }
5623
+ },
5624
+ {
5625
+ effectId: "nav-underline",
5626
+ options: { style: "grow", colorToken: "secondary" }
5627
+ }
5248
5628
  ]
5249
5629
  }
5250
5630
  },
@@ -5300,10 +5680,10 @@ function cleanBaseHeader(theme) {
5300
5680
  ctaGap: "default"
5301
5681
  };
5302
5682
  }
5303
- function editorialLineHeader(theme) {
5683
+ function serifLineHeader(theme) {
5304
5684
  return {
5305
5685
  ...baseHeader(theme),
5306
- variant: "editorial",
5686
+ variant: "centered",
5307
5687
  positioning: "sticky",
5308
5688
  shrinkOnScroll: false,
5309
5689
  background: {
@@ -5444,21 +5824,353 @@ function floatingGlassHeader(theme) {
5444
5824
  }
5445
5825
  };
5446
5826
  }
5827
+ function headerConfigurationKey(configuration) {
5828
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
5829
+ }
5447
5830
  function findHeaderLook(id) {
5448
5831
  return headerLooksById.get(id);
5449
5832
  }
5450
- var headerLookCatalog, headerLooksById;
5833
+ var headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, headerLooksById;
5451
5834
  var init_headerLooks = __esm({
5452
5835
  "../theme-core/src/site-styles/headerLooks.ts"() {
5453
5836
  init_headerCtaVariants();
5454
5837
  init_customizableSurfaces();
5455
5838
  init_types2();
5839
+ headerLayoutCatalog = [
5840
+ {
5841
+ id: asHeaderLayoutId("classic"),
5842
+ label: "Classic",
5843
+ description: "Logo and navigation in one practical horizontal row.",
5844
+ structure: "inline-classic",
5845
+ variant: "classic",
5846
+ defaultPositioning: "sticky",
5847
+ shrinkOnScroll: false
5848
+ },
5849
+ {
5850
+ id: asHeaderLayoutId("centered"),
5851
+ label: "Centered",
5852
+ description: "Logo centered above a balanced navigation row.",
5853
+ structure: "centered-stack",
5854
+ variant: "centered",
5855
+ defaultPositioning: "static",
5856
+ shrinkOnScroll: false,
5857
+ maxRecommendedNavItems: 5,
5858
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
5859
+ },
5860
+ {
5861
+ id: asHeaderLayoutId("floating"),
5862
+ label: "Floating",
5863
+ description: "Detached header chrome that sits over the opening section.",
5864
+ structure: "floating-shell",
5865
+ variant: "floating",
5866
+ defaultPositioning: "fixed",
5867
+ shrinkOnScroll: true,
5868
+ maxRecommendedNavItems: 5,
5869
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
5870
+ }
5871
+ ];
5872
+ headerStyleCatalog = [
5873
+ {
5874
+ id: asHeaderStyleId("minimal"),
5875
+ label: "Minimal",
5876
+ description: "Quiet surface with simple color-change navigation.",
5877
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5878
+ navInteraction: "color-change",
5879
+ surface: "neutral",
5880
+ navTypography: "plain"
5881
+ },
5882
+ {
5883
+ id: asHeaderStyleId("fine-line"),
5884
+ label: "Fine Line",
5885
+ description: "Light surface with a crisp lower rule and underline hover.",
5886
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5887
+ navInteraction: "underline-grow",
5888
+ surface: "bordered",
5889
+ navTypography: "plain"
5890
+ },
5891
+ {
5892
+ id: asHeaderStyleId("soft-bar"),
5893
+ label: "Soft Bar",
5894
+ description: "Soft tinted surface with gentle pill hover states.",
5895
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5896
+ navInteraction: "pill-background",
5897
+ surface: "soft",
5898
+ navTypography: "plain"
5899
+ },
5900
+ {
5901
+ id: asHeaderStyleId("pill-nav"),
5902
+ label: "Pill Nav",
5903
+ description: "A calm pill navigation rail over a neutral header.",
5904
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5905
+ navInteraction: "pill-background",
5906
+ surface: "soft",
5907
+ navTypography: "plain"
5908
+ },
5909
+ {
5910
+ id: asHeaderStyleId("brand-bar"),
5911
+ label: "Brand Bar",
5912
+ description: "Solid brand surface with high-contrast navigation.",
5913
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5914
+ navInteraction: "color-change",
5915
+ surface: "brand-solid",
5916
+ navTypography: "brand-caps"
5917
+ },
5918
+ {
5919
+ id: asHeaderStyleId("brand-underline"),
5920
+ label: "Brand Underline",
5921
+ description: "Brand surface with underline-grow navigation.",
5922
+ supportedLayoutIds: supportedLayouts(["classic"]),
5923
+ navInteraction: "underline-grow",
5924
+ surface: "brand-solid",
5925
+ navTypography: "brand-caps"
5926
+ },
5927
+ {
5928
+ id: asHeaderStyleId("brand-pill"),
5929
+ label: "Brand Pill",
5930
+ description: "Solid brand surface with rounded active and hover states.",
5931
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
5932
+ navInteraction: "pill-background",
5933
+ surface: "brand-solid",
5934
+ navTypography: "brand-caps"
5935
+ },
5936
+ {
5937
+ id: asHeaderStyleId("serif-line"),
5938
+ label: "Serif Line",
5939
+ description: "Typographic logo treatment with understated underline navigation.",
5940
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5941
+ navInteraction: "underline-grow",
5942
+ surface: "bordered",
5943
+ navTypography: "heading"
5944
+ },
5945
+ {
5946
+ id: asHeaderStyleId("flat-tabs"),
5947
+ label: "Flat Tabs",
5948
+ description: "Flat block hover and active states with a Swiss utility feel.",
5949
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
5950
+ navInteraction: "flat-block",
5951
+ surface: "bordered",
5952
+ navTypography: "quiet-caps"
5953
+ },
5954
+ {
5955
+ id: asHeaderStyleId("glass"),
5956
+ label: "Glass",
5957
+ description: "Translucent chrome with frosted navigation backing.",
5958
+ supportedLayoutIds: supportedLayouts(["classic", "floating"]),
5959
+ navInteraction: "glass-backed",
5960
+ surface: "floating",
5961
+ navTypography: "plain"
5962
+ },
5963
+ {
5964
+ id: asHeaderStyleId("minimal-surface"),
5965
+ label: "Clear Split",
5966
+ description: "Floating logo with transparent navigation and no shared shell.",
5967
+ supportedLayoutIds: supportedLayouts(["floating"]),
5968
+ navInteraction: "color-change",
5969
+ surface: "floating",
5970
+ navTypography: "plain"
5971
+ },
5972
+ {
5973
+ id: asHeaderStyleId("soft-shell"),
5974
+ label: "Soft Shell",
5975
+ description: "Floating rounded shell with soft pill navigation states.",
5976
+ supportedLayoutIds: supportedLayouts(["floating"]),
5977
+ navInteraction: "pill-background",
5978
+ surface: "floating",
5979
+ navTypography: "plain"
5980
+ },
5981
+ {
5982
+ id: asHeaderStyleId("split-glass"),
5983
+ label: "Split Glass",
5984
+ description: "Logo floats independently while the navigation sits in a glass rail.",
5985
+ supportedLayoutIds: supportedLayouts(["floating"]),
5986
+ navInteraction: "glass-backed",
5987
+ surface: "floating",
5988
+ navTypography: "quiet-caps"
5989
+ },
5990
+ {
5991
+ id: asHeaderStyleId("split-pill"),
5992
+ label: "Split Pill",
5993
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
5994
+ supportedLayoutIds: supportedLayouts(["floating"]),
5995
+ navInteraction: "pill-background",
5996
+ surface: "floating",
5997
+ navTypography: "heading"
5998
+ }
5999
+ ];
6000
+ headerLayoutsById = new Map(
6001
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
6002
+ );
6003
+ headerStylesById = new Map(
6004
+ headerStyleCatalog.map((style) => [style.id, style])
6005
+ );
6006
+ headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
6007
+ [
6008
+ asHeaderLayoutId("classic"),
6009
+ headerStyleRepairChain([
6010
+ "minimal",
6011
+ "glass",
6012
+ "fine-line",
6013
+ "soft-bar",
6014
+ "pill-nav",
6015
+ "brand-bar",
6016
+ "brand-underline",
6017
+ "brand-pill",
6018
+ "serif-line",
6019
+ "flat-tabs"
6020
+ ])
6021
+ ],
6022
+ [
6023
+ asHeaderLayoutId("centered"),
6024
+ headerStyleRepairChain([
6025
+ "minimal",
6026
+ "fine-line",
6027
+ "soft-bar",
6028
+ "pill-nav",
6029
+ "brand-bar",
6030
+ "brand-pill",
6031
+ "serif-line",
6032
+ "flat-tabs"
6033
+ ])
6034
+ ],
6035
+ [
6036
+ asHeaderLayoutId("floating"),
6037
+ headerStyleRepairChain([
6038
+ "glass",
6039
+ "minimal-surface",
6040
+ "split-glass",
6041
+ "split-pill",
6042
+ "soft-shell",
6043
+ "brand-pill"
6044
+ ])
6045
+ ]
6046
+ ]);
6047
+ /* @__PURE__ */ new Map(
6048
+ [
6049
+ [
6050
+ asHeaderStyleId("brand-bar"),
6051
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
6052
+ ],
6053
+ [
6054
+ asHeaderStyleId("brand-underline"),
6055
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
6056
+ ],
6057
+ [
6058
+ asHeaderStyleId("brand-pill"),
6059
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
6060
+ ],
6061
+ [
6062
+ asHeaderStyleId("pill-nav"),
6063
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
6064
+ ],
6065
+ [
6066
+ asHeaderStyleId("flat-tabs"),
6067
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
6068
+ ],
6069
+ [
6070
+ asHeaderStyleId("serif-line"),
6071
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
6072
+ ],
6073
+ [
6074
+ asHeaderStyleId("glass"),
6075
+ headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
6076
+ ],
6077
+ [
6078
+ asHeaderStyleId("soft-shell"),
6079
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
6080
+ ],
6081
+ [
6082
+ asHeaderStyleId("minimal-surface"),
6083
+ headerStyleRepairChain(["minimal-surface", "minimal"])
6084
+ ],
6085
+ [
6086
+ asHeaderStyleId("split-glass"),
6087
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
6088
+ ],
6089
+ [
6090
+ asHeaderStyleId("split-pill"),
6091
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
6092
+ ],
6093
+ [
6094
+ asHeaderStyleId("fine-line"),
6095
+ headerStyleRepairChain(["fine-line", "minimal"])
6096
+ ],
6097
+ [
6098
+ asHeaderStyleId("soft-bar"),
6099
+ headerStyleRepairChain(["soft-bar", "minimal"])
6100
+ ],
6101
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
6102
+ ]
6103
+ );
6104
+ legacyHeaderLookAliases = [
6105
+ {
6106
+ lookId: asHeaderLookId("clean-base"),
6107
+ selection: {
6108
+ layoutId: asHeaderLayoutId("classic"),
6109
+ styleId: asHeaderStyleId("minimal")
6110
+ }
6111
+ },
6112
+ {
6113
+ lookId: asHeaderLookId("brand-solid"),
6114
+ selection: {
6115
+ layoutId: asHeaderLayoutId("classic"),
6116
+ styleId: asHeaderStyleId("brand-bar")
6117
+ }
6118
+ },
6119
+ {
6120
+ lookId: asHeaderLookId("serif-line"),
6121
+ selection: {
6122
+ layoutId: asHeaderLayoutId("centered"),
6123
+ styleId: asHeaderStyleId("serif-line")
6124
+ }
6125
+ },
6126
+ {
6127
+ lookId: asHeaderLookId("centered-calm"),
6128
+ selection: {
6129
+ layoutId: asHeaderLayoutId("centered"),
6130
+ styleId: asHeaderStyleId("minimal")
6131
+ }
6132
+ },
6133
+ {
6134
+ lookId: asHeaderLookId("practical-utility"),
6135
+ selection: {
6136
+ layoutId: asHeaderLayoutId("classic"),
6137
+ styleId: asHeaderStyleId("flat-tabs")
6138
+ }
6139
+ },
6140
+ {
6141
+ lookId: asHeaderLookId("minimal-transparent"),
6142
+ selection: {
6143
+ layoutId: asHeaderLayoutId("classic"),
6144
+ styleId: asHeaderStyleId("minimal")
6145
+ }
6146
+ },
6147
+ {
6148
+ lookId: asHeaderLookId("transparent-overlay"),
6149
+ selection: {
6150
+ layoutId: asHeaderLayoutId("floating"),
6151
+ styleId: asHeaderStyleId("glass")
6152
+ }
6153
+ },
6154
+ {
6155
+ lookId: asHeaderLookId("floating-glass"),
6156
+ selection: {
6157
+ layoutId: asHeaderLayoutId("floating"),
6158
+ styleId: asHeaderStyleId("glass")
6159
+ }
6160
+ }
6161
+ ];
6162
+ legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
5456
6163
  headerLookCatalog = [
5457
6164
  {
5458
6165
  id: asHeaderLookId("clean-base"),
5459
6166
  label: "Clean base",
5460
6167
  visualTreatment: "solid-neutral",
5461
6168
  layoutBehavior: "sticky",
6169
+ configuration: {
6170
+ structure: "inline-classic",
6171
+ treatment: "solid-neutral",
6172
+ behavior: "sticky"
6173
+ },
5462
6174
  openingRequirement: "none",
5463
6175
  compile: cleanBaseHeader
5464
6176
  },
@@ -5467,23 +6179,38 @@ var init_headerLooks = __esm({
5467
6179
  label: "Brand solid",
5468
6180
  visualTreatment: "solid-brand",
5469
6181
  layoutBehavior: "sticky-shrink",
6182
+ configuration: {
6183
+ structure: "inline-classic",
6184
+ treatment: "solid-brand",
6185
+ behavior: "sticky-shrink"
6186
+ },
5470
6187
  openingRequirement: "none",
5471
6188
  compile: solidBrandHeader
5472
6189
  },
5473
6190
  {
5474
- id: asHeaderLookId("editorial-line"),
5475
- label: "Editorial line",
5476
- visualTreatment: "light-editorial",
6191
+ id: asHeaderLookId("serif-line"),
6192
+ label: "Serif line",
6193
+ visualTreatment: "light-serif",
5477
6194
  layoutBehavior: "sticky",
6195
+ configuration: {
6196
+ structure: "centered-stack",
6197
+ treatment: "light-serif",
6198
+ behavior: "sticky"
6199
+ },
5478
6200
  openingRequirement: "none",
5479
6201
  maxRecommendedNavItems: 6,
5480
- compile: editorialLineHeader
6202
+ compile: serifLineHeader
5481
6203
  },
5482
6204
  {
5483
6205
  id: asHeaderLookId("centered-calm"),
5484
6206
  label: "Centered calm",
5485
- visualTreatment: "light-editorial",
6207
+ visualTreatment: "light-serif",
5486
6208
  layoutBehavior: "normal-flow",
6209
+ configuration: {
6210
+ structure: "centered-stack",
6211
+ treatment: "light-serif",
6212
+ behavior: "normal-flow"
6213
+ },
5487
6214
  openingRequirement: "none",
5488
6215
  maxRecommendedNavItems: 5,
5489
6216
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -5494,6 +6221,11 @@ var init_headerLooks = __esm({
5494
6221
  label: "Practical utility",
5495
6222
  visualTreatment: "solid-neutral",
5496
6223
  layoutBehavior: "sticky-shrink",
6224
+ configuration: {
6225
+ structure: "inline-classic",
6226
+ treatment: "solid-neutral",
6227
+ behavior: "sticky-shrink"
6228
+ },
5497
6229
  openingRequirement: "none",
5498
6230
  requiresProminentCta: true,
5499
6231
  compile: practicalUtilityHeader
@@ -5503,6 +6235,11 @@ var init_headerLooks = __esm({
5503
6235
  label: "Minimal transparent",
5504
6236
  visualTreatment: "minimal-transparent",
5505
6237
  layoutBehavior: "normal-flow",
6238
+ configuration: {
6239
+ structure: "inline-classic",
6240
+ treatment: "minimal-transparent",
6241
+ behavior: "normal-flow"
6242
+ },
5506
6243
  openingRequirement: "reserved-space-ok",
5507
6244
  compile: minimalTransparentHeader
5508
6245
  },
@@ -5511,6 +6248,11 @@ var init_headerLooks = __esm({
5511
6248
  label: "Transparent overlay",
5512
6249
  visualTreatment: "transparent-overlay",
5513
6250
  layoutBehavior: "fixed-overlay",
6251
+ configuration: {
6252
+ structure: "inline-classic",
6253
+ treatment: "transparent-overlay",
6254
+ behavior: "fixed-overlay"
6255
+ },
5514
6256
  openingRequirement: "requires-image-hero-with-contrast-overlay",
5515
6257
  maxRecommendedNavItems: 5,
5516
6258
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -5521,12 +6263,22 @@ var init_headerLooks = __esm({
5521
6263
  label: "Floating glass",
5522
6264
  visualTreatment: "floating-glass",
5523
6265
  layoutBehavior: "fixed-floating",
6266
+ configuration: {
6267
+ structure: "floating-shell",
6268
+ treatment: "floating-glass",
6269
+ behavior: "fixed-floating"
6270
+ },
5524
6271
  openingRequirement: "requires-image-hero-with-contrast-overlay",
5525
6272
  maxRecommendedNavItems: 5,
5526
6273
  allowedLogoShapes: ["none", "text-only", "horizontal"],
5527
6274
  compile: floatingGlassHeader
5528
6275
  }
5529
6276
  ];
6277
+ guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
6278
+ guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
6279
+ new Set(
6280
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
6281
+ );
5530
6282
  headerLooksById = new Map(
5531
6283
  headerLookCatalog.map((look) => [look.id, look])
5532
6284
  );
@@ -5685,27 +6437,312 @@ var init_sourceCatalogs = __esm({
5685
6437
  }
5686
6438
  });
5687
6439
 
6440
+ // ../theme-core/src/site-styles/typographyPresets.ts
6441
+ function asTypographyPresetId(value) {
6442
+ if (!value.startsWith("typography-preset:")) {
6443
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
6444
+ }
6445
+ return value;
6446
+ }
6447
+ function defineTypographyPreset(preset2) {
6448
+ return {
6449
+ ...preset2,
6450
+ id: asTypographyPresetId(preset2.id)
6451
+ };
6452
+ }
6453
+ function findTypographyPreset(id) {
6454
+ return typographyPresetsById.get(id);
6455
+ }
6456
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, boldDisplayTypography, typographyPresets, typographyPresetsById;
6457
+ var init_typographyPresets = __esm({
6458
+ "../theme-core/src/site-styles/typographyPresets.ts"() {
6459
+ bodyReadablePolicy = {
6460
+ recommendedCategories: ["sans-serif", "serif"],
6461
+ allowedCategories: ["sans-serif", "serif"],
6462
+ requiresItalicForBody: true,
6463
+ requiresBoldForBody: true
6464
+ };
6465
+ headingFlexiblePolicy = {
6466
+ recommendedCategories: ["sans-serif", "serif", "display"],
6467
+ allowedCategories: ["sans-serif", "serif", "display"]
6468
+ };
6469
+ displayHeadingPolicy = {
6470
+ recommendedCategories: ["display", "sans-serif", "serif"],
6471
+ allowedCategories: ["display", "sans-serif", "serif"]
6472
+ };
6473
+ modernSansTypography = {
6474
+ body: {
6475
+ family: "Inter, system-ui, sans-serif",
6476
+ size: "md",
6477
+ weight: "regular",
6478
+ lineHeight: "relaxed",
6479
+ letterSpacing: "normal"
6480
+ },
6481
+ headings: {
6482
+ default: {
6483
+ family: "Inter, system-ui, sans-serif",
6484
+ weight: "semibold",
6485
+ lineHeight: "normal",
6486
+ letterSpacing: "tight",
6487
+ italic: null,
6488
+ case: null
6489
+ },
6490
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6491
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6492
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
6493
+ },
6494
+ scale: "balanced"
6495
+ };
6496
+ warmRoundedTypography = {
6497
+ body: {
6498
+ family: "Nunito Sans, system-ui, sans-serif",
6499
+ size: "lg",
6500
+ weight: "regular",
6501
+ lineHeight: "relaxed",
6502
+ letterSpacing: "normal"
6503
+ },
6504
+ headings: {
6505
+ default: {
6506
+ family: "Nunito Sans, system-ui, sans-serif",
6507
+ weight: "bold",
6508
+ lineHeight: "normal",
6509
+ letterSpacing: "normal",
6510
+ italic: null,
6511
+ case: null
6512
+ },
6513
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6514
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6515
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
6516
+ },
6517
+ scale: "balanced"
6518
+ };
6519
+ editorialSerifTypography = {
6520
+ body: {
6521
+ family: "Lora, Georgia, serif",
6522
+ size: "lg",
6523
+ weight: "regular",
6524
+ lineHeight: "loose",
6525
+ letterSpacing: "normal"
6526
+ },
6527
+ headings: {
6528
+ default: {
6529
+ family: "Playfair Display, Georgia, serif",
6530
+ weight: "semibold",
6531
+ lineHeight: "normal",
6532
+ letterSpacing: "tight",
6533
+ italic: null,
6534
+ case: null
6535
+ },
6536
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6537
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6538
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
6539
+ },
6540
+ scale: "spacious"
6541
+ };
6542
+ classicSerifTypography = {
6543
+ body: {
6544
+ family: "Libre Baskerville, Georgia, serif",
6545
+ size: "md",
6546
+ weight: "regular",
6547
+ lineHeight: "relaxed",
6548
+ letterSpacing: "normal"
6549
+ },
6550
+ headings: {
6551
+ default: {
6552
+ family: "Cormorant Garamond, Georgia, serif",
6553
+ weight: "semibold",
6554
+ lineHeight: "normal",
6555
+ letterSpacing: "normal",
6556
+ italic: null,
6557
+ case: null
6558
+ },
6559
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6560
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6561
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
6562
+ },
6563
+ scale: "balanced"
6564
+ };
6565
+ luxeContrastTypography = {
6566
+ body: {
6567
+ family: "Manrope, system-ui, sans-serif",
6568
+ size: "md",
6569
+ weight: "regular",
6570
+ lineHeight: "relaxed",
6571
+ letterSpacing: "normal"
6572
+ },
6573
+ headings: {
6574
+ default: {
6575
+ family: "Cormorant Garamond, Georgia, serif",
6576
+ weight: "semibold",
6577
+ lineHeight: "normal",
6578
+ letterSpacing: "tight",
6579
+ italic: null,
6580
+ case: null
6581
+ },
6582
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6583
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6584
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
6585
+ },
6586
+ scale: "spacious"
6587
+ };
6588
+ boldDisplayTypography = {
6589
+ body: {
6590
+ family: "Manrope, system-ui, sans-serif",
6591
+ size: "lg",
6592
+ weight: "regular",
6593
+ lineHeight: "relaxed",
6594
+ letterSpacing: "normal"
6595
+ },
6596
+ headings: {
6597
+ default: {
6598
+ family: '"TAN - PEARL", sans-serif',
6599
+ weight: "bold",
6600
+ lineHeight: "normal",
6601
+ letterSpacing: "tight",
6602
+ colorToken: "primary",
6603
+ italic: null,
6604
+ case: null
6605
+ },
6606
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
6607
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
6608
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
6609
+ },
6610
+ scale: "balanced"
6611
+ };
6612
+ typographyPresets = [
6613
+ defineTypographyPreset({
6614
+ id: "typography-preset:modern-sans",
6615
+ name: "Modern Sans",
6616
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
6617
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
6618
+ recommendedFonts: {
6619
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
6620
+ heading: ["Inter", "Manrope", "Source Sans 3"]
6621
+ },
6622
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
6623
+ typography: modernSansTypography
6624
+ }),
6625
+ defineTypographyPreset({
6626
+ id: "typography-preset:warm-rounded",
6627
+ name: "Warm Rounded",
6628
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
6629
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
6630
+ recommendedFonts: {
6631
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
6632
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
6633
+ },
6634
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
6635
+ typography: warmRoundedTypography
6636
+ }),
6637
+ defineTypographyPreset({
6638
+ id: "typography-preset:editorial-serif",
6639
+ name: "Editorial Serif",
6640
+ description: "Story-led type with warm reading rhythm and expressive headings.",
6641
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
6642
+ recommendedFonts: {
6643
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
6644
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
6645
+ },
6646
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6647
+ typography: editorialSerifTypography
6648
+ }),
6649
+ defineTypographyPreset({
6650
+ id: "typography-preset:classic-serif",
6651
+ name: "Classic Serif",
6652
+ description: "Measured, polished type for premium and established offers.",
6653
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
6654
+ recommendedFonts: {
6655
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
6656
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
6657
+ },
6658
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6659
+ typography: classicSerifTypography
6660
+ }),
6661
+ defineTypographyPreset({
6662
+ id: "typography-preset:luxe-contrast",
6663
+ name: "Luxe Contrast",
6664
+ description: "A restrained sans body paired with elegant high-contrast headings.",
6665
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
6666
+ recommendedFonts: {
6667
+ body: ["Manrope", "Inter", "Source Sans 3"],
6668
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
6669
+ },
6670
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6671
+ typography: luxeContrastTypography
6672
+ }),
6673
+ defineTypographyPreset({
6674
+ id: "typography-preset:bold-display",
6675
+ name: "Bold Display",
6676
+ description: "Punchy display headings with readable sans body copy for branded launches.",
6677
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
6678
+ recommendedFonts: {
6679
+ body: ["Manrope", "Inter", "Space Grotesk"],
6680
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
6681
+ },
6682
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
6683
+ typography: boldDisplayTypography,
6684
+ heroTypography: {
6685
+ headlineSize: "6xl",
6686
+ headlineLineHeight: "tight",
6687
+ subheadlineSize: "editorial",
6688
+ subheadlineLineHeight: "normal",
6689
+ microHeadlineSize: "6xl",
6690
+ microHeadlineLineHeight: "tight",
6691
+ microSubheadlineSize: "xl",
6692
+ microSubheadlineLineHeight: "normal",
6693
+ responsive: {
6694
+ tablet: { headlineSize: "5xl" },
6695
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
6696
+ }
6697
+ }
6698
+ })
6699
+ ];
6700
+ typographyPresetsById = new Map(
6701
+ typographyPresets.map((preset2) => [preset2.id, preset2])
6702
+ );
6703
+ }
6704
+ });
6705
+
5688
6706
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
5689
6707
  function uniqueContentFrameKinds() {
5690
- const kinds = [...new Set(
5691
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
5692
- )];
6708
+ const kinds = [
6709
+ ...new Set(
6710
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
6711
+ )
6712
+ ];
5693
6713
  const firstKind = kinds[0];
5694
6714
  if (!firstKind) {
5695
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
6715
+ throw new Error(
6716
+ "Expected generated design option catalog to expose at least one content frame kind."
6717
+ );
5696
6718
  }
5697
6719
  return [firstKind, ...kinds.slice(1)];
5698
6720
  }
5699
6721
  function defineCuratedSiteStyle(input) {
6722
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
6723
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
6724
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
6725
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
6726
+ if (!typographyPresetChoices.some(
6727
+ (choice) => choice.id === defaultTypographyPresetId
6728
+ )) {
6729
+ throw new Error(
6730
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
6731
+ );
6732
+ }
5700
6733
  return {
5701
6734
  id: asSiteStyleId(input.id),
5702
6735
  name: input.name,
5703
6736
  description: input.description,
5704
6737
  generationBrief: input.generationBrief,
5705
6738
  selectionKeywordRules: input.selectionKeywordRules ?? [],
5706
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
6739
+ siteCreatorSelection: input.siteCreatorSelection ?? {
6740
+ kind: "explicit_only"
6741
+ },
5707
6742
  template: {
5708
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
6743
+ id: asDesignSystemTemplateId(
6744
+ `template:${input.id.replace("site-style:", "")}`
6745
+ ),
5709
6746
  name: input.name,
5710
6747
  version: 1,
5711
6748
  tokenRecipes: input.tokenRecipes,
@@ -5717,11 +6754,27 @@ function defineCuratedSiteStyle(input) {
5717
6754
  },
5718
6755
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
5719
6756
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
5720
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
6757
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
6758
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
6759
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
6760
+ } : inferredHeaderCuration.defaultHeaderSelection,
6761
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
6762
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
6763
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
6764
+ (selection) => ({
6765
+ layoutId: asHeaderLayoutId(selection.layoutId),
6766
+ styleId: asHeaderStyleId(selection.styleId)
6767
+ })
6768
+ ),
6769
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
5721
6770
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
5722
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
6771
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
6772
+ asFooterLookId
6773
+ ),
5723
6774
  buttonPersonalityChoices: input.buttonPersonalityChoices,
5724
- paletteVariantChoices: input.paletteVariantChoices
6775
+ paletteVariantChoices: input.paletteVariantChoices,
6776
+ typographyPresetChoices,
6777
+ defaultTypographyPresetId
5725
6778
  };
5726
6779
  }
5727
6780
  function buttonChoice(id, note) {
@@ -5730,7 +6783,91 @@ function buttonChoice(id, note) {
5730
6783
  function paletteChoice(id, note) {
5731
6784
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
5732
6785
  }
5733
- var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles;
6786
+ function headerLayoutChoice(id, note) {
6787
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
6788
+ }
6789
+ function headerStyleChoice(id, note) {
6790
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
6791
+ }
6792
+ function unbrandHeaderLayoutId(id) {
6793
+ return id;
6794
+ }
6795
+ function uniqueHeaderLayoutChoices(choices) {
6796
+ const seen = /* @__PURE__ */ new Set();
6797
+ const unique = choices.filter((choice) => {
6798
+ if (seen.has(choice.id)) return false;
6799
+ seen.add(choice.id);
6800
+ return true;
6801
+ });
6802
+ const first = unique[0];
6803
+ if (!first) {
6804
+ throw new Error("Expected at least one curated header layout choice.");
6805
+ }
6806
+ return [first, ...unique.slice(1)];
6807
+ }
6808
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
6809
+ const first = choices[0] ?? {
6810
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
6811
+ };
6812
+ return [first, ...choices.slice(1)];
6813
+ }
6814
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
6815
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
6816
+ (selection) => Boolean(selection)
6817
+ );
6818
+ const defaultHeaderSelection = selections[0] ?? {
6819
+ layoutId: asHeaderLayoutId("classic"),
6820
+ styleId: asHeaderStyleId("minimal")
6821
+ };
6822
+ const layoutChoices = uniqueHeaderLayoutChoices(
6823
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
6824
+ );
6825
+ const stylesByLayout = {};
6826
+ for (const layoutChoice of layoutChoices) {
6827
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
6828
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
6829
+ }
6830
+ return {
6831
+ defaultHeaderSelection,
6832
+ recommendedHeaderLayoutChoices: layoutChoices,
6833
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
6834
+ };
6835
+ }
6836
+ function typographyChoice(id, note) {
6837
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
6838
+ }
6839
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
6840
+ switch (recipe) {
6841
+ case "clean-sans":
6842
+ return [
6843
+ typographyChoice("typography-preset:modern-sans"),
6844
+ typographyChoice("typography-preset:luxe-contrast"),
6845
+ typographyChoice("typography-preset:bold-display")
6846
+ ];
6847
+ case "friendly-sans":
6848
+ return [
6849
+ typographyChoice("typography-preset:warm-rounded"),
6850
+ typographyChoice("typography-preset:modern-sans"),
6851
+ typographyChoice("typography-preset:editorial-serif")
6852
+ ];
6853
+ case "serif-editorial":
6854
+ return [
6855
+ typographyChoice("typography-preset:editorial-serif"),
6856
+ typographyChoice("typography-preset:classic-serif"),
6857
+ typographyChoice("typography-preset:warm-rounded")
6858
+ ];
6859
+ case "classic-serif":
6860
+ return [
6861
+ typographyChoice("typography-preset:classic-serif"),
6862
+ typographyChoice("typography-preset:luxe-contrast"),
6863
+ typographyChoice("typography-preset:editorial-serif")
6864
+ ];
6865
+ }
6866
+ }
6867
+ function getCuratedSiteStyle(id) {
6868
+ return curatedSiteStylesById.get(id) ?? null;
6869
+ }
6870
+ var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
5734
6871
  var init_curatedSiteStyles = __esm({
5735
6872
  "../theme-core/src/site-styles/curatedSiteStyles.ts"() {
5736
6873
  init_personalities();
@@ -5740,6 +6877,7 @@ var init_curatedSiteStyles = __esm({
5740
6877
  init_curatedChoices();
5741
6878
  init_sourceCatalogs();
5742
6879
  init_types2();
6880
+ init_typographyPresets();
5743
6881
  curatedSiteStyleIdValues = [
5744
6882
  "site-style:calm-studio",
5745
6883
  "site-style:clear-professional",
@@ -5751,6 +6889,7 @@ var init_curatedSiteStyles = __esm({
5751
6889
  "site-style:personal-retreat-journal",
5752
6890
  "site-style:tactile-workshop",
5753
6891
  "site-style:modern-wellness",
6892
+ "site-style:soft-earth",
5754
6893
  "site-style:bold-launch",
5755
6894
  "site-style:south-west-twerk-school"
5756
6895
  ];
@@ -5832,7 +6971,11 @@ var init_curatedSiteStyles = __esm({
5832
6971
  motion: "subtle"
5833
6972
  },
5834
6973
  compositionBudget: quietBudget,
5835
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
6974
+ recommendedHeaderLookIds: [
6975
+ "centered-calm",
6976
+ "minimal-transparent",
6977
+ "clean-base"
6978
+ ],
5836
6979
  buttonPersonalityChoices: [
5837
6980
  buttonChoice("soft-pill"),
5838
6981
  buttonChoice("pebble"),
@@ -5861,7 +7004,11 @@ var init_curatedSiteStyles = __esm({
5861
7004
  motion: "subtle"
5862
7005
  },
5863
7006
  compositionBudget: balancedBudget,
5864
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
7007
+ recommendedHeaderLookIds: [
7008
+ "practical-utility",
7009
+ "brand-solid",
7010
+ "clean-base"
7011
+ ],
5865
7012
  buttonPersonalityChoices: [
5866
7013
  buttonChoice("confident-chip"),
5867
7014
  buttonChoice("soft-pill"),
@@ -5888,7 +7035,11 @@ var init_curatedSiteStyles = __esm({
5888
7035
  motion: "subtle"
5889
7036
  },
5890
7037
  compositionBudget: balancedBudget,
5891
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
7038
+ recommendedHeaderLookIds: [
7039
+ "serif-line",
7040
+ "minimal-transparent",
7041
+ "centered-calm"
7042
+ ],
5892
7043
  buttonPersonalityChoices: [
5893
7044
  buttonChoice("editorial-link"),
5894
7045
  buttonChoice("soft-pill"),
@@ -5916,7 +7067,11 @@ var init_curatedSiteStyles = __esm({
5916
7067
  motion: "expressive"
5917
7068
  },
5918
7069
  compositionBudget: balancedBudget,
5919
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
7070
+ recommendedHeaderLookIds: [
7071
+ "brand-solid",
7072
+ "practical-utility",
7073
+ "clean-base"
7074
+ ],
5920
7075
  buttonPersonalityChoices: [
5921
7076
  buttonChoice("pebble"),
5922
7077
  buttonChoice("brushed-wash"),
@@ -5933,7 +7088,10 @@ var init_curatedSiteStyles = __esm({
5933
7088
  name: "Quiet Luxury",
5934
7089
  description: "Minimal, confident, and refined for premium experiences and private services.",
5935
7090
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
5936
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
7091
+ siteCreatorSelection: {
7092
+ kind: "site_creator_keyword_heuristic",
7093
+ priority: 20
7094
+ },
5937
7095
  selectionKeywordRules: [
5938
7096
  { kind: "word", value: "luxury" },
5939
7097
  { kind: "word", value: "premium" },
@@ -5951,7 +7109,11 @@ var init_curatedSiteStyles = __esm({
5951
7109
  motion: "none"
5952
7110
  },
5953
7111
  compositionBudget: quietBudget,
5954
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
7112
+ recommendedHeaderLookIds: [
7113
+ "minimal-transparent",
7114
+ "serif-line",
7115
+ "clean-base"
7116
+ ],
5955
7117
  buttonPersonalityChoices: [
5956
7118
  buttonChoice("editorial-link"),
5957
7119
  buttonChoice("confident-chip"),
@@ -5987,7 +7149,11 @@ var init_curatedSiteStyles = __esm({
5987
7149
  motion: "none"
5988
7150
  },
5989
7151
  compositionBudget: quietBudget,
5990
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
7152
+ recommendedHeaderLookIds: [
7153
+ "practical-utility",
7154
+ "brand-solid",
7155
+ "clean-base"
7156
+ ],
5991
7157
  buttonPersonalityChoices: [
5992
7158
  buttonChoice("confident-chip"),
5993
7159
  buttonChoice("pebble"),
@@ -6014,7 +7180,11 @@ var init_curatedSiteStyles = __esm({
6014
7180
  motion: "subtle"
6015
7181
  },
6016
7182
  compositionBudget: balancedBudget,
6017
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
7183
+ recommendedHeaderLookIds: [
7184
+ "centered-calm",
7185
+ "minimal-transparent",
7186
+ "clean-base"
7187
+ ],
6018
7188
  buttonPersonalityChoices: [
6019
7189
  buttonChoice("soft-pill"),
6020
7190
  buttonChoice("pebble"),
@@ -6031,7 +7201,10 @@ var init_curatedSiteStyles = __esm({
6031
7201
  name: "Quiet Practice",
6032
7202
  description: "Grounded, calm, and practical for small appointment-first practices.",
6033
7203
  generationBrief: "Make services, practitioner trust, preparation notes, and booking routes easy to scan. Keep the tone warm and specific, with quiet confidence rather than spa cliches or medical claims.",
6034
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
7204
+ siteCreatorSelection: {
7205
+ kind: "site_creator_keyword_heuristic",
7206
+ priority: 30
7207
+ },
6035
7208
  selectionKeywordRules: [
6036
7209
  { kind: "substring", value: "massage" },
6037
7210
  { kind: "word", value: "bodywork" },
@@ -6052,7 +7225,11 @@ var init_curatedSiteStyles = __esm({
6052
7225
  motion: "subtle"
6053
7226
  },
6054
7227
  compositionBudget: quietBudget,
6055
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
7228
+ recommendedHeaderLookIds: [
7229
+ "practical-utility",
7230
+ "clean-base",
7231
+ "centered-calm"
7232
+ ],
6056
7233
  buttonPersonalityChoices: [
6057
7234
  buttonChoice("pebble"),
6058
7235
  buttonChoice("soft-pill"),
@@ -6069,7 +7246,10 @@ var init_curatedSiteStyles = __esm({
6069
7246
  name: "Personal Retreat Journal",
6070
7247
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
6071
7248
  generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
6072
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
7249
+ siteCreatorSelection: {
7250
+ kind: "site_creator_keyword_heuristic",
7251
+ priority: 40
7252
+ },
6073
7253
  selectionKeywordRules: [
6074
7254
  { kind: "substring", value: "retreat" },
6075
7255
  { kind: "phrase", value: "solo practitioner" },
@@ -6089,7 +7269,11 @@ var init_curatedSiteStyles = __esm({
6089
7269
  motion: "subtle"
6090
7270
  },
6091
7271
  compositionBudget: balancedBudget,
6092
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
7272
+ recommendedHeaderLookIds: [
7273
+ "serif-line",
7274
+ "centered-calm",
7275
+ "minimal-transparent"
7276
+ ],
6093
7277
  buttonPersonalityChoices: [
6094
7278
  buttonChoice("editorial-link"),
6095
7279
  buttonChoice("soft-pill"),
@@ -6106,7 +7290,10 @@ var init_curatedSiteStyles = __esm({
6106
7290
  name: "Tactile Workshop",
6107
7291
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
6108
7292
  generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
6109
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
7293
+ siteCreatorSelection: {
7294
+ kind: "site_creator_keyword_heuristic",
7295
+ priority: 50
7296
+ },
6110
7297
  selectionKeywordRules: [
6111
7298
  { kind: "substring", value: "ceramic" },
6112
7299
  { kind: "word", value: "pottery" },
@@ -6126,8 +7313,15 @@ var init_curatedSiteStyles = __esm({
6126
7313
  motion: "subtle"
6127
7314
  },
6128
7315
  compositionBudget: balancedBudget,
6129
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
6130
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
7316
+ recommendedHeaderLookIds: [
7317
+ "brand-solid",
7318
+ "practical-utility",
7319
+ "clean-base"
7320
+ ],
7321
+ recommendedFooterLookIds: [
7322
+ "site-footer-brand-two-band",
7323
+ "footer-muted-grounding"
7324
+ ],
6131
7325
  buttonPersonalityChoices: [
6132
7326
  buttonChoice("pebble"),
6133
7327
  buttonChoice("confident-chip"),
@@ -6141,12 +7335,121 @@ var init_curatedSiteStyles = __esm({
6141
7335
  paletteChoice("warm-neutral-clay")
6142
7336
  ]
6143
7337
  }),
7338
+ defineCuratedSiteStyle({
7339
+ id: "site-style:soft-earth",
7340
+ name: "Soft Earth",
7341
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
7342
+ 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.",
7343
+ siteCreatorSelection: {
7344
+ kind: "site_creator_keyword_heuristic",
7345
+ priority: 45
7346
+ },
7347
+ selectionKeywordRules: [
7348
+ { kind: "word", value: "meditation" },
7349
+ { kind: "word", value: "wellbeing" },
7350
+ { kind: "substring", value: "retreat" },
7351
+ { kind: "phrase", value: "yoga studio" },
7352
+ { kind: "phrase", value: "mindful movement" }
7353
+ ],
7354
+ tokenRecipes: {
7355
+ palette: "warm-neutral",
7356
+ contrast: "standard",
7357
+ radius: "soft",
7358
+ shadow: "subtle",
7359
+ typography: "serif-editorial",
7360
+ spacing: "airy",
7361
+ motion: "subtle"
7362
+ },
7363
+ compositionBudget: balancedBudget,
7364
+ themeOverrides: {
7365
+ typography: {
7366
+ body: {
7367
+ family: "Inter, system-ui, sans-serif",
7368
+ size: "md",
7369
+ weight: "regular",
7370
+ lineHeight: "relaxed",
7371
+ letterSpacing: "normal"
7372
+ },
7373
+ headings: {
7374
+ default: {
7375
+ family: '"Cormorant Garamond", Georgia, serif',
7376
+ weight: "regular",
7377
+ lineHeight: "normal",
7378
+ letterSpacing: "normal",
7379
+ colorToken: "text",
7380
+ italic: null,
7381
+ case: null
7382
+ },
7383
+ h1: {
7384
+ size: "xl",
7385
+ weight: "regular",
7386
+ lineHeight: "normal",
7387
+ letterSpacing: "normal",
7388
+ italic: null
7389
+ },
7390
+ h2: {
7391
+ size: "lg",
7392
+ weight: "regular",
7393
+ lineHeight: "normal",
7394
+ letterSpacing: "normal",
7395
+ italic: null
7396
+ },
7397
+ h3: {
7398
+ size: "md",
7399
+ weight: "regular",
7400
+ lineHeight: "normal",
7401
+ letterSpacing: "normal",
7402
+ italic: null
7403
+ }
7404
+ },
7405
+ scale: "majorThird"
7406
+ },
7407
+ bodyText: {
7408
+ intro: {
7409
+ paragraphSize: "default",
7410
+ headingSize: "editorial"
7411
+ }
7412
+ }
7413
+ },
7414
+ recommendedAppearancePresetIds: [
7415
+ "hero-brand-scrim",
7416
+ "intro-soft-earth-statement",
7417
+ "feature-cards-soft-earth-offerings",
7418
+ "testimonials-soft-earth-proof-band",
7419
+ "faq-soft-earth-two-column",
7420
+ "contact-form-panel"
7421
+ ],
7422
+ recommendedHeaderLookIds: [
7423
+ "centered-calm",
7424
+ "minimal-transparent",
7425
+ "serif-line"
7426
+ ],
7427
+ recommendedFooterLookIds: [
7428
+ "footer-muted-grounding",
7429
+ "site-footer-brand-two-band"
7430
+ ],
7431
+ buttonPersonalityChoices: [
7432
+ buttonChoice("earth-pill"),
7433
+ buttonChoice("soft-pill"),
7434
+ buttonChoice("pebble"),
7435
+ buttonChoice("editorial-link")
7436
+ ],
7437
+ paletteVariantChoices: [
7438
+ paletteChoice("warm-neutral-soft-earth"),
7439
+ paletteChoice("warm-neutral-clay"),
7440
+ paletteChoice("warm-neutral-forest"),
7441
+ paletteChoice("soft-natural-sage")
7442
+ ]
7443
+ }),
6144
7444
  defineCuratedSiteStyle({
6145
7445
  id: "site-style:bold-launch",
6146
7446
  name: "Bold Launch",
6147
7447
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
6148
7448
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
6149
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
7449
+ siteCreatorSelection: {
7450
+ kind: "site_creator_keyword_heuristic",
7451
+ priority: 10
7452
+ },
6150
7453
  selectionKeywordRules: [
6151
7454
  { kind: "substring", value: "launch" },
6152
7455
  { kind: "substring", value: "campaign" },
@@ -6165,7 +7468,11 @@ var init_curatedSiteStyles = __esm({
6165
7468
  motion: "expressive"
6166
7469
  },
6167
7470
  compositionBudget: expressiveBudget,
6168
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
7471
+ recommendedHeaderLookIds: [
7472
+ "transparent-overlay",
7473
+ "floating-glass",
7474
+ "brand-solid"
7475
+ ],
6169
7476
  buttonPersonalityChoices: [
6170
7477
  buttonChoice("ink-stamp"),
6171
7478
  buttonChoice("confident-chip"),
@@ -6194,49 +7501,13 @@ var init_curatedSiteStyles = __esm({
6194
7501
  motion: "expressive"
6195
7502
  },
6196
7503
  compositionBudget: expressiveBudget,
7504
+ typographyPresetChoices: [
7505
+ typographyChoice("typography-preset:bold-display"),
7506
+ typographyChoice("typography-preset:modern-sans"),
7507
+ typographyChoice("typography-preset:luxe-contrast")
7508
+ ],
7509
+ defaultTypographyPresetId: "typography-preset:bold-display",
6197
7510
  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
7511
  bodyText: {
6241
7512
  intro: {
6242
7513
  paragraphSize: "editorial",
@@ -6252,8 +7523,15 @@ var init_curatedSiteStyles = __esm({
6252
7523
  "testimonials-accent-quote-proof",
6253
7524
  "contact-form-brand-depth-card"
6254
7525
  ],
6255
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
6256
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
7526
+ recommendedHeaderLookIds: [
7527
+ "brand-solid",
7528
+ "transparent-overlay",
7529
+ "practical-utility"
7530
+ ],
7531
+ recommendedFooterLookIds: [
7532
+ "site-footer-brand-two-band",
7533
+ "footer-muted-grounding"
7534
+ ],
6257
7535
  buttonPersonalityChoices: [
6258
7536
  buttonChoice("showtime-pill"),
6259
7537
  buttonChoice("confident-chip"),
@@ -6268,7 +7546,7 @@ var init_curatedSiteStyles = __esm({
6268
7546
  ]
6269
7547
  })
6270
7548
  ];
6271
- new Map(
7549
+ curatedSiteStylesById = new Map(
6272
7550
  curatedSiteStyles.map((style) => [style.id, style])
6273
7551
  );
6274
7552
  }
@@ -6586,6 +7864,7 @@ var init_previewCompiler = __esm({
6586
7864
  init_variants();
6587
7865
  init_curatedChoices();
6588
7866
  init_curatedSiteStyles();
7867
+ init_typographyPresets();
6589
7868
  init_resolver2();
6590
7869
  init_types2();
6591
7870
  init_footerLooks();
@@ -6599,6 +7878,7 @@ var init_previewCompiler = __esm({
6599
7878
  init_runtimeCompiler();
6600
7879
  init_curatedChoices();
6601
7880
  init_curatedSiteStyles();
7881
+ init_typographyPresets();
6602
7882
  init_types2();
6603
7883
  }
6604
7884
  });
@@ -6865,6 +8145,12 @@ var init_pageDesignEditorErrors = __esm({
6865
8145
  "../theme-core/src/site-styles/pageDesignEditorErrors.ts"() {
6866
8146
  }
6867
8147
  });
8148
+
8149
+ // ../theme-core/src/site-styles/persistedIdParseResult.ts
8150
+ var init_persistedIdParseResult = __esm({
8151
+ "../theme-core/src/site-styles/persistedIdParseResult.ts"() {
8152
+ }
8153
+ });
6868
8154
  var themeTokenRecipeOptions;
6869
8155
  var init_tokenRecipes = __esm({
6870
8156
  "../theme-core/src/site-styles/tokenRecipes.ts"() {
@@ -6918,6 +8204,7 @@ var init_site_styles = __esm({
6918
8204
  init_pageDesignEditorModel();
6919
8205
  init_pageDesignIntent();
6920
8206
  init_previewCustomization();
8207
+ init_persistedIdParseResult();
6921
8208
  init_rawStyleFields();
6922
8209
  init_records();
6923
8210
  init_resolver2();
@@ -6926,6 +8213,7 @@ var init_site_styles = __esm({
6926
8213
  init_sourceCatalogs();
6927
8214
  init_styleTags();
6928
8215
  init_tokenRecipes();
8216
+ init_typographyPresets();
6929
8217
  init_types2();
6930
8218
  }
6931
8219
  });
@@ -10998,8 +12286,9 @@ var init_faqAccordion = __esm({
10998
12286
  },
10999
12287
  fallback: "rb-faq-item"
11000
12288
  },
11001
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
11002
- // Pass icon style from theme
12289
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
12290
+ // Legacy theme accordion style
12291
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
11003
12292
  },
11004
12293
  triggerFrom: "faqItem.question",
11005
12294
  contentFrom: "faqItem.answer"
@@ -21643,6 +22932,9 @@ init_schema2();
21643
22932
  var TEL_RE = /^[+()0-9\s-]{3,}$/;
21644
22933
  var SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
21645
22934
  var ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
22935
+ var DATE_PATTERN = /^(?<year>[1-9]\d{3})-(?<month>\d{2})-(?<day>\d{2})$/;
22936
+ var TIME_PATTERN = /^(?<hours>[01]\d|2[0-3]):(?<minutes>[0-5]\d)$/;
22937
+ 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
22938
  function assertNever2(value) {
21647
22939
  throw new Error(`Unhandled field validation variant: ${JSON.stringify(value)}`);
21648
22940
  }
@@ -21675,6 +22967,12 @@ function fieldIssueToMessage(issue2) {
21675
22967
  return "Check the format and try again";
21676
22968
  case "invalidUrl":
21677
22969
  return "Enter a valid web address";
22970
+ case "invalidDate":
22971
+ return "Choose a valid date";
22972
+ case "invalidTime":
22973
+ return "Choose a valid time";
22974
+ case "invalidDateTime":
22975
+ return "Choose a valid date and time";
21678
22976
  case "invalidNumber":
21679
22977
  return `${issue2.label} needs a number`;
21680
22978
  case "tooSmall":
@@ -21711,12 +23009,16 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21711
23009
  case "text": {
21712
23010
  const inputType = field.ui?.inputType;
21713
23011
  if (inputType === "number") {
21714
- const constraints2 = commonConstraints(required, { kind: "numberType" });
23012
+ const constraints2 = commonConstraints(required, {
23013
+ kind: "numberType"
23014
+ });
21715
23015
  if (typeof field.ui?.min === "number") constraints2.push({ kind: "numberMin", minimum: field.ui.min });
21716
23016
  if (typeof field.ui?.max === "number") constraints2.push({ kind: "numberMax", maximum: field.ui.max });
21717
23017
  return makePlan("number", "number", field, path24, required, constraints2);
21718
23018
  }
21719
- const constraints = commonConstraints(required, { kind: "textType" });
23019
+ const constraints = commonConstraints(required, {
23020
+ kind: "textType"
23021
+ });
21720
23022
  if (inputType === "email") constraints.push({ kind: "emailFormat" });
21721
23023
  if (inputType === "tel") constraints.push({ kind: "phoneFormat" });
21722
23024
  if (field.ui?.pattern) constraints.push({ kind: "patternFormat", pattern: field.ui.pattern });
@@ -21724,7 +23026,9 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21724
23026
  return makePlan("string", "string", field, path24, required, constraints);
21725
23027
  }
21726
23028
  case "number": {
21727
- const constraints = commonConstraints(required, { kind: "numberType" });
23029
+ const constraints = commonConstraints(required, {
23030
+ kind: "numberType"
23031
+ });
21728
23032
  if (typeof field.min === "number") constraints.push({ kind: "numberMin", minimum: field.min });
21729
23033
  if (typeof field.max === "number") constraints.push({ kind: "numberMax", maximum: field.max });
21730
23034
  return makePlan("number", "number", field, path24, required, constraints);
@@ -21735,23 +23039,42 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21735
23039
  return makePlan("string", "string", field, path24, required, constraints);
21736
23040
  }
21737
23041
  case "url":
21738
- return makePlan("string", "string", field, path24, required, commonConstraints(
23042
+ return makePlan(
23043
+ "string",
23044
+ "string",
23045
+ field,
23046
+ path24,
21739
23047
  required,
21740
- { kind: "textType" },
21741
- { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) }
21742
- ));
23048
+ commonConstraints(required, { kind: "textType" }, { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) })
23049
+ );
21743
23050
  case "reference":
21744
23051
  return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "referenceText" }));
21745
23052
  case "date":
23053
+ return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }, { kind: "dateFormat" }));
21746
23054
  case "time":
23055
+ return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }, { kind: "timeFormat" }));
21747
23056
  case "datetime":
21748
- return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }));
23057
+ return makePlan(
23058
+ "string",
23059
+ "string",
23060
+ field,
23061
+ path24,
23062
+ required,
23063
+ commonConstraints(required, { kind: "textType" }, { kind: "datetimeFormat" })
23064
+ );
21749
23065
  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
- }));
23066
+ return makePlan(
23067
+ "select",
23068
+ "select",
23069
+ field,
23070
+ path24,
23071
+ required,
23072
+ commonConstraints(required, {
23073
+ kind: "selectOption",
23074
+ source: resolveSelectConstraintSource(field),
23075
+ multiple: Boolean(field.multiple)
23076
+ })
23077
+ );
21755
23078
  case "richText":
21756
23079
  return makePlan("richText", "object", field, path24, required, commonConstraints(required, { kind: "richTextDoc" }));
21757
23080
  case "media":
@@ -21764,7 +23087,11 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
21764
23087
  case "repeater":
21765
23088
  return {
21766
23089
  ...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]) },
23090
+ ...field.polymorphic && field.itemTypes ? {
23091
+ repeatedItemVariants: deriveRepeatedItemVariants(field, [...path24, 0])
23092
+ } : {
23093
+ repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path24, 0])
23094
+ },
21768
23095
  constraints: withRepeaterItemConstraints(field, commonConstraints(required, { kind: "arrayType" }))
21769
23096
  };
21770
23097
  case "group":
@@ -21849,7 +23176,10 @@ function resolveSelectConstraintSource(field) {
21849
23176
  const source = normalizeSelectSource(field);
21850
23177
  switch (source.kind) {
21851
23178
  case "static":
21852
- return { kind: "static", values: field.options.map((option) => option.value) };
23179
+ return {
23180
+ kind: "static",
23181
+ values: field.options.map((option) => option.value)
23182
+ };
21853
23183
  case "site":
21854
23184
  case "sdk":
21855
23185
  return { kind: "runtime", source: source.kind };
@@ -21945,7 +23275,9 @@ function normalizeFieldValue(plan, value, ctx) {
21945
23275
  }
21946
23276
  function normalizeObjectChildren(children, value, ctx) {
21947
23277
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
21948
- const normalized = { ...value };
23278
+ const normalized = {
23279
+ ...value
23280
+ };
21949
23281
  for (const child of children) {
21950
23282
  normalized[child.fieldId] = normalizeFieldValue(child, normalized[child.fieldId], ctx);
21951
23283
  }
@@ -22030,15 +23362,21 @@ function validateStringConstraint(plan, constraint, value) {
22030
23362
  case "maxLength":
22031
23363
  return value.length > constraint.maximum ? [issue(plan, "tooLong", { maximum: constraint.maximum })] : [];
22032
23364
  case "emailFormat":
22033
- return z.email().safeParse(value).success ? [] : [issue(plan, "invalidEmail")];
23365
+ return isCanonicalEmailValue(value) ? [] : [issue(plan, "invalidEmail")];
22034
23366
  case "phoneFormat":
22035
- return TEL_RE.test(value) ? [] : [issue(plan, "invalidPhone")];
23367
+ return isCanonicalPhoneValue(value) ? [] : [issue(plan, "invalidPhone")];
22036
23368
  case "patternFormat": {
22037
23369
  const re = compilePattern(constraint.pattern);
22038
23370
  return re && !re.test(value) ? [issue(plan, "invalidPattern")] : [];
22039
23371
  }
22040
23372
  case "urlFormat":
22041
- return isValidUrl(value, constraint.allowRelative) ? [] : [issue(plan, "invalidUrl")];
23373
+ return isCanonicalUrlValue(value, { allowRelative: constraint.allowRelative }) ? [] : [issue(plan, "invalidUrl")];
23374
+ case "dateFormat":
23375
+ return isValidDateString(value) ? [] : [issue(plan, "invalidDate")];
23376
+ case "timeFormat":
23377
+ return isValidTimeString(value) ? [] : [issue(plan, "invalidTime")];
23378
+ case "datetimeFormat":
23379
+ return isValidDateTimeInstantString(value) ? [] : [issue(plan, "invalidDateTime")];
22042
23380
  case "slugFormat":
22043
23381
  return SLUG_PATTERN.test(value) ? [] : [issue(plan, "invalidSlug")];
22044
23382
  default:
@@ -22075,17 +23413,24 @@ function validateRepeaterPlan(plan, value, ctx) {
22075
23413
  case "arrayType":
22076
23414
  return [];
22077
23415
  case "minItems":
22078
- return value.length < constraint.minimum ? [issue(plan, "tooFewItems", { minimum: constraint.minimum, itemLabel: "item" })] : [];
23416
+ return value.length < constraint.minimum ? [
23417
+ issue(plan, "tooFewItems", {
23418
+ minimum: constraint.minimum,
23419
+ itemLabel: "item"
23420
+ })
23421
+ ] : [];
22079
23422
  case "maxItems":
22080
- return value.length > constraint.maximum ? [issue(plan, "tooManyItems", { maximum: constraint.maximum, itemLabel: "item" })] : [];
23423
+ return value.length > constraint.maximum ? [
23424
+ issue(plan, "tooManyItems", {
23425
+ maximum: constraint.maximum,
23426
+ itemLabel: "item"
23427
+ })
23428
+ ] : [];
22081
23429
  default:
22082
23430
  return assertNever2(constraint);
22083
23431
  }
22084
23432
  });
22085
- return [
22086
- ...constraintIssues,
22087
- ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))
22088
- ];
23433
+ return [...constraintIssues, ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))];
22089
23434
  }
22090
23435
  function validateRepeaterItem(plan, item, index, ctx) {
22091
23436
  if (!isPlainObject(item)) return [];
@@ -22128,9 +23473,7 @@ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
22128
23473
  }))
22129
23474
  } : {},
22130
23475
  ...plan.repeatedItemPlan ? {
22131
- repeatedItemPlan: plan.repeatedItemPlan.map(
22132
- (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
22133
- )
23476
+ repeatedItemPlan: plan.repeatedItemPlan.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
22134
23477
  } : {}
22135
23478
  };
22136
23479
  case "string":
@@ -22217,6 +23560,9 @@ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
22217
23560
  case "invalidPhone":
22218
23561
  case "invalidPattern":
22219
23562
  case "invalidUrl":
23563
+ case "invalidDate":
23564
+ case "invalidTime":
23565
+ case "invalidDateTime":
22220
23566
  case "invalidNumber":
22221
23567
  case "tooSmall":
22222
23568
  case "tooLarge":
@@ -22246,9 +23592,15 @@ function compilePattern(pattern) {
22246
23592
  function isValidNumber(value) {
22247
23593
  return typeof value === "number" && Number.isFinite(value);
22248
23594
  }
22249
- function isValidUrl(value, allowRelative) {
23595
+ function isCanonicalEmailValue(value) {
23596
+ return z.email().safeParse(value).success;
23597
+ }
23598
+ function isCanonicalPhoneValue(value) {
23599
+ return TEL_RE.test(value);
23600
+ }
23601
+ function isCanonicalUrlValue(value, options = {}) {
22250
23602
  if (!value) return false;
22251
- if (allowRelative && value.startsWith("/")) return true;
23603
+ if (options.allowRelative === true && value.startsWith("/")) return true;
22252
23604
  try {
22253
23605
  const parsed = new URL(value);
22254
23606
  return ALLOWED_URL_PROTOCOLS.includes(parsed.protocol);
@@ -22256,6 +23608,53 @@ function isValidUrl(value, allowRelative) {
22256
23608
  return false;
22257
23609
  }
22258
23610
  }
23611
+ function isValidDateString(value) {
23612
+ const match = DATE_PATTERN.exec(value);
23613
+ if (!match?.groups) return false;
23614
+ const year = Number(match.groups.year);
23615
+ const month = Number(match.groups.month);
23616
+ const day = Number(match.groups.day);
23617
+ return isValidCalendarDate(year, month, day);
23618
+ }
23619
+ function isValidTimeString(value) {
23620
+ return TIME_PATTERN.test(value);
23621
+ }
23622
+ function isValidDateTimeInstantString(value) {
23623
+ const match = DATETIME_PATTERN.exec(value);
23624
+ if (!match?.groups) return false;
23625
+ const datePart = match.groups.date;
23626
+ if (!datePart || !isValidDateString(datePart)) return false;
23627
+ return !Number.isNaN(Date.parse(value));
23628
+ }
23629
+ function isValidCalendarDate(year, month, day) {
23630
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) return false;
23631
+ if (year < 1 || month < 1 || month > 12) return false;
23632
+ return day >= 1 && day <= daysInMonth(year, month);
23633
+ }
23634
+ function daysInMonth(year, month) {
23635
+ switch (month) {
23636
+ case 2:
23637
+ return isLeapYear(year) ? 29 : 28;
23638
+ case 4:
23639
+ case 6:
23640
+ case 9:
23641
+ case 11:
23642
+ return 30;
23643
+ case 1:
23644
+ case 3:
23645
+ case 5:
23646
+ case 7:
23647
+ case 8:
23648
+ case 10:
23649
+ case 12:
23650
+ return 31;
23651
+ default:
23652
+ return 0;
23653
+ }
23654
+ }
23655
+ function isLeapYear(year) {
23656
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
23657
+ }
22259
23658
  function isValidSelectValue(value, values, multiple) {
22260
23659
  if (multiple) {
22261
23660
  return Array.isArray(value) && value.every((item) => typeof item === "string" && values.includes(item));
@@ -22548,6 +23947,342 @@ var heroBlockDefinition = {
22548
23947
  manifest: heroManifest
22549
23948
  };
22550
23949
 
23950
+ // ../blocks/src/system/blocks/intro.ts
23951
+ init_defineBlock();
23952
+
23953
+ // ../blocks/src/system/fields/aspectRatio.ts
23954
+ var standardAspectRatioOptions = [
23955
+ { value: "auto", label: "Auto (original)" },
23956
+ { value: "16/9", label: "16:9 (Landscape)" },
23957
+ { value: "4/3", label: "4:3 (Standard)" },
23958
+ { value: "1/1", label: "1:1 (Square)" },
23959
+ { value: "3/4", label: "3:4 (Portrait)" }
23960
+ ];
23961
+ function createAspectRatioField(options = {}) {
23962
+ return {
23963
+ id: options.id ?? "aspectRatio",
23964
+ type: "select",
23965
+ label: options.label ?? "Aspect ratio",
23966
+ ...options.description ? { description: options.description } : {},
23967
+ required: false,
23968
+ defaultValue: options.defaultValue ?? "auto",
23969
+ multiple: false,
23970
+ options: [...standardAspectRatioOptions],
23971
+ ui: {
23972
+ intent: options.uiIntent ?? "display",
23973
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
23974
+ }
23975
+ };
23976
+ }
23977
+
23978
+ // ../blocks/src/system/blocks/intro.ts
23979
+ init_ctas();
23980
+
23981
+ // ../blocks/src/system/fields/imageLayout.ts
23982
+ function createImageColSizeField(options = {}) {
23983
+ const {
23984
+ id = "imageColSize",
23985
+ label = "Image column size",
23986
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
23987
+ defaultValue = "1/3",
23988
+ uiIntent = "display",
23989
+ visibleWhen
23990
+ } = options;
23991
+ return {
23992
+ id,
23993
+ type: "select",
23994
+ label,
23995
+ description,
23996
+ required: false,
23997
+ defaultValue,
23998
+ multiple: false,
23999
+ options: [
24000
+ { value: "1/4", label: "Small (1/4)" },
24001
+ { value: "1/3", label: "Medium (1/3)" },
24002
+ { value: "2/5", label: "Large (2/5)" },
24003
+ { value: "1/2", label: "Extra large (1/2)" },
24004
+ { value: "2/3", label: "Huge (2/3)" }
24005
+ ],
24006
+ ui: {
24007
+ intent: uiIntent,
24008
+ ...visibleWhen ? { visibleWhen } : {}
24009
+ }
24010
+ };
24011
+ }
24012
+ function createImagePositionField(options = {}) {
24013
+ const {
24014
+ id = "imagePosition",
24015
+ label = "Image position",
24016
+ description = "Choose which side the image appears on.",
24017
+ defaultValue = "left",
24018
+ includeAlternate = false,
24019
+ uiIntent = "display",
24020
+ visibleWhen
24021
+ } = options;
24022
+ const positionOptions = [
24023
+ { value: "left", label: "Left" },
24024
+ { value: "right", label: "Right" },
24025
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
24026
+ ];
24027
+ return {
24028
+ id,
24029
+ type: "select",
24030
+ label,
24031
+ description,
24032
+ required: false,
24033
+ defaultValue,
24034
+ multiple: false,
24035
+ // Spread to get a mutable array type without unsafe casts.
24036
+ options: [...positionOptions],
24037
+ ui: {
24038
+ intent: uiIntent,
24039
+ ...visibleWhen ? { visibleWhen } : {}
24040
+ }
24041
+ };
24042
+ }
24043
+
24044
+ // ../blocks/src/system/blocks/intro.ts
24045
+ init_builder();
24046
+ init_fragments();
24047
+ function introHeading(className) {
24048
+ return text(
24049
+ {
24050
+ as: "h2",
24051
+ className
24052
+ },
24053
+ when("content.title"),
24054
+ bind("content.title")
24055
+ );
24056
+ }
24057
+ function introBody(className = "rb-prose rb-max-w-none") {
24058
+ return richText({ className }, bind("content.body"));
24059
+ }
24060
+ function introCtas(justify = "start") {
24061
+ return ctaRow({
24062
+ justify,
24063
+ gap: "md",
24064
+ containerClassName: "rb-mt-2"
24065
+ });
24066
+ }
24067
+ function introCopyStack(options = {}) {
24068
+ return stack(
24069
+ {
24070
+ gap: "md",
24071
+ className: options.className ?? "rb-intro-copy"
24072
+ },
24073
+ [
24074
+ introHeading(options.headingClassName ?? "rb-intro-title"),
24075
+ introBody(options.bodyClassName),
24076
+ introCtas(options.ctaJustify)
24077
+ ]
24078
+ );
24079
+ }
24080
+ var introMedia = media(
24081
+ {
24082
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
24083
+ style: {
24084
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
24085
+ }
24086
+ },
24087
+ bind("content.media")
24088
+ );
24089
+ var centeredCopyLayout = styledSection({
24090
+ children: styledContainer({
24091
+ rootType: "stack",
24092
+ rootProps: { gap: "lg" },
24093
+ children: [
24094
+ introCopyStack({
24095
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
24096
+ headingClassName: "rb-intro-title rb-text-center",
24097
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
24098
+ ctaJustify: "center"
24099
+ })
24100
+ ]
24101
+ }),
24102
+ baseClass: "",
24103
+ spacing: "medium"
24104
+ });
24105
+ var statementCopyLayout = styledSection({
24106
+ children: styledContainer({
24107
+ children: [
24108
+ el(
24109
+ "div",
24110
+ {
24111
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
24112
+ },
24113
+ [
24114
+ introHeading("rb-intro-title rb-max-w-xl"),
24115
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
24116
+ introBody(),
24117
+ introCtas("start")
24118
+ ])
24119
+ ]
24120
+ )
24121
+ ]
24122
+ }),
24123
+ baseClass: "",
24124
+ spacing: "medium"
24125
+ });
24126
+ var statementMediaLayout = styledSection({
24127
+ children: styledContainer({
24128
+ children: [
24129
+ el(
24130
+ "div",
24131
+ {
24132
+ 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"
24133
+ },
24134
+ [
24135
+ introHeading("rb-intro-title rb-max-w-xl"),
24136
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
24137
+ introBody(),
24138
+ introCtas("start")
24139
+ ]),
24140
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
24141
+ ]
24142
+ )
24143
+ ]
24144
+ }),
24145
+ baseClass: "",
24146
+ spacing: "medium"
24147
+ });
24148
+ var mediaCopyLayout = styledSection({
24149
+ children: styledContainer({
24150
+ children: [
24151
+ responsiveTwoColumn({
24152
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
24153
+ text: introCopyStack({
24154
+ className: "rb-intro-copy rb-max-w-xl",
24155
+ headingClassName: "rb-intro-title"
24156
+ }),
24157
+ ratioFrom: "content.ratio",
24158
+ imagePositionFrom: "content.imagePosition",
24159
+ gapFrom: "content.gap",
24160
+ gapFallback: "comfortable",
24161
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
24162
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
24163
+ })
24164
+ ]
24165
+ }),
24166
+ baseClass: "",
24167
+ spacing: "medium"
24168
+ });
24169
+ var introConfig = {
24170
+ id: "block.intro",
24171
+ title: "Intro",
24172
+ category: "layout",
24173
+ includeContainerStyles: true,
24174
+ titleSource: "title",
24175
+ additionalFields: [
24176
+ {
24177
+ id: "title",
24178
+ type: "text",
24179
+ label: "Statement",
24180
+ required: false,
24181
+ multiline: true,
24182
+ maxLength: 160
24183
+ },
24184
+ {
24185
+ id: "body",
24186
+ type: "richText",
24187
+ label: "Text",
24188
+ required: true,
24189
+ ui: {
24190
+ richTextVariant: "limited"
24191
+ }
24192
+ },
24193
+ {
24194
+ id: "media",
24195
+ type: "media",
24196
+ label: "Media",
24197
+ required: false,
24198
+ mediaKinds: ["image"],
24199
+ ui: {
24200
+ intent: "content",
24201
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
24202
+ }
24203
+ },
24204
+ createImagePositionField({
24205
+ id: "imagePosition",
24206
+ label: "Image position",
24207
+ defaultValue: "left",
24208
+ uiIntent: "display",
24209
+ visibleWhen: { field: "variant", equals: "media-copy" }
24210
+ }),
24211
+ {
24212
+ id: "gap",
24213
+ type: "select",
24214
+ label: "Gap between media and text",
24215
+ required: false,
24216
+ defaultValue: "comfortable",
24217
+ multiple: false,
24218
+ options: [
24219
+ { value: "none", label: "None" },
24220
+ { value: "compact", label: "Compact" },
24221
+ { value: "cozy", label: "Cozy" },
24222
+ { value: "medium", label: "Medium" },
24223
+ { value: "comfortable", label: "Comfortable" },
24224
+ { value: "spacious", label: "Spacious" }
24225
+ ],
24226
+ ui: {
24227
+ intent: "display",
24228
+ visibleWhen: { field: "variant", equals: "media-copy" }
24229
+ }
24230
+ },
24231
+ createImageColSizeField({
24232
+ id: "ratio",
24233
+ label: "Media column size",
24234
+ defaultValue: "1/2",
24235
+ uiIntent: "display",
24236
+ visibleWhen: { field: "variant", equals: "media-copy" }
24237
+ }),
24238
+ createAspectRatioField({
24239
+ id: "aspectRatio",
24240
+ label: "Media aspect ratio",
24241
+ description: "Crop media to a consistent aspect ratio.",
24242
+ defaultValue: "auto",
24243
+ visibleWhen: { field: "media", notEquals: null }
24244
+ }),
24245
+ createCtasRepeater({
24246
+ label: "Calls to action",
24247
+ itemLabel: "CTA",
24248
+ maxItems: 2
24249
+ })
24250
+ ],
24251
+ layout: centeredCopyLayout,
24252
+ variants: {
24253
+ "centered-copy": centeredCopyLayout,
24254
+ "statement-copy": statementCopyLayout,
24255
+ "statement-media": statementMediaLayout,
24256
+ "media-copy": mediaCopyLayout
24257
+ },
24258
+ defaultVariant: "statement-copy",
24259
+ variantOptions: {
24260
+ "centered-copy": {
24261
+ label: "Centered copy",
24262
+ description: "A focused intro with centered text and optional calls to action."
24263
+ },
24264
+ "statement-copy": {
24265
+ label: "Statement and copy",
24266
+ description: "A large statement on the left with supporting copy on the right."
24267
+ },
24268
+ "statement-media": {
24269
+ label: "Statement, copy and media",
24270
+ description: "A three-part intro with statement, copy and a small image."
24271
+ },
24272
+ "media-copy": {
24273
+ label: "Media and copy",
24274
+ description: "A compact media/text intro for softer transitions after a hero."
24275
+ }
24276
+ },
24277
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
24278
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
24279
+ icon: "PanelTopOpen"
24280
+ };
24281
+ var introManifest = createBlockManifest(introConfig);
24282
+ var introBlockDefinition = {
24283
+ manifest: introManifest
24284
+ };
24285
+
22551
24286
  // ../blocks/src/system/blocks/body-text.ts
22552
24287
  init_styledSection();
22553
24288
  init_defineBlock();
@@ -23142,6 +24877,37 @@ var faqComposition = composeFragments([
23142
24877
  { fragment: faqHeadingFragment, fieldPriority: 0 },
23143
24878
  { fragment: faqAccordionFragment, fieldPriority: 1 }
23144
24879
  ]);
24880
+ function fragmentLayoutNode(layout) {
24881
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
24882
+ }
24883
+ function isNodeDefinitionArray(layout) {
24884
+ return Array.isArray(layout);
24885
+ }
24886
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
24887
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
24888
+ var defaultLayout = styledSection({
24889
+ children: styledContainer({
24890
+ baseClassName: "rb-relative rb-isolate",
24891
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
24892
+ }),
24893
+ baseClass: ""
24894
+ });
24895
+ var twoColumnLayout = styledSection({
24896
+ children: styledContainer({
24897
+ baseClassName: "rb-relative rb-isolate",
24898
+ children: el(
24899
+ "div",
24900
+ {
24901
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
24902
+ },
24903
+ [
24904
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
24905
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
24906
+ ]
24907
+ )
24908
+ }),
24909
+ baseClass: ""
24910
+ });
23145
24911
  var faqManifest = createBlockManifest({
23146
24912
  id: "block.faq",
23147
24913
  title: "FAQ",
@@ -23158,13 +24924,22 @@ var faqManifest = createBlockManifest({
23158
24924
  label: "FAQ item styles"
23159
24925
  })
23160
24926
  ],
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
- }),
24927
+ layout: defaultLayout,
24928
+ variants: {
24929
+ default: defaultLayout,
24930
+ "two-column": twoColumnLayout
24931
+ },
24932
+ defaultVariant: "default",
24933
+ variantOptions: {
24934
+ default: {
24935
+ label: "Default",
24936
+ description: "A centered heading above one FAQ accordion."
24937
+ },
24938
+ "two-column": {
24939
+ label: "Two column",
24940
+ description: "A left heading column with FAQ items on the right."
24941
+ }
24942
+ },
23168
24943
  description: "Accordion of frequently asked questions and answers.",
23169
24944
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
23170
24945
  icon: "HelpCircle"
@@ -23821,7 +25596,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
23821
25596
  function resolveHeaderVisualStyles(header, tokens) {
23822
25597
  const navContainerType = header?.navContainer?.type ?? "none";
23823
25598
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
23824
- if (hasContainedNav) {
25599
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
25600
+ if (hasContainedNav || hasTransparentVariant) {
23825
25601
  return {
23826
25602
  backgroundToken: "transparent",
23827
25603
  paletteHex: null,
@@ -23879,10 +25655,7 @@ var headerRootClassTransform = {
23879
25655
  const navContainerType = header?.navContainer?.type ?? "none";
23880
25656
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
23881
25657
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
23882
- const classes = [
23883
- config2.base,
23884
- backgroundClass
23885
- ];
25658
+ const classes = [config2.base, backgroundClass];
23886
25659
  if (!hasContainedNav) {
23887
25660
  if (config2.blur) classes.push(config2.blur);
23888
25661
  if (config2.blurSupport) classes.push(config2.blurSupport);
@@ -23897,7 +25670,12 @@ var headerRootClassTransform = {
23897
25670
  if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
23898
25671
  classes.push(config2.shrink);
23899
25672
  }
23900
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
25673
+ const VALID_VARIANTS = [
25674
+ "classic",
25675
+ "centered",
25676
+ "transparent",
25677
+ "floating"
25678
+ ];
23901
25679
  const variant = header?.variant;
23902
25680
  if (variant && VALID_VARIANTS.includes(variant)) {
23903
25681
  classes.push(`header-variant-${variant}`);
@@ -23950,6 +25728,17 @@ var headerRootStyleTransform = {
23950
25728
  return mergeStyles(...styleParts);
23951
25729
  }
23952
25730
  };
25731
+ var headerSectionBackgroundTransform = {
25732
+ id: "layout.headerSectionBackground",
25733
+ kind: "string",
25734
+ summary: "Resolve the inner site-header section background token",
25735
+ run: (value) => {
25736
+ const header = asPartialObject(value);
25737
+ const navContainerType = header?.navContainer?.type ?? "none";
25738
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
25739
+ return usesTransparentRoot ? "raw:transparent" : "background";
25740
+ }
25741
+ };
23953
25742
  var footerRootStyleTransform = {
23954
25743
  id: "layout.footerRootStyle",
23955
25744
  kind: "formatter",
@@ -24208,6 +25997,7 @@ var layoutTransforms = [
24208
25997
  headerRootClassTransform,
24209
25998
  footerRootClassTransform,
24210
25999
  headerRootStyleTransform,
26000
+ headerSectionBackgroundTransform,
24211
26001
  footerRootStyleTransform,
24212
26002
  footerBottomBarClassTransform,
24213
26003
  footerBottomBarContainerClassTransform,
@@ -24497,15 +26287,21 @@ var mobileCta = ctaButton({
24497
26287
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
24498
26288
  {
24499
26289
  type: "div",
24500
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
26290
+ props: {
26291
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
26292
+ }
24501
26293
  },
24502
26294
  {
24503
26295
  type: "div",
24504
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
26296
+ props: {
26297
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
26298
+ }
24505
26299
  },
24506
26300
  {
24507
26301
  type: "div",
24508
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
26302
+ props: {
26303
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
26304
+ }
24509
26305
  }
24510
26306
  ]);
24511
26307
  var mobileToggleButton = {
@@ -24688,31 +26484,12 @@ var floatingLayout = inline(
24688
26484
  ],
24689
26485
  when("$root.theme.header.variant", { equals: "floating" })
24690
26486
  );
24691
- var editorialLayout = stack(
24692
- {
24693
- gap: "md",
24694
- align: "center",
24695
- className: bindProp("$root.theme.header.maxWidth", {
24696
- transforms: pipe(
24697
- tx("layout.maxWidthClass", {
24698
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
24699
- })
24700
- ),
24701
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
24702
- })
24703
- },
24704
- [
24705
- centeredLogoRow,
24706
- createNavRow(
24707
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
24708
- "center"
24709
- )
24710
- ],
24711
- when("$root.theme.header.variant", { equals: "editorial" })
24712
- );
24713
26487
  var headerLayout = headerSection(
24714
26488
  {
24715
- background: "background",
26489
+ background: bindProp("$root.theme.header", {
26490
+ transforms: pipe(tx("layout.headerSectionBackground")),
26491
+ fallback: "background"
26492
+ }),
24716
26493
  allowOverflow: true,
24717
26494
  className: bindProp("$root.theme.header", {
24718
26495
  transforms: pipe(tx("layout.headerRootClass")),
@@ -24720,10 +26497,7 @@ var headerLayout = headerSection(
24720
26497
  }),
24721
26498
  style: bindProp("$root.theme.header", {
24722
26499
  transforms: pipe(tx("layout.headerRootStyle")),
24723
- fallback: mergeStyles(
24724
- textColorStyle("text"),
24725
- borderColorStyle("border")
24726
- )
26500
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
24727
26501
  })
24728
26502
  },
24729
26503
  [
@@ -24732,7 +26506,6 @@ var headerLayout = headerSection(
24732
26506
  centeredLayout,
24733
26507
  transparentLayout,
24734
26508
  floatingLayout,
24735
- editorialLayout,
24736
26509
  mobileOverlay
24737
26510
  ],
24738
26511
  props({
@@ -25653,6 +27426,231 @@ var collectionBlockDefinition = {
25653
27426
  manifest: collectionManifest
25654
27427
  };
25655
27428
 
27429
+ // ../blocks/src/system/blocks/feature-cards.ts
27430
+ init_defineBlock();
27431
+ init_boxStyles();
27432
+ init_ctas();
27433
+ init_builder();
27434
+ init_fragments();
27435
+ init_colorStyles();
27436
+ function grid3(props2, children) {
27437
+ return el("grid", props2 ?? void 0, children ?? void 0);
27438
+ }
27439
+ var sectionHeading = stack(
27440
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
27441
+ [
27442
+ text(
27443
+ {
27444
+ as: "h2",
27445
+ className: "rb-feature-cards-title rb-text-center"
27446
+ },
27447
+ when("content.title"),
27448
+ bind("content.title")
27449
+ ),
27450
+ richText(
27451
+ {
27452
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
27453
+ style: textColorStyle("mutedText")
27454
+ },
27455
+ when("content.description"),
27456
+ bind("content.description")
27457
+ )
27458
+ ]
27459
+ );
27460
+ var featureCard = styledCard(
27461
+ [
27462
+ media(
27463
+ {
27464
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
27465
+ style: {
27466
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
27467
+ }
27468
+ },
27469
+ when("card.media"),
27470
+ bind("card.media")
27471
+ ),
27472
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
27473
+ text(
27474
+ {
27475
+ as: "h3",
27476
+ className: "rb-feature-card-title"
27477
+ },
27478
+ bind("card.title")
27479
+ ),
27480
+ richText(
27481
+ {
27482
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
27483
+ style: textColorStyle("mutedText")
27484
+ },
27485
+ when("card.body"),
27486
+ bind("card.body")
27487
+ ),
27488
+ ctaRow({
27489
+ collectionPath: "ctas",
27490
+ itemName: "cta",
27491
+ gap: "sm",
27492
+ justify: "start",
27493
+ containerClassName: "rb-mt-auto"
27494
+ })
27495
+ ])
27496
+ ],
27497
+ {
27498
+ stylesFrom: "content._cardStyles",
27499
+ backgroundFrom: "content._cardStyles.background",
27500
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
27501
+ },
27502
+ repeat("content.cards", "card")
27503
+ );
27504
+ var cardsLayout = styledSection({
27505
+ children: styledContainer({
27506
+ rootType: "stack",
27507
+ rootProps: { gap: "xl" },
27508
+ children: [
27509
+ sectionHeading,
27510
+ grid3(
27511
+ {
27512
+ cols: {
27513
+ $bind: {
27514
+ from: "content.columns",
27515
+ fallback: 3,
27516
+ coerce: "number"
27517
+ }
27518
+ },
27519
+ gap: "lg"
27520
+ },
27521
+ [featureCard]
27522
+ )
27523
+ ]
27524
+ }),
27525
+ baseClass: "",
27526
+ spacing: "medium"
27527
+ });
27528
+ var featureCardsConfig = {
27529
+ id: "block.feature-cards",
27530
+ title: "Feature Cards",
27531
+ category: "layout",
27532
+ includeContainerStyles: true,
27533
+ titleSource: "title",
27534
+ additionalFields: [
27535
+ {
27536
+ id: "title",
27537
+ type: "text",
27538
+ label: "Title",
27539
+ required: false,
27540
+ multiline: false,
27541
+ maxLength: 120
27542
+ },
27543
+ {
27544
+ id: "description",
27545
+ type: "richText",
27546
+ label: "Description",
27547
+ required: false,
27548
+ ui: {
27549
+ richTextVariant: "limited"
27550
+ }
27551
+ },
27552
+ {
27553
+ id: "columns",
27554
+ type: "select",
27555
+ label: "Columns",
27556
+ required: false,
27557
+ defaultValue: "3",
27558
+ multiple: false,
27559
+ options: [
27560
+ { value: "2", label: "2 columns" },
27561
+ { value: "3", label: "3 columns" },
27562
+ { value: "4", label: "4 columns" }
27563
+ ],
27564
+ ui: { intent: "display" }
27565
+ },
27566
+ {
27567
+ id: "cards",
27568
+ type: "repeater",
27569
+ label: "Cards",
27570
+ required: false,
27571
+ minItems: 1,
27572
+ maxItems: 8,
27573
+ itemLabel: "Card",
27574
+ itemLabelSource: "title",
27575
+ allowConversion: true,
27576
+ ui: {
27577
+ intent: "content"
27578
+ },
27579
+ schema: {
27580
+ fields: [
27581
+ {
27582
+ id: "media",
27583
+ type: "media",
27584
+ label: "Image",
27585
+ required: false,
27586
+ mediaKinds: ["image"]
27587
+ },
27588
+ createAspectRatioField({
27589
+ id: "aspectRatio",
27590
+ label: "Image aspect ratio",
27591
+ defaultValue: "4/3",
27592
+ visibleWhen: { field: "media", notEquals: null }
27593
+ }),
27594
+ {
27595
+ id: "title",
27596
+ type: "text",
27597
+ label: "Title",
27598
+ required: true,
27599
+ multiline: false,
27600
+ maxLength: 120
27601
+ },
27602
+ {
27603
+ id: "body",
27604
+ type: "richText",
27605
+ label: "Text",
27606
+ required: false,
27607
+ ui: {
27608
+ richTextVariant: "limited"
27609
+ }
27610
+ },
27611
+ createCtasRepeater({
27612
+ label: "Calls to action",
27613
+ itemLabel: "CTA",
27614
+ maxItems: 1,
27615
+ button: {
27616
+ variants: [
27617
+ { value: "primary", label: "Primary" },
27618
+ { value: "secondary", label: "Secondary" },
27619
+ { value: "outline", label: "Outline" },
27620
+ { value: "ghost", label: "Ghost" },
27621
+ { value: "link", label: "Link" }
27622
+ ],
27623
+ defaultVariant: "ghost"
27624
+ }
27625
+ })
27626
+ ]
27627
+ }
27628
+ },
27629
+ cardStylesField({
27630
+ id: "_cardStyles",
27631
+ label: "Card styles"
27632
+ })
27633
+ ],
27634
+ layout: cardsLayout,
27635
+ variants: {
27636
+ cards: cardsLayout
27637
+ },
27638
+ defaultVariant: "cards",
27639
+ variantOptions: {
27640
+ cards: {
27641
+ label: "Cards",
27642
+ description: "A responsive grid of image cards with optional calls to action."
27643
+ }
27644
+ },
27645
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
27646
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
27647
+ icon: "PanelsTopLeft"
27648
+ };
27649
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
27650
+ var featureCardsBlockDefinition = {
27651
+ manifest: featureCardsManifest
27652
+ };
27653
+
25656
27654
  // ../blocks/src/system/blocks/media-text.ts
25657
27655
  init_defineBlock();
25658
27656
 
@@ -25748,69 +27746,6 @@ function createCarouselBehaviorFields(options = {}) {
25748
27746
  ];
25749
27747
  return fields3;
25750
27748
  }
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
27749
  var textCardStylesField = (() => {
25815
27750
  const field = cardStylesField({
25816
27751
  id: "_textCardStyles",
@@ -25928,26 +27863,13 @@ var mediaTextManifest = createBlockManifest({
25928
27863
  },
25929
27864
  ui: { intent: "behavior" }
25930
27865
  }),
25931
- {
27866
+ createAspectRatioField({
25932
27867
  id: "aspectRatio",
25933
- type: "select",
25934
27868
  label: "Media aspect ratio",
25935
27869
  description: "Crop media to a consistent aspect ratio.",
25936
- required: false,
25937
27870
  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
- },
27871
+ visibleWhen: { field: "images", notEquals: null }
27872
+ }),
25951
27873
  {
25952
27874
  id: "text",
25953
27875
  type: "richText",
@@ -26077,7 +27999,7 @@ var mediaTextManifest = createBlockManifest({
26077
27999
  whenImagesLength(0)
26078
28000
  );
26079
28001
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
26080
- const defaultLayout = styledSection({
28002
+ const defaultLayout2 = styledSection({
26081
28003
  children: styledContainer({
26082
28004
  rootType: "stack",
26083
28005
  rootProps: { gap: "lg" },
@@ -26109,9 +28031,9 @@ var mediaTextManifest = createBlockManifest({
26109
28031
  spacing: "medium"
26110
28032
  });
26111
28033
  return {
26112
- layout: defaultLayout,
28034
+ layout: defaultLayout2,
26113
28035
  variants: {
26114
- default: defaultLayout
28036
+ default: defaultLayout2
26115
28037
  },
26116
28038
  defaultVariant: "default",
26117
28039
  variantOptions: {
@@ -28102,7 +30024,7 @@ init_builder();
28102
30024
  init_colorStyles();
28103
30025
  init_defineBlock();
28104
30026
  init_fragments();
28105
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
30027
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28106
30028
  var galleryContainer = (children, opts) => {
28107
30029
  const gap = opts?.gap;
28108
30030
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -28182,7 +30104,7 @@ var galleryItem = (options) => stack(
28182
30104
  ],
28183
30105
  repeat("content.images", "item")
28184
30106
  );
28185
- var gridLayout3 = grid3(
30107
+ var gridLayout3 = grid4(
28186
30108
  {
28187
30109
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
28188
30110
  },
@@ -28790,7 +30712,7 @@ init_builder();
28790
30712
  init_fragments();
28791
30713
  init_colorStyles();
28792
30714
  init_defineBlock();
28793
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
30715
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28794
30716
  var videoItem = (options) => stack(
28795
30717
  { gap: "xs", className: options.containerClassName },
28796
30718
  [
@@ -28840,7 +30762,7 @@ var gridColumnsClass = (columns) => {
28840
30762
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
28841
30763
  }
28842
30764
  };
28843
- var createGridLayout = (columns) => grid4(
30765
+ var createGridLayout = (columns) => grid5(
28844
30766
  {
28845
30767
  className: gridColumnsClass(columns)
28846
30768
  },
@@ -30926,6 +32848,40 @@ var systemBlockDefinitionsRaw = [
30926
32848
  })
30927
32849
  ]
30928
32850
  })),
32851
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
32852
+ sectionSurfaces: "supported",
32853
+ contentFrames: ["plain", "panel"],
32854
+ itemSurfaces: "unsupported",
32855
+ headingDecorations: ["organic-squiggle"]
32856
+ }), defineBlockDesignMetadata({
32857
+ flow: bodyFlow,
32858
+ layoutProfiles: [
32859
+ layoutProfile({
32860
+ variantKey: "centered-copy",
32861
+ family: "centered",
32862
+ weight: "featured",
32863
+ bias: "soft"
32864
+ }),
32865
+ layoutProfile({
32866
+ variantKey: "statement-copy",
32867
+ family: "split",
32868
+ weight: "featured",
32869
+ bias: "merge"
32870
+ }),
32871
+ layoutProfile({
32872
+ variantKey: "statement-media",
32873
+ family: "media-text",
32874
+ weight: "featured",
32875
+ bias: "soft"
32876
+ }),
32877
+ layoutProfile({
32878
+ variantKey: "media-copy",
32879
+ family: "media-text",
32880
+ weight: "featured",
32881
+ bias: "soft"
32882
+ })
32883
+ ]
32884
+ })),
30929
32885
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30930
32886
  flow: bodyFlow,
30931
32887
  layoutProfiles: [
@@ -30986,9 +32942,17 @@ var systemBlockDefinitionsRaw = [
30986
32942
  flow: conversionFlow,
30987
32943
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
30988
32944
  })),
30989
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
32945
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
32946
+ sectionSurfaces: "supported",
32947
+ contentFrames: ["plain", "panel"],
32948
+ itemSurfaces: "supported",
32949
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
32950
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
30990
32951
  flow: bodyFlow,
30991
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
32952
+ layoutProfiles: [
32953
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
32954
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
32955
+ ]
30992
32956
  })),
30993
32957
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
30994
32958
  flow: siteChromeFlow,
@@ -31002,7 +32966,8 @@ var systemBlockDefinitionsRaw = [
31002
32966
  sectionSurfaces: "supported",
31003
32967
  contentFrames: ["plain", "panel"],
31004
32968
  itemSurfaces: "supported",
31005
- testimonialCardTreatments: ["default", "accent-quote"]
32969
+ testimonialCardTreatments: ["default", "accent-quote"],
32970
+ headingDecorations: ["short-center-rule"]
31006
32971
  }), defineBlockDesignMetadata({
31007
32972
  flow: proofFlow,
31008
32973
  layoutProfiles: [
@@ -31028,6 +32993,22 @@ var systemBlockDefinitionsRaw = [
31028
32993
  flow: offeringsFlow,
31029
32994
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
31030
32995
  })),
32996
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
32997
+ sectionSurfaces: "supported",
32998
+ contentFrames: ["plain", "panel"],
32999
+ itemSurfaces: "supported",
33000
+ headingDecorations: ["short-center-rule"]
33001
+ }), defineBlockDesignMetadata({
33002
+ flow: offeringsFlow,
33003
+ layoutProfiles: [
33004
+ layoutProfile({
33005
+ variantKey: "cards",
33006
+ family: "grid",
33007
+ weight: "standard",
33008
+ bias: "soft"
33009
+ })
33010
+ ]
33011
+ })),
31031
33012
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
31032
33013
  flow: mediaFlow,
31033
33014
  layoutProfiles: [
@@ -34881,8 +36862,10 @@ z.object({
34881
36862
  var SYSTEM_BLOCK_KINDS = [
34882
36863
  // Layout blocks
34883
36864
  "block.hero",
36865
+ "block.intro",
34884
36866
  "block.columns",
34885
36867
  "block.collection",
36868
+ "block.feature-cards",
34886
36869
  "block.media-text",
34887
36870
  "block.cta-full",
34888
36871
  "block.single-button",
@@ -36336,7 +38319,12 @@ function buildApplySiteStyleSelectionCommand(input) {
36336
38319
  buttonPersonalityId: input.buttonPersonalityId,
36337
38320
  paletteVariantId: input.paletteVariantId,
36338
38321
  paletteOverrides: input.paletteOverrides,
38322
+ typographyPresetId: input.typographyPresetId,
38323
+ typographyBodyFontOverride: input.typographyBodyFontOverride,
38324
+ typographyHeadingFontOverride: input.typographyHeadingFontOverride,
36339
38325
  headerLookId: input.headerLookId,
38326
+ headerLayoutId: input.headerLayoutId,
38327
+ headerStyleId: input.headerStyleId,
36340
38328
  footerLookId: input.footerLookId,
36341
38329
  baseSelectionVersion: input.baseSelectionVersion
36342
38330
  }
@@ -36352,7 +38340,12 @@ function applySiteStyleSelectionBodyFromCommand(command, selectionId) {
36352
38340
  buttonPersonalityId: command.input.buttonPersonalityId,
36353
38341
  paletteVariantId: command.input.paletteVariantId,
36354
38342
  paletteOverrides: command.input.paletteOverrides,
38343
+ typographyPresetId: command.input.typographyPresetId,
38344
+ typographyBodyFontOverride: command.input.typographyBodyFontOverride,
38345
+ typographyHeadingFontOverride: command.input.typographyHeadingFontOverride,
36355
38346
  headerLookId: command.input.headerLookId,
38347
+ headerLayoutId: command.input.headerLayoutId,
38348
+ headerStyleId: command.input.headerStyleId,
36356
38349
  footerLookId: command.input.footerLookId,
36357
38350
  baseSelectionVersion,
36358
38351
  selectionId
@@ -44194,7 +46187,12 @@ var applySiteStyleSelectionCommandSchema = z.object({
44194
46187
  buttonPersonalityId: styleCatalogIdSchema.nullable(),
44195
46188
  paletteVariantId: styleCatalogIdSchema.nullable(),
44196
46189
  paletteOverrides: paletteOverridesSchema2.nullable(),
46190
+ typographyPresetId: styleCatalogIdSchema.nullable().optional(),
46191
+ typographyBodyFontOverride: z.string().trim().min(1).nullable().optional(),
46192
+ typographyHeadingFontOverride: z.string().trim().min(1).nullable().optional(),
44197
46193
  headerLookId: styleCatalogIdSchema.nullable(),
46194
+ headerLayoutId: styleCatalogIdSchema,
46195
+ headerStyleId: styleCatalogIdSchema,
44198
46196
  footerLookId: styleCatalogIdSchema.nullable(),
44199
46197
  baseSelectionVersion: styleSelectionVersionSchema.optional()
44200
46198
  }).strict()
@@ -54508,7 +56506,7 @@ var SimpleCache = class {
54508
56506
  };
54509
56507
 
54510
56508
  // src/version.ts
54511
- var SDK_VERSION = "0.76.0";
56509
+ var SDK_VERSION = "0.77.1";
54512
56510
 
54513
56511
  // src/client/error.ts
54514
56512
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -54936,6 +56934,24 @@ function getPrebuildModule() {
54936
56934
  return null;
54937
56935
  }
54938
56936
  }
56937
+ function mergeDefaultHeaders(defaultHeaders, options) {
56938
+ if (!defaultHeaders || Object.keys(defaultHeaders).length === 0) {
56939
+ return options;
56940
+ }
56941
+ return {
56942
+ ...options,
56943
+ headers: {
56944
+ ...defaultHeaders,
56945
+ ...Object.fromEntries(new Headers(options?.headers).entries())
56946
+ }
56947
+ };
56948
+ }
56949
+ function withDefaultHeaders(apiClient, defaultHeaders) {
56950
+ return async (params) => apiClient({
56951
+ ...params,
56952
+ options: mergeDefaultHeaders(defaultHeaders, params.options)
56953
+ });
56954
+ }
54939
56955
  setSdkVersion(SDK_VERSION);
54940
56956
  var DEFAULT_BROWSER_TIMEOUT_MS = 5e3;
54941
56957
  var DEFAULT_SERVER_TIMEOUT_MS = 8e3;
@@ -55135,7 +57151,8 @@ function createRiverbankClient(config2) {
55135
57151
  keyType = "preview";
55136
57152
  break;
55137
57153
  }
55138
- const apiClient = authConfig.type === "none" ? createInternalAPIClient(config2.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config2.baseUrl) : createBearerAPIClient(authConfig.token, config2.baseUrl);
57154
+ const baseApiClient = authConfig.type === "none" ? createInternalAPIClient(config2.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config2.baseUrl) : createBearerAPIClient(authConfig.token, config2.baseUrl);
57155
+ const apiClient = withDefaultHeaders(baseApiClient, config2.defaultHeaders);
55139
57156
  const cache = new SimpleCache({
55140
57157
  maxSize: cacheMaxSize,
55141
57158
  ttl: cacheTTL,
@@ -61294,12 +63311,19 @@ function buildStyleSelectionApplyInputFromOptions(options) {
61294
63311
  if (!Number.isInteger(baseSelectionVersion) || baseSelectionVersion < 0) {
61295
63312
  throw new Error("--base-selection-version must be a non-negative integer");
61296
63313
  }
63314
+ const siteStyle = getCuratedSiteStyle(asSiteStyleId(options.siteStyleId));
63315
+ const defaultHeaderSelection = siteStyle?.defaultHeaderSelection;
61297
63316
  return {
61298
63317
  siteStyleId: options.siteStyleId,
61299
63318
  buttonPersonalityId: options.buttonPersonalityId ?? null,
61300
63319
  paletteVariantId: options.paletteVariantId ?? null,
61301
63320
  paletteOverrides: parsePaletteOverrides(options.paletteOverrides),
63321
+ typographyPresetId: options.typographyPresetId ?? null,
63322
+ typographyBodyFontOverride: options.typographyBodyFontOverride ?? null,
63323
+ typographyHeadingFontOverride: options.typographyHeadingFontOverride ?? null,
61302
63324
  headerLookId: options.headerLookId ?? null,
63325
+ headerLayoutId: options.headerLayoutId ?? defaultHeaderSelection?.layoutId ?? guaranteedFallbackHeaderLayoutId,
63326
+ headerStyleId: options.headerStyleId ?? defaultHeaderSelection?.styleId ?? guaranteedFallbackHeaderStyleId,
61303
63327
  footerLookId: options.footerLookId ?? null,
61304
63328
  baseSelectionVersion,
61305
63329
  selectionId: options.selectionId ?? null
@@ -61334,6 +63358,18 @@ function buildStyleCatalogListRows(styles = curatedSiteStyles, options = {}) {
61334
63358
  id: choice.id,
61335
63359
  label: findButtonPersonality(choice.id)?.name ?? choice.id
61336
63360
  })),
63361
+ typographyPresets: style.typographyPresetChoices.map((choice) => ({
63362
+ id: choice.id,
63363
+ label: findTypographyPreset(choice.id)?.name ?? choice.id
63364
+ })),
63365
+ headerLayouts: style.recommendedHeaderLayoutChoices.map((choice) => ({
63366
+ id: choice.id,
63367
+ label: getHeaderLayout(choice.id)?.label ?? choice.id
63368
+ })),
63369
+ headerStyles: uniqueChoiceIds(Object.values(style.recommendedHeaderStyleChoicesByLayout).flatMap((choices) => choices?.map((choice) => choice.id) ?? [])).map((styleId) => ({
63370
+ id: styleId,
63371
+ label: getHeaderStyle(styleId)?.label ?? styleId
63372
+ })),
61337
63373
  headerLooks: style.recommendedHeaderLookIds.map((lookId) => ({
61338
63374
  id: lookId,
61339
63375
  label: findHeaderLook(lookId)?.label ?? lookId
@@ -61350,10 +63386,21 @@ function formatStyleCatalogListRow(row) {
61350
63386
  row.name,
61351
63387
  formatChoiceList(row.palettes),
61352
63388
  formatChoiceList(row.buttonPersonalities),
63389
+ formatChoiceList(row.typographyPresets),
63390
+ formatChoiceList(row.headerLayouts),
63391
+ formatChoiceList(row.headerStyles),
61353
63392
  formatChoiceList(row.headerLooks),
61354
63393
  formatChoiceList(row.footerLooks)
61355
63394
  ];
61356
63395
  }
63396
+ function uniqueChoiceIds(choices) {
63397
+ const seen = /* @__PURE__ */ new Set();
63398
+ return choices.filter((choice) => {
63399
+ if (seen.has(choice)) return false;
63400
+ seen.add(choice);
63401
+ return true;
63402
+ });
63403
+ }
61357
63404
  function formatChoiceList(choices) {
61358
63405
  return choices.map((choice) => `${choice.id} (${choice.label})`).join(", ");
61359
63406
  }
@@ -61365,12 +63412,12 @@ var listCommand8 = new Command("list").description("List curated site styles and
61365
63412
  output.error(`Unknown site style: ${options.siteStyleId}`);
61366
63413
  }
61367
63414
  output.table(
61368
- ["Site Style ID", "Name", "Palettes", "Buttons", "Header Looks", "Footer Looks"],
63415
+ ["Site Style ID", "Name", "Palettes", "Buttons", "Typography", "Header Layouts", "Header Styles", "Header Looks", "Footer Looks"],
61369
63416
  rows.map(formatStyleCatalogListRow)
61370
63417
  );
61371
63418
  })
61372
63419
  );
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(
63420
+ 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
63421
  withErrorHandling(async (options, command) => {
61375
63422
  const { output, client } = createCommandContext(command);
61376
63423
  const input = buildStyleSelectionApplyInputFromOptions(options);