@riverbankcms/sdk 0.76.0 → 0.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/{PreviewEditorSidebar-X2HWXFOL.mjs → PreviewEditorSidebar-XSX7QKHQ.mjs} +1019 -442
  2. package/dist/{PreviewEditorUI-AQXIXPOH.mjs → PreviewEditorUI-YZNEZ3QD.mjs} +2 -2
  3. package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +528 -20
  5. package/dist/_dts/api/src/contentRuntime.d.ts +5 -0
  6. package/dist/_dts/api/src/siteAssets.d.ts +1 -0
  7. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +26 -2
  8. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +28 -0
  9. package/dist/_dts/block-form/src/client/index.d.ts +2 -2
  10. package/dist/_dts/block-form/src/index.d.ts +2 -1
  11. package/dist/_dts/block-form/src/widgets/DateField/dateFieldSchema.d.ts +1 -1
  12. package/dist/_dts/block-form/src/widgets/DateTimeField/dateTimeFieldSchema.d.ts +1 -1
  13. package/dist/_dts/block-form/src/widgets/TimeField/timeFieldSchema.d.ts +1 -1
  14. package/dist/_dts/blocks/src/PageRenderer.d.ts +10 -10
  15. package/dist/_dts/blocks/src/client/site-chrome.d.ts +22 -0
  16. package/dist/_dts/blocks/src/customBlockRegistry.d.ts +38 -0
  17. package/dist/_dts/blocks/src/index.d.ts +2 -0
  18. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +20 -2
  19. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +25 -0
  20. package/dist/_dts/blocks/src/system/blocks/index.d.ts +2 -0
  21. package/dist/_dts/blocks/src/system/blocks/intro.d.ts +24 -0
  22. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -34
  23. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  24. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +30 -0
  25. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -1
  26. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +7 -0
  27. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +11 -2
  28. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  29. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.d.ts +2 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.server.d.ts +2 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/accordionIconTreatment.d.ts +5 -0
  32. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +1 -0
  33. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  34. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -0
  35. package/dist/_dts/content-editor/src/hooks/blockDraftLifecycle.d.ts +48 -0
  36. package/dist/_dts/content-editor/src/hooks/invalidBlockSelectors.d.ts +4 -0
  37. package/dist/_dts/content-editor/src/hooks/publishability.d.ts +47 -0
  38. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  39. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -0
  40. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +2 -1
  41. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -1
  42. package/dist/_dts/editor-blocks/src/block-editor/customBlockRegistry.d.ts +2 -0
  43. package/dist/_dts/editor-blocks/src/block-editor/sdkBlockMerger.d.ts +9 -37
  44. package/dist/_dts/editor-blocks/src/index.d.ts +2 -2
  45. package/dist/_dts/preview-next/src/client/index.d.ts +3 -0
  46. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +5 -1
  47. package/dist/_dts/preview-next/src/client/preview/PreviewDesignCoordinatorContext.d.ts +20 -0
  48. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +7 -2
  49. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +7 -2
  50. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  51. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -0
  52. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +20 -3
  53. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +6 -1
  54. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +14 -4
  55. package/dist/_dts/preview-next/src/client/preview/previewDesignCoordinator.d.ts +73 -0
  56. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +12 -4
  57. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +46 -0
  58. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +6 -1
  59. package/dist/_dts/preview-next/src/client/preview/typographySelectionInput.d.ts +14 -0
  60. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewModeRuntime.d.ts +1 -1
  61. package/dist/_dts/sdk/src/cli/commands/style.d.ts +8 -0
  62. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -1
  63. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  64. package/dist/_dts/sdk/src/client.d.ts +1 -1
  65. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +35 -0
  66. package/dist/_dts/sdk/src/index.d.ts +2 -1
  67. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -0
  68. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  69. package/dist/_dts/sdk/src/version.d.ts +1 -1
  70. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  71. package/dist/_dts/theme-core/src/buttons/personalities/earth-pill.d.ts +16 -0
  72. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  73. package/dist/_dts/theme-core/src/fonts/types.d.ts +1 -1
  74. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +45 -0
  75. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  76. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +16 -0
  77. package/dist/_dts/theme-core/src/schema.d.ts +280 -0
  78. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +81 -0
  79. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +6 -4
  80. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +81 -0
  81. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +118 -2
  82. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +13 -0
  83. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  84. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +364 -5
  85. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +6 -0
  86. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  87. package/dist/_dts/theme-core/src/site-styles/persistedIdParseResult.d.ts +9 -0
  88. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +20 -4
  89. package/dist/_dts/theme-core/src/site-styles/types.d.ts +74 -2
  90. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +189 -0
  91. package/dist/{chunk-Z7JLNTJR.mjs → chunk-6SMUFTXD.mjs} +2 -1
  92. package/dist/{chunk-V5VORNEJ.mjs → chunk-ANKDYZ2E.mjs} +1 -1
  93. package/dist/{chunk-Q4OLG66B.mjs → chunk-EAWHBECW.mjs} +476 -153
  94. package/dist/{chunk-TW2Y4RR5.mjs → chunk-GSQX43EZ.mjs} +383 -51
  95. package/dist/{chunk-LYI7TEMH.mjs → chunk-WLQBJN2Z.mjs} +3096 -354
  96. package/dist/cli/index.mjs +2023 -181
  97. package/dist/client/{accordion-2YHIBOZH.mjs → accordion-RZMQSYLR.mjs} +1 -1
  98. package/dist/client/{bookingForm-35IBDWAS.mjs → bookingForm-NF4ASVNV.mjs} +2 -2
  99. package/dist/client/bookings.mjs +92 -0
  100. package/dist/client/{carousel-K6XG7NZQ.mjs → carousel-LDX47ZIK.mjs} +1 -1
  101. package/dist/client/{cart-HCFYUTTU.mjs → cart-RGXDS5F4.mjs} +3 -3
  102. package/dist/client/{checkout-J3U4XR7K.mjs → checkout-P7WWSNNY.mjs} +3 -3
  103. package/dist/client/{chunk-BOIHIU7E.mjs → chunk-E2TDNXCL.mjs} +1 -1
  104. package/dist/client/{chunk-PFBX3IQL.mjs → chunk-GMVTOKYG.mjs} +2 -2
  105. package/dist/client/{chunk-FGUIVT2B.mjs → chunk-JNC7CGHX.mjs} +1 -1
  106. package/dist/client/{chunk-SNSWVZEP.mjs → chunk-L3DNHIJX.mjs} +3 -3
  107. package/dist/client/{chunk-7UOSCYY4.mjs → chunk-R56FQ3RR.mjs} +92 -0
  108. package/dist/client/{chunk-J227A3CQ.mjs → chunk-UFSWADAO.mjs} +1 -1
  109. package/dist/client/client.mjs +2134 -228
  110. package/dist/client/{courseRegistration-ZBXS7VGI.mjs → courseRegistration-7F65K5ZR.mjs} +2 -2
  111. package/dist/client/{eventCalendar-EQQZHJBA.mjs → eventCalendar-GLSC5KTL.mjs} +4 -4
  112. package/dist/client/{eventCombined-JCFTGBFQ.mjs → eventCombined-ZHK4WKUR.mjs} +4 -4
  113. package/dist/client/{eventDetails-HLUTQSYY.mjs → eventDetails-E3PJYBIN.mjs} +4 -4
  114. package/dist/client/{eventListing-FG4MICVB.mjs → eventListing-EMS3WC3E.mjs} +4 -4
  115. package/dist/client/{eventRegistration-GUEB7LBT.mjs → eventRegistration-NZOTVNPI.mjs} +4 -4
  116. package/dist/client/{form-YQEW4YIT.mjs → form-ETFZFATW.mjs} +1 -1
  117. package/dist/client/{headerSection-GTR3TTRM.mjs → headerSection-4LBP7ULT.mjs} +2 -2
  118. package/dist/client/hooks.mjs +1918 -293
  119. package/dist/client/{locationMap-SPC7VGUH.mjs → locationMap-5M655YSJ.mjs} +1 -1
  120. package/dist/client/{newsletterForm-4IW5BLID.mjs → newsletterForm-QOUYW44O.mjs} +1 -1
  121. package/dist/client/{productDetail-KP5H2WJO.mjs → productDetail-O4DOCWQG.mjs} +3 -3
  122. package/dist/client/{productList-3M3M72XZ.mjs → productList-A5RO5WIS.mjs} +3 -3
  123. package/dist/client/rendering/client.mjs +198 -32
  124. package/dist/client/rendering/islands.mjs +18 -18
  125. package/dist/client/rendering.mjs +2095 -208
  126. package/dist/client/{shop-ACQKVGOM.mjs → shop-L4MZH4I2.mjs} +3 -3
  127. package/dist/preview-next/client/runtime.mjs +4 -4
  128. package/dist/{sdk-runtime-K7HNB4U2.mjs → sdk-runtime-Q6MTR4KL.mjs} +5 -5
  129. package/dist/server/components.mjs +2046 -204
  130. package/dist/server/config-validation.mjs +1921 -293
  131. package/dist/server/config.mjs +1921 -293
  132. package/dist/server/data.mjs +1918 -293
  133. package/dist/server/index.mjs +31 -2
  134. package/dist/server/next.mjs +2067 -206
  135. package/dist/server/page-converter.mjs +1894 -281
  136. package/dist/server/prebuild.mjs +1 -1
  137. package/dist/server/rendering/server.mjs +2046 -204
  138. package/dist/server/rendering.mjs +2046 -204
  139. package/dist/server/routing.mjs +1963 -275
  140. package/dist/server/server.mjs +1932 -288
  141. package/dist/server/theme-bridge.mjs +158 -1
  142. package/dist/server/theme.mjs +158 -1
  143. package/package.json +1 -1
  144. package/dist/SdkPreviewModeRuntime-ZQNDCASH.mjs +0 -8
@@ -7460,6 +7460,47 @@ var eyebrowTreatmentValues = [
7460
7460
  "pill-bounce",
7461
7461
  "accent-pill-bounce"
7462
7462
  ];
7463
+ var visibleHeadingDecorationFamilyValues = [
7464
+ "organic-squiggle",
7465
+ "short-center-rule"
7466
+ ];
7467
+ var visibleHeadingDecorationPlacementValues = [
7468
+ "after-heading",
7469
+ "between-heading-and-body",
7470
+ "under-centered-heading"
7471
+ ];
7472
+ var headingDecorationOverrideValues = [
7473
+ "site-default",
7474
+ "on",
7475
+ "off"
7476
+ ];
7477
+ var headingDecorationColorTokenValues = [
7478
+ "text",
7479
+ "primary",
7480
+ "secondary",
7481
+ "accent",
7482
+ "border",
7483
+ "muted"
7484
+ ];
7485
+ var accordionIconSetValues = [
7486
+ "plus",
7487
+ "chevron",
7488
+ "caret",
7489
+ "minimal-cross"
7490
+ ];
7491
+ var accordionIconColorTokenValues = [
7492
+ "text",
7493
+ "muted",
7494
+ "primary",
7495
+ "secondary",
7496
+ "accent",
7497
+ "current"
7498
+ ];
7499
+ var accordionIconMotionValues = [
7500
+ "none",
7501
+ "rotate",
7502
+ "swap"
7503
+ ];
7463
7504
  function defineBlockDesignCapability(capability) {
7464
7505
  return {
7465
7506
  ...capability,
@@ -7469,7 +7510,9 @@ function defineBlockDesignCapability(capability) {
7469
7510
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7470
7511
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7471
7512
  tileTreatments: capability.tileTreatments ?? ["default"],
7472
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7513
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7514
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7515
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
7473
7516
  };
7474
7517
  }
7475
7518
 
@@ -7660,6 +7703,25 @@ var blockAppearancePresets = [
7660
7703
  emphasis: "high"
7661
7704
  }
7662
7705
  }),
7706
+ defineBlockAppearancePreset({
7707
+ kind: "block-design",
7708
+ id: "intro-soft-earth-statement",
7709
+ target: "intro",
7710
+ label: "Soft Earth intro statement",
7711
+ blockKinds: ["block.intro"],
7712
+ design: {
7713
+ sectionSurface: "base",
7714
+ contentFrame: plainFrame,
7715
+ itemSurface: "none",
7716
+ transitionAfter: "soft-fade-short",
7717
+ emphasis: "high",
7718
+ headingDecoration: {
7719
+ family: "organic-squiggle",
7720
+ placement: "after-heading",
7721
+ colorToken: "primary"
7722
+ }
7723
+ }
7724
+ }),
7663
7725
  defineBlockAppearancePreset({
7664
7726
  kind: "block-design",
7665
7727
  id: "offerings-calm-list",
@@ -7674,6 +7736,25 @@ var blockAppearancePresets = [
7674
7736
  emphasis: "medium"
7675
7737
  }
7676
7738
  }),
