@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
@@ -6659,6 +6659,7 @@ var ALLOWED_TRANSFORM_IDS = [
6659
6659
  "layout.headerRootClass",
6660
6660
  "layout.footerRootClass",
6661
6661
  "layout.headerRootStyle",
6662
+ "layout.headerSectionBackground",
6662
6663
  "layout.footerRootStyle",
6663
6664
  // UI (ui.ts)
6664
6665
  "ui.headerNavLinkClass",
@@ -7607,6 +7608,47 @@ var eyebrowTreatmentValues = [
7607
7608
  "pill-bounce",
7608
7609
  "accent-pill-bounce"
7609
7610
  ];
7611
+ var visibleHeadingDecorationFamilyValues = [
7612
+ "organic-squiggle",
7613
+ "short-center-rule"
7614
+ ];
7615
+ var visibleHeadingDecorationPlacementValues = [
7616
+ "after-heading",
7617
+ "between-heading-and-body",
7618
+ "under-centered-heading"
7619
+ ];
7620
+ var headingDecorationOverrideValues = [
7621
+ "site-default",
7622
+ "on",
7623
+ "off"
7624
+ ];
7625
+ var headingDecorationColorTokenValues = [
7626
+ "text",
7627
+ "primary",
7628
+ "secondary",
7629
+ "accent",
7630
+ "border",
7631
+ "muted"
7632
+ ];
7633
+ var accordionIconSetValues = [
7634
+ "plus",
7635
+ "chevron",
7636
+ "caret",
7637
+ "minimal-cross"
7638
+ ];
7639
+ var accordionIconColorTokenValues = [
7640
+ "text",
7641
+ "muted",
7642
+ "primary",
7643
+ "secondary",
7644
+ "accent",
7645
+ "current"
7646
+ ];
7647
+ var accordionIconMotionValues = [
7648
+ "none",
7649
+ "rotate",
7650
+ "swap"
7651
+ ];
7610
7652
  function defineBlockDesignCapability(capability) {
7611
7653
  return {
7612
7654
  ...capability,
@@ -7616,7 +7658,9 @@ function defineBlockDesignCapability(capability) {
7616
7658
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7617
7659
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7618
7660
  tileTreatments: capability.tileTreatments ?? ["default"],
7619
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7661
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7662
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7663
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
7620
7664
  };
7621
7665
  }
7622
7666
 
@@ -7807,6 +7851,25 @@ var blockAppearancePresets = [
7807
7851
  emphasis: "high"
7808
7852
  }
7809
7853
  }),
7854
+ defineBlockAppearancePreset({
7855
+ kind: "block-design",
7856
+ id: "intro-soft-earth-statement",
7857
+ target: "intro",
7858
+ label: "Soft Earth intro statement",
7859
+ blockKinds: ["block.intro"],
7860
+ design: {
7861
+ sectionSurface: "base",
7862
+ contentFrame: plainFrame,
7863
+ itemSurface: "none",
7864
+ transitionAfter: "soft-fade-short",
7865
+ emphasis: "high",
7866
+ headingDecoration: {
7867
+ family: "organic-squiggle",
7868
+ placement: "after-heading",
7869
+ colorToken: "primary"
7870
+ }
7871
+ }
7872
+ }),
7810
7873
  defineBlockAppearancePreset({
7811
7874
  kind: "block-design",
7812
7875
  id: "offerings-calm-list",
@@ -7821,6 +7884,25 @@ var blockAppearancePresets = [
7821
7884
  emphasis: "medium"
7822
7885
  }
7823
7886
  }),
7887
+ defineBlockAppearancePreset({
7888
+ kind: "block-design",
7889
+ id: "feature-cards-soft-earth-offerings",
7890
+ target: "feature-cards",
7891
+ label: "Soft Earth offering cards",
7892
+ blockKinds: ["block.feature-cards"],
7893
+ design: {
7894
+ sectionSurface: "base",
7895
+ contentFrame: plainFrame,
7896
+ itemSurface: "raised",
7897
+ transitionAfter: "none",
7898
+ emphasis: "high",
7899
+ headingDecoration: {
7900
+ family: "short-center-rule",
7901
+ placement: "under-centered-heading",
7902
+ colorToken: "primary"
7903
+ }
7904
+ }
7905
+ }),
7824
7906
  defineBlockAppearancePreset({
7825
7907
  kind: "block-design",
7826
7908
  id: "events-base-calendar",
@@ -7949,6 +8031,26 @@ var blockAppearancePresets = [
7949
8031
  testimonialCardTreatment: "accent-quote"
7950
8032
  }
7951
8033
  }),
8034
+ defineBlockAppearancePreset({
8035
+ kind: "block-design",
8036
+ id: "testimonials-soft-earth-proof-band",
8037
+ target: "testimonials",
8038
+ label: "Soft Earth proof band",
8039
+ blockKinds: ["block.testimonials"],
8040
+ design: {
8041
+ sectionSurface: "brand-depth-band",
8042
+ contentFrame: plainFrame,
8043
+ itemSurface: "none",
8044
+ transitionAfter: "soft-fade-short",
8045
+ emphasis: "high",
8046
+ testimonialCardTreatment: "accent-quote",
8047
+ headingDecoration: {
8048
+ family: "short-center-rule",
8049
+ placement: "under-centered-heading",
8050
+ colorToken: "border"
8051
+ }
8052
+ }
8053
+ }),
7952
8054
  defineBlockAppearancePreset({
7953
8055
  kind: "block-design",
7954
8056
  id: "faq-base-accordion",
@@ -7977,6 +8079,25 @@ var blockAppearancePresets = [
7977
8079
  emphasis: "low"
7978
8080
  }
7979
8081
  }),
