@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
@@ -6614,6 +6614,7 @@ var ALLOWED_TRANSFORM_IDS = [
6614
6614
  "layout.headerRootClass",
6615
6615
  "layout.footerRootClass",
6616
6616
  "layout.headerRootStyle",
6617
+ "layout.headerSectionBackground",
6617
6618
  "layout.footerRootStyle",
6618
6619
  // UI (ui.ts)
6619
6620
  "ui.headerNavLinkClass",
@@ -7562,6 +7563,47 @@ var eyebrowTreatmentValues = [
7562
7563
  "pill-bounce",
7563
7564
  "accent-pill-bounce"
7564
7565
  ];
7566
+ var visibleHeadingDecorationFamilyValues = [
7567
+ "organic-squiggle",
7568
+ "short-center-rule"
7569
+ ];
7570
+ var visibleHeadingDecorationPlacementValues = [
7571
+ "after-heading",
7572
+ "between-heading-and-body",
7573
+ "under-centered-heading"
7574
+ ];
7575
+ var headingDecorationOverrideValues = [
7576
+ "site-default",
7577
+ "on",
7578
+ "off"
7579
+ ];
7580
+ var headingDecorationColorTokenValues = [
7581
+ "text",
7582
+ "primary",
7583
+ "secondary",
7584
+ "accent",
7585
+ "border",
7586
+ "muted"
7587
+ ];
7588
+ var accordionIconSetValues = [
7589
+ "plus",
7590
+ "chevron",
7591
+ "caret",
7592
+ "minimal-cross"
7593
+ ];
7594
+ var accordionIconColorTokenValues = [
7595
+ "text",
7596
+ "muted",
7597
+ "primary",
7598
+ "secondary",
7599
+ "accent",
7600
+ "current"
7601
+ ];
7602
+ var accordionIconMotionValues = [
7603
+ "none",
7604
+ "rotate",
7605
+ "swap"
7606
+ ];
7565
7607
  function defineBlockDesignCapability(capability) {
7566
7608
  return {
7567
7609
  ...capability,
@@ -7571,7 +7613,9 @@ function defineBlockDesignCapability(capability) {
7571
7613
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7572
7614
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7573
7615
  tileTreatments: capability.tileTreatments ?? ["default"],
7574
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7616
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7617
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7618
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
7575
7619
  };
7576
7620
  }
7577
7621
 
@@ -7762,6 +7806,25 @@ var blockAppearancePresets = [
7762
7806
  emphasis: "high"
7763
7807
  }
7764
7808
  }),
7809
+ defineBlockAppearancePreset({
7810
+ kind: "block-design",
7811
+ id: "intro-soft-earth-statement",
7812
+ target: "intro",
7813
+ label: "Soft Earth intro statement",
7814
+ blockKinds: ["block.intro"],
7815
+ design: {
7816
+ sectionSurface: "base",
7817
+ contentFrame: plainFrame,
7818
+ itemSurface: "none",
7819
+ transitionAfter: "soft-fade-short",
7820
+ emphasis: "high",
7821
+ headingDecoration: {
7822
+ family: "organic-squiggle",
7823
+ placement: "after-heading",
7824
+ colorToken: "primary"
7825
+ }
7826
+ }
7827
+ }),
7765
7828
  defineBlockAppearancePreset({
7766
7829
  kind: "block-design",
7767
7830
  id: "offerings-calm-list",
@@ -7776,6 +7839,25 @@ var blockAppearancePresets = [
7776
7839
  emphasis: "medium"
7777
7840
  }
7778
7841
  }),
7842
+ defineBlockAppearancePreset({
7843
+ kind: "block-design",
7844
+ id: "feature-cards-soft-earth-offerings",
7845
+ target: "feature-cards",
7846
+ label: "Soft Earth offering cards",
7847
+ blockKinds: ["block.feature-cards"],
7848
+ design: {
7849
+ sectionSurface: "base",
7850
+ contentFrame: plainFrame,
7851
+ itemSurface: "raised",
7852
+ transitionAfter: "none",
7853
+ emphasis: "high",
7854
+ headingDecoration: {
7855
+ family: "short-center-rule",
7856
+ placement: "under-centered-heading",
7857
+ colorToken: "primary"
7858
+ }
7859
+ }
7860
+ }),
7779
7861
  defineBlockAppearancePreset({
7780
7862
  kind: "block-design",
7781
7863
  id: "events-base-calendar",
@@ -7904,6 +7986,26 @@ var blockAppearancePresets = [
7904
7986
  testimonialCardTreatment: "accent-quote"
7905
7987
  }
7906
7988
  }),
7989
+ defineBlockAppearancePreset({
7990
+ kind: "block-design",
7991
+ id: "testimonials-soft-earth-proof-band",
7992
+ target: "testimonials",
7993
+ label: "Soft Earth proof band",
7994
+ blockKinds: ["block.testimonials"],
7995
+ design: {
7996
+ sectionSurface: "brand-depth-band",
7997
+ contentFrame: plainFrame,
7998
+ itemSurface: "none",
7999
+ transitionAfter: "soft-fade-short",
8000
+ emphasis: "high",
8001
+ testimonialCardTreatment: "accent-quote",
8002
+ headingDecoration: {
8003
+ family: "short-center-rule",
8004
+ placement: "under-centered-heading",
8005
+ colorToken: "border"
8006
+ }
8007
+ }
8008
+ }),
7907
8009
  defineBlockAppearancePreset({
7908
8010
  kind: "block-design",
7909
8011
  id: "faq-base-accordion",
@@ -7932,6 +8034,25 @@ var blockAppearancePresets = [
7932
8034
  emphasis: "low"
7933
8035
  }
7934
8036
  }),