7739
+ defineBlockAppearancePreset({
7740
+ kind: "block-design",
7741
+ id: "feature-cards-soft-earth-offerings",
7742
+ target: "feature-cards",
7743
+ label: "Soft Earth offering cards",
7744
+ blockKinds: ["block.feature-cards"],
7745
+ design: {
7746
+ sectionSurface: "base",
7747
+ contentFrame: plainFrame,
7748
+ itemSurface: "raised",
7749
+ transitionAfter: "none",
7750
+ emphasis: "high",
7751
+ headingDecoration: {
7752
+ family: "short-center-rule",
7753
+ placement: "under-centered-heading",
7754
+ colorToken: "primary"
7755
+ }
7756
+ }
7757
+ }),
7677
7758
  defineBlockAppearancePreset({
7678
7759
  kind: "block-design",
7679
7760
  id: "events-base-calendar",
@@ -7802,6 +7883,26 @@ var blockAppearancePresets = [
7802
7883
  testimonialCardTreatment: "accent-quote"
7803
7884
  }
7804
7885
  }),
7886
+ defineBlockAppearancePreset({
7887
+ kind: "block-design",
7888
+ id: "testimonials-soft-earth-proof-band",
7889
+ target: "testimonials",
7890
+ label: "Soft Earth proof band",
7891
+ blockKinds: ["block.testimonials"],
7892
+ design: {
7893
+ sectionSurface: "brand-depth-band",
7894
+ contentFrame: plainFrame,
7895
+ itemSurface: "none",
7896
+ transitionAfter: "soft-fade-short",
7897
+ emphasis: "high",
7898
+ testimonialCardTreatment: "accent-quote",
7899
+ headingDecoration: {
7900
+ family: "short-center-rule",
7901
+ placement: "under-centered-heading",
7902
+ colorToken: "border"
7903
+ }
7904
+ }
7905
+ }),
7805
7906
  defineBlockAppearancePreset({
7806
7907
  kind: "block-design",
7807
7908
  id: "faq-base-accordion",
@@ -7830,6 +7931,25 @@ var blockAppearancePresets = [
7830
7931
  emphasis: "low"
7831
7932
  }
7832
7933
  }),