8082
+ defineBlockAppearancePreset({
8083
+ kind: "block-design",
8084
+ id: "faq-soft-earth-two-column",
8085
+ target: "faq",
8086
+ label: "Soft Earth two-column FAQ",
8087
+ blockKinds: ["block.faq"],
8088
+ design: {
8089
+ sectionSurface: "base",
8090
+ contentFrame: plainFrame,
8091
+ itemSurface: "flat",
8092
+ transitionAfter: "none",
8093
+ emphasis: "medium",
8094
+ accordionIconTreatment: {
8095
+ iconSet: "plus",
8096
+ colorToken: "primary",
8097
+ motion: "swap"
8098
+ }
8099
+ }
8100
+ }),
7980
8101
  defineBlockAppearancePreset({
7981
8102
  kind: "block-design",
7982
8103
  id: "contact-form-panel",
@@ -8662,6 +8783,97 @@ var confidentChip = defineButtonPersonality({
8662
8783
  }
8663
8784
  });
8664
8785
 
8786
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
8787
+ var earthPill = defineButtonPersonality({
8788
+ id: "earth-pill",
8789
+ name: "Earth Pill",
8790
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
8791
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
8792
+ buttonSystem: {
8793
+ global: {
8794
+ cornerStyle: "pill",
8795
+ shadow: "low",
8796
+ textTransform: "none",
8797
+ fontWeight: 500,
8798
+ borderWidth: 1,
8799
+ hoverTransform: "lift",
8800
+ hoverColor: "none",
8801
+ typography: "body",
8802
+ paddingPreset: "default"
8803
+ },
8804
+ sizes: {
8805
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
8806
+ md: { padding: "0.625rem 1.35rem" },
8807
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
8808
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
8809
+ },
8810
+ variants: [
8811
+ {
8812
+ id: "primary",
8813
+ name: "Primary",
8814
+ enabled: true,
8815
+ priority: 1,
8816
+ background: { type: "solid", colorToken: "primary" },
8817
+ textColorToken: "primaryForeground",
8818
+ borderRadius: "rounded-full",
8819
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8820
+ effects: {
8821
+ hover: [
8822
+ { effectId: "lift", options: { translateY: "-1px" } },
8823
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
8824
+ ],
8825
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8826
+ }
8827
+ },
8828
+ {
8829
+ id: "secondary",
8830
+ name: "Secondary",
8831
+ enabled: true,
8832
+ priority: 2,
8833
+ background: { type: "transparent" },
8834
+ textColorToken: "primary",
8835
+ borderRadius: "rounded-full",
8836
+ border: { widthClass: "border", colorToken: "primary" },
8837
+ effects: {
8838
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
8839
+ }
8840
+ },
8841
+ {
8842
+ id: "outline",
8843
+ name: "Outline",
8844
+ enabled: true,
8845
+ priority: 3,
8846
+ background: { type: "transparent" },
8847
+ textColorToken: "text",
8848
+ borderRadius: "rounded-full",
8849
+ border: { widthClass: "border", colorToken: "border" },
8850
+ effects: {
8851
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
8852
+ }
8853
+ },
8854
+ {
8855
+ id: "ghost",
8856
+ name: "Ghost",
8857
+ enabled: true,
8858
+ priority: 3,
8859
+ background: { type: "transparent" },
8860
+ textColorToken: "primary",
8861
+ borderRadius: "rounded-full",
8862
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8863
+ sizes: {
8864
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
8865
+ md: { padding: "0.375rem 0" },
8866
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
8867
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
8868
+ },
8869
+ effects: {
8870
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
8871
+ }
8872
+ }
8873
+ ]
8874
+ }
8875
+ });
8876
+
8665
8877
  // ../theme-core/src/buttons/personalities/editorial-link.ts
8666
8878
  var editorialLink = defineButtonPersonality({
8667
8879
  id: "editorial-link",
@@ -9120,6 +9332,7 @@ var softPill = defineButtonPersonality({
9120
9332
  // ../theme-core/src/buttons/personalities/index.ts
9121
9333
  var buttonPersonalities = [
9122
9334
  softPill,
9335
+ earthPill,
9123
9336
  confidentChip,
9124
9337
  editorialLink,
9125
9338
  pebble,
@@ -9761,8 +9974,19 @@ var headingTypographyStyleSchema = typographyStyleSchema.extend({
9761
9974
  colorToken: themeColorTokenSchema.nullable().optional()
9762
9975
  });
9763
9976
  var proseLinkUnderlineStyleSchema = z21.enum(["solid", "dotted", "dashed"]);
9764
- var proseLinkUnderlineThicknessSchema = z21.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9765
- var proseLinkUnderlineOffsetSchema = z21.enum(["auto", "tight", "normal", "loose"]);
9977
+ var proseLinkUnderlineThicknessSchema = z21.enum([
9978
+ "auto",
9979
+ "fromFont",
9980
+ "thin",
9981
+ "medium",
9982
+ "thick"
9983
+ ]);
9984
+ var proseLinkUnderlineOffsetSchema = z21.enum([
9985
+ "auto",
9986
+ "tight",
9987
+ "normal",
9988
+ "loose"
9989
+ ]);
9766
9990
  var proseLinkStyleSchema = z21.object({
9767
9991
  colorToken: themeColorTokenSchema.optional(),
9768
9992
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -9773,7 +9997,14 @@ var proseLinkStyleSchema = z21.object({
9773
9997
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9774
9998
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9775
9999
  });
9776
- var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
10000
+ var semanticSpacingSchema = z21.enum([
10001
+ "none",
10002
+ "compact",
10003
+ "cozy",
10004
+ "medium",
10005
+ "comfortable",
10006
+ "spacious"
10007
+ ]);
9777
10008
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9778
10009
  var boxBackgroundOverlaySchema = z21.object({
9779
10010
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9795,12 +10026,36 @@ var boxBackgroundSchema = z21.object({
9795
10026
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
9796
10027
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
9797
10028
  });
10029
+ var noHeadingDecorationSchema = z21.object({
10030
+ family: z21.literal("none"),
10031
+ placement: z21.literal("none")
10032
+ });
10033
+ var visibleHeadingDecorationSchema = z21.object({
10034
+ family: z21.enum(visibleHeadingDecorationFamilyValues),
10035
+ placement: z21.enum(visibleHeadingDecorationPlacementValues),
10036
+ colorToken: z21.enum(headingDecorationColorTokenValues).optional()
10037
+ });
10038
+ var headingDecorationSchema = z21.union([
10039
+ noHeadingDecorationSchema,
10040
+ visibleHeadingDecorationSchema
10041
+ ]);
10042
+ var accordionIconTreatmentSchema = z21.object({
10043
+ iconSet: z21.enum(accordionIconSetValues),
10044
+ colorToken: z21.enum(accordionIconColorTokenValues),
10045
+ openColorToken: z21.enum(accordionIconColorTokenValues).optional(),
10046
+ motion: z21.enum(accordionIconMotionValues)
10047
+ });
9798
10048
  var sectionStylesOverrideSchema = z21.object({
9799
10049
  background: boxBackgroundSchema.nullable().optional(),
9800
10050
  spacing: semanticSpacingSchema.nullable().optional(),
9801
10051
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
9802
10052
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
9803
- eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional()
10053
+ eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
10054
+ headingDecoration: headingDecorationSchema.nullable().optional(),
10055
+ // Author-level override consumed by later block/editor rendering phases.
10056
+ // Keeping it in section styles lets existing block save APIs persist it.
10057
+ headingDecorationOverride: z21.enum(headingDecorationOverrideValues).nullable().optional(),
10058
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
9804
10059
  });
9805
10060
  var containerStylesOverrideSchema = z21.object({
9806
10061
  background: boxBackgroundSchema.nullable().optional(),
@@ -9893,9 +10148,17 @@ var inputStyle = z21.object({
9893
10148
  focus: z21.enum(["glow", "ring", "underline"]),
9894
10149
  label: z21.enum(["inside", "above"])
9895
10150
  });
9896
- var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
10151
+ var headerVariant = z21.enum(["classic", "centered", "transparent", "floating"]);
9897
10152
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9898
- var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
10153
+ var headerNavStyle = z21.enum([
10154
+ "minimal",
10155
+ "underline",
10156
+ "underline-grow",
10157
+ "capsule",
10158
+ "scale",
10159
+ "frosted",
10160
+ "solid"
10161
+ ]);
9899
10162
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9900
10163
  var headerMaxWidth = z21.enum(["container", "full"]);
9901
10164
  var headerContainerSchema = z21.object({
@@ -9943,8 +10206,22 @@ var dropdownStyleSchema = z21.object({
9943
10206
  textSize: z21.enum(["xs", "sm", "base", "lg"]).optional()
9944
10207
  // optional = no override (browser default)
9945
10208
  }).optional();
9946
- var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9947
- var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
10209
+ var headerCtaGapSchema = z21.enum([
10210
+ "none",
10211
+ "tight",
10212
+ "compact",
10213
+ "default",
10214
+ "relaxed",
10215
+ "spacious"
10216
+ ]);
10217
+ var headerCtaTreatmentSchema = z21.enum([
10218
+ "default",
10219
+ "primary",
10220
+ "secondary",
10221
+ "inverted",
10222
+ "outline",
10223
+ "ghost"
10224
+ ]);
9948
10225
  var navContainerSchema = z21.object({
9949
10226
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9950
10227
  tint: z21.string().nullable().optional(),
@@ -9999,7 +10276,14 @@ var footerMaxWidth = z21.enum(["container", "full"]);
9999
10276
  var footerMode = z21.enum(["default", "blocks", "default+blocks", "none"]);
10000
10277
  var footerNavLayoutMode = z21.enum(["stack", "inline", "inline-wrap"]);
10001
10278
  var footerNavLayoutAlign = z21.enum(["start", "center", "end", "space-between"]);
10002
- var footerSpacing = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10279
+ var footerSpacing = z21.enum([
10280
+ "none",
10281
+ "tight",
10282
+ "compact",
10283
+ "default",
10284
+ "relaxed",
10285
+ "spacious"
10286
+ ]);
10003
10287
  var footerLogoPlacement = z21.enum(["left", "right", "above", "below"]);
10004
10288
  var footerLogoSize = z21.enum(["sm", "md", "lg", "xl"]);
10005
10289
  var footerLogoMaxHeight = z21.enum(["sm", "md", "lg", "xl"]);
@@ -10064,7 +10348,12 @@ var footerSchema = z21.object({
10064
10348
  logo: footerLogoSchema.optional(),
10065
10349
  bottomBar: footerBottomBarSchema.optional()
10066
10350
  });
10067
- var containerPaddingPresetSchema = z21.enum(["tight", "compact", "default", "relaxed"]);
10351
+ var containerPaddingPresetSchema = z21.enum([
10352
+ "tight",
10353
+ "compact",
10354
+ "default",
10355
+ "relaxed"
10356
+ ]);
10068
10357
  var layoutSchema = z21.object({
10069
10358
  containerPadding: z21.object({
10070
10359
  mobile: containerPaddingPresetSchema.optional(),
@@ -10072,8 +10361,24 @@ var layoutSchema = z21.object({
10072
10361
  desktop: containerPaddingPresetSchema.optional()
10073
10362
  }).optional()
10074
10363
  }).optional();
10075
- var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
10076
- var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
10364
+ var heroTypographySizeSchema = z21.enum([
10365
+ "sm",
10366
+ "base",
10367
+ "lg",
10368
+ "xl",
10369
+ "2xl",
10370
+ "3xl",
10371
+ "4xl",
10372
+ "5xl",
10373
+ "6xl",
10374
+ "editorial"
10375
+ ]);
10376
+ var heroTypographyLineHeightSchema = z21.enum([
10377
+ "tight",
10378
+ "snug",
10379
+ "normal",
10380
+ "relaxed"
10381
+ ]);
10077
10382
  var heroResponsiveTypographySchema = z21.object({
10078
10383
  headlineSize: heroTypographySizeSchema.optional(),
10079
10384
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -10508,6 +10813,28 @@ var warmNeutralCream = definePaletteVariant({
10508
10813
  { name: "border", hex: "#e0d2b8" }
10509
10814
  ]
10510
10815
  });
10816
+ var warmNeutralSoftEarth = definePaletteVariant({
10817
+ id: "warm-neutral-soft-earth",
10818
+ name: "Warm Neutral \u2014 Soft Earth",
10819
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
10820
+ tags: { tone: "classic", energy: "calm", era: "organic" },
10821
+ mode: "light",
10822
+ colors: [
10823
+ { name: "primary", hex: "#a8573d" },
10824
+ { name: "secondary", hex: "#72765c" },
10825
+ { name: "accent", hex: "#c87557" },
10826
+ { name: "success", hex: "#687854" },
10827
+ { name: "warning", hex: "#b7863e" },
10828
+ { name: "destructive", hex: "#a54b3c" },
10829
+ { name: "background", hex: "#fbf6eb" },
10830
+ { name: "surface", hex: "#fffdf7" },
10831
+ { name: "surfaceAlt", hex: "#f0e4d3" },
10832
+ { name: "muted", hex: "#eadbc6" },
10833
+ { name: "text", hex: "#30281f" },
10834
+ { name: "primaryForeground", hex: "#fffaf3" },
10835
+ { name: "border", hex: "#d9c8b2" }
10836
+ ]
10837
+ });
10511
10838
  var warmNeutralForest = definePaletteVariant({
10512
10839
  id: "warm-neutral-forest",
10513
10840
  name: "Warm Neutral \u2014 Forest",
@@ -10541,6 +10868,7 @@ var paletteVariants = [
10541
10868
  // Warm-neutral family
10542
10869
  warmNeutralClay,
10543
10870
  warmNeutralCream,
10871
+ warmNeutralSoftEarth,
10544
10872
  warmNeutralForest,
10545
10873
  // High-contrast family
10546
10874
  highContrastInk,
@@ -10559,6 +10887,12 @@ var paletteVariantsById = new Map(
10559
10887
  function asHeaderLookId(value) {
10560
10888
  return value;
10561
10889
  }
10890
+ function asHeaderLayoutId(value) {
10891
+ return value;
10892
+ }
10893
+ function asHeaderStyleId(value) {
10894
+ return value;
10895
+ }
10562
10896
  function baseHeader(theme) {
10563
10897
  const {
10564
10898
  navLinkStyle: _navLinkStyle,
@@ -10577,67 +10911,427 @@ function baseHeader(theme) {
10577
10911
  navContainer: { type: "none", tint: null, opacity: 0.15 }
10578
10912
  };
10579
10913
  }
10580
- function solidBrandHeader(theme) {
10581
- const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
10582
- return {
10583
- ...baseHeader(theme),
10914
+ var headerLayoutCatalog = [
10915
+ {
10916
+ id: asHeaderLayoutId("classic"),
10917
+ label: "Classic",
10918
+ description: "Logo and navigation in one practical horizontal row.",
10919
+ structure: "inline-classic",
10584
10920
  variant: "classic",
10585
- positioning: "sticky",
10921
+ defaultPositioning: "sticky",
10922
+ shrinkOnScroll: false
10923
+ },
10924
+ {
10925
+ id: asHeaderLayoutId("centered"),
10926
+ label: "Centered",
10927
+ description: "Logo centered above a balanced navigation row.",
10928
+ structure: "centered-stack",
10929
+ variant: "centered",
10930
+ defaultPositioning: "static",
10931
+ shrinkOnScroll: false,
10932
+ maxRecommendedNavItems: 5,
10933
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
10934
+ },
10935
+ {
10936
+ id: asHeaderLayoutId("floating"),
10937
+ label: "Floating",
10938
+ description: "Detached header chrome that sits over the opening section.",
10939
+ structure: "floating-shell",
10940
+ variant: "floating",
10941
+ defaultPositioning: "fixed",
10586
10942
  shrinkOnScroll: true,
10587
- background: {
10588
- type: "color",
10589
- color: "primary"
10590
- },
10591
- textColor: "primaryForeground",
10592
- navColor: "primaryForeground",
10593
- navStyle: "underline-grow",
10594
- navWeight: "bold",
10595
- navLinkStyle: {
10596
- typography: "body",
10597
- fontWeight: "bold",
10598
- textTransform: "uppercase",
10599
- italic: false,
10600
- colorToken: "primaryForeground",
10601
- hoverColorToken: "secondary",
10602
- textSize: "sm",
10603
- letterSpacing: "wider",
10604
- padding: "compact",
10605
- paddingX: "compact",
10606
- borderRadius: "none",
10607
- effects: {
10608
- hover: [
10609
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
10610
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
10611
- ]
10612
- }
10613
- },
10614
- dropdownStyle: {
10615
- background: "primary-700",
10616
- textColor: "primaryForeground",
10617
- borderColor: null,
10618
- shadow: "md",
10619
- borderRadius: "md",
10620
- hoverBackground: "primary-900",
10621
- hoverTextColor: "secondary",
10622
- textTransform: "uppercase",
10623
- letterSpacing: "wider",
10624
- fontWeight: "bold",
10625
- textSize: "sm"
10626
- },
10627
- border: {
10628
- style: "solid",
10629
- width: "none",
10630
- position: "none"
10631
- },
10632
- logoText: {
10633
- hideOnShrink: true,
10634
- mobileMaxWidth: "sm",
10635
- mobileWrapLines: 2
10636
- },
10637
- ctaGap: "compact",
10638
- ctaTreatment: "inverted",
10639
- ...ctaVariant ? { ctaVariant } : {}
10640
- };
10943
+ maxRecommendedNavItems: 5,
10944
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
10945
+ }
10946
+ ];
10947
+ function supportedLayouts(ids) {
10948
+ return ids.map(asHeaderLayoutId);
10949
+ }
10950
+ var headerStyleCatalog = [
10951
+ {
10952
+ id: asHeaderStyleId("minimal"),
10953
+ label: "Minimal",
10954
+ description: "Quiet surface with simple color-change navigation.",
10955
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10956
+ navInteraction: "color-change",
10957
+ surface: "neutral",
10958
+ navTypography: "plain"
10959
+ },
10960
+ {
10961
+ id: asHeaderStyleId("fine-line"),
10962
+ label: "Fine Line",
10963
+ description: "Light surface with a crisp lower rule and underline hover.",
10964
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10965
+ navInteraction: "underline-grow",
10966
+ surface: "bordered",
10967
+ navTypography: "plain"
10968
+ },
10969
+ {
10970
+ id: asHeaderStyleId("soft-bar"),
10971
+ label: "Soft Bar",
10972
+ description: "Soft tinted surface with gentle pill hover states.",
10973
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10974
+ navInteraction: "pill-background",
10975
+ surface: "soft",
10976
+ navTypography: "plain"
10977
+ },
10978
+ {
10979
+ id: asHeaderStyleId("pill-nav"),
10980
+ label: "Pill Nav",
10981
+ description: "A calm pill navigation rail over a neutral header.",
10982
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10983
+ navInteraction: "pill-background",
10984
+ surface: "soft",
10985
+ navTypography: "plain"
10986
+ },
10987
+ {
10988
+ id: asHeaderStyleId("brand-bar"),
10989
+ label: "Brand Bar",
10990
+ description: "Solid brand surface with high-contrast navigation.",
10991
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10992
+ navInteraction: "color-change",
10993
+ surface: "brand-solid",
10994
+ navTypography: "brand-caps"
10995
+ },
10996
+ {
10997
+ id: asHeaderStyleId("brand-underline"),
10998
+ label: "Brand Underline",
10999
+ description: "Brand surface with underline-grow navigation.",
11000
+ supportedLayoutIds: supportedLayouts(["classic"]),
11001
+ navInteraction: "underline-grow",
11002
+ surface: "brand-solid",
11003
+ navTypography: "brand-caps"
11004
+ },
11005
+ {
11006
+ id: asHeaderStyleId("brand-pill"),
11007
+ label: "Brand Pill",
11008
+ description: "Solid brand surface with rounded active and hover states.",
11009
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
11010
+ navInteraction: "pill-background",
11011
+ surface: "brand-solid",
11012
+ navTypography: "brand-caps"
11013
+ },
11014
+ {
11015
+ id: asHeaderStyleId("serif-line"),
11016
+ label: "Serif Line",
11017
+ description: "Typographic logo treatment with understated underline navigation.",
11018
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
11019
+ navInteraction: "underline-grow",
11020
+ surface: "bordered",
11021
+ navTypography: "heading"
11022
+ },
11023
+ {
11024
+ id: asHeaderStyleId("flat-tabs"),
11025
+ label: "Flat Tabs",
11026
+ description: "Flat block hover and active states with a Swiss utility feel.",
11027
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
11028
+ navInteraction: "flat-block",
11029
+ surface: "bordered",
11030
+ navTypography: "quiet-caps"
11031
+ },
11032
+ {
11033
+ id: asHeaderStyleId("glass"),
11034
+ label: "Glass",
11035
+ description: "Translucent chrome with frosted navigation backing.",
11036
+ supportedLayoutIds: supportedLayouts(["classic", "floating"]),
11037
+ navInteraction: "glass-backed",
11038
+ surface: "floating",
11039
+ navTypography: "plain"
11040
+ },
11041
+ {
11042
+ id: asHeaderStyleId("minimal-surface"),
11043
+ label: "Clear Split",
11044
+ description: "Floating logo with transparent navigation and no shared shell.",
11045
+ supportedLayoutIds: supportedLayouts(["floating"]),
11046
+ navInteraction: "color-change",
11047
+ surface: "floating",
11048
+ navTypography: "plain"
11049
+ },
11050
+ {
11051
+ id: asHeaderStyleId("soft-shell"),
11052
+ label: "Soft Shell",
11053
+ description: "Floating rounded shell with soft pill navigation states.",
11054
+ supportedLayoutIds: supportedLayouts(["floating"]),
11055
+ navInteraction: "pill-background",
11056
+ surface: "floating",
11057
+ navTypography: "plain"
11058
+ },
11059
+ {
11060
+ id: asHeaderStyleId("split-glass"),
11061
+ label: "Split Glass",
11062
+ description: "Logo floats independently while the navigation sits in a glass rail.",
11063
+ supportedLayoutIds: supportedLayouts(["floating"]),
11064
+ navInteraction: "glass-backed",
11065
+ surface: "floating",
11066
+ navTypography: "quiet-caps"
11067
+ },
11068
+ {
11069
+ id: asHeaderStyleId("split-pill"),
11070
+ label: "Split Pill",
11071
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
11072
+ supportedLayoutIds: supportedLayouts(["floating"]),
11073
+ navInteraction: "pill-background",
11074
+ surface: "floating",
11075
+ navTypography: "heading"
11076
+ }
11077
+ ];
11078
+ var headerLayoutsById = new Map(
11079
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
11080
+ );
11081
+ var headerStylesById = new Map(
11082
+ headerStyleCatalog.map((style) => [style.id, style])
11083
+ );
11084
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11085
+ [
11086
+ asHeaderLayoutId("classic"),
11087
+ headerStyleRepairChain([
11088
+ "minimal",
11089
+ "glass",
11090
+ "fine-line",
11091
+ "soft-bar",
11092
+ "pill-nav",
11093
+ "brand-bar",
11094
+ "brand-underline",
11095
+ "brand-pill",
11096
+ "serif-line",
11097
+ "flat-tabs"
11098
+ ])
11099
+ ],
11100
+ [
11101
+ asHeaderLayoutId("centered"),
11102
+ headerStyleRepairChain([
11103
+ "minimal",
11104
+ "fine-line",
11105
+ "soft-bar",
11106
+ "pill-nav",
11107
+ "brand-bar",
11108
+ "brand-pill",
11109
+ "serif-line",
11110
+ "flat-tabs"
11111
+ ])
11112
+ ],
11113
+ [
11114
+ asHeaderLayoutId("floating"),
11115
+ headerStyleRepairChain([
11116
+ "glass",
11117
+ "minimal-surface",
11118
+ "split-glass",
11119
+ "split-pill",
11120
+ "soft-shell",
11121
+ "brand-pill"
11122
+ ])
11123
+ ]
11124
+ ]);
11125
+ function headerStyleRepairChain(values) {
11126
+ return values.map(asHeaderStyleId);
11127
+ }
11128
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11129
+ [
11130
+ [
11131
+ asHeaderStyleId("brand-bar"),
11132
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
11133
+ ],
11134
+ [
11135
+ asHeaderStyleId("brand-underline"),
11136
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11137
+ ],
11138
+ [
11139
+ asHeaderStyleId("brand-pill"),
11140
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
11141
+ ],
11142
+ [
11143
+ asHeaderStyleId("pill-nav"),
11144
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
11145
+ ],
11146
+ [
11147
+ asHeaderStyleId("flat-tabs"),
11148
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
11149
+ ],
11150
+ [
11151
+ asHeaderStyleId("serif-line"),
11152
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11153
+ ],
11154
+ [
11155
+ asHeaderStyleId("glass"),
11156
+ headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
11157
+ ],
11158
+ [
11159
+ asHeaderStyleId("soft-shell"),
11160
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
11161
+ ],
11162
+ [
11163
+ asHeaderStyleId("minimal-surface"),
11164
+ headerStyleRepairChain(["minimal-surface", "minimal"])
11165
+ ],
11166
+ [
11167
+ asHeaderStyleId("split-glass"),
11168
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
11169
+ ],
11170
+ [
11171
+ asHeaderStyleId("split-pill"),
11172
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
11173
+ ],
11174
+ [
11175
+ asHeaderStyleId("fine-line"),
11176
+ headerStyleRepairChain(["fine-line", "minimal"])
11177
+ ],
11178
+ [
11179
+ asHeaderStyleId("soft-bar"),
11180
+ headerStyleRepairChain(["soft-bar", "minimal"])
11181
+ ],
11182
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
11183
+ ]
11184
+ );
11185
+ var legacyHeaderLookAliases = [
11186
+ {
11187
+ lookId: asHeaderLookId("clean-base"),
11188
+ selection: {
11189
+ layoutId: asHeaderLayoutId("classic"),
11190
+ styleId: asHeaderStyleId("minimal")
11191
+ }
11192
+ },
11193
+ {
11194
+ lookId: asHeaderLookId("brand-solid"),
11195
+ selection: {
11196
+ layoutId: asHeaderLayoutId("classic"),
11197
+ styleId: asHeaderStyleId("brand-bar")
11198
+ }
11199
+ },
11200
+ {
11201
+ lookId: asHeaderLookId("serif-line"),
11202
+ selection: {
11203
+ layoutId: asHeaderLayoutId("centered"),
11204
+ styleId: asHeaderStyleId("serif-line")
11205
+ }
11206
+ },
11207
+ {
11208
+ lookId: asHeaderLookId("centered-calm"),
11209
+ selection: {
11210
+ layoutId: asHeaderLayoutId("centered"),
11211
+ styleId: asHeaderStyleId("minimal")
11212
+ }
11213
+ },
11214
+ {
11215
+ lookId: asHeaderLookId("practical-utility"),
11216
+ selection: {
11217
+ layoutId: asHeaderLayoutId("classic"),
11218
+ styleId: asHeaderStyleId("flat-tabs")
11219
+ }
11220
+ },
11221
+ {
11222
+ lookId: asHeaderLookId("minimal-transparent"),
11223
+ selection: {
11224
+ layoutId: asHeaderLayoutId("classic"),
11225
+ styleId: asHeaderStyleId("minimal")
11226
+ }
11227
+ },
11228
+ {
11229
+ lookId: asHeaderLookId("transparent-overlay"),
11230
+ selection: {
11231
+ layoutId: asHeaderLayoutId("floating"),
11232
+ styleId: asHeaderStyleId("glass")
11233
+ }
11234
+ },
11235
+ {
11236
+ lookId: asHeaderLookId("floating-glass"),
11237
+ selection: {
11238
+ layoutId: asHeaderLayoutId("floating"),
11239
+ styleId: asHeaderStyleId("glass")
11240
+ }
11241
+ }
11242
+ ];
11243
+ var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
11244
+ function getHeaderStyle(id) {
11245
+ return headerStylesById.get(id) ?? null;
11246
+ }
11247
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
11248
+ return style.supportedLayoutIds.includes(layoutId);
11249
+ }
11250
+ function getHeaderStyleOrThrow(id) {
11251
+ const style = getHeaderStyle(id);
11252
+ if (!style) {
11253
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
11254
+ }
11255
+ return style;
11256
+ }
11257
+ function resolveLegacyHeaderLookAlias(lookId) {
11258
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
11259
+ }
11260
+ function getCompatibleHeaderStyleIds(layoutId) {
11261
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
11262
+ (styleId) => {
11263
+ const style = getHeaderStyleOrThrow(styleId);
11264
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
11265
+ }
11266
+ );
11267
+ }
11268
+ function solidBrandHeader(theme) {
11269
+ const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11270
+ return {
11271
+ ...baseHeader(theme),
11272
+ variant: "classic",
11273
+ positioning: "sticky",
11274
+ shrinkOnScroll: true,
11275
+ background: {
11276
+ type: "color",
11277
+ color: "primary"
11278
+ },
11279
+ textColor: "primaryForeground",
11280
+ navColor: "primaryForeground",
11281
+ navStyle: "underline-grow",
11282
+ navWeight: "bold",
11283
+ navLinkStyle: {
11284
+ typography: "body",
11285
+ fontWeight: "bold",
11286
+ textTransform: "uppercase",
11287
+ italic: false,
11288
+ colorToken: "primaryForeground",
11289
+ hoverColorToken: "secondary",
11290
+ textSize: "sm",
11291
+ letterSpacing: "wider",
11292
+ padding: "compact",
11293
+ paddingX: "compact",
11294
+ borderRadius: "none",
11295
+ effects: {
11296
+ hover: [
11297
+ {
11298
+ effectId: "text-color-change",
11299
+ options: { hoverColorToken: "secondary" }
11300
+ },
11301
+ {
11302
+ effectId: "nav-underline",
11303
+ options: { style: "grow", colorToken: "secondary" }
11304
+ }
11305
+ ]
11306
+ }
11307
+ },
11308
+ dropdownStyle: {
11309
+ background: "primary-700",
11310
+ textColor: "primaryForeground",
11311
+ borderColor: null,
11312
+ shadow: "md",
11313
+ borderRadius: "md",
11314
+ hoverBackground: "primary-900",
11315
+ hoverTextColor: "secondary",
11316
+ textTransform: "uppercase",
11317
+ letterSpacing: "wider",
11318
+ fontWeight: "bold",
11319
+ textSize: "sm"
11320
+ },
11321
+ border: {
11322
+ style: "solid",
11323
+ width: "none",
11324
+ position: "none"
11325
+ },
11326
+ logoText: {
11327
+ hideOnShrink: true,
11328
+ mobileMaxWidth: "sm",
11329
+ mobileWrapLines: 2
11330
+ },
11331
+ ctaGap: "compact",
11332
+ ctaTreatment: "inverted",
11333
+ ...ctaVariant ? { ctaVariant } : {}
11334
+ };
10641
11335
  }
10642
11336
  function cleanBaseHeader(theme) {
10643
11337
  return {
@@ -10663,10 +11357,10 @@ function cleanBaseHeader(theme) {
10663
11357
  ctaGap: "default"
10664
11358
  };
10665
11359
  }
10666
- function editorialLineHeader(theme) {
11360
+ function serifLineHeader(theme) {
10667
11361
  return {
10668
11362
  ...baseHeader(theme),
10669
- variant: "editorial",
11363
+ variant: "centered",
10670
11364
  positioning: "sticky",
10671
11365
  shrinkOnScroll: false,
10672
11366
  background: {
@@ -10813,6 +11507,11 @@ var headerLookCatalog = [
10813
11507
  label: "Clean base",
10814
11508
  visualTreatment: "solid-neutral",
10815
11509
  layoutBehavior: "sticky",
11510
+ configuration: {
11511
+ structure: "inline-classic",
11512
+ treatment: "solid-neutral",
11513
+ behavior: "sticky"
11514
+ },
10816
11515
  openingRequirement: "none",
10817
11516
  compile: cleanBaseHeader
10818
11517
  },
@@ -10821,23 +11520,38 @@ var headerLookCatalog = [
10821
11520
  label: "Brand solid",
10822
11521
  visualTreatment: "solid-brand",
10823
11522
  layoutBehavior: "sticky-shrink",
11523
+ configuration: {
11524
+ structure: "inline-classic",
11525
+ treatment: "solid-brand",
11526
+ behavior: "sticky-shrink"
11527
+ },
10824
11528
  openingRequirement: "none",
10825
11529
  compile: solidBrandHeader
10826
11530
  },
10827
11531
  {
10828
- id: asHeaderLookId("editorial-line"),
10829
- label: "Editorial line",
10830
- visualTreatment: "light-editorial",
11532
+ id: asHeaderLookId("serif-line"),
11533
+ label: "Serif line",
11534
+ visualTreatment: "light-serif",
10831
11535
  layoutBehavior: "sticky",
11536
+ configuration: {
11537
+ structure: "centered-stack",
11538
+ treatment: "light-serif",
11539
+ behavior: "sticky"
11540
+ },
10832
11541
  openingRequirement: "none",
10833
11542
  maxRecommendedNavItems: 6,
10834
- compile: editorialLineHeader
11543
+ compile: serifLineHeader
10835
11544
  },
10836
11545
  {
10837
11546
  id: asHeaderLookId("centered-calm"),
10838
11547
  label: "Centered calm",
10839
- visualTreatment: "light-editorial",
11548
+ visualTreatment: "light-serif",
10840
11549
  layoutBehavior: "normal-flow",
11550
+ configuration: {
11551
+ structure: "centered-stack",
11552
+ treatment: "light-serif",
11553
+ behavior: "normal-flow"
11554
+ },
10841
11555
  openingRequirement: "none",
10842
11556
  maxRecommendedNavItems: 5,
10843
11557
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -10848,6 +11562,11 @@ var headerLookCatalog = [
10848
11562
  label: "Practical utility",
10849
11563
  visualTreatment: "solid-neutral",
10850
11564
  layoutBehavior: "sticky-shrink",
11565
+ configuration: {
11566
+ structure: "inline-classic",
11567
+ treatment: "solid-neutral",
11568
+ behavior: "sticky-shrink"
11569
+ },
10851
11570
  openingRequirement: "none",
10852
11571
  requiresProminentCta: true,
10853
11572
  compile: practicalUtilityHeader
@@ -10857,6 +11576,11 @@ var headerLookCatalog = [
10857
11576
  label: "Minimal transparent",
10858
11577
  visualTreatment: "minimal-transparent",
10859
11578
  layoutBehavior: "normal-flow",
11579
+ configuration: {
11580
+ structure: "inline-classic",
11581
+ treatment: "minimal-transparent",
11582
+ behavior: "normal-flow"
11583
+ },
10860
11584
  openingRequirement: "reserved-space-ok",
10861
11585
  compile: minimalTransparentHeader
10862
11586
  },
@@ -10865,6 +11589,11 @@ var headerLookCatalog = [
10865
11589
  label: "Transparent overlay",
10866
11590
  visualTreatment: "transparent-overlay",
10867
11591
  layoutBehavior: "fixed-overlay",
11592
+ configuration: {
11593
+ structure: "inline-classic",
11594
+ treatment: "transparent-overlay",
11595
+ behavior: "fixed-overlay"
11596
+ },
10868
11597
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10869
11598
  maxRecommendedNavItems: 5,
10870
11599
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10875,6 +11604,11 @@ var headerLookCatalog = [
10875
11604
  label: "Floating glass",
10876
11605
  visualTreatment: "floating-glass",
10877
11606
  layoutBehavior: "fixed-floating",
11607
+ configuration: {
11608
+ structure: "floating-shell",
11609
+ treatment: "floating-glass",
11610
+ behavior: "fixed-floating"
11611
+ },
10878
11612
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10879
11613
  maxRecommendedNavItems: 5,
10880
11614
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10882,9 +11616,17 @@ var headerLookCatalog = [
10882
11616
  }
10883
11617
  ];
10884
11618
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
11619
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
11620
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
11621
+ var allowedHeaderConfigurationKeys = new Set(
11622
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
11623
+ );
10885
11624
  var headerLooksById = new Map(
10886
11625
  headerLookCatalog.map((look) => [look.id, look])
10887
11626
  );
11627
+ function headerConfigurationKey(configuration) {
11628
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
11629
+ }
10888
11630
 
10889
11631
  // ../theme-core/src/site-styles/footerLooks.ts
10890
11632
  function asFooterLookId(value) {
@@ -11017,6 +11759,264 @@ var advancedDesignOptionCatalog = {
11017
11759
  detachedCustom: true
11018
11760
  };
11019
11761
 
11762
+ // ../theme-core/src/site-styles/typographyPresets.ts
11763
+ var bodyReadablePolicy = {
11764
+ recommendedCategories: ["sans-serif", "serif"],
11765
+ allowedCategories: ["sans-serif", "serif"],
11766
+ requiresItalicForBody: true,
11767
+ requiresBoldForBody: true
11768
+ };
11769
+ var headingFlexiblePolicy = {
11770
+ recommendedCategories: ["sans-serif", "serif", "display"],
11771
+ allowedCategories: ["sans-serif", "serif", "display"]
11772
+ };
11773
+ var displayHeadingPolicy = {
11774
+ recommendedCategories: ["display", "sans-serif", "serif"],
11775
+ allowedCategories: ["display", "sans-serif", "serif"]
11776
+ };
11777
+ function asTypographyPresetId(value) {
11778
+ if (!value.startsWith("typography-preset:")) {
11779
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
11780
+ }
11781
+ return value;
11782
+ }
11783
+ function defineTypographyPreset(preset2) {
11784
+ return {
11785
+ ...preset2,
11786
+ id: asTypographyPresetId(preset2.id)
11787
+ };
11788
+ }
11789
+ var modernSansTypography = {
11790
+ body: {
11791
+ family: "Inter, system-ui, sans-serif",
11792
+ size: "md",
11793
+ weight: "regular",
11794
+ lineHeight: "relaxed",
11795
+ letterSpacing: "normal"
11796
+ },
11797
+ headings: {
11798
+ default: {
11799
+ family: "Inter, system-ui, sans-serif",
11800
+ weight: "semibold",
11801
+ lineHeight: "normal",
11802
+ letterSpacing: "tight",
11803
+ italic: null,
11804
+ case: null
11805
+ },
11806
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11807
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11808
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11809
+ },
11810
+ scale: "balanced"
11811
+ };
11812
+ var warmRoundedTypography = {
11813
+ body: {
11814
+ family: "Nunito Sans, system-ui, sans-serif",
11815
+ size: "lg",
11816
+ weight: "regular",
11817
+ lineHeight: "relaxed",
11818
+ letterSpacing: "normal"
11819
+ },
11820
+ headings: {
11821
+ default: {
11822
+ family: "Nunito Sans, system-ui, sans-serif",
11823
+ weight: "bold",
11824
+ lineHeight: "normal",
11825
+ letterSpacing: "normal",
11826
+ italic: null,
11827
+ case: null
11828
+ },
11829
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11830
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11831
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11832
+ },
11833
+ scale: "balanced"
11834
+ };
11835
+ var editorialSerifTypography = {
11836
+ body: {
11837
+ family: "Lora, Georgia, serif",
11838
+ size: "lg",
11839
+ weight: "regular",
11840
+ lineHeight: "loose",
11841
+ letterSpacing: "normal"
11842
+ },
11843
+ headings: {
11844
+ default: {
11845
+ family: "Playfair Display, Georgia, serif",
11846
+ weight: "semibold",
11847
+ lineHeight: "normal",
11848
+ letterSpacing: "tight",
11849
+ italic: null,
11850
+ case: null
11851
+ },
11852
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11853
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11854
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
11855
+ },
11856
+ scale: "spacious"
11857
+ };
11858
+ var classicSerifTypography = {
11859
+ body: {
11860
+ family: "Libre Baskerville, Georgia, serif",
11861
+ size: "md",
11862
+ weight: "regular",
11863
+ lineHeight: "relaxed",
11864
+ letterSpacing: "normal"
11865
+ },
11866
+ headings: {
11867
+ default: {
11868
+ family: "Cormorant Garamond, Georgia, serif",
11869
+ weight: "semibold",
11870
+ lineHeight: "normal",
11871
+ letterSpacing: "normal",
11872
+ italic: null,
11873
+ case: null
11874
+ },
11875
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11876
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11877
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11878
+ },
11879
+ scale: "balanced"
11880
+ };
11881
+ var luxeContrastTypography = {
11882
+ body: {
11883
+ family: "Manrope, system-ui, sans-serif",
11884
+ size: "md",
11885
+ weight: "regular",
11886
+ lineHeight: "relaxed",
11887
+ letterSpacing: "normal"
11888
+ },
11889
+ headings: {
11890
+ default: {
11891
+ family: "Cormorant Garamond, Georgia, serif",
11892
+ weight: "semibold",
11893
+ lineHeight: "normal",
11894
+ letterSpacing: "tight",
11895
+ italic: null,
11896
+ case: null
11897
+ },
11898
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11899
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11900
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11901
+ },
11902
+ scale: "spacious"
11903
+ };
11904
+ var boldDisplayTypography = {
11905
+ body: {
11906
+ family: "Manrope, system-ui, sans-serif",
11907
+ size: "lg",
11908
+ weight: "regular",
11909
+ lineHeight: "relaxed",
11910
+ letterSpacing: "normal"
11911
+ },
11912
+ headings: {
11913
+ default: {
11914
+ family: '"TAN - PEARL", sans-serif',
11915
+ weight: "bold",
11916
+ lineHeight: "normal",
11917
+ letterSpacing: "tight",
11918
+ colorToken: "primary",
11919
+ italic: null,
11920
+ case: null
11921
+ },
11922
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11923
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11924
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11925
+ },
11926
+ scale: "balanced"
11927
+ };
11928
+ var typographyPresets = [
11929
+ defineTypographyPreset({
11930
+ id: "typography-preset:modern-sans",
11931
+ name: "Modern Sans",
11932
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
11933
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
11934
+ recommendedFonts: {
11935
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
11936
+ heading: ["Inter", "Manrope", "Source Sans 3"]
11937
+ },
11938
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11939
+ typography: modernSansTypography
11940
+ }),
11941
+ defineTypographyPreset({
11942
+ id: "typography-preset:warm-rounded",
11943
+ name: "Warm Rounded",
11944
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
11945
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
11946
+ recommendedFonts: {
11947
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
11948
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
11949
+ },
11950
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11951
+ typography: warmRoundedTypography
11952
+ }),
11953
+ defineTypographyPreset({
11954
+ id: "typography-preset:editorial-serif",
11955
+ name: "Editorial Serif",
11956
+ description: "Story-led type with warm reading rhythm and expressive headings.",
11957
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
11958
+ recommendedFonts: {
11959
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
11960
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
11961
+ },
11962
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11963
+ typography: editorialSerifTypography
11964
+ }),
11965
+ defineTypographyPreset({
11966
+ id: "typography-preset:classic-serif",
11967
+ name: "Classic Serif",
11968
+ description: "Measured, polished type for premium and established offers.",
11969
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
11970
+ recommendedFonts: {
11971
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
11972
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
11973
+ },
11974
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11975
+ typography: classicSerifTypography
11976
+ }),
11977
+ defineTypographyPreset({
11978
+ id: "typography-preset:luxe-contrast",
11979
+ name: "Luxe Contrast",
11980
+ description: "A restrained sans body paired with elegant high-contrast headings.",
11981
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
11982
+ recommendedFonts: {
11983
+ body: ["Manrope", "Inter", "Source Sans 3"],
11984
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
11985
+ },
11986
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11987
+ typography: luxeContrastTypography
11988
+ }),
11989
+ defineTypographyPreset({
11990
+ id: "typography-preset:bold-display",
11991
+ name: "Bold Display",
11992
+ description: "Punchy display headings with readable sans body copy for branded launches.",
11993
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
11994
+ recommendedFonts: {
11995
+ body: ["Manrope", "Inter", "Space Grotesk"],
11996
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
11997
+ },
11998
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11999
+ typography: boldDisplayTypography,
12000
+ heroTypography: {
12001
+ headlineSize: "6xl",
12002
+ headlineLineHeight: "tight",
12003
+ subheadlineSize: "editorial",
12004
+ subheadlineLineHeight: "normal",
12005
+ microHeadlineSize: "6xl",
12006
+ microHeadlineLineHeight: "tight",
12007
+ microSubheadlineSize: "xl",
12008
+ microSubheadlineLineHeight: "normal",
12009
+ responsive: {
12010
+ tablet: { headlineSize: "5xl" },
12011
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
12012
+ }
12013
+ }
12014
+ })
12015
+ ];
12016
+ var typographyPresetsById = new Map(
12017
+ typographyPresets.map((preset2) => [preset2.id, preset2])
12018
+ );
12019
+
11020
12020
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
11021
12021
  var curatedSiteStyleIdValues = [
11022
12022
  "site-style:calm-studio",
@@ -11029,6 +12029,7 @@ var curatedSiteStyleIdValues = [
11029
12029
  "site-style:personal-retreat-journal",
11030
12030
  "site-style:tactile-workshop",
11031
12031
  "site-style:modern-wellness",
12032
+ "site-style:soft-earth",
11032
12033
  "site-style:bold-launch",
11033
12034
  "site-style:south-west-twerk-school"
11034
12035
  ];
@@ -11094,26 +12095,45 @@ var expressiveUnderlineInputs = {
11094
12095
  }
11095
12096
  };
11096
12097
  function uniqueContentFrameKinds() {
11097
- const kinds = [...new Set(
11098
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
11099
- )];
12098
+ const kinds = [
12099
+ ...new Set(
12100
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
12101
+ )
12102
+ ];
11100
12103
  const firstKind = kinds[0];
11101
12104
  if (!firstKind) {
11102
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
12105
+ throw new Error(
12106
+ "Expected generated design option catalog to expose at least one content frame kind."
12107
+ );
11103
12108
  }
11104
12109
  return [firstKind, ...kinds.slice(1)];
11105
12110
  }
11106
12111
  var generatedContentFrameKinds = uniqueContentFrameKinds();
11107
12112
  function defineCuratedSiteStyle(input) {
12113
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
12114
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12115
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
12116
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
12117
+ if (!typographyPresetChoices.some(
12118
+ (choice) => choice.id === defaultTypographyPresetId
12119
+ )) {
12120
+ throw new Error(
12121
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
12122
+ );
12123
+ }
11108
12124
  return {
11109
12125
  id: asSiteStyleId(input.id),
11110
12126
  name: input.name,
11111
12127
  description: input.description,
11112
12128
  generationBrief: input.generationBrief,
11113
12129
  selectionKeywordRules: input.selectionKeywordRules ?? [],
11114
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
12130
+ siteCreatorSelection: input.siteCreatorSelection ?? {
12131
+ kind: "explicit_only"
12132
+ },
11115
12133
  template: {
11116
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
12134
+ id: asDesignSystemTemplateId(
12135
+ `template:${input.id.replace("site-style:", "")}`
12136
+ ),
11117
12137
  name: input.name,
11118
12138
  version: 1,
11119
12139
  tokenRecipes: input.tokenRecipes,
@@ -11125,11 +12145,27 @@ function defineCuratedSiteStyle(input) {
11125
12145
  },
11126
12146
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
11127
12147
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
11128
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
12148
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
12149
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
12150
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
12151
+ } : inferredHeaderCuration.defaultHeaderSelection,
12152
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
12153
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
12154
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
12155
+ (selection) => ({
12156
+ layoutId: asHeaderLayoutId(selection.layoutId),
12157
+ styleId: asHeaderStyleId(selection.styleId)
12158
+ })
12159
+ ),
12160
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
11129
12161
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
11130
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
12162
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
12163
+ asFooterLookId
12164
+ ),
11131
12165
  buttonPersonalityChoices: input.buttonPersonalityChoices,
11132
- paletteVariantChoices: input.paletteVariantChoices
12166
+ paletteVariantChoices: input.paletteVariantChoices,
12167
+ typographyPresetChoices,
12168
+ defaultTypographyPresetId
11133
12169
  };
11134
12170
  }
11135
12171
  function buttonChoice(id, note) {
@@ -11138,6 +12174,87 @@ function buttonChoice(id, note) {
11138
12174
  function paletteChoice(id, note) {
11139
12175
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
11140
12176
  }
12177
+ function headerLayoutChoice(id, note) {
12178
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
12179
+ }
12180
+ function headerStyleChoice(id, note) {
12181
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
12182
+ }
12183
+ function unbrandHeaderLayoutId(id) {
12184
+ return id;
12185
+ }
12186
+ function uniqueHeaderLayoutChoices(choices) {
12187
+ const seen = /* @__PURE__ */ new Set();
12188
+ const unique = choices.filter((choice) => {
12189
+ if (seen.has(choice.id)) return false;
12190
+ seen.add(choice.id);
12191
+ return true;
12192
+ });
12193
+ const first = unique[0];
12194
+ if (!first) {
12195
+ throw new Error("Expected at least one curated header layout choice.");
12196
+ }
12197
+ return [first, ...unique.slice(1)];
12198
+ }
12199
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12200
+ const first = choices[0] ?? {
12201
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
12202
+ };
12203
+ return [first, ...choices.slice(1)];
12204
+ }
12205
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
12206
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12207
+ (selection) => Boolean(selection)
12208
+ );
12209
+ const defaultHeaderSelection = selections[0] ?? {
12210
+ layoutId: asHeaderLayoutId("classic"),
12211
+ styleId: asHeaderStyleId("minimal")
12212
+ };
12213
+ const layoutChoices = uniqueHeaderLayoutChoices(
12214
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
12215
+ );
12216
+ const stylesByLayout = {};
12217
+ for (const layoutChoice of layoutChoices) {
12218
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12219
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
12220
+ }
12221
+ return {
12222
+ defaultHeaderSelection,
12223
+ recommendedHeaderLayoutChoices: layoutChoices,
12224
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
12225
+ };
12226
+ }
12227
+ function typographyChoice(id, note) {
12228
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
12229
+ }
12230
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
12231
+ switch (recipe) {
12232
+ case "clean-sans":
12233
+ return [
12234
+ typographyChoice("typography-preset:modern-sans"),
12235
+ typographyChoice("typography-preset:luxe-contrast"),
12236
+ typographyChoice("typography-preset:bold-display")
12237
+ ];
12238
+ case "friendly-sans":
12239
+ return [
12240
+ typographyChoice("typography-preset:warm-rounded"),
12241
+ typographyChoice("typography-preset:modern-sans"),
12242
+ typographyChoice("typography-preset:editorial-serif")
12243
+ ];
12244
+ case "serif-editorial":
12245
+ return [
12246
+ typographyChoice("typography-preset:editorial-serif"),
12247
+ typographyChoice("typography-preset:classic-serif"),
12248
+ typographyChoice("typography-preset:warm-rounded")
12249
+ ];
12250
+ case "classic-serif":
12251
+ return [
12252
+ typographyChoice("typography-preset:classic-serif"),
12253
+ typographyChoice("typography-preset:luxe-contrast"),
12254
+ typographyChoice("typography-preset:editorial-serif")
12255
+ ];
12256
+ }
12257
+ }
11141
12258
  var curatedSiteStyles = [
11142
12259
  defineCuratedSiteStyle({
11143
12260
  id: "site-style:calm-studio",
@@ -11154,7 +12271,11 @@ var curatedSiteStyles = [
11154
12271
  motion: "subtle"
11155
12272
  },
11156
12273
  compositionBudget: quietBudget,
11157
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12274
+ recommendedHeaderLookIds: [
12275
+ "centered-calm",
12276
+ "minimal-transparent",
12277
+ "clean-base"
12278
+ ],
11158
12279
  buttonPersonalityChoices: [
11159
12280
  buttonChoice("soft-pill"),
11160
12281
  buttonChoice("pebble"),
@@ -11183,7 +12304,11 @@ var curatedSiteStyles = [
11183
12304
  motion: "subtle"
11184
12305
  },
11185
12306
  compositionBudget: balancedBudget,
11186
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12307
+ recommendedHeaderLookIds: [
12308
+ "practical-utility",
12309
+ "brand-solid",
12310
+ "clean-base"
12311
+ ],
11187
12312
  buttonPersonalityChoices: [
11188
12313
  buttonChoice("confident-chip"),
11189
12314
  buttonChoice("soft-pill"),
@@ -11210,7 +12335,11 @@ var curatedSiteStyles = [
11210
12335
  motion: "subtle"
11211
12336
  },
11212
12337
  compositionBudget: balancedBudget,
11213
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
12338
+ recommendedHeaderLookIds: [
12339
+ "serif-line",
12340
+ "minimal-transparent",
12341
+ "centered-calm"
12342
+ ],
11214
12343
  buttonPersonalityChoices: [
11215
12344
  buttonChoice("editorial-link"),
11216
12345
  buttonChoice("soft-pill"),
@@ -11238,7 +12367,11 @@ var curatedSiteStyles = [
11238
12367
  motion: "expressive"
11239
12368
  },
11240
12369
  compositionBudget: balancedBudget,
11241
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12370
+ recommendedHeaderLookIds: [
12371
+ "brand-solid",
12372
+ "practical-utility",
12373
+ "clean-base"
12374
+ ],
11242
12375
  buttonPersonalityChoices: [
11243
12376
  buttonChoice("pebble"),
11244
12377
  buttonChoice("brushed-wash"),
@@ -11255,7 +12388,10 @@ var curatedSiteStyles = [
11255
12388
  name: "Quiet Luxury",
11256
12389
  description: "Minimal, confident, and refined for premium experiences and private services.",
11257
12390
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
11258
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
12391
+ siteCreatorSelection: {
12392
+ kind: "site_creator_keyword_heuristic",
12393
+ priority: 20
12394
+ },
11259
12395
  selectionKeywordRules: [
11260
12396
  { kind: "word", value: "luxury" },
11261
12397
  { kind: "word", value: "premium" },
@@ -11273,7 +12409,11 @@ var curatedSiteStyles = [
11273
12409
  motion: "none"
11274
12410
  },
11275
12411
  compositionBudget: quietBudget,
11276
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
12412
+ recommendedHeaderLookIds: [
12413
+ "minimal-transparent",
12414
+ "serif-line",
12415
+ "clean-base"
12416
+ ],
11277
12417
  buttonPersonalityChoices: [
11278
12418
  buttonChoice("editorial-link"),
11279
12419
  buttonChoice("confident-chip"),
@@ -11309,7 +12449,11 @@ var curatedSiteStyles = [
11309
12449
  motion: "none"
11310
12450
  },
11311
12451
  compositionBudget: quietBudget,
11312
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12452
+ recommendedHeaderLookIds: [
12453
+ "practical-utility",
12454
+ "brand-solid",
12455
+ "clean-base"
12456
+ ],
11313
12457
  buttonPersonalityChoices: [
11314
12458
  buttonChoice("confident-chip"),
11315
12459
  buttonChoice("pebble"),
@@ -11336,7 +12480,11 @@ var curatedSiteStyles = [
11336
12480
  motion: "subtle"
11337
12481
  },
11338
12482
  compositionBudget: balancedBudget,
11339
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12483
+ recommendedHeaderLookIds: [
12484
+ "centered-calm",
12485
+ "minimal-transparent",
12486
+ "clean-base"
12487
+ ],
11340
12488
  buttonPersonalityChoices: [
11341
12489
  buttonChoice("soft-pill"),
11342
12490
  buttonChoice("pebble"),
@@ -11353,7 +12501,10 @@ var curatedSiteStyles = [
11353
12501
  name: "Quiet Practice",
11354
12502
  description: "Grounded, calm, and practical for small appointment-first practices.",
11355
12503
  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.",
11356
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
12504
+ siteCreatorSelection: {
12505
+ kind: "site_creator_keyword_heuristic",
12506
+ priority: 30
12507
+ },
11357
12508
  selectionKeywordRules: [
11358
12509
  { kind: "substring", value: "massage" },
11359
12510
  { kind: "word", value: "bodywork" },
@@ -11374,7 +12525,11 @@ var curatedSiteStyles = [
11374
12525
  motion: "subtle"
11375
12526
  },
11376
12527
  compositionBudget: quietBudget,
11377
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
12528
+ recommendedHeaderLookIds: [
12529
+ "practical-utility",
12530
+ "clean-base",
12531
+ "centered-calm"
12532
+ ],
11378
12533
  buttonPersonalityChoices: [
11379
12534
  buttonChoice("pebble"),
11380
12535
  buttonChoice("soft-pill"),
@@ -11391,7 +12546,10 @@ var curatedSiteStyles = [
11391
12546
  name: "Personal Retreat Journal",
11392
12547
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
11393
12548
  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.",
11394
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
12549
+ siteCreatorSelection: {
12550
+ kind: "site_creator_keyword_heuristic",
12551
+ priority: 40
12552
+ },
11395
12553
  selectionKeywordRules: [
11396
12554
  { kind: "substring", value: "retreat" },
11397
12555
  { kind: "phrase", value: "solo practitioner" },
@@ -11411,7 +12569,11 @@ var curatedSiteStyles = [
11411
12569
  motion: "subtle"
11412
12570
  },
11413
12571
  compositionBudget: balancedBudget,
11414
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
12572
+ recommendedHeaderLookIds: [
12573
+ "serif-line",
12574
+ "centered-calm",
12575
+ "minimal-transparent"
12576
+ ],
11415
12577
  buttonPersonalityChoices: [
11416
12578
  buttonChoice("editorial-link"),
11417
12579
  buttonChoice("soft-pill"),
@@ -11428,7 +12590,10 @@ var curatedSiteStyles = [
11428
12590
  name: "Tactile Workshop",
11429
12591
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
11430
12592
  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.",
11431
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
12593
+ siteCreatorSelection: {
12594
+ kind: "site_creator_keyword_heuristic",
12595
+ priority: 50
12596
+ },
11432
12597
  selectionKeywordRules: [
11433
12598
  { kind: "substring", value: "ceramic" },
11434
12599
  { kind: "word", value: "pottery" },
@@ -11448,8 +12613,15 @@ var curatedSiteStyles = [
11448
12613
  motion: "subtle"
11449
12614
  },
11450
12615
  compositionBudget: balancedBudget,
11451
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
11452
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12616
+ recommendedHeaderLookIds: [
12617
+ "brand-solid",
12618
+ "practical-utility",
12619
+ "clean-base"
12620
+ ],
12621
+ recommendedFooterLookIds: [
12622
+ "site-footer-brand-two-band",
12623
+ "footer-muted-grounding"
12624
+ ],
11453
12625
  buttonPersonalityChoices: [
11454
12626
  buttonChoice("pebble"),
11455
12627
  buttonChoice("confident-chip"),
@@ -11464,101 +12636,178 @@ var curatedSiteStyles = [
11464
12636
  ]
11465
12637
  }),
11466
12638
  defineCuratedSiteStyle({
11467
- id: "site-style:bold-launch",
11468
- name: "Bold Launch",
11469
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
11470
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
11471
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
11472
- selectionKeywordRules: [
11473
- { kind: "substring", value: "launch" },
11474
- { kind: "substring", value: "campaign" },
11475
- { kind: "word", value: "preorder" },
11476
- { kind: "phrase", value: "pre-order" },
11477
- { kind: "substring", value: "waitlist" },
11478
- { kind: "word", value: "drop" }
11479
- ],
11480
- tokenRecipes: {
11481
- palette: "high-contrast",
11482
- contrast: "maximum",
11483
- radius: "pill",
11484
- shadow: "layered",
11485
- typography: "clean-sans",
11486
- spacing: "regular",
11487
- motion: "expressive"
12639
+ id: "site-style:soft-earth",
12640
+ name: "Soft Earth",
12641
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12642
+ 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.",
12643
+ siteCreatorSelection: {
12644
+ kind: "site_creator_keyword_heuristic",
12645
+ priority: 45
11488
12646
  },
11489
- compositionBudget: expressiveBudget,
11490
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
11491
- buttonPersonalityChoices: [
11492
- buttonChoice("ink-stamp"),
11493
- buttonChoice("confident-chip"),
11494
- buttonChoice("brushed-wash"),
11495
- buttonChoice("pebble")
12647
+ selectionKeywordRules: [
12648
+ { kind: "word", value: "meditation" },
12649
+ { kind: "word", value: "wellbeing" },
12650
+ { kind: "substring", value: "retreat" },
12651
+ { kind: "phrase", value: "yoga studio" },
12652
+ { kind: "phrase", value: "mindful movement" }
11496
12653
  ],
11497
- paletteVariantChoices: [
11498
- paletteChoice("high-contrast-monochrome"),
11499
- paletteChoice("high-contrast-ink"),
11500
- paletteChoice("brand-led-jewel"),
11501
- paletteChoice("brand-led-warm")
11502
- ]
11503
- }),
11504
- defineCuratedSiteStyle({
11505
- id: "site-style:south-west-twerk-school",
11506
- name: "South West Twerk School",
11507
- description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
11508
- generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
11509
12654
  tokenRecipes: {
11510
- palette: "brand-led",
11511
- contrast: "maximum",
12655
+ palette: "warm-neutral",
12656
+ contrast: "standard",
11512
12657
  radius: "soft",
11513
- shadow: "layered",
11514
- typography: "clean-sans",
12658
+ shadow: "subtle",
12659
+ typography: "serif-editorial",
11515
12660
  spacing: "airy",
11516
- motion: "expressive"
12661
+ motion: "subtle"
11517
12662
  },
11518
- compositionBudget: expressiveBudget,
12663
+ compositionBudget: balancedBudget,
11519
12664
  themeOverrides: {
11520
12665
  typography: {
11521
12666
  body: {
11522
- family: "Manrope, system-ui, sans-serif",
11523
- size: "lg",
12667
+ family: "Inter, system-ui, sans-serif",
12668
+ size: "md",
11524
12669
  weight: "regular",
11525
12670
  lineHeight: "relaxed",
11526
12671
  letterSpacing: "normal"
11527
12672
  },
11528
12673
  headings: {
11529
12674
  default: {
11530
- family: '"TAN - PEARL", sans-serif',
11531
- weight: "bold",
12675
+ family: '"Cormorant Garamond", Georgia, serif',
12676
+ weight: "regular",
11532
12677
  lineHeight: "normal",
11533
- letterSpacing: "tight",
11534
- colorToken: "primary",
12678
+ letterSpacing: "normal",
12679
+ colorToken: "text",
11535
12680
  italic: null,
11536
12681
  case: null
11537
12682
  },
11538
12683
  h1: {
11539
12684
  size: "xl",
11540
- weight: "bold",
12685
+ weight: "regular",
11541
12686
  lineHeight: "normal",
11542
- letterSpacing: "tight",
12687
+ letterSpacing: "normal",
11543
12688
  italic: null
11544
12689
  },
11545
12690
  h2: {
11546
12691
  size: "lg",
11547
- weight: "bold",
12692
+ weight: "regular",
11548
12693
  lineHeight: "normal",
11549
12694
  letterSpacing: "normal",
11550
12695
  italic: null
11551
12696
  },
11552
12697
  h3: {
11553
12698
  size: "md",
11554
- weight: "bold",
12699
+ weight: "regular",
11555
12700
  lineHeight: "normal",
11556
12701
  letterSpacing: "normal",
11557
12702
  italic: null
11558
12703
  }
11559
12704
  },
11560
- scale: "balanced"
12705
+ scale: "majorThird"
11561
12706
  },
12707
+ bodyText: {
12708
+ intro: {
12709
+ paragraphSize: "default",
12710
+ headingSize: "editorial"
12711
+ }
12712
+ }
12713
+ },
12714
+ recommendedAppearancePresetIds: [
12715
+ "hero-brand-scrim",
12716
+ "intro-soft-earth-statement",
12717
+ "feature-cards-soft-earth-offerings",
12718
+ "testimonials-soft-earth-proof-band",
12719
+ "faq-soft-earth-two-column",
12720
+ "contact-form-panel"
12721
+ ],
12722
+ recommendedHeaderLookIds: [
12723
+ "centered-calm",
12724
+ "minimal-transparent",
12725
+ "serif-line"
12726
+ ],
12727
+ recommendedFooterLookIds: [
12728
+ "footer-muted-grounding",
12729
+ "site-footer-brand-two-band"
12730
+ ],
12731
+ buttonPersonalityChoices: [
12732
+ buttonChoice("earth-pill"),
12733
+ buttonChoice("soft-pill"),
12734
+ buttonChoice("pebble"),
12735
+ buttonChoice("editorial-link")
12736
+ ],
12737
+ paletteVariantChoices: [
12738
+ paletteChoice("warm-neutral-soft-earth"),
12739
+ paletteChoice("warm-neutral-clay"),
12740
+ paletteChoice("warm-neutral-forest"),
12741
+ paletteChoice("soft-natural-sage")
12742
+ ]
12743
+ }),
12744
+ defineCuratedSiteStyle({
12745
+ id: "site-style:bold-launch",
12746
+ name: "Bold Launch",
12747
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
12748
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
12749
+ siteCreatorSelection: {
12750
+ kind: "site_creator_keyword_heuristic",
12751
+ priority: 10
12752
+ },
12753
+ selectionKeywordRules: [
12754
+ { kind: "substring", value: "launch" },
12755
+ { kind: "substring", value: "campaign" },
12756
+ { kind: "word", value: "preorder" },
12757
+ { kind: "phrase", value: "pre-order" },
12758
+ { kind: "substring", value: "waitlist" },
12759
+ { kind: "word", value: "drop" }
12760
+ ],
12761
+ tokenRecipes: {
12762
+ palette: "high-contrast",
12763
+ contrast: "maximum",
12764
+ radius: "pill",
12765
+ shadow: "layered",
12766
+ typography: "clean-sans",
12767
+ spacing: "regular",
12768
+ motion: "expressive"
12769
+ },
12770
+ compositionBudget: expressiveBudget,
12771
+ recommendedHeaderLookIds: [
12772
+ "transparent-overlay",
12773
+ "floating-glass",
12774
+ "brand-solid"
12775
+ ],
12776
+ buttonPersonalityChoices: [
12777
+ buttonChoice("ink-stamp"),
12778
+ buttonChoice("confident-chip"),
12779
+ buttonChoice("brushed-wash"),
12780
+ buttonChoice("pebble")
12781
+ ],
12782
+ paletteVariantChoices: [
12783
+ paletteChoice("high-contrast-monochrome"),
12784
+ paletteChoice("high-contrast-ink"),
12785
+ paletteChoice("brand-led-jewel"),
12786
+ paletteChoice("brand-led-warm")
12787
+ ]
12788
+ }),
12789
+ defineCuratedSiteStyle({
12790
+ id: "site-style:south-west-twerk-school",
12791
+ name: "South West Twerk School",
12792
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
12793
+ generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
12794
+ tokenRecipes: {
12795
+ palette: "brand-led",
12796
+ contrast: "maximum",
12797
+ radius: "soft",
12798
+ shadow: "layered",
12799
+ typography: "clean-sans",
12800
+ spacing: "airy",
12801
+ motion: "expressive"
12802
+ },
12803
+ compositionBudget: expressiveBudget,
12804
+ typographyPresetChoices: [
12805
+ typographyChoice("typography-preset:bold-display"),
12806
+ typographyChoice("typography-preset:modern-sans"),
12807
+ typographyChoice("typography-preset:luxe-contrast")
12808
+ ],
12809
+ defaultTypographyPresetId: "typography-preset:bold-display",
12810
+ themeOverrides: {
11562
12811
  bodyText: {
11563
12812
  intro: {
11564
12813
  paragraphSize: "editorial",
@@ -11574,8 +12823,15 @@ var curatedSiteStyles = [
11574
12823
  "testimonials-accent-quote-proof",
11575
12824
  "contact-form-brand-depth-card"
11576
12825
  ],
11577
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
11578
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12826
+ recommendedHeaderLookIds: [
12827
+ "brand-solid",
12828
+ "transparent-overlay",
12829
+ "practical-utility"
12830
+ ],
12831
+ recommendedFooterLookIds: [
12832
+ "site-footer-brand-two-band",
12833
+ "footer-muted-grounding"
12834
+ ],
11579
12835
  buttonPersonalityChoices: [
11580
12836
  buttonChoice("showtime-pill"),
11581
12837
  buttonChoice("confident-chip"),
@@ -15890,8 +17146,9 @@ var faqAccordionFragment = defineFragment({
15890
17146
  },
15891
17147
  fallback: "rb-faq-item"
15892
17148
  },
15893
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
15894
- // Pass icon style from theme
17149
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17150
+ // Legacy theme accordion style
17151
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
15895
17152
  },
15896
17153
  triggerFrom: "faqItem.question",
15897
17154
  contentFrom: "faqItem.answer"
@@ -16969,61 +18226,389 @@ function splitLayoutWith(children) {
16969
18226
  children
16970
18227
  }
16971
18228
  }),
16972
- // The split variants render the image as a real grid column, so suppress
16973
- // the default absolute background image layer while keeping color/overlay.
16974
- renderBackgroundImage: false,
16975
- baseClass: ""
16976
- });
16977
- }
16978
- var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
16979
- var splitImageColumn = heroSplitImagePane();
16980
- var splitLayout = splitLayoutWith([
16981
- splitContentColumn,
16982
- splitImageColumn
16983
- ]);
16984
- var splitReverseLayout = splitLayoutWith([
16985
- splitImageColumn,
16986
- splitContentColumn
16987
- ]);
16988
- var heroConfig = {
16989
- id: "block.hero",
16990
- title: "Hero",
16991
- titleSource: "headline",
16992
- category: "layout",
16993
- includeContainerStyles: true,
16994
- promotedFields: ["_sectionStyles.background.image"],
16995
- fragments: [
16996
- { fragment: heroCopyFragment, fieldPriority: 0 },
16997
- { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
16998
- { fragment: heroCtaRowFragment, fieldPriority: 2 }
16999
- ],
17000
- additionalFields: [
17001
- containerStylesField({
17002
- id: "_contentCardStyles",
17003
- label: "Content card",
17004
- renderInHeader: true,
17005
- intent: "style"
18229
+ // The split variants render the image as a real grid column, so suppress
18230
+ // the default absolute background image layer while keeping color/overlay.
18231
+ renderBackgroundImage: false,
18232
+ baseClass: ""
18233
+ });
18234
+ }
18235
+ var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
18236
+ var splitImageColumn = heroSplitImagePane();
18237
+ var splitLayout = splitLayoutWith([
18238
+ splitContentColumn,
18239
+ splitImageColumn
18240
+ ]);
18241
+ var splitReverseLayout = splitLayoutWith([
18242
+ splitImageColumn,
18243
+ splitContentColumn
18244
+ ]);
18245
+ var heroConfig = {
18246
+ id: "block.hero",
18247
+ title: "Hero",
18248
+ titleSource: "headline",
18249
+ category: "layout",
18250
+ includeContainerStyles: true,
18251
+ promotedFields: ["_sectionStyles.background.image"],
18252
+ fragments: [
18253
+ { fragment: heroCopyFragment, fieldPriority: 0 },
18254
+ { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
18255
+ { fragment: heroCtaRowFragment, fieldPriority: 2 }
18256
+ ],
18257
+ additionalFields: [
18258
+ containerStylesField({
18259
+ id: "_contentCardStyles",
18260
+ label: "Content card",
18261
+ renderInHeader: true,
18262
+ intent: "style"
18263
+ })
18264
+ ],
18265
+ layout: classicLayout,
18266
+ variants: {
18267
+ classic: classicLayout,
18268
+ micro: microLayout,
18269
+ split: splitLayout,
18270
+ splitReverse: splitReverseLayout
18271
+ },
18272
+ defaultVariant: "classic",
18273
+ description: "Hero section with headline, subtitle, and repeatable CTAs.",
18274
+ tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
18275
+ icon: "Sparkles",
18276
+ styleTokens: {
18277
+ typography: "display",
18278
+ spacing: "xl"
18279
+ }
18280
+ };
18281
+ var heroManifest = createBlockManifest(heroConfig);
18282
+ var heroBlockDefinition = {
18283
+ manifest: heroManifest
18284
+ };
18285
+
18286
+ // ../blocks/src/system/fields/aspectRatio.ts
18287
+ var standardAspectRatioOptions = [
18288
+ { value: "auto", label: "Auto (original)" },
18289
+ { value: "16/9", label: "16:9 (Landscape)" },
18290
+ { value: "4/3", label: "4:3 (Standard)" },
18291
+ { value: "1/1", label: "1:1 (Square)" },
18292
+ { value: "3/4", label: "3:4 (Portrait)" }
18293
+ ];
18294
+ function createAspectRatioField(options = {}) {
18295
+ return {
18296
+ id: options.id ?? "aspectRatio",
18297
+ type: "select",
18298
+ label: options.label ?? "Aspect ratio",
18299
+ ...options.description ? { description: options.description } : {},
18300
+ required: false,
18301
+ defaultValue: options.defaultValue ?? "auto",
18302
+ multiple: false,
18303
+ options: [...standardAspectRatioOptions],
18304
+ ui: {
18305
+ intent: options.uiIntent ?? "display",
18306
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
18307
+ }
18308
+ };
18309
+ }
18310
+
18311
+ // ../blocks/src/system/fields/imageLayout.ts
18312
+ function createImageColSizeField(options = {}) {
18313
+ const {
18314
+ id = "imageColSize",
18315
+ label = "Image column size",
18316
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
18317
+ defaultValue = "1/3",
18318
+ uiIntent = "display",
18319
+ visibleWhen
18320
+ } = options;
18321
+ return {
18322
+ id,
18323
+ type: "select",
18324
+ label,
18325
+ description,
18326
+ required: false,
18327
+ defaultValue,
18328
+ multiple: false,
18329
+ options: [
18330
+ { value: "1/4", label: "Small (1/4)" },
18331
+ { value: "1/3", label: "Medium (1/3)" },
18332
+ { value: "2/5", label: "Large (2/5)" },
18333
+ { value: "1/2", label: "Extra large (1/2)" },
18334
+ { value: "2/3", label: "Huge (2/3)" }
18335
+ ],
18336
+ ui: {
18337
+ intent: uiIntent,
18338
+ ...visibleWhen ? { visibleWhen } : {}
18339
+ }
18340
+ };
18341
+ }
18342
+ function createImagePositionField(options = {}) {
18343
+ const {
18344
+ id = "imagePosition",
18345
+ label = "Image position",
18346
+ description = "Choose which side the image appears on.",
18347
+ defaultValue = "left",
18348
+ includeAlternate = false,
18349
+ uiIntent = "display",
18350
+ visibleWhen
18351
+ } = options;
18352
+ const positionOptions = [
18353
+ { value: "left", label: "Left" },
18354
+ { value: "right", label: "Right" },
18355
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
18356
+ ];
18357
+ return {
18358
+ id,
18359
+ type: "select",
18360
+ label,
18361
+ description,
18362
+ required: false,
18363
+ defaultValue,
18364
+ multiple: false,
18365
+ // Spread to get a mutable array type without unsafe casts.
18366
+ options: [...positionOptions],
18367
+ ui: {
18368
+ intent: uiIntent,
18369
+ ...visibleWhen ? { visibleWhen } : {}
18370
+ }
18371
+ };
18372
+ }
18373
+
18374
+ // ../blocks/src/system/blocks/intro.ts
18375
+ function introHeading(className) {
18376
+ return text(
18377
+ {
18378
+ as: "h2",
18379
+ className
18380
+ },
18381
+ when("content.title"),
18382
+ bind("content.title")
18383
+ );
18384
+ }
18385
+ function introBody(className = "rb-prose rb-max-w-none") {
18386
+ return richText({ className }, bind("content.body"));
18387
+ }
18388
+ function introCtas(justify = "start") {
18389
+ return ctaRow({
18390
+ justify,
18391
+ gap: "md",
18392
+ containerClassName: "rb-mt-2"
18393
+ });
18394
+ }
18395
+ function introCopyStack(options = {}) {
18396
+ return stack(
18397
+ {
18398
+ gap: "md",
18399
+ className: options.className ?? "rb-intro-copy"
18400
+ },
18401
+ [
18402
+ introHeading(options.headingClassName ?? "rb-intro-title"),
18403
+ introBody(options.bodyClassName),
18404
+ introCtas(options.ctaJustify)
18405
+ ]
18406
+ );
18407
+ }
18408
+ var introMedia = media(
18409
+ {
18410
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
18411
+ style: {
18412
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
18413
+ }
18414
+ },
18415
+ bind("content.media")
18416
+ );
18417
+ var centeredCopyLayout = styledSection({
18418
+ children: styledContainer({
18419
+ rootType: "stack",
18420
+ rootProps: { gap: "lg" },
18421
+ children: [
18422
+ introCopyStack({
18423
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
18424
+ headingClassName: "rb-intro-title rb-text-center",
18425
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
18426
+ ctaJustify: "center"
18427
+ })
18428
+ ]
18429
+ }),
18430
+ baseClass: "",
18431
+ spacing: "medium"
18432
+ });
18433
+ var statementCopyLayout = styledSection({
18434
+ children: styledContainer({
18435
+ children: [
18436
+ el(
18437
+ "div",
18438
+ {
18439
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18440
+ },
18441
+ [
18442
+ introHeading("rb-intro-title rb-max-w-xl"),
18443
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18444
+ introBody(),
18445
+ introCtas("start")
18446
+ ])
18447
+ ]
18448
+ )
18449
+ ]
18450
+ }),
18451
+ baseClass: "",
18452
+ spacing: "medium"
18453
+ });
18454
+ var statementMediaLayout = styledSection({
18455
+ children: styledContainer({
18456
+ children: [
18457
+ el(
18458
+ "div",
18459
+ {
18460
+ 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"
18461
+ },
18462
+ [
18463
+ introHeading("rb-intro-title rb-max-w-xl"),
18464
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18465
+ introBody(),
18466
+ introCtas("start")
18467
+ ]),
18468
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
18469
+ ]
18470
+ )
18471
+ ]
18472
+ }),
18473
+ baseClass: "",
18474
+ spacing: "medium"
18475
+ });
18476
+ var mediaCopyLayout = styledSection({
18477
+ children: styledContainer({
18478
+ children: [
18479
+ responsiveTwoColumn({
18480
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
18481
+ text: introCopyStack({
18482
+ className: "rb-intro-copy rb-max-w-xl",
18483
+ headingClassName: "rb-intro-title"
18484
+ }),
18485
+ ratioFrom: "content.ratio",
18486
+ imagePositionFrom: "content.imagePosition",
18487
+ gapFrom: "content.gap",
18488
+ gapFallback: "comfortable",
18489
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
18490
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
18491
+ })
18492
+ ]
18493
+ }),
18494
+ baseClass: "",
18495
+ spacing: "medium"
18496
+ });
18497
+ var introConfig = {
18498
+ id: "block.intro",
18499
+ title: "Intro",
18500
+ category: "layout",
18501
+ includeContainerStyles: true,
18502
+ titleSource: "title",
18503
+ additionalFields: [
18504
+ {
18505
+ id: "title",
18506
+ type: "text",
18507
+ label: "Statement",
18508
+ required: false,
18509
+ multiline: true,
18510
+ maxLength: 160
18511
+ },
18512
+ {
18513
+ id: "body",
18514
+ type: "richText",
18515
+ label: "Text",
18516
+ required: true,
18517
+ ui: {
18518
+ richTextVariant: "limited"
18519
+ }
18520
+ },
18521
+ {
18522
+ id: "media",
18523
+ type: "media",
18524
+ label: "Media",
18525
+ required: false,
18526
+ mediaKinds: ["image"],
18527
+ ui: {
18528
+ intent: "content",
18529
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
18530
+ }
18531
+ },
18532
+ createImagePositionField({
18533
+ id: "imagePosition",
18534
+ label: "Image position",
18535
+ defaultValue: "left",
18536
+ uiIntent: "display",
18537
+ visibleWhen: { field: "variant", equals: "media-copy" }
18538
+ }),
18539
+ {
18540
+ id: "gap",
18541
+ type: "select",
18542
+ label: "Gap between media and text",
18543
+ required: false,
18544
+ defaultValue: "comfortable",
18545
+ multiple: false,
18546
+ options: [
18547
+ { value: "none", label: "None" },
18548
+ { value: "compact", label: "Compact" },
18549
+ { value: "cozy", label: "Cozy" },
18550
+ { value: "medium", label: "Medium" },
18551
+ { value: "comfortable", label: "Comfortable" },
18552
+ { value: "spacious", label: "Spacious" }
18553
+ ],
18554
+ ui: {
18555
+ intent: "display",
18556
+ visibleWhen: { field: "variant", equals: "media-copy" }
18557
+ }
18558
+ },
18559
+ createImageColSizeField({
18560
+ id: "ratio",
18561
+ label: "Media column size",
18562
+ defaultValue: "1/2",
18563
+ uiIntent: "display",
18564
+ visibleWhen: { field: "variant", equals: "media-copy" }
18565
+ }),
18566
+ createAspectRatioField({
18567
+ id: "aspectRatio",
18568
+ label: "Media aspect ratio",
18569
+ description: "Crop media to a consistent aspect ratio.",
18570
+ defaultValue: "auto",
18571
+ visibleWhen: { field: "media", notEquals: null }
18572
+ }),
18573
+ createCtasRepeater({
18574
+ label: "Calls to action",
18575
+ itemLabel: "CTA",
18576
+ maxItems: 2
17006
18577
  })
17007
18578
  ],
17008
- layout: classicLayout,
18579
+ layout: centeredCopyLayout,
17009
18580
  variants: {
17010
- classic: classicLayout,
17011
- micro: microLayout,
17012
- split: splitLayout,
17013
- splitReverse: splitReverseLayout
18581
+ "centered-copy": centeredCopyLayout,
18582
+ "statement-copy": statementCopyLayout,
18583
+ "statement-media": statementMediaLayout,
18584
+ "media-copy": mediaCopyLayout
17014
18585
  },
17015
- defaultVariant: "classic",
17016
- description: "Hero section with headline, subtitle, and repeatable CTAs.",
17017
- tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
17018
- icon: "Sparkles",
17019
- styleTokens: {
17020
- typography: "display",
17021
- spacing: "xl"
17022
- }
18586
+ defaultVariant: "statement-copy",
18587
+ variantOptions: {
18588
+ "centered-copy": {
18589
+ label: "Centered copy",
18590
+ description: "A focused intro with centered text and optional calls to action."
18591
+ },
18592
+ "statement-copy": {
18593
+ label: "Statement and copy",
18594
+ description: "A large statement on the left with supporting copy on the right."
18595
+ },
18596
+ "statement-media": {
18597
+ label: "Statement, copy and media",
18598
+ description: "A three-part intro with statement, copy and a small image."
18599
+ },
18600
+ "media-copy": {
18601
+ label: "Media and copy",
18602
+ description: "A compact media/text intro for softer transitions after a hero."
18603
+ }
18604
+ },
18605
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
18606
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
18607
+ icon: "PanelTopOpen"
17023
18608
  };
17024
- var heroManifest = createBlockManifest(heroConfig);
17025
- var heroBlockDefinition = {
17026
- manifest: heroManifest
18609
+ var introManifest = createBlockManifest(introConfig);
18610
+ var introBlockDefinition = {
18611
+ manifest: introManifest
17027
18612
  };
17028
18613
 
17029
18614
  // ../blocks/src/system/blocks/body-text.ts
@@ -17869,6 +19454,37 @@ var faqComposition = composeFragments([
17869
19454
  { fragment: faqHeadingFragment, fieldPriority: 0 },
17870
19455
  { fragment: faqAccordionFragment, fieldPriority: 1 }
17871
19456
  ]);
19457
+ function fragmentLayoutNode(layout) {
19458
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
19459
+ }
19460
+ function isNodeDefinitionArray(layout) {
19461
+ return Array.isArray(layout);
19462
+ }
19463
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19464
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19465
+ var defaultLayout = styledSection({
19466
+ children: styledContainer({
19467
+ baseClassName: "rb-relative rb-isolate",
19468
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
19469
+ }),
19470
+ baseClass: ""
19471
+ });
19472
+ var twoColumnLayout = styledSection({
19473
+ children: styledContainer({
19474
+ baseClassName: "rb-relative rb-isolate",
19475
+ children: el(
19476
+ "div",
19477
+ {
19478
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19479
+ },
19480
+ [
19481
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19482
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19483
+ ]
19484
+ )
19485
+ }),
19486
+ baseClass: ""
19487
+ });
17872
19488
  var faqManifest = createBlockManifest({
17873
19489
  id: "block.faq",
17874
19490
  title: "FAQ",
@@ -17885,13 +19501,22 @@ var faqManifest = createBlockManifest({
17885
19501
  label: "FAQ item styles"
17886
19502
  })
17887
19503
  ],
17888
- layout: styledSection({
17889
- children: styledContainer({
17890
- baseClassName: "rb-relative rb-isolate",
17891
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
17892
- }),
17893
- baseClass: ""
17894
- }),
19504
+ layout: defaultLayout,
19505
+ variants: {
19506
+ default: defaultLayout,
19507
+ "two-column": twoColumnLayout
19508
+ },
19509
+ defaultVariant: "default",
19510
+ variantOptions: {
19511
+ default: {
19512
+ label: "Default",
19513
+ description: "A centered heading above one FAQ accordion."
19514
+ },
19515
+ "two-column": {
19516
+ label: "Two column",
19517
+ description: "A left heading column with FAQ items on the right."
19518
+ }
19519
+ },
17895
19520
  description: "Accordion of frequently asked questions and answers.",
17896
19521
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
17897
19522
  icon: "HelpCircle"
@@ -18541,7 +20166,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
18541
20166
  function resolveHeaderVisualStyles(header, tokens) {
18542
20167
  const navContainerType = header?.navContainer?.type ?? "none";
18543
20168
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
18544
- if (hasContainedNav) {
20169
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
20170
+ if (hasContainedNav || hasTransparentVariant) {
18545
20171
  return {
18546
20172
  backgroundToken: "transparent",
18547
20173
  paletteHex: null,
@@ -18599,10 +20225,7 @@ var headerRootClassTransform = {
18599
20225
  const navContainerType = header?.navContainer?.type ?? "none";
18600
20226
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
18601
20227
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
18602
- const classes = [
18603
- config.base,
18604
- backgroundClass
18605
- ];
20228
+ const classes = [config.base, backgroundClass];
18606
20229
  if (!hasContainedNav) {
18607
20230
  if (config.blur) classes.push(config.blur);
18608
20231
  if (config.blurSupport) classes.push(config.blurSupport);
@@ -18617,7 +20240,12 @@ var headerRootClassTransform = {
18617
20240
  if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
18618
20241
  classes.push(config.shrink);
18619
20242
  }
18620
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
20243
+ const VALID_VARIANTS = [
20244
+ "classic",
20245
+ "centered",
20246
+ "transparent",
20247
+ "floating"
20248
+ ];
18621
20249
  const variant = header?.variant;
18622
20250
  if (variant && VALID_VARIANTS.includes(variant)) {
18623
20251
  classes.push(`header-variant-${variant}`);
@@ -18670,6 +20298,17 @@ var headerRootStyleTransform = {
18670
20298
  return mergeStyles(...styleParts);
18671
20299
  }
18672
20300
  };
20301
+ var headerSectionBackgroundTransform = {
20302
+ id: "layout.headerSectionBackground",
20303
+ kind: "string",
20304
+ summary: "Resolve the inner site-header section background token",
20305
+ run: (value) => {
20306
+ const header = asPartialObject(value);
20307
+ const navContainerType = header?.navContainer?.type ?? "none";
20308
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
20309
+ return usesTransparentRoot ? "raw:transparent" : "background";
20310
+ }
20311
+ };
18673
20312
  var footerRootStyleTransform = {
18674
20313
  id: "layout.footerRootStyle",
18675
20314
  kind: "formatter",
@@ -18928,6 +20567,7 @@ var layoutTransforms = [
18928
20567
  headerRootClassTransform,
18929
20568
  footerRootClassTransform,
18930
20569
  headerRootStyleTransform,
20570
+ headerSectionBackgroundTransform,
18931
20571
  footerRootStyleTransform,
18932
20572
  footerBottomBarClassTransform,
18933
20573
  footerBottomBarContainerClassTransform,
@@ -19223,15 +20863,21 @@ var mobileCta = ctaButton({
19223
20863
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
19224
20864
  {
19225
20865
  type: "div",
19226
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
20866
+ props: {
20867
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
20868
+ }
19227
20869
  },
19228
20870
  {
19229
20871
  type: "div",
19230
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
20872
+ props: {
20873
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
20874
+ }
19231
20875
  },
19232
20876
  {
19233
20877
  type: "div",
19234
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
20878
+ props: {
20879
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
20880
+ }
19235
20881
  }
19236
20882
  ]);
19237
20883
  var mobileToggleButton = {
@@ -19414,31 +21060,12 @@ var floatingLayout = inline(
19414
21060
  ],
19415
21061
  when("$root.theme.header.variant", { equals: "floating" })
19416
21062
  );
19417
- var editorialLayout = stack(
19418
- {
19419
- gap: "md",
19420
- align: "center",
19421
- className: bindProp("$root.theme.header.maxWidth", {
19422
- transforms: pipe(
19423
- tx("layout.maxWidthClass", {
19424
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
19425
- })
19426
- ),
19427
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
19428
- })
19429
- },
19430
- [
19431
- centeredLogoRow,
19432
- createNavRow(
19433
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
19434
- "center"
19435
- )
19436
- ],
19437
- when("$root.theme.header.variant", { equals: "editorial" })
19438
- );
19439
21063
  var headerLayout = headerSection(
19440
21064
  {
19441
- background: "background",
21065
+ background: bindProp("$root.theme.header", {
21066
+ transforms: pipe(tx("layout.headerSectionBackground")),
21067
+ fallback: "background"
21068
+ }),
19442
21069
  allowOverflow: true,
19443
21070
  className: bindProp("$root.theme.header", {
19444
21071
  transforms: pipe(tx("layout.headerRootClass")),
@@ -19446,10 +21073,7 @@ var headerLayout = headerSection(
19446
21073
  }),
19447
21074
  style: bindProp("$root.theme.header", {
19448
21075
  transforms: pipe(tx("layout.headerRootStyle")),
19449
- fallback: mergeStyles(
19450
- textColorStyle("text"),
19451
- borderColorStyle("border")
19452
- )
21076
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
19453
21077
  })
19454
21078
  },
19455
21079
  [
@@ -19458,7 +21082,6 @@ var headerLayout = headerSection(
19458
21082
  centeredLayout,
19459
21083
  transparentLayout,
19460
21084
  floatingLayout,
19461
- editorialLayout,
19462
21085
  mobileOverlay
19463
21086
  ],
19464
21087
  props({
@@ -20273,79 +21896,298 @@ var collectionLayout = styledSection({
20273
21896
  { gap: "md" }
20274
21897
  ),
20275
21898
  baseClass: "",
20276
- spacing: "comfortable"
21899
+ spacing: "comfortable"
21900
+ });
21901
+ var collectionManifest = createBlockManifest({
21902
+ id: "block.collection",
21903
+ title: "Collection",
21904
+ category: "layout",
21905
+ additionalFields: [
21906
+ parseFieldDefinition({
21907
+ id: "layout",
21908
+ type: "select",
21909
+ label: "Layout",
21910
+ defaultValue: "grid",
21911
+ options: [
21912
+ { value: "grid", label: "Grid" },
21913
+ { value: "stack", label: "Stack" }
21914
+ ],
21915
+ ui: { intent: "display" }
21916
+ }),
21917
+ parseFieldDefinition({
21918
+ id: "columns",
21919
+ type: "select",
21920
+ label: "Columns",
21921
+ description: "Number of columns in the grid layout.",
21922
+ defaultValue: "3",
21923
+ options: [
21924
+ { value: "2", label: "2 columns" },
21925
+ { value: "3", label: "3 columns" },
21926
+ { value: "4", label: "4 columns" }
21927
+ ],
21928
+ ui: {
21929
+ intent: "display",
21930
+ visibleWhen: { field: "layout", equals: "grid" }
21931
+ }
21932
+ }),
21933
+ parseFieldDefinition({
21934
+ id: "gap",
21935
+ type: "select",
21936
+ label: "Gap",
21937
+ defaultValue: "medium",
21938
+ options: [
21939
+ { value: "none", label: "None" },
21940
+ { value: "compact", label: "Compact" },
21941
+ { value: "cozy", label: "Cozy" },
21942
+ { value: "medium", label: "Medium" },
21943
+ { value: "comfortable", label: "Comfortable" },
21944
+ { value: "spacious", label: "Spacious" }
21945
+ ],
21946
+ ui: { intent: "display" }
21947
+ }),
21948
+ fragmentsToRepeaterField(
21949
+ "items",
21950
+ "Items",
21951
+ collectionFragments,
21952
+ {
21953
+ minItems: 0,
21954
+ maxItems: 50,
21955
+ itemLabel: "Item",
21956
+ description: "Add items to this collection."
21957
+ }
21958
+ ),
21959
+ cardStylesField({
21960
+ id: "_cardStyles",
21961
+ label: "Item styles"
21962
+ })
21963
+ ],
21964
+ layout: collectionLayout,
21965
+ description: "Repeat items in a grid or stack layout.",
21966
+ tags: ["collection", "grid", "stack", "repeater"],
21967
+ icon: "LayoutList",
21968
+ styleTokens: { spacing: "lg" }
21969
+ });
21970
+ var collectionBlockDefinition = {
21971
+ manifest: collectionManifest
21972
+ };
21973
+
21974
+ // ../blocks/src/system/blocks/feature-cards.ts
21975
+ function grid3(props2, children) {
21976
+ return el("grid", props2 ?? void 0, children ?? void 0);
21977
+ }
21978
+ var sectionHeading = stack(
21979
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
21980
+ [
21981
+ text(
21982
+ {
21983
+ as: "h2",
21984
+ className: "rb-feature-cards-title rb-text-center"
21985
+ },
21986
+ when("content.title"),
21987
+ bind("content.title")
21988
+ ),
21989
+ richText(
21990
+ {
21991
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
21992
+ style: textColorStyle("mutedText")
21993
+ },
21994
+ when("content.description"),
21995
+ bind("content.description")
21996
+ )
21997
+ ]
21998
+ );
21999
+ var featureCard = styledCard(
22000
+ [
22001
+ media(
22002
+ {
22003
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
22004
+ style: {
22005
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
22006
+ }
22007
+ },
22008
+ when("card.media"),
22009
+ bind("card.media")
22010
+ ),
22011
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
22012
+ text(
22013
+ {
22014
+ as: "h3",
22015
+ className: "rb-feature-card-title"
22016
+ },
22017
+ bind("card.title")
22018
+ ),
22019
+ richText(
22020
+ {
22021
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
22022
+ style: textColorStyle("mutedText")
22023
+ },
22024
+ when("card.body"),
22025
+ bind("card.body")
22026
+ ),
22027
+ ctaRow({
22028
+ collectionPath: "ctas",
22029
+ itemName: "cta",
22030
+ gap: "sm",
22031
+ justify: "start",
22032
+ containerClassName: "rb-mt-auto"
22033
+ })
22034
+ ])
22035
+ ],
22036
+ {
22037
+ stylesFrom: "content._cardStyles",
22038
+ backgroundFrom: "content._cardStyles.background",
22039
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
22040
+ },
22041
+ repeat("content.cards", "card")
22042
+ );
22043
+ var cardsLayout = styledSection({
22044
+ children: styledContainer({
22045
+ rootType: "stack",
22046
+ rootProps: { gap: "xl" },
22047
+ children: [
22048
+ sectionHeading,
22049
+ grid3(
22050
+ {
22051
+ cols: {
22052
+ $bind: {
22053
+ from: "content.columns",
22054
+ fallback: 3,
22055
+ coerce: "number"
22056
+ }
22057
+ },
22058
+ gap: "lg"
22059
+ },
22060
+ [featureCard]
22061
+ )
22062
+ ]
22063
+ }),
22064
+ baseClass: "",
22065
+ spacing: "medium"
20277
22066
  });
20278
- var collectionManifest = createBlockManifest({
20279
- id: "block.collection",
20280
- title: "Collection",
22067
+ var featureCardsConfig = {
22068
+ id: "block.feature-cards",
22069
+ title: "Feature Cards",
20281
22070
  category: "layout",
22071
+ includeContainerStyles: true,
22072
+ titleSource: "title",
20282
22073
  additionalFields: [
20283
- parseFieldDefinition({
20284
- id: "layout",
20285
- type: "select",
20286
- label: "Layout",
20287
- defaultValue: "grid",
20288
- options: [
20289
- { value: "grid", label: "Grid" },
20290
- { value: "stack", label: "Stack" }
20291
- ],
20292
- ui: { intent: "display" }
20293
- }),
20294
- parseFieldDefinition({
22074
+ {
22075
+ id: "title",
22076
+ type: "text",
22077
+ label: "Title",
22078
+ required: false,
22079
+ multiline: false,
22080
+ maxLength: 120
22081
+ },
22082
+ {
22083
+ id: "description",
22084
+ type: "richText",
22085
+ label: "Description",
22086
+ required: false,
22087
+ ui: {
22088
+ richTextVariant: "limited"
22089
+ }
22090
+ },
22091
+ {
20295
22092
  id: "columns",
20296
22093
  type: "select",
20297
22094
  label: "Columns",
20298
- description: "Number of columns in the grid layout.",
22095
+ required: false,
20299
22096
  defaultValue: "3",
22097
+ multiple: false,
20300
22098
  options: [
20301
22099
  { value: "2", label: "2 columns" },
20302
22100
  { value: "3", label: "3 columns" },
20303
22101
  { value: "4", label: "4 columns" }
20304
22102
  ],
20305
- ui: {
20306
- intent: "display",
20307
- visibleWhen: { field: "layout", equals: "grid" }
20308
- }
20309
- }),
20310
- parseFieldDefinition({
20311
- id: "gap",
20312
- type: "select",
20313
- label: "Gap",
20314
- defaultValue: "medium",
20315
- options: [
20316
- { value: "none", label: "None" },
20317
- { value: "compact", label: "Compact" },
20318
- { value: "cozy", label: "Cozy" },
20319
- { value: "medium", label: "Medium" },
20320
- { value: "comfortable", label: "Comfortable" },
20321
- { value: "spacious", label: "Spacious" }
20322
- ],
20323
22103
  ui: { intent: "display" }
20324
- }),
20325
- fragmentsToRepeaterField(
20326
- "items",
20327
- "Items",
20328
- collectionFragments,
20329
- {
20330
- minItems: 0,
20331
- maxItems: 50,
20332
- itemLabel: "Item",
20333
- description: "Add items to this collection."
22104
+ },
22105
+ {
22106
+ id: "cards",
22107
+ type: "repeater",
22108
+ label: "Cards",
22109
+ required: false,
22110
+ minItems: 1,
22111
+ maxItems: 8,
22112
+ itemLabel: "Card",
22113
+ itemLabelSource: "title",
22114
+ allowConversion: true,
22115
+ ui: {
22116
+ intent: "content"
22117
+ },
22118
+ schema: {
22119
+ fields: [
22120
+ {
22121
+ id: "media",
22122
+ type: "media",
22123
+ label: "Image",
22124
+ required: false,
22125
+ mediaKinds: ["image"]
22126
+ },
22127
+ createAspectRatioField({
22128
+ id: "aspectRatio",
22129
+ label: "Image aspect ratio",
22130
+ defaultValue: "4/3",
22131
+ visibleWhen: { field: "media", notEquals: null }
22132
+ }),
22133
+ {
22134
+ id: "title",
22135
+ type: "text",
22136
+ label: "Title",
22137
+ required: true,
22138
+ multiline: false,
22139
+ maxLength: 120
22140
+ },
22141
+ {
22142
+ id: "body",
22143
+ type: "richText",
22144
+ label: "Text",
22145
+ required: false,
22146
+ ui: {
22147
+ richTextVariant: "limited"
22148
+ }
22149
+ },
22150
+ createCtasRepeater({
22151
+ label: "Calls to action",
22152
+ itemLabel: "CTA",
22153
+ maxItems: 1,
22154
+ button: {
22155
+ variants: [
22156
+ { value: "primary", label: "Primary" },
22157
+ { value: "secondary", label: "Secondary" },
22158
+ { value: "outline", label: "Outline" },
22159
+ { value: "ghost", label: "Ghost" },
22160
+ { value: "link", label: "Link" }
22161
+ ],
22162
+ defaultVariant: "ghost"
22163
+ }
22164
+ })
22165
+ ]
20334
22166
  }
20335
- ),
22167
+ },
20336
22168
  cardStylesField({
20337
22169
  id: "_cardStyles",
20338
- label: "Item styles"
22170
+ label: "Card styles"
20339
22171
  })
20340
22172
  ],
20341
- layout: collectionLayout,
20342
- description: "Repeat items in a grid or stack layout.",
20343
- tags: ["collection", "grid", "stack", "repeater"],
20344
- icon: "LayoutList",
20345
- styleTokens: { spacing: "lg" }
20346
- });
20347
- var collectionBlockDefinition = {
20348
- manifest: collectionManifest
22173
+ layout: cardsLayout,
22174
+ variants: {
22175
+ cards: cardsLayout
22176
+ },
22177
+ defaultVariant: "cards",
22178
+ variantOptions: {
22179
+ cards: {
22180
+ label: "Cards",
22181
+ description: "A responsive grid of image cards with optional calls to action."
22182
+ }
22183
+ },
22184
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
22185
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
22186
+ icon: "PanelsTopLeft"
22187
+ };
22188
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
22189
+ var featureCardsBlockDefinition = {
22190
+ manifest: featureCardsManifest
20349
22191
  };
20350
22192
 
20351
22193
  // ../blocks/src/system/fields/carousel.ts
@@ -20433,69 +22275,6 @@ function createCarouselBehaviorFields(options = {}) {
20433
22275
  return fields3;
20434
22276
  }
20435
22277
 
20436
- // ../blocks/src/system/fields/imageLayout.ts
20437
- function createImageColSizeField(options = {}) {
20438
- const {
20439
- id = "imageColSize",
20440
- label = "Image column size",
20441
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
20442
- defaultValue = "1/3",
20443
- uiIntent = "display",
20444
- visibleWhen
20445
- } = options;
20446
- return {
20447
- id,
20448
- type: "select",
20449
- label,
20450
- description,
20451
- required: false,
20452
- defaultValue,
20453
- multiple: false,
20454
- options: [
20455
- { value: "1/4", label: "Small (1/4)" },
20456
- { value: "1/3", label: "Medium (1/3)" },
20457
- { value: "2/5", label: "Large (2/5)" },
20458
- { value: "1/2", label: "Extra large (1/2)" },
20459
- { value: "2/3", label: "Huge (2/3)" }
20460
- ],
20461
- ui: {
20462
- intent: uiIntent,
20463
- ...visibleWhen ? { visibleWhen } : {}
20464
- }
20465
- };
20466
- }
20467
- function createImagePositionField(options = {}) {
20468
- const {
20469
- id = "imagePosition",
20470
- label = "Image position",
20471
- description = "Choose which side the image appears on.",
20472
- defaultValue = "left",
20473
- includeAlternate = false,
20474
- uiIntent = "display",
20475
- visibleWhen
20476
- } = options;
20477
- const positionOptions = [
20478
- { value: "left", label: "Left" },
20479
- { value: "right", label: "Right" },
20480
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
20481
- ];
20482
- return {
20483
- id,
20484
- type: "select",
20485
- label,
20486
- description,
20487
- required: false,
20488
- defaultValue,
20489
- multiple: false,
20490
- // Spread to get a mutable array type without unsafe casts.
20491
- options: [...positionOptions],
20492
- ui: {
20493
- intent: uiIntent,
20494
- ...visibleWhen ? { visibleWhen } : {}
20495
- }
20496
- };
20497
- }
20498
-
20499
22278
  // ../blocks/src/system/blocks/media-text.ts
20500
22279
  var mediaTextFrameCapability = defineFrameCapability([
20501
22280
  "plain",
@@ -20619,26 +22398,13 @@ var mediaTextManifest = createBlockManifest({
20619
22398
  },
20620
22399
  ui: { intent: "behavior" }
20621
22400
  }),
20622
- {
22401
+ createAspectRatioField({
20623
22402
  id: "aspectRatio",
20624
- type: "select",
20625
22403
  label: "Media aspect ratio",
20626
22404
  description: "Crop media to a consistent aspect ratio.",
20627
- required: false,
20628
22405
  defaultValue: "auto",
20629
- multiple: false,
20630
- options: [
20631
- { value: "auto", label: "Auto (original)" },
20632
- { value: "16/9", label: "16:9 (Landscape)" },
20633
- { value: "4/3", label: "4:3 (Standard)" },
20634
- { value: "1/1", label: "1:1 (Square)" },
20635
- { value: "3/4", label: "3:4 (Portrait)" }
20636
- ],
20637
- ui: {
20638
- intent: "display",
20639
- visibleWhen: { field: "images", notEquals: null }
20640
- }
20641
- },
22406
+ visibleWhen: { field: "images", notEquals: null }
22407
+ }),
20642
22408
  {
20643
22409
  id: "text",
20644
22410
  type: "richText",
@@ -20768,7 +22534,7 @@ var mediaTextManifest = createBlockManifest({
20768
22534
  whenImagesLength(0)
20769
22535
  );
20770
22536
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
20771
- const defaultLayout = styledSection({
22537
+ const defaultLayout2 = styledSection({
20772
22538
  children: styledContainer({
20773
22539
  rootType: "stack",
20774
22540
  rootProps: { gap: "lg" },
@@ -20800,9 +22566,9 @@ var mediaTextManifest = createBlockManifest({
20800
22566
  spacing: "medium"
20801
22567
  });
20802
22568
  return {
20803
- layout: defaultLayout,
22569
+ layout: defaultLayout2,
20804
22570
  variants: {
20805
- default: defaultLayout
22571
+ default: defaultLayout2
20806
22572
  },
20807
22573
  defaultVariant: "default",
20808
22574
  variantOptions: {
@@ -24202,7 +25968,7 @@ var embedBlockDefinition = {
24202
25968
  };
24203
25969
 
24204
25970
  // ../blocks/src/system/blocks/image-gallery.ts
24205
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
25971
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24206
25972
  var galleryContainer = (children, opts) => {
24207
25973
  const gap = opts?.gap ?? "md";
24208
25974
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -24282,7 +26048,7 @@ var galleryItem = (options) => stack(
24282
26048
  ],
24283
26049
  repeat("content.images", "item")
24284
26050
  );
24285
- var gridLayout3 = grid3(
26051
+ var gridLayout3 = grid4(
24286
26052
  {
24287
26053
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
24288
26054
  },
@@ -24885,7 +26651,7 @@ var imageGalleryBlockDefinition = {
24885
26651
  };
24886
26652
 
24887
26653
  // ../blocks/src/system/blocks/video-grid.ts
24888
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
26654
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24889
26655
  var videoItem = (options) => stack(
24890
26656
  { gap: "xs", className: options.containerClassName },
24891
26657
  [
@@ -24935,7 +26701,7 @@ var gridColumnsClass = (columns) => {
24935
26701
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
24936
26702
  }
24937
26703
  };
24938
- var createGridLayout = (columns) => grid4(
26704
+ var createGridLayout = (columns) => grid5(
24939
26705
  {
24940
26706
  className: gridColumnsClass(columns)
24941
26707
  },
@@ -28099,6 +29865,40 @@ var systemBlockDefinitionsRaw = [
28099
29865
  })
28100
29866
  ]
28101
29867
  })),
29868
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
29869
+ sectionSurfaces: "supported",
29870
+ contentFrames: ["plain", "panel"],
29871
+ itemSurfaces: "unsupported",
29872
+ headingDecorations: ["organic-squiggle"]
29873
+ }), defineBlockDesignMetadata({
29874
+ flow: bodyFlow,
29875
+ layoutProfiles: [
29876
+ layoutProfile({
29877
+ variantKey: "centered-copy",
29878
+ family: "centered",
29879
+ weight: "featured",
29880
+ bias: "soft"
29881
+ }),
29882
+ layoutProfile({
29883
+ variantKey: "statement-copy",
29884
+ family: "split",
29885
+ weight: "featured",
29886
+ bias: "merge"
29887
+ }),
29888
+ layoutProfile({
29889
+ variantKey: "statement-media",
29890
+ family: "media-text",
29891
+ weight: "featured",
29892
+ bias: "soft"
29893
+ }),
29894
+ layoutProfile({
29895
+ variantKey: "media-copy",
29896
+ family: "media-text",
29897
+ weight: "featured",
29898
+ bias: "soft"
29899
+ })
29900
+ ]
29901
+ })),
28102
29902
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
28103
29903
  flow: bodyFlow,
28104
29904
  layoutProfiles: [
@@ -28159,9 +29959,17 @@ var systemBlockDefinitionsRaw = [
28159
29959
  flow: conversionFlow,
28160
29960
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
28161
29961
  })),
28162
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
29962
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
29963
+ sectionSurfaces: "supported",
29964
+ contentFrames: ["plain", "panel"],
29965
+ itemSurfaces: "supported",
29966
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
29967
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
28163
29968
  flow: bodyFlow,
28164
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29969
+ layoutProfiles: [
29970
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29971
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
29972
+ ]
28165
29973
  })),
28166
29974
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
28167
29975
  flow: siteChromeFlow,
@@ -28175,7 +29983,8 @@ var systemBlockDefinitionsRaw = [
28175
29983
  sectionSurfaces: "supported",
28176
29984
  contentFrames: ["plain", "panel"],
28177
29985
  itemSurfaces: "supported",
28178
- testimonialCardTreatments: ["default", "accent-quote"]
29986
+ testimonialCardTreatments: ["default", "accent-quote"],
29987
+ headingDecorations: ["short-center-rule"]
28179
29988
  }), defineBlockDesignMetadata({
28180
29989
  flow: proofFlow,
28181
29990
  layoutProfiles: [
@@ -28201,6 +30010,22 @@ var systemBlockDefinitionsRaw = [
28201
30010
  flow: offeringsFlow,
28202
30011
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
28203
30012
  })),
30013
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
30014
+ sectionSurfaces: "supported",
30015
+ contentFrames: ["plain", "panel"],
30016
+ itemSurfaces: "supported",
30017
+ headingDecorations: ["short-center-rule"]
30018
+ }), defineBlockDesignMetadata({
30019
+ flow: offeringsFlow,
30020
+ layoutProfiles: [
30021
+ layoutProfile({
30022
+ variantKey: "cards",
30023
+ family: "grid",
30024
+ weight: "standard",
30025
+ bias: "soft"
30026
+ })
30027
+ ]
30028
+ })),
28204
30029
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
28205
30030
  flow: mediaFlow,
28206
30031
  layoutProfiles: [
@@ -31812,8 +33637,10 @@ import { z as z66 } from "zod";
31812
33637
  var SYSTEM_BLOCK_KINDS = [
31813
33638
  // Layout blocks
31814
33639
  "block.hero",
33640
+ "block.intro",
31815
33641
  "block.columns",
31816
33642
  "block.collection",
33643
+ "block.feature-cards",
31817
33644
  "block.media-text",
31818
33645
  "block.cta-full",
31819
33646
  "block.single-button",