8037
+ defineBlockAppearancePreset({
8038
+ kind: "block-design",
8039
+ id: "faq-soft-earth-two-column",
8040
+ target: "faq",
8041
+ label: "Soft Earth two-column FAQ",
8042
+ blockKinds: ["block.faq"],
8043
+ design: {
8044
+ sectionSurface: "base",
8045
+ contentFrame: plainFrame,
8046
+ itemSurface: "flat",
8047
+ transitionAfter: "none",
8048
+ emphasis: "medium",
8049
+ accordionIconTreatment: {
8050
+ iconSet: "plus",
8051
+ colorToken: "primary",
8052
+ motion: "swap"
8053
+ }
8054
+ }
8055
+ }),
7935
8056
  defineBlockAppearancePreset({
7936
8057
  kind: "block-design",
7937
8058
  id: "contact-form-panel",
@@ -8617,6 +8738,97 @@ var confidentChip = defineButtonPersonality({
8617
8738
  }
8618
8739
  });
8619
8740
 
8741
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
8742
+ var earthPill = defineButtonPersonality({
8743
+ id: "earth-pill",
8744
+ name: "Earth Pill",
8745
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
8746
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
8747
+ buttonSystem: {
8748
+ global: {
8749
+ cornerStyle: "pill",
8750
+ shadow: "low",
8751
+ textTransform: "none",
8752
+ fontWeight: 500,
8753
+ borderWidth: 1,
8754
+ hoverTransform: "lift",
8755
+ hoverColor: "none",
8756
+ typography: "body",
8757
+ paddingPreset: "default"
8758
+ },
8759
+ sizes: {
8760
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
8761
+ md: { padding: "0.625rem 1.35rem" },
8762
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
8763
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
8764
+ },
8765
+ variants: [
8766
+ {
8767
+ id: "primary",
8768
+ name: "Primary",
8769
+ enabled: true,
8770
+ priority: 1,
8771
+ background: { type: "solid", colorToken: "primary" },
8772
+ textColorToken: "primaryForeground",
8773
+ borderRadius: "rounded-full",
8774
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8775
+ effects: {
8776
+ hover: [
8777
+ { effectId: "lift", options: { translateY: "-1px" } },
8778
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
8779
+ ],
8780
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8781
+ }
8782
+ },
8783
+ {
8784
+ id: "secondary",
8785
+ name: "Secondary",
8786
+ enabled: true,
8787
+ priority: 2,
8788
+ background: { type: "transparent" },
8789
+ textColorToken: "primary",
8790
+ borderRadius: "rounded-full",
8791
+ border: { widthClass: "border", colorToken: "primary" },
8792
+ effects: {
8793
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
8794
+ }
8795
+ },
8796
+ {
8797
+ id: "outline",
8798
+ name: "Outline",
8799
+ enabled: true,
8800
+ priority: 3,
8801
+ background: { type: "transparent" },
8802
+ textColorToken: "text",
8803
+ borderRadius: "rounded-full",
8804
+ border: { widthClass: "border", colorToken: "border" },
8805
+ effects: {
8806
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
8807
+ }
8808
+ },
8809
+ {
8810
+ id: "ghost",
8811
+ name: "Ghost",
8812
+ enabled: true,
8813
+ priority: 3,
8814
+ background: { type: "transparent" },
8815
+ textColorToken: "primary",
8816
+ borderRadius: "rounded-full",
8817
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8818
+ sizes: {
8819
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
8820
+ md: { padding: "0.375rem 0" },
8821
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
8822
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
8823
+ },
8824
+ effects: {
8825
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
8826
+ }
8827
+ }
8828
+ ]
8829
+ }
8830
+ });
8831
+
8620
8832
  // ../theme-core/src/buttons/personalities/editorial-link.ts
8621
8833
  var editorialLink = defineButtonPersonality({
8622
8834
  id: "editorial-link",
@@ -9075,6 +9287,7 @@ var softPill = defineButtonPersonality({
9075
9287
  // ../theme-core/src/buttons/personalities/index.ts
9076
9288
  var buttonPersonalities = [
9077
9289
  softPill,
9290
+ earthPill,
9078
9291
  confidentChip,
9079
9292
  editorialLink,
9080
9293
  pebble,
@@ -9716,8 +9929,19 @@ var headingTypographyStyleSchema = typographyStyleSchema.extend({
9716
9929
  colorToken: themeColorTokenSchema.nullable().optional()
9717
9930
  });
9718
9931
  var proseLinkUnderlineStyleSchema = z21.enum(["solid", "dotted", "dashed"]);
9719
- var proseLinkUnderlineThicknessSchema = z21.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9720
- var proseLinkUnderlineOffsetSchema = z21.enum(["auto", "tight", "normal", "loose"]);
9932
+ var proseLinkUnderlineThicknessSchema = z21.enum([
9933
+ "auto",
9934
+ "fromFont",
9935
+ "thin",
9936
+ "medium",
9937
+ "thick"
9938
+ ]);
9939
+ var proseLinkUnderlineOffsetSchema = z21.enum([
9940
+ "auto",
9941
+ "tight",
9942
+ "normal",
9943
+ "loose"
9944
+ ]);
9721
9945
  var proseLinkStyleSchema = z21.object({
9722
9946
  colorToken: themeColorTokenSchema.optional(),
9723
9947
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -9728,7 +9952,14 @@ var proseLinkStyleSchema = z21.object({
9728
9952
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9729
9953
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9730
9954
  });
9731
- var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9955
+ var semanticSpacingSchema = z21.enum([
9956
+ "none",
9957
+ "compact",
9958
+ "cozy",
9959
+ "medium",
9960
+ "comfortable",
9961
+ "spacious"
9962
+ ]);
9732
9963
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9733
9964
  var boxBackgroundOverlaySchema = z21.object({
9734
9965
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9750,12 +9981,36 @@ var boxBackgroundSchema = z21.object({
9750
9981
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
9751
9982
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
9752
9983
  });
9984
+ var noHeadingDecorationSchema = z21.object({
9985
+ family: z21.literal("none"),
9986
+ placement: z21.literal("none")
9987
+ });
9988
+ var visibleHeadingDecorationSchema = z21.object({
9989
+ family: z21.enum(visibleHeadingDecorationFamilyValues),
9990
+ placement: z21.enum(visibleHeadingDecorationPlacementValues),
9991
+ colorToken: z21.enum(headingDecorationColorTokenValues).optional()
9992
+ });
9993
+ var headingDecorationSchema = z21.union([
9994
+ noHeadingDecorationSchema,
9995
+ visibleHeadingDecorationSchema
9996
+ ]);
9997
+ var accordionIconTreatmentSchema = z21.object({
9998
+ iconSet: z21.enum(accordionIconSetValues),
9999
+ colorToken: z21.enum(accordionIconColorTokenValues),
10000
+ openColorToken: z21.enum(accordionIconColorTokenValues).optional(),
10001
+ motion: z21.enum(accordionIconMotionValues)
10002
+ });
9753
10003
  var sectionStylesOverrideSchema = z21.object({
9754
10004
  background: boxBackgroundSchema.nullable().optional(),
9755
10005
  spacing: semanticSpacingSchema.nullable().optional(),
9756
10006
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
9757
10007
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
9758
- eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional()
10008
+ eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
10009
+ headingDecoration: headingDecorationSchema.nullable().optional(),
10010
+ // Author-level override consumed by later block/editor rendering phases.
10011
+ // Keeping it in section styles lets existing block save APIs persist it.
10012
+ headingDecorationOverride: z21.enum(headingDecorationOverrideValues).nullable().optional(),
10013
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
9759
10014
  });
9760
10015
  var containerStylesOverrideSchema = z21.object({
9761
10016
  background: boxBackgroundSchema.nullable().optional(),
@@ -9848,9 +10103,17 @@ var inputStyle = z21.object({
9848
10103
  focus: z21.enum(["glow", "ring", "underline"]),
9849
10104
  label: z21.enum(["inside", "above"])
9850
10105
  });
9851
- var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
10106
+ var headerVariant = z21.enum(["classic", "centered", "transparent", "floating"]);
9852
10107
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9853
- var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
10108
+ var headerNavStyle = z21.enum([
10109
+ "minimal",
10110
+ "underline",
10111
+ "underline-grow",
10112
+ "capsule",
10113
+ "scale",
10114
+ "frosted",
10115
+ "solid"
10116
+ ]);
9854
10117
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9855
10118
  var headerMaxWidth = z21.enum(["container", "full"]);
9856
10119
  var headerContainerSchema = z21.object({
@@ -9898,8 +10161,22 @@ var dropdownStyleSchema = z21.object({
9898
10161
  textSize: z21.enum(["xs", "sm", "base", "lg"]).optional()
9899
10162
  // optional = no override (browser default)
9900
10163
  }).optional();
9901
- var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9902
- var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
10164
+ var headerCtaGapSchema = z21.enum([
10165
+ "none",
10166
+ "tight",
10167
+ "compact",
10168
+ "default",
10169
+ "relaxed",
10170
+ "spacious"
10171
+ ]);
10172
+ var headerCtaTreatmentSchema = z21.enum([
10173
+ "default",
10174
+ "primary",
10175
+ "secondary",
10176
+ "inverted",
10177
+ "outline",
10178
+ "ghost"
10179
+ ]);
9903
10180
  var navContainerSchema = z21.object({
9904
10181
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9905
10182
  tint: z21.string().nullable().optional(),
@@ -9954,7 +10231,14 @@ var footerMaxWidth = z21.enum(["container", "full"]);
9954
10231
  var footerMode = z21.enum(["default", "blocks", "default+blocks", "none"]);
9955
10232
  var footerNavLayoutMode = z21.enum(["stack", "inline", "inline-wrap"]);
9956
10233
  var footerNavLayoutAlign = z21.enum(["start", "center", "end", "space-between"]);
9957
- var footerSpacing = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10234
+ var footerSpacing = z21.enum([
10235
+ "none",
10236
+ "tight",
10237
+ "compact",
10238
+ "default",
10239
+ "relaxed",
10240
+ "spacious"
10241
+ ]);
9958
10242
  var footerLogoPlacement = z21.enum(["left", "right", "above", "below"]);
9959
10243
  var footerLogoSize = z21.enum(["sm", "md", "lg", "xl"]);
9960
10244
  var footerLogoMaxHeight = z21.enum(["sm", "md", "lg", "xl"]);
@@ -10019,7 +10303,12 @@ var footerSchema = z21.object({
10019
10303
  logo: footerLogoSchema.optional(),
10020
10304
  bottomBar: footerBottomBarSchema.optional()
10021
10305
  });
10022
- var containerPaddingPresetSchema = z21.enum(["tight", "compact", "default", "relaxed"]);
10306
+ var containerPaddingPresetSchema = z21.enum([
10307
+ "tight",
10308
+ "compact",
10309
+ "default",
10310
+ "relaxed"
10311
+ ]);
10023
10312
  var layoutSchema = z21.object({
10024
10313
  containerPadding: z21.object({
10025
10314
  mobile: containerPaddingPresetSchema.optional(),
@@ -10027,8 +10316,24 @@ var layoutSchema = z21.object({
10027
10316
  desktop: containerPaddingPresetSchema.optional()
10028
10317
  }).optional()
10029
10318
  }).optional();
10030
- var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
10031
- var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
10319
+ var heroTypographySizeSchema = z21.enum([
10320
+ "sm",
10321
+ "base",
10322
+ "lg",
10323
+ "xl",
10324
+ "2xl",
10325
+ "3xl",
10326
+ "4xl",
10327
+ "5xl",
10328
+ "6xl",
10329
+ "editorial"
10330
+ ]);
10331
+ var heroTypographyLineHeightSchema = z21.enum([
10332
+ "tight",
10333
+ "snug",
10334
+ "normal",
10335
+ "relaxed"
10336
+ ]);
10032
10337
  var heroResponsiveTypographySchema = z21.object({
10033
10338
  headlineSize: heroTypographySizeSchema.optional(),
10034
10339
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -10463,6 +10768,28 @@ var warmNeutralCream = definePaletteVariant({
10463
10768
  { name: "border", hex: "#e0d2b8" }
10464
10769
  ]
10465
10770
  });
10771
+ var warmNeutralSoftEarth = definePaletteVariant({
10772
+ id: "warm-neutral-soft-earth",
10773
+ name: "Warm Neutral \u2014 Soft Earth",
10774
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
10775
+ tags: { tone: "classic", energy: "calm", era: "organic" },
10776
+ mode: "light",
10777
+ colors: [
10778
+ { name: "primary", hex: "#a8573d" },
10779
+ { name: "secondary", hex: "#72765c" },
10780
+ { name: "accent", hex: "#c87557" },
10781
+ { name: "success", hex: "#687854" },
10782
+ { name: "warning", hex: "#b7863e" },
10783
+ { name: "destructive", hex: "#a54b3c" },
10784
+ { name: "background", hex: "#fbf6eb" },
10785
+ { name: "surface", hex: "#fffdf7" },
10786
+ { name: "surfaceAlt", hex: "#f0e4d3" },
10787
+ { name: "muted", hex: "#eadbc6" },
10788
+ { name: "text", hex: "#30281f" },
10789
+ { name: "primaryForeground", hex: "#fffaf3" },
10790
+ { name: "border", hex: "#d9c8b2" }
10791
+ ]
10792
+ });
10466
10793
  var warmNeutralForest = definePaletteVariant({
10467
10794
  id: "warm-neutral-forest",
10468
10795
  name: "Warm Neutral \u2014 Forest",
@@ -10496,6 +10823,7 @@ var paletteVariants = [
10496
10823
  // Warm-neutral family
10497
10824
  warmNeutralClay,
10498
10825
  warmNeutralCream,
10826
+ warmNeutralSoftEarth,
10499
10827
  warmNeutralForest,
10500
10828
  // High-contrast family
10501
10829
  highContrastInk,
@@ -10514,6 +10842,12 @@ var paletteVariantsById = new Map(
10514
10842
  function asHeaderLookId(value) {
10515
10843
  return value;
10516
10844
  }
10845
+ function asHeaderLayoutId(value) {
10846
+ return value;
10847
+ }
10848
+ function asHeaderStyleId(value) {
10849
+ return value;
10850
+ }
10517
10851
  function baseHeader(theme) {
10518
10852
  const {
10519
10853
  navLinkStyle: _navLinkStyle,
@@ -10532,67 +10866,427 @@ function baseHeader(theme) {
10532
10866
  navContainer: { type: "none", tint: null, opacity: 0.15 }
10533
10867
  };
10534
10868
  }
10535
- function solidBrandHeader(theme) {
10536
- const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
10537
- return {
10538
- ...baseHeader(theme),
10869
+ var headerLayoutCatalog = [
10870
+ {
10871
+ id: asHeaderLayoutId("classic"),
10872
+ label: "Classic",
10873
+ description: "Logo and navigation in one practical horizontal row.",
10874
+ structure: "inline-classic",
10539
10875
  variant: "classic",
10540
- positioning: "sticky",
10876
+ defaultPositioning: "sticky",
10877
+ shrinkOnScroll: false
10878
+ },
10879
+ {
10880
+ id: asHeaderLayoutId("centered"),
10881
+ label: "Centered",
10882
+ description: "Logo centered above a balanced navigation row.",
10883
+ structure: "centered-stack",
10884
+ variant: "centered",
10885
+ defaultPositioning: "static",
10886
+ shrinkOnScroll: false,
10887
+ maxRecommendedNavItems: 5,
10888
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
10889
+ },
10890
+ {
10891
+ id: asHeaderLayoutId("floating"),
10892
+ label: "Floating",
10893
+ description: "Detached header chrome that sits over the opening section.",
10894
+ structure: "floating-shell",
10895
+ variant: "floating",
10896
+ defaultPositioning: "fixed",
10541
10897
  shrinkOnScroll: true,
10542
- background: {
10543
- type: "color",
10544
- color: "primary"
10545
- },
10546
- textColor: "primaryForeground",
10547
- navColor: "primaryForeground",
10548
- navStyle: "underline-grow",
10549
- navWeight: "bold",
10550
- navLinkStyle: {
10551
- typography: "body",
10552
- fontWeight: "bold",
10553
- textTransform: "uppercase",
10554
- italic: false,
10555
- colorToken: "primaryForeground",
10556
- hoverColorToken: "secondary",
10557
- textSize: "sm",
10558
- letterSpacing: "wider",
10559
- padding: "compact",
10560
- paddingX: "compact",
10561
- borderRadius: "none",
10562
- effects: {
10563
- hover: [
10564
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
10565
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
10566
- ]
10567
- }
10568
- },
10569
- dropdownStyle: {
10570
- background: "primary-700",
10571
- textColor: "primaryForeground",
10572
- borderColor: null,
10573
- shadow: "md",
10574
- borderRadius: "md",
10575
- hoverBackground: "primary-900",
10576
- hoverTextColor: "secondary",
10577
- textTransform: "uppercase",
10578
- letterSpacing: "wider",
10579
- fontWeight: "bold",
10580
- textSize: "sm"
10581
- },
10582
- border: {
10583
- style: "solid",
10584
- width: "none",
10585
- position: "none"
10586
- },
10587
- logoText: {
10588
- hideOnShrink: true,
10589
- mobileMaxWidth: "sm",
10590
- mobileWrapLines: 2
10591
- },
10592
- ctaGap: "compact",
10593
- ctaTreatment: "inverted",
10594
- ...ctaVariant ? { ctaVariant } : {}
10595
- };
10898
+ maxRecommendedNavItems: 5,
10899
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
10900
+ }
10901
+ ];
10902
+ function supportedLayouts(ids) {
10903
+ return ids.map(asHeaderLayoutId);
10904
+ }
10905
+ var headerStyleCatalog = [
10906
+ {
10907
+ id: asHeaderStyleId("minimal"),
10908
+ label: "Minimal",
10909
+ description: "Quiet surface with simple color-change navigation.",
10910
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10911
+ navInteraction: "color-change",
10912
+ surface: "neutral",
10913
+ navTypography: "plain"
10914
+ },
10915
+ {
10916
+ id: asHeaderStyleId("fine-line"),
10917
+ label: "Fine Line",
10918
+ description: "Light surface with a crisp lower rule and underline hover.",
10919
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10920
+ navInteraction: "underline-grow",
10921
+ surface: "bordered",
10922
+ navTypography: "plain"
10923
+ },
10924
+ {
10925
+ id: asHeaderStyleId("soft-bar"),
10926
+ label: "Soft Bar",
10927
+ description: "Soft tinted surface with gentle pill hover states.",
10928
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10929
+ navInteraction: "pill-background",
10930
+ surface: "soft",
10931
+ navTypography: "plain"
10932
+ },
10933
+ {
10934
+ id: asHeaderStyleId("pill-nav"),
10935
+ label: "Pill Nav",
10936
+ description: "A calm pill navigation rail over a neutral header.",
10937
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10938
+ navInteraction: "pill-background",
10939
+ surface: "soft",
10940
+ navTypography: "plain"
10941
+ },
10942
+ {
10943
+ id: asHeaderStyleId("brand-bar"),
10944
+ label: "Brand Bar",
10945
+ description: "Solid brand surface with high-contrast navigation.",
10946
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10947
+ navInteraction: "color-change",
10948
+ surface: "brand-solid",
10949
+ navTypography: "brand-caps"
10950
+ },
10951
+ {
10952
+ id: asHeaderStyleId("brand-underline"),
10953
+ label: "Brand Underline",
10954
+ description: "Brand surface with underline-grow navigation.",
10955
+ supportedLayoutIds: supportedLayouts(["classic"]),
10956
+ navInteraction: "underline-grow",
10957
+ surface: "brand-solid",
10958
+ navTypography: "brand-caps"
10959
+ },
10960
+ {
10961
+ id: asHeaderStyleId("brand-pill"),
10962
+ label: "Brand Pill",
10963
+ description: "Solid brand surface with rounded active and hover states.",
10964
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
10965
+ navInteraction: "pill-background",
10966
+ surface: "brand-solid",
10967
+ navTypography: "brand-caps"
10968
+ },
10969
+ {
10970
+ id: asHeaderStyleId("serif-line"),
10971
+ label: "Serif Line",
10972
+ description: "Typographic logo treatment with understated underline navigation.",
10973
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10974
+ navInteraction: "underline-grow",
10975
+ surface: "bordered",
10976
+ navTypography: "heading"
10977
+ },
10978
+ {
10979
+ id: asHeaderStyleId("flat-tabs"),
10980
+ label: "Flat Tabs",
10981
+ description: "Flat block hover and active states with a Swiss utility feel.",
10982
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10983
+ navInteraction: "flat-block",
10984
+ surface: "bordered",
10985
+ navTypography: "quiet-caps"
10986
+ },
10987
+ {
10988
+ id: asHeaderStyleId("glass"),
10989
+ label: "Glass",
10990
+ description: "Translucent chrome with frosted navigation backing.",
10991
+ supportedLayoutIds: supportedLayouts(["classic", "floating"]),
10992
+ navInteraction: "glass-backed",
10993
+ surface: "floating",
10994
+ navTypography: "plain"
10995
+ },
10996
+ {
10997
+ id: asHeaderStyleId("minimal-surface"),
10998
+ label: "Clear Split",
10999
+ description: "Floating logo with transparent navigation and no shared shell.",
11000
+ supportedLayoutIds: supportedLayouts(["floating"]),
11001
+ navInteraction: "color-change",
11002
+ surface: "floating",
11003
+ navTypography: "plain"
11004
+ },
11005
+ {
11006
+ id: asHeaderStyleId("soft-shell"),
11007
+ label: "Soft Shell",
11008
+ description: "Floating rounded shell with soft pill navigation states.",
11009
+ supportedLayoutIds: supportedLayouts(["floating"]),
11010
+ navInteraction: "pill-background",
11011
+ surface: "floating",
11012
+ navTypography: "plain"
11013
+ },
11014
+ {
11015
+ id: asHeaderStyleId("split-glass"),
11016
+ label: "Split Glass",
11017
+ description: "Logo floats independently while the navigation sits in a glass rail.",
11018
+ supportedLayoutIds: supportedLayouts(["floating"]),
11019
+ navInteraction: "glass-backed",
11020
+ surface: "floating",
11021
+ navTypography: "quiet-caps"
11022
+ },
11023
+ {
11024
+ id: asHeaderStyleId("split-pill"),
11025
+ label: "Split Pill",
11026
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
11027
+ supportedLayoutIds: supportedLayouts(["floating"]),
11028
+ navInteraction: "pill-background",
11029
+ surface: "floating",
11030
+ navTypography: "heading"
11031
+ }
11032
+ ];
11033
+ var headerLayoutsById = new Map(
11034
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
11035
+ );
11036
+ var headerStylesById = new Map(
11037
+ headerStyleCatalog.map((style) => [style.id, style])
11038
+ );
11039
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11040
+ [
11041
+ asHeaderLayoutId("classic"),
11042
+ headerStyleRepairChain([
11043
+ "minimal",
11044
+ "glass",
11045
+ "fine-line",
11046
+ "soft-bar",
11047
+ "pill-nav",
11048
+ "brand-bar",
11049
+ "brand-underline",
11050
+ "brand-pill",
11051
+ "serif-line",
11052
+ "flat-tabs"
11053
+ ])
11054
+ ],
11055
+ [
11056
+ asHeaderLayoutId("centered"),
11057
+ headerStyleRepairChain([
11058
+ "minimal",
11059
+ "fine-line",
11060
+ "soft-bar",
11061
+ "pill-nav",
11062
+ "brand-bar",
11063
+ "brand-pill",
11064
+ "serif-line",
11065
+ "flat-tabs"
11066
+ ])
11067
+ ],
11068
+ [
11069
+ asHeaderLayoutId("floating"),
11070
+ headerStyleRepairChain([
11071
+ "glass",
11072
+ "minimal-surface",
11073
+ "split-glass",
11074
+ "split-pill",
11075
+ "soft-shell",
11076
+ "brand-pill"
11077
+ ])
11078
+ ]
11079
+ ]);
11080
+ function headerStyleRepairChain(values) {
11081
+ return values.map(asHeaderStyleId);
11082
+ }
11083
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11084
+ [
11085
+ [
11086
+ asHeaderStyleId("brand-bar"),
11087
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
11088
+ ],
11089
+ [
11090
+ asHeaderStyleId("brand-underline"),
11091
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11092
+ ],
11093
+ [
11094
+ asHeaderStyleId("brand-pill"),
11095
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
11096
+ ],
11097
+ [
11098
+ asHeaderStyleId("pill-nav"),
11099
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
11100
+ ],
11101
+ [
11102
+ asHeaderStyleId("flat-tabs"),
11103
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
11104
+ ],
11105
+ [
11106
+ asHeaderStyleId("serif-line"),
11107
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11108
+ ],
11109
+ [
11110
+ asHeaderStyleId("glass"),
11111
+ headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
11112
+ ],
11113
+ [
11114
+ asHeaderStyleId("soft-shell"),
11115
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
11116
+ ],
11117
+ [
11118
+ asHeaderStyleId("minimal-surface"),
11119
+ headerStyleRepairChain(["minimal-surface", "minimal"])
11120
+ ],
11121
+ [
11122
+ asHeaderStyleId("split-glass"),
11123
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
11124
+ ],
11125
+ [
11126
+ asHeaderStyleId("split-pill"),
11127
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
11128
+ ],
11129
+ [
11130
+ asHeaderStyleId("fine-line"),
11131
+ headerStyleRepairChain(["fine-line", "minimal"])
11132
+ ],
11133
+ [
11134
+ asHeaderStyleId("soft-bar"),
11135
+ headerStyleRepairChain(["soft-bar", "minimal"])
11136
+ ],
11137
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
11138
+ ]
11139
+ );
11140
+ var legacyHeaderLookAliases = [
11141
+ {
11142
+ lookId: asHeaderLookId("clean-base"),
11143
+ selection: {
11144
+ layoutId: asHeaderLayoutId("classic"),
11145
+ styleId: asHeaderStyleId("minimal")
11146
+ }
11147
+ },
11148
+ {
11149
+ lookId: asHeaderLookId("brand-solid"),
11150
+ selection: {
11151
+ layoutId: asHeaderLayoutId("classic"),
11152
+ styleId: asHeaderStyleId("brand-bar")
11153
+ }
11154
+ },
11155
+ {
11156
+ lookId: asHeaderLookId("serif-line"),
11157
+ selection: {
11158
+ layoutId: asHeaderLayoutId("centered"),
11159
+ styleId: asHeaderStyleId("serif-line")
11160
+ }
11161
+ },
11162
+ {
11163
+ lookId: asHeaderLookId("centered-calm"),
11164
+ selection: {
11165
+ layoutId: asHeaderLayoutId("centered"),
11166
+ styleId: asHeaderStyleId("minimal")
11167
+ }
11168
+ },
11169
+ {
11170
+ lookId: asHeaderLookId("practical-utility"),
11171
+ selection: {
11172
+ layoutId: asHeaderLayoutId("classic"),
11173
+ styleId: asHeaderStyleId("flat-tabs")
11174
+ }
11175
+ },
11176
+ {
11177
+ lookId: asHeaderLookId("minimal-transparent"),
11178
+ selection: {
11179
+ layoutId: asHeaderLayoutId("classic"),
11180
+ styleId: asHeaderStyleId("minimal")
11181
+ }
11182
+ },
11183
+ {
11184
+ lookId: asHeaderLookId("transparent-overlay"),
11185
+ selection: {
11186
+ layoutId: asHeaderLayoutId("floating"),
11187
+ styleId: asHeaderStyleId("glass")
11188
+ }
11189
+ },
11190
+ {
11191
+ lookId: asHeaderLookId("floating-glass"),
11192
+ selection: {
11193
+ layoutId: asHeaderLayoutId("floating"),
11194
+ styleId: asHeaderStyleId("glass")
11195
+ }
11196
+ }
11197
+ ];
11198
+ var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
11199
+ function getHeaderStyle(id) {
11200
+ return headerStylesById.get(id) ?? null;
11201
+ }
11202
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
11203
+ return style.supportedLayoutIds.includes(layoutId);
11204
+ }
11205
+ function getHeaderStyleOrThrow(id) {
11206
+ const style = getHeaderStyle(id);
11207
+ if (!style) {
11208
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
11209
+ }
11210
+ return style;
11211
+ }
11212
+ function resolveLegacyHeaderLookAlias(lookId) {
11213
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
11214
+ }
11215
+ function getCompatibleHeaderStyleIds(layoutId) {
11216
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
11217
+ (styleId) => {
11218
+ const style = getHeaderStyleOrThrow(styleId);
11219
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
11220
+ }
11221
+ );
11222
+ }
11223
+ function solidBrandHeader(theme) {
11224
+ const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11225
+ return {
11226
+ ...baseHeader(theme),
11227
+ variant: "classic",
11228
+ positioning: "sticky",
11229
+ shrinkOnScroll: true,
11230
+ background: {
11231
+ type: "color",
11232
+ color: "primary"
11233
+ },
11234
+ textColor: "primaryForeground",
11235
+ navColor: "primaryForeground",
11236
+ navStyle: "underline-grow",
11237
+ navWeight: "bold",
11238
+ navLinkStyle: {
11239
+ typography: "body",
11240
+ fontWeight: "bold",
11241
+ textTransform: "uppercase",
11242
+ italic: false,
11243
+ colorToken: "primaryForeground",
11244
+ hoverColorToken: "secondary",
11245
+ textSize: "sm",
11246
+ letterSpacing: "wider",
11247
+ padding: "compact",
11248
+ paddingX: "compact",
11249
+ borderRadius: "none",
11250
+ effects: {
11251
+ hover: [
11252
+ {
11253
+ effectId: "text-color-change",
11254
+ options: { hoverColorToken: "secondary" }
11255
+ },
11256
+ {
11257
+ effectId: "nav-underline",
11258
+ options: { style: "grow", colorToken: "secondary" }
11259
+ }
11260
+ ]
11261
+ }
11262
+ },
11263
+ dropdownStyle: {
11264
+ background: "primary-700",
11265
+ textColor: "primaryForeground",
11266
+ borderColor: null,
11267
+ shadow: "md",
11268
+ borderRadius: "md",
11269
+ hoverBackground: "primary-900",
11270
+ hoverTextColor: "secondary",
11271
+ textTransform: "uppercase",
11272
+ letterSpacing: "wider",
11273
+ fontWeight: "bold",
11274
+ textSize: "sm"
11275
+ },
11276
+ border: {
11277
+ style: "solid",
11278
+ width: "none",
11279
+ position: "none"
11280
+ },
11281
+ logoText: {
11282
+ hideOnShrink: true,
11283
+ mobileMaxWidth: "sm",
11284
+ mobileWrapLines: 2
11285
+ },
11286
+ ctaGap: "compact",
11287
+ ctaTreatment: "inverted",
11288
+ ...ctaVariant ? { ctaVariant } : {}
11289
+ };
10596
11290
  }
10597
11291
  function cleanBaseHeader(theme) {
10598
11292
  return {
@@ -10618,10 +11312,10 @@ function cleanBaseHeader(theme) {
10618
11312
  ctaGap: "default"
10619
11313
  };
10620
11314
  }
10621
- function editorialLineHeader(theme) {
11315
+ function serifLineHeader(theme) {
10622
11316
  return {
10623
11317
  ...baseHeader(theme),
10624
- variant: "editorial",
11318
+ variant: "centered",
10625
11319
  positioning: "sticky",
10626
11320
  shrinkOnScroll: false,
10627
11321
  background: {
@@ -10768,6 +11462,11 @@ var headerLookCatalog = [
10768
11462
  label: "Clean base",
10769
11463
  visualTreatment: "solid-neutral",
10770
11464
  layoutBehavior: "sticky",
11465
+ configuration: {
11466
+ structure: "inline-classic",
11467
+ treatment: "solid-neutral",
11468
+ behavior: "sticky"
11469
+ },
10771
11470
  openingRequirement: "none",
10772
11471
  compile: cleanBaseHeader
10773
11472
  },
@@ -10776,23 +11475,38 @@ var headerLookCatalog = [
10776
11475
  label: "Brand solid",
10777
11476
  visualTreatment: "solid-brand",
10778
11477
  layoutBehavior: "sticky-shrink",
11478
+ configuration: {
11479
+ structure: "inline-classic",
11480
+ treatment: "solid-brand",
11481
+ behavior: "sticky-shrink"
11482
+ },
10779
11483
  openingRequirement: "none",
10780
11484
  compile: solidBrandHeader
10781
11485
  },
10782
11486
  {
10783
- id: asHeaderLookId("editorial-line"),
10784
- label: "Editorial line",
10785
- visualTreatment: "light-editorial",
11487
+ id: asHeaderLookId("serif-line"),
11488
+ label: "Serif line",
11489
+ visualTreatment: "light-serif",
10786
11490
  layoutBehavior: "sticky",
11491
+ configuration: {
11492
+ structure: "centered-stack",
11493
+ treatment: "light-serif",
11494
+ behavior: "sticky"
11495
+ },
10787
11496
  openingRequirement: "none",
10788
11497
  maxRecommendedNavItems: 6,
10789
- compile: editorialLineHeader
11498
+ compile: serifLineHeader
10790
11499
  },
10791
11500
  {
10792
11501
  id: asHeaderLookId("centered-calm"),
10793
11502
  label: "Centered calm",
10794
- visualTreatment: "light-editorial",
11503
+ visualTreatment: "light-serif",
10795
11504
  layoutBehavior: "normal-flow",
11505
+ configuration: {
11506
+ structure: "centered-stack",
11507
+ treatment: "light-serif",
11508
+ behavior: "normal-flow"
11509
+ },
10796
11510
  openingRequirement: "none",
10797
11511
  maxRecommendedNavItems: 5,
10798
11512
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -10803,6 +11517,11 @@ var headerLookCatalog = [
10803
11517
  label: "Practical utility",
10804
11518
  visualTreatment: "solid-neutral",
10805
11519
  layoutBehavior: "sticky-shrink",
11520
+ configuration: {
11521
+ structure: "inline-classic",
11522
+ treatment: "solid-neutral",
11523
+ behavior: "sticky-shrink"
11524
+ },
10806
11525
  openingRequirement: "none",
10807
11526
  requiresProminentCta: true,
10808
11527
  compile: practicalUtilityHeader
@@ -10812,6 +11531,11 @@ var headerLookCatalog = [
10812
11531
  label: "Minimal transparent",
10813
11532
  visualTreatment: "minimal-transparent",
10814
11533
  layoutBehavior: "normal-flow",
11534
+ configuration: {
11535
+ structure: "inline-classic",
11536
+ treatment: "minimal-transparent",
11537
+ behavior: "normal-flow"
11538
+ },
10815
11539
  openingRequirement: "reserved-space-ok",
10816
11540
  compile: minimalTransparentHeader
10817
11541
  },
@@ -10820,6 +11544,11 @@ var headerLookCatalog = [
10820
11544
  label: "Transparent overlay",
10821
11545
  visualTreatment: "transparent-overlay",
10822
11546
  layoutBehavior: "fixed-overlay",
11547
+ configuration: {
11548
+ structure: "inline-classic",
11549
+ treatment: "transparent-overlay",
11550
+ behavior: "fixed-overlay"
11551
+ },
10823
11552
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10824
11553
  maxRecommendedNavItems: 5,
10825
11554
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10830,6 +11559,11 @@ var headerLookCatalog = [
10830
11559
  label: "Floating glass",
10831
11560
  visualTreatment: "floating-glass",
10832
11561
  layoutBehavior: "fixed-floating",
11562
+ configuration: {
11563
+ structure: "floating-shell",
11564
+ treatment: "floating-glass",
11565
+ behavior: "fixed-floating"
11566
+ },
10833
11567
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10834
11568
  maxRecommendedNavItems: 5,
10835
11569
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10837,9 +11571,17 @@ var headerLookCatalog = [
10837
11571
  }
10838
11572
  ];
10839
11573
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
11574
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
11575
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
11576
+ var allowedHeaderConfigurationKeys = new Set(
11577
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
11578
+ );
10840
11579
  var headerLooksById = new Map(
10841
11580
  headerLookCatalog.map((look) => [look.id, look])
10842
11581
  );
11582
+ function headerConfigurationKey(configuration) {
11583
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
11584
+ }
10843
11585
 
10844
11586
  // ../theme-core/src/site-styles/footerLooks.ts
10845
11587
  function asFooterLookId(value) {
@@ -10972,6 +11714,264 @@ var advancedDesignOptionCatalog = {
10972
11714
  detachedCustom: true
10973
11715
  };
10974
11716
 
11717
+ // ../theme-core/src/site-styles/typographyPresets.ts
11718
+ var bodyReadablePolicy = {
11719
+ recommendedCategories: ["sans-serif", "serif"],
11720
+ allowedCategories: ["sans-serif", "serif"],
11721
+ requiresItalicForBody: true,
11722
+ requiresBoldForBody: true
11723
+ };
11724
+ var headingFlexiblePolicy = {
11725
+ recommendedCategories: ["sans-serif", "serif", "display"],
11726
+ allowedCategories: ["sans-serif", "serif", "display"]
11727
+ };
11728
+ var displayHeadingPolicy = {
11729
+ recommendedCategories: ["display", "sans-serif", "serif"],
11730
+ allowedCategories: ["display", "sans-serif", "serif"]
11731
+ };
11732
+ function asTypographyPresetId(value) {
11733
+ if (!value.startsWith("typography-preset:")) {
11734
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
11735
+ }
11736
+ return value;
11737
+ }
11738
+ function defineTypographyPreset(preset2) {
11739
+ return {
11740
+ ...preset2,
11741
+ id: asTypographyPresetId(preset2.id)
11742
+ };
11743
+ }
11744
+ var modernSansTypography = {
11745
+ body: {
11746
+ family: "Inter, system-ui, sans-serif",
11747
+ size: "md",
11748
+ weight: "regular",
11749
+ lineHeight: "relaxed",
11750
+ letterSpacing: "normal"
11751
+ },
11752
+ headings: {
11753
+ default: {
11754
+ family: "Inter, system-ui, sans-serif",
11755
+ weight: "semibold",
11756
+ lineHeight: "normal",
11757
+ letterSpacing: "tight",
11758
+ italic: null,
11759
+ case: null
11760
+ },
11761
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11762
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11763
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11764
+ },
11765
+ scale: "balanced"
11766
+ };
11767
+ var warmRoundedTypography = {
11768
+ body: {
11769
+ family: "Nunito Sans, system-ui, sans-serif",
11770
+ size: "lg",
11771
+ weight: "regular",
11772
+ lineHeight: "relaxed",
11773
+ letterSpacing: "normal"
11774
+ },
11775
+ headings: {
11776
+ default: {
11777
+ family: "Nunito Sans, system-ui, sans-serif",
11778
+ weight: "bold",
11779
+ lineHeight: "normal",
11780
+ letterSpacing: "normal",
11781
+ italic: null,
11782
+ case: null
11783
+ },
11784
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11785
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11786
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11787
+ },
11788
+ scale: "balanced"
11789
+ };
11790
+ var editorialSerifTypography = {
11791
+ body: {
11792
+ family: "Lora, Georgia, serif",
11793
+ size: "lg",
11794
+ weight: "regular",
11795
+ lineHeight: "loose",
11796
+ letterSpacing: "normal"
11797
+ },
11798
+ headings: {
11799
+ default: {
11800
+ family: "Playfair Display, Georgia, serif",
11801
+ weight: "semibold",
11802
+ lineHeight: "normal",
11803
+ letterSpacing: "tight",
11804
+ italic: null,
11805
+ case: null
11806
+ },
11807
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11808
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11809
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
11810
+ },
11811
+ scale: "spacious"
11812
+ };
11813
+ var classicSerifTypography = {
11814
+ body: {
11815
+ family: "Libre Baskerville, Georgia, serif",
11816
+ size: "md",
11817
+ weight: "regular",
11818
+ lineHeight: "relaxed",
11819
+ letterSpacing: "normal"
11820
+ },
11821
+ headings: {
11822
+ default: {
11823
+ family: "Cormorant Garamond, Georgia, serif",
11824
+ weight: "semibold",
11825
+ lineHeight: "normal",
11826
+ letterSpacing: "normal",
11827
+ italic: null,
11828
+ case: null
11829
+ },
11830
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11831
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11832
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11833
+ },
11834
+ scale: "balanced"
11835
+ };
11836
+ var luxeContrastTypography = {
11837
+ body: {
11838
+ family: "Manrope, system-ui, sans-serif",
11839
+ size: "md",
11840
+ weight: "regular",
11841
+ lineHeight: "relaxed",
11842
+ letterSpacing: "normal"
11843
+ },
11844
+ headings: {
11845
+ default: {
11846
+ family: "Cormorant Garamond, Georgia, serif",
11847
+ weight: "semibold",
11848
+ lineHeight: "normal",
11849
+ letterSpacing: "tight",
11850
+ italic: null,
11851
+ case: null
11852
+ },
11853
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11854
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11855
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11856
+ },
11857
+ scale: "spacious"
11858
+ };
11859
+ var boldDisplayTypography = {
11860
+ body: {
11861
+ family: "Manrope, system-ui, sans-serif",
11862
+ size: "lg",
11863
+ weight: "regular",
11864
+ lineHeight: "relaxed",
11865
+ letterSpacing: "normal"
11866
+ },
11867
+ headings: {
11868
+ default: {
11869
+ family: '"TAN - PEARL", sans-serif',
11870
+ weight: "bold",
11871
+ lineHeight: "normal",
11872
+ letterSpacing: "tight",
11873
+ colorToken: "primary",
11874
+ italic: null,
11875
+ case: null
11876
+ },
11877
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11878
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11879
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11880
+ },
11881
+ scale: "balanced"
11882
+ };
11883
+ var typographyPresets = [
11884
+ defineTypographyPreset({
11885
+ id: "typography-preset:modern-sans",
11886
+ name: "Modern Sans",
11887
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
11888
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
11889
+ recommendedFonts: {
11890
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
11891
+ heading: ["Inter", "Manrope", "Source Sans 3"]
11892
+ },
11893
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11894
+ typography: modernSansTypography
11895
+ }),
11896
+ defineTypographyPreset({
11897
+ id: "typography-preset:warm-rounded",
11898
+ name: "Warm Rounded",
11899
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
11900
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
11901
+ recommendedFonts: {
11902
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
11903
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
11904
+ },
11905
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11906
+ typography: warmRoundedTypography
11907
+ }),
11908
+ defineTypographyPreset({
11909
+ id: "typography-preset:editorial-serif",
11910
+ name: "Editorial Serif",
11911
+ description: "Story-led type with warm reading rhythm and expressive headings.",
11912
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
11913
+ recommendedFonts: {
11914
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
11915
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
11916
+ },
11917
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11918
+ typography: editorialSerifTypography
11919
+ }),
11920
+ defineTypographyPreset({
11921
+ id: "typography-preset:classic-serif",
11922
+ name: "Classic Serif",
11923
+ description: "Measured, polished type for premium and established offers.",
11924
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
11925
+ recommendedFonts: {
11926
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
11927
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
11928
+ },
11929
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11930
+ typography: classicSerifTypography
11931
+ }),
11932
+ defineTypographyPreset({
11933
+ id: "typography-preset:luxe-contrast",
11934
+ name: "Luxe Contrast",
11935
+ description: "A restrained sans body paired with elegant high-contrast headings.",
11936
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
11937
+ recommendedFonts: {
11938
+ body: ["Manrope", "Inter", "Source Sans 3"],
11939
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
11940
+ },
11941
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11942
+ typography: luxeContrastTypography
11943
+ }),
11944
+ defineTypographyPreset({
11945
+ id: "typography-preset:bold-display",
11946
+ name: "Bold Display",
11947
+ description: "Punchy display headings with readable sans body copy for branded launches.",
11948
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
11949
+ recommendedFonts: {
11950
+ body: ["Manrope", "Inter", "Space Grotesk"],
11951
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
11952
+ },
11953
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11954
+ typography: boldDisplayTypography,
11955
+ heroTypography: {
11956
+ headlineSize: "6xl",
11957
+ headlineLineHeight: "tight",
11958
+ subheadlineSize: "editorial",
11959
+ subheadlineLineHeight: "normal",
11960
+ microHeadlineSize: "6xl",
11961
+ microHeadlineLineHeight: "tight",
11962
+ microSubheadlineSize: "xl",
11963
+ microSubheadlineLineHeight: "normal",
11964
+ responsive: {
11965
+ tablet: { headlineSize: "5xl" },
11966
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
11967
+ }
11968
+ }
11969
+ })
11970
+ ];
11971
+ var typographyPresetsById = new Map(
11972
+ typographyPresets.map((preset2) => [preset2.id, preset2])
11973
+ );
11974
+
10975
11975
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
10976
11976
  var curatedSiteStyleIdValues = [
10977
11977
  "site-style:calm-studio",
@@ -10984,6 +11984,7 @@ var curatedSiteStyleIdValues = [
10984
11984
  "site-style:personal-retreat-journal",
10985
11985
  "site-style:tactile-workshop",
10986
11986
  "site-style:modern-wellness",
11987
+ "site-style:soft-earth",
10987
11988
  "site-style:bold-launch",
10988
11989
  "site-style:south-west-twerk-school"
10989
11990
  ];
@@ -11049,26 +12050,45 @@ var expressiveUnderlineInputs = {
11049
12050
  }
11050
12051
  };
11051
12052
  function uniqueContentFrameKinds() {
11052
- const kinds = [...new Set(
11053
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
11054
- )];
12053
+ const kinds = [
12054
+ ...new Set(
12055
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
12056
+ )
12057
+ ];
11055
12058
  const firstKind = kinds[0];
11056
12059
  if (!firstKind) {
11057
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
12060
+ throw new Error(
12061
+ "Expected generated design option catalog to expose at least one content frame kind."
12062
+ );
11058
12063
  }
11059
12064
  return [firstKind, ...kinds.slice(1)];
11060
12065
  }
11061
12066
  var generatedContentFrameKinds = uniqueContentFrameKinds();
11062
12067
  function defineCuratedSiteStyle(input) {
12068
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
12069
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12070
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
12071
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
12072
+ if (!typographyPresetChoices.some(
12073
+ (choice) => choice.id === defaultTypographyPresetId
12074
+ )) {
12075
+ throw new Error(
12076
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
12077
+ );
12078
+ }
11063
12079
  return {
11064
12080
  id: asSiteStyleId(input.id),
11065
12081
  name: input.name,
11066
12082
  description: input.description,
11067
12083
  generationBrief: input.generationBrief,
11068
12084
  selectionKeywordRules: input.selectionKeywordRules ?? [],
11069
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
12085
+ siteCreatorSelection: input.siteCreatorSelection ?? {
12086
+ kind: "explicit_only"
12087
+ },
11070
12088
  template: {
11071
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
12089
+ id: asDesignSystemTemplateId(
12090
+ `template:${input.id.replace("site-style:", "")}`
12091
+ ),
11072
12092
  name: input.name,
11073
12093
  version: 1,
11074
12094
  tokenRecipes: input.tokenRecipes,
@@ -11080,11 +12100,27 @@ function defineCuratedSiteStyle(input) {
11080
12100
  },
11081
12101
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
11082
12102
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
11083
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
12103
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
12104
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
12105
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
12106
+ } : inferredHeaderCuration.defaultHeaderSelection,
12107
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
12108
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
12109
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
12110
+ (selection) => ({
12111
+ layoutId: asHeaderLayoutId(selection.layoutId),
12112
+ styleId: asHeaderStyleId(selection.styleId)
12113
+ })
12114
+ ),
12115
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
11084
12116
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
11085
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
12117
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
12118
+ asFooterLookId
12119
+ ),
11086
12120
  buttonPersonalityChoices: input.buttonPersonalityChoices,
11087
- paletteVariantChoices: input.paletteVariantChoices
12121
+ paletteVariantChoices: input.paletteVariantChoices,
12122
+ typographyPresetChoices,
12123
+ defaultTypographyPresetId
11088
12124
  };
11089
12125
  }
11090
12126
  function buttonChoice(id, note) {
@@ -11093,6 +12129,87 @@ function buttonChoice(id, note) {
11093
12129
  function paletteChoice(id, note) {
11094
12130
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
11095
12131
  }
12132
+ function headerLayoutChoice(id, note) {
12133
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
12134
+ }
12135
+ function headerStyleChoice(id, note) {
12136
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
12137
+ }
12138
+ function unbrandHeaderLayoutId(id) {
12139
+ return id;
12140
+ }
12141
+ function uniqueHeaderLayoutChoices(choices) {
12142
+ const seen = /* @__PURE__ */ new Set();
12143
+ const unique = choices.filter((choice) => {
12144
+ if (seen.has(choice.id)) return false;
12145
+ seen.add(choice.id);
12146
+ return true;
12147
+ });
12148
+ const first = unique[0];
12149
+ if (!first) {
12150
+ throw new Error("Expected at least one curated header layout choice.");
12151
+ }
12152
+ return [first, ...unique.slice(1)];
12153
+ }
12154
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12155
+ const first = choices[0] ?? {
12156
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
12157
+ };
12158
+ return [first, ...choices.slice(1)];
12159
+ }
12160
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
12161
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12162
+ (selection) => Boolean(selection)
12163
+ );
12164
+ const defaultHeaderSelection = selections[0] ?? {
12165
+ layoutId: asHeaderLayoutId("classic"),
12166
+ styleId: asHeaderStyleId("minimal")
12167
+ };
12168
+ const layoutChoices = uniqueHeaderLayoutChoices(
12169
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
12170
+ );
12171
+ const stylesByLayout = {};
12172
+ for (const layoutChoice of layoutChoices) {
12173
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12174
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
12175
+ }
12176
+ return {
12177
+ defaultHeaderSelection,
12178
+ recommendedHeaderLayoutChoices: layoutChoices,
12179
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
12180
+ };
12181
+ }
12182
+ function typographyChoice(id, note) {
12183
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
12184
+ }
12185
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
12186
+ switch (recipe) {
12187
+ case "clean-sans":
12188
+ return [
12189
+ typographyChoice("typography-preset:modern-sans"),
12190
+ typographyChoice("typography-preset:luxe-contrast"),
12191
+ typographyChoice("typography-preset:bold-display")
12192
+ ];
12193
+ case "friendly-sans":
12194
+ return [
12195
+ typographyChoice("typography-preset:warm-rounded"),
12196
+ typographyChoice("typography-preset:modern-sans"),
12197
+ typographyChoice("typography-preset:editorial-serif")
12198
+ ];
12199
+ case "serif-editorial":
12200
+ return [
12201
+ typographyChoice("typography-preset:editorial-serif"),
12202
+ typographyChoice("typography-preset:classic-serif"),
12203
+ typographyChoice("typography-preset:warm-rounded")
12204
+ ];
12205
+ case "classic-serif":
12206
+ return [
12207
+ typographyChoice("typography-preset:classic-serif"),
12208
+ typographyChoice("typography-preset:luxe-contrast"),
12209
+ typographyChoice("typography-preset:editorial-serif")
12210
+ ];
12211
+ }
12212
+ }
11096
12213
  var curatedSiteStyles = [
11097
12214
  defineCuratedSiteStyle({
11098
12215
  id: "site-style:calm-studio",
@@ -11109,7 +12226,11 @@ var curatedSiteStyles = [
11109
12226
  motion: "subtle"
11110
12227
  },
11111
12228
  compositionBudget: quietBudget,
11112
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12229
+ recommendedHeaderLookIds: [
12230
+ "centered-calm",
12231
+ "minimal-transparent",
12232
+ "clean-base"
12233
+ ],
11113
12234
  buttonPersonalityChoices: [
11114
12235
  buttonChoice("soft-pill"),
11115
12236
  buttonChoice("pebble"),
@@ -11138,7 +12259,11 @@ var curatedSiteStyles = [
11138
12259
  motion: "subtle"
11139
12260
  },
11140
12261
  compositionBudget: balancedBudget,
11141
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12262
+ recommendedHeaderLookIds: [
12263
+ "practical-utility",
12264
+ "brand-solid",
12265
+ "clean-base"
12266
+ ],
11142
12267
  buttonPersonalityChoices: [
11143
12268
  buttonChoice("confident-chip"),
11144
12269
  buttonChoice("soft-pill"),
@@ -11165,7 +12290,11 @@ var curatedSiteStyles = [
11165
12290
  motion: "subtle"
11166
12291
  },
11167
12292
  compositionBudget: balancedBudget,
11168
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
12293
+ recommendedHeaderLookIds: [
12294
+ "serif-line",
12295
+ "minimal-transparent",
12296
+ "centered-calm"
12297
+ ],
11169
12298
  buttonPersonalityChoices: [
11170
12299
  buttonChoice("editorial-link"),
11171
12300
  buttonChoice("soft-pill"),
@@ -11193,7 +12322,11 @@ var curatedSiteStyles = [
11193
12322
  motion: "expressive"
11194
12323
  },
11195
12324
  compositionBudget: balancedBudget,
11196
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12325
+ recommendedHeaderLookIds: [
12326
+ "brand-solid",
12327
+ "practical-utility",
12328
+ "clean-base"
12329
+ ],
11197
12330
  buttonPersonalityChoices: [
11198
12331
  buttonChoice("pebble"),
11199
12332
  buttonChoice("brushed-wash"),
@@ -11210,7 +12343,10 @@ var curatedSiteStyles = [
11210
12343
  name: "Quiet Luxury",
11211
12344
  description: "Minimal, confident, and refined for premium experiences and private services.",
11212
12345
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
11213
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
12346
+ siteCreatorSelection: {
12347
+ kind: "site_creator_keyword_heuristic",
12348
+ priority: 20
12349
+ },
11214
12350
  selectionKeywordRules: [
11215
12351
  { kind: "word", value: "luxury" },
11216
12352
  { kind: "word", value: "premium" },
@@ -11228,7 +12364,11 @@ var curatedSiteStyles = [
11228
12364
  motion: "none"
11229
12365
  },
11230
12366
  compositionBudget: quietBudget,
11231
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
12367
+ recommendedHeaderLookIds: [
12368
+ "minimal-transparent",
12369
+ "serif-line",
12370
+ "clean-base"
12371
+ ],
11232
12372
  buttonPersonalityChoices: [
11233
12373
  buttonChoice("editorial-link"),
11234
12374
  buttonChoice("confident-chip"),
@@ -11264,7 +12404,11 @@ var curatedSiteStyles = [
11264
12404
  motion: "none"
11265
12405
  },
11266
12406
  compositionBudget: quietBudget,
11267
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12407
+ recommendedHeaderLookIds: [
12408
+ "practical-utility",
12409
+ "brand-solid",
12410
+ "clean-base"
12411
+ ],
11268
12412
  buttonPersonalityChoices: [
11269
12413
  buttonChoice("confident-chip"),
11270
12414
  buttonChoice("pebble"),
@@ -11291,7 +12435,11 @@ var curatedSiteStyles = [
11291
12435
  motion: "subtle"
11292
12436
  },
11293
12437
  compositionBudget: balancedBudget,
11294
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12438
+ recommendedHeaderLookIds: [
12439
+ "centered-calm",
12440
+ "minimal-transparent",
12441
+ "clean-base"
12442
+ ],
11295
12443
  buttonPersonalityChoices: [
11296
12444
  buttonChoice("soft-pill"),
11297
12445
  buttonChoice("pebble"),
@@ -11308,7 +12456,10 @@ var curatedSiteStyles = [
11308
12456
  name: "Quiet Practice",
11309
12457
  description: "Grounded, calm, and practical for small appointment-first practices.",
11310
12458
  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.",
11311
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
12459
+ siteCreatorSelection: {
12460
+ kind: "site_creator_keyword_heuristic",
12461
+ priority: 30
12462
+ },
11312
12463
  selectionKeywordRules: [
11313
12464
  { kind: "substring", value: "massage" },
11314
12465
  { kind: "word", value: "bodywork" },
@@ -11329,7 +12480,11 @@ var curatedSiteStyles = [
11329
12480
  motion: "subtle"
11330
12481
  },
11331
12482
  compositionBudget: quietBudget,
11332
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
12483
+ recommendedHeaderLookIds: [
12484
+ "practical-utility",
12485
+ "clean-base",
12486
+ "centered-calm"
12487
+ ],
11333
12488
  buttonPersonalityChoices: [
11334
12489
  buttonChoice("pebble"),
11335
12490
  buttonChoice("soft-pill"),
@@ -11346,7 +12501,10 @@ var curatedSiteStyles = [
11346
12501
  name: "Personal Retreat Journal",
11347
12502
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
11348
12503
  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.",
11349
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
12504
+ siteCreatorSelection: {
12505
+ kind: "site_creator_keyword_heuristic",
12506
+ priority: 40
12507
+ },
11350
12508
  selectionKeywordRules: [
11351
12509
  { kind: "substring", value: "retreat" },
11352
12510
  { kind: "phrase", value: "solo practitioner" },
@@ -11366,7 +12524,11 @@ var curatedSiteStyles = [
11366
12524
  motion: "subtle"
11367
12525
  },
11368
12526
  compositionBudget: balancedBudget,
11369
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
12527
+ recommendedHeaderLookIds: [
12528
+ "serif-line",
12529
+ "centered-calm",
12530
+ "minimal-transparent"
12531
+ ],
11370
12532
  buttonPersonalityChoices: [
11371
12533
  buttonChoice("editorial-link"),
11372
12534
  buttonChoice("soft-pill"),
@@ -11383,7 +12545,10 @@ var curatedSiteStyles = [
11383
12545
  name: "Tactile Workshop",
11384
12546
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
11385
12547
  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.",
11386
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
12548
+ siteCreatorSelection: {
12549
+ kind: "site_creator_keyword_heuristic",
12550
+ priority: 50
12551
+ },
11387
12552
  selectionKeywordRules: [
11388
12553
  { kind: "substring", value: "ceramic" },
11389
12554
  { kind: "word", value: "pottery" },
@@ -11403,8 +12568,15 @@ var curatedSiteStyles = [
11403
12568
  motion: "subtle"
11404
12569
  },
11405
12570
  compositionBudget: balancedBudget,
11406
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
11407
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12571
+ recommendedHeaderLookIds: [
12572
+ "brand-solid",
12573
+ "practical-utility",
12574
+ "clean-base"
12575
+ ],
12576
+ recommendedFooterLookIds: [
12577
+ "site-footer-brand-two-band",
12578
+ "footer-muted-grounding"
12579
+ ],
11408
12580
  buttonPersonalityChoices: [
11409
12581
  buttonChoice("pebble"),
11410
12582
  buttonChoice("confident-chip"),
@@ -11419,101 +12591,178 @@ var curatedSiteStyles = [
11419
12591
  ]
11420
12592
  }),
11421
12593
  defineCuratedSiteStyle({
11422
- id: "site-style:bold-launch",
11423
- name: "Bold Launch",
11424
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
11425
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
11426
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
11427
- selectionKeywordRules: [
11428
- { kind: "substring", value: "launch" },
11429
- { kind: "substring", value: "campaign" },
11430
- { kind: "word", value: "preorder" },
11431
- { kind: "phrase", value: "pre-order" },
11432
- { kind: "substring", value: "waitlist" },
11433
- { kind: "word", value: "drop" }
11434
- ],
11435
- tokenRecipes: {
11436
- palette: "high-contrast",
11437
- contrast: "maximum",
11438
- radius: "pill",
11439
- shadow: "layered",
11440
- typography: "clean-sans",
11441
- spacing: "regular",
11442
- motion: "expressive"
12594
+ id: "site-style:soft-earth",
12595
+ name: "Soft Earth",
12596
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12597
+ 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.",
12598
+ siteCreatorSelection: {
12599
+ kind: "site_creator_keyword_heuristic",
12600
+ priority: 45
11443
12601
  },
11444
- compositionBudget: expressiveBudget,
11445
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
11446
- buttonPersonalityChoices: [
11447
- buttonChoice("ink-stamp"),
11448
- buttonChoice("confident-chip"),
11449
- buttonChoice("brushed-wash"),
11450
- buttonChoice("pebble")
12602
+ selectionKeywordRules: [
12603
+ { kind: "word", value: "meditation" },
12604
+ { kind: "word", value: "wellbeing" },
12605
+ { kind: "substring", value: "retreat" },
12606
+ { kind: "phrase", value: "yoga studio" },
12607
+ { kind: "phrase", value: "mindful movement" }
11451
12608
  ],
11452
- paletteVariantChoices: [
11453
- paletteChoice("high-contrast-monochrome"),
11454
- paletteChoice("high-contrast-ink"),
11455
- paletteChoice("brand-led-jewel"),
11456
- paletteChoice("brand-led-warm")
11457
- ]
11458
- }),
11459
- defineCuratedSiteStyle({
11460
- id: "site-style:south-west-twerk-school",
11461
- name: "South West Twerk School",
11462
- description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
11463
- 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.",
11464
12609
  tokenRecipes: {
11465
- palette: "brand-led",
11466
- contrast: "maximum",
12610
+ palette: "warm-neutral",
12611
+ contrast: "standard",
11467
12612
  radius: "soft",
11468
- shadow: "layered",
11469
- typography: "clean-sans",
12613
+ shadow: "subtle",
12614
+ typography: "serif-editorial",
11470
12615
  spacing: "airy",
11471
- motion: "expressive"
12616
+ motion: "subtle"
11472
12617
  },
11473
- compositionBudget: expressiveBudget,
12618
+ compositionBudget: balancedBudget,
11474
12619
  themeOverrides: {
11475
12620
  typography: {
11476
12621
  body: {
11477
- family: "Manrope, system-ui, sans-serif",
11478
- size: "lg",
12622
+ family: "Inter, system-ui, sans-serif",
12623
+ size: "md",
11479
12624
  weight: "regular",
11480
12625
  lineHeight: "relaxed",
11481
12626
  letterSpacing: "normal"
11482
12627
  },
11483
12628
  headings: {
11484
12629
  default: {
11485
- family: '"TAN - PEARL", sans-serif',
11486
- weight: "bold",
12630
+ family: '"Cormorant Garamond", Georgia, serif',
12631
+ weight: "regular",
11487
12632
  lineHeight: "normal",
11488
- letterSpacing: "tight",
11489
- colorToken: "primary",
12633
+ letterSpacing: "normal",
12634
+ colorToken: "text",
11490
12635
  italic: null,
11491
12636
  case: null
11492
12637
  },
11493
12638
  h1: {
11494
12639
  size: "xl",
11495
- weight: "bold",
12640
+ weight: "regular",
11496
12641
  lineHeight: "normal",
11497
- letterSpacing: "tight",
12642
+ letterSpacing: "normal",
11498
12643
  italic: null
11499
12644
  },
11500
12645
  h2: {
11501
12646
  size: "lg",
11502
- weight: "bold",
12647
+ weight: "regular",
11503
12648
  lineHeight: "normal",
11504
12649
  letterSpacing: "normal",
11505
12650
  italic: null
11506
12651
  },
11507
12652
  h3: {
11508
12653
  size: "md",
11509
- weight: "bold",
12654
+ weight: "regular",
11510
12655
  lineHeight: "normal",
11511
12656
  letterSpacing: "normal",
11512
12657
  italic: null
11513
12658
  }
11514
12659
  },
11515
- scale: "balanced"
12660
+ scale: "majorThird"
11516
12661
  },
12662
+ bodyText: {
12663
+ intro: {
12664
+ paragraphSize: "default",
12665
+ headingSize: "editorial"
12666
+ }
12667
+ }
12668
+ },
12669
+ recommendedAppearancePresetIds: [
12670
+ "hero-brand-scrim",
12671
+ "intro-soft-earth-statement",
12672
+ "feature-cards-soft-earth-offerings",
12673
+ "testimonials-soft-earth-proof-band",
12674
+ "faq-soft-earth-two-column",
12675
+ "contact-form-panel"
12676
+ ],
12677
+ recommendedHeaderLookIds: [
12678
+ "centered-calm",
12679
+ "minimal-transparent",
12680
+ "serif-line"
12681
+ ],
12682
+ recommendedFooterLookIds: [
12683
+ "footer-muted-grounding",
12684
+ "site-footer-brand-two-band"
12685
+ ],
12686
+ buttonPersonalityChoices: [
12687
+ buttonChoice("earth-pill"),
12688
+ buttonChoice("soft-pill"),
12689
+ buttonChoice("pebble"),
12690
+ buttonChoice("editorial-link")
12691
+ ],
12692
+ paletteVariantChoices: [
12693
+ paletteChoice("warm-neutral-soft-earth"),
12694
+ paletteChoice("warm-neutral-clay"),
12695
+ paletteChoice("warm-neutral-forest"),
12696
+ paletteChoice("soft-natural-sage")
12697
+ ]
12698
+ }),
12699
+ defineCuratedSiteStyle({
12700
+ id: "site-style:bold-launch",
12701
+ name: "Bold Launch",
12702
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
12703
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
12704
+ siteCreatorSelection: {
12705
+ kind: "site_creator_keyword_heuristic",
12706
+ priority: 10
12707
+ },
12708
+ selectionKeywordRules: [
12709
+ { kind: "substring", value: "launch" },
12710
+ { kind: "substring", value: "campaign" },
12711
+ { kind: "word", value: "preorder" },
12712
+ { kind: "phrase", value: "pre-order" },
12713
+ { kind: "substring", value: "waitlist" },
12714
+ { kind: "word", value: "drop" }
12715
+ ],
12716
+ tokenRecipes: {
12717
+ palette: "high-contrast",
12718
+ contrast: "maximum",
12719
+ radius: "pill",
12720
+ shadow: "layered",
12721
+ typography: "clean-sans",
12722
+ spacing: "regular",
12723
+ motion: "expressive"
12724
+ },
12725
+ compositionBudget: expressiveBudget,
12726
+ recommendedHeaderLookIds: [
12727
+ "transparent-overlay",
12728
+ "floating-glass",
12729
+ "brand-solid"
12730
+ ],
12731
+ buttonPersonalityChoices: [
12732
+ buttonChoice("ink-stamp"),
12733
+ buttonChoice("confident-chip"),
12734
+ buttonChoice("brushed-wash"),
12735
+ buttonChoice("pebble")
12736
+ ],
12737
+ paletteVariantChoices: [
12738
+ paletteChoice("high-contrast-monochrome"),
12739
+ paletteChoice("high-contrast-ink"),
12740
+ paletteChoice("brand-led-jewel"),
12741
+ paletteChoice("brand-led-warm")
12742
+ ]
12743
+ }),
12744
+ defineCuratedSiteStyle({
12745
+ id: "site-style:south-west-twerk-school",
12746
+ name: "South West Twerk School",
12747
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
12748
+ 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.",
12749
+ tokenRecipes: {
12750
+ palette: "brand-led",
12751
+ contrast: "maximum",
12752
+ radius: "soft",
12753
+ shadow: "layered",
12754
+ typography: "clean-sans",
12755
+ spacing: "airy",
12756
+ motion: "expressive"
12757
+ },
12758
+ compositionBudget: expressiveBudget,
12759
+ typographyPresetChoices: [
12760
+ typographyChoice("typography-preset:bold-display"),
12761
+ typographyChoice("typography-preset:modern-sans"),
12762
+ typographyChoice("typography-preset:luxe-contrast")
12763
+ ],
12764
+ defaultTypographyPresetId: "typography-preset:bold-display",
12765
+ themeOverrides: {
11517
12766
  bodyText: {
11518
12767
  intro: {
11519
12768
  paragraphSize: "editorial",
@@ -11529,8 +12778,15 @@ var curatedSiteStyles = [
11529
12778
  "testimonials-accent-quote-proof",
11530
12779
  "contact-form-brand-depth-card"
11531
12780
  ],
11532
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
11533
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12781
+ recommendedHeaderLookIds: [
12782
+ "brand-solid",
12783
+ "transparent-overlay",
12784
+ "practical-utility"
12785
+ ],
12786
+ recommendedFooterLookIds: [
12787
+ "site-footer-brand-two-band",
12788
+ "footer-muted-grounding"
12789
+ ],
11534
12790
  buttonPersonalityChoices: [
11535
12791
  buttonChoice("showtime-pill"),
11536
12792
  buttonChoice("confident-chip"),
@@ -15845,8 +17101,9 @@ var faqAccordionFragment = defineFragment({
15845
17101
  },
15846
17102
  fallback: "rb-faq-item"
15847
17103
  },
15848
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
15849
- // Pass icon style from theme
17104
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17105
+ // Legacy theme accordion style
17106
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
15850
17107
  },
15851
17108
  triggerFrom: "faqItem.question",
15852
17109
  contentFrom: "faqItem.answer"
@@ -16924,61 +18181,389 @@ function splitLayoutWith(children) {
16924
18181
  children
16925
18182
  }
16926
18183
  }),
16927
- // The split variants render the image as a real grid column, so suppress
16928
- // the default absolute background image layer while keeping color/overlay.
16929
- renderBackgroundImage: false,
16930
- baseClass: ""
16931
- });
16932
- }
16933
- var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
16934
- var splitImageColumn = heroSplitImagePane();
16935
- var splitLayout = splitLayoutWith([
16936
- splitContentColumn,
16937
- splitImageColumn
16938
- ]);
16939
- var splitReverseLayout = splitLayoutWith([
16940
- splitImageColumn,
16941
- splitContentColumn
16942
- ]);
16943
- var heroConfig = {
16944
- id: "block.hero",
16945
- title: "Hero",
16946
- titleSource: "headline",
16947
- category: "layout",
16948
- includeContainerStyles: true,
16949
- promotedFields: ["_sectionStyles.background.image"],
16950
- fragments: [
16951
- { fragment: heroCopyFragment, fieldPriority: 0 },
16952
- { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
16953
- { fragment: heroCtaRowFragment, fieldPriority: 2 }
16954
- ],
16955
- additionalFields: [
16956
- containerStylesField({
16957
- id: "_contentCardStyles",
16958
- label: "Content card",
16959
- renderInHeader: true,
16960
- intent: "style"
18184
+ // The split variants render the image as a real grid column, so suppress
18185
+ // the default absolute background image layer while keeping color/overlay.
18186
+ renderBackgroundImage: false,
18187
+ baseClass: ""
18188
+ });
18189
+ }
18190
+ var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
18191
+ var splitImageColumn = heroSplitImagePane();
18192
+ var splitLayout = splitLayoutWith([
18193
+ splitContentColumn,
18194
+ splitImageColumn
18195
+ ]);
18196
+ var splitReverseLayout = splitLayoutWith([
18197
+ splitImageColumn,
18198
+ splitContentColumn
18199
+ ]);
18200
+ var heroConfig = {
18201
+ id: "block.hero",
18202
+ title: "Hero",
18203
+ titleSource: "headline",
18204
+ category: "layout",
18205
+ includeContainerStyles: true,
18206
+ promotedFields: ["_sectionStyles.background.image"],
18207
+ fragments: [
18208
+ { fragment: heroCopyFragment, fieldPriority: 0 },
18209
+ { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
18210
+ { fragment: heroCtaRowFragment, fieldPriority: 2 }
18211
+ ],
18212
+ additionalFields: [
18213
+ containerStylesField({
18214
+ id: "_contentCardStyles",
18215
+ label: "Content card",
18216
+ renderInHeader: true,
18217
+ intent: "style"
18218
+ })
18219
+ ],
18220
+ layout: classicLayout,
18221
+ variants: {
18222
+ classic: classicLayout,
18223
+ micro: microLayout,
18224
+ split: splitLayout,
18225
+ splitReverse: splitReverseLayout
18226
+ },
18227
+ defaultVariant: "classic",
18228
+ description: "Hero section with headline, subtitle, and repeatable CTAs.",
18229
+ tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
18230
+ icon: "Sparkles",
18231
+ styleTokens: {
18232
+ typography: "display",
18233
+ spacing: "xl"
18234
+ }
18235
+ };
18236
+ var heroManifest = createBlockManifest(heroConfig);
18237
+ var heroBlockDefinition = {
18238
+ manifest: heroManifest
18239
+ };
18240
+
18241
+ // ../blocks/src/system/fields/aspectRatio.ts
18242
+ var standardAspectRatioOptions = [
18243
+ { value: "auto", label: "Auto (original)" },
18244
+ { value: "16/9", label: "16:9 (Landscape)" },
18245
+ { value: "4/3", label: "4:3 (Standard)" },
18246
+ { value: "1/1", label: "1:1 (Square)" },
18247
+ { value: "3/4", label: "3:4 (Portrait)" }
18248
+ ];
18249
+ function createAspectRatioField(options = {}) {
18250
+ return {
18251
+ id: options.id ?? "aspectRatio",
18252
+ type: "select",
18253
+ label: options.label ?? "Aspect ratio",
18254
+ ...options.description ? { description: options.description } : {},
18255
+ required: false,
18256
+ defaultValue: options.defaultValue ?? "auto",
18257
+ multiple: false,
18258
+ options: [...standardAspectRatioOptions],
18259
+ ui: {
18260
+ intent: options.uiIntent ?? "display",
18261
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
18262
+ }
18263
+ };
18264
+ }
18265
+
18266
+ // ../blocks/src/system/fields/imageLayout.ts
18267
+ function createImageColSizeField(options = {}) {
18268
+ const {
18269
+ id = "imageColSize",
18270
+ label = "Image column size",
18271
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
18272
+ defaultValue = "1/3",
18273
+ uiIntent = "display",
18274
+ visibleWhen
18275
+ } = options;
18276
+ return {
18277
+ id,
18278
+ type: "select",
18279
+ label,
18280
+ description,
18281
+ required: false,
18282
+ defaultValue,
18283
+ multiple: false,
18284
+ options: [
18285
+ { value: "1/4", label: "Small (1/4)" },
18286
+ { value: "1/3", label: "Medium (1/3)" },
18287
+ { value: "2/5", label: "Large (2/5)" },
18288
+ { value: "1/2", label: "Extra large (1/2)" },
18289
+ { value: "2/3", label: "Huge (2/3)" }
18290
+ ],
18291
+ ui: {
18292
+ intent: uiIntent,
18293
+ ...visibleWhen ? { visibleWhen } : {}
18294
+ }
18295
+ };
18296
+ }
18297
+ function createImagePositionField(options = {}) {
18298
+ const {
18299
+ id = "imagePosition",
18300
+ label = "Image position",
18301
+ description = "Choose which side the image appears on.",
18302
+ defaultValue = "left",
18303
+ includeAlternate = false,
18304
+ uiIntent = "display",
18305
+ visibleWhen
18306
+ } = options;
18307
+ const positionOptions = [
18308
+ { value: "left", label: "Left" },
18309
+ { value: "right", label: "Right" },
18310
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
18311
+ ];
18312
+ return {
18313
+ id,
18314
+ type: "select",
18315
+ label,
18316
+ description,
18317
+ required: false,
18318
+ defaultValue,
18319
+ multiple: false,
18320
+ // Spread to get a mutable array type without unsafe casts.
18321
+ options: [...positionOptions],
18322
+ ui: {
18323
+ intent: uiIntent,
18324
+ ...visibleWhen ? { visibleWhen } : {}
18325
+ }
18326
+ };
18327
+ }
18328
+
18329
+ // ../blocks/src/system/blocks/intro.ts
18330
+ function introHeading(className) {
18331
+ return text(
18332
+ {
18333
+ as: "h2",
18334
+ className
18335
+ },
18336
+ when("content.title"),
18337
+ bind("content.title")
18338
+ );
18339
+ }
18340
+ function introBody(className = "rb-prose rb-max-w-none") {
18341
+ return richText({ className }, bind("content.body"));
18342
+ }
18343
+ function introCtas(justify = "start") {
18344
+ return ctaRow({
18345
+ justify,
18346
+ gap: "md",
18347
+ containerClassName: "rb-mt-2"
18348
+ });
18349
+ }
18350
+ function introCopyStack(options = {}) {
18351
+ return stack(
18352
+ {
18353
+ gap: "md",
18354
+ className: options.className ?? "rb-intro-copy"
18355
+ },
18356
+ [
18357
+ introHeading(options.headingClassName ?? "rb-intro-title"),
18358
+ introBody(options.bodyClassName),
18359
+ introCtas(options.ctaJustify)
18360
+ ]
18361
+ );
18362
+ }
18363
+ var introMedia = media(
18364
+ {
18365
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
18366
+ style: {
18367
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
18368
+ }
18369
+ },
18370
+ bind("content.media")
18371
+ );
18372
+ var centeredCopyLayout = styledSection({
18373
+ children: styledContainer({
18374
+ rootType: "stack",
18375
+ rootProps: { gap: "lg" },
18376
+ children: [
18377
+ introCopyStack({
18378
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
18379
+ headingClassName: "rb-intro-title rb-text-center",
18380
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
18381
+ ctaJustify: "center"
18382
+ })
18383
+ ]
18384
+ }),
18385
+ baseClass: "",
18386
+ spacing: "medium"
18387
+ });
18388
+ var statementCopyLayout = styledSection({
18389
+ children: styledContainer({
18390
+ children: [
18391
+ el(
18392
+ "div",
18393
+ {
18394
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18395
+ },
18396
+ [
18397
+ introHeading("rb-intro-title rb-max-w-xl"),
18398
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18399
+ introBody(),
18400
+ introCtas("start")
18401
+ ])
18402
+ ]
18403
+ )
18404
+ ]
18405
+ }),
18406
+ baseClass: "",
18407
+ spacing: "medium"
18408
+ });
18409
+ var statementMediaLayout = styledSection({
18410
+ children: styledContainer({
18411
+ children: [
18412
+ el(
18413
+ "div",
18414
+ {
18415
+ 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"
18416
+ },
18417
+ [
18418
+ introHeading("rb-intro-title rb-max-w-xl"),
18419
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18420
+ introBody(),
18421
+ introCtas("start")
18422
+ ]),
18423
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
18424
+ ]
18425
+ )
18426
+ ]
18427
+ }),
18428
+ baseClass: "",
18429
+ spacing: "medium"
18430
+ });
18431
+ var mediaCopyLayout = styledSection({
18432
+ children: styledContainer({
18433
+ children: [
18434
+ responsiveTwoColumn({
18435
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
18436
+ text: introCopyStack({
18437
+ className: "rb-intro-copy rb-max-w-xl",
18438
+ headingClassName: "rb-intro-title"
18439
+ }),
18440
+ ratioFrom: "content.ratio",
18441
+ imagePositionFrom: "content.imagePosition",
18442
+ gapFrom: "content.gap",
18443
+ gapFallback: "comfortable",
18444
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
18445
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
18446
+ })
18447
+ ]
18448
+ }),
18449
+ baseClass: "",
18450
+ spacing: "medium"
18451
+ });
18452
+ var introConfig = {
18453
+ id: "block.intro",
18454
+ title: "Intro",
18455
+ category: "layout",
18456
+ includeContainerStyles: true,
18457
+ titleSource: "title",
18458
+ additionalFields: [
18459
+ {
18460
+ id: "title",
18461
+ type: "text",
18462
+ label: "Statement",
18463
+ required: false,
18464
+ multiline: true,
18465
+ maxLength: 160
18466
+ },
18467
+ {
18468
+ id: "body",
18469
+ type: "richText",
18470
+ label: "Text",
18471
+ required: true,
18472
+ ui: {
18473
+ richTextVariant: "limited"
18474
+ }
18475
+ },
18476
+ {
18477
+ id: "media",
18478
+ type: "media",
18479
+ label: "Media",
18480
+ required: false,
18481
+ mediaKinds: ["image"],
18482
+ ui: {
18483
+ intent: "content",
18484
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
18485
+ }
18486
+ },
18487
+ createImagePositionField({
18488
+ id: "imagePosition",
18489
+ label: "Image position",
18490
+ defaultValue: "left",
18491
+ uiIntent: "display",
18492
+ visibleWhen: { field: "variant", equals: "media-copy" }
18493
+ }),
18494
+ {
18495
+ id: "gap",
18496
+ type: "select",
18497
+ label: "Gap between media and text",
18498
+ required: false,
18499
+ defaultValue: "comfortable",
18500
+ multiple: false,
18501
+ options: [
18502
+ { value: "none", label: "None" },
18503
+ { value: "compact", label: "Compact" },
18504
+ { value: "cozy", label: "Cozy" },
18505
+ { value: "medium", label: "Medium" },
18506
+ { value: "comfortable", label: "Comfortable" },
18507
+ { value: "spacious", label: "Spacious" }
18508
+ ],
18509
+ ui: {
18510
+ intent: "display",
18511
+ visibleWhen: { field: "variant", equals: "media-copy" }
18512
+ }
18513
+ },
18514
+ createImageColSizeField({
18515
+ id: "ratio",
18516
+ label: "Media column size",
18517
+ defaultValue: "1/2",
18518
+ uiIntent: "display",
18519
+ visibleWhen: { field: "variant", equals: "media-copy" }
18520
+ }),
18521
+ createAspectRatioField({
18522
+ id: "aspectRatio",
18523
+ label: "Media aspect ratio",
18524
+ description: "Crop media to a consistent aspect ratio.",
18525
+ defaultValue: "auto",
18526
+ visibleWhen: { field: "media", notEquals: null }
18527
+ }),
18528
+ createCtasRepeater({
18529
+ label: "Calls to action",
18530
+ itemLabel: "CTA",
18531
+ maxItems: 2
16961
18532
  })
16962
18533
  ],
16963
- layout: classicLayout,
18534
+ layout: centeredCopyLayout,
16964
18535
  variants: {
16965
- classic: classicLayout,
16966
- micro: microLayout,
16967
- split: splitLayout,
16968
- splitReverse: splitReverseLayout
18536
+ "centered-copy": centeredCopyLayout,
18537
+ "statement-copy": statementCopyLayout,
18538
+ "statement-media": statementMediaLayout,
18539
+ "media-copy": mediaCopyLayout
16969
18540
  },
16970
- defaultVariant: "classic",
16971
- description: "Hero section with headline, subtitle, and repeatable CTAs.",
16972
- tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
16973
- icon: "Sparkles",
16974
- styleTokens: {
16975
- typography: "display",
16976
- spacing: "xl"
16977
- }
18541
+ defaultVariant: "statement-copy",
18542
+ variantOptions: {
18543
+ "centered-copy": {
18544
+ label: "Centered copy",
18545
+ description: "A focused intro with centered text and optional calls to action."
18546
+ },
18547
+ "statement-copy": {
18548
+ label: "Statement and copy",
18549
+ description: "A large statement on the left with supporting copy on the right."
18550
+ },
18551
+ "statement-media": {
18552
+ label: "Statement, copy and media",
18553
+ description: "A three-part intro with statement, copy and a small image."
18554
+ },
18555
+ "media-copy": {
18556
+ label: "Media and copy",
18557
+ description: "A compact media/text intro for softer transitions after a hero."
18558
+ }
18559
+ },
18560
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
18561
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
18562
+ icon: "PanelTopOpen"
16978
18563
  };
16979
- var heroManifest = createBlockManifest(heroConfig);
16980
- var heroBlockDefinition = {
16981
- manifest: heroManifest
18564
+ var introManifest = createBlockManifest(introConfig);
18565
+ var introBlockDefinition = {
18566
+ manifest: introManifest
16982
18567
  };
16983
18568
 
16984
18569
  // ../blocks/src/system/blocks/body-text.ts
@@ -17824,6 +19409,37 @@ var faqComposition = composeFragments([
17824
19409
  { fragment: faqHeadingFragment, fieldPriority: 0 },
17825
19410
  { fragment: faqAccordionFragment, fieldPriority: 1 }
17826
19411
  ]);
19412
+ function fragmentLayoutNode(layout) {
19413
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
19414
+ }
19415
+ function isNodeDefinitionArray(layout) {
19416
+ return Array.isArray(layout);
19417
+ }
19418
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19419
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19420
+ var defaultLayout = styledSection({
19421
+ children: styledContainer({
19422
+ baseClassName: "rb-relative rb-isolate",
19423
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
19424
+ }),
19425
+ baseClass: ""
19426
+ });
19427
+ var twoColumnLayout = styledSection({
19428
+ children: styledContainer({
19429
+ baseClassName: "rb-relative rb-isolate",
19430
+ children: el(
19431
+ "div",
19432
+ {
19433
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19434
+ },
19435
+ [
19436
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19437
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19438
+ ]
19439
+ )
19440
+ }),
19441
+ baseClass: ""
19442
+ });
17827
19443
  var faqManifest = createBlockManifest({
17828
19444
  id: "block.faq",
17829
19445
  title: "FAQ",
@@ -17840,13 +19456,22 @@ var faqManifest = createBlockManifest({
17840
19456
  label: "FAQ item styles"
17841
19457
  })
17842
19458
  ],
17843
- layout: styledSection({
17844
- children: styledContainer({
17845
- baseClassName: "rb-relative rb-isolate",
17846
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
17847
- }),
17848
- baseClass: ""
17849
- }),
19459
+ layout: defaultLayout,
19460
+ variants: {
19461
+ default: defaultLayout,
19462
+ "two-column": twoColumnLayout
19463
+ },
19464
+ defaultVariant: "default",
19465
+ variantOptions: {
19466
+ default: {
19467
+ label: "Default",
19468
+ description: "A centered heading above one FAQ accordion."
19469
+ },
19470
+ "two-column": {
19471
+ label: "Two column",
19472
+ description: "A left heading column with FAQ items on the right."
19473
+ }
19474
+ },
17850
19475
  description: "Accordion of frequently asked questions and answers.",
17851
19476
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
17852
19477
  icon: "HelpCircle"
@@ -18496,7 +20121,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
18496
20121
  function resolveHeaderVisualStyles(header, tokens) {
18497
20122
  const navContainerType = header?.navContainer?.type ?? "none";
18498
20123
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
18499
- if (hasContainedNav) {
20124
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
20125
+ if (hasContainedNav || hasTransparentVariant) {
18500
20126
  return {
18501
20127
  backgroundToken: "transparent",
18502
20128
  paletteHex: null,
@@ -18554,10 +20180,7 @@ var headerRootClassTransform = {
18554
20180
  const navContainerType = header?.navContainer?.type ?? "none";
18555
20181
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
18556
20182
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
18557
- const classes = [
18558
- config.base,
18559
- backgroundClass
18560
- ];
20183
+ const classes = [config.base, backgroundClass];
18561
20184
  if (!hasContainedNav) {
18562
20185
  if (config.blur) classes.push(config.blur);
18563
20186
  if (config.blurSupport) classes.push(config.blurSupport);
@@ -18572,7 +20195,12 @@ var headerRootClassTransform = {
18572
20195
  if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
18573
20196
  classes.push(config.shrink);
18574
20197
  }
18575
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
20198
+ const VALID_VARIANTS = [
20199
+ "classic",
20200
+ "centered",
20201
+ "transparent",
20202
+ "floating"
20203
+ ];
18576
20204
  const variant = header?.variant;
18577
20205
  if (variant && VALID_VARIANTS.includes(variant)) {
18578
20206
  classes.push(`header-variant-${variant}`);
@@ -18625,6 +20253,17 @@ var headerRootStyleTransform = {
18625
20253
  return mergeStyles(...styleParts);
18626
20254
  }
18627
20255
  };
20256
+ var headerSectionBackgroundTransform = {
20257
+ id: "layout.headerSectionBackground",
20258
+ kind: "string",
20259
+ summary: "Resolve the inner site-header section background token",
20260
+ run: (value) => {
20261
+ const header = asPartialObject(value);
20262
+ const navContainerType = header?.navContainer?.type ?? "none";
20263
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
20264
+ return usesTransparentRoot ? "raw:transparent" : "background";
20265
+ }
20266
+ };
18628
20267
  var footerRootStyleTransform = {
18629
20268
  id: "layout.footerRootStyle",
18630
20269
  kind: "formatter",
@@ -18883,6 +20522,7 @@ var layoutTransforms = [
18883
20522
  headerRootClassTransform,
18884
20523
  footerRootClassTransform,
18885
20524
  headerRootStyleTransform,
20525
+ headerSectionBackgroundTransform,
18886
20526
  footerRootStyleTransform,
18887
20527
  footerBottomBarClassTransform,
18888
20528
  footerBottomBarContainerClassTransform,
@@ -19178,15 +20818,21 @@ var mobileCta = ctaButton({
19178
20818
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
19179
20819
  {
19180
20820
  type: "div",
19181
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
20821
+ props: {
20822
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
20823
+ }
19182
20824
  },
19183
20825
  {
19184
20826
  type: "div",
19185
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
20827
+ props: {
20828
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
20829
+ }
19186
20830
  },
19187
20831
  {
19188
20832
  type: "div",
19189
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
20833
+ props: {
20834
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
20835
+ }
19190
20836
  }
19191
20837
  ]);
19192
20838
  var mobileToggleButton = {
@@ -19369,31 +21015,12 @@ var floatingLayout = inline(
19369
21015
  ],
19370
21016
  when("$root.theme.header.variant", { equals: "floating" })
19371
21017
  );
19372
- var editorialLayout = stack(
19373
- {
19374
- gap: "md",
19375
- align: "center",
19376
- className: bindProp("$root.theme.header.maxWidth", {
19377
- transforms: pipe(
19378
- tx("layout.maxWidthClass", {
19379
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
19380
- })
19381
- ),
19382
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
19383
- })
19384
- },
19385
- [
19386
- centeredLogoRow,
19387
- createNavRow(
19388
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
19389
- "center"
19390
- )
19391
- ],
19392
- when("$root.theme.header.variant", { equals: "editorial" })
19393
- );
19394
21018
  var headerLayout = headerSection(
19395
21019
  {
19396
- background: "background",
21020
+ background: bindProp("$root.theme.header", {
21021
+ transforms: pipe(tx("layout.headerSectionBackground")),
21022
+ fallback: "background"
21023
+ }),
19397
21024
  allowOverflow: true,
19398
21025
  className: bindProp("$root.theme.header", {
19399
21026
  transforms: pipe(tx("layout.headerRootClass")),
@@ -19401,10 +21028,7 @@ var headerLayout = headerSection(
19401
21028
  }),
19402
21029
  style: bindProp("$root.theme.header", {
19403
21030
  transforms: pipe(tx("layout.headerRootStyle")),
19404
- fallback: mergeStyles(
19405
- textColorStyle("text"),
19406
- borderColorStyle("border")
19407
- )
21031
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
19408
21032
  })
19409
21033
  },
19410
21034
  [
@@ -19413,7 +21037,6 @@ var headerLayout = headerSection(
19413
21037
  centeredLayout,
19414
21038
  transparentLayout,
19415
21039
  floatingLayout,
19416
- editorialLayout,
19417
21040
  mobileOverlay
19418
21041
  ],
19419
21042
  props({
@@ -20228,79 +21851,298 @@ var collectionLayout = styledSection({
20228
21851
  { gap: "md" }
20229
21852
  ),
20230
21853
  baseClass: "",
20231
- spacing: "comfortable"
21854
+ spacing: "comfortable"
21855
+ });
21856
+ var collectionManifest = createBlockManifest({
21857
+ id: "block.collection",
21858
+ title: "Collection",
21859
+ category: "layout",
21860
+ additionalFields: [
21861
+ parseFieldDefinition({
21862
+ id: "layout",
21863
+ type: "select",
21864
+ label: "Layout",
21865
+ defaultValue: "grid",
21866
+ options: [
21867
+ { value: "grid", label: "Grid" },
21868
+ { value: "stack", label: "Stack" }
21869
+ ],
21870
+ ui: { intent: "display" }
21871
+ }),
21872
+ parseFieldDefinition({
21873
+ id: "columns",
21874
+ type: "select",
21875
+ label: "Columns",
21876
+ description: "Number of columns in the grid layout.",
21877
+ defaultValue: "3",
21878
+ options: [
21879
+ { value: "2", label: "2 columns" },
21880
+ { value: "3", label: "3 columns" },
21881
+ { value: "4", label: "4 columns" }
21882
+ ],
21883
+ ui: {
21884
+ intent: "display",
21885
+ visibleWhen: { field: "layout", equals: "grid" }
21886
+ }
21887
+ }),
21888
+ parseFieldDefinition({
21889
+ id: "gap",
21890
+ type: "select",
21891
+ label: "Gap",
21892
+ defaultValue: "medium",
21893
+ options: [
21894
+ { value: "none", label: "None" },
21895
+ { value: "compact", label: "Compact" },
21896
+ { value: "cozy", label: "Cozy" },
21897
+ { value: "medium", label: "Medium" },
21898
+ { value: "comfortable", label: "Comfortable" },
21899
+ { value: "spacious", label: "Spacious" }
21900
+ ],
21901
+ ui: { intent: "display" }
21902
+ }),
21903
+ fragmentsToRepeaterField(
21904
+ "items",
21905
+ "Items",
21906
+ collectionFragments,
21907
+ {
21908
+ minItems: 0,
21909
+ maxItems: 50,
21910
+ itemLabel: "Item",
21911
+ description: "Add items to this collection."
21912
+ }
21913
+ ),
21914
+ cardStylesField({
21915
+ id: "_cardStyles",
21916
+ label: "Item styles"
21917
+ })
21918
+ ],
21919
+ layout: collectionLayout,
21920
+ description: "Repeat items in a grid or stack layout.",
21921
+ tags: ["collection", "grid", "stack", "repeater"],
21922
+ icon: "LayoutList",
21923
+ styleTokens: { spacing: "lg" }
21924
+ });
21925
+ var collectionBlockDefinition = {
21926
+ manifest: collectionManifest
21927
+ };
21928
+
21929
+ // ../blocks/src/system/blocks/feature-cards.ts
21930
+ function grid3(props2, children) {
21931
+ return el("grid", props2 ?? void 0, children ?? void 0);
21932
+ }
21933
+ var sectionHeading = stack(
21934
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
21935
+ [
21936
+ text(
21937
+ {
21938
+ as: "h2",
21939
+ className: "rb-feature-cards-title rb-text-center"
21940
+ },
21941
+ when("content.title"),
21942
+ bind("content.title")
21943
+ ),
21944
+ richText(
21945
+ {
21946
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
21947
+ style: textColorStyle("mutedText")
21948
+ },
21949
+ when("content.description"),
21950
+ bind("content.description")
21951
+ )
21952
+ ]
21953
+ );
21954
+ var featureCard = styledCard(
21955
+ [
21956
+ media(
21957
+ {
21958
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
21959
+ style: {
21960
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
21961
+ }
21962
+ },
21963
+ when("card.media"),
21964
+ bind("card.media")
21965
+ ),
21966
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
21967
+ text(
21968
+ {
21969
+ as: "h3",
21970
+ className: "rb-feature-card-title"
21971
+ },
21972
+ bind("card.title")
21973
+ ),
21974
+ richText(
21975
+ {
21976
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
21977
+ style: textColorStyle("mutedText")
21978
+ },
21979
+ when("card.body"),
21980
+ bind("card.body")
21981
+ ),
21982
+ ctaRow({
21983
+ collectionPath: "ctas",
21984
+ itemName: "cta",
21985
+ gap: "sm",
21986
+ justify: "start",
21987
+ containerClassName: "rb-mt-auto"
21988
+ })
21989
+ ])
21990
+ ],
21991
+ {
21992
+ stylesFrom: "content._cardStyles",
21993
+ backgroundFrom: "content._cardStyles.background",
21994
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
21995
+ },
21996
+ repeat("content.cards", "card")
21997
+ );
21998
+ var cardsLayout = styledSection({
21999
+ children: styledContainer({
22000
+ rootType: "stack",
22001
+ rootProps: { gap: "xl" },
22002
+ children: [
22003
+ sectionHeading,
22004
+ grid3(
22005
+ {
22006
+ cols: {
22007
+ $bind: {
22008
+ from: "content.columns",
22009
+ fallback: 3,
22010
+ coerce: "number"
22011
+ }
22012
+ },
22013
+ gap: "lg"
22014
+ },
22015
+ [featureCard]
22016
+ )
22017
+ ]
22018
+ }),
22019
+ baseClass: "",
22020
+ spacing: "medium"
20232
22021
  });
20233
- var collectionManifest = createBlockManifest({
20234
- id: "block.collection",
20235
- title: "Collection",
22022
+ var featureCardsConfig = {
22023
+ id: "block.feature-cards",
22024
+ title: "Feature Cards",
20236
22025
  category: "layout",
22026
+ includeContainerStyles: true,
22027
+ titleSource: "title",
20237
22028
  additionalFields: [
20238
- parseFieldDefinition({
20239
- id: "layout",
20240
- type: "select",
20241
- label: "Layout",
20242
- defaultValue: "grid",
20243
- options: [
20244
- { value: "grid", label: "Grid" },
20245
- { value: "stack", label: "Stack" }
20246
- ],
20247
- ui: { intent: "display" }
20248
- }),
20249
- parseFieldDefinition({
22029
+ {
22030
+ id: "title",
22031
+ type: "text",
22032
+ label: "Title",
22033
+ required: false,
22034
+ multiline: false,
22035
+ maxLength: 120
22036
+ },
22037
+ {
22038
+ id: "description",
22039
+ type: "richText",
22040
+ label: "Description",
22041
+ required: false,
22042
+ ui: {
22043
+ richTextVariant: "limited"
22044
+ }
22045
+ },
22046
+ {
20250
22047
  id: "columns",
20251
22048
  type: "select",
20252
22049
  label: "Columns",
20253
- description: "Number of columns in the grid layout.",
22050
+ required: false,
20254
22051
  defaultValue: "3",
22052
+ multiple: false,
20255
22053
  options: [
20256
22054
  { value: "2", label: "2 columns" },
20257
22055
  { value: "3", label: "3 columns" },
20258
22056
  { value: "4", label: "4 columns" }
20259
22057
  ],
20260
- ui: {
20261
- intent: "display",
20262
- visibleWhen: { field: "layout", equals: "grid" }
20263
- }
20264
- }),
20265
- parseFieldDefinition({
20266
- id: "gap",
20267
- type: "select",
20268
- label: "Gap",
20269
- defaultValue: "medium",
20270
- options: [
20271
- { value: "none", label: "None" },
20272
- { value: "compact", label: "Compact" },
20273
- { value: "cozy", label: "Cozy" },
20274
- { value: "medium", label: "Medium" },
20275
- { value: "comfortable", label: "Comfortable" },
20276
- { value: "spacious", label: "Spacious" }
20277
- ],
20278
22058
  ui: { intent: "display" }
20279
- }),
20280
- fragmentsToRepeaterField(
20281
- "items",
20282
- "Items",
20283
- collectionFragments,
20284
- {
20285
- minItems: 0,
20286
- maxItems: 50,
20287
- itemLabel: "Item",
20288
- description: "Add items to this collection."
22059
+ },
22060
+ {
22061
+ id: "cards",
22062
+ type: "repeater",
22063
+ label: "Cards",
22064
+ required: false,
22065
+ minItems: 1,
22066
+ maxItems: 8,
22067
+ itemLabel: "Card",
22068
+ itemLabelSource: "title",
22069
+ allowConversion: true,
22070
+ ui: {
22071
+ intent: "content"
22072
+ },
22073
+ schema: {
22074
+ fields: [
22075
+ {
22076
+ id: "media",
22077
+ type: "media",
22078
+ label: "Image",
22079
+ required: false,
22080
+ mediaKinds: ["image"]
22081
+ },
22082
+ createAspectRatioField({
22083
+ id: "aspectRatio",
22084
+ label: "Image aspect ratio",
22085
+ defaultValue: "4/3",
22086
+ visibleWhen: { field: "media", notEquals: null }
22087
+ }),
22088
+ {
22089
+ id: "title",
22090
+ type: "text",
22091
+ label: "Title",
22092
+ required: true,
22093
+ multiline: false,
22094
+ maxLength: 120
22095
+ },
22096
+ {
22097
+ id: "body",
22098
+ type: "richText",
22099
+ label: "Text",
22100
+ required: false,
22101
+ ui: {
22102
+ richTextVariant: "limited"
22103
+ }
22104
+ },
22105
+ createCtasRepeater({
22106
+ label: "Calls to action",
22107
+ itemLabel: "CTA",
22108
+ maxItems: 1,
22109
+ button: {
22110
+ variants: [
22111
+ { value: "primary", label: "Primary" },
22112
+ { value: "secondary", label: "Secondary" },
22113
+ { value: "outline", label: "Outline" },
22114
+ { value: "ghost", label: "Ghost" },
22115
+ { value: "link", label: "Link" }
22116
+ ],
22117
+ defaultVariant: "ghost"
22118
+ }
22119
+ })
22120
+ ]
20289
22121
  }
20290
- ),
22122
+ },
20291
22123
  cardStylesField({
20292
22124
  id: "_cardStyles",
20293
- label: "Item styles"
22125
+ label: "Card styles"
20294
22126
  })
20295
22127
  ],
20296
- layout: collectionLayout,
20297
- description: "Repeat items in a grid or stack layout.",
20298
- tags: ["collection", "grid", "stack", "repeater"],
20299
- icon: "LayoutList",
20300
- styleTokens: { spacing: "lg" }
20301
- });
20302
- var collectionBlockDefinition = {
20303
- manifest: collectionManifest
22128
+ layout: cardsLayout,
22129
+ variants: {
22130
+ cards: cardsLayout
22131
+ },
22132
+ defaultVariant: "cards",
22133
+ variantOptions: {
22134
+ cards: {
22135
+ label: "Cards",
22136
+ description: "A responsive grid of image cards with optional calls to action."
22137
+ }
22138
+ },
22139
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
22140
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
22141
+ icon: "PanelsTopLeft"
22142
+ };
22143
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
22144
+ var featureCardsBlockDefinition = {
22145
+ manifest: featureCardsManifest
20304
22146
  };
20305
22147
 
20306
22148
  // ../blocks/src/system/fields/carousel.ts
@@ -20388,69 +22230,6 @@ function createCarouselBehaviorFields(options = {}) {
20388
22230
  return fields3;
20389
22231
  }
20390
22232
 
20391
- // ../blocks/src/system/fields/imageLayout.ts
20392
- function createImageColSizeField(options = {}) {
20393
- const {
20394
- id = "imageColSize",
20395
- label = "Image column size",
20396
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
20397
- defaultValue = "1/3",
20398
- uiIntent = "display",
20399
- visibleWhen
20400
- } = options;
20401
- return {
20402
- id,
20403
- type: "select",
20404
- label,
20405
- description,
20406
- required: false,
20407
- defaultValue,
20408
- multiple: false,
20409
- options: [
20410
- { value: "1/4", label: "Small (1/4)" },
20411
- { value: "1/3", label: "Medium (1/3)" },
20412
- { value: "2/5", label: "Large (2/5)" },
20413
- { value: "1/2", label: "Extra large (1/2)" },
20414
- { value: "2/3", label: "Huge (2/3)" }
20415
- ],
20416
- ui: {
20417
- intent: uiIntent,
20418
- ...visibleWhen ? { visibleWhen } : {}
20419
- }
20420
- };
20421
- }
20422
- function createImagePositionField(options = {}) {
20423
- const {
20424
- id = "imagePosition",
20425
- label = "Image position",
20426
- description = "Choose which side the image appears on.",
20427
- defaultValue = "left",
20428
- includeAlternate = false,
20429
- uiIntent = "display",
20430
- visibleWhen
20431
- } = options;
20432
- const positionOptions = [
20433
- { value: "left", label: "Left" },
20434
- { value: "right", label: "Right" },
20435
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
20436
- ];
20437
- return {
20438
- id,
20439
- type: "select",
20440
- label,
20441
- description,
20442
- required: false,
20443
- defaultValue,
20444
- multiple: false,
20445
- // Spread to get a mutable array type without unsafe casts.
20446
- options: [...positionOptions],
20447
- ui: {
20448
- intent: uiIntent,
20449
- ...visibleWhen ? { visibleWhen } : {}
20450
- }
20451
- };
20452
- }
20453
-
20454
22233
  // ../blocks/src/system/blocks/media-text.ts
20455
22234
  var mediaTextFrameCapability = defineFrameCapability([
20456
22235
  "plain",
@@ -20574,26 +22353,13 @@ var mediaTextManifest = createBlockManifest({
20574
22353
  },
20575
22354
  ui: { intent: "behavior" }
20576
22355
  }),
20577
- {
22356
+ createAspectRatioField({
20578
22357
  id: "aspectRatio",
20579
- type: "select",
20580
22358
  label: "Media aspect ratio",
20581
22359
  description: "Crop media to a consistent aspect ratio.",
20582
- required: false,
20583
22360
  defaultValue: "auto",
20584
- multiple: false,
20585
- options: [
20586
- { value: "auto", label: "Auto (original)" },
20587
- { value: "16/9", label: "16:9 (Landscape)" },
20588
- { value: "4/3", label: "4:3 (Standard)" },
20589
- { value: "1/1", label: "1:1 (Square)" },
20590
- { value: "3/4", label: "3:4 (Portrait)" }
20591
- ],
20592
- ui: {
20593
- intent: "display",
20594
- visibleWhen: { field: "images", notEquals: null }
20595
- }
20596
- },
22361
+ visibleWhen: { field: "images", notEquals: null }
22362
+ }),
20597
22363
  {
20598
22364
  id: "text",
20599
22365
  type: "richText",
@@ -20723,7 +22489,7 @@ var mediaTextManifest = createBlockManifest({
20723
22489
  whenImagesLength(0)
20724
22490
  );
20725
22491
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
20726
- const defaultLayout = styledSection({
22492
+ const defaultLayout2 = styledSection({
20727
22493
  children: styledContainer({
20728
22494
  rootType: "stack",
20729
22495
  rootProps: { gap: "lg" },
@@ -20755,9 +22521,9 @@ var mediaTextManifest = createBlockManifest({
20755
22521
  spacing: "medium"
20756
22522
  });
20757
22523
  return {
20758
- layout: defaultLayout,
22524
+ layout: defaultLayout2,
20759
22525
  variants: {
20760
- default: defaultLayout
22526
+ default: defaultLayout2
20761
22527
  },
20762
22528
  defaultVariant: "default",
20763
22529
  variantOptions: {
@@ -24157,7 +25923,7 @@ var embedBlockDefinition = {
24157
25923
  };
24158
25924
 
24159
25925
  // ../blocks/src/system/blocks/image-gallery.ts
24160
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
25926
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24161
25927
  var galleryContainer = (children, opts) => {
24162
25928
  const gap = opts?.gap ?? "md";
24163
25929
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -24237,7 +26003,7 @@ var galleryItem = (options) => stack(
24237
26003
  ],
24238
26004
  repeat("content.images", "item")
24239
26005
  );
24240
- var gridLayout3 = grid3(
26006
+ var gridLayout3 = grid4(
24241
26007
  {
24242
26008
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
24243
26009
  },
@@ -24840,7 +26606,7 @@ var imageGalleryBlockDefinition = {
24840
26606
  };
24841
26607
 
24842
26608
  // ../blocks/src/system/blocks/video-grid.ts
24843
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
26609
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24844
26610
  var videoItem = (options) => stack(
24845
26611
  { gap: "xs", className: options.containerClassName },
24846
26612
  [
@@ -24890,7 +26656,7 @@ var gridColumnsClass = (columns) => {
24890
26656
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
24891
26657
  }
24892
26658
  };
24893
- var createGridLayout = (columns) => grid4(
26659
+ var createGridLayout = (columns) => grid5(
24894
26660
  {
24895
26661
  className: gridColumnsClass(columns)
24896
26662
  },
@@ -28054,6 +29820,40 @@ var systemBlockDefinitionsRaw = [
28054
29820
  })
28055
29821
  ]
28056
29822
  })),
29823
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
29824
+ sectionSurfaces: "supported",
29825
+ contentFrames: ["plain", "panel"],
29826
+ itemSurfaces: "unsupported",
29827
+ headingDecorations: ["organic-squiggle"]
29828
+ }), defineBlockDesignMetadata({
29829
+ flow: bodyFlow,
29830
+ layoutProfiles: [
29831
+ layoutProfile({
29832
+ variantKey: "centered-copy",
29833
+ family: "centered",
29834
+ weight: "featured",
29835
+ bias: "soft"
29836
+ }),
29837
+ layoutProfile({
29838
+ variantKey: "statement-copy",
29839
+ family: "split",
29840
+ weight: "featured",
29841
+ bias: "merge"
29842
+ }),
29843
+ layoutProfile({
29844
+ variantKey: "statement-media",
29845
+ family: "media-text",
29846
+ weight: "featured",
29847
+ bias: "soft"
29848
+ }),
29849
+ layoutProfile({
29850
+ variantKey: "media-copy",
29851
+ family: "media-text",
29852
+ weight: "featured",
29853
+ bias: "soft"
29854
+ })
29855
+ ]
29856
+ })),
28057
29857
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
28058
29858
  flow: bodyFlow,
28059
29859
  layoutProfiles: [
@@ -28114,9 +29914,17 @@ var systemBlockDefinitionsRaw = [
28114
29914
  flow: conversionFlow,
28115
29915
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
28116
29916
  })),
28117
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
29917
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
29918
+ sectionSurfaces: "supported",
29919
+ contentFrames: ["plain", "panel"],
29920
+ itemSurfaces: "supported",
29921
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
29922
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
28118
29923
  flow: bodyFlow,
28119
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29924
+ layoutProfiles: [
29925
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29926
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
29927
+ ]
28120
29928
  })),
28121
29929
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
28122
29930
  flow: siteChromeFlow,
@@ -28130,7 +29938,8 @@ var systemBlockDefinitionsRaw = [
28130
29938
  sectionSurfaces: "supported",
28131
29939
  contentFrames: ["plain", "panel"],
28132
29940
  itemSurfaces: "supported",
28133
- testimonialCardTreatments: ["default", "accent-quote"]
29941
+ testimonialCardTreatments: ["default", "accent-quote"],
29942
+ headingDecorations: ["short-center-rule"]
28134
29943
  }), defineBlockDesignMetadata({
28135
29944
  flow: proofFlow,
28136
29945
  layoutProfiles: [
@@ -28156,6 +29965,22 @@ var systemBlockDefinitionsRaw = [
28156
29965
  flow: offeringsFlow,
28157
29966
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
28158
29967
  })),
29968
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
29969
+ sectionSurfaces: "supported",
29970
+ contentFrames: ["plain", "panel"],
29971
+ itemSurfaces: "supported",
29972
+ headingDecorations: ["short-center-rule"]
29973
+ }), defineBlockDesignMetadata({
29974
+ flow: offeringsFlow,
29975
+ layoutProfiles: [
29976
+ layoutProfile({
29977
+ variantKey: "cards",
29978
+ family: "grid",
29979
+ weight: "standard",
29980
+ bias: "soft"
29981
+ })
29982
+ ]
29983
+ })),
28159
29984
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
28160
29985
  flow: mediaFlow,
28161
29986
  layoutProfiles: [
@@ -31767,8 +33592,10 @@ import { z as z66 } from "zod";
31767
33592
  var SYSTEM_BLOCK_KINDS = [
31768
33593
  // Layout blocks
31769
33594
  "block.hero",
33595
+ "block.intro",
31770
33596
  "block.columns",
31771
33597
  "block.collection",
33598
+ "block.feature-cards",
31772
33599
  "block.media-text",
31773
33600
  "block.cta-full",
31774
33601
  "block.single-button",