7934
+ defineBlockAppearancePreset({
7935
+ kind: "block-design",
7936
+ id: "faq-soft-earth-two-column",
7937
+ target: "faq",
7938
+ label: "Soft Earth two-column FAQ",
7939
+ blockKinds: ["block.faq"],
7940
+ design: {
7941
+ sectionSurface: "base",
7942
+ contentFrame: plainFrame,
7943
+ itemSurface: "flat",
7944
+ transitionAfter: "none",
7945
+ emphasis: "medium",
7946
+ accordionIconTreatment: {
7947
+ iconSet: "plus",
7948
+ colorToken: "primary",
7949
+ motion: "swap"
7950
+ }
7951
+ }
7952
+ }),
7833
7953
  defineBlockAppearancePreset({
7834
7954
  kind: "block-design",
7835
7955
  id: "contact-form-panel",
@@ -8515,6 +8635,97 @@ var confidentChip = defineButtonPersonality({
8515
8635
  }
8516
8636
  });
8517
8637
 
8638
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
8639
+ var earthPill = defineButtonPersonality({
8640
+ id: "earth-pill",
8641
+ name: "Earth Pill",
8642
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
8643
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
8644
+ buttonSystem: {
8645
+ global: {
8646
+ cornerStyle: "pill",
8647
+ shadow: "low",
8648
+ textTransform: "none",
8649
+ fontWeight: 500,
8650
+ borderWidth: 1,
8651
+ hoverTransform: "lift",
8652
+ hoverColor: "none",
8653
+ typography: "body",
8654
+ paddingPreset: "default"
8655
+ },
8656
+ sizes: {
8657
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
8658
+ md: { padding: "0.625rem 1.35rem" },
8659
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
8660
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
8661
+ },
8662
+ variants: [
8663
+ {
8664
+ id: "primary",
8665
+ name: "Primary",
8666
+ enabled: true,
8667
+ priority: 1,
8668
+ background: { type: "solid", colorToken: "primary" },
8669
+ textColorToken: "primaryForeground",
8670
+ borderRadius: "rounded-full",
8671
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8672
+ effects: {
8673
+ hover: [
8674
+ { effectId: "lift", options: { translateY: "-1px" } },
8675
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
8676
+ ],
8677
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8678
+ }
8679
+ },
8680
+ {
8681
+ id: "secondary",
8682
+ name: "Secondary",
8683
+ enabled: true,
8684
+ priority: 2,
8685
+ background: { type: "transparent" },
8686
+ textColorToken: "primary",
8687
+ borderRadius: "rounded-full",
8688
+ border: { widthClass: "border", colorToken: "primary" },
8689
+ effects: {
8690
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
8691
+ }
8692
+ },
8693
+ {
8694
+ id: "outline",
8695
+ name: "Outline",
8696
+ enabled: true,
8697
+ priority: 3,
8698
+ background: { type: "transparent" },
8699
+ textColorToken: "text",
8700
+ borderRadius: "rounded-full",
8701
+ border: { widthClass: "border", colorToken: "border" },
8702
+ effects: {
8703
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
8704
+ }
8705
+ },
8706
+ {
8707
+ id: "ghost",
8708
+ name: "Ghost",
8709
+ enabled: true,
8710
+ priority: 3,
8711
+ background: { type: "transparent" },
8712
+ textColorToken: "primary",
8713
+ borderRadius: "rounded-full",
8714
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8715
+ sizes: {
8716
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
8717
+ md: { padding: "0.375rem 0" },
8718
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
8719
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
8720
+ },
8721
+ effects: {
8722
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
8723
+ }
8724
+ }
8725
+ ]
8726
+ }
8727
+ });
8728
+
8518
8729
  // ../theme-core/src/buttons/personalities/editorial-link.ts
8519
8730
  var editorialLink = defineButtonPersonality({
8520
8731
  id: "editorial-link",
@@ -8973,6 +9184,7 @@ var softPill = defineButtonPersonality({
8973
9184
  // ../theme-core/src/buttons/personalities/index.ts
8974
9185
  var buttonPersonalities = [
8975
9186
  softPill,
9187
+ earthPill,
8976
9188
  confidentChip,
8977
9189
  editorialLink,
8978
9190
  pebble,
@@ -9648,12 +9860,36 @@ var boxBackgroundSchema = z21.object({
9648
9860
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
9649
9861
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
9650
9862
  });
9863
+ var noHeadingDecorationSchema = z21.object({
9864
+ family: z21.literal("none"),
9865
+ placement: z21.literal("none")
9866
+ });
9867
+ var visibleHeadingDecorationSchema = z21.object({
9868
+ family: z21.enum(visibleHeadingDecorationFamilyValues),
9869
+ placement: z21.enum(visibleHeadingDecorationPlacementValues),
9870
+ colorToken: z21.enum(headingDecorationColorTokenValues).optional()
9871
+ });
9872
+ var headingDecorationSchema = z21.union([
9873
+ noHeadingDecorationSchema,
9874
+ visibleHeadingDecorationSchema
9875
+ ]);
9876
+ var accordionIconTreatmentSchema = z21.object({
9877
+ iconSet: z21.enum(accordionIconSetValues),
9878
+ colorToken: z21.enum(accordionIconColorTokenValues),
9879
+ openColorToken: z21.enum(accordionIconColorTokenValues).optional(),
9880
+ motion: z21.enum(accordionIconMotionValues)
9881
+ });
9651
9882
  var sectionStylesOverrideSchema = z21.object({
9652
9883
  background: boxBackgroundSchema.nullable().optional(),
9653
9884
  spacing: semanticSpacingSchema.nullable().optional(),
9654
9885
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
9655
9886
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
9656
- eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional()
9887
+ eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
9888
+ headingDecoration: headingDecorationSchema.nullable().optional(),
9889
+ // Author-level override consumed by later block/editor rendering phases.
9890
+ // Keeping it in section styles lets existing block save APIs persist it.
9891
+ headingDecorationOverride: z21.enum(headingDecorationOverrideValues).nullable().optional(),
9892
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
9657
9893
  });
9658
9894
  var containerStylesOverrideSchema = z21.object({
9659
9895
  background: boxBackgroundSchema.nullable().optional(),
@@ -10361,6 +10597,28 @@ var warmNeutralCream = definePaletteVariant({
10361
10597
  { name: "border", hex: "#e0d2b8" }
10362
10598
  ]
10363
10599
  });
10600
+ var warmNeutralSoftEarth = definePaletteVariant({
10601
+ id: "warm-neutral-soft-earth",
10602
+ name: "Warm Neutral \u2014 Soft Earth",
10603
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
10604
+ tags: { tone: "classic", energy: "calm", era: "organic" },
10605
+ mode: "light",
10606
+ colors: [
10607
+ { name: "primary", hex: "#a8573d" },
10608
+ { name: "secondary", hex: "#72765c" },
10609
+ { name: "accent", hex: "#c87557" },
10610
+ { name: "success", hex: "#687854" },
10611
+ { name: "warning", hex: "#b7863e" },
10612
+ { name: "destructive", hex: "#a54b3c" },
10613
+ { name: "background", hex: "#fbf6eb" },
10614
+ { name: "surface", hex: "#fffdf7" },
10615
+ { name: "surfaceAlt", hex: "#f0e4d3" },
10616
+ { name: "muted", hex: "#eadbc6" },
10617
+ { name: "text", hex: "#30281f" },
10618
+ { name: "primaryForeground", hex: "#fffaf3" },
10619
+ { name: "border", hex: "#d9c8b2" }
10620
+ ]
10621
+ });
10364
10622
  var warmNeutralForest = definePaletteVariant({
10365
10623
  id: "warm-neutral-forest",
10366
10624
  name: "Warm Neutral \u2014 Forest",
@@ -10394,6 +10652,7 @@ var paletteVariants = [
10394
10652
  // Warm-neutral family
10395
10653
  warmNeutralClay,
10396
10654
  warmNeutralCream,
10655
+ warmNeutralSoftEarth,
10397
10656
  warmNeutralForest,
10398
10657
  // High-contrast family
10399
10658
  highContrastInk,
@@ -10412,6 +10671,12 @@ var paletteVariantsById = new Map(
10412
10671
  function asHeaderLookId(value) {
10413
10672
  return value;
10414
10673
  }
10674
+ function asHeaderLayoutId(value) {
10675
+ return value;
10676
+ }
10677
+ function asHeaderStyleId(value) {
10678
+ return value;
10679
+ }
10415
10680
  function baseHeader(theme) {
10416
10681
  const {
10417
10682
  navLinkStyle: _navLinkStyle,
@@ -10430,6 +10695,309 @@ function baseHeader(theme) {
10430
10695
  navContainer: { type: "none", tint: null, opacity: 0.15 }
10431
10696
  };
10432
10697
  }
10698
+ var headerLayoutCatalog = [
10699
+ {
10700
+ id: asHeaderLayoutId("classic"),
10701
+ label: "Classic",
10702
+ description: "Logo and navigation in one practical horizontal row.",
10703
+ structure: "inline-classic",
10704
+ variant: "classic",
10705
+ defaultPositioning: "sticky",
10706
+ shrinkOnScroll: false
10707
+ },
10708
+ {
10709
+ id: asHeaderLayoutId("centered"),
10710
+ label: "Centered",
10711
+ description: "Logo centered above a balanced navigation row.",
10712
+ structure: "centered-stack",
10713
+ variant: "centered",
10714
+ defaultPositioning: "static",
10715
+ shrinkOnScroll: false,
10716
+ maxRecommendedNavItems: 5,
10717
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
10718
+ },
10719
+ {
10720
+ id: asHeaderLayoutId("editorial"),
10721
+ label: "Editorial",
10722
+ description: "A composed, magazine-like stacked header treatment.",
10723
+ structure: "editorial-stack",
10724
+ variant: "editorial",
10725
+ defaultPositioning: "static",
10726
+ shrinkOnScroll: false,
10727
+ maxRecommendedNavItems: 6
10728
+ },
10729
+ {
10730
+ id: asHeaderLayoutId("floating"),
10731
+ label: "Floating",
10732
+ description: "Detached header chrome that sits over the opening section.",
10733
+ structure: "floating-shell",
10734
+ variant: "floating",
10735
+ defaultPositioning: "fixed",
10736
+ shrinkOnScroll: true,
10737
+ maxRecommendedNavItems: 5,
10738
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
10739
+ }
10740
+ ];
10741
+ function supportedLayouts(ids) {
10742
+ return ids.map(asHeaderLayoutId);
10743
+ }
10744
+ var headerStyleCatalog = [
10745
+ {
10746
+ id: asHeaderStyleId("minimal"),
10747
+ label: "Minimal",
10748
+ description: "Quiet surface with simple color-change navigation.",
10749
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10750
+ navInteraction: "color-change",
10751
+ surface: "neutral"
10752
+ },
10753
+ {
10754
+ id: asHeaderStyleId("fine-line"),
10755
+ label: "Fine Line",
10756
+ description: "Light surface with a crisp lower rule and underline hover.",
10757
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10758
+ navInteraction: "underline-grow",
10759
+ surface: "bordered"
10760
+ },
10761
+ {
10762
+ id: asHeaderStyleId("soft-bar"),
10763
+ label: "Soft Bar",
10764
+ description: "Soft tinted surface with gentle pill hover states.",
10765
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10766
+ navInteraction: "pill-background",
10767
+ surface: "soft"
10768
+ },
10769
+ {
10770
+ id: asHeaderStyleId("pill-nav"),
10771
+ label: "Pill Nav",
10772
+ description: "A calm pill navigation rail over a neutral header.",
10773
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10774
+ navInteraction: "pill-background",
10775
+ surface: "soft"
10776
+ },
10777
+ {
10778
+ id: asHeaderStyleId("brand-bar"),
10779
+ label: "Brand Bar",
10780
+ description: "Solid brand surface with high-contrast navigation.",
10781
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10782
+ navInteraction: "color-change",
10783
+ surface: "brand-solid"
10784
+ },
10785
+ {
10786
+ id: asHeaderStyleId("brand-underline"),
10787
+ label: "Brand Underline",
10788
+ description: "Brand surface with underline-grow navigation.",
10789
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
10790
+ navInteraction: "underline-grow",
10791
+ surface: "brand-solid"
10792
+ },
10793
+ {
10794
+ id: asHeaderStyleId("brand-pill"),
10795
+ label: "Brand Pill",
10796
+ description: "Solid brand surface with rounded active and hover states.",
10797
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
10798
+ navInteraction: "pill-background",
10799
+ surface: "brand-solid"
10800
+ },
10801
+ {
10802
+ id: asHeaderStyleId("editorial-line"),
10803
+ label: "Editorial Line",
10804
+ description: "Typographic logo treatment with understated underline navigation.",
10805
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10806
+ navInteraction: "underline-grow",
10807
+ surface: "bordered"
10808
+ },
10809
+ {
10810
+ id: asHeaderStyleId("flat-tabs"),
10811
+ label: "Flat Tabs",
10812
+ description: "Flat block hover and active states with a Swiss utility feel.",
10813
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
10814
+ navInteraction: "flat-block",
10815
+ surface: "bordered"
10816
+ },
10817
+ {
10818
+ id: asHeaderStyleId("glass"),
10819
+ label: "Glass",
10820
+ description: "Floating translucent chrome with frosted navigation backing.",
10821
+ supportedLayoutIds: supportedLayouts(["floating"]),
10822
+ navInteraction: "glass-backed",
10823
+ surface: "floating",
10824
+ requiresFloatingLayout: true
10825
+ },
10826
+ {
10827
+ id: asHeaderStyleId("minimal-surface"),
10828
+ label: "Minimal Surface",
10829
+ description: "Floating chrome with a restrained translucent surface.",
10830
+ supportedLayoutIds: supportedLayouts(["floating"]),
10831
+ navInteraction: "color-change",
10832
+ surface: "floating",
10833
+ requiresFloatingLayout: true
10834
+ },
10835
+ {
10836
+ id: asHeaderStyleId("soft-shell"),
10837
+ label: "Soft Shell",
10838
+ description: "Floating rounded shell with soft pill navigation states.",
10839
+ supportedLayoutIds: supportedLayouts(["floating"]),
10840
+ navInteraction: "pill-background",
10841
+ surface: "floating",
10842
+ requiresFloatingLayout: true
10843
+ }
10844
+ ];
10845
+ var headerLayoutsById = new Map(
10846
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
10847
+ );
10848
+ var headerStylesById = new Map(
10849
+ headerStyleCatalog.map((style) => [style.id, style])
10850
+ );
10851
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
10852
+ [
10853
+ asHeaderLayoutId("classic"),
10854
+ headerStyleRepairChain([
10855
+ "minimal",
10856
+ "fine-line",
10857
+ "soft-bar",
10858
+ "pill-nav",
10859
+ "brand-bar",
10860
+ "brand-underline",
10861
+ "brand-pill",
10862
+ "editorial-line",
10863
+ "flat-tabs"
10864
+ ])
10865
+ ],
10866
+ [
10867
+ asHeaderLayoutId("centered"),
10868
+ headerStyleRepairChain([
10869
+ "minimal",
10870
+ "fine-line",
10871
+ "soft-bar",
10872
+ "pill-nav",
10873
+ "brand-bar",
10874
+ "brand-pill",
10875
+ "editorial-line",
10876
+ "flat-tabs"
10877
+ ])
10878
+ ],
10879
+ [
10880
+ asHeaderLayoutId("editorial"),
10881
+ headerStyleRepairChain([
10882
+ "minimal",
10883
+ "fine-line",
10884
+ "soft-bar",
10885
+ "brand-bar",
10886
+ "brand-underline",
10887
+ "editorial-line",
10888
+ "flat-tabs"
10889
+ ])
10890
+ ],
10891
+ [
10892
+ asHeaderLayoutId("floating"),
10893
+ headerStyleRepairChain([
10894
+ "glass",
10895
+ "minimal-surface",
10896
+ "soft-shell",
10897
+ "brand-pill"
10898
+ ])
10899
+ ]
10900
+ ]);
10901
+ function headerStyleRepairChain(values) {
10902
+ return values.map(asHeaderStyleId);
10903
+ }
10904
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map([
10905
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
10906
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
10907
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
10908
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
10909
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
10910
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
10911
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
10912
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
10913
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
10914
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
10915
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
10916
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
10917
+ ]);
10918
+ var legacyHeaderLookAliases = [
10919
+ {
10920
+ lookId: asHeaderLookId("clean-base"),
10921
+ selection: {
10922
+ layoutId: asHeaderLayoutId("classic"),
10923
+ styleId: asHeaderStyleId("minimal")
10924
+ }
10925
+ },
10926
+ {
10927
+ lookId: asHeaderLookId("brand-solid"),
10928
+ selection: {
10929
+ layoutId: asHeaderLayoutId("classic"),
10930
+ styleId: asHeaderStyleId("brand-bar")
10931
+ }
10932
+ },
10933
+ {
10934
+ lookId: asHeaderLookId("editorial-line"),
10935
+ selection: {
10936
+ layoutId: asHeaderLayoutId("editorial"),
10937
+ styleId: asHeaderStyleId("editorial-line")
10938
+ }
10939
+ },
10940
+ {
10941
+ lookId: asHeaderLookId("centered-calm"),
10942
+ selection: {
10943
+ layoutId: asHeaderLayoutId("centered"),
10944
+ styleId: asHeaderStyleId("minimal")
10945
+ }
10946
+ },
10947
+ {
10948
+ lookId: asHeaderLookId("practical-utility"),
10949
+ selection: {
10950
+ layoutId: asHeaderLayoutId("classic"),
10951
+ styleId: asHeaderStyleId("flat-tabs")
10952
+ }
10953
+ },
10954
+ {
10955
+ lookId: asHeaderLookId("minimal-transparent"),
10956
+ selection: {
10957
+ layoutId: asHeaderLayoutId("classic"),
10958
+ styleId: asHeaderStyleId("minimal")
10959
+ }
10960
+ },
10961
+ {
10962
+ lookId: asHeaderLookId("transparent-overlay"),
10963
+ selection: {
10964
+ layoutId: asHeaderLayoutId("floating"),
10965
+ styleId: asHeaderStyleId("glass")
10966
+ }
10967
+ },
10968
+ {
10969
+ lookId: asHeaderLookId("floating-glass"),
10970
+ selection: {
10971
+ layoutId: asHeaderLayoutId("floating"),
10972
+ styleId: asHeaderStyleId("glass")
10973
+ }
10974
+ }
10975
+ ];
10976
+ var legacyHeaderLookAliasesById = new Map(
10977
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
10978
+ );
10979
+ function getHeaderStyle(id) {
10980
+ return headerStylesById.get(id) ?? null;
10981
+ }
10982
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
10983
+ return style.supportedLayoutIds.includes(layoutId);
10984
+ }
10985
+ function getHeaderStyleOrThrow(id) {
10986
+ const style = getHeaderStyle(id);
10987
+ if (!style) {
10988
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
10989
+ }
10990
+ return style;
10991
+ }
10992
+ function resolveLegacyHeaderLookAlias(lookId) {
10993
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
10994
+ }
10995
+ function getCompatibleHeaderStyleIds(layoutId) {
10996
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
10997
+ const style = getHeaderStyleOrThrow(styleId);
10998
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
10999
+ });
11000
+ }
10433
11001
  function solidBrandHeader(theme) {
10434
11002
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
10435
11003
  return {
@@ -10666,6 +11234,11 @@ var headerLookCatalog = [
10666
11234
  label: "Clean base",
10667
11235
  visualTreatment: "solid-neutral",
10668
11236
  layoutBehavior: "sticky",
11237
+ configuration: {
11238
+ structure: "inline-classic",
11239
+ treatment: "solid-neutral",
11240
+ behavior: "sticky"
11241
+ },
10669
11242
  openingRequirement: "none",
10670
11243
  compile: cleanBaseHeader
10671
11244
  },
@@ -10674,6 +11247,11 @@ var headerLookCatalog = [
10674
11247
  label: "Brand solid",
10675
11248
  visualTreatment: "solid-brand",
10676
11249
  layoutBehavior: "sticky-shrink",
11250
+ configuration: {
11251
+ structure: "inline-classic",
11252
+ treatment: "solid-brand",
11253
+ behavior: "sticky-shrink"
11254
+ },
10677
11255
  openingRequirement: "none",
10678
11256
  compile: solidBrandHeader
10679
11257
  },
@@ -10682,6 +11260,11 @@ var headerLookCatalog = [
10682
11260
  label: "Editorial line",
10683
11261
  visualTreatment: "light-editorial",
10684
11262
  layoutBehavior: "sticky",
11263
+ configuration: {
11264
+ structure: "editorial-stack",
11265
+ treatment: "light-editorial",
11266
+ behavior: "sticky"
11267
+ },
10685
11268
  openingRequirement: "none",
10686
11269
  maxRecommendedNavItems: 6,
10687
11270
  compile: editorialLineHeader
@@ -10691,6 +11274,11 @@ var headerLookCatalog = [
10691
11274
  label: "Centered calm",
10692
11275
  visualTreatment: "light-editorial",
10693
11276
  layoutBehavior: "normal-flow",
11277
+ configuration: {
11278
+ structure: "centered-stack",
11279
+ treatment: "light-editorial",
11280
+ behavior: "normal-flow"
11281
+ },
10694
11282
  openingRequirement: "none",
10695
11283
  maxRecommendedNavItems: 5,
10696
11284
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -10701,6 +11289,11 @@ var headerLookCatalog = [
10701
11289
  label: "Practical utility",
10702
11290
  visualTreatment: "solid-neutral",
10703
11291
  layoutBehavior: "sticky-shrink",
11292
+ configuration: {
11293
+ structure: "inline-classic",
11294
+ treatment: "solid-neutral",
11295
+ behavior: "sticky-shrink"
11296
+ },
10704
11297
  openingRequirement: "none",
10705
11298
  requiresProminentCta: true,
10706
11299
  compile: practicalUtilityHeader
@@ -10710,6 +11303,11 @@ var headerLookCatalog = [
10710
11303
  label: "Minimal transparent",
10711
11304
  visualTreatment: "minimal-transparent",
10712
11305
  layoutBehavior: "normal-flow",
11306
+ configuration: {
11307
+ structure: "inline-classic",
11308
+ treatment: "minimal-transparent",
11309
+ behavior: "normal-flow"
11310
+ },
10713
11311
  openingRequirement: "reserved-space-ok",
10714
11312
  compile: minimalTransparentHeader
10715
11313
  },
@@ -10718,6 +11316,11 @@ var headerLookCatalog = [
10718
11316
  label: "Transparent overlay",
10719
11317
  visualTreatment: "transparent-overlay",
10720
11318
  layoutBehavior: "fixed-overlay",
11319
+ configuration: {
11320
+ structure: "inline-classic",
11321
+ treatment: "transparent-overlay",
11322
+ behavior: "fixed-overlay"
11323
+ },
10721
11324
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10722
11325
  maxRecommendedNavItems: 5,
10723
11326
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10728,6 +11331,11 @@ var headerLookCatalog = [
10728
11331
  label: "Floating glass",
10729
11332
  visualTreatment: "floating-glass",
10730
11333
  layoutBehavior: "fixed-floating",
11334
+ configuration: {
11335
+ structure: "floating-shell",
11336
+ treatment: "floating-glass",
11337
+ behavior: "fixed-floating"
11338
+ },
10731
11339
  openingRequirement: "requires-image-hero-with-contrast-overlay",
10732
11340
  maxRecommendedNavItems: 5,
10733
11341
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -10735,9 +11343,17 @@ var headerLookCatalog = [
10735
11343
  }
10736
11344
  ];
10737
11345
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
11346
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
11347
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
11348
+ var allowedHeaderConfigurationKeys = new Set(
11349
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
11350
+ );
10738
11351
  var headerLooksById = new Map(
10739
11352
  headerLookCatalog.map((look) => [look.id, look])
10740
11353
  );
11354
+ function headerConfigurationKey(configuration) {
11355
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
11356
+ }
10741
11357
 
10742
11358
  // ../theme-core/src/site-styles/footerLooks.ts
10743
11359
  function asFooterLookId(value) {
@@ -10870,6 +11486,264 @@ var advancedDesignOptionCatalog = {
10870
11486
  detachedCustom: true
10871
11487
  };
10872
11488
 
11489
+ // ../theme-core/src/site-styles/typographyPresets.ts
11490
+ var bodyReadablePolicy = {
11491
+ recommendedCategories: ["sans-serif", "serif"],
11492
+ allowedCategories: ["sans-serif", "serif"],
11493
+ requiresItalicForBody: true,
11494
+ requiresBoldForBody: true
11495
+ };
11496
+ var headingFlexiblePolicy = {
11497
+ recommendedCategories: ["sans-serif", "serif", "display"],
11498
+ allowedCategories: ["sans-serif", "serif", "display"]
11499
+ };
11500
+ var displayHeadingPolicy = {
11501
+ recommendedCategories: ["display", "sans-serif", "serif"],
11502
+ allowedCategories: ["display", "sans-serif", "serif"]
11503
+ };
11504
+ function asTypographyPresetId(value) {
11505
+ if (!value.startsWith("typography-preset:")) {
11506
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
11507
+ }
11508
+ return value;
11509
+ }
11510
+ function defineTypographyPreset(preset2) {
11511
+ return {
11512
+ ...preset2,
11513
+ id: asTypographyPresetId(preset2.id)
11514
+ };
11515
+ }
11516
+ var modernSansTypography = {
11517
+ body: {
11518
+ family: "Inter, system-ui, sans-serif",
11519
+ size: "md",
11520
+ weight: "regular",
11521
+ lineHeight: "relaxed",
11522
+ letterSpacing: "normal"
11523
+ },
11524
+ headings: {
11525
+ default: {
11526
+ family: "Inter, system-ui, sans-serif",
11527
+ weight: "semibold",
11528
+ lineHeight: "normal",
11529
+ letterSpacing: "tight",
11530
+ italic: null,
11531
+ case: null
11532
+ },
11533
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11534
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11535
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11536
+ },
11537
+ scale: "balanced"
11538
+ };
11539
+ var warmRoundedTypography = {
11540
+ body: {
11541
+ family: "Nunito Sans, system-ui, sans-serif",
11542
+ size: "lg",
11543
+ weight: "regular",
11544
+ lineHeight: "relaxed",
11545
+ letterSpacing: "normal"
11546
+ },
11547
+ headings: {
11548
+ default: {
11549
+ family: "Nunito Sans, system-ui, sans-serif",
11550
+ weight: "bold",
11551
+ lineHeight: "normal",
11552
+ letterSpacing: "normal",
11553
+ italic: null,
11554
+ case: null
11555
+ },
11556
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11557
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11558
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11559
+ },
11560
+ scale: "balanced"
11561
+ };
11562
+ var editorialSerifTypography = {
11563
+ body: {
11564
+ family: "Lora, Georgia, serif",
11565
+ size: "lg",
11566
+ weight: "regular",
11567
+ lineHeight: "loose",
11568
+ letterSpacing: "normal"
11569
+ },
11570
+ headings: {
11571
+ default: {
11572
+ family: "Playfair Display, Georgia, serif",
11573
+ weight: "semibold",
11574
+ lineHeight: "normal",
11575
+ letterSpacing: "tight",
11576
+ italic: null,
11577
+ case: null
11578
+ },
11579
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11580
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11581
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
11582
+ },
11583
+ scale: "spacious"
11584
+ };
11585
+ var classicSerifTypography = {
11586
+ body: {
11587
+ family: "Libre Baskerville, Georgia, serif",
11588
+ size: "md",
11589
+ weight: "regular",
11590
+ lineHeight: "relaxed",
11591
+ letterSpacing: "normal"
11592
+ },
11593
+ headings: {
11594
+ default: {
11595
+ family: "Cormorant Garamond, Georgia, serif",
11596
+ weight: "semibold",
11597
+ lineHeight: "normal",
11598
+ letterSpacing: "normal",
11599
+ italic: null,
11600
+ case: null
11601
+ },
11602
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11603
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11604
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11605
+ },
11606
+ scale: "balanced"
11607
+ };
11608
+ var luxeContrastTypography = {
11609
+ body: {
11610
+ family: "Manrope, system-ui, sans-serif",
11611
+ size: "md",
11612
+ weight: "regular",
11613
+ lineHeight: "relaxed",
11614
+ letterSpacing: "normal"
11615
+ },
11616
+ headings: {
11617
+ default: {
11618
+ family: "Cormorant Garamond, Georgia, serif",
11619
+ weight: "semibold",
11620
+ lineHeight: "normal",
11621
+ letterSpacing: "tight",
11622
+ italic: null,
11623
+ case: null
11624
+ },
11625
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11626
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11627
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
11628
+ },
11629
+ scale: "spacious"
11630
+ };
11631
+ var boldDisplayTypography = {
11632
+ body: {
11633
+ family: "Manrope, system-ui, sans-serif",
11634
+ size: "lg",
11635
+ weight: "regular",
11636
+ lineHeight: "relaxed",
11637
+ letterSpacing: "normal"
11638
+ },
11639
+ headings: {
11640
+ default: {
11641
+ family: '"TAN - PEARL", sans-serif',
11642
+ weight: "bold",
11643
+ lineHeight: "normal",
11644
+ letterSpacing: "tight",
11645
+ colorToken: "primary",
11646
+ italic: null,
11647
+ case: null
11648
+ },
11649
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
11650
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
11651
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
11652
+ },
11653
+ scale: "balanced"
11654
+ };
11655
+ var typographyPresets = [
11656
+ defineTypographyPreset({
11657
+ id: "typography-preset:modern-sans",
11658
+ name: "Modern Sans",
11659
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
11660
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
11661
+ recommendedFonts: {
11662
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
11663
+ heading: ["Inter", "Manrope", "Source Sans 3"]
11664
+ },
11665
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11666
+ typography: modernSansTypography
11667
+ }),
11668
+ defineTypographyPreset({
11669
+ id: "typography-preset:warm-rounded",
11670
+ name: "Warm Rounded",
11671
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
11672
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
11673
+ recommendedFonts: {
11674
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
11675
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
11676
+ },
11677
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
11678
+ typography: warmRoundedTypography
11679
+ }),
11680
+ defineTypographyPreset({
11681
+ id: "typography-preset:editorial-serif",
11682
+ name: "Editorial Serif",
11683
+ description: "Story-led type with warm reading rhythm and expressive headings.",
11684
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
11685
+ recommendedFonts: {
11686
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
11687
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
11688
+ },
11689
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11690
+ typography: editorialSerifTypography
11691
+ }),
11692
+ defineTypographyPreset({
11693
+ id: "typography-preset:classic-serif",
11694
+ name: "Classic Serif",
11695
+ description: "Measured, polished type for premium and established offers.",
11696
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
11697
+ recommendedFonts: {
11698
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
11699
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
11700
+ },
11701
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11702
+ typography: classicSerifTypography
11703
+ }),
11704
+ defineTypographyPreset({
11705
+ id: "typography-preset:luxe-contrast",
11706
+ name: "Luxe Contrast",
11707
+ description: "A restrained sans body paired with elegant high-contrast headings.",
11708
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
11709
+ recommendedFonts: {
11710
+ body: ["Manrope", "Inter", "Source Sans 3"],
11711
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
11712
+ },
11713
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11714
+ typography: luxeContrastTypography
11715
+ }),
11716
+ defineTypographyPreset({
11717
+ id: "typography-preset:bold-display",
11718
+ name: "Bold Display",
11719
+ description: "Punchy display headings with readable sans body copy for branded launches.",
11720
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
11721
+ recommendedFonts: {
11722
+ body: ["Manrope", "Inter", "Space Grotesk"],
11723
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
11724
+ },
11725
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
11726
+ typography: boldDisplayTypography,
11727
+ heroTypography: {
11728
+ headlineSize: "6xl",
11729
+ headlineLineHeight: "tight",
11730
+ subheadlineSize: "editorial",
11731
+ subheadlineLineHeight: "normal",
11732
+ microHeadlineSize: "6xl",
11733
+ microHeadlineLineHeight: "tight",
11734
+ microSubheadlineSize: "xl",
11735
+ microSubheadlineLineHeight: "normal",
11736
+ responsive: {
11737
+ tablet: { headlineSize: "5xl" },
11738
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
11739
+ }
11740
+ }
11741
+ })
11742
+ ];
11743
+ var typographyPresetsById = new Map(
11744
+ typographyPresets.map((preset2) => [preset2.id, preset2])
11745
+ );
11746
+
10873
11747
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
10874
11748
  var curatedSiteStyleIdValues = [
10875
11749
  "site-style:calm-studio",
@@ -10882,6 +11756,7 @@ var curatedSiteStyleIdValues = [
10882
11756
  "site-style:personal-retreat-journal",
10883
11757
  "site-style:tactile-workshop",
10884
11758
  "site-style:modern-wellness",
11759
+ "site-style:soft-earth",
10885
11760
  "site-style:bold-launch",
10886
11761
  "site-style:south-west-twerk-school"
10887
11762
  ];
@@ -10958,6 +11833,15 @@ function uniqueContentFrameKinds() {
10958
11833
  }
10959
11834
  var generatedContentFrameKinds = uniqueContentFrameKinds();
10960
11835
  function defineCuratedSiteStyle(input) {
11836
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
11837
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
11838
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
11839
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
11840
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
11841
+ throw new Error(
11842
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
11843
+ );
11844
+ }
10961
11845
  return {
10962
11846
  id: asSiteStyleId(input.id),
10963
11847
  name: input.name,
@@ -10978,11 +11862,23 @@ function defineCuratedSiteStyle(input) {
10978
11862
  },
10979
11863
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10980
11864
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10981
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
11865
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
11866
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
11867
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
11868
+ } : inferredHeaderCuration.defaultHeaderSelection,
11869
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
11870
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
11871
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
11872
+ layoutId: asHeaderLayoutId(selection.layoutId),
11873
+ styleId: asHeaderStyleId(selection.styleId)
11874
+ })),
11875
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
10982
11876
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
10983
11877
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
10984
11878
  buttonPersonalityChoices: input.buttonPersonalityChoices,
10985
- paletteVariantChoices: input.paletteVariantChoices
11879
+ paletteVariantChoices: input.paletteVariantChoices,
11880
+ typographyPresetChoices,
11881
+ defaultTypographyPresetId
10986
11882
  };
10987
11883
  }
10988
11884
  function buttonChoice(id, note) {
@@ -10991,6 +11887,88 @@ function buttonChoice(id, note) {
10991
11887
  function paletteChoice(id, note) {
10992
11888
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
10993
11889
  }
11890
+ function headerLayoutChoice(id, note) {
11891
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
11892
+ }
11893
+ function headerStyleChoice(id, note) {
11894
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
11895
+ }
11896
+ function headerLayoutRecordKey(id) {
11897
+ return id;
11898
+ }
11899
+ function uniqueHeaderLayoutChoices(choices) {
11900
+ const seen = /* @__PURE__ */ new Set();
11901
+ const unique = choices.filter((choice) => {
11902
+ if (seen.has(choice.id)) return false;
11903
+ seen.add(choice.id);
11904
+ return true;
11905
+ });
11906
+ const first = unique[0];
11907
+ if (!first) {
11908
+ throw new Error("Expected at least one curated header layout choice.");
11909
+ }
11910
+ return [first, ...unique.slice(1)];
11911
+ }
11912
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
11913
+ const first = choices[0] ?? {
11914
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
11915
+ };
11916
+ return [first, ...choices.slice(1)];
11917
+ }
11918
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
11919
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
11920
+ const defaultHeaderSelection = selections[0] ?? {
11921
+ layoutId: asHeaderLayoutId("classic"),
11922
+ styleId: asHeaderStyleId("minimal")
11923
+ };
11924
+ const layoutChoices = uniqueHeaderLayoutChoices(
11925
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
11926
+ );
11927
+ const stylesByLayout = {};
11928
+ for (const layoutChoice of layoutChoices) {
11929
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
11930
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
11931
+ styleChoices,
11932
+ layoutChoice.id
11933
+ );
11934
+ }
11935
+ return {
11936
+ defaultHeaderSelection,
11937
+ recommendedHeaderLayoutChoices: layoutChoices,
11938
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
11939
+ };
11940
+ }
11941
+ function typographyChoice(id, note) {
11942
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
11943
+ }
11944
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
11945
+ switch (recipe) {
11946
+ case "clean-sans":
11947
+ return [
11948
+ typographyChoice("typography-preset:modern-sans"),
11949
+ typographyChoice("typography-preset:luxe-contrast"),
11950
+ typographyChoice("typography-preset:bold-display")
11951
+ ];
11952
+ case "friendly-sans":
11953
+ return [
11954
+ typographyChoice("typography-preset:warm-rounded"),
11955
+ typographyChoice("typography-preset:modern-sans"),
11956
+ typographyChoice("typography-preset:editorial-serif")
11957
+ ];
11958
+ case "serif-editorial":
11959
+ return [
11960
+ typographyChoice("typography-preset:editorial-serif"),
11961
+ typographyChoice("typography-preset:classic-serif"),
11962
+ typographyChoice("typography-preset:warm-rounded")
11963
+ ];
11964
+ case "classic-serif":
11965
+ return [
11966
+ typographyChoice("typography-preset:classic-serif"),
11967
+ typographyChoice("typography-preset:luxe-contrast"),
11968
+ typographyChoice("typography-preset:editorial-serif")
11969
+ ];
11970
+ }
11971
+ }
10994
11972
  var curatedSiteStyles = [
10995
11973
  defineCuratedSiteStyle({
10996
11974
  id: "site-style:calm-studio",
@@ -11316,6 +12294,102 @@ var curatedSiteStyles = [
11316
12294
  paletteChoice("warm-neutral-clay")
11317
12295
  ]
11318
12296
  }),
12297
+ defineCuratedSiteStyle({
12298
+ id: "site-style:soft-earth",
12299
+ name: "Soft Earth",
12300
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12301
+ 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.",
12302
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
12303
+ selectionKeywordRules: [
12304
+ { kind: "word", value: "meditation" },
12305
+ { kind: "word", value: "wellbeing" },
12306
+ { kind: "substring", value: "retreat" },
12307
+ { kind: "phrase", value: "yoga studio" },
12308
+ { kind: "phrase", value: "mindful movement" }
12309
+ ],
12310
+ tokenRecipes: {
12311
+ palette: "warm-neutral",
12312
+ contrast: "standard",
12313
+ radius: "soft",
12314
+ shadow: "subtle",
12315
+ typography: "serif-editorial",
12316
+ spacing: "airy",
12317
+ motion: "subtle"
12318
+ },
12319
+ compositionBudget: balancedBudget,
12320
+ themeOverrides: {
12321
+ typography: {
12322
+ body: {
12323
+ family: "Inter, system-ui, sans-serif",
12324
+ size: "md",
12325
+ weight: "regular",
12326
+ lineHeight: "relaxed",
12327
+ letterSpacing: "normal"
12328
+ },
12329
+ headings: {
12330
+ default: {
12331
+ family: '"Cormorant Garamond", Georgia, serif',
12332
+ weight: "regular",
12333
+ lineHeight: "normal",
12334
+ letterSpacing: "normal",
12335
+ colorToken: "text",
12336
+ italic: null,
12337
+ case: null
12338
+ },
12339
+ h1: {
12340
+ size: "xl",
12341
+ weight: "regular",
12342
+ lineHeight: "normal",
12343
+ letterSpacing: "normal",
12344
+ italic: null
12345
+ },
12346
+ h2: {
12347
+ size: "lg",
12348
+ weight: "regular",
12349
+ lineHeight: "normal",
12350
+ letterSpacing: "normal",
12351
+ italic: null
12352
+ },
12353
+ h3: {
12354
+ size: "md",
12355
+ weight: "regular",
12356
+ lineHeight: "normal",
12357
+ letterSpacing: "normal",
12358
+ italic: null
12359
+ }
12360
+ },
12361
+ scale: "majorThird"
12362
+ },
12363
+ bodyText: {
12364
+ intro: {
12365
+ paragraphSize: "default",
12366
+ headingSize: "editorial"
12367
+ }
12368
+ }
12369
+ },
12370
+ recommendedAppearancePresetIds: [
12371
+ "hero-brand-scrim",
12372
+ "intro-soft-earth-statement",
12373
+ "feature-cards-soft-earth-offerings",
12374
+ "testimonials-soft-earth-proof-band",
12375
+ "faq-soft-earth-two-column",
12376
+ "contact-form-panel"
12377
+ ],
12378
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
12379
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
12380
+ buttonPersonalityChoices: [
12381
+ buttonChoice("earth-pill"),
12382
+ buttonChoice("soft-pill"),
12383
+ buttonChoice("pebble"),
12384
+ buttonChoice("editorial-link")
12385
+ ],
12386
+ paletteVariantChoices: [
12387
+ paletteChoice("warm-neutral-soft-earth"),
12388
+ paletteChoice("warm-neutral-clay"),
12389
+ paletteChoice("warm-neutral-forest"),
12390
+ paletteChoice("soft-natural-sage")
12391
+ ]
12392
+ }),
11319
12393
  defineCuratedSiteStyle({
11320
12394
  id: "site-style:bold-launch",
11321
12395
  name: "Bold Launch",
@@ -11369,49 +12443,13 @@ var curatedSiteStyles = [
11369
12443
  motion: "expressive"
11370
12444
  },
11371
12445
  compositionBudget: expressiveBudget,
12446
+ typographyPresetChoices: [
12447
+ typographyChoice("typography-preset:bold-display"),
12448
+ typographyChoice("typography-preset:modern-sans"),
12449
+ typographyChoice("typography-preset:luxe-contrast")
12450
+ ],
12451
+ defaultTypographyPresetId: "typography-preset:bold-display",
11372
12452
  themeOverrides: {
11373
- typography: {
11374
- body: {
11375
- family: "Manrope, system-ui, sans-serif",
11376
- size: "lg",
11377
- weight: "regular",
11378
- lineHeight: "relaxed",
11379
- letterSpacing: "normal"
11380
- },
11381
- headings: {
11382
- default: {
11383
- family: '"TAN - PEARL", sans-serif',
11384
- weight: "bold",
11385
- lineHeight: "normal",
11386
- letterSpacing: "tight",
11387
- colorToken: "primary",
11388
- italic: null,
11389
- case: null
11390
- },
11391
- h1: {
11392
- size: "xl",
11393
- weight: "bold",
11394
- lineHeight: "normal",
11395
- letterSpacing: "tight",
11396
- italic: null
11397
- },
11398
- h2: {
11399
- size: "lg",
11400
- weight: "bold",
11401
- lineHeight: "normal",
11402
- letterSpacing: "normal",
11403
- italic: null
11404
- },
11405
- h3: {
11406
- size: "md",
11407
- weight: "bold",
11408
- lineHeight: "normal",
11409
- letterSpacing: "normal",
11410
- italic: null
11411
- }
11412
- },
11413
- scale: "balanced"
11414
- },
11415
12453
  bodyText: {
11416
12454
  intro: {
11417
12455
  paragraphSize: "editorial",
@@ -15754,8 +16792,9 @@ var faqAccordionFragment = defineFragment({
15754
16792
  },
15755
16793
  fallback: "rb-faq-item"
15756
16794
  },
15757
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
15758
- // Pass icon style from theme
16795
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
16796
+ // Legacy theme accordion style
16797
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
15759
16798
  },
15760
16799
  triggerFrom: "faqItem.question",
15761
16800
  contentFrom: "faqItem.answer"
@@ -16890,100 +17929,428 @@ var heroBlockDefinition = {
16890
17929
  manifest: heroManifest
16891
17930
  };
16892
17931
 
16893
- // ../blocks/src/system/blocks/body-text.ts
16894
- var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
16895
- var proseLayout = styledSection({
16896
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
16897
- spacing: "medium",
16898
- baseClass: ""
16899
- });
16900
- var introLayout = styledSection({
16901
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
16902
- spacing: "medium",
16903
- baseClass: ""
16904
- });
16905
- var narrowLayout = styledSection({
16906
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
16907
- spacing: "medium",
16908
- baseClass: ""
16909
- });
16910
- var bodyTextManifest = createBlockManifest({
16911
- id: "block.body-text",
16912
- title: "Body Text",
16913
- titleSource: "heading",
16914
- category: "content",
16915
- fragments: [
16916
- { fragment: bodyCopyFragment, fieldPriority: 0 }
16917
- ],
16918
- layout: proseLayout,
16919
- variants: {
16920
- prose: proseLayout,
16921
- intro: introLayout,
16922
- narrow: narrowLayout
16923
- },
16924
- defaultVariant: "prose",
16925
- variantOptions: {
16926
- prose: {
16927
- label: "Prose",
16928
- description: "Long-form rich text for pages and posts.",
16929
- icon: "Type"
16930
- },
16931
- intro: {
16932
- label: "Intro",
16933
- description: "Narrower, larger text for above-the-fold intros.",
16934
- icon: "AlignCenter"
16935
- },
16936
- narrow: {
16937
- label: "Narrow",
16938
- description: "Left-aligned lead copy with a shorter max width.",
16939
- icon: "AlignLeft"
17932
+ // ../blocks/src/system/fields/aspectRatio.ts
17933
+ var standardAspectRatioOptions = [
17934
+ { value: "auto", label: "Auto (original)" },
17935
+ { value: "16/9", label: "16:9 (Landscape)" },
17936
+ { value: "4/3", label: "4:3 (Standard)" },
17937
+ { value: "1/1", label: "1:1 (Square)" },
17938
+ { value: "3/4", label: "3:4 (Portrait)" }
17939
+ ];
17940
+ function createAspectRatioField(options = {}) {
17941
+ return {
17942
+ id: options.id ?? "aspectRatio",
17943
+ type: "select",
17944
+ label: options.label ?? "Aspect ratio",
17945
+ ...options.description ? { description: options.description } : {},
17946
+ required: false,
17947
+ defaultValue: options.defaultValue ?? "auto",
17948
+ multiple: false,
17949
+ options: [...standardAspectRatioOptions],
17950
+ ui: {
17951
+ intent: options.uiIntent ?? "display",
17952
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
16940
17953
  }
16941
- },
16942
- description: "Simple text block with optional heading and alignment controls.",
16943
- tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
16944
- icon: "Type",
16945
- styleTokens: {
16946
- spacing: "md"
16947
- }
16948
- });
16949
- var bodyTextBlockDefinition = {
16950
- manifest: bodyTextManifest
16951
- };
17954
+ };
17955
+ }
16952
17956
 
16953
- // ../blocks/src/system/blocks/blog-post.tsx
16954
- import { z as z28 } from "zod";
16955
- var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
16956
- var blogPostLayout = section(
16957
- { background: "background", className: "rb-px-6 rb-py-12" },
16958
- [...composition.layout]
16959
- );
16960
- var blogPostManifest = createBlockManifest({
16961
- id: "block.blog-post",
16962
- version: "0.1.0",
16963
- title: "Blog post",
16964
- description: "Highlights a single blog post with title, image, and excerpt.",
16965
- category: "blog",
16966
- contentTypes: ["post"],
16967
- tags: ["blog", "post", "featured", "highlight", "article", "single"],
16968
- icon: "FileText",
16969
- styleTokens: {
16970
- background: "surface",
16971
- typography: "body",
16972
- spacing: "md"
16973
- },
16974
- behaviours: {
16975
- supportsThemeSwitching: true,
16976
- inlineEditing: false,
16977
- animation: false,
16978
- paletteHidden: false
16979
- },
16980
- additionalFields: composition.fields,
16981
- layout: blogPostLayout
16982
- });
16983
- var blogPostDataSchema = z28.object({
16984
- id: z28.string(),
16985
- title: z28.string(),
16986
- slug: z28.string(),
17957
+ // ../blocks/src/system/fields/imageLayout.ts
17958
+ function createImageColSizeField(options = {}) {
17959
+ const {
17960
+ id = "imageColSize",
17961
+ label = "Image column size",
17962
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
17963
+ defaultValue = "1/3",
17964
+ uiIntent = "display",
17965
+ visibleWhen
17966
+ } = options;
17967
+ return {
17968
+ id,
17969
+ type: "select",
17970
+ label,
17971
+ description,
17972
+ required: false,
17973
+ defaultValue,
17974
+ multiple: false,
17975
+ options: [
17976
+ { value: "1/4", label: "Small (1/4)" },
17977
+ { value: "1/3", label: "Medium (1/3)" },
17978
+ { value: "2/5", label: "Large (2/5)" },
17979
+ { value: "1/2", label: "Extra large (1/2)" },
17980
+ { value: "2/3", label: "Huge (2/3)" }
17981
+ ],
17982
+ ui: {
17983
+ intent: uiIntent,
17984
+ ...visibleWhen ? { visibleWhen } : {}
17985
+ }
17986
+ };
17987
+ }
17988
+ function createImagePositionField(options = {}) {
17989
+ const {
17990
+ id = "imagePosition",
17991
+ label = "Image position",
17992
+ description = "Choose which side the image appears on.",
17993
+ defaultValue = "left",
17994
+ includeAlternate = false,
17995
+ uiIntent = "display",
17996
+ visibleWhen
17997
+ } = options;
17998
+ const positionOptions = [
17999
+ { value: "left", label: "Left" },
18000
+ { value: "right", label: "Right" },
18001
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
18002
+ ];
18003
+ return {
18004
+ id,
18005
+ type: "select",
18006
+ label,
18007
+ description,
18008
+ required: false,
18009
+ defaultValue,
18010
+ multiple: false,
18011
+ // Spread to get a mutable array type without unsafe casts.
18012
+ options: [...positionOptions],
18013
+ ui: {
18014
+ intent: uiIntent,
18015
+ ...visibleWhen ? { visibleWhen } : {}
18016
+ }
18017
+ };
18018
+ }
18019
+
18020
+ // ../blocks/src/system/blocks/intro.ts
18021
+ function introHeading(className) {
18022
+ return text(
18023
+ {
18024
+ as: "h2",
18025
+ className
18026
+ },
18027
+ when("content.title"),
18028
+ bind("content.title")
18029
+ );
18030
+ }
18031
+ function introBody(className = "rb-prose rb-max-w-none") {
18032
+ return richText({ className }, bind("content.body"));
18033
+ }
18034
+ function introCtas(justify = "start") {
18035
+ return ctaRow({
18036
+ justify,
18037
+ gap: "md",
18038
+ containerClassName: "rb-mt-2"
18039
+ });
18040
+ }
18041
+ function introCopyStack(options = {}) {
18042
+ return stack(
18043
+ {
18044
+ gap: "md",
18045
+ className: options.className ?? "rb-intro-copy"
18046
+ },
18047
+ [
18048
+ introHeading(options.headingClassName ?? "rb-intro-title"),
18049
+ introBody(options.bodyClassName),
18050
+ introCtas(options.ctaJustify)
18051
+ ]
18052
+ );
18053
+ }
18054
+ var introMedia = media(
18055
+ {
18056
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
18057
+ style: {
18058
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
18059
+ }
18060
+ },
18061
+ bind("content.media")
18062
+ );
18063
+ var centeredCopyLayout = styledSection({
18064
+ children: styledContainer({
18065
+ rootType: "stack",
18066
+ rootProps: { gap: "lg" },
18067
+ children: [
18068
+ introCopyStack({
18069
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
18070
+ headingClassName: "rb-intro-title rb-text-center",
18071
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
18072
+ ctaJustify: "center"
18073
+ })
18074
+ ]
18075
+ }),
18076
+ baseClass: "",
18077
+ spacing: "medium"
18078
+ });
18079
+ var statementCopyLayout = styledSection({
18080
+ children: styledContainer({
18081
+ children: [
18082
+ el(
18083
+ "div",
18084
+ {
18085
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18086
+ },
18087
+ [
18088
+ introHeading("rb-intro-title rb-max-w-xl"),
18089
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18090
+ introBody(),
18091
+ introCtas("start")
18092
+ ])
18093
+ ]
18094
+ )
18095
+ ]
18096
+ }),
18097
+ baseClass: "",
18098
+ spacing: "medium"
18099
+ });
18100
+ var statementMediaLayout = styledSection({
18101
+ children: styledContainer({
18102
+ children: [
18103
+ el(
18104
+ "div",
18105
+ {
18106
+ 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"
18107
+ },
18108
+ [
18109
+ introHeading("rb-intro-title rb-max-w-xl"),
18110
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18111
+ introBody(),
18112
+ introCtas("start")
18113
+ ]),
18114
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
18115
+ ]
18116
+ )
18117
+ ]
18118
+ }),
18119
+ baseClass: "",
18120
+ spacing: "medium"
18121
+ });
18122
+ var mediaCopyLayout = styledSection({
18123
+ children: styledContainer({
18124
+ children: [
18125
+ responsiveTwoColumn({
18126
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
18127
+ text: introCopyStack({
18128
+ className: "rb-intro-copy rb-max-w-xl",
18129
+ headingClassName: "rb-intro-title"
18130
+ }),
18131
+ ratioFrom: "content.ratio",
18132
+ imagePositionFrom: "content.imagePosition",
18133
+ gapFrom: "content.gap",
18134
+ gapFallback: "comfortable",
18135
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
18136
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
18137
+ })
18138
+ ]
18139
+ }),
18140
+ baseClass: "",
18141
+ spacing: "medium"
18142
+ });
18143
+ var introConfig = {
18144
+ id: "block.intro",
18145
+ title: "Intro",
18146
+ category: "layout",
18147
+ includeContainerStyles: true,
18148
+ titleSource: "title",
18149
+ additionalFields: [
18150
+ {
18151
+ id: "title",
18152
+ type: "text",
18153
+ label: "Statement",
18154
+ required: false,
18155
+ multiline: true,
18156
+ maxLength: 160
18157
+ },
18158
+ {
18159
+ id: "body",
18160
+ type: "richText",
18161
+ label: "Text",
18162
+ required: true,
18163
+ ui: {
18164
+ richTextVariant: "limited"
18165
+ }
18166
+ },
18167
+ {
18168
+ id: "media",
18169
+ type: "media",
18170
+ label: "Media",
18171
+ required: false,
18172
+ mediaKinds: ["image"],
18173
+ ui: {
18174
+ intent: "content",
18175
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
18176
+ }
18177
+ },
18178
+ createImagePositionField({
18179
+ id: "imagePosition",
18180
+ label: "Image position",
18181
+ defaultValue: "left",
18182
+ uiIntent: "display",
18183
+ visibleWhen: { field: "variant", equals: "media-copy" }
18184
+ }),
18185
+ {
18186
+ id: "gap",
18187
+ type: "select",
18188
+ label: "Gap between media and text",
18189
+ required: false,
18190
+ defaultValue: "comfortable",
18191
+ multiple: false,
18192
+ options: [
18193
+ { value: "none", label: "None" },
18194
+ { value: "compact", label: "Compact" },
18195
+ { value: "cozy", label: "Cozy" },
18196
+ { value: "medium", label: "Medium" },
18197
+ { value: "comfortable", label: "Comfortable" },
18198
+ { value: "spacious", label: "Spacious" }
18199
+ ],
18200
+ ui: {
18201
+ intent: "display",
18202
+ visibleWhen: { field: "variant", equals: "media-copy" }
18203
+ }
18204
+ },
18205
+ createImageColSizeField({
18206
+ id: "ratio",
18207
+ label: "Media column size",
18208
+ defaultValue: "1/2",
18209
+ uiIntent: "display",
18210
+ visibleWhen: { field: "variant", equals: "media-copy" }
18211
+ }),
18212
+ createAspectRatioField({
18213
+ id: "aspectRatio",
18214
+ label: "Media aspect ratio",
18215
+ description: "Crop media to a consistent aspect ratio.",
18216
+ defaultValue: "auto",
18217
+ visibleWhen: { field: "media", notEquals: null }
18218
+ }),
18219
+ createCtasRepeater({
18220
+ label: "Calls to action",
18221
+ itemLabel: "CTA",
18222
+ maxItems: 2
18223
+ })
18224
+ ],
18225
+ layout: centeredCopyLayout,
18226
+ variants: {
18227
+ "centered-copy": centeredCopyLayout,
18228
+ "statement-copy": statementCopyLayout,
18229
+ "statement-media": statementMediaLayout,
18230
+ "media-copy": mediaCopyLayout
18231
+ },
18232
+ defaultVariant: "statement-copy",
18233
+ variantOptions: {
18234
+ "centered-copy": {
18235
+ label: "Centered copy",
18236
+ description: "A focused intro with centered text and optional calls to action."
18237
+ },
18238
+ "statement-copy": {
18239
+ label: "Statement and copy",
18240
+ description: "A large statement on the left with supporting copy on the right."
18241
+ },
18242
+ "statement-media": {
18243
+ label: "Statement, copy and media",
18244
+ description: "A three-part intro with statement, copy and a small image."
18245
+ },
18246
+ "media-copy": {
18247
+ label: "Media and copy",
18248
+ description: "A compact media/text intro for softer transitions after a hero."
18249
+ }
18250
+ },
18251
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
18252
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
18253
+ icon: "PanelTopOpen"
18254
+ };
18255
+ var introManifest = createBlockManifest(introConfig);
18256
+ var introBlockDefinition = {
18257
+ manifest: introManifest
18258
+ };
18259
+
18260
+ // ../blocks/src/system/blocks/body-text.ts
18261
+ var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
18262
+ var proseLayout = styledSection({
18263
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18264
+ spacing: "medium",
18265
+ baseClass: ""
18266
+ });
18267
+ var introLayout = styledSection({
18268
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18269
+ spacing: "medium",
18270
+ baseClass: ""
18271
+ });
18272
+ var narrowLayout = styledSection({
18273
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18274
+ spacing: "medium",
18275
+ baseClass: ""
18276
+ });
18277
+ var bodyTextManifest = createBlockManifest({
18278
+ id: "block.body-text",
18279
+ title: "Body Text",
18280
+ titleSource: "heading",
18281
+ category: "content",
18282
+ fragments: [
18283
+ { fragment: bodyCopyFragment, fieldPriority: 0 }
18284
+ ],
18285
+ layout: proseLayout,
18286
+ variants: {
18287
+ prose: proseLayout,
18288
+ intro: introLayout,
18289
+ narrow: narrowLayout
18290
+ },
18291
+ defaultVariant: "prose",
18292
+ variantOptions: {
18293
+ prose: {
18294
+ label: "Prose",
18295
+ description: "Long-form rich text for pages and posts.",
18296
+ icon: "Type"
18297
+ },
18298
+ intro: {
18299
+ label: "Intro",
18300
+ description: "Narrower, larger text for above-the-fold intros.",
18301
+ icon: "AlignCenter"
18302
+ },
18303
+ narrow: {
18304
+ label: "Narrow",
18305
+ description: "Left-aligned lead copy with a shorter max width.",
18306
+ icon: "AlignLeft"
18307
+ }
18308
+ },
18309
+ description: "Simple text block with optional heading and alignment controls.",
18310
+ tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
18311
+ icon: "Type",
18312
+ styleTokens: {
18313
+ spacing: "md"
18314
+ }
18315
+ });
18316
+ var bodyTextBlockDefinition = {
18317
+ manifest: bodyTextManifest
18318
+ };
18319
+
18320
+ // ../blocks/src/system/blocks/blog-post.tsx
18321
+ import { z as z28 } from "zod";
18322
+ var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
18323
+ var blogPostLayout = section(
18324
+ { background: "background", className: "rb-px-6 rb-py-12" },
18325
+ [...composition.layout]
18326
+ );
18327
+ var blogPostManifest = createBlockManifest({
18328
+ id: "block.blog-post",
18329
+ version: "0.1.0",
18330
+ title: "Blog post",
18331
+ description: "Highlights a single blog post with title, image, and excerpt.",
18332
+ category: "blog",
18333
+ contentTypes: ["post"],
18334
+ tags: ["blog", "post", "featured", "highlight", "article", "single"],
18335
+ icon: "FileText",
18336
+ styleTokens: {
18337
+ background: "surface",
18338
+ typography: "body",
18339
+ spacing: "md"
18340
+ },
18341
+ behaviours: {
18342
+ supportsThemeSwitching: true,
18343
+ inlineEditing: false,
18344
+ animation: false,
18345
+ paletteHidden: false
18346
+ },
18347
+ additionalFields: composition.fields,
18348
+ layout: blogPostLayout
18349
+ });
18350
+ var blogPostDataSchema = z28.object({
18351
+ id: z28.string(),
18352
+ title: z28.string(),
18353
+ slug: z28.string(),
16987
18354
  path: z28.string(),
16988
18355
  excerpt: z28.string().nullable().optional(),
16989
18356
  image: z28.object({
@@ -17733,6 +19100,37 @@ var faqComposition = composeFragments([
17733
19100
  { fragment: faqHeadingFragment, fieldPriority: 0 },
17734
19101
  { fragment: faqAccordionFragment, fieldPriority: 1 }
17735
19102
  ]);
19103
+ function fragmentLayoutNode(layout) {
19104
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
19105
+ }
19106
+ function isNodeDefinitionArray(layout) {
19107
+ return Array.isArray(layout);
19108
+ }
19109
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19110
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19111
+ var defaultLayout = styledSection({
19112
+ children: styledContainer({
19113
+ baseClassName: "rb-relative rb-isolate",
19114
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
19115
+ }),
19116
+ baseClass: ""
19117
+ });
19118
+ var twoColumnLayout = styledSection({
19119
+ children: styledContainer({
19120
+ baseClassName: "rb-relative rb-isolate",
19121
+ children: el(
19122
+ "div",
19123
+ {
19124
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19125
+ },
19126
+ [
19127
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19128
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19129
+ ]
19130
+ )
19131
+ }),
19132
+ baseClass: ""
19133
+ });
17736
19134
  var faqManifest = createBlockManifest({
17737
19135
  id: "block.faq",
17738
19136
  title: "FAQ",
@@ -17749,13 +19147,22 @@ var faqManifest = createBlockManifest({
17749
19147
  label: "FAQ item styles"
17750
19148
  })
17751
19149
  ],
17752
- layout: styledSection({
17753
- children: styledContainer({
17754
- baseClassName: "rb-relative rb-isolate",
17755
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
17756
- }),
17757
- baseClass: ""
17758
- }),
19150
+ layout: defaultLayout,
19151
+ variants: {
19152
+ default: defaultLayout,
19153
+ "two-column": twoColumnLayout
19154
+ },
19155
+ defaultVariant: "default",
19156
+ variantOptions: {
19157
+ default: {
19158
+ label: "Default",
19159
+ description: "A centered heading above one FAQ accordion."
19160
+ },
19161
+ "two-column": {
19162
+ label: "Two column",
19163
+ description: "A left heading column with FAQ items on the right."
19164
+ }
19165
+ },
17759
19166
  description: "Accordion of frequently asked questions and answers.",
17760
19167
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
17761
19168
  icon: "HelpCircle"
@@ -18405,7 +19812,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
18405
19812
  function resolveHeaderVisualStyles(header, tokens) {
18406
19813
  const navContainerType = header?.navContainer?.type ?? "none";
18407
19814
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
18408
- if (hasContainedNav) {
19815
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
19816
+ if (hasContainedNav || hasTransparentVariant) {
18409
19817
  return {
18410
19818
  backgroundToken: "transparent",
18411
19819
  paletteHex: null,
@@ -18534,6 +19942,17 @@ var headerRootStyleTransform = {
18534
19942
  return mergeStyles(...styleParts);
18535
19943
  }
18536
19944
  };
19945
+ var headerSectionBackgroundTransform = {
19946
+ id: "layout.headerSectionBackground",
19947
+ kind: "string",
19948
+ summary: "Resolve the inner site-header section background token",
19949
+ run: (value) => {
19950
+ const header = asPartialObject(value);
19951
+ const navContainerType = header?.navContainer?.type ?? "none";
19952
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
19953
+ return usesTransparentRoot ? "raw:transparent" : "background";
19954
+ }
19955
+ };
18537
19956
  var footerRootStyleTransform = {
18538
19957
  id: "layout.footerRootStyle",
18539
19958
  kind: "formatter",
@@ -18792,6 +20211,7 @@ var layoutTransforms = [
18792
20211
  headerRootClassTransform,
18793
20212
  footerRootClassTransform,
18794
20213
  headerRootStyleTransform,
20214
+ headerSectionBackgroundTransform,
18795
20215
  footerRootStyleTransform,
18796
20216
  footerBottomBarClassTransform,
18797
20217
  footerBottomBarContainerClassTransform,
@@ -19305,7 +20725,10 @@ var editorialLayout = stack(
19305
20725
  );
19306
20726
  var headerLayout = headerSection(
19307
20727
  {
19308
- background: "background",
20728
+ background: bindProp("$root.theme.header", {
20729
+ transforms: pipe(tx("layout.headerSectionBackground")),
20730
+ fallback: "background"
20731
+ }),
19309
20732
  allowOverflow: true,
19310
20733
  className: bindProp("$root.theme.header", {
19311
20734
  transforms: pipe(tx("layout.headerRootClass")),
@@ -20140,79 +21563,298 @@ var collectionLayout = styledSection({
20140
21563
  { gap: "md" }
20141
21564
  ),
20142
21565
  baseClass: "",
20143
- spacing: "comfortable"
21566
+ spacing: "comfortable"
21567
+ });
21568
+ var collectionManifest = createBlockManifest({
21569
+ id: "block.collection",
21570
+ title: "Collection",
21571
+ category: "layout",
21572
+ additionalFields: [
21573
+ parseFieldDefinition({
21574
+ id: "layout",
21575
+ type: "select",
21576
+ label: "Layout",
21577
+ defaultValue: "grid",
21578
+ options: [
21579
+ { value: "grid", label: "Grid" },
21580
+ { value: "stack", label: "Stack" }
21581
+ ],
21582
+ ui: { intent: "display" }
21583
+ }),
21584
+ parseFieldDefinition({
21585
+ id: "columns",
21586
+ type: "select",
21587
+ label: "Columns",
21588
+ description: "Number of columns in the grid layout.",
21589
+ defaultValue: "3",
21590
+ options: [
21591
+ { value: "2", label: "2 columns" },
21592
+ { value: "3", label: "3 columns" },
21593
+ { value: "4", label: "4 columns" }
21594
+ ],
21595
+ ui: {
21596
+ intent: "display",
21597
+ visibleWhen: { field: "layout", equals: "grid" }
21598
+ }
21599
+ }),
21600
+ parseFieldDefinition({
21601
+ id: "gap",
21602
+ type: "select",
21603
+ label: "Gap",
21604
+ defaultValue: "medium",
21605
+ options: [
21606
+ { value: "none", label: "None" },
21607
+ { value: "compact", label: "Compact" },
21608
+ { value: "cozy", label: "Cozy" },
21609
+ { value: "medium", label: "Medium" },
21610
+ { value: "comfortable", label: "Comfortable" },
21611
+ { value: "spacious", label: "Spacious" }
21612
+ ],
21613
+ ui: { intent: "display" }
21614
+ }),
21615
+ fragmentsToRepeaterField(
21616
+ "items",
21617
+ "Items",
21618
+ collectionFragments,
21619
+ {
21620
+ minItems: 0,
21621
+ maxItems: 50,
21622
+ itemLabel: "Item",
21623
+ description: "Add items to this collection."
21624
+ }
21625
+ ),
21626
+ cardStylesField({
21627
+ id: "_cardStyles",
21628
+ label: "Item styles"
21629
+ })
21630
+ ],
21631
+ layout: collectionLayout,
21632
+ description: "Repeat items in a grid or stack layout.",
21633
+ tags: ["collection", "grid", "stack", "repeater"],
21634
+ icon: "LayoutList",
21635
+ styleTokens: { spacing: "lg" }
21636
+ });
21637
+ var collectionBlockDefinition = {
21638
+ manifest: collectionManifest
21639
+ };
21640
+
21641
+ // ../blocks/src/system/blocks/feature-cards.ts
21642
+ function grid3(props2, children) {
21643
+ return el("grid", props2 ?? void 0, children ?? void 0);
21644
+ }
21645
+ var sectionHeading = stack(
21646
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
21647
+ [
21648
+ text(
21649
+ {
21650
+ as: "h2",
21651
+ className: "rb-feature-cards-title rb-text-center"
21652
+ },
21653
+ when("content.title"),
21654
+ bind("content.title")
21655
+ ),
21656
+ richText(
21657
+ {
21658
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
21659
+ style: textColorStyle("mutedText")
21660
+ },
21661
+ when("content.description"),
21662
+ bind("content.description")
21663
+ )
21664
+ ]
21665
+ );
21666
+ var featureCard = styledCard(
21667
+ [
21668
+ media(
21669
+ {
21670
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
21671
+ style: {
21672
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
21673
+ }
21674
+ },
21675
+ when("card.media"),
21676
+ bind("card.media")
21677
+ ),
21678
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
21679
+ text(
21680
+ {
21681
+ as: "h3",
21682
+ className: "rb-feature-card-title"
21683
+ },
21684
+ bind("card.title")
21685
+ ),
21686
+ richText(
21687
+ {
21688
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
21689
+ style: textColorStyle("mutedText")
21690
+ },
21691
+ when("card.body"),
21692
+ bind("card.body")
21693
+ ),
21694
+ ctaRow({
21695
+ collectionPath: "ctas",
21696
+ itemName: "cta",
21697
+ gap: "sm",
21698
+ justify: "start",
21699
+ containerClassName: "rb-mt-auto"
21700
+ })
21701
+ ])
21702
+ ],
21703
+ {
21704
+ stylesFrom: "content._cardStyles",
21705
+ backgroundFrom: "content._cardStyles.background",
21706
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
21707
+ },
21708
+ repeat("content.cards", "card")
21709
+ );
21710
+ var cardsLayout = styledSection({
21711
+ children: styledContainer({
21712
+ rootType: "stack",
21713
+ rootProps: { gap: "xl" },
21714
+ children: [
21715
+ sectionHeading,
21716
+ grid3(
21717
+ {
21718
+ cols: {
21719
+ $bind: {
21720
+ from: "content.columns",
21721
+ fallback: 3,
21722
+ coerce: "number"
21723
+ }
21724
+ },
21725
+ gap: "lg"
21726
+ },
21727
+ [featureCard]
21728
+ )
21729
+ ]
21730
+ }),
21731
+ baseClass: "",
21732
+ spacing: "medium"
20144
21733
  });
20145
- var collectionManifest = createBlockManifest({
20146
- id: "block.collection",
20147
- title: "Collection",
21734
+ var featureCardsConfig = {
21735
+ id: "block.feature-cards",
21736
+ title: "Feature Cards",
20148
21737
  category: "layout",
21738
+ includeContainerStyles: true,
21739
+ titleSource: "title",
20149
21740
  additionalFields: [
20150
- parseFieldDefinition({
20151
- id: "layout",
20152
- type: "select",
20153
- label: "Layout",
20154
- defaultValue: "grid",
20155
- options: [
20156
- { value: "grid", label: "Grid" },
20157
- { value: "stack", label: "Stack" }
20158
- ],
20159
- ui: { intent: "display" }
20160
- }),
20161
- parseFieldDefinition({
21741
+ {
21742
+ id: "title",
21743
+ type: "text",
21744
+ label: "Title",
21745
+ required: false,
21746
+ multiline: false,
21747
+ maxLength: 120
21748
+ },
21749
+ {
21750
+ id: "description",
21751
+ type: "richText",
21752
+ label: "Description",
21753
+ required: false,
21754
+ ui: {
21755
+ richTextVariant: "limited"
21756
+ }
21757
+ },
21758
+ {
20162
21759
  id: "columns",
20163
21760
  type: "select",
20164
21761
  label: "Columns",
20165
- description: "Number of columns in the grid layout.",
21762
+ required: false,
20166
21763
  defaultValue: "3",
21764
+ multiple: false,
20167
21765
  options: [
20168
21766
  { value: "2", label: "2 columns" },
20169
21767
  { value: "3", label: "3 columns" },
20170
21768
  { value: "4", label: "4 columns" }
20171
21769
  ],
20172
- ui: {
20173
- intent: "display",
20174
- visibleWhen: { field: "layout", equals: "grid" }
20175
- }
20176
- }),
20177
- parseFieldDefinition({
20178
- id: "gap",
20179
- type: "select",
20180
- label: "Gap",
20181
- defaultValue: "medium",
20182
- options: [
20183
- { value: "none", label: "None" },
20184
- { value: "compact", label: "Compact" },
20185
- { value: "cozy", label: "Cozy" },
20186
- { value: "medium", label: "Medium" },
20187
- { value: "comfortable", label: "Comfortable" },
20188
- { value: "spacious", label: "Spacious" }
20189
- ],
20190
21770
  ui: { intent: "display" }
20191
- }),
20192
- fragmentsToRepeaterField(
20193
- "items",
20194
- "Items",
20195
- collectionFragments,
20196
- {
20197
- minItems: 0,
20198
- maxItems: 50,
20199
- itemLabel: "Item",
20200
- description: "Add items to this collection."
21771
+ },
21772
+ {
21773
+ id: "cards",
21774
+ type: "repeater",
21775
+ label: "Cards",
21776
+ required: false,
21777
+ minItems: 1,
21778
+ maxItems: 8,
21779
+ itemLabel: "Card",
21780
+ itemLabelSource: "title",
21781
+ allowConversion: true,
21782
+ ui: {
21783
+ intent: "content"
21784
+ },
21785
+ schema: {
21786
+ fields: [
21787
+ {
21788
+ id: "media",
21789
+ type: "media",
21790
+ label: "Image",
21791
+ required: false,
21792
+ mediaKinds: ["image"]
21793
+ },
21794
+ createAspectRatioField({
21795
+ id: "aspectRatio",
21796
+ label: "Image aspect ratio",
21797
+ defaultValue: "4/3",
21798
+ visibleWhen: { field: "media", notEquals: null }
21799
+ }),
21800
+ {
21801
+ id: "title",
21802
+ type: "text",
21803
+ label: "Title",
21804
+ required: true,
21805
+ multiline: false,
21806
+ maxLength: 120
21807
+ },
21808
+ {
21809
+ id: "body",
21810
+ type: "richText",
21811
+ label: "Text",
21812
+ required: false,
21813
+ ui: {
21814
+ richTextVariant: "limited"
21815
+ }
21816
+ },
21817
+ createCtasRepeater({
21818
+ label: "Calls to action",
21819
+ itemLabel: "CTA",
21820
+ maxItems: 1,
21821
+ button: {
21822
+ variants: [
21823
+ { value: "primary", label: "Primary" },
21824
+ { value: "secondary", label: "Secondary" },
21825
+ { value: "outline", label: "Outline" },
21826
+ { value: "ghost", label: "Ghost" },
21827
+ { value: "link", label: "Link" }
21828
+ ],
21829
+ defaultVariant: "ghost"
21830
+ }
21831
+ })
21832
+ ]
20201
21833
  }
20202
- ),
21834
+ },
20203
21835
  cardStylesField({
20204
21836
  id: "_cardStyles",
20205
- label: "Item styles"
21837
+ label: "Card styles"
20206
21838
  })
20207
21839
  ],
20208
- layout: collectionLayout,
20209
- description: "Repeat items in a grid or stack layout.",
20210
- tags: ["collection", "grid", "stack", "repeater"],
20211
- icon: "LayoutList",
20212
- styleTokens: { spacing: "lg" }
20213
- });
20214
- var collectionBlockDefinition = {
20215
- manifest: collectionManifest
21840
+ layout: cardsLayout,
21841
+ variants: {
21842
+ cards: cardsLayout
21843
+ },
21844
+ defaultVariant: "cards",
21845
+ variantOptions: {
21846
+ cards: {
21847
+ label: "Cards",
21848
+ description: "A responsive grid of image cards with optional calls to action."
21849
+ }
21850
+ },
21851
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
21852
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
21853
+ icon: "PanelsTopLeft"
21854
+ };
21855
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
21856
+ var featureCardsBlockDefinition = {
21857
+ manifest: featureCardsManifest
20216
21858
  };
20217
21859
 
20218
21860
  // ../blocks/src/system/fields/carousel.ts
@@ -20300,69 +21942,6 @@ function createCarouselBehaviorFields(options = {}) {
20300
21942
  return fields3;
20301
21943
  }
20302
21944
 
20303
- // ../blocks/src/system/fields/imageLayout.ts
20304
- function createImageColSizeField(options = {}) {
20305
- const {
20306
- id = "imageColSize",
20307
- label = "Image column size",
20308
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
20309
- defaultValue = "1/3",
20310
- uiIntent = "display",
20311
- visibleWhen
20312
- } = options;
20313
- return {
20314
- id,
20315
- type: "select",
20316
- label,
20317
- description,
20318
- required: false,
20319
- defaultValue,
20320
- multiple: false,
20321
- options: [
20322
- { value: "1/4", label: "Small (1/4)" },
20323
- { value: "1/3", label: "Medium (1/3)" },
20324
- { value: "2/5", label: "Large (2/5)" },
20325
- { value: "1/2", label: "Extra large (1/2)" },
20326
- { value: "2/3", label: "Huge (2/3)" }
20327
- ],
20328
- ui: {
20329
- intent: uiIntent,
20330
- ...visibleWhen ? { visibleWhen } : {}
20331
- }
20332
- };
20333
- }
20334
- function createImagePositionField(options = {}) {
20335
- const {
20336
- id = "imagePosition",
20337
- label = "Image position",
20338
- description = "Choose which side the image appears on.",
20339
- defaultValue = "left",
20340
- includeAlternate = false,
20341
- uiIntent = "display",
20342
- visibleWhen
20343
- } = options;
20344
- const positionOptions = [
20345
- { value: "left", label: "Left" },
20346
- { value: "right", label: "Right" },
20347
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
20348
- ];
20349
- return {
20350
- id,
20351
- type: "select",
20352
- label,
20353
- description,
20354
- required: false,
20355
- defaultValue,
20356
- multiple: false,
20357
- // Spread to get a mutable array type without unsafe casts.
20358
- options: [...positionOptions],
20359
- ui: {
20360
- intent: uiIntent,
20361
- ...visibleWhen ? { visibleWhen } : {}
20362
- }
20363
- };
20364
- }
20365
-
20366
21945
  // ../blocks/src/system/blocks/media-text.ts
20367
21946
  var mediaTextFrameCapability = defineFrameCapability([
20368
21947
  "plain",
@@ -20486,26 +22065,13 @@ var mediaTextManifest = createBlockManifest({
20486
22065
  },
20487
22066
  ui: { intent: "behavior" }
20488
22067
  }),
20489
- {
22068
+ createAspectRatioField({
20490
22069
  id: "aspectRatio",
20491
- type: "select",
20492
22070
  label: "Media aspect ratio",
20493
22071
  description: "Crop media to a consistent aspect ratio.",
20494
- required: false,
20495
22072
  defaultValue: "auto",
20496
- multiple: false,
20497
- options: [
20498
- { value: "auto", label: "Auto (original)" },
20499
- { value: "16/9", label: "16:9 (Landscape)" },
20500
- { value: "4/3", label: "4:3 (Standard)" },
20501
- { value: "1/1", label: "1:1 (Square)" },
20502
- { value: "3/4", label: "3:4 (Portrait)" }
20503
- ],
20504
- ui: {
20505
- intent: "display",
20506
- visibleWhen: { field: "images", notEquals: null }
20507
- }
20508
- },
22073
+ visibleWhen: { field: "images", notEquals: null }
22074
+ }),
20509
22075
  {
20510
22076
  id: "text",
20511
22077
  type: "richText",
@@ -20635,7 +22201,7 @@ var mediaTextManifest = createBlockManifest({
20635
22201
  whenImagesLength(0)
20636
22202
  );
20637
22203
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
20638
- const defaultLayout = styledSection({
22204
+ const defaultLayout2 = styledSection({
20639
22205
  children: styledContainer({
20640
22206
  rootType: "stack",
20641
22207
  rootProps: { gap: "lg" },
@@ -20667,9 +22233,9 @@ var mediaTextManifest = createBlockManifest({
20667
22233
  spacing: "medium"
20668
22234
  });
20669
22235
  return {
20670
- layout: defaultLayout,
22236
+ layout: defaultLayout2,
20671
22237
  variants: {
20672
- default: defaultLayout
22238
+ default: defaultLayout2
20673
22239
  },
20674
22240
  defaultVariant: "default",
20675
22241
  variantOptions: {
@@ -24069,7 +25635,7 @@ var embedBlockDefinition = {
24069
25635
  };
24070
25636
 
24071
25637
  // ../blocks/src/system/blocks/image-gallery.ts
24072
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
25638
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24073
25639
  var galleryContainer = (children, opts) => {
24074
25640
  const gap = opts?.gap ?? "md";
24075
25641
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -24149,7 +25715,7 @@ var galleryItem = (options) => stack(
24149
25715
  ],
24150
25716
  repeat("content.images", "item")
24151
25717
  );
24152
- var gridLayout3 = grid3(
25718
+ var gridLayout3 = grid4(
24153
25719
  {
24154
25720
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
24155
25721
  },
@@ -24752,7 +26318,7 @@ var imageGalleryBlockDefinition = {
24752
26318
  };
24753
26319
 
24754
26320
  // ../blocks/src/system/blocks/video-grid.ts
24755
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
26321
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
24756
26322
  var videoItem = (options) => stack(
24757
26323
  { gap: "xs", className: options.containerClassName },
24758
26324
  [
@@ -24802,7 +26368,7 @@ var gridColumnsClass = (columns) => {
24802
26368
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
24803
26369
  }
24804
26370
  };
24805
- var createGridLayout = (columns) => grid4(
26371
+ var createGridLayout = (columns) => grid5(
24806
26372
  {
24807
26373
  className: gridColumnsClass(columns)
24808
26374
  },
@@ -27966,6 +29532,40 @@ var systemBlockDefinitionsRaw = [
27966
29532
  })
27967
29533
  ]
27968
29534
  })),
29535
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
29536
+ sectionSurfaces: "supported",
29537
+ contentFrames: ["plain", "panel"],
29538
+ itemSurfaces: "unsupported",
29539
+ headingDecorations: ["organic-squiggle"]
29540
+ }), defineBlockDesignMetadata({
29541
+ flow: bodyFlow,
29542
+ layoutProfiles: [
29543
+ layoutProfile({
29544
+ variantKey: "centered-copy",
29545
+ family: "centered",
29546
+ weight: "featured",
29547
+ bias: "soft"
29548
+ }),
29549
+ layoutProfile({
29550
+ variantKey: "statement-copy",
29551
+ family: "split",
29552
+ weight: "featured",
29553
+ bias: "merge"
29554
+ }),
29555
+ layoutProfile({
29556
+ variantKey: "statement-media",
29557
+ family: "media-text",
29558
+ weight: "featured",
29559
+ bias: "soft"
29560
+ }),
29561
+ layoutProfile({
29562
+ variantKey: "media-copy",
29563
+ family: "media-text",
29564
+ weight: "featured",
29565
+ bias: "soft"
29566
+ })
29567
+ ]
29568
+ })),
27969
29569
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27970
29570
  flow: bodyFlow,
27971
29571
  layoutProfiles: [
@@ -28026,9 +29626,17 @@ var systemBlockDefinitionsRaw = [
28026
29626
  flow: conversionFlow,
28027
29627
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
28028
29628
  })),
28029
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
29629
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
29630
+ sectionSurfaces: "supported",
29631
+ contentFrames: ["plain", "panel"],
29632
+ itemSurfaces: "supported",
29633
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
29634
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
28030
29635
  flow: bodyFlow,
28031
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29636
+ layoutProfiles: [
29637
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29638
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
29639
+ ]
28032
29640
  })),
28033
29641
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
28034
29642
  flow: siteChromeFlow,
@@ -28042,7 +29650,8 @@ var systemBlockDefinitionsRaw = [
28042
29650
  sectionSurfaces: "supported",
28043
29651
  contentFrames: ["plain", "panel"],
28044
29652
  itemSurfaces: "supported",
28045
- testimonialCardTreatments: ["default", "accent-quote"]
29653
+ testimonialCardTreatments: ["default", "accent-quote"],
29654
+ headingDecorations: ["short-center-rule"]
28046
29655
  }), defineBlockDesignMetadata({
28047
29656
  flow: proofFlow,
28048
29657
  layoutProfiles: [
@@ -28068,6 +29677,22 @@ var systemBlockDefinitionsRaw = [
28068
29677
  flow: offeringsFlow,
28069
29678
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
28070
29679
  })),
29680
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
29681
+ sectionSurfaces: "supported",
29682
+ contentFrames: ["plain", "panel"],
29683
+ itemSurfaces: "supported",
29684
+ headingDecorations: ["short-center-rule"]
29685
+ }), defineBlockDesignMetadata({
29686
+ flow: offeringsFlow,
29687
+ layoutProfiles: [
29688
+ layoutProfile({
29689
+ variantKey: "cards",
29690
+ family: "grid",
29691
+ weight: "standard",
29692
+ bias: "soft"
29693
+ })
29694
+ ]
29695
+ })),
28071
29696
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
28072
29697
  flow: mediaFlow,
28073
29698
  layoutProfiles: [