@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
@@ -1370,6 +1370,7 @@ var init_validation_constants = __esm({
1370
1370
  "layout.headerRootClass",
1371
1371
  "layout.footerRootClass",
1372
1372
  "layout.headerRootStyle",
1373
+ "layout.headerSectionBackground",
1373
1374
  "layout.footerRootStyle",
1374
1375
  // UI (ui.ts)
1375
1376
  "ui.headerNavLinkClass",
@@ -2445,10 +2446,12 @@ function defineBlockDesignCapability(capability) {
2445
2446
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
2446
2447
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
2447
2448
  tileTreatments: capability.tileTreatments ?? ["default"],
2448
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
2449
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
2450
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
2451
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
2449
2452
  };
2450
2453
  }
2451
- var plainFrame, tileTreatmentValues, eyebrowTreatmentValues;
2454
+ var plainFrame, tileTreatmentValues, eyebrowTreatmentValues, visibleHeadingDecorationFamilyValues, visibleHeadingDecorationPlacementValues, headingDecorationOverrideValues, headingDecorationColorTokenValues, accordionIconSetValues, accordionIconColorTokenValues, accordionIconMotionValues;
2452
2455
  var init_types2 = __esm({
2453
2456
  "../theme-core/src/site-styles/types.ts"() {
2454
2457
  "use strict";
@@ -2467,6 +2470,47 @@ var init_types2 = __esm({
2467
2470
  "pill-bounce",
2468
2471
  "accent-pill-bounce"
2469
2472
  ];
2473
+ visibleHeadingDecorationFamilyValues = [
2474
+ "organic-squiggle",
2475
+ "short-center-rule"
2476
+ ];
2477
+ visibleHeadingDecorationPlacementValues = [
2478
+ "after-heading",
2479
+ "between-heading-and-body",
2480
+ "under-centered-heading"
2481
+ ];
2482
+ headingDecorationOverrideValues = [
2483
+ "site-default",
2484
+ "on",
2485
+ "off"
2486
+ ];
2487
+ headingDecorationColorTokenValues = [
2488
+ "text",
2489
+ "primary",
2490
+ "secondary",
2491
+ "accent",
2492
+ "border",
2493
+ "muted"
2494
+ ];
2495
+ accordionIconSetValues = [
2496
+ "plus",
2497
+ "chevron",
2498
+ "caret",
2499
+ "minimal-cross"
2500
+ ];
2501
+ accordionIconColorTokenValues = [
2502
+ "text",
2503
+ "muted",
2504
+ "primary",
2505
+ "secondary",
2506
+ "accent",
2507
+ "current"
2508
+ ];
2509
+ accordionIconMotionValues = [
2510
+ "none",
2511
+ "rotate",
2512
+ "swap"
2513
+ ];
2470
2514
  }
2471
2515
  });
2472
2516
 
@@ -2663,6 +2707,25 @@ var init_blockAppearancePresets = __esm({
2663
2707
  emphasis: "high"
2664
2708
  }
2665
2709
  }),
2710
+ defineBlockAppearancePreset({
2711
+ kind: "block-design",
2712
+ id: "intro-soft-earth-statement",
2713
+ target: "intro",
2714
+ label: "Soft Earth intro statement",
2715
+ blockKinds: ["block.intro"],
2716
+ design: {
2717
+ sectionSurface: "base",
2718
+ contentFrame: plainFrame,
2719
+ itemSurface: "none",
2720
+ transitionAfter: "soft-fade-short",
2721
+ emphasis: "high",
2722
+ headingDecoration: {
2723
+ family: "organic-squiggle",
2724
+ placement: "after-heading",
2725
+ colorToken: "primary"
2726
+ }
2727
+ }
2728
+ }),
2666
2729
  defineBlockAppearancePreset({
2667
2730
  kind: "block-design",
2668
2731
  id: "offerings-calm-list",
@@ -2677,6 +2740,25 @@ var init_blockAppearancePresets = __esm({
2677
2740
  emphasis: "medium"
2678
2741
  }
2679
2742
  }),
2743
+ defineBlockAppearancePreset({
2744
+ kind: "block-design",
2745
+ id: "feature-cards-soft-earth-offerings",
2746
+ target: "feature-cards",
2747
+ label: "Soft Earth offering cards",
2748
+ blockKinds: ["block.feature-cards"],
2749
+ design: {
2750
+ sectionSurface: "base",
2751
+ contentFrame: plainFrame,
2752
+ itemSurface: "raised",
2753
+ transitionAfter: "none",
2754
+ emphasis: "high",
2755
+ headingDecoration: {
2756
+ family: "short-center-rule",
2757
+ placement: "under-centered-heading",
2758
+ colorToken: "primary"
2759
+ }
2760
+ }
2761
+ }),
2680
2762
  defineBlockAppearancePreset({
2681
2763
  kind: "block-design",
2682
2764
  id: "events-base-calendar",
@@ -2805,6 +2887,26 @@ var init_blockAppearancePresets = __esm({
2805
2887
  testimonialCardTreatment: "accent-quote"
2806
2888
  }
2807
2889
  }),
2890
+ defineBlockAppearancePreset({
2891
+ kind: "block-design",
2892
+ id: "testimonials-soft-earth-proof-band",
2893
+ target: "testimonials",
2894
+ label: "Soft Earth proof band",
2895
+ blockKinds: ["block.testimonials"],
2896
+ design: {
2897
+ sectionSurface: "brand-depth-band",
2898
+ contentFrame: plainFrame,
2899
+ itemSurface: "none",
2900
+ transitionAfter: "soft-fade-short",
2901
+ emphasis: "high",
2902
+ testimonialCardTreatment: "accent-quote",
2903
+ headingDecoration: {
2904
+ family: "short-center-rule",
2905
+ placement: "under-centered-heading",
2906
+ colorToken: "border"
2907
+ }
2908
+ }
2909
+ }),
2808
2910
  defineBlockAppearancePreset({
2809
2911
  kind: "block-design",
2810
2912
  id: "faq-base-accordion",
@@ -2833,6 +2935,25 @@ var init_blockAppearancePresets = __esm({
2833
2935
  emphasis: "low"
2834
2936
  }
2835
2937
  }),
2938
+ defineBlockAppearancePreset({
2939
+ kind: "block-design",
2940
+ id: "faq-soft-earth-two-column",
2941
+ target: "faq",
2942
+ label: "Soft Earth two-column FAQ",
2943
+ blockKinds: ["block.faq"],
2944
+ design: {
2945
+ sectionSurface: "base",
2946
+ contentFrame: plainFrame,
2947
+ itemSurface: "flat",
2948
+ transitionAfter: "none",
2949
+ emphasis: "medium",
2950
+ accordionIconTreatment: {
2951
+ iconSet: "plus",
2952
+ colorToken: "primary",
2953
+ motion: "swap"
2954
+ }
2955
+ }
2956
+ }),
2836
2957
  defineBlockAppearancePreset({
2837
2958
  kind: "block-design",
2838
2959
  id: "contact-form-panel",
@@ -3648,6 +3769,104 @@ var init_confident_chip = __esm({
3648
3769
  }
3649
3770
  });
3650
3771
 
3772
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
3773
+ var earthPill;
3774
+ var init_earth_pill = __esm({
3775
+ "../theme-core/src/buttons/personalities/earth-pill.ts"() {
3776
+ "use strict";
3777
+ init_types4();
3778
+ earthPill = defineButtonPersonality({
3779
+ id: "earth-pill",
3780
+ name: "Earth Pill",
3781
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
3782
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
3783
+ buttonSystem: {
3784
+ global: {
3785
+ cornerStyle: "pill",
3786
+ shadow: "low",
3787
+ textTransform: "none",
3788
+ fontWeight: 500,
3789
+ borderWidth: 1,
3790
+ hoverTransform: "lift",
3791
+ hoverColor: "none",
3792
+ typography: "body",
3793
+ paddingPreset: "default"
3794
+ },
3795
+ sizes: {
3796
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
3797
+ md: { padding: "0.625rem 1.35rem" },
3798
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
3799
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
3800
+ },
3801
+ variants: [
3802
+ {
3803
+ id: "primary",
3804
+ name: "Primary",
3805
+ enabled: true,
3806
+ priority: 1,
3807
+ background: { type: "solid", colorToken: "primary" },
3808
+ textColorToken: "primaryForeground",
3809
+ borderRadius: "rounded-full",
3810
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
3811
+ effects: {
3812
+ hover: [
3813
+ { effectId: "lift", options: { translateY: "-1px" } },
3814
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
3815
+ ],
3816
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
3817
+ }
3818
+ },
3819
+ {
3820
+ id: "secondary",
3821
+ name: "Secondary",
3822
+ enabled: true,
3823
+ priority: 2,
3824
+ background: { type: "transparent" },
3825
+ textColorToken: "primary",
3826
+ borderRadius: "rounded-full",
3827
+ border: { widthClass: "border", colorToken: "primary" },
3828
+ effects: {
3829
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
3830
+ }
3831
+ },
3832
+ {
3833
+ id: "outline",
3834
+ name: "Outline",
3835
+ enabled: true,
3836
+ priority: 3,
3837
+ background: { type: "transparent" },
3838
+ textColorToken: "text",
3839
+ borderRadius: "rounded-full",
3840
+ border: { widthClass: "border", colorToken: "border" },
3841
+ effects: {
3842
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
3843
+ }
3844
+ },
3845
+ {
3846
+ id: "ghost",
3847
+ name: "Ghost",
3848
+ enabled: true,
3849
+ priority: 3,
3850
+ background: { type: "transparent" },
3851
+ textColorToken: "primary",
3852
+ borderRadius: "rounded-full",
3853
+ shadow: { elevation: "none", softness: null, position: "bottom" },
3854
+ sizes: {
3855
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
3856
+ md: { padding: "0.375rem 0" },
3857
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
3858
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
3859
+ },
3860
+ effects: {
3861
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
3862
+ }
3863
+ }
3864
+ ]
3865
+ }
3866
+ });
3867
+ }
3868
+ });
3869
+
3651
3870
  // ../theme-core/src/buttons/personalities/editorial-link.ts
3652
3871
  var editorialLink;
3653
3872
  var init_editorial_link = __esm({
@@ -4145,6 +4364,7 @@ var init_personalities = __esm({
4145
4364
  "use strict";
4146
4365
  init_brushed_wash();
4147
4366
  init_confident_chip();
4367
+ init_earth_pill();
4148
4368
  init_editorial_link();
4149
4369
  init_ink_stamp();
4150
4370
  init_pebble();
@@ -4153,6 +4373,7 @@ var init_personalities = __esm({
4153
4373
  init_types4();
4154
4374
  buttonPersonalities = [
4155
4375
  softPill,
4376
+ earthPill,
4156
4377
  confidentChip,
4157
4378
  editorialLink,
4158
4379
  pebble,
@@ -7128,7 +7349,7 @@ var init_tokenOrColor = __esm({
7128
7349
 
7129
7350
  // ../theme-core/src/schema.ts
7130
7351
  import { z as z24 } from "zod";
7131
- var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, buttonStyle, cardStyle, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema, themesTurnSchema;
7352
+ var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, buttonStyle, cardStyle, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema, themesTurnSchema;
7132
7353
  var init_schema3 = __esm({
7133
7354
  "../theme-core/src/schema.ts"() {
7134
7355
  "use strict";
@@ -7223,12 +7444,36 @@ var init_schema3 = __esm({
7223
7444
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
7224
7445
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
7225
7446
  });
7447
+ noHeadingDecorationSchema = z24.object({
7448
+ family: z24.literal("none"),
7449
+ placement: z24.literal("none")
7450
+ });
7451
+ visibleHeadingDecorationSchema = z24.object({
7452
+ family: z24.enum(visibleHeadingDecorationFamilyValues),
7453
+ placement: z24.enum(visibleHeadingDecorationPlacementValues),
7454
+ colorToken: z24.enum(headingDecorationColorTokenValues).optional()
7455
+ });
7456
+ headingDecorationSchema = z24.union([
7457
+ noHeadingDecorationSchema,
7458
+ visibleHeadingDecorationSchema
7459
+ ]);
7460
+ accordionIconTreatmentSchema = z24.object({
7461
+ iconSet: z24.enum(accordionIconSetValues),
7462
+ colorToken: z24.enum(accordionIconColorTokenValues),
7463
+ openColorToken: z24.enum(accordionIconColorTokenValues).optional(),
7464
+ motion: z24.enum(accordionIconMotionValues)
7465
+ });
7226
7466
  sectionStylesOverrideSchema = z24.object({
7227
7467
  background: boxBackgroundSchema.nullable().optional(),
7228
7468
  spacing: semanticSpacingSchema.nullable().optional(),
7229
7469
  minHeight: z24.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
7230
7470
  tileTreatment: z24.enum(tileTreatmentValues).nullable().optional(),
7231
- eyebrowTreatment: z24.enum(eyebrowTreatmentValues).nullable().optional()
7471
+ eyebrowTreatment: z24.enum(eyebrowTreatmentValues).nullable().optional(),
7472
+ headingDecoration: headingDecorationSchema.nullable().optional(),
7473
+ // Author-level override consumed by later block/editor rendering phases.
7474
+ // Keeping it in section styles lets existing block save APIs persist it.
7475
+ headingDecorationOverride: z24.enum(headingDecorationOverrideValues).nullable().optional(),
7476
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
7232
7477
  });
7233
7478
  containerStylesOverrideSchema = z24.object({
7234
7479
  background: boxBackgroundSchema.nullable().optional(),
@@ -7925,7 +8170,7 @@ var init_soft_natural = __esm({
7925
8170
  });
7926
8171
 
7927
8172
  // ../theme-core/src/palette/variants/warm-neutral.ts
7928
- var warmNeutralClay, warmNeutralCream, warmNeutralForest;
8173
+ var warmNeutralClay, warmNeutralCream, warmNeutralSoftEarth, warmNeutralForest;
7929
8174
  var init_warm_neutral = __esm({
7930
8175
  "../theme-core/src/palette/variants/warm-neutral.ts"() {
7931
8176
  "use strict";
@@ -7974,6 +8219,28 @@ var init_warm_neutral = __esm({
7974
8219
  { name: "border", hex: "#e0d2b8" }
7975
8220
  ]
7976
8221
  });
8222
+ warmNeutralSoftEarth = definePaletteVariant({
8223
+ id: "warm-neutral-soft-earth",
8224
+ name: "Warm Neutral \u2014 Soft Earth",
8225
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
8226
+ tags: { tone: "classic", energy: "calm", era: "organic" },
8227
+ mode: "light",
8228
+ colors: [
8229
+ { name: "primary", hex: "#a8573d" },
8230
+ { name: "secondary", hex: "#72765c" },
8231
+ { name: "accent", hex: "#c87557" },
8232
+ { name: "success", hex: "#687854" },
8233
+ { name: "warning", hex: "#b7863e" },
8234
+ { name: "destructive", hex: "#a54b3c" },
8235
+ { name: "background", hex: "#fbf6eb" },
8236
+ { name: "surface", hex: "#fffdf7" },
8237
+ { name: "surfaceAlt", hex: "#f0e4d3" },
8238
+ { name: "muted", hex: "#eadbc6" },
8239
+ { name: "text", hex: "#30281f" },
8240
+ { name: "primaryForeground", hex: "#fffaf3" },
8241
+ { name: "border", hex: "#d9c8b2" }
8242
+ ]
8243
+ });
7977
8244
  warmNeutralForest = definePaletteVariant({
7978
8245
  id: "warm-neutral-forest",
7979
8246
  name: "Warm Neutral \u2014 Forest",
@@ -8018,6 +8285,7 @@ var init_variants = __esm({
8018
8285
  // Warm-neutral family
8019
8286
  warmNeutralClay,
8020
8287
  warmNeutralCream,
8288
+ warmNeutralSoftEarth,
8021
8289
  warmNeutralForest,
8022
8290
  // High-contrast family
8023
8291
  highContrastInk,
@@ -8046,6 +8314,12 @@ var init_customizableSurfaces = __esm({
8046
8314
  function asHeaderLookId(value) {
8047
8315
  return value;
8048
8316
  }
8317
+ function asHeaderLayoutId(value) {
8318
+ return value;
8319
+ }
8320
+ function asHeaderStyleId(value) {
8321
+ return value;
8322
+ }
8049
8323
  function baseHeader(theme) {
8050
8324
  const {
8051
8325
  navLinkStyle: _navLinkStyle,
@@ -8064,6 +8338,34 @@ function baseHeader(theme) {
8064
8338
  navContainer: { type: "none", tint: null, opacity: 0.15 }
8065
8339
  };
8066
8340
  }
8341
+ function supportedLayouts(ids) {
8342
+ return ids.map(asHeaderLayoutId);
8343
+ }
8344
+ function headerStyleRepairChain(values) {
8345
+ return values.map(asHeaderStyleId);
8346
+ }
8347
+ function getHeaderStyle(id) {
8348
+ return headerStylesById.get(id) ?? null;
8349
+ }
8350
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
8351
+ return style.supportedLayoutIds.includes(layoutId);
8352
+ }
8353
+ function getHeaderStyleOrThrow(id) {
8354
+ const style = getHeaderStyle(id);
8355
+ if (!style) {
8356
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
8357
+ }
8358
+ return style;
8359
+ }
8360
+ function resolveLegacyHeaderLookAlias(lookId) {
8361
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
8362
+ }
8363
+ function getCompatibleHeaderStyleIds(layoutId) {
8364
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
8365
+ const style = getHeaderStyleOrThrow(styleId);
8366
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
8367
+ });
8368
+ }
8067
8369
  function solidBrandHeader(theme) {
8068
8370
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
8069
8371
  return {
@@ -8294,19 +8596,302 @@ function floatingGlassHeader(theme) {
8294
8596
  }
8295
8597
  };
8296
8598
  }
8297
- var headerLookCatalog, guaranteedFallbackHeaderLookId, headerLooksById;
8599
+ function headerConfigurationKey(configuration) {
8600
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
8601
+ }
8602
+ var headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, headerStyleRepairOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLookId, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, allowedHeaderConfigurationKeys, headerLooksById;
8298
8603
  var init_headerLooks = __esm({
8299
8604
  "../theme-core/src/site-styles/headerLooks.ts"() {
8300
8605
  "use strict";
8301
8606
  init_headerCtaVariants();
8302
8607
  init_customizableSurfaces();
8303
8608
  init_types2();
8609
+ headerLayoutCatalog = [
8610
+ {
8611
+ id: asHeaderLayoutId("classic"),
8612
+ label: "Classic",
8613
+ description: "Logo and navigation in one practical horizontal row.",
8614
+ structure: "inline-classic",
8615
+ variant: "classic",
8616
+ defaultPositioning: "sticky",
8617
+ shrinkOnScroll: false
8618
+ },
8619
+ {
8620
+ id: asHeaderLayoutId("centered"),
8621
+ label: "Centered",
8622
+ description: "Logo centered above a balanced navigation row.",
8623
+ structure: "centered-stack",
8624
+ variant: "centered",
8625
+ defaultPositioning: "static",
8626
+ shrinkOnScroll: false,
8627
+ maxRecommendedNavItems: 5,
8628
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
8629
+ },
8630
+ {
8631
+ id: asHeaderLayoutId("editorial"),
8632
+ label: "Editorial",
8633
+ description: "A composed, magazine-like stacked header treatment.",
8634
+ structure: "editorial-stack",
8635
+ variant: "editorial",
8636
+ defaultPositioning: "static",
8637
+ shrinkOnScroll: false,
8638
+ maxRecommendedNavItems: 6
8639
+ },
8640
+ {
8641
+ id: asHeaderLayoutId("floating"),
8642
+ label: "Floating",
8643
+ description: "Detached header chrome that sits over the opening section.",
8644
+ structure: "floating-shell",
8645
+ variant: "floating",
8646
+ defaultPositioning: "fixed",
8647
+ shrinkOnScroll: true,
8648
+ maxRecommendedNavItems: 5,
8649
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
8650
+ }
8651
+ ];
8652
+ headerStyleCatalog = [
8653
+ {
8654
+ id: asHeaderStyleId("minimal"),
8655
+ label: "Minimal",
8656
+ description: "Quiet surface with simple color-change navigation.",
8657
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
8658
+ navInteraction: "color-change",
8659
+ surface: "neutral"
8660
+ },
8661
+ {
8662
+ id: asHeaderStyleId("fine-line"),
8663
+ label: "Fine Line",
8664
+ description: "Light surface with a crisp lower rule and underline hover.",
8665
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
8666
+ navInteraction: "underline-grow",
8667
+ surface: "bordered"
8668
+ },
8669
+ {
8670
+ id: asHeaderStyleId("soft-bar"),
8671
+ label: "Soft Bar",
8672
+ description: "Soft tinted surface with gentle pill hover states.",
8673
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8674
+ navInteraction: "pill-background",
8675
+ surface: "soft"
8676
+ },
8677
+ {
8678
+ id: asHeaderStyleId("pill-nav"),
8679
+ label: "Pill Nav",
8680
+ description: "A calm pill navigation rail over a neutral header.",
8681
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8682
+ navInteraction: "pill-background",
8683
+ surface: "soft"
8684
+ },
8685
+ {
8686
+ id: asHeaderStyleId("brand-bar"),
8687
+ label: "Brand Bar",
8688
+ description: "Solid brand surface with high-contrast navigation.",
8689
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
8690
+ navInteraction: "color-change",
8691
+ surface: "brand-solid"
8692
+ },
8693
+ {
8694
+ id: asHeaderStyleId("brand-underline"),
8695
+ label: "Brand Underline",
8696
+ description: "Brand surface with underline-grow navigation.",
8697
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
8698
+ navInteraction: "underline-grow",
8699
+ surface: "brand-solid"
8700
+ },
8701
+ {
8702
+ id: asHeaderStyleId("brand-pill"),
8703
+ label: "Brand Pill",
8704
+ description: "Solid brand surface with rounded active and hover states.",
8705
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
8706
+ navInteraction: "pill-background",
8707
+ surface: "brand-solid"
8708
+ },
8709
+ {
8710
+ id: asHeaderStyleId("editorial-line"),
8711
+ label: "Editorial Line",
8712
+ description: "Typographic logo treatment with understated underline navigation.",
8713
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
8714
+ navInteraction: "underline-grow",
8715
+ surface: "bordered"
8716
+ },
8717
+ {
8718
+ id: asHeaderStyleId("flat-tabs"),
8719
+ label: "Flat Tabs",
8720
+ description: "Flat block hover and active states with a Swiss utility feel.",
8721
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
8722
+ navInteraction: "flat-block",
8723
+ surface: "bordered"
8724
+ },
8725
+ {
8726
+ id: asHeaderStyleId("glass"),
8727
+ label: "Glass",
8728
+ description: "Floating translucent chrome with frosted navigation backing.",
8729
+ supportedLayoutIds: supportedLayouts(["floating"]),
8730
+ navInteraction: "glass-backed",
8731
+ surface: "floating",
8732
+ requiresFloatingLayout: true
8733
+ },
8734
+ {
8735
+ id: asHeaderStyleId("minimal-surface"),
8736
+ label: "Minimal Surface",
8737
+ description: "Floating chrome with a restrained translucent surface.",
8738
+ supportedLayoutIds: supportedLayouts(["floating"]),
8739
+ navInteraction: "color-change",
8740
+ surface: "floating",
8741
+ requiresFloatingLayout: true
8742
+ },
8743
+ {
8744
+ id: asHeaderStyleId("soft-shell"),
8745
+ label: "Soft Shell",
8746
+ description: "Floating rounded shell with soft pill navigation states.",
8747
+ supportedLayoutIds: supportedLayouts(["floating"]),
8748
+ navInteraction: "pill-background",
8749
+ surface: "floating",
8750
+ requiresFloatingLayout: true
8751
+ }
8752
+ ];
8753
+ headerLayoutsById = new Map(
8754
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
8755
+ );
8756
+ headerStylesById = new Map(
8757
+ headerStyleCatalog.map((style) => [style.id, style])
8758
+ );
8759
+ headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8760
+ [
8761
+ asHeaderLayoutId("classic"),
8762
+ headerStyleRepairChain([
8763
+ "minimal",
8764
+ "fine-line",
8765
+ "soft-bar",
8766
+ "pill-nav",
8767
+ "brand-bar",
8768
+ "brand-underline",
8769
+ "brand-pill",
8770
+ "editorial-line",
8771
+ "flat-tabs"
8772
+ ])
8773
+ ],
8774
+ [
8775
+ asHeaderLayoutId("centered"),
8776
+ headerStyleRepairChain([
8777
+ "minimal",
8778
+ "fine-line",
8779
+ "soft-bar",
8780
+ "pill-nav",
8781
+ "brand-bar",
8782
+ "brand-pill",
8783
+ "editorial-line",
8784
+ "flat-tabs"
8785
+ ])
8786
+ ],
8787
+ [
8788
+ asHeaderLayoutId("editorial"),
8789
+ headerStyleRepairChain([
8790
+ "minimal",
8791
+ "fine-line",
8792
+ "soft-bar",
8793
+ "brand-bar",
8794
+ "brand-underline",
8795
+ "editorial-line",
8796
+ "flat-tabs"
8797
+ ])
8798
+ ],
8799
+ [
8800
+ asHeaderLayoutId("floating"),
8801
+ headerStyleRepairChain([
8802
+ "glass",
8803
+ "minimal-surface",
8804
+ "soft-shell",
8805
+ "brand-pill"
8806
+ ])
8807
+ ]
8808
+ ]);
8809
+ headerStyleRepairOrder = /* @__PURE__ */ new Map([
8810
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
8811
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
8812
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
8813
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
8814
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
8815
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
8816
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
8817
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
8818
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
8819
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
8820
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
8821
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
8822
+ ]);
8823
+ legacyHeaderLookAliases = [
8824
+ {
8825
+ lookId: asHeaderLookId("clean-base"),
8826
+ selection: {
8827
+ layoutId: asHeaderLayoutId("classic"),
8828
+ styleId: asHeaderStyleId("minimal")
8829
+ }
8830
+ },
8831
+ {
8832
+ lookId: asHeaderLookId("brand-solid"),
8833
+ selection: {
8834
+ layoutId: asHeaderLayoutId("classic"),
8835
+ styleId: asHeaderStyleId("brand-bar")
8836
+ }
8837
+ },
8838
+ {
8839
+ lookId: asHeaderLookId("editorial-line"),
8840
+ selection: {
8841
+ layoutId: asHeaderLayoutId("editorial"),
8842
+ styleId: asHeaderStyleId("editorial-line")
8843
+ }
8844
+ },
8845
+ {
8846
+ lookId: asHeaderLookId("centered-calm"),
8847
+ selection: {
8848
+ layoutId: asHeaderLayoutId("centered"),
8849
+ styleId: asHeaderStyleId("minimal")
8850
+ }
8851
+ },
8852
+ {
8853
+ lookId: asHeaderLookId("practical-utility"),
8854
+ selection: {
8855
+ layoutId: asHeaderLayoutId("classic"),
8856
+ styleId: asHeaderStyleId("flat-tabs")
8857
+ }
8858
+ },
8859
+ {
8860
+ lookId: asHeaderLookId("minimal-transparent"),
8861
+ selection: {
8862
+ layoutId: asHeaderLayoutId("classic"),
8863
+ styleId: asHeaderStyleId("minimal")
8864
+ }
8865
+ },
8866
+ {
8867
+ lookId: asHeaderLookId("transparent-overlay"),
8868
+ selection: {
8869
+ layoutId: asHeaderLayoutId("floating"),
8870
+ styleId: asHeaderStyleId("glass")
8871
+ }
8872
+ },
8873
+ {
8874
+ lookId: asHeaderLookId("floating-glass"),
8875
+ selection: {
8876
+ layoutId: asHeaderLayoutId("floating"),
8877
+ styleId: asHeaderStyleId("glass")
8878
+ }
8879
+ }
8880
+ ];
8881
+ legacyHeaderLookAliasesById = new Map(
8882
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
8883
+ );
8304
8884
  headerLookCatalog = [
8305
8885
  {
8306
8886
  id: asHeaderLookId("clean-base"),
8307
8887
  label: "Clean base",
8308
8888
  visualTreatment: "solid-neutral",
8309
8889
  layoutBehavior: "sticky",
8890
+ configuration: {
8891
+ structure: "inline-classic",
8892
+ treatment: "solid-neutral",
8893
+ behavior: "sticky"
8894
+ },
8310
8895
  openingRequirement: "none",
8311
8896
  compile: cleanBaseHeader
8312
8897
  },
@@ -8315,6 +8900,11 @@ var init_headerLooks = __esm({
8315
8900
  label: "Brand solid",
8316
8901
  visualTreatment: "solid-brand",
8317
8902
  layoutBehavior: "sticky-shrink",
8903
+ configuration: {
8904
+ structure: "inline-classic",
8905
+ treatment: "solid-brand",
8906
+ behavior: "sticky-shrink"
8907
+ },
8318
8908
  openingRequirement: "none",
8319
8909
  compile: solidBrandHeader
8320
8910
  },
@@ -8323,6 +8913,11 @@ var init_headerLooks = __esm({
8323
8913
  label: "Editorial line",
8324
8914
  visualTreatment: "light-editorial",
8325
8915
  layoutBehavior: "sticky",
8916
+ configuration: {
8917
+ structure: "editorial-stack",
8918
+ treatment: "light-editorial",
8919
+ behavior: "sticky"
8920
+ },
8326
8921
  openingRequirement: "none",
8327
8922
  maxRecommendedNavItems: 6,
8328
8923
  compile: editorialLineHeader
@@ -8332,6 +8927,11 @@ var init_headerLooks = __esm({
8332
8927
  label: "Centered calm",
8333
8928
  visualTreatment: "light-editorial",
8334
8929
  layoutBehavior: "normal-flow",
8930
+ configuration: {
8931
+ structure: "centered-stack",
8932
+ treatment: "light-editorial",
8933
+ behavior: "normal-flow"
8934
+ },
8335
8935
  openingRequirement: "none",
8336
8936
  maxRecommendedNavItems: 5,
8337
8937
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -8342,6 +8942,11 @@ var init_headerLooks = __esm({
8342
8942
  label: "Practical utility",
8343
8943
  visualTreatment: "solid-neutral",
8344
8944
  layoutBehavior: "sticky-shrink",
8945
+ configuration: {
8946
+ structure: "inline-classic",
8947
+ treatment: "solid-neutral",
8948
+ behavior: "sticky-shrink"
8949
+ },
8345
8950
  openingRequirement: "none",
8346
8951
  requiresProminentCta: true,
8347
8952
  compile: practicalUtilityHeader
@@ -8351,6 +8956,11 @@ var init_headerLooks = __esm({
8351
8956
  label: "Minimal transparent",
8352
8957
  visualTreatment: "minimal-transparent",
8353
8958
  layoutBehavior: "normal-flow",
8959
+ configuration: {
8960
+ structure: "inline-classic",
8961
+ treatment: "minimal-transparent",
8962
+ behavior: "normal-flow"
8963
+ },
8354
8964
  openingRequirement: "reserved-space-ok",
8355
8965
  compile: minimalTransparentHeader
8356
8966
  },
@@ -8359,6 +8969,11 @@ var init_headerLooks = __esm({
8359
8969
  label: "Transparent overlay",
8360
8970
  visualTreatment: "transparent-overlay",
8361
8971
  layoutBehavior: "fixed-overlay",
8972
+ configuration: {
8973
+ structure: "inline-classic",
8974
+ treatment: "transparent-overlay",
8975
+ behavior: "fixed-overlay"
8976
+ },
8362
8977
  openingRequirement: "requires-image-hero-with-contrast-overlay",
8363
8978
  maxRecommendedNavItems: 5,
8364
8979
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -8369,6 +8984,11 @@ var init_headerLooks = __esm({
8369
8984
  label: "Floating glass",
8370
8985
  visualTreatment: "floating-glass",
8371
8986
  layoutBehavior: "fixed-floating",
8987
+ configuration: {
8988
+ structure: "floating-shell",
8989
+ treatment: "floating-glass",
8990
+ behavior: "fixed-floating"
8991
+ },
8372
8992
  openingRequirement: "requires-image-hero-with-contrast-overlay",
8373
8993
  maxRecommendedNavItems: 5,
8374
8994
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -8376,6 +8996,11 @@ var init_headerLooks = __esm({
8376
8996
  }
8377
8997
  ];
8378
8998
  guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
8999
+ guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
9000
+ guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
9001
+ allowedHeaderConfigurationKeys = new Set(
9002
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
9003
+ );
8379
9004
  headerLooksById = new Map(
8380
9005
  headerLookCatalog.map((look) => [look.id, look])
8381
9006
  );
@@ -8535,6 +9160,270 @@ var init_sourceCatalogs = __esm({
8535
9160
  }
8536
9161
  });
8537
9162
 
9163
+ // ../theme-core/src/site-styles/typographyPresets.ts
9164
+ function asTypographyPresetId(value) {
9165
+ if (!value.startsWith("typography-preset:")) {
9166
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
9167
+ }
9168
+ return value;
9169
+ }
9170
+ function defineTypographyPreset(preset2) {
9171
+ return {
9172
+ ...preset2,
9173
+ id: asTypographyPresetId(preset2.id)
9174
+ };
9175
+ }
9176
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, boldDisplayTypography, typographyPresets, typographyPresetsById;
9177
+ var init_typographyPresets = __esm({
9178
+ "../theme-core/src/site-styles/typographyPresets.ts"() {
9179
+ "use strict";
9180
+ bodyReadablePolicy = {
9181
+ recommendedCategories: ["sans-serif", "serif"],
9182
+ allowedCategories: ["sans-serif", "serif"],
9183
+ requiresItalicForBody: true,
9184
+ requiresBoldForBody: true
9185
+ };
9186
+ headingFlexiblePolicy = {
9187
+ recommendedCategories: ["sans-serif", "serif", "display"],
9188
+ allowedCategories: ["sans-serif", "serif", "display"]
9189
+ };
9190
+ displayHeadingPolicy = {
9191
+ recommendedCategories: ["display", "sans-serif", "serif"],
9192
+ allowedCategories: ["display", "sans-serif", "serif"]
9193
+ };
9194
+ modernSansTypography = {
9195
+ body: {
9196
+ family: "Inter, system-ui, sans-serif",
9197
+ size: "md",
9198
+ weight: "regular",
9199
+ lineHeight: "relaxed",
9200
+ letterSpacing: "normal"
9201
+ },
9202
+ headings: {
9203
+ default: {
9204
+ family: "Inter, system-ui, sans-serif",
9205
+ weight: "semibold",
9206
+ lineHeight: "normal",
9207
+ letterSpacing: "tight",
9208
+ italic: null,
9209
+ case: null
9210
+ },
9211
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9212
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9213
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
9214
+ },
9215
+ scale: "balanced"
9216
+ };
9217
+ warmRoundedTypography = {
9218
+ body: {
9219
+ family: "Nunito Sans, system-ui, sans-serif",
9220
+ size: "lg",
9221
+ weight: "regular",
9222
+ lineHeight: "relaxed",
9223
+ letterSpacing: "normal"
9224
+ },
9225
+ headings: {
9226
+ default: {
9227
+ family: "Nunito Sans, system-ui, sans-serif",
9228
+ weight: "bold",
9229
+ lineHeight: "normal",
9230
+ letterSpacing: "normal",
9231
+ italic: null,
9232
+ case: null
9233
+ },
9234
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9235
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9236
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
9237
+ },
9238
+ scale: "balanced"
9239
+ };
9240
+ editorialSerifTypography = {
9241
+ body: {
9242
+ family: "Lora, Georgia, serif",
9243
+ size: "lg",
9244
+ weight: "regular",
9245
+ lineHeight: "loose",
9246
+ letterSpacing: "normal"
9247
+ },
9248
+ headings: {
9249
+ default: {
9250
+ family: "Playfair Display, Georgia, serif",
9251
+ weight: "semibold",
9252
+ lineHeight: "normal",
9253
+ letterSpacing: "tight",
9254
+ italic: null,
9255
+ case: null
9256
+ },
9257
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9258
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9259
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
9260
+ },
9261
+ scale: "spacious"
9262
+ };
9263
+ classicSerifTypography = {
9264
+ body: {
9265
+ family: "Libre Baskerville, Georgia, serif",
9266
+ size: "md",
9267
+ weight: "regular",
9268
+ lineHeight: "relaxed",
9269
+ letterSpacing: "normal"
9270
+ },
9271
+ headings: {
9272
+ default: {
9273
+ family: "Cormorant Garamond, Georgia, serif",
9274
+ weight: "semibold",
9275
+ lineHeight: "normal",
9276
+ letterSpacing: "normal",
9277
+ italic: null,
9278
+ case: null
9279
+ },
9280
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9281
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9282
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
9283
+ },
9284
+ scale: "balanced"
9285
+ };
9286
+ luxeContrastTypography = {
9287
+ body: {
9288
+ family: "Manrope, system-ui, sans-serif",
9289
+ size: "md",
9290
+ weight: "regular",
9291
+ lineHeight: "relaxed",
9292
+ letterSpacing: "normal"
9293
+ },
9294
+ headings: {
9295
+ default: {
9296
+ family: "Cormorant Garamond, Georgia, serif",
9297
+ weight: "semibold",
9298
+ lineHeight: "normal",
9299
+ letterSpacing: "tight",
9300
+ italic: null,
9301
+ case: null
9302
+ },
9303
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9304
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9305
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
9306
+ },
9307
+ scale: "spacious"
9308
+ };
9309
+ boldDisplayTypography = {
9310
+ body: {
9311
+ family: "Manrope, system-ui, sans-serif",
9312
+ size: "lg",
9313
+ weight: "regular",
9314
+ lineHeight: "relaxed",
9315
+ letterSpacing: "normal"
9316
+ },
9317
+ headings: {
9318
+ default: {
9319
+ family: '"TAN - PEARL", sans-serif',
9320
+ weight: "bold",
9321
+ lineHeight: "normal",
9322
+ letterSpacing: "tight",
9323
+ colorToken: "primary",
9324
+ italic: null,
9325
+ case: null
9326
+ },
9327
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
9328
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
9329
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
9330
+ },
9331
+ scale: "balanced"
9332
+ };
9333
+ typographyPresets = [
9334
+ defineTypographyPreset({
9335
+ id: "typography-preset:modern-sans",
9336
+ name: "Modern Sans",
9337
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
9338
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
9339
+ recommendedFonts: {
9340
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
9341
+ heading: ["Inter", "Manrope", "Source Sans 3"]
9342
+ },
9343
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
9344
+ typography: modernSansTypography
9345
+ }),
9346
+ defineTypographyPreset({
9347
+ id: "typography-preset:warm-rounded",
9348
+ name: "Warm Rounded",
9349
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
9350
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
9351
+ recommendedFonts: {
9352
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
9353
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
9354
+ },
9355
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
9356
+ typography: warmRoundedTypography
9357
+ }),
9358
+ defineTypographyPreset({
9359
+ id: "typography-preset:editorial-serif",
9360
+ name: "Editorial Serif",
9361
+ description: "Story-led type with warm reading rhythm and expressive headings.",
9362
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
9363
+ recommendedFonts: {
9364
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
9365
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
9366
+ },
9367
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9368
+ typography: editorialSerifTypography
9369
+ }),
9370
+ defineTypographyPreset({
9371
+ id: "typography-preset:classic-serif",
9372
+ name: "Classic Serif",
9373
+ description: "Measured, polished type for premium and established offers.",
9374
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
9375
+ recommendedFonts: {
9376
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
9377
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
9378
+ },
9379
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9380
+ typography: classicSerifTypography
9381
+ }),
9382
+ defineTypographyPreset({
9383
+ id: "typography-preset:luxe-contrast",
9384
+ name: "Luxe Contrast",
9385
+ description: "A restrained sans body paired with elegant high-contrast headings.",
9386
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
9387
+ recommendedFonts: {
9388
+ body: ["Manrope", "Inter", "Source Sans 3"],
9389
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
9390
+ },
9391
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9392
+ typography: luxeContrastTypography
9393
+ }),
9394
+ defineTypographyPreset({
9395
+ id: "typography-preset:bold-display",
9396
+ name: "Bold Display",
9397
+ description: "Punchy display headings with readable sans body copy for branded launches.",
9398
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
9399
+ recommendedFonts: {
9400
+ body: ["Manrope", "Inter", "Space Grotesk"],
9401
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
9402
+ },
9403
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
9404
+ typography: boldDisplayTypography,
9405
+ heroTypography: {
9406
+ headlineSize: "6xl",
9407
+ headlineLineHeight: "tight",
9408
+ subheadlineSize: "editorial",
9409
+ subheadlineLineHeight: "normal",
9410
+ microHeadlineSize: "6xl",
9411
+ microHeadlineLineHeight: "tight",
9412
+ microSubheadlineSize: "xl",
9413
+ microSubheadlineLineHeight: "normal",
9414
+ responsive: {
9415
+ tablet: { headlineSize: "5xl" },
9416
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
9417
+ }
9418
+ }
9419
+ })
9420
+ ];
9421
+ typographyPresetsById = new Map(
9422
+ typographyPresets.map((preset2) => [preset2.id, preset2])
9423
+ );
9424
+ }
9425
+ });
9426
+
8538
9427
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
8539
9428
  function uniqueContentFrameKinds() {
8540
9429
  const kinds = [...new Set(
@@ -8547,6 +9436,15 @@ function uniqueContentFrameKinds() {
8547
9436
  return [firstKind, ...kinds.slice(1)];
8548
9437
  }
8549
9438
  function defineCuratedSiteStyle(input) {
9439
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
9440
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
9441
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
9442
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
9443
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
9444
+ throw new Error(
9445
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
9446
+ );
9447
+ }
8550
9448
  return {
8551
9449
  id: asSiteStyleId(input.id),
8552
9450
  name: input.name,
@@ -8567,11 +9465,23 @@ function defineCuratedSiteStyle(input) {
8567
9465
  },
8568
9466
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
8569
9467
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
8570
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
9468
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
9469
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
9470
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
9471
+ } : inferredHeaderCuration.defaultHeaderSelection,
9472
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
9473
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
9474
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
9475
+ layoutId: asHeaderLayoutId(selection.layoutId),
9476
+ styleId: asHeaderStyleId(selection.styleId)
9477
+ })),
9478
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
8571
9479
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
8572
9480
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
8573
9481
  buttonPersonalityChoices: input.buttonPersonalityChoices,
8574
- paletteVariantChoices: input.paletteVariantChoices
9482
+ paletteVariantChoices: input.paletteVariantChoices,
9483
+ typographyPresetChoices,
9484
+ defaultTypographyPresetId
8575
9485
  };
8576
9486
  }
8577
9487
  function buttonChoice(id, note) {
@@ -8580,6 +9490,88 @@ function buttonChoice(id, note) {
8580
9490
  function paletteChoice(id, note) {
8581
9491
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
8582
9492
  }
9493
+ function headerLayoutChoice(id, note) {
9494
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
9495
+ }
9496
+ function headerStyleChoice(id, note) {
9497
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
9498
+ }
9499
+ function headerLayoutRecordKey(id) {
9500
+ return id;
9501
+ }
9502
+ function uniqueHeaderLayoutChoices(choices) {
9503
+ const seen = /* @__PURE__ */ new Set();
9504
+ const unique = choices.filter((choice) => {
9505
+ if (seen.has(choice.id)) return false;
9506
+ seen.add(choice.id);
9507
+ return true;
9508
+ });
9509
+ const first = unique[0];
9510
+ if (!first) {
9511
+ throw new Error("Expected at least one curated header layout choice.");
9512
+ }
9513
+ return [first, ...unique.slice(1)];
9514
+ }
9515
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
9516
+ const first = choices[0] ?? {
9517
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
9518
+ };
9519
+ return [first, ...choices.slice(1)];
9520
+ }
9521
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
9522
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
9523
+ const defaultHeaderSelection = selections[0] ?? {
9524
+ layoutId: asHeaderLayoutId("classic"),
9525
+ styleId: asHeaderStyleId("minimal")
9526
+ };
9527
+ const layoutChoices = uniqueHeaderLayoutChoices(
9528
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
9529
+ );
9530
+ const stylesByLayout = {};
9531
+ for (const layoutChoice of layoutChoices) {
9532
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
9533
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
9534
+ styleChoices,
9535
+ layoutChoice.id
9536
+ );
9537
+ }
9538
+ return {
9539
+ defaultHeaderSelection,
9540
+ recommendedHeaderLayoutChoices: layoutChoices,
9541
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
9542
+ };
9543
+ }
9544
+ function typographyChoice(id, note) {
9545
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
9546
+ }
9547
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
9548
+ switch (recipe) {
9549
+ case "clean-sans":
9550
+ return [
9551
+ typographyChoice("typography-preset:modern-sans"),
9552
+ typographyChoice("typography-preset:luxe-contrast"),
9553
+ typographyChoice("typography-preset:bold-display")
9554
+ ];
9555
+ case "friendly-sans":
9556
+ return [
9557
+ typographyChoice("typography-preset:warm-rounded"),
9558
+ typographyChoice("typography-preset:modern-sans"),
9559
+ typographyChoice("typography-preset:editorial-serif")
9560
+ ];
9561
+ case "serif-editorial":
9562
+ return [
9563
+ typographyChoice("typography-preset:editorial-serif"),
9564
+ typographyChoice("typography-preset:classic-serif"),
9565
+ typographyChoice("typography-preset:warm-rounded")
9566
+ ];
9567
+ case "classic-serif":
9568
+ return [
9569
+ typographyChoice("typography-preset:classic-serif"),
9570
+ typographyChoice("typography-preset:luxe-contrast"),
9571
+ typographyChoice("typography-preset:editorial-serif")
9572
+ ];
9573
+ }
9574
+ }
8583
9575
  var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
8584
9576
  var init_curatedSiteStyles = __esm({
8585
9577
  "../theme-core/src/site-styles/curatedSiteStyles.ts"() {
@@ -8591,6 +9583,7 @@ var init_curatedSiteStyles = __esm({
8591
9583
  init_curatedChoices();
8592
9584
  init_sourceCatalogs();
8593
9585
  init_types2();
9586
+ init_typographyPresets();
8594
9587
  curatedSiteStyleIdValues = [
8595
9588
  "site-style:calm-studio",
8596
9589
  "site-style:clear-professional",
@@ -8602,6 +9595,7 @@ var init_curatedSiteStyles = __esm({
8602
9595
  "site-style:personal-retreat-journal",
8603
9596
  "site-style:tactile-workshop",
8604
9597
  "site-style:modern-wellness",
9598
+ "site-style:soft-earth",
8605
9599
  "site-style:bold-launch",
8606
9600
  "site-style:south-west-twerk-school"
8607
9601
  ];
@@ -8992,6 +9986,102 @@ var init_curatedSiteStyles = __esm({
8992
9986
  paletteChoice("warm-neutral-clay")
8993
9987
  ]
8994
9988
  }),
9989
+ defineCuratedSiteStyle({
9990
+ id: "site-style:soft-earth",
9991
+ name: "Soft Earth",
9992
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
9993
+ 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.",
9994
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
9995
+ selectionKeywordRules: [
9996
+ { kind: "word", value: "meditation" },
9997
+ { kind: "word", value: "wellbeing" },
9998
+ { kind: "substring", value: "retreat" },
9999
+ { kind: "phrase", value: "yoga studio" },
10000
+ { kind: "phrase", value: "mindful movement" }
10001
+ ],
10002
+ tokenRecipes: {
10003
+ palette: "warm-neutral",
10004
+ contrast: "standard",
10005
+ radius: "soft",
10006
+ shadow: "subtle",
10007
+ typography: "serif-editorial",
10008
+ spacing: "airy",
10009
+ motion: "subtle"
10010
+ },
10011
+ compositionBudget: balancedBudget,
10012
+ themeOverrides: {
10013
+ typography: {
10014
+ body: {
10015
+ family: "Inter, system-ui, sans-serif",
10016
+ size: "md",
10017
+ weight: "regular",
10018
+ lineHeight: "relaxed",
10019
+ letterSpacing: "normal"
10020
+ },
10021
+ headings: {
10022
+ default: {
10023
+ family: '"Cormorant Garamond", Georgia, serif',
10024
+ weight: "regular",
10025
+ lineHeight: "normal",
10026
+ letterSpacing: "normal",
10027
+ colorToken: "text",
10028
+ italic: null,
10029
+ case: null
10030
+ },
10031
+ h1: {
10032
+ size: "xl",
10033
+ weight: "regular",
10034
+ lineHeight: "normal",
10035
+ letterSpacing: "normal",
10036
+ italic: null
10037
+ },
10038
+ h2: {
10039
+ size: "lg",
10040
+ weight: "regular",
10041
+ lineHeight: "normal",
10042
+ letterSpacing: "normal",
10043
+ italic: null
10044
+ },
10045
+ h3: {
10046
+ size: "md",
10047
+ weight: "regular",
10048
+ lineHeight: "normal",
10049
+ letterSpacing: "normal",
10050
+ italic: null
10051
+ }
10052
+ },
10053
+ scale: "majorThird"
10054
+ },
10055
+ bodyText: {
10056
+ intro: {
10057
+ paragraphSize: "default",
10058
+ headingSize: "editorial"
10059
+ }
10060
+ }
10061
+ },
10062
+ recommendedAppearancePresetIds: [
10063
+ "hero-brand-scrim",
10064
+ "intro-soft-earth-statement",
10065
+ "feature-cards-soft-earth-offerings",
10066
+ "testimonials-soft-earth-proof-band",
10067
+ "faq-soft-earth-two-column",
10068
+ "contact-form-panel"
10069
+ ],
10070
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
10071
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
10072
+ buttonPersonalityChoices: [
10073
+ buttonChoice("earth-pill"),
10074
+ buttonChoice("soft-pill"),
10075
+ buttonChoice("pebble"),
10076
+ buttonChoice("editorial-link")
10077
+ ],
10078
+ paletteVariantChoices: [
10079
+ paletteChoice("warm-neutral-soft-earth"),
10080
+ paletteChoice("warm-neutral-clay"),
10081
+ paletteChoice("warm-neutral-forest"),
10082
+ paletteChoice("soft-natural-sage")
10083
+ ]
10084
+ }),
8995
10085
  defineCuratedSiteStyle({
8996
10086
  id: "site-style:bold-launch",
8997
10087
  name: "Bold Launch",
@@ -9045,49 +10135,13 @@ var init_curatedSiteStyles = __esm({
9045
10135
  motion: "expressive"
9046
10136
  },
9047
10137
  compositionBudget: expressiveBudget,
10138
+ typographyPresetChoices: [
10139
+ typographyChoice("typography-preset:bold-display"),
10140
+ typographyChoice("typography-preset:modern-sans"),
10141
+ typographyChoice("typography-preset:luxe-contrast")
10142
+ ],
10143
+ defaultTypographyPresetId: "typography-preset:bold-display",
9048
10144
  themeOverrides: {
9049
- typography: {
9050
- body: {
9051
- family: "Manrope, system-ui, sans-serif",
9052
- size: "lg",
9053
- weight: "regular",
9054
- lineHeight: "relaxed",
9055
- letterSpacing: "normal"
9056
- },
9057
- headings: {
9058
- default: {
9059
- family: '"TAN - PEARL", sans-serif',
9060
- weight: "bold",
9061
- lineHeight: "normal",
9062
- letterSpacing: "tight",
9063
- colorToken: "primary",
9064
- italic: null,
9065
- case: null
9066
- },
9067
- h1: {
9068
- size: "xl",
9069
- weight: "bold",
9070
- lineHeight: "normal",
9071
- letterSpacing: "tight",
9072
- italic: null
9073
- },
9074
- h2: {
9075
- size: "lg",
9076
- weight: "bold",
9077
- lineHeight: "normal",
9078
- letterSpacing: "normal",
9079
- italic: null
9080
- },
9081
- h3: {
9082
- size: "md",
9083
- weight: "bold",
9084
- lineHeight: "normal",
9085
- letterSpacing: "normal",
9086
- italic: null
9087
- }
9088
- },
9089
- scale: "balanced"
9090
- },
9091
10145
  bodyText: {
9092
10146
  intro: {
9093
10147
  paragraphSize: "editorial",
@@ -9838,6 +10892,7 @@ var init_previewCompiler = __esm({
9838
10892
  init_variants();
9839
10893
  init_curatedChoices();
9840
10894
  init_curatedSiteStyles();
10895
+ init_typographyPresets();
9841
10896
  init_resolver2();
9842
10897
  init_types2();
9843
10898
  init_footerLooks();
@@ -9851,6 +10906,7 @@ var init_previewCompiler = __esm({
9851
10906
  init_runtimeCompiler();
9852
10907
  init_curatedChoices();
9853
10908
  init_curatedSiteStyles();
10909
+ init_typographyPresets();
9854
10910
  init_types2();
9855
10911
  }
9856
10912
  });
@@ -10131,6 +11187,13 @@ var init_pageDesignEditorErrors = __esm({
10131
11187
  }
10132
11188
  });
10133
11189
 
11190
+ // ../theme-core/src/site-styles/persistedIdParseResult.ts
11191
+ var init_persistedIdParseResult = __esm({
11192
+ "../theme-core/src/site-styles/persistedIdParseResult.ts"() {
11193
+ "use strict";
11194
+ }
11195
+ });
11196
+
10134
11197
  // ../theme-core/src/site-styles/tokenRecipes.ts
10135
11198
  import { z as z29 } from "zod";
10136
11199
  var themeTokenRecipeOptions, themeTokenRecipesSchema;
@@ -10188,6 +11251,7 @@ var init_site_styles = __esm({
10188
11251
  init_pageDesignEditorModel();
10189
11252
  init_pageDesignIntent();
10190
11253
  init_previewCustomization();
11254
+ init_persistedIdParseResult();
10191
11255
  init_rawStyleFields();
10192
11256
  init_records();
10193
11257
  init_resolver2();
@@ -10196,6 +11260,7 @@ var init_site_styles = __esm({
10196
11260
  init_sourceCatalogs();
10197
11261
  init_styleTags();
10198
11262
  init_tokenRecipes();
11263
+ init_typographyPresets();
10199
11264
  init_types2();
10200
11265
  }
10201
11266
  });
@@ -14338,8 +15403,9 @@ var init_faqAccordion = __esm({
14338
15403
  },
14339
15404
  fallback: "rb-faq-item"
14340
15405
  },
14341
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
14342
- // Pass icon style from theme
15406
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
15407
+ // Legacy theme accordion style
15408
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
14343
15409
  },
14344
15410
  triggerFrom: "faqItem.question",
14345
15411
  contentFrom: "faqItem.answer"
@@ -22681,7 +23747,7 @@ function okWith(data) {
22681
23747
  function err2(error) {
22682
23748
  return { ok: false, error };
22683
23749
  }
22684
- function assertNever6(value, message) {
23750
+ function assertNever7(value, message) {
22685
23751
  throw new Error(message ?? `Unexpected value: ${String(value)}`);
22686
23752
  }
22687
23753
  var init_dist = __esm({
@@ -22847,7 +23913,7 @@ function deriveBookingFormViewState(input) {
22847
23913
  resourceName: input.verificationState.resourceName
22848
23914
  };
22849
23915
  default:
22850
- return assertNever6(input.verificationState);
23916
+ return assertNever7(input.verificationState);
22851
23917
  }
22852
23918
  }
22853
23919
  function resolveBookingSiteId(siteId, form2) {
@@ -23017,7 +24083,7 @@ function getBookingServicePaymentSelectionMode(service) {
23017
24083
  case "flexible_balance":
23018
24084
  return "implicit_flexible_balance";
23019
24085
  default:
23020
- return assertNever6(onlyKind);
24086
+ return assertNever7(onlyKind);
23021
24087
  }
23022
24088
  }
23023
24089
  if (allowedKinds.length === 2 && allowedKinds.includes("upfront") && (allowedKinds.includes("deferred_manual") || allowedKinds.includes("instalment_plan") || allowedKinds.includes("flexible_balance"))) {
@@ -23219,7 +24285,7 @@ function formatBookingSubmissionPreparationError(error) {
23219
24285
  case "service-missing-duration":
23220
24286
  return `Service "${error.serviceTitle}" is missing duration. Please update the service in the dashboard to include a duration (e.g., 30 minutes).`;
23221
24287
  default:
23222
- return assertNever6(error);
24288
+ return assertNever7(error);
23223
24289
  }
23224
24290
  }
23225
24291
  function getBookingSuccessMessage(successMessage) {
@@ -32118,7 +33184,7 @@ function formSubmissionReducer(_state, action) {
32118
33184
  case "submission-failed":
32119
33185
  return { tag: "failed", message: action.message };
32120
33186
  default:
32121
- return assertNever6(action);
33187
+ return assertNever7(action);
32122
33188
  }
32123
33189
  }
32124
33190
  var initialFormSubmissionState;
@@ -32856,7 +33922,7 @@ function bookingSubmissionReducer(state, action) {
32856
33922
  feedback: { tag: "idle" }
32857
33923
  };
32858
33924
  default:
32859
- return assertNever6(action);
33925
+ return assertNever7(action);
32860
33926
  }
32861
33927
  }
32862
33928
  function selectIsSubmitting(state) {
@@ -33208,7 +34274,7 @@ function buildBookingPaymentOptionViewModel(input) {
33208
34274
  };
33209
34275
  }
33210
34276
  default:
33211
- return assertNever6(input.option);
34277
+ return assertNever7(input.option);
33212
34278
  }
33213
34279
  }
33214
34280
  function buildInstalmentSchedulePreview(input) {
@@ -33265,7 +34331,7 @@ function buildInstalmentSchedulePreview(input) {
33265
34331
  })));
33266
34332
  }
33267
34333
  default:
33268
- return assertNever6(input.option.plan);
34334
+ return assertNever7(input.option.plan);
33269
34335
  }
33270
34336
  }
33271
34337
  function getPaymentCadenceLabel(plan) {
@@ -33497,7 +34563,7 @@ function bookingFlowReducer(state, event) {
33497
34563
  case "reset":
33498
34564
  return event.initial;
33499
34565
  default:
33500
- return assertNever6(event);
34566
+ return assertNever7(event);
33501
34567
  }
33502
34568
  }
33503
34569
  function clearAvailabilityFeedback(feedback) {
@@ -33626,7 +34692,7 @@ function validateBookingStep(input) {
33626
34692
  return Object.keys(errors).length > 0 ? { ok: false, errors: createFieldBookingValidationErrors(errors) } : { ok: true };
33627
34693
  }
33628
34694
  default:
33629
- return assertNever6(input.stepId);
34695
+ return assertNever7(input.stepId);
33630
34696
  }
33631
34697
  }
33632
34698
  function validateBookingFields(input) {
@@ -33920,7 +34986,7 @@ function resolveAppointmentPackagesModel(input) {
33920
34986
  };
33921
34987
  }
33922
34988
  default:
33923
- return assertNever6(input.state);
34989
+ return assertNever7(input.state);
33924
34990
  }
33925
34991
  }
33926
34992
  function toHeadlessEligibleAppointmentPackage(appointmentPackage) {
@@ -34675,7 +35741,7 @@ function pollingReducer(state, action) {
34675
35741
  case "timeout":
34676
35742
  return state;
34677
35743
  default:
34678
- return assertNever6(state);
35744
+ return assertNever7(state);
34679
35745
  }
34680
35746
  case "polling-timed-out":
34681
35747
  return {
@@ -34684,7 +35750,7 @@ function pollingReducer(state, action) {
34684
35750
  error: new Error("Polling timed out")
34685
35751
  };
34686
35752
  default:
34687
- return assertNever6(action);
35753
+ return assertNever7(action);
34688
35754
  }
34689
35755
  }
34690
35756
  var init_usePolling_state = __esm({
@@ -35167,7 +36233,7 @@ function DefaultBookingStepContent({
35167
36233
  case "custom-fields":
35168
36234
  return /* @__PURE__ */ jsx74(DefaultDynamicFields, { fields: booking.fields.items, booking });
35169
36235
  default:
35170
- return assertNever6(stepId);
36236
+ return assertNever7(stepId);
35171
36237
  }
35172
36238
  }
35173
36239
  function DefaultServiceSelectionStep({
@@ -36911,7 +37977,7 @@ function eligibilityLookupReducer(state, action) {
36911
37977
  error: action.message
36912
37978
  };
36913
37979
  default:
36914
- return assertNever6(action);
37980
+ return assertNever7(action);
36915
37981
  }
36916
37982
  }
36917
37983
  function existingRegistrationLookupReducer(state, action) {
@@ -36929,7 +37995,7 @@ function existingRegistrationLookupReducer(state, action) {
36929
37995
  registration: action.registration
36930
37996
  };
36931
37997
  default:
36932
- return assertNever6(action);
37998
+ return assertNever7(action);
36933
37999
  }
36934
38000
  }
36935
38001
  var initialEligibilityLookupState, initialExistingRegistrationLookupState;
@@ -45111,7 +46177,7 @@ function shopCheckoutReducer(state, action) {
45111
46177
  notice: action.notice
45112
46178
  };
45113
46179
  default:
45114
- return assertNever6(action);
46180
+ return assertNever7(action);
45115
46181
  }
45116
46182
  }
45117
46183
  var initialShopCheckoutState;
@@ -45650,7 +46716,7 @@ function shopPassesMembershipsReducer(state, action) {
45650
46716
  returnNotice: null
45651
46717
  };
45652
46718
  default:
45653
- return assertNever6(action);
46719
+ return assertNever7(action);
45654
46720
  }
45655
46721
  }
45656
46722
  function getOpenCheckout(state) {
@@ -52835,6 +53901,9 @@ init_schema2();
52835
53901
  var TEL_RE = /^[+()0-9\s-]{3,}$/;
52836
53902
  var SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
52837
53903
  var ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
53904
+ var DATE_PATTERN = /^(?<year>[1-9]\d{3})-(?<month>\d{2})-(?<day>\d{2})$/;
53905
+ var TIME_PATTERN = /^(?<hours>[01]\d|2[0-3]):(?<minutes>[0-5]\d)$/;
53906
+ var DATETIME_PATTERN = /^(?<date>[1-9]\d{3}-\d{2}-\d{2})T(?<time>(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)(?:\.\d+)?(?<offset>Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/;
52838
53907
  function assertNever3(value) {
52839
53908
  throw new Error(`Unhandled field validation variant: ${JSON.stringify(value)}`);
52840
53909
  }
@@ -52867,6 +53936,12 @@ function fieldIssueToMessage(issue2) {
52867
53936
  return "Check the format and try again";
52868
53937
  case "invalidUrl":
52869
53938
  return "Enter a valid web address";
53939
+ case "invalidDate":
53940
+ return "Choose a valid date";
53941
+ case "invalidTime":
53942
+ return "Choose a valid time";
53943
+ case "invalidDateTime":
53944
+ return "Choose a valid date and time";
52870
53945
  case "invalidNumber":
52871
53946
  return `${issue2.label} needs a number`;
52872
53947
  case "tooSmall":
@@ -52903,12 +53978,16 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
52903
53978
  case "text": {
52904
53979
  const inputType = field.ui?.inputType;
52905
53980
  if (inputType === "number") {
52906
- const constraints2 = commonConstraints(required, { kind: "numberType" });
53981
+ const constraints2 = commonConstraints(required, {
53982
+ kind: "numberType"
53983
+ });
52907
53984
  if (typeof field.ui?.min === "number") constraints2.push({ kind: "numberMin", minimum: field.ui.min });
52908
53985
  if (typeof field.ui?.max === "number") constraints2.push({ kind: "numberMax", maximum: field.ui.max });
52909
53986
  return makePlan("number", "number", field, path, required, constraints2);
52910
53987
  }
52911
- const constraints = commonConstraints(required, { kind: "textType" });
53988
+ const constraints = commonConstraints(required, {
53989
+ kind: "textType"
53990
+ });
52912
53991
  if (inputType === "email") constraints.push({ kind: "emailFormat" });
52913
53992
  if (inputType === "tel") constraints.push({ kind: "phoneFormat" });
52914
53993
  if (field.ui?.pattern) constraints.push({ kind: "patternFormat", pattern: field.ui.pattern });
@@ -52916,7 +53995,9 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
52916
53995
  return makePlan("string", "string", field, path, required, constraints);
52917
53996
  }
52918
53997
  case "number": {
52919
- const constraints = commonConstraints(required, { kind: "numberType" });
53998
+ const constraints = commonConstraints(required, {
53999
+ kind: "numberType"
54000
+ });
52920
54001
  if (typeof field.min === "number") constraints.push({ kind: "numberMin", minimum: field.min });
52921
54002
  if (typeof field.max === "number") constraints.push({ kind: "numberMax", maximum: field.max });
52922
54003
  return makePlan("number", "number", field, path, required, constraints);
@@ -52927,23 +54008,42 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
52927
54008
  return makePlan("string", "string", field, path, required, constraints);
52928
54009
  }
52929
54010
  case "url":
52930
- return makePlan("string", "string", field, path, required, commonConstraints(
54011
+ return makePlan(
54012
+ "string",
54013
+ "string",
54014
+ field,
54015
+ path,
52931
54016
  required,
52932
- { kind: "textType" },
52933
- { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) }
52934
- ));
54017
+ commonConstraints(required, { kind: "textType" }, { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) })
54018
+ );
52935
54019
  case "reference":
52936
54020
  return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "referenceText" }));
52937
54021
  case "date":
54022
+ return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "textType" }, { kind: "dateFormat" }));
52938
54023
  case "time":
54024
+ return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "textType" }, { kind: "timeFormat" }));
52939
54025
  case "datetime":
52940
- return makePlan("string", "string", field, path, required, commonConstraints(required, { kind: "textType" }));
54026
+ return makePlan(
54027
+ "string",
54028
+ "string",
54029
+ field,
54030
+ path,
54031
+ required,
54032
+ commonConstraints(required, { kind: "textType" }, { kind: "datetimeFormat" })
54033
+ );
52941
54034
  case "select":
52942
- return makePlan("select", "select", field, path, required, commonConstraints(required, {
52943
- kind: "selectOption",
52944
- source: resolveSelectConstraintSource(field),
52945
- multiple: Boolean(field.multiple)
52946
- }));
54035
+ return makePlan(
54036
+ "select",
54037
+ "select",
54038
+ field,
54039
+ path,
54040
+ required,
54041
+ commonConstraints(required, {
54042
+ kind: "selectOption",
54043
+ source: resolveSelectConstraintSource(field),
54044
+ multiple: Boolean(field.multiple)
54045
+ })
54046
+ );
52947
54047
  case "richText":
52948
54048
  return makePlan("richText", "object", field, path, required, commonConstraints(required, { kind: "richTextDoc" }));
52949
54049
  case "media":
@@ -52956,7 +54056,11 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
52956
54056
  case "repeater":
52957
54057
  return {
52958
54058
  ...makePlan("repeater", "array", field, path, required, commonConstraints(required, { kind: "arrayType" })),
52959
- ...field.polymorphic && field.itemTypes ? { repeatedItemVariants: deriveRepeatedItemVariants(field, [...path, 0]) } : { repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path, 0]) },
54059
+ ...field.polymorphic && field.itemTypes ? {
54060
+ repeatedItemVariants: deriveRepeatedItemVariants(field, [...path, 0])
54061
+ } : {
54062
+ repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path, 0])
54063
+ },
52960
54064
  constraints: withRepeaterItemConstraints(field, commonConstraints(required, { kind: "arrayType" }))
52961
54065
  };
52962
54066
  case "group":
@@ -53041,7 +54145,10 @@ function resolveSelectConstraintSource(field) {
53041
54145
  const source = normalizeSelectSource(field);
53042
54146
  switch (source.kind) {
53043
54147
  case "static":
53044
- return { kind: "static", values: field.options.map((option) => option.value) };
54148
+ return {
54149
+ kind: "static",
54150
+ values: field.options.map((option) => option.value)
54151
+ };
53045
54152
  case "site":
53046
54153
  case "sdk":
53047
54154
  return { kind: "runtime", source: source.kind };
@@ -53137,7 +54244,9 @@ function normalizeFieldValue(plan, value, ctx) {
53137
54244
  }
53138
54245
  function normalizeObjectChildren(children, value, ctx) {
53139
54246
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
53140
- const normalized = { ...value };
54247
+ const normalized = {
54248
+ ...value
54249
+ };
53141
54250
  for (const child of children) {
53142
54251
  normalized[child.fieldId] = normalizeFieldValue(child, normalized[child.fieldId], ctx);
53143
54252
  }
@@ -53231,6 +54340,12 @@ function validateStringConstraint(plan, constraint, value) {
53231
54340
  }
53232
54341
  case "urlFormat":
53233
54342
  return isValidUrl(value, constraint.allowRelative) ? [] : [issue(plan, "invalidUrl")];
54343
+ case "dateFormat":
54344
+ return isValidDateString(value) ? [] : [issue(plan, "invalidDate")];
54345
+ case "timeFormat":
54346
+ return isValidTimeString(value) ? [] : [issue(plan, "invalidTime")];
54347
+ case "datetimeFormat":
54348
+ return isValidDateTimeInstantString(value) ? [] : [issue(plan, "invalidDateTime")];
53234
54349
  case "slugFormat":
53235
54350
  return SLUG_PATTERN.test(value) ? [] : [issue(plan, "invalidSlug")];
53236
54351
  default:
@@ -53267,17 +54382,24 @@ function validateRepeaterPlan(plan, value, ctx) {
53267
54382
  case "arrayType":
53268
54383
  return [];
53269
54384
  case "minItems":
53270
- return value.length < constraint.minimum ? [issue(plan, "tooFewItems", { minimum: constraint.minimum, itemLabel: "item" })] : [];
54385
+ return value.length < constraint.minimum ? [
54386
+ issue(plan, "tooFewItems", {
54387
+ minimum: constraint.minimum,
54388
+ itemLabel: "item"
54389
+ })
54390
+ ] : [];
53271
54391
  case "maxItems":
53272
- return value.length > constraint.maximum ? [issue(plan, "tooManyItems", { maximum: constraint.maximum, itemLabel: "item" })] : [];
54392
+ return value.length > constraint.maximum ? [
54393
+ issue(plan, "tooManyItems", {
54394
+ maximum: constraint.maximum,
54395
+ itemLabel: "item"
54396
+ })
54397
+ ] : [];
53273
54398
  default:
53274
54399
  return assertNever3(constraint);
53275
54400
  }
53276
54401
  });
53277
- return [
53278
- ...constraintIssues,
53279
- ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))
53280
- ];
54402
+ return [...constraintIssues, ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))];
53281
54403
  }
53282
54404
  function validateRepeaterItem(plan, item, index, ctx) {
53283
54405
  if (!isPlainObject(item)) return [];
@@ -53320,9 +54442,7 @@ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
53320
54442
  }))
53321
54443
  } : {},
53322
54444
  ...plan.repeatedItemPlan ? {
53323
- repeatedItemPlan: plan.repeatedItemPlan.map(
53324
- (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
53325
- )
54445
+ repeatedItemPlan: plan.repeatedItemPlan.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
53326
54446
  } : {}
53327
54447
  };
53328
54448
  case "string":
@@ -53409,6 +54529,9 @@ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
53409
54529
  case "invalidPhone":
53410
54530
  case "invalidPattern":
53411
54531
  case "invalidUrl":
54532
+ case "invalidDate":
54533
+ case "invalidTime":
54534
+ case "invalidDateTime":
53412
54535
  case "invalidNumber":
53413
54536
  case "tooSmall":
53414
54537
  case "tooLarge":
@@ -53448,6 +54571,53 @@ function isValidUrl(value, allowRelative) {
53448
54571
  return false;
53449
54572
  }
53450
54573
  }
54574
+ function isValidDateString(value) {
54575
+ const match = DATE_PATTERN.exec(value);
54576
+ if (!match?.groups) return false;
54577
+ const year = Number(match.groups.year);
54578
+ const month = Number(match.groups.month);
54579
+ const day = Number(match.groups.day);
54580
+ return isValidCalendarDate(year, month, day);
54581
+ }
54582
+ function isValidTimeString(value) {
54583
+ return TIME_PATTERN.test(value);
54584
+ }
54585
+ function isValidDateTimeInstantString(value) {
54586
+ const match = DATETIME_PATTERN.exec(value);
54587
+ if (!match?.groups) return false;
54588
+ const datePart = match.groups.date;
54589
+ if (!datePart || !isValidDateString(datePart)) return false;
54590
+ return !Number.isNaN(Date.parse(value));
54591
+ }
54592
+ function isValidCalendarDate(year, month, day) {
54593
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) return false;
54594
+ if (year < 1 || month < 1 || month > 12) return false;
54595
+ return day >= 1 && day <= daysInMonth(year, month);
54596
+ }
54597
+ function daysInMonth(year, month) {
54598
+ switch (month) {
54599
+ case 2:
54600
+ return isLeapYear(year) ? 29 : 28;
54601
+ case 4:
54602
+ case 6:
54603
+ case 9:
54604
+ case 11:
54605
+ return 30;
54606
+ case 1:
54607
+ case 3:
54608
+ case 5:
54609
+ case 7:
54610
+ case 8:
54611
+ case 10:
54612
+ case 12:
54613
+ return 31;
54614
+ default:
54615
+ return 0;
54616
+ }
54617
+ }
54618
+ function isLeapYear(year) {
54619
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
54620
+ }
53451
54621
  function isValidSelectValue(value, values, multiple) {
53452
54622
  if (multiple) {
53453
54623
  return Array.isArray(value) && value.every((item) => typeof item === "string" && values.includes(item));
@@ -53767,6 +54937,342 @@ var heroBlockDefinition = {
53767
54937
  manifest: heroManifest
53768
54938
  };
53769
54939
 
54940
+ // ../blocks/src/system/blocks/intro.ts
54941
+ init_defineBlock();
54942
+
54943
+ // ../blocks/src/system/fields/aspectRatio.ts
54944
+ var standardAspectRatioOptions = [
54945
+ { value: "auto", label: "Auto (original)" },
54946
+ { value: "16/9", label: "16:9 (Landscape)" },
54947
+ { value: "4/3", label: "4:3 (Standard)" },
54948
+ { value: "1/1", label: "1:1 (Square)" },
54949
+ { value: "3/4", label: "3:4 (Portrait)" }
54950
+ ];
54951
+ function createAspectRatioField(options = {}) {
54952
+ return {
54953
+ id: options.id ?? "aspectRatio",
54954
+ type: "select",
54955
+ label: options.label ?? "Aspect ratio",
54956
+ ...options.description ? { description: options.description } : {},
54957
+ required: false,
54958
+ defaultValue: options.defaultValue ?? "auto",
54959
+ multiple: false,
54960
+ options: [...standardAspectRatioOptions],
54961
+ ui: {
54962
+ intent: options.uiIntent ?? "display",
54963
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
54964
+ }
54965
+ };
54966
+ }
54967
+
54968
+ // ../blocks/src/system/blocks/intro.ts
54969
+ init_ctas();
54970
+
54971
+ // ../blocks/src/system/fields/imageLayout.ts
54972
+ function createImageColSizeField(options = {}) {
54973
+ const {
54974
+ id = "imageColSize",
54975
+ label = "Image column size",
54976
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
54977
+ defaultValue = "1/3",
54978
+ uiIntent = "display",
54979
+ visibleWhen
54980
+ } = options;
54981
+ return {
54982
+ id,
54983
+ type: "select",
54984
+ label,
54985
+ description,
54986
+ required: false,
54987
+ defaultValue,
54988
+ multiple: false,
54989
+ options: [
54990
+ { value: "1/4", label: "Small (1/4)" },
54991
+ { value: "1/3", label: "Medium (1/3)" },
54992
+ { value: "2/5", label: "Large (2/5)" },
54993
+ { value: "1/2", label: "Extra large (1/2)" },
54994
+ { value: "2/3", label: "Huge (2/3)" }
54995
+ ],
54996
+ ui: {
54997
+ intent: uiIntent,
54998
+ ...visibleWhen ? { visibleWhen } : {}
54999
+ }
55000
+ };
55001
+ }
55002
+ function createImagePositionField(options = {}) {
55003
+ const {
55004
+ id = "imagePosition",
55005
+ label = "Image position",
55006
+ description = "Choose which side the image appears on.",
55007
+ defaultValue = "left",
55008
+ includeAlternate = false,
55009
+ uiIntent = "display",
55010
+ visibleWhen
55011
+ } = options;
55012
+ const positionOptions = [
55013
+ { value: "left", label: "Left" },
55014
+ { value: "right", label: "Right" },
55015
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
55016
+ ];
55017
+ return {
55018
+ id,
55019
+ type: "select",
55020
+ label,
55021
+ description,
55022
+ required: false,
55023
+ defaultValue,
55024
+ multiple: false,
55025
+ // Spread to get a mutable array type without unsafe casts.
55026
+ options: [...positionOptions],
55027
+ ui: {
55028
+ intent: uiIntent,
55029
+ ...visibleWhen ? { visibleWhen } : {}
55030
+ }
55031
+ };
55032
+ }
55033
+
55034
+ // ../blocks/src/system/blocks/intro.ts
55035
+ init_builder();
55036
+ init_fragments();
55037
+ function introHeading(className) {
55038
+ return text(
55039
+ {
55040
+ as: "h2",
55041
+ className
55042
+ },
55043
+ when("content.title"),
55044
+ bind("content.title")
55045
+ );
55046
+ }
55047
+ function introBody(className = "rb-prose rb-max-w-none") {
55048
+ return richText({ className }, bind("content.body"));
55049
+ }
55050
+ function introCtas(justify = "start") {
55051
+ return ctaRow({
55052
+ justify,
55053
+ gap: "md",
55054
+ containerClassName: "rb-mt-2"
55055
+ });
55056
+ }
55057
+ function introCopyStack(options = {}) {
55058
+ return stack(
55059
+ {
55060
+ gap: "md",
55061
+ className: options.className ?? "rb-intro-copy"
55062
+ },
55063
+ [
55064
+ introHeading(options.headingClassName ?? "rb-intro-title"),
55065
+ introBody(options.bodyClassName),
55066
+ introCtas(options.ctaJustify)
55067
+ ]
55068
+ );
55069
+ }
55070
+ var introMedia = media(
55071
+ {
55072
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
55073
+ style: {
55074
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
55075
+ }
55076
+ },
55077
+ bind("content.media")
55078
+ );
55079
+ var centeredCopyLayout = styledSection({
55080
+ children: styledContainer({
55081
+ rootType: "stack",
55082
+ rootProps: { gap: "lg" },
55083
+ children: [
55084
+ introCopyStack({
55085
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
55086
+ headingClassName: "rb-intro-title rb-text-center",
55087
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
55088
+ ctaJustify: "center"
55089
+ })
55090
+ ]
55091
+ }),
55092
+ baseClass: "",
55093
+ spacing: "medium"
55094
+ });
55095
+ var statementCopyLayout = styledSection({
55096
+ children: styledContainer({
55097
+ children: [
55098
+ el(
55099
+ "div",
55100
+ {
55101
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
55102
+ },
55103
+ [
55104
+ introHeading("rb-intro-title rb-max-w-xl"),
55105
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
55106
+ introBody(),
55107
+ introCtas("start")
55108
+ ])
55109
+ ]
55110
+ )
55111
+ ]
55112
+ }),
55113
+ baseClass: "",
55114
+ spacing: "medium"
55115
+ });
55116
+ var statementMediaLayout = styledSection({
55117
+ children: styledContainer({
55118
+ children: [
55119
+ el(
55120
+ "div",
55121
+ {
55122
+ 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"
55123
+ },
55124
+ [
55125
+ introHeading("rb-intro-title rb-max-w-xl"),
55126
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
55127
+ introBody(),
55128
+ introCtas("start")
55129
+ ]),
55130
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
55131
+ ]
55132
+ )
55133
+ ]
55134
+ }),
55135
+ baseClass: "",
55136
+ spacing: "medium"
55137
+ });
55138
+ var mediaCopyLayout = styledSection({
55139
+ children: styledContainer({
55140
+ children: [
55141
+ responsiveTwoColumn({
55142
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
55143
+ text: introCopyStack({
55144
+ className: "rb-intro-copy rb-max-w-xl",
55145
+ headingClassName: "rb-intro-title"
55146
+ }),
55147
+ ratioFrom: "content.ratio",
55148
+ imagePositionFrom: "content.imagePosition",
55149
+ gapFrom: "content.gap",
55150
+ gapFallback: "comfortable",
55151
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
55152
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
55153
+ })
55154
+ ]
55155
+ }),
55156
+ baseClass: "",
55157
+ spacing: "medium"
55158
+ });
55159
+ var introConfig = {
55160
+ id: "block.intro",
55161
+ title: "Intro",
55162
+ category: "layout",
55163
+ includeContainerStyles: true,
55164
+ titleSource: "title",
55165
+ additionalFields: [
55166
+ {
55167
+ id: "title",
55168
+ type: "text",
55169
+ label: "Statement",
55170
+ required: false,
55171
+ multiline: true,
55172
+ maxLength: 160
55173
+ },
55174
+ {
55175
+ id: "body",
55176
+ type: "richText",
55177
+ label: "Text",
55178
+ required: true,
55179
+ ui: {
55180
+ richTextVariant: "limited"
55181
+ }
55182
+ },
55183
+ {
55184
+ id: "media",
55185
+ type: "media",
55186
+ label: "Media",
55187
+ required: false,
55188
+ mediaKinds: ["image"],
55189
+ ui: {
55190
+ intent: "content",
55191
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
55192
+ }
55193
+ },
55194
+ createImagePositionField({
55195
+ id: "imagePosition",
55196
+ label: "Image position",
55197
+ defaultValue: "left",
55198
+ uiIntent: "display",
55199
+ visibleWhen: { field: "variant", equals: "media-copy" }
55200
+ }),
55201
+ {
55202
+ id: "gap",
55203
+ type: "select",
55204
+ label: "Gap between media and text",
55205
+ required: false,
55206
+ defaultValue: "comfortable",
55207
+ multiple: false,
55208
+ options: [
55209
+ { value: "none", label: "None" },
55210
+ { value: "compact", label: "Compact" },
55211
+ { value: "cozy", label: "Cozy" },
55212
+ { value: "medium", label: "Medium" },
55213
+ { value: "comfortable", label: "Comfortable" },
55214
+ { value: "spacious", label: "Spacious" }
55215
+ ],
55216
+ ui: {
55217
+ intent: "display",
55218
+ visibleWhen: { field: "variant", equals: "media-copy" }
55219
+ }
55220
+ },
55221
+ createImageColSizeField({
55222
+ id: "ratio",
55223
+ label: "Media column size",
55224
+ defaultValue: "1/2",
55225
+ uiIntent: "display",
55226
+ visibleWhen: { field: "variant", equals: "media-copy" }
55227
+ }),
55228
+ createAspectRatioField({
55229
+ id: "aspectRatio",
55230
+ label: "Media aspect ratio",
55231
+ description: "Crop media to a consistent aspect ratio.",
55232
+ defaultValue: "auto",
55233
+ visibleWhen: { field: "media", notEquals: null }
55234
+ }),
55235
+ createCtasRepeater({
55236
+ label: "Calls to action",
55237
+ itemLabel: "CTA",
55238
+ maxItems: 2
55239
+ })
55240
+ ],
55241
+ layout: centeredCopyLayout,
55242
+ variants: {
55243
+ "centered-copy": centeredCopyLayout,
55244
+ "statement-copy": statementCopyLayout,
55245
+ "statement-media": statementMediaLayout,
55246
+ "media-copy": mediaCopyLayout
55247
+ },
55248
+ defaultVariant: "statement-copy",
55249
+ variantOptions: {
55250
+ "centered-copy": {
55251
+ label: "Centered copy",
55252
+ description: "A focused intro with centered text and optional calls to action."
55253
+ },
55254
+ "statement-copy": {
55255
+ label: "Statement and copy",
55256
+ description: "A large statement on the left with supporting copy on the right."
55257
+ },
55258
+ "statement-media": {
55259
+ label: "Statement, copy and media",
55260
+ description: "A three-part intro with statement, copy and a small image."
55261
+ },
55262
+ "media-copy": {
55263
+ label: "Media and copy",
55264
+ description: "A compact media/text intro for softer transitions after a hero."
55265
+ }
55266
+ },
55267
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
55268
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
55269
+ icon: "PanelTopOpen"
55270
+ };
55271
+ var introManifest = createBlockManifest(introConfig);
55272
+ var introBlockDefinition = {
55273
+ manifest: introManifest
55274
+ };
55275
+
53770
55276
  // ../blocks/src/system/blocks/body-text.ts
53771
55277
  init_styledSection();
53772
55278
  init_defineBlock();
@@ -54364,6 +55870,37 @@ var faqComposition = composeFragments([
54364
55870
  { fragment: faqHeadingFragment, fieldPriority: 0 },
54365
55871
  { fragment: faqAccordionFragment, fieldPriority: 1 }
54366
55872
  ]);
55873
+ function fragmentLayoutNode(layout) {
55874
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
55875
+ }
55876
+ function isNodeDefinitionArray(layout) {
55877
+ return Array.isArray(layout);
55878
+ }
55879
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
55880
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
55881
+ var defaultLayout = styledSection({
55882
+ children: styledContainer({
55883
+ baseClassName: "rb-relative rb-isolate",
55884
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
55885
+ }),
55886
+ baseClass: ""
55887
+ });
55888
+ var twoColumnLayout = styledSection({
55889
+ children: styledContainer({
55890
+ baseClassName: "rb-relative rb-isolate",
55891
+ children: el(
55892
+ "div",
55893
+ {
55894
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
55895
+ },
55896
+ [
55897
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
55898
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
55899
+ ]
55900
+ )
55901
+ }),
55902
+ baseClass: ""
55903
+ });
54367
55904
  var faqManifest = createBlockManifest({
54368
55905
  id: "block.faq",
54369
55906
  title: "FAQ",
@@ -54380,13 +55917,22 @@ var faqManifest = createBlockManifest({
54380
55917
  label: "FAQ item styles"
54381
55918
  })
54382
55919
  ],
54383
- layout: styledSection({
54384
- children: styledContainer({
54385
- baseClassName: "rb-relative rb-isolate",
54386
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
54387
- }),
54388
- baseClass: ""
54389
- }),
55920
+ layout: defaultLayout,
55921
+ variants: {
55922
+ default: defaultLayout,
55923
+ "two-column": twoColumnLayout
55924
+ },
55925
+ defaultVariant: "default",
55926
+ variantOptions: {
55927
+ default: {
55928
+ label: "Default",
55929
+ description: "A centered heading above one FAQ accordion."
55930
+ },
55931
+ "two-column": {
55932
+ label: "Two column",
55933
+ description: "A left heading column with FAQ items on the right."
55934
+ }
55935
+ },
54390
55936
  description: "Accordion of frequently asked questions and answers.",
54391
55937
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
54392
55938
  icon: "HelpCircle"
@@ -55048,7 +56594,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
55048
56594
  function resolveHeaderVisualStyles(header, tokens) {
55049
56595
  const navContainerType = header?.navContainer?.type ?? "none";
55050
56596
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
55051
- if (hasContainedNav) {
56597
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
56598
+ if (hasContainedNav || hasTransparentVariant) {
55052
56599
  return {
55053
56600
  backgroundToken: "transparent",
55054
56601
  paletteHex: null,
@@ -55177,6 +56724,17 @@ var headerRootStyleTransform = {
55177
56724
  return mergeStyles(...styleParts);
55178
56725
  }
55179
56726
  };
56727
+ var headerSectionBackgroundTransform = {
56728
+ id: "layout.headerSectionBackground",
56729
+ kind: "string",
56730
+ summary: "Resolve the inner site-header section background token",
56731
+ run: (value) => {
56732
+ const header = asPartialObject(value);
56733
+ const navContainerType = header?.navContainer?.type ?? "none";
56734
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
56735
+ return usesTransparentRoot ? "raw:transparent" : "background";
56736
+ }
56737
+ };
55180
56738
  var footerRootStyleTransform = {
55181
56739
  id: "layout.footerRootStyle",
55182
56740
  kind: "formatter",
@@ -55435,6 +56993,7 @@ var layoutTransforms = [
55435
56993
  headerRootClassTransform,
55436
56994
  footerRootClassTransform,
55437
56995
  headerRootStyleTransform,
56996
+ headerSectionBackgroundTransform,
55438
56997
  footerRootStyleTransform,
55439
56998
  footerBottomBarClassTransform,
55440
56999
  footerBottomBarContainerClassTransform,
@@ -55974,7 +57533,10 @@ var editorialLayout = stack(
55974
57533
  );
55975
57534
  var headerLayout = headerSection(
55976
57535
  {
55977
- background: "background",
57536
+ background: bindProp("$root.theme.header", {
57537
+ transforms: pipe(tx("layout.headerSectionBackground")),
57538
+ fallback: "background"
57539
+ }),
55978
57540
  allowOverflow: true,
55979
57541
  className: bindProp("$root.theme.header", {
55980
57542
  transforms: pipe(tx("layout.headerRootClass")),
@@ -56915,6 +58477,231 @@ var collectionBlockDefinition = {
56915
58477
  manifest: collectionManifest
56916
58478
  };
56917
58479
 
58480
+ // ../blocks/src/system/blocks/feature-cards.ts
58481
+ init_defineBlock();
58482
+ init_boxStyles();
58483
+ init_ctas();
58484
+ init_builder();
58485
+ init_fragments();
58486
+ init_colorStyles();
58487
+ function grid3(props2, children) {
58488
+ return el("grid", props2 ?? void 0, children ?? void 0);
58489
+ }
58490
+ var sectionHeading = stack(
58491
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
58492
+ [
58493
+ text(
58494
+ {
58495
+ as: "h2",
58496
+ className: "rb-feature-cards-title rb-text-center"
58497
+ },
58498
+ when("content.title"),
58499
+ bind("content.title")
58500
+ ),
58501
+ richText(
58502
+ {
58503
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
58504
+ style: textColorStyle("mutedText")
58505
+ },
58506
+ when("content.description"),
58507
+ bind("content.description")
58508
+ )
58509
+ ]
58510
+ );
58511
+ var featureCard = styledCard(
58512
+ [
58513
+ media(
58514
+ {
58515
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
58516
+ style: {
58517
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
58518
+ }
58519
+ },
58520
+ when("card.media"),
58521
+ bind("card.media")
58522
+ ),
58523
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
58524
+ text(
58525
+ {
58526
+ as: "h3",
58527
+ className: "rb-feature-card-title"
58528
+ },
58529
+ bind("card.title")
58530
+ ),
58531
+ richText(
58532
+ {
58533
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
58534
+ style: textColorStyle("mutedText")
58535
+ },
58536
+ when("card.body"),
58537
+ bind("card.body")
58538
+ ),
58539
+ ctaRow({
58540
+ collectionPath: "ctas",
58541
+ itemName: "cta",
58542
+ gap: "sm",
58543
+ justify: "start",
58544
+ containerClassName: "rb-mt-auto"
58545
+ })
58546
+ ])
58547
+ ],
58548
+ {
58549
+ stylesFrom: "content._cardStyles",
58550
+ backgroundFrom: "content._cardStyles.background",
58551
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
58552
+ },
58553
+ repeat("content.cards", "card")
58554
+ );
58555
+ var cardsLayout = styledSection({
58556
+ children: styledContainer({
58557
+ rootType: "stack",
58558
+ rootProps: { gap: "xl" },
58559
+ children: [
58560
+ sectionHeading,
58561
+ grid3(
58562
+ {
58563
+ cols: {
58564
+ $bind: {
58565
+ from: "content.columns",
58566
+ fallback: 3,
58567
+ coerce: "number"
58568
+ }
58569
+ },
58570
+ gap: "lg"
58571
+ },
58572
+ [featureCard]
58573
+ )
58574
+ ]
58575
+ }),
58576
+ baseClass: "",
58577
+ spacing: "medium"
58578
+ });
58579
+ var featureCardsConfig = {
58580
+ id: "block.feature-cards",
58581
+ title: "Feature Cards",
58582
+ category: "layout",
58583
+ includeContainerStyles: true,
58584
+ titleSource: "title",
58585
+ additionalFields: [
58586
+ {
58587
+ id: "title",
58588
+ type: "text",
58589
+ label: "Title",
58590
+ required: false,
58591
+ multiline: false,
58592
+ maxLength: 120
58593
+ },
58594
+ {
58595
+ id: "description",
58596
+ type: "richText",
58597
+ label: "Description",
58598
+ required: false,
58599
+ ui: {
58600
+ richTextVariant: "limited"
58601
+ }
58602
+ },
58603
+ {
58604
+ id: "columns",
58605
+ type: "select",
58606
+ label: "Columns",
58607
+ required: false,
58608
+ defaultValue: "3",
58609
+ multiple: false,
58610
+ options: [
58611
+ { value: "2", label: "2 columns" },
58612
+ { value: "3", label: "3 columns" },
58613
+ { value: "4", label: "4 columns" }
58614
+ ],
58615
+ ui: { intent: "display" }
58616
+ },
58617
+ {
58618
+ id: "cards",
58619
+ type: "repeater",
58620
+ label: "Cards",
58621
+ required: false,
58622
+ minItems: 1,
58623
+ maxItems: 8,
58624
+ itemLabel: "Card",
58625
+ itemLabelSource: "title",
58626
+ allowConversion: true,
58627
+ ui: {
58628
+ intent: "content"
58629
+ },
58630
+ schema: {
58631
+ fields: [
58632
+ {
58633
+ id: "media",
58634
+ type: "media",
58635
+ label: "Image",
58636
+ required: false,
58637
+ mediaKinds: ["image"]
58638
+ },
58639
+ createAspectRatioField({
58640
+ id: "aspectRatio",
58641
+ label: "Image aspect ratio",
58642
+ defaultValue: "4/3",
58643
+ visibleWhen: { field: "media", notEquals: null }
58644
+ }),
58645
+ {
58646
+ id: "title",
58647
+ type: "text",
58648
+ label: "Title",
58649
+ required: true,
58650
+ multiline: false,
58651
+ maxLength: 120
58652
+ },
58653
+ {
58654
+ id: "body",
58655
+ type: "richText",
58656
+ label: "Text",
58657
+ required: false,
58658
+ ui: {
58659
+ richTextVariant: "limited"
58660
+ }
58661
+ },
58662
+ createCtasRepeater({
58663
+ label: "Calls to action",
58664
+ itemLabel: "CTA",
58665
+ maxItems: 1,
58666
+ button: {
58667
+ variants: [
58668
+ { value: "primary", label: "Primary" },
58669
+ { value: "secondary", label: "Secondary" },
58670
+ { value: "outline", label: "Outline" },
58671
+ { value: "ghost", label: "Ghost" },
58672
+ { value: "link", label: "Link" }
58673
+ ],
58674
+ defaultVariant: "ghost"
58675
+ }
58676
+ })
58677
+ ]
58678
+ }
58679
+ },
58680
+ cardStylesField({
58681
+ id: "_cardStyles",
58682
+ label: "Card styles"
58683
+ })
58684
+ ],
58685
+ layout: cardsLayout,
58686
+ variants: {
58687
+ cards: cardsLayout
58688
+ },
58689
+ defaultVariant: "cards",
58690
+ variantOptions: {
58691
+ cards: {
58692
+ label: "Cards",
58693
+ description: "A responsive grid of image cards with optional calls to action."
58694
+ }
58695
+ },
58696
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
58697
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
58698
+ icon: "PanelsTopLeft"
58699
+ };
58700
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
58701
+ var featureCardsBlockDefinition = {
58702
+ manifest: featureCardsManifest
58703
+ };
58704
+
56918
58705
  // ../blocks/src/system/blocks/media-text.ts
56919
58706
  init_defineBlock();
56920
58707
 
@@ -57011,69 +58798,6 @@ function createCarouselBehaviorFields(options = {}) {
57011
58798
  return fields3;
57012
58799
  }
57013
58800
 
57014
- // ../blocks/src/system/fields/imageLayout.ts
57015
- function createImageColSizeField(options = {}) {
57016
- const {
57017
- id = "imageColSize",
57018
- label = "Image column size",
57019
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
57020
- defaultValue = "1/3",
57021
- uiIntent = "display",
57022
- visibleWhen
57023
- } = options;
57024
- return {
57025
- id,
57026
- type: "select",
57027
- label,
57028
- description,
57029
- required: false,
57030
- defaultValue,
57031
- multiple: false,
57032
- options: [
57033
- { value: "1/4", label: "Small (1/4)" },
57034
- { value: "1/3", label: "Medium (1/3)" },
57035
- { value: "2/5", label: "Large (2/5)" },
57036
- { value: "1/2", label: "Extra large (1/2)" },
57037
- { value: "2/3", label: "Huge (2/3)" }
57038
- ],
57039
- ui: {
57040
- intent: uiIntent,
57041
- ...visibleWhen ? { visibleWhen } : {}
57042
- }
57043
- };
57044
- }
57045
- function createImagePositionField(options = {}) {
57046
- const {
57047
- id = "imagePosition",
57048
- label = "Image position",
57049
- description = "Choose which side the image appears on.",
57050
- defaultValue = "left",
57051
- includeAlternate = false,
57052
- uiIntent = "display",
57053
- visibleWhen
57054
- } = options;
57055
- const positionOptions = [
57056
- { value: "left", label: "Left" },
57057
- { value: "right", label: "Right" },
57058
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
57059
- ];
57060
- return {
57061
- id,
57062
- type: "select",
57063
- label,
57064
- description,
57065
- required: false,
57066
- defaultValue,
57067
- multiple: false,
57068
- // Spread to get a mutable array type without unsafe casts.
57069
- options: [...positionOptions],
57070
- ui: {
57071
- intent: uiIntent,
57072
- ...visibleWhen ? { visibleWhen } : {}
57073
- }
57074
- };
57075
- }
57076
-
57077
58801
  // ../blocks/src/system/blocks/media-text.ts
57078
58802
  var mediaTextFrameCapability = defineFrameCapability([
57079
58803
  "plain",
@@ -57197,26 +58921,13 @@ var mediaTextManifest = createBlockManifest({
57197
58921
  },
57198
58922
  ui: { intent: "behavior" }
57199
58923
  }),
57200
- {
58924
+ createAspectRatioField({
57201
58925
  id: "aspectRatio",
57202
- type: "select",
57203
58926
  label: "Media aspect ratio",
57204
58927
  description: "Crop media to a consistent aspect ratio.",
57205
- required: false,
57206
58928
  defaultValue: "auto",
57207
- multiple: false,
57208
- options: [
57209
- { value: "auto", label: "Auto (original)" },
57210
- { value: "16/9", label: "16:9 (Landscape)" },
57211
- { value: "4/3", label: "4:3 (Standard)" },
57212
- { value: "1/1", label: "1:1 (Square)" },
57213
- { value: "3/4", label: "3:4 (Portrait)" }
57214
- ],
57215
- ui: {
57216
- intent: "display",
57217
- visibleWhen: { field: "images", notEquals: null }
57218
- }
57219
- },
58929
+ visibleWhen: { field: "images", notEquals: null }
58930
+ }),
57220
58931
  {
57221
58932
  id: "text",
57222
58933
  type: "richText",
@@ -57346,7 +59057,7 @@ var mediaTextManifest = createBlockManifest({
57346
59057
  whenImagesLength(0)
57347
59058
  );
57348
59059
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
57349
- const defaultLayout = styledSection({
59060
+ const defaultLayout2 = styledSection({
57350
59061
  children: styledContainer({
57351
59062
  rootType: "stack",
57352
59063
  rootProps: { gap: "lg" },
@@ -57378,9 +59089,9 @@ var mediaTextManifest = createBlockManifest({
57378
59089
  spacing: "medium"
57379
59090
  });
57380
59091
  return {
57381
- layout: defaultLayout,
59092
+ layout: defaultLayout2,
57382
59093
  variants: {
57383
- default: defaultLayout
59094
+ default: defaultLayout2
57384
59095
  },
57385
59096
  defaultVariant: "default",
57386
59097
  variantOptions: {
@@ -59409,7 +61120,7 @@ init_builder();
59409
61120
  init_colorStyles();
59410
61121
  init_defineBlock();
59411
61122
  init_fragments();
59412
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
61123
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
59413
61124
  var galleryContainer = (children, opts) => {
59414
61125
  const gap = opts?.gap ?? "md";
59415
61126
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -59489,7 +61200,7 @@ var galleryItem = (options) => stack(
59489
61200
  ],
59490
61201
  repeat("content.images", "item")
59491
61202
  );
59492
- var gridLayout3 = grid3(
61203
+ var gridLayout3 = grid4(
59493
61204
  {
59494
61205
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
59495
61206
  },
@@ -60097,7 +61808,7 @@ init_builder();
60097
61808
  init_fragments();
60098
61809
  init_colorStyles();
60099
61810
  init_defineBlock();
60100
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
61811
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
60101
61812
  var videoItem = (options) => stack(
60102
61813
  { gap: "xs", className: options.containerClassName },
60103
61814
  [
@@ -60147,7 +61858,7 @@ var gridColumnsClass = (columns) => {
60147
61858
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
60148
61859
  }
60149
61860
  };
60150
- var createGridLayout = (columns) => grid4(
61861
+ var createGridLayout = (columns) => grid5(
60151
61862
  {
60152
61863
  className: gridColumnsClass(columns)
60153
61864
  },
@@ -62236,6 +63947,40 @@ var systemBlockDefinitionsRaw = [
62236
63947
  })
62237
63948
  ]
62238
63949
  })),
63950
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
63951
+ sectionSurfaces: "supported",
63952
+ contentFrames: ["plain", "panel"],
63953
+ itemSurfaces: "unsupported",
63954
+ headingDecorations: ["organic-squiggle"]
63955
+ }), defineBlockDesignMetadata({
63956
+ flow: bodyFlow,
63957
+ layoutProfiles: [
63958
+ layoutProfile({
63959
+ variantKey: "centered-copy",
63960
+ family: "centered",
63961
+ weight: "featured",
63962
+ bias: "soft"
63963
+ }),
63964
+ layoutProfile({
63965
+ variantKey: "statement-copy",
63966
+ family: "split",
63967
+ weight: "featured",
63968
+ bias: "merge"
63969
+ }),
63970
+ layoutProfile({
63971
+ variantKey: "statement-media",
63972
+ family: "media-text",
63973
+ weight: "featured",
63974
+ bias: "soft"
63975
+ }),
63976
+ layoutProfile({
63977
+ variantKey: "media-copy",
63978
+ family: "media-text",
63979
+ weight: "featured",
63980
+ bias: "soft"
63981
+ })
63982
+ ]
63983
+ })),
62239
63984
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
62240
63985
  flow: bodyFlow,
62241
63986
  layoutProfiles: [
@@ -62296,9 +64041,17 @@ var systemBlockDefinitionsRaw = [
62296
64041
  flow: conversionFlow,
62297
64042
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
62298
64043
  })),
62299
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
64044
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
64045
+ sectionSurfaces: "supported",
64046
+ contentFrames: ["plain", "panel"],
64047
+ itemSurfaces: "supported",
64048
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
64049
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
62300
64050
  flow: bodyFlow,
62301
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
64051
+ layoutProfiles: [
64052
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
64053
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
64054
+ ]
62302
64055
  })),
62303
64056
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
62304
64057
  flow: siteChromeFlow,
@@ -62312,7 +64065,8 @@ var systemBlockDefinitionsRaw = [
62312
64065
  sectionSurfaces: "supported",
62313
64066
  contentFrames: ["plain", "panel"],
62314
64067
  itemSurfaces: "supported",
62315
- testimonialCardTreatments: ["default", "accent-quote"]
64068
+ testimonialCardTreatments: ["default", "accent-quote"],
64069
+ headingDecorations: ["short-center-rule"]
62316
64070
  }), defineBlockDesignMetadata({
62317
64071
  flow: proofFlow,
62318
64072
  layoutProfiles: [
@@ -62338,6 +64092,22 @@ var systemBlockDefinitionsRaw = [
62338
64092
  flow: offeringsFlow,
62339
64093
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
62340
64094
  })),
64095
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
64096
+ sectionSurfaces: "supported",
64097
+ contentFrames: ["plain", "panel"],
64098
+ itemSurfaces: "supported",
64099
+ headingDecorations: ["short-center-rule"]
64100
+ }), defineBlockDesignMetadata({
64101
+ flow: offeringsFlow,
64102
+ layoutProfiles: [
64103
+ layoutProfile({
64104
+ variantKey: "cards",
64105
+ family: "grid",
64106
+ weight: "standard",
64107
+ bias: "soft"
64108
+ })
64109
+ ]
64110
+ })),
62341
64111
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
62342
64112
  flow: mediaFlow,
62343
64113
  layoutProfiles: [
@@ -63989,6 +65759,46 @@ init_RichText();
63989
65759
  init_richText_coerce();
63990
65760
  init_lucide_react();
63991
65761
  init_types7();
65762
+
65763
+ // ../blocks/src/system/runtime/nodes/accordionIconTreatment.ts
65764
+ init_types7();
65765
+ init_colorStyles();
65766
+ function resolveAccordionIconStyle(iconStyle, iconTreatment) {
65767
+ if (iconTreatment) {
65768
+ switch (iconTreatment.iconSet) {
65769
+ case "plus":
65770
+ return "plus-minus";
65771
+ case "chevron":
65772
+ return "chevron";
65773
+ case "caret":
65774
+ return "caret";
65775
+ case "minimal-cross":
65776
+ return "plus-minus";
65777
+ default:
65778
+ return assertNever6(iconTreatment.iconSet);
65779
+ }
65780
+ }
65781
+ return iconStyle && iconStyle in ICON_CONFIG ? iconStyle : "chevron";
65782
+ }
65783
+ function accordionIconColorStyle(iconTreatment) {
65784
+ const token = iconTreatment?.colorToken;
65785
+ if (!token || token === "current") return void 0;
65786
+ const themeToken = resolveIconColorToken(token);
65787
+ return {
65788
+ color: rgbColorValue(themeToken),
65789
+ ...iconTreatment.openColorToken && iconTreatment.openColorToken !== "current" ? {
65790
+ "--accordion-icon-open-color": rgbColorValue(resolveIconColorToken(iconTreatment.openColorToken))
65791
+ } : {}
65792
+ };
65793
+ }
65794
+ function resolveIconColorToken(token) {
65795
+ return token === "muted" ? "mutedText" : token;
65796
+ }
65797
+ function assertNever6(value) {
65798
+ throw new Error(`Unhandled accordion icon set: ${String(value)}`);
65799
+ }
65800
+
65801
+ // ../blocks/src/system/runtime/nodes/accordion.server.tsx
63992
65802
  import { jsx as jsx22, jsxs as jsxs9 } from "react/jsx-runtime";
63993
65803
  var ACCORDION_ICONS = {
63994
65804
  Plus,
@@ -64027,15 +65837,17 @@ var AccordionItemNodeSSR = ({
64027
65837
  content,
64028
65838
  question,
64029
65839
  answer,
64030
- iconStyle
65840
+ iconStyle,
65841
+ iconTreatment
64031
65842
  }) => {
64032
65843
  const resolvedValue = value !== void 0 && value !== null ? String(value) : void 0;
64033
65844
  const triggerSource = trigger ?? question;
64034
65845
  const contentSource = content ?? answer;
64035
- const resolvedIconStyle = iconStyle && iconStyle in ICON_CONFIG ? iconStyle : "chevron";
65846
+ const resolvedIconStyle = resolveAccordionIconStyle(iconStyle, iconTreatment);
64036
65847
  const iconConfig = ICON_CONFIG[resolvedIconStyle];
64037
65848
  const ClosedIconComponent = ACCORDION_ICONS[iconConfig.closedIcon];
64038
65849
  const OpenIconComponent = iconConfig.openIcon ? ACCORDION_ICONS[iconConfig.openIcon] : null;
65850
+ const iconColorStyle = accordionIconColorStyle(iconTreatment);
64039
65851
  return /* @__PURE__ */ jsxs9(
64040
65852
  "div",
64041
65853
  {
@@ -64045,10 +65857,20 @@ var AccordionItemNodeSSR = ({
64045
65857
  children: [
64046
65858
  /* @__PURE__ */ jsxs9("div", { className: "accordion-trigger", role: "button", tabIndex: 0, "aria-expanded": "false", children: [
64047
65859
  /* @__PURE__ */ jsx22("span", { className: "accordion-trigger-text", children: resolveNode(triggerSource) }),
64048
- /* @__PURE__ */ jsxs9("span", { className: "accordion-icon", "aria-hidden": "true", children: [
64049
- ClosedIconComponent && /* @__PURE__ */ jsx22(ClosedIconComponent, { className: "accordion-icon-closed" }),
64050
- OpenIconComponent && /* @__PURE__ */ jsx22(OpenIconComponent, { className: "accordion-icon-open" })
64051
- ] })
65860
+ /* @__PURE__ */ jsxs9(
65861
+ "span",
65862
+ {
65863
+ className: "accordion-icon",
65864
+ "aria-hidden": "true",
65865
+ "data-accordion-icon-set": iconTreatment?.iconSet,
65866
+ "data-accordion-icon-motion": iconTreatment?.motion,
65867
+ style: iconColorStyle,
65868
+ children: [
65869
+ ClosedIconComponent && /* @__PURE__ */ jsx22(ClosedIconComponent, { className: "accordion-icon-closed" }),
65870
+ OpenIconComponent && /* @__PURE__ */ jsx22(OpenIconComponent, { className: "accordion-icon-open" })
65871
+ ]
65872
+ }
65873
+ )
64052
65874
  ] }),
64053
65875
  /* @__PURE__ */ jsx22(
64054
65876
  "div",
@@ -70277,6 +72099,67 @@ function transformSdkBlockToDefinition(sdkBlock) {
70277
72099
  };
70278
72100
  }
70279
72101
 
72102
+ // ../blocks/src/customBlockRegistry.ts
72103
+ function isCustomBlockKind(blockKind) {
72104
+ return blockKind.startsWith("custom.");
72105
+ }
72106
+ function transformToBlockDescriptor(sdkBlock, source = "sdk") {
72107
+ return {
72108
+ name: sdkBlock.id,
72109
+ title: sdkBlock.title,
72110
+ description: sdkBlock.description,
72111
+ category: sdkBlock.category,
72112
+ tags: sdkBlock.tags,
72113
+ icon: sdkBlock.icon,
72114
+ definition: transformSdkBlockToDefinition(sdkBlock),
72115
+ source
72116
+ };
72117
+ }
72118
+ function toResolvedCustomBlock(manifest, source) {
72119
+ return {
72120
+ blockKind: manifest.id,
72121
+ manifest: transformSdkBlockToManifest(manifest),
72122
+ source,
72123
+ descriptor: transformToBlockDescriptor(
72124
+ manifest,
72125
+ source.kind === "managed-database" ? "database" : "sdk"
72126
+ )
72127
+ };
72128
+ }
72129
+ function createCustomBlockRegistry({
72130
+ sdkConfig,
72131
+ customBlocks = [],
72132
+ onConflict
72133
+ }) {
72134
+ const entriesByKind = /* @__PURE__ */ new Map();
72135
+ for (const sdkBlock of sdkConfig?.customBlocks ?? []) {
72136
+ entriesByKind.set(
72137
+ sdkBlock.id,
72138
+ toResolvedCustomBlock(sdkBlock, { kind: "sdk-config" })
72139
+ );
72140
+ }
72141
+ for (const customBlock of customBlocks) {
72142
+ const existing = entriesByKind.get(customBlock.manifest.id);
72143
+ if (existing) {
72144
+ onConflict?.(
72145
+ `Skipping DB custom block "${customBlock.manifest.id}" - conflicts with SDK config block`
72146
+ );
72147
+ continue;
72148
+ }
72149
+ entriesByKind.set(
72150
+ customBlock.manifest.id,
72151
+ toResolvedCustomBlock(customBlock.manifest, customBlock.source)
72152
+ );
72153
+ }
72154
+ return {
72155
+ entries: Array.from(entriesByKind.values()),
72156
+ findManifest: (blockKind) => {
72157
+ if (!isCustomBlockKind(blockKind)) return void 0;
72158
+ return entriesByKind.get(blockKind);
72159
+ }
72160
+ };
72161
+ }
72162
+
70280
72163
  // ../blocks/src/PageRenderer.tsx
70281
72164
  init_typeGuards2();
70282
72165
  init_media3();
@@ -70446,17 +72329,14 @@ var MemoBlockSection = React6.memo(
70446
72329
  }
70447
72330
  const OverrideComponent = getBlockOverride(block.kind, blockOverrides);
70448
72331
  let definition = getBlockDefinition(block.kind);
70449
- if (!definition && block.kind.startsWith("custom.") && sdkConfig?.customBlocks) {
70450
- const sdkBlock = sdkConfig.customBlocks.find((b2) => b2.id === block.kind);
70451
- if (sdkBlock) {
70452
- definition = transformSdkBlockToDefinition(sdkBlock);
70453
- }
70454
- }
70455
- if (!definition && block.kind.startsWith("custom.") && customBlocks) {
70456
- const dbBlock = customBlocks.find((b2) => b2.id === block.kind);
70457
- if (dbBlock) {
70458
- definition = transformSdkBlockToDefinition(dbBlock);
70459
- }
72332
+ if (!definition && block.kind.startsWith("custom.")) {
72333
+ definition = createCustomBlockRegistry({
72334
+ sdkConfig,
72335
+ customBlocks: (customBlocks ?? []).map((manifest) => ({
72336
+ manifest,
72337
+ source: { kind: "managed-database" }
72338
+ }))
72339
+ }).findManifest(block.kind)?.descriptor.definition;
70460
72340
  }
70461
72341
  if (!definition) {
70462
72342
  if (OverrideComponent) {
@@ -70483,13 +72363,16 @@ var MemoBlockSection = React6.memo(
70483
72363
  }
70484
72364
  if (block.kind.startsWith("custom.") && shouldDebugCustomBlocks()) {
70485
72365
  try {
70486
- console.warn("[blocks:PageRenderer] custom block definition missing", {
70487
- blockId: block.id ?? null,
70488
- blockKind: block.kind,
70489
- hasOverride: Boolean(OverrideComponent),
70490
- sdkCustomBlocksCount: sdkConfig?.customBlocks?.length ?? 0,
70491
- dbCustomBlocksCount: customBlocks?.length ?? 0
70492
- });
72366
+ console.warn(
72367
+ "[blocks:PageRenderer] custom block definition missing",
72368
+ {
72369
+ blockId: block.id ?? null,
72370
+ blockKind: block.kind,
72371
+ hasOverride: Boolean(OverrideComponent),
72372
+ sdkCustomBlocksCount: sdkConfig?.customBlocks?.length ?? 0,
72373
+ dbCustomBlocksCount: customBlocks?.length ?? 0
72374
+ }
72375
+ );
70493
72376
  } catch {
70494
72377
  }
70495
72378
  }
@@ -70503,12 +72386,15 @@ var MemoBlockSection = React6.memo(
70503
72386
  if (!OverrideComponent && !manifestHasLayout) {
70504
72387
  if (block.kind.startsWith("custom.") && shouldDebugCustomBlocks()) {
70505
72388
  try {
70506
- console.warn("[blocks:PageRenderer] custom block has no layout/variants and no override", {
70507
- blockId: block.id ?? null,
70508
- blockKind: block.kind,
70509
- hasOverride: false,
70510
- manifestKeys: Object.keys(definition.manifest ?? {}).sort()
70511
- });
72389
+ console.warn(
72390
+ "[blocks:PageRenderer] custom block has no layout/variants and no override",
72391
+ {
72392
+ blockId: block.id ?? null,
72393
+ blockKind: block.kind,
72394
+ hasOverride: false,
72395
+ manifestKeys: Object.keys(definition.manifest ?? {}).sort()
72396
+ }
72397
+ );
70512
72398
  } catch {
70513
72399
  }
70514
72400
  }
@@ -70542,9 +72428,10 @@ var MemoBlockSection = React6.memo(
70542
72428
  if (parsed.success) {
70543
72429
  data = parsed.data;
70544
72430
  } else if (usePlaceholders) {
70545
- const relaxed = getCachedValidator(definition.manifest, "relaxed").safeParse(
70546
- content
70547
- );
72431
+ const relaxed = getCachedValidator(
72432
+ definition.manifest,
72433
+ "relaxed"
72434
+ ).safeParse(content);
70548
72435
  if (relaxed.success) {
70549
72436
  data = relaxed.data;
70550
72437
  } else {
@@ -84113,7 +86000,7 @@ var SimpleCache = class {
84113
86000
  };
84114
86001
 
84115
86002
  // src/version.ts
84116
- var SDK_VERSION = "0.76.0";
86003
+ var SDK_VERSION = "0.77.0";
84117
86004
 
84118
86005
  // src/client/error.ts
84119
86006
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -84541,6 +86428,24 @@ function getPrebuildModule() {
84541
86428
  return null;
84542
86429
  }
84543
86430
  }
86431
+ function mergeDefaultHeaders(defaultHeaders, options) {
86432
+ if (!defaultHeaders || Object.keys(defaultHeaders).length === 0) {
86433
+ return options;
86434
+ }
86435
+ return {
86436
+ ...options,
86437
+ headers: {
86438
+ ...defaultHeaders,
86439
+ ...Object.fromEntries(new Headers(options?.headers).entries())
86440
+ }
86441
+ };
86442
+ }
86443
+ function withDefaultHeaders(apiClient, defaultHeaders) {
86444
+ return async (params) => apiClient({
86445
+ ...params,
86446
+ options: mergeDefaultHeaders(defaultHeaders, params.options)
86447
+ });
86448
+ }
84544
86449
  setSdkVersion(SDK_VERSION);
84545
86450
  var DEFAULT_BROWSER_TIMEOUT_MS = 5e3;
84546
86451
  var DEFAULT_SERVER_TIMEOUT_MS = 8e3;
@@ -84740,7 +86645,8 @@ function createRiverbankClient(config) {
84740
86645
  keyType = "preview";
84741
86646
  break;
84742
86647
  }
84743
- const apiClient = authConfig.type === "none" ? createInternalAPIClient(config.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config.baseUrl) : createBearerAPIClient(authConfig.token, config.baseUrl);
86648
+ const baseApiClient = authConfig.type === "none" ? createInternalAPIClient(config.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config.baseUrl) : createBearerAPIClient(authConfig.token, config.baseUrl);
86649
+ const apiClient = withDefaultHeaders(baseApiClient, config.defaultHeaders);
84744
86650
  const cache = new SimpleCache({
84745
86651
  maxSize: cacheMaxSize,
84746
86652
  ttl: cacheTTL,