@riverbankcms/sdk 0.79.0 → 0.80.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 (160) hide show
  1. package/dist/PreviewEditorSidebar-QZG37QIF.mjs +2655 -0
  2. package/dist/{PreviewEditorUI-27KJVEET.mjs → PreviewEditorUI-AXIKSMZA.mjs} +27 -4
  3. package/dist/SdkPreviewModeRuntime-XE5M4UKM.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +20 -0
  5. package/dist/_dts/api/src/endpoints.d.ts +24 -0
  6. package/dist/_dts/api/src/index.d.ts +1 -1
  7. package/dist/_dts/api/src/siteInfrastructure.d.ts +124 -0
  8. package/dist/_dts/api/src/siteOnboarding.d.ts +13 -0
  9. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +10 -1
  10. package/dist/_dts/block-form/src/client/index.d.ts +2 -0
  11. package/dist/_dts/block-form/src/index.d.ts +2 -0
  12. package/dist/_dts/block-form/src/utils/evaluateVisibility.d.ts +2 -1
  13. package/dist/_dts/blocks/src/client/header.d.ts +1 -1
  14. package/dist/_dts/blocks/src/client.d.ts +12 -12
  15. package/dist/_dts/blocks/src/index.d.ts +1 -1
  16. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +2 -2
  17. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +2 -1
  18. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -1
  19. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
  20. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +21 -12
  21. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -2
  22. package/dist/_dts/blocks/src/system/fragments/library/faqHeading.d.ts +1 -0
  23. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +5 -0
  24. package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +1 -4
  25. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  26. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +7 -7
  27. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  28. package/dist/_dts/blocks/src/system/runtime/header/enhanceHeaderSection.d.ts +10 -2
  29. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -5
  30. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.server.d.ts +2 -2
  31. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventSpotlight.d.ts +2 -2
  32. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCard.d.ts +2 -2
  33. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventDetailModal.d.ts +2 -2
  34. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModals.d.ts +2 -2
  35. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -2
  36. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +3 -0
  37. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +9 -0
  38. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +14 -1
  39. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +9 -3
  40. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +2 -6
  41. package/dist/_dts/editor-blocks/src/block-editor/BlockCardBody.d.ts +2 -6
  42. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +2 -6
  43. package/dist/_dts/editor-blocks/src/block-editor/FeatureCardIconsPanel.d.ts +2 -6
  44. package/dist/_dts/editor-blocks/src/block-editor/GeneratedIconSetDialog.d.ts +6 -4
  45. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -6
  46. package/dist/_dts/editor-blocks/src/index.d.ts +2 -0
  47. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +5 -1
  48. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeControlPlan.d.ts +24 -0
  49. package/dist/_dts/preview-next/src/client/blocks/useBlockCustomizeControls.d.ts +34 -0
  50. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +2 -5
  51. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +4 -1
  52. package/dist/_dts/preview-next/src/client/preview/PreviewBlockCustomizeSelectionContext.d.ts +20 -0
  53. package/dist/_dts/preview-next/src/client/preview/PreviewOpenEditorButton.d.ts +2 -0
  54. package/dist/_dts/preview-next/src/client/preview/SelectedBlockCustomizePanel.d.ts +13 -0
  55. package/dist/_dts/preview-next/src/client/preview/previewCustomizeEditorDraftPatch.d.ts +13 -0
  56. package/dist/_dts/preview-next/src/client/preview/previewCustomizeRuntimePatch.d.ts +2 -0
  57. package/dist/_dts/preview-next/src/client/preview/storeTypes.d.ts +4 -0
  58. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +3 -1
  59. package/dist/_dts/sdk/src/cli/commands/webhooks.d.ts +44 -0
  60. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  61. package/dist/_dts/sdk/src/client/management/types.d.ts +56 -0
  62. package/dist/_dts/sdk/src/client/management/webhooks.d.ts +3 -0
  63. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +6 -3
  64. package/dist/_dts/sdk/src/version.d.ts +1 -1
  65. package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +220 -0
  66. package/dist/_dts/theme-core/src/accordions/types.d.ts +45 -2
  67. package/dist/_dts/theme-core/src/blockOverrides.d.ts +8 -0
  68. package/dist/_dts/theme-core/src/blocks/types.d.ts +1 -1
  69. package/dist/_dts/theme-core/src/blocks/vars/testimonials.d.ts +4 -1
  70. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  71. package/dist/_dts/theme-core/src/cards/core.d.ts +20 -0
  72. package/dist/_dts/theme-core/src/cards/generateDefaultCardSystem.d.ts +6 -3
  73. package/dist/_dts/theme-core/src/cards/siteStyleDefaults.d.ts +105 -0
  74. package/dist/_dts/theme-core/src/cards/types.d.ts +177 -0
  75. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  76. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +156 -18
  77. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  78. package/dist/_dts/theme-core/src/palette/variants/soft-natural.d.ts +16 -0
  79. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +1 -1
  80. package/dist/_dts/theme-core/src/schema.d.ts +446 -52
  81. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +86 -17
  82. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +2 -3
  83. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +86 -17
  84. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +110 -1
  85. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +20 -1
  86. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -0
  87. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +286 -6
  88. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  89. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +193 -0
  90. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +2 -8
  91. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +2 -0
  92. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +10 -7
  93. package/dist/_dts/theme-core/src/site-styles/siteStyleThemeCompiler.d.ts +11 -0
  94. package/dist/_dts/theme-core/src/site-styles/sourceCatalogs.d.ts +2 -2
  95. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +1 -1
  96. package/dist/_dts/theme-core/src/site-styles/testimonialQuotePresets.d.ts +15 -0
  97. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  98. package/dist/_dts/theme-core/src/site-styles/types.d.ts +7 -29
  99. package/dist/{PreviewEditorSidebar-56NMJMIK.mjs → chunk-5NZGBSJF.mjs} +1423 -2451
  100. package/dist/{chunk-4HCW7FHJ.mjs → chunk-7PCYG6YV.mjs} +215 -137
  101. package/dist/{chunk-K2IIF34C.mjs → chunk-BBLZSQEY.mjs} +24 -0
  102. package/dist/{chunk-V47ZU33I.mjs → chunk-GYXKAUFV.mjs} +2785 -785
  103. package/dist/{chunk-GP555I66.mjs → chunk-HTB4BMKD.mjs} +94 -46
  104. package/dist/{chunk-A3HHFKVT.mjs → chunk-MPBNEVPB.mjs} +1 -1
  105. package/dist/cli/index.mjs +2100 -545
  106. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +16 -4
  107. package/dist/client/{accordion-QLA7KBYO.mjs → accordion-QFZMNB7O.mjs} +1 -1
  108. package/dist/client/{bookingForm-PYZIPA5G.mjs → bookingForm-NCIXFWIG.mjs} +3 -3
  109. package/dist/client/bookings.mjs +1144 -329
  110. package/dist/client/{carousel-5EIULWBI.mjs → carousel-EO4BJMWD.mjs} +2 -2
  111. package/dist/client/{cart-DOP3FNI4.mjs → cart-FTYCLYUW.mjs} +5 -5
  112. package/dist/client/{checkout-BVMF6FBV.mjs → checkout-NFGLVCOX.mjs} +5 -5
  113. package/dist/client/{chunk-TYONZMST.mjs → chunk-4W66ALYT.mjs} +1 -1
  114. package/dist/client/{chunk-44K2U3QI.mjs → chunk-6GVVWSPU.mjs} +4 -4
  115. package/dist/client/{chunk-UDS3NTWA.mjs → chunk-IWFZSQNZ.mjs} +1 -1
  116. package/dist/client/{chunk-R5ESWNKX.mjs → chunk-PUOELU4O.mjs} +89 -5
  117. package/dist/client/{chunk-YLDYVRZL.mjs → chunk-PYRBIURC.mjs} +4 -4
  118. package/dist/client/{chunk-GG4M2NP6.mjs → chunk-T6UIP6UZ.mjs} +1 -1
  119. package/dist/client/{chunk-V6M5FCR5.mjs → chunk-VDS5YFLX.mjs} +1 -1
  120. package/dist/client/{chunk-CCNTDRCF.mjs → chunk-Y37KDO7P.mjs} +1 -1
  121. package/dist/client/client.mjs +4205 -2324
  122. package/dist/client/{courseRegistration-E6EAA6NL.mjs → courseRegistration-2EORROPS.mjs} +3 -3
  123. package/dist/client/{eventCalendar-HBG3HAK6.mjs → eventCalendar-WZI4VL6N.mjs} +5 -5
  124. package/dist/client/{eventCombined-6K5ZZWAK.mjs → eventCombined-QCB2TCNL.mjs} +5 -5
  125. package/dist/client/{eventDetails-Q75ICXLT.mjs → eventDetails-TFTATAPH.mjs} +5 -5
  126. package/dist/client/{eventListing-27P5F7DZ.mjs → eventListing-A2CQEHEQ.mjs} +5 -5
  127. package/dist/client/{eventRegistration-IQ7AMASR.mjs → eventRegistration-OELPVLUY.mjs} +5 -5
  128. package/dist/client/{form-JRTD65FN.mjs → form-NTIFD6WQ.mjs} +1 -1
  129. package/dist/client/{headerSection-7FPSSZHS.mjs → headerSection-7TBNKCLA.mjs} +65 -24
  130. package/dist/client/hooks.mjs +3354 -2006
  131. package/dist/client/{locationMap-7NGFNYBH.mjs → locationMap-LRLB5A3H.mjs} +1 -1
  132. package/dist/client/{newsletterForm-F3BADCI2.mjs → newsletterForm-XI52RZSN.mjs} +1 -1
  133. package/dist/client/{productDetail-V3HP7ITJ.mjs → productDetail-GSNKBFLY.mjs} +5 -5
  134. package/dist/client/{productList-L3EGJUF2.mjs → productList-BGCGT4KZ.mjs} +5 -5
  135. package/dist/client/rendering/client.mjs +2570 -1657
  136. package/dist/client/rendering/islands.mjs +18 -18
  137. package/dist/client/rendering.mjs +4275 -2394
  138. package/dist/client/{shop-DQUB5E2C.mjs → shop-RQHUCLNY.mjs} +5 -5
  139. package/dist/preview-next/before-render.mjs +24 -0
  140. package/dist/preview-next/client/runtime.mjs +5 -5
  141. package/dist/preview-next/middleware.mjs +24 -0
  142. package/dist/{sdk-runtime-AF6KXJU4.mjs → sdk-runtime-A4LHT2RS.mjs} +6 -6
  143. package/dist/server/components.mjs +4063 -2293
  144. package/dist/server/config-validation.mjs +3525 -2176
  145. package/dist/server/config.mjs +3525 -2176
  146. package/dist/server/data.mjs +3354 -2006
  147. package/dist/server/index.mjs +25 -1
  148. package/dist/server/next.mjs +4006 -2236
  149. package/dist/server/page-converter.mjs +2747 -1816
  150. package/dist/server/prebuild.mjs +1 -1
  151. package/dist/server/rendering/server.mjs +4063 -2293
  152. package/dist/server/rendering.mjs +4063 -2293
  153. package/dist/server/routing.mjs +3508 -2111
  154. package/dist/server/server.mjs +3372 -2024
  155. package/dist/server/theme-bridge.mjs +1436 -310
  156. package/dist/server/theme.mjs +409 -219
  157. package/dist/styles/index.css +300 -33
  158. package/package.json +1 -1
  159. package/dist/SdkPreviewModeRuntime-H4BSP6E7.mjs +0 -8
  160. package/dist/chunk-LCY32PXF.mjs +0 -1175
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import z41, { z, ZodError } from 'zod';
2
+ import z42, { z, ZodError } from 'zod';
3
3
  import 'react/jsx-runtime';
4
4
  import { createJiti } from 'jiti';
5
5
  import * as fs10 from 'fs';
@@ -1130,6 +1130,7 @@ var init_validation_constants = __esm({
1130
1130
  "boxStyles.resolveRootStyle",
1131
1131
  "boxStyles.semanticGap",
1132
1132
  "boxStyles.semanticGapValue",
1133
+ "boxStyles.cardVariantClass",
1133
1134
  "containerStyles.resolveBoxClassName"
1134
1135
  ];
1135
1136
  ALLOWED_NODE_TYPES_SET = new Set(ALLOWED_NODE_TYPES);
@@ -2068,11 +2069,11 @@ function defineBlockDesignCapability(capability) {
2068
2069
  tileTreatments: capability.tileTreatments ?? ["default"],
2069
2070
  eventListTreatments: capability.eventListTreatments ?? ["plain"],
2070
2071
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
2071
- ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
2072
- ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
2072
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {},
2073
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {}
2073
2074
  };
2074
2075
  }
2075
- var plainFrame, tileTreatmentValues, eventListTreatmentValues, eyebrowTreatmentValues, visibleHeadingDecorationFamilyValues, visibleHeadingDecorationPlacementValues, headingDecorationOverrideValues, headingDecorationColorTokenValues, accordionIconSetValues, accordionIconColorTokenValues, accordionIconMotionValues;
2076
+ var plainFrame, tileTreatmentValues, eventListTreatmentValues, eyebrowTreatmentValues, visibleHeadingDecorationFamilyValues, headingDecorationOverrideValues, headingDecorationColorTokenValues, noHeadingDecoration, accordionIconSetValues, accordionIconColorTokenValues, accordionIconMotionValues;
2076
2077
  var init_types2 = __esm({
2077
2078
  "../theme-core/src/site-styles/types.ts"() {
2078
2079
  plainFrame = {
@@ -2098,14 +2099,8 @@ var init_types2 = __esm({
2098
2099
  "organic-squiggle",
2099
2100
  "short-center-rule"
2100
2101
  ];
2101
- visibleHeadingDecorationPlacementValues = [
2102
- "after-heading",
2103
- "between-heading-and-body",
2104
- "under-centered-heading"
2105
- ];
2106
2102
  headingDecorationOverrideValues = [
2107
2103
  "site-default",
2108
- "on",
2109
2104
  "off"
2110
2105
  ];
2111
2106
  headingDecorationColorTokenValues = [
@@ -2116,6 +2111,9 @@ var init_types2 = __esm({
2116
2111
  "border",
2117
2112
  "muted"
2118
2113
  ];
2114
+ noHeadingDecoration = {
2115
+ family: "none"
2116
+ };
2119
2117
  accordionIconSetValues = [
2120
2118
  "plus",
2121
2119
  "chevron",
@@ -2511,7 +2509,24 @@ var init_blockAppearancePresets = __esm({
2511
2509
  contentFrame: plainFrame,
2512
2510
  itemSurface: "none",
2513
2511
  transitionAfter: "soft-fade-short",
2514
- emphasis: "high",
2512
+ emphasis: "high"
2513
+ }
2514
+ }),
2515
+ defineBlockAppearancePreset({
2516
+ kind: "block-design",
2517
+ id: "intro-portrait-bio",
2518
+ target: "intro",
2519
+ label: "Portrait and bio",
2520
+ blockKinds: ["block.intro"],
2521
+ constraints: {
2522
+ layoutVariantKeys: ["media-copy"]
2523
+ },
2524
+ design: {
2525
+ sectionSurface: "base",
2526
+ contentFrame: plainFrame,
2527
+ itemSurface: "none",
2528
+ transitionAfter: "soft-fade-short",
2529
+ emphasis: "medium",
2515
2530
  headingDecoration: {
2516
2531
  family: "organic-squiggle",
2517
2532
  placement: "after-heading",
@@ -2544,12 +2559,49 @@ var init_blockAppearancePresets = __esm({
2544
2559
  contentFrame: plainFrame,
2545
2560
  itemSurface: "raised",
2546
2561
  transitionAfter: "none",
2547
- emphasis: "high",
2548
- headingDecoration: {
2549
- family: "short-center-rule",
2550
- placement: "under-centered-heading",
2551
- colorToken: "primary"
2552
- }
2562
+ emphasis: "high"
2563
+ }
2564
+ }),
2565
+ defineBlockAppearancePreset({
2566
+ kind: "block-design",
2567
+ id: "feature-cards-editorial-columns",
2568
+ target: "feature-cards",
2569
+ label: "Editorial open columns",
2570
+ blockKinds: ["block.feature-cards"],
2571
+ design: {
2572
+ sectionSurface: "base",
2573
+ contentFrame: plainFrame,
2574
+ itemSurface: "editorial",
2575
+ transitionAfter: "none",
2576
+ emphasis: "medium"
2577
+ }
2578
+ }),
2579
+ defineBlockAppearancePreset({
2580
+ kind: "block-design",
2581
+ id: "feature-cards-soft-panels",
2582
+ target: "feature-cards",
2583
+ label: "Soft tinted panels",
2584
+ blockKinds: ["block.feature-cards"],
2585
+ design: {
2586
+ sectionSurface: "base",
2587
+ contentFrame: plainFrame,
2588
+ itemSurface: "inset",
2589
+ transitionAfter: "none",
2590
+ emphasis: "medium"
2591
+ }
2592
+ }),
2593
+ defineBlockAppearancePreset({
2594
+ kind: "block-design",
2595
+ id: "feature-cards-photo-tiles",
2596
+ target: "feature-cards",
2597
+ label: "Photo tiles",
2598
+ blockKinds: ["block.feature-cards"],
2599
+ design: {
2600
+ sectionSurface: "base",
2601
+ contentFrame: plainFrame,
2602
+ itemSurface: "raised",
2603
+ transitionAfter: "none",
2604
+ emphasis: "high"
2553
2605
  }
2554
2606
  }),
2555
2607
  defineBlockAppearancePreset({
@@ -2680,39 +2732,55 @@ var init_blockAppearancePresets = __esm({
2680
2732
  emphasis: "high"
2681
2733
  }
2682
2734
  }),
2735
+ // Thin testimonials looks: each is a composition of section surface + which
2736
+ // card variant (or non-carded). The quote mark and card surface come from the
2737
+ // site style (testimonialQuote + card variants), not the look.
2738
+ defineBlockAppearancePreset({
2739
+ kind: "block-design",
2740
+ id: "testimonials-default-cards",
2741
+ target: "testimonials",
2742
+ label: "Default cards",
2743
+ blockKinds: ["block.testimonials"],
2744
+ design: {
2745
+ sectionSurface: "base",
2746
+ contentFrame: plainFrame,
2747
+ itemSurface: "none",
2748
+ transitionAfter: "soft-fade-short",
2749
+ emphasis: "medium",
2750
+ testimonialCardTreatment: "default"
2751
+ }
2752
+ }),
2683
2753
  defineBlockAppearancePreset({
2684
2754
  kind: "block-design",
2685
- id: "testimonials-accent-quote-cards",
2755
+ id: "testimonials-statement-cards",
2686
2756
  target: "testimonials",
2687
- label: "Accent quote cards",
2757
+ label: "Statement cards",
2688
2758
  blockKinds: ["block.testimonials"],
2689
2759
  design: {
2690
2760
  sectionSurface: "accent-band",
2691
2761
  contentFrame: plainFrame,
2762
+ // 'raised' carries the elevation shadow (rb-shadow-md = var(--shadow-md)),
2763
+ // matching the legacy accent-quote card; the statement card variant
2764
+ // supplies the fill/accent/corner and emits no shadow of its own.
2692
2765
  itemSurface: "raised",
2693
2766
  transitionAfter: "soft-fade-short",
2694
2767
  emphasis: "high",
2695
- testimonialCardTreatment: "accent-quote"
2768
+ testimonialCardTreatment: "statement"
2696
2769
  }
2697
2770
  }),
2698
2771
  defineBlockAppearancePreset({
2699
2772
  kind: "block-design",
2700
- id: "testimonials-brand-background-quotes",
2773
+ id: "testimonials-non-carded",
2701
2774
  target: "testimonials",
2702
- label: "Brand background quotes",
2775
+ label: "Non-carded",
2703
2776
  blockKinds: ["block.testimonials"],
2704
2777
  design: {
2705
- sectionSurface: "brand-depth-band",
2778
+ sectionSurface: "muted-band",
2706
2779
  contentFrame: plainFrame,
2707
2780
  itemSurface: "none",
2708
2781
  transitionAfter: "soft-fade-short",
2709
- emphasis: "high",
2710
- testimonialCardTreatment: "accent-quote",
2711
- headingDecoration: {
2712
- family: "short-center-rule",
2713
- placement: "under-centered-heading",
2714
- colorToken: "border"
2715
- }
2782
+ emphasis: "medium",
2783
+ testimonialCardTreatment: "non-carded"
2716
2784
  }
2717
2785
  }),
2718
2786
  defineBlockAppearancePreset({
@@ -4129,44 +4197,44 @@ var init_personalities = __esm({
4129
4197
  var hotspotSchema, rotationSchema, rectSchema, aspectCropSchema, transformSchema, mediaSchema;
4130
4198
  var init_media = __esm({
4131
4199
  "../theme-core/src/lib/media.ts"() {
4132
- hotspotSchema = z41.object({
4133
- x: z41.number().min(0).max(1),
4134
- y: z41.number().min(0).max(1),
4135
- radius: z41.number().optional()
4200
+ hotspotSchema = z42.object({
4201
+ x: z42.number().min(0).max(1),
4202
+ y: z42.number().min(0).max(1),
4203
+ radius: z42.number().optional()
4136
4204
  });
4137
- rotationSchema = z41.union([z41.literal(0), z41.literal(90), z41.literal(180), z41.literal(270)]);
4138
- rectSchema = z41.tuple([z41.number(), z41.number(), z41.number(), z41.number()]);
4139
- aspectCropSchema = z41.object({
4140
- aspect: z41.preprocess((value) => value == null ? void 0 : value, z41.string().optional()),
4141
- rect: z41.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
4142
- hotspot: z41.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
4143
- rotation: z41.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
4205
+ rotationSchema = z42.union([z42.literal(0), z42.literal(90), z42.literal(180), z42.literal(270)]);
4206
+ rectSchema = z42.tuple([z42.number(), z42.number(), z42.number(), z42.number()]);
4207
+ aspectCropSchema = z42.object({
4208
+ aspect: z42.preprocess((value) => value == null ? void 0 : value, z42.string().optional()),
4209
+ rect: z42.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
4210
+ hotspot: z42.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
4211
+ rotation: z42.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
4144
4212
  });
4145
- transformSchema = z41.object({
4146
- aspectCrops: z41.preprocess((value) => {
4213
+ transformSchema = z42.object({
4214
+ aspectCrops: z42.preprocess((value) => {
4147
4215
  if (!value || typeof value !== "object" || Array.isArray(value)) {
4148
4216
  return void 0;
4149
4217
  }
4150
4218
  return value;
4151
- }, z41.record(z41.string(), aspectCropSchema.catch({}))).optional(),
4219
+ }, z42.record(z42.string(), aspectCropSchema.catch({}))).optional(),
4152
4220
  rect: rectSchema.optional(),
4153
4221
  hotspot: hotspotSchema.optional(),
4154
4222
  rotation: rotationSchema.optional()
4155
4223
  });
4156
- mediaSchema = z41.object({
4157
- type: z41.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
4158
- purpose: z41.string().optional(),
4159
- placeholder: z41.boolean().default(true).optional(),
4160
- assetId: z41.string().optional(),
4161
- identifier: z41.string().optional(),
4162
- src: z41.string().optional(),
4163
- alt: z41.string().optional(),
4164
- filename: z41.string().optional(),
4165
- mimeType: z41.string().optional(),
4166
- width: z41.number().optional(),
4167
- height: z41.number().optional(),
4168
- storageBucket: z41.string().optional(),
4169
- storagePath: z41.string().optional(),
4224
+ mediaSchema = z42.object({
4225
+ type: z42.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
4226
+ purpose: z42.string().optional(),
4227
+ placeholder: z42.boolean().default(true).optional(),
4228
+ assetId: z42.string().optional(),
4229
+ identifier: z42.string().optional(),
4230
+ src: z42.string().optional(),
4231
+ alt: z42.string().optional(),
4232
+ filename: z42.string().optional(),
4233
+ mimeType: z42.string().optional(),
4234
+ width: z42.number().optional(),
4235
+ height: z42.number().optional(),
4236
+ storageBucket: z42.string().optional(),
4237
+ storagePath: z42.string().optional(),
4170
4238
  transform: transformSchema.optional()
4171
4239
  });
4172
4240
  }
@@ -4340,12 +4408,35 @@ var init_buttons = __esm({
4340
4408
  init_core();
4341
4409
  }
4342
4410
  });
4343
- var cardSpacingSchema, gradientDirectionSchema2, cardBackgroundSchema, cardBorderSchema, cardVariantSchema, cardSystemSchema;
4411
+ function isCardVariantRole(value) {
4412
+ return typeof value === "string" && cardVariantRoleValues.includes(value);
4413
+ }
4414
+ function normalizeCardVariantRole(value) {
4415
+ if (isCardVariantRole(value)) return value;
4416
+ if (typeof value !== "string") return null;
4417
+ return legacyCardVariantRoleAliases[value] ?? null;
4418
+ }
4419
+ function normalizeBoxStylesCardVariant(value) {
4420
+ if (value === boxlessCardVariantValue) return boxlessCardVariantValue;
4421
+ return normalizeCardVariantRole(value);
4422
+ }
4423
+ var cardVariantRoleValues, boxlessCardVariantValue, legacyCardVariantRoleAliases, cardSpacingSchema, gradientDirectionSchema2, cardVariantRoleSchema, boxStylesCardVariantSchema, cardBackgroundSchema, cardBorderSchema, cardCornerValueSchema, cardAccentEdgeSchema, cardCornerRadiiSchema, cardVariantSchema, cardSystemSchema;
4344
4424
  var init_types6 = __esm({
4345
4425
  "../theme-core/src/cards/types.ts"() {
4346
4426
  init_themeColorTokens();
4427
+ cardVariantRoleValues = ["default", "alternative"];
4428
+ boxlessCardVariantValue = "none";
4429
+ legacyCardVariantRoleAliases = {
4430
+ variant1: "alternative",
4431
+ variant2: "alternative"
4432
+ };
4347
4433
  cardSpacingSchema = z.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
4348
4434
  gradientDirectionSchema2 = z.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
4435
+ cardVariantRoleSchema = z.enum(cardVariantRoleValues);
4436
+ boxStylesCardVariantSchema = z.enum([
4437
+ ...cardVariantRoleValues,
4438
+ boxlessCardVariantValue
4439
+ ]);
4349
4440
  cardBackgroundSchema = z.discriminatedUnion("type", [
4350
4441
  z.object({ type: z.literal("solid"), colorToken: themeColorTokenSchema }),
4351
4442
  z.object({
@@ -4360,6 +4451,24 @@ var init_types6 = __esm({
4360
4451
  widthClass: z.string(),
4361
4452
  colorToken: themeColorTokenSchema
4362
4453
  });
4454
+ cardCornerValueSchema = z.enum([
4455
+ "square",
4456
+ "soft",
4457
+ "rounded",
4458
+ "pill",
4459
+ "expressive"
4460
+ ]);
4461
+ cardAccentEdgeSchema = z.object({
4462
+ edge: z.enum(["left", "top", "right", "bottom"]),
4463
+ colorToken: themeColorTokenSchema,
4464
+ width: z.enum(["thin", "medium", "thick", "heavy"])
4465
+ });
4466
+ cardCornerRadiiSchema = z.object({
4467
+ topLeft: cardCornerValueSchema.optional(),
4468
+ topRight: cardCornerValueSchema.optional(),
4469
+ bottomLeft: cardCornerValueSchema.optional(),
4470
+ bottomRight: cardCornerValueSchema.optional()
4471
+ });
4363
4472
  cardVariantSchema = z.object({
4364
4473
  id: z.string(),
4365
4474
  name: z.string().min(1).max(20),
@@ -4368,6 +4477,8 @@ var init_types6 = __esm({
4368
4477
  // Appearance (token-based)
4369
4478
  background: cardBackgroundSchema,
4370
4479
  spacing: cardSpacingSchema,
4480
+ // Optional foreground (card text) color, for cards on a strong fill.
4481
+ foregroundToken: themeColorTokenSchema.optional(),
4371
4482
  // Optional overrides (uses theme defaults if not specified)
4372
4483
  shadow: z.object({
4373
4484
  elevation: z.enum(["none", "low", "medium", "high"]),
@@ -4375,8 +4486,12 @@ var init_types6 = __esm({
4375
4486
  position: z.enum(["bottom", "bottom-right"]).default("bottom")
4376
4487
  }).optional(),
4377
4488
  corners: z.enum(["square", "soft", "rounded", "pill"]).optional(),
4489
+ // Per-corner radius override; wins over `corners` when set.
4490
+ cornerRadii: cardCornerRadiiSchema.optional(),
4378
4491
  // Border (optional)
4379
- border: cardBorderSchema.optional()
4492
+ border: cardBorderSchema.optional(),
4493
+ // Single accent edge; replaces `border` when set.
4494
+ accentEdge: cardAccentEdgeSchema.optional()
4380
4495
  });
4381
4496
  cardSystemSchema = z.object({
4382
4497
  variants: z.array(cardVariantSchema).min(1).max(3)
@@ -4438,11 +4553,13 @@ var init_types7 = __esm({
4438
4553
  // ⊕ becomes ⊖ (swap with fade)
4439
4554
  ]);
4440
4555
  accordionSystemSchema = z.object({
4441
- // Visual styling (solid color only - gradients can be added later if needed)
4556
+ // Visual styling (solid color only - gradients can be added later if needed).
4557
+ // null = no fill, so the accordion sits transparently on the section
4558
+ // surface (used by open, boxless "divided" looks).
4442
4559
  background: z.object({
4443
4560
  type: z.literal("solid"),
4444
4561
  colorToken: themeColorTokenSchema
4445
- }),
4562
+ }).nullable(),
4446
4563
  // Spacing (padding inside items)
4447
4564
  spacing: z.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
4448
4565
  // Border radius (null = inherit from theme.corners)
@@ -4469,8 +4586,16 @@ var init_types7 = __esm({
4469
4586
  // Trigger (question) styling
4470
4587
  trigger: z.object({
4471
4588
  textColorToken: themeColorTokenSchema,
4472
- fontWeight: z.enum(["regular", "medium", "semibold", "bold"]).nullable()
4589
+ fontWeight: z.enum(["regular", "medium", "semibold", "bold"]).nullable(),
4473
4590
  // null = inherit from theme
4591
+ // Question typography. Defaults keep the historical body-font look; set
4592
+ // fontFamily 'heading' + a larger scale to give questions real presence.
4593
+ fontFamily: z.enum(["body", "heading"]).optional(),
4594
+ // default 'body'
4595
+ fontScale: z.enum(["body", "md", "lg"]).optional(),
4596
+ // default 'body'
4597
+ letterSpacing: z.enum(["normal", "tight", "wide"]).optional(),
4598
+ textTransform: z.enum(["none", "uppercase"]).optional()
4474
4599
  }),
4475
4600
  // Hover state styling
4476
4601
  hover: z.object({
@@ -4478,6 +4603,17 @@ var init_types7 = __esm({
4478
4603
  textColorToken: themeColorTokenSchema.optional(),
4479
4604
  borderColorToken: themeColorTokenSchema.optional()
4480
4605
  }),
4606
+ // Open-state emphasis: how an expanded item is visually rewarded. All
4607
+ // optional; omit for the historical "only the text recolors" behaviour.
4608
+ openState: z.object({
4609
+ backgroundColorToken: themeColorTokenSchema.optional(),
4610
+ triggerColorToken: themeColorTokenSchema.optional(),
4611
+ accent: z.object({
4612
+ edge: z.enum(["left", "top", "bottom"]),
4613
+ colorToken: themeColorTokenSchema,
4614
+ thickness: z.enum(["thin", "medium", "thick"])
4615
+ }).optional()
4616
+ }).optional(),
4481
4617
  // Content (answer) styling
4482
4618
  content: z.object({
4483
4619
  textColorToken: themeColorTokenSchema
@@ -4826,6 +4962,125 @@ var init_shared = __esm({
4826
4962
  init_componentStyles();
4827
4963
  }
4828
4964
  });
4965
+ var logoTextConfidenceValues, logoAssetShapeValues, logoKindValues, logoDensityValues, logoContainsTextSchema, logoAnalysisSourceSchema, brandDisplayModeValues, logoAccommodationPatternValues, logoSizePolicyValues;
4966
+ var init_logoBranding = __esm({
4967
+ "../theme-core/src/site-styles/logoBranding.ts"() {
4968
+ init_types2();
4969
+ logoTextConfidenceValues = ["low", "medium", "high"];
4970
+ logoAssetShapeValues = [
4971
+ "none",
4972
+ "horizontal",
4973
+ "square",
4974
+ "portrait",
4975
+ "tall"
4976
+ ];
4977
+ logoKindValues = [
4978
+ "mark",
4979
+ "wordmark",
4980
+ "lockup",
4981
+ "badge",
4982
+ "stacked-wordmark",
4983
+ "unknown"
4984
+ ];
4985
+ logoDensityValues = ["simple", "detailed", "unknown"];
4986
+ logoContainsTextSchema = z.discriminatedUnion("kind", [
4987
+ z.object({
4988
+ kind: z.literal("contains-text"),
4989
+ confidence: z.enum(logoTextConfidenceValues),
4990
+ text: z.string().trim().min(1).max(200).optional()
4991
+ }),
4992
+ z.object({
4993
+ kind: z.literal("no-text"),
4994
+ confidence: z.enum(logoTextConfidenceValues)
4995
+ }),
4996
+ z.object({
4997
+ kind: z.literal("unknown"),
4998
+ reason: z.enum([
4999
+ "analysis-unavailable",
5000
+ "unsupported-file",
5001
+ "low-confidence"
5002
+ ])
5003
+ })
5004
+ ]);
5005
+ logoAnalysisSourceSchema = z.discriminatedUnion("kind", [
5006
+ z.object({ kind: z.literal("none") }),
5007
+ z.object({
5008
+ kind: z.literal("deterministic"),
5009
+ reason: z.enum(["dimensions", "fallback"])
5010
+ }),
5011
+ z.object({
5012
+ kind: z.literal("llm"),
5013
+ model: z.literal("gpt-5.4-mini"),
5014
+ analyzedAt: z.string().trim().min(1).max(80).optional()
5015
+ }),
5016
+ z.object({ kind: z.literal("manual-override") })
5017
+ ]);
5018
+ z.object({
5019
+ shape: z.enum(logoAssetShapeValues),
5020
+ containsText: logoContainsTextSchema,
5021
+ kind: z.enum(logoKindValues),
5022
+ density: z.enum(logoDensityValues),
5023
+ source: logoAnalysisSourceSchema
5024
+ });
5025
+ brandDisplayModeValues = [
5026
+ "auto",
5027
+ "logo-only",
5028
+ "logo-plus-title",
5029
+ "title-only"
5030
+ ];
5031
+ logoAccommodationPatternValues = [
5032
+ "title-only",
5033
+ "inline-logo-only",
5034
+ "inline-wordmark",
5035
+ "inline-mark-with-title",
5036
+ "logo-plate",
5037
+ "centered-badge",
5038
+ "popout-badge",
5039
+ "centered-masthead",
5040
+ "hero-badge"
5041
+ ];
5042
+ logoSizePolicyValues = [
5043
+ "auto",
5044
+ "compact",
5045
+ "standard",
5046
+ "generous",
5047
+ "display"
5048
+ ];
5049
+ }
5050
+ });
5051
+
5052
+ // ../theme-core/src/site-styles/rawStyleFields.ts
5053
+ var themeV2RuntimeStyleFieldNames, themeV2BlockSpecificRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNames, pageDesignEditorBackgroundOverrideOwner;
5054
+ var init_rawStyleFields = __esm({
5055
+ "../theme-core/src/site-styles/rawStyleFields.ts"() {
5056
+ themeV2RuntimeStyleFieldNames = [
5057
+ "_frameStyles",
5058
+ "_sectionStyles",
5059
+ "_containerStyles",
5060
+ "_cardStyles",
5061
+ // styleGroup is legacy runtime transition wiring rather than a nested
5062
+ // override object, but normal editors should still never see it directly.
5063
+ "styleGroup"
5064
+ ];
5065
+ themeV2BlockSpecificRawStyleFieldNames = [
5066
+ "_contentCardStyles",
5067
+ "_heroLayoutStyles",
5068
+ "_textCardStyles"
5069
+ ];
5070
+ themeV2NormalEditorRawStyleFieldNames = [
5071
+ ...themeV2RuntimeStyleFieldNames,
5072
+ ...themeV2BlockSpecificRawStyleFieldNames
5073
+ ];
5074
+ new Set(
5075
+ themeV2NormalEditorRawStyleFieldNames
5076
+ );
5077
+ [
5078
+ ...themeV2RuntimeStyleFieldNames,
5079
+ ...themeV2BlockSpecificRawStyleFieldNames
5080
+ ];
5081
+ pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
5082
+ }
5083
+ });
4829
5084
 
4830
5085
  // ../theme-core/src/utils/colorStyles.ts
4831
5086
  function parseToken(source) {
@@ -4955,7 +5210,7 @@ var init_tokenOrColor = __esm({
4955
5210
  ]);
4956
5211
  }
4957
5212
  });
4958
- var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema;
5213
+ var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, testimonialQuoteTreatmentSchema, themeSchema;
4959
5214
  var init_schema3 = __esm({
4960
5215
  "../theme-core/src/schema.ts"() {
4961
5216
  init_media();
@@ -4969,6 +5224,8 @@ var init_schema3 = __esm({
4969
5224
  init_atRuleValidation();
4970
5225
  init_shared();
4971
5226
  init_types2();
5227
+ init_logoBranding();
5228
+ init_rawStyleFields();
4972
5229
  init_themeColorTokens();
4973
5230
  init_tokenOrColor();
4974
5231
  axesSchema = z.object({
@@ -5055,8 +5312,10 @@ var init_schema3 = __esm({
5055
5312
  });
5056
5313
  boxBackgroundSchema = z.object({
5057
5314
  type: z.enum(["color", "gradient", "image"]).optional(),
5315
+ contentOwner: z.literal(pageDesignEditorBackgroundOverrideOwner).optional(),
5058
5316
  color: tokenOrCssColorValueSchema.nullable().optional(),
5059
5317
  gradient: z.string().nullable().optional(),
5318
+ gradientPresetId: z.string().min(1).nullable().optional(),
5060
5319
  image: mediaSchema.nullable().optional(),
5061
5320
  objectFit: z.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
5062
5321
  scale: z.string().nullable().optional(),
@@ -5068,18 +5327,22 @@ var init_schema3 = __esm({
5068
5327
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
5069
5328
  });
5070
5329
  noHeadingDecorationSchema = z.object({
5071
- family: z.literal("none"),
5072
- placement: z.literal("none")
5330
+ family: z.literal("none")
5073
5331
  });
5074
5332
  visibleHeadingDecorationSchema = z.object({
5075
5333
  family: z.enum(visibleHeadingDecorationFamilyValues),
5076
- placement: z.enum(visibleHeadingDecorationPlacementValues),
5077
5334
  colorToken: z.enum(headingDecorationColorTokenValues).optional()
5078
5335
  });
5079
5336
  headingDecorationSchema = z.union([
5080
5337
  noHeadingDecorationSchema,
5081
5338
  visibleHeadingDecorationSchema
5082
5339
  ]);
5340
+ headingDecorationOverrideSchema = z.union([
5341
+ z.enum(headingDecorationOverrideValues),
5342
+ // Legacy authoring value from the earlier model. In the render-time model
5343
+ // "on" cannot force a fragment into a block, so it is equivalent to default.
5344
+ z.literal("on").transform(() => "site-default")
5345
+ ]);
5083
5346
  accordionIconTreatmentSchema = z.object({
5084
5347
  iconSet: z.enum(accordionIconSetValues),
5085
5348
  colorToken: z.enum(accordionIconColorTokenValues),
@@ -5094,9 +5357,11 @@ var init_schema3 = __esm({
5094
5357
  eventListTreatment: z.enum(eventListTreatmentValues).nullable().optional(),
5095
5358
  eyebrowTreatment: z.enum(eyebrowTreatmentValues).nullable().optional(),
5096
5359
  headingDecoration: headingDecorationSchema.nullable().optional(),
5097
- // Author-level override consumed by later block/editor rendering phases.
5098
- // Keeping it in section styles lets existing block save APIs persist it.
5099
- headingDecorationOverride: z.enum(headingDecorationOverrideValues).nullable().optional(),
5360
+ // Author-level opt-out consumed by render-time theme projection. Persisted
5361
+ // content may also carry legacy `headingDecoration` / `on` values; those are
5362
+ // tolerated at the schema boundary but the renderer treats the compiled theme
5363
+ // as the only source of the resolved signature.
5364
+ headingDecorationOverride: headingDecorationOverrideSchema.nullable().optional(),
5100
5365
  accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
5101
5366
  });
5102
5367
  containerStylesOverrideSchema = z.object({
@@ -5117,7 +5382,16 @@ var init_schema3 = __esm({
5117
5382
  spacing: semanticSpacingSchema.nullable().optional(),
5118
5383
  raised: z.boolean().nullable().optional(),
5119
5384
  rounded: boxRoundedSchema.nullable().optional(),
5120
- treatment: z.enum(["accent-quote"]).nullable().optional()
5385
+ treatment: z.enum([
5386
+ "accent-quote",
5387
+ "editorial-rule",
5388
+ "soft-panel",
5389
+ "editorial-serif-quote",
5390
+ "editorial-open"
5391
+ ]).nullable().optional(),
5392
+ // Which site-style card variant the card adopts (emits a `.card-{id}` class).
5393
+ // 'none' is boxless. Driven by the block look via testimonialCardTreatment.
5394
+ cardVariant: boxStylesCardVariantSchema.nullable().optional()
5121
5395
  });
5122
5396
  blockStyleOverridesSchema = z.object({
5123
5397
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -5217,7 +5491,10 @@ var init_schema3 = __esm({
5217
5491
  logoStyleSchema = z.object({
5218
5492
  fontFamily: z.enum(["heading", "body"]).default("heading"),
5219
5493
  letterSpacing: z.enum(["normal", "wide", "wider", "widest"]).default("normal"),
5220
- gradient: z.boolean().default(false)
5494
+ gradient: z.boolean().default(false),
5495
+ brandDisplay: z.enum(brandDisplayModeValues).optional(),
5496
+ size: z.enum(logoSizePolicyValues).optional(),
5497
+ accommodation: z.enum(logoAccommodationPatternValues).optional()
5221
5498
  }).optional();
5222
5499
  headerLogoTextSchema = z.object({
5223
5500
  mobileWrapLines: z.union([z.literal(1), z.literal(2)]).optional(),
@@ -5456,6 +5733,13 @@ var init_schema3 = __esm({
5456
5733
  hero: z.string().min(1).nullable().optional(),
5457
5734
  background: z.string().min(1).nullable().optional()
5458
5735
  });
5736
+ testimonialQuoteTreatmentSchema = z.object({
5737
+ style: z.enum(["serif-display", "accent-glyph", "none"]),
5738
+ fontFamily: z.enum(["heading", "body"]).optional(),
5739
+ scale: z.enum(["sm", "md", "lg", "xl"]).optional(),
5740
+ colorToken: themeColorTokenSchema.optional(),
5741
+ opacity: z.number().min(0).max(1).optional()
5742
+ });
5459
5743
  themeSchema = z.object({
5460
5744
  name: z.string().min(1).max(30),
5461
5745
  description: z.string().min(1).max(400),
@@ -5481,6 +5765,8 @@ var init_schema3 = __esm({
5481
5765
  // Card variant system (optional for backwards compatibility)
5482
5766
  accordions: accordionSystemSchema.optional(),
5483
5767
  // Accordion system (optional - generated if not provided)
5768
+ testimonialQuote: testimonialQuoteTreatmentSchema.optional(),
5769
+ // Testimonial quote-mark treatment (site-style-owned)
5484
5770
  inputs: inputSystemSchema.optional(),
5485
5771
  // Input system (optional - generated if not provided)
5486
5772
  inputStyle: inputStyle.optional(),
@@ -5497,6 +5783,10 @@ var init_schema3 = __esm({
5497
5783
  // Structured block-kind theme overrides (v1: typography prose-link style only)
5498
5784
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
5499
5785
  blockOverrides: z.record(z.string(), blockThemeOverrideSchema).optional(),
5786
+ // Site-wide heading decoration signature (family + colour). Set once per Look
5787
+ // and projected transiently onto eligible block headings at render time.
5788
+ // Alignment is inherited from the heading, so no placement is stored.
5789
+ headingDecoration: headingDecorationSchema.optional(),
5500
5790
  // Structured custom CSS rules
5501
5791
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
5502
5792
  customCssRules: customCssRulesSchema,
@@ -5763,7 +6053,7 @@ var init_high_contrast = __esm({
5763
6053
  });
5764
6054
 
5765
6055
  // ../theme-core/src/palette/variants/soft-natural.ts
5766
- var softNaturalSage, softNaturalStone, softNaturalWatercolor;
6056
+ var softNaturalSage, softNaturalStone, softNaturalWatercolor, softNaturalLilac;
5767
6057
  var init_soft_natural = __esm({
5768
6058
  "../theme-core/src/palette/variants/soft-natural.ts"() {
5769
6059
  init_types11();
@@ -5833,6 +6123,28 @@ var init_soft_natural = __esm({
5833
6123
  { name: "border", hex: "#d8c9a8" }
5834
6124
  ]
5835
6125
  });
6126
+ softNaturalLilac = definePaletteVariant({
6127
+ id: "soft-natural-lilac",
6128
+ name: "Soft Natural \u2014 Lilac",
6129
+ description: "Watercolour periwinkle-lilac primary with warm ivory grounds and a sage accent.",
6130
+ tags: { tone: "classic", energy: "calm", era: "organic" },
6131
+ mode: "light",
6132
+ colors: [
6133
+ { name: "primary", hex: "#5c68a8" },
6134
+ { name: "secondary", hex: "#8189ad" },
6135
+ { name: "accent", hex: "#75835a" },
6136
+ { name: "success", hex: "#5f7d62" },
6137
+ { name: "warning", hex: "#a8884f" },
6138
+ { name: "destructive", hex: "#a3503e" },
6139
+ { name: "background", hex: "#faf9f6" },
6140
+ { name: "surface", hex: "#ffffff" },
6141
+ { name: "surfaceAlt", hex: "#f1f0f7" },
6142
+ { name: "muted", hex: "#e9e8f2" },
6143
+ { name: "text", hex: "#262633" },
6144
+ { name: "primaryForeground", hex: "#ffffff" },
6145
+ { name: "border", hex: "#d6d5e3" }
6146
+ ]
6147
+ });
5836
6148
  }
5837
6149
  });
5838
6150
 
@@ -5962,7 +6274,8 @@ var init_variants = __esm({
5962
6274
  // Soft-natural family
5963
6275
  softNaturalSage,
5964
6276
  softNaturalStone,
5965
- softNaturalWatercolor
6277
+ softNaturalWatercolor,
6278
+ softNaturalLilac
5966
6279
  ];
5967
6280
  paletteVariantsById = new Map(
5968
6281
  paletteVariants.map((v) => [v.id, v])
@@ -5971,9 +6284,185 @@ var init_variants = __esm({
5971
6284
  });
5972
6285
 
5973
6286
  // ../theme-core/src/accordions/siteStyleDefaults.ts
5974
- var softEarthAccordionSystem;
6287
+ var editorialDividedAccordionSystem, quietUnderlinedAccordionSystem, calmPanelAccordionSystem, boldBorderedAccordionSystem, warmInsetAccordionSystem, softEarthAccordionSystem;
5975
6288
  var init_siteStyleDefaults = __esm({
5976
6289
  "../theme-core/src/accordions/siteStyleDefaults.ts"() {
6290
+ editorialDividedAccordionSystem = {
6291
+ background: null,
6292
+ spacing: "comfortable",
6293
+ corners: "square",
6294
+ border: null,
6295
+ shadow: null,
6296
+ icon: {
6297
+ style: "plus-minus",
6298
+ position: "right",
6299
+ size: "md",
6300
+ colorToken: "primary"
6301
+ },
6302
+ trigger: {
6303
+ textColorToken: "text",
6304
+ fontWeight: "regular",
6305
+ fontFamily: "heading",
6306
+ fontScale: "lg"
6307
+ },
6308
+ hover: {
6309
+ textColorToken: "primary"
6310
+ },
6311
+ openState: {
6312
+ backgroundColorToken: "surfaceAlt",
6313
+ triggerColorToken: "primary",
6314
+ accent: {
6315
+ edge: "left",
6316
+ colorToken: "primary",
6317
+ thickness: "medium"
6318
+ }
6319
+ },
6320
+ content: {
6321
+ textColorToken: "neutral-700"
6322
+ }
6323
+ };
6324
+ quietUnderlinedAccordionSystem = {
6325
+ background: null,
6326
+ spacing: "spacious",
6327
+ corners: "square",
6328
+ border: null,
6329
+ shadow: null,
6330
+ icon: {
6331
+ style: "chevron",
6332
+ position: "right",
6333
+ size: "sm",
6334
+ colorToken: "muted"
6335
+ },
6336
+ trigger: {
6337
+ textColorToken: "text",
6338
+ fontWeight: "regular",
6339
+ fontFamily: "heading",
6340
+ fontScale: "lg"
6341
+ },
6342
+ hover: {
6343
+ textColorToken: "primary"
6344
+ },
6345
+ openState: {
6346
+ triggerColorToken: "primary"
6347
+ },
6348
+ content: {
6349
+ textColorToken: "neutral-700"
6350
+ }
6351
+ };
6352
+ calmPanelAccordionSystem = {
6353
+ background: {
6354
+ type: "solid",
6355
+ colorToken: "surface"
6356
+ },
6357
+ spacing: "comfortable",
6358
+ corners: "soft",
6359
+ border: {
6360
+ widthClass: "border",
6361
+ colorToken: "border"
6362
+ },
6363
+ shadow: {
6364
+ elevation: "low",
6365
+ softness: "soft",
6366
+ position: "bottom"
6367
+ },
6368
+ icon: {
6369
+ style: "chevron",
6370
+ position: "right",
6371
+ size: "md",
6372
+ colorToken: "primary"
6373
+ },
6374
+ trigger: {
6375
+ textColorToken: "text",
6376
+ fontWeight: "medium",
6377
+ fontFamily: "heading",
6378
+ fontScale: "md"
6379
+ },
6380
+ hover: {
6381
+ backgroundColorToken: "primary/5",
6382
+ textColorToken: "primary"
6383
+ },
6384
+ openState: {
6385
+ backgroundColorToken: "primary/5",
6386
+ triggerColorToken: "primary"
6387
+ },
6388
+ content: {
6389
+ textColorToken: "neutral-700"
6390
+ }
6391
+ };
6392
+ boldBorderedAccordionSystem = {
6393
+ background: {
6394
+ type: "solid",
6395
+ colorToken: "surface"
6396
+ },
6397
+ spacing: "comfortable",
6398
+ corners: "soft",
6399
+ border: {
6400
+ widthClass: "border-2",
6401
+ colorToken: "border"
6402
+ },
6403
+ shadow: null,
6404
+ icon: {
6405
+ style: "plus-minus",
6406
+ position: "right",
6407
+ size: "lg",
6408
+ colorToken: "primary"
6409
+ },
6410
+ trigger: {
6411
+ textColorToken: "text",
6412
+ fontWeight: "bold",
6413
+ fontFamily: "heading",
6414
+ fontScale: "md"
6415
+ },
6416
+ hover: {
6417
+ backgroundColorToken: "primary/10",
6418
+ textColorToken: "primary"
6419
+ },
6420
+ openState: {
6421
+ backgroundColorToken: "primary/10",
6422
+ triggerColorToken: "primary",
6423
+ accent: {
6424
+ edge: "left",
6425
+ colorToken: "primary",
6426
+ thickness: "thick"
6427
+ }
6428
+ },
6429
+ content: {
6430
+ textColorToken: "neutral-700"
6431
+ }
6432
+ };
6433
+ warmInsetAccordionSystem = {
6434
+ background: {
6435
+ type: "solid",
6436
+ colorToken: "surfaceAlt"
6437
+ },
6438
+ spacing: "comfortable",
6439
+ corners: "rounded",
6440
+ border: null,
6441
+ shadow: null,
6442
+ icon: {
6443
+ style: "circle-plus-minus",
6444
+ position: "right",
6445
+ size: "md",
6446
+ colorToken: "primary"
6447
+ },
6448
+ trigger: {
6449
+ textColorToken: "text",
6450
+ fontWeight: "semibold",
6451
+ fontFamily: "heading",
6452
+ fontScale: "md"
6453
+ },
6454
+ hover: {
6455
+ backgroundColorToken: "primary/5",
6456
+ textColorToken: "primary"
6457
+ },
6458
+ openState: {
6459
+ backgroundColorToken: "surface",
6460
+ triggerColorToken: "primary"
6461
+ },
6462
+ content: {
6463
+ textColorToken: "neutral-700"
6464
+ }
6465
+ };
5977
6466
  softEarthAccordionSystem = {
5978
6467
  background: {
5979
6468
  type: "solid",
@@ -5991,11 +6480,16 @@ var init_siteStyleDefaults = __esm({
5991
6480
  },
5992
6481
  trigger: {
5993
6482
  textColorToken: "text",
5994
- fontWeight: "medium"
6483
+ fontWeight: "medium",
6484
+ fontFamily: "heading",
6485
+ fontScale: "md"
5995
6486
  },
5996
6487
  hover: {
5997
6488
  textColorToken: "primary"
5998
6489
  },
6490
+ openState: {
6491
+ triggerColorToken: "primary"
6492
+ },
5999
6493
  content: {
6000
6494
  textColorToken: "neutral-700"
6001
6495
  }
@@ -6003,6 +6497,91 @@ var init_siteStyleDefaults = __esm({
6003
6497
  }
6004
6498
  });
6005
6499
 
6500
+ // ../theme-core/src/cards/siteStyleDefaults.ts
6501
+ var southWestCardSystem, clarityZenCardSystem;
6502
+ var init_siteStyleDefaults2 = __esm({
6503
+ "../theme-core/src/cards/siteStyleDefaults.ts"() {
6504
+ southWestCardSystem = {
6505
+ variants: [
6506
+ {
6507
+ id: "default",
6508
+ name: "Default",
6509
+ enabled: true,
6510
+ priority: 1,
6511
+ background: { type: "solid", colorToken: "surface" },
6512
+ foregroundToken: "text",
6513
+ spacing: "comfortable",
6514
+ corners: "soft",
6515
+ shadow: { elevation: "low", softness: "soft", position: "bottom" }
6516
+ },
6517
+ {
6518
+ id: "alternative",
6519
+ name: "Statement",
6520
+ enabled: true,
6521
+ priority: 2,
6522
+ background: { type: "solid", colorToken: "primary-700" },
6523
+ foregroundToken: "primaryForeground",
6524
+ spacing: "comfortable",
6525
+ // No shadow on the variant itself: the elevation comes from the look's
6526
+ // 'raised' item surface (rb-shadow-md = var(--shadow-md)), reproducing the
6527
+ // legacy accent-quote card's shadow exactly.
6528
+ shadow: { elevation: "none", softness: null, position: "bottom" },
6529
+ accentEdge: { edge: "left", colorToken: "secondary", width: "heavy" },
6530
+ cornerRadii: {
6531
+ topLeft: "square",
6532
+ topRight: "expressive",
6533
+ bottomLeft: "square",
6534
+ bottomRight: "square"
6535
+ }
6536
+ }
6537
+ ]
6538
+ };
6539
+ clarityZenCardSystem = {
6540
+ variants: [
6541
+ {
6542
+ id: "default",
6543
+ name: "Default",
6544
+ enabled: true,
6545
+ priority: 1,
6546
+ background: { type: "solid", colorToken: "surface" },
6547
+ // A filled card establishes its own text colour so it stays legible on a
6548
+ // coloured section band (which sets a contrasting section-text colour).
6549
+ foregroundToken: "text",
6550
+ spacing: "comfortable",
6551
+ corners: "rounded",
6552
+ shadow: { elevation: "low", softness: "soft", position: "bottom" }
6553
+ },
6554
+ {
6555
+ id: "alternative",
6556
+ name: "Statement",
6557
+ enabled: true,
6558
+ priority: 2,
6559
+ // Themed surfaceAlt tint + a touch more elevation so an emphasised
6560
+ // section reads as a deliberate "statement" against the default card.
6561
+ background: { type: "solid", colorToken: "surfaceAlt" },
6562
+ foregroundToken: "text",
6563
+ spacing: "comfortable",
6564
+ corners: "rounded",
6565
+ shadow: { elevation: "medium", softness: "soft", position: "bottom" }
6566
+ }
6567
+ ]
6568
+ };
6569
+ }
6570
+ });
6571
+
6572
+ // ../theme-core/src/site-styles/testimonialQuotePresets.ts
6573
+ var serifDisplayQuote, accentGlyphQuote;
6574
+ var init_testimonialQuotePresets = __esm({
6575
+ "../theme-core/src/site-styles/testimonialQuotePresets.ts"() {
6576
+ serifDisplayQuote = {
6577
+ style: "serif-display"
6578
+ };
6579
+ accentGlyphQuote = {
6580
+ style: "accent-glyph"
6581
+ };
6582
+ }
6583
+ });
6584
+
6006
6585
  // ../theme-core/src/site-styles/customizableSurfaces.ts
6007
6586
  var init_customizableSurfaces = __esm({
6008
6587
  "../theme-core/src/site-styles/customizableSurfaces.ts"() {
@@ -6329,12 +6908,96 @@ function headerConfigurationKey(configuration) {
6329
6908
  function findHeaderLook(id) {
6330
6909
  return headerLooksById.get(id);
6331
6910
  }
6332
- var headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, headerLooksById;
6911
+ var titleOnlyLogoAccommodation, inlineWordmarkLogoAccommodation, inlineMarkWithTitleLogoAccommodation, logoPlateAccommodation, centeredBadgeAccommodation, popoutBadgeAccommodation, centeredMastheadAccommodation, unbackedOverlayLogoAccommodation, inlineClassicLogoAccommodations, centeredLogoAccommodations, overlayLogoAccommodations, headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, headerLooksById;
6333
6912
  var init_headerLooks = __esm({
6334
6913
  "../theme-core/src/site-styles/headerLooks.ts"() {
6335
6914
  init_headerCtaVariants();
6336
6915
  init_customizableSurfaces();
6916
+ init_logoBranding();
6337
6917
  init_types2();
6918
+ titleOnlyLogoAccommodation = {
6919
+ pattern: "title-only",
6920
+ supportedShapes: ["none", "horizontal", "square", "portrait", "tall"],
6921
+ supportedTextPresence: ["contains-text", "no-text", "unknown"],
6922
+ supportedDisplayModes: ["title-only"],
6923
+ size: "compact"
6924
+ };
6925
+ inlineWordmarkLogoAccommodation = {
6926
+ pattern: "inline-wordmark",
6927
+ supportedShapes: ["horizontal"],
6928
+ supportedTextPresence: ["contains-text", "no-text", "unknown"],
6929
+ supportedDisplayModes: ["logo-only"],
6930
+ size: "standard",
6931
+ maxDensity: "detailed"
6932
+ };
6933
+ inlineMarkWithTitleLogoAccommodation = {
6934
+ pattern: "inline-mark-with-title",
6935
+ supportedShapes: ["horizontal", "square", "portrait", "tall"],
6936
+ supportedTextPresence: ["no-text"],
6937
+ supportedDisplayModes: ["logo-plus-title"],
6938
+ size: "compact",
6939
+ maxDensity: "simple"
6940
+ };
6941
+ logoPlateAccommodation = {
6942
+ pattern: "logo-plate",
6943
+ supportedShapes: ["square", "portrait", "tall"],
6944
+ supportedTextPresence: ["contains-text", "unknown"],
6945
+ supportedDisplayModes: ["logo-only"],
6946
+ size: "display",
6947
+ providesBacking: true
6948
+ };
6949
+ centeredBadgeAccommodation = {
6950
+ pattern: "centered-badge",
6951
+ supportedShapes: ["square", "portrait", "tall"],
6952
+ supportedTextPresence: ["contains-text", "unknown"],
6953
+ supportedDisplayModes: ["logo-only"],
6954
+ size: "display",
6955
+ providesBacking: true
6956
+ };
6957
+ popoutBadgeAccommodation = {
6958
+ pattern: "popout-badge",
6959
+ supportedShapes: ["square", "portrait", "tall"],
6960
+ supportedTextPresence: ["contains-text", "unknown"],
6961
+ supportedDisplayModes: ["logo-only"],
6962
+ size: "display",
6963
+ providesBacking: true
6964
+ };
6965
+ centeredMastheadAccommodation = {
6966
+ pattern: "centered-masthead",
6967
+ supportedShapes: ["square", "portrait", "tall"],
6968
+ supportedTextPresence: ["contains-text", "unknown"],
6969
+ supportedDisplayModes: ["logo-only"],
6970
+ size: "display",
6971
+ providesBacking: true
6972
+ };
6973
+ unbackedOverlayLogoAccommodation = {
6974
+ pattern: "inline-logo-only",
6975
+ supportedShapes: ["square"],
6976
+ supportedTextPresence: ["contains-text", "unknown"],
6977
+ supportedDisplayModes: ["logo-only"],
6978
+ size: "compact",
6979
+ providesBacking: false
6980
+ };
6981
+ inlineClassicLogoAccommodations = [
6982
+ titleOnlyLogoAccommodation,
6983
+ inlineWordmarkLogoAccommodation,
6984
+ inlineMarkWithTitleLogoAccommodation,
6985
+ popoutBadgeAccommodation,
6986
+ logoPlateAccommodation
6987
+ ];
6988
+ centeredLogoAccommodations = [
6989
+ titleOnlyLogoAccommodation,
6990
+ inlineWordmarkLogoAccommodation,
6991
+ inlineMarkWithTitleLogoAccommodation,
6992
+ centeredMastheadAccommodation,
6993
+ centeredBadgeAccommodation
6994
+ ];
6995
+ overlayLogoAccommodations = [
6996
+ titleOnlyLogoAccommodation,
6997
+ inlineWordmarkLogoAccommodation,
6998
+ inlineMarkWithTitleLogoAccommodation,
6999
+ unbackedOverlayLogoAccommodation
7000
+ ];
6338
7001
  headerLayoutCatalog = [
6339
7002
  {
6340
7003
  id: asHeaderLayoutId("classic"),
@@ -6704,6 +7367,7 @@ var init_headerLooks = __esm({
6704
7367
  behavior: "sticky"
6705
7368
  },
6706
7369
  openingRequirement: "none",
7370
+ logoAccommodations: inlineClassicLogoAccommodations,
6707
7371
  compile: cleanBaseHeader
6708
7372
  },
6709
7373
  {
@@ -6717,6 +7381,7 @@ var init_headerLooks = __esm({
6717
7381
  behavior: "sticky-shrink"
6718
7382
  },
6719
7383
  openingRequirement: "none",
7384
+ logoAccommodations: inlineClassicLogoAccommodations,
6720
7385
  compile: solidBrandHeader
6721
7386
  },
6722
7387
  {
@@ -6731,6 +7396,7 @@ var init_headerLooks = __esm({
6731
7396
  },
6732
7397
  openingRequirement: "none",
6733
7398
  maxRecommendedNavItems: 6,
7399
+ logoAccommodations: centeredLogoAccommodations,
6734
7400
  compile: serifLineHeader
6735
7401
  },
6736
7402
  {
@@ -6745,7 +7411,7 @@ var init_headerLooks = __esm({
6745
7411
  },
6746
7412
  openingRequirement: "none",
6747
7413
  maxRecommendedNavItems: 5,
6748
- allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
7414
+ logoAccommodations: centeredLogoAccommodations,
6749
7415
  compile: centeredCalmHeader
6750
7416
  },
6751
7417
  {
@@ -6760,6 +7426,7 @@ var init_headerLooks = __esm({
6760
7426
  },
6761
7427
  openingRequirement: "none",
6762
7428
  requiresProminentCta: true,
7429
+ logoAccommodations: inlineClassicLogoAccommodations,
6763
7430
  compile: practicalUtilityHeader
6764
7431
  },
6765
7432
  {
@@ -6773,6 +7440,7 @@ var init_headerLooks = __esm({
6773
7440
  behavior: "normal-flow"
6774
7441
  },
6775
7442
  openingRequirement: "reserved-space-ok",
7443
+ logoAccommodations: inlineClassicLogoAccommodations,
6776
7444
  compile: minimalTransparentHeader
6777
7445
  },
6778
7446
  {
@@ -6787,7 +7455,7 @@ var init_headerLooks = __esm({
6787
7455
  },
6788
7456
  openingRequirement: "requires-image-hero-with-contrast-overlay",
6789
7457
  maxRecommendedNavItems: 5,
6790
- allowedLogoShapes: ["none", "text-only", "horizontal"],
7458
+ logoAccommodations: overlayLogoAccommodations,
6791
7459
  compile: transparentOverlayHeader
6792
7460
  },
6793
7461
  {
@@ -6802,7 +7470,7 @@ var init_headerLooks = __esm({
6802
7470
  },
6803
7471
  openingRequirement: "requires-image-hero-with-contrast-overlay",
6804
7472
  maxRecommendedNavItems: 5,
6805
- allowedLogoShapes: ["none", "text-only", "horizontal"],
7473
+ logoAccommodations: overlayLogoAccommodations,
6806
7474
  compile: floatingGlassHeader
6807
7475
  }
6808
7476
  ];
@@ -6880,6 +7548,94 @@ function brandTwoBandFooter(theme) {
6880
7548
  }
6881
7549
  };
6882
7550
  }
7551
+ function centeredCalmFooter(theme) {
7552
+ return {
7553
+ ...theme.footer,
7554
+ variant: "simple",
7555
+ maxWidth: "container",
7556
+ background: {
7557
+ type: "color",
7558
+ color: "surfaceAlt"
7559
+ },
7560
+ navStyle: "minimal",
7561
+ navWeight: "regular",
7562
+ navColor: "text",
7563
+ navLinkStyle: {
7564
+ typography: "body",
7565
+ fontWeight: "regular",
7566
+ textTransform: "none",
7567
+ italic: false,
7568
+ colorToken: "text",
7569
+ hoverColorToken: "primary",
7570
+ padding: "none",
7571
+ borderRadius: "none"
7572
+ },
7573
+ navLayout: {
7574
+ layout: "inline-wrap",
7575
+ align: "center",
7576
+ gapX: "relaxed",
7577
+ gapY: "tight"
7578
+ },
7579
+ logo: {
7580
+ showLogo: true,
7581
+ showLogoText: false,
7582
+ placement: "above",
7583
+ size: "sm",
7584
+ align: "center"
7585
+ },
7586
+ bottomBar: {
7587
+ enabled: true,
7588
+ fullBleed: false,
7589
+ textAlign: "center",
7590
+ paddingX: "default",
7591
+ paddingY: "compact",
7592
+ borderTop: {
7593
+ width: "thin"
7594
+ }
7595
+ }
7596
+ };
7597
+ }
7598
+ function editorialColumnsFooter(theme) {
7599
+ return {
7600
+ ...theme.footer,
7601
+ variant: "columns",
7602
+ maxWidth: "container",
7603
+ background: {
7604
+ type: "color",
7605
+ color: "surface"
7606
+ },
7607
+ navStyle: "minimal",
7608
+ navWeight: "regular",
7609
+ navColor: "text",
7610
+ navLinkStyle: {
7611
+ typography: "body",
7612
+ fontWeight: "regular",
7613
+ textTransform: "none",
7614
+ italic: false,
7615
+ colorToken: "text",
7616
+ hoverColorToken: "primary",
7617
+ padding: "none",
7618
+ borderRadius: "none"
7619
+ },
7620
+ logo: {
7621
+ showLogo: true,
7622
+ showLogoText: true,
7623
+ placement: "left",
7624
+ size: "sm",
7625
+ align: "start"
7626
+ },
7627
+ bottomBar: {
7628
+ enabled: true,
7629
+ fullBleed: false,
7630
+ textAlign: "center",
7631
+ paddingX: "default",
7632
+ paddingY: "compact",
7633
+ borderTop: {
7634
+ width: "thin"
7635
+ }
7636
+ }
7637
+ };
7638
+ }
6883
7639
  function findFooterLook(id) {
6884
7640
  return footerLooksById.get(id);
6885
7641
  }
@@ -6894,6 +7650,16 @@ var init_footerLooks = __esm({
6894
7650
  label: "Muted grounding footer",
6895
7651
  compile: mutedGroundingFooter
6896
7652
  },
7653
+ {
7654
+ id: asFooterLookId("footer-centered-calm"),
7655
+ label: "Centered calm footer",
7656
+ compile: centeredCalmFooter
7657
+ },
7658
+ {
7659
+ id: asFooterLookId("footer-editorial-columns"),
7660
+ label: "Editorial columns footer",
7661
+ compile: editorialColumnsFooter
7662
+ },
6897
7663
  {
6898
7664
  id: asFooterLookId("site-footer-brand-two-band"),
6899
7665
  label: "Two-band brand footer",
@@ -6935,7 +7701,7 @@ var init_sourceCatalogs = __esm({
6935
7701
  source: "generated",
6936
7702
  sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
6937
7703
  contentFrames: generatedContentFrames,
6938
- itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
7704
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised", "inset", "editorial"],
6939
7705
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
6940
7706
  emphases: ["low", "medium", "high"],
6941
7707
  detachedCustom: false
@@ -6944,11 +7710,7 @@ var init_sourceCatalogs = __esm({
6944
7710
  source: "user",
6945
7711
  sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
6946
7712
  contentFrames: userContentFrames,
6947
- itemSurfaces: [
6948
- ...generatedDesignOptionCatalog.itemSurfaces,
6949
- "inset",
6950
- "editorial"
6951
- ],
7713
+ itemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
6952
7714
  transitions: [
6953
7715
  ...generatedDesignOptionCatalog.transitions,
6954
7716
  "wave-edge",
@@ -7287,6 +8049,10 @@ function defineCuratedSiteStyle(input) {
7287
8049
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
7288
8050
  supportedTransitions: generatedDesignOptionCatalog.transitions
7289
8051
  },
8052
+ // Decoration is opt-in per style so it stays a distinguishing feature, not
8053
+ // wallpaper. Styles that want a mark set `headingDecoration` explicitly;
8054
+ // clean/minimal styles default to none.
8055
+ headingDecoration: input.headingDecoration ?? noHeadingDecoration,
7290
8056
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
7291
8057
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
7292
8058
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
@@ -7478,6 +8244,8 @@ var init_curatedSiteStyles = __esm({
7478
8244
  init_personalities();
7479
8245
  init_variants();
7480
8246
  init_siteStyleDefaults();
8247
+ init_siteStyleDefaults2();
8248
+ init_testimonialQuotePresets();
7481
8249
  init_headerLooks();
7482
8250
  init_footerLooks();
7483
8251
  init_curatedChoices();
@@ -7568,6 +8336,11 @@ var init_curatedSiteStyles = __esm({
7568
8336
  defineCuratedSiteStyle({
7569
8337
  id: "site-style:calm-studio",
7570
8338
  name: "Calm Studio",
8339
+ themeOverrides: {
8340
+ accordions: calmPanelAccordionSystem,
8341
+ testimonialQuote: serifDisplayQuote
8342
+ },
8343
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
7571
8344
  description: "Soft, measured, and spacious for intimate appointment or class businesses.",
7572
8345
  generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
7573
8346
  tokenRecipes: {
@@ -7601,6 +8374,10 @@ var init_curatedSiteStyles = __esm({
7601
8374
  defineCuratedSiteStyle({
7602
8375
  id: "site-style:clear-professional",
7603
8376
  name: "Clear Professional",
8377
+ themeOverrides: {
8378
+ accordions: calmPanelAccordionSystem,
8379
+ testimonialQuote: accentGlyphQuote
8380
+ },
7604
8381
  description: "Crisp, trustworthy, and direct for local services and consultancies.",
7605
8382
  generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
7606
8383
  tokenRecipes: {
@@ -7632,6 +8409,11 @@ var init_curatedSiteStyles = __esm({
7632
8409
  defineCuratedSiteStyle({
7633
8410
  id: "site-style:warm-editorial",
7634
8411
  name: "Warm Editorial",
8412
+ themeOverrides: {
8413
+ accordions: editorialDividedAccordionSystem,
8414
+ testimonialQuote: serifDisplayQuote
8415
+ },
8416
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
7635
8417
  description: "Story-led and textured for educators, makers, venues, and retreats.",
7636
8418
  generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
7637
8419
  tokenRecipes: {
@@ -7664,6 +8446,11 @@ var init_curatedSiteStyles = __esm({
7664
8446
  defineCuratedSiteStyle({
7665
8447
  id: "site-style:bright-community",
7666
8448
  name: "Bright Community",
8449
+ themeOverrides: {
8450
+ accordions: warmInsetAccordionSystem,
8451
+ testimonialQuote: accentGlyphQuote
8452
+ },
8453
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
7667
8454
  description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
7668
8455
  generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
7669
8456
  tokenRecipes: {
@@ -7695,6 +8482,10 @@ var init_curatedSiteStyles = __esm({
7695
8482
  defineCuratedSiteStyle({
7696
8483
  id: "site-style:quiet-luxury",
7697
8484
  name: "Quiet Luxury",
8485
+ themeOverrides: {
8486
+ accordions: quietUnderlinedAccordionSystem,
8487
+ testimonialQuote: serifDisplayQuote
8488
+ },
7698
8489
  description: "Minimal, confident, and refined for premium experiences and private services.",
7699
8490
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
7700
8491
  siteCreatorSelection: {
@@ -7737,6 +8528,10 @@ var init_curatedSiteStyles = __esm({
7737
8528
  defineCuratedSiteStyle({
7738
8529
  id: "site-style:practical-services",
7739
8530
  name: "Practical Services",
8531
+ themeOverrides: {
8532
+ accordions: boldBorderedAccordionSystem,
8533
+ testimonialQuote: accentGlyphQuote
8534
+ },
7740
8535
  description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
7741
8536
  generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
7742
8537
  siteCreatorSelection: { kind: "primary_goal_support" },
@@ -7777,6 +8572,11 @@ var init_curatedSiteStyles = __esm({
7777
8572
  defineCuratedSiteStyle({
7778
8573
  id: "site-style:modern-wellness",
7779
8574
  name: "Modern Wellness",
8575
+ themeOverrides: {
8576
+ accordions: quietUnderlinedAccordionSystem,
8577
+ testimonialQuote: serifDisplayQuote
8578
+ },
8579
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
7780
8580
  description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
7781
8581
  generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
7782
8582
  tokenRecipes: {
@@ -7808,6 +8608,10 @@ var init_curatedSiteStyles = __esm({
7808
8608
  defineCuratedSiteStyle({
7809
8609
  id: "site-style:quiet-practice",
7810
8610
  name: "Quiet Practice",
8611
+ themeOverrides: {
8612
+ accordions: quietUnderlinedAccordionSystem,
8613
+ testimonialQuote: serifDisplayQuote
8614
+ },
7811
8615
  description: "Grounded, calm, and practical for small appointment-first practices.",
7812
8616
  generationBrief: "Make services, practitioner trust, preparation notes, and booking routes easy to scan. Keep the tone warm and specific, with quiet confidence rather than spa cliches or medical claims.",
7813
8617
  siteCreatorSelection: {
@@ -7853,6 +8657,7 @@ var init_curatedSiteStyles = __esm({
7853
8657
  defineCuratedSiteStyle({
7854
8658
  id: "site-style:clarity-zen-blue",
7855
8659
  name: "Clarity Zen",
8660
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
7856
8661
  description: "Calm, editorial, and reassuring for therapy, counselling, and wellbeing support practices.",
7857
8662
  generationBrief: "Use a calm, soft palette, editorial serif headings, warm grounded copy, rounded cards, calm proof sections, and clear booking routes. Keep the tone compassionate and straightforward, with professional trust rather than hard-sell wellness language.",
7858
8663
  siteCreatorSelection: {
@@ -7876,17 +8681,22 @@ var init_curatedSiteStyles = __esm({
7876
8681
  },
7877
8682
  compositionBudget: balancedBudget,
7878
8683
  themeOverrides: {
8684
+ accordions: editorialDividedAccordionSystem,
8685
+ cards: clarityZenCardSystem,
8686
+ testimonialQuote: serifDisplayQuote,
7879
8687
  typography: {
7880
8688
  body: {
7881
- family: "Inter, system-ui, sans-serif",
8689
+ family: "Roboto, system-ui, sans-serif",
7882
8690
  size: "md",
7883
8691
  weight: "regular",
7884
8692
  lineHeight: "relaxed",
7885
8693
  letterSpacing: "normal"
7886
8694
  },
7887
8695
  headings: {
8696
+ // Forum ships a single 400 weight; keep every heading weight
8697
+ // 'regular' so the Google Fonts request stays valid.
7888
8698
  default: {
7889
- family: '"Cormorant Garamond", Georgia, serif',
8699
+ family: "Forum, Georgia, serif",
7890
8700
  weight: "regular",
7891
8701
  lineHeight: "normal",
7892
8702
  letterSpacing: "normal",
@@ -7902,7 +8712,7 @@ var init_curatedSiteStyles = __esm({
7902
8712
  italic: null
7903
8713
  },
7904
8714
  h2: {
7905
- size: "lg",
8715
+ size: "xl",
7906
8716
  weight: "regular",
7907
8717
  lineHeight: "normal",
7908
8718
  letterSpacing: "normal",
@@ -7930,10 +8740,13 @@ var init_curatedSiteStyles = __esm({
7930
8740
  },
7931
8741
  recommendedAppearancePresetIds: [
7932
8742
  "hero-split-editorial",
8743
+ "intro-portrait-bio",
7933
8744
  "intro-organic-statement",
7934
- "feature-cards-raised-rule",
8745
+ "feature-cards-soft-panels",
8746
+ "feature-cards-editorial-columns",
8747
+ "feature-cards-photo-tiles",
7935
8748
  "media-text-quiet-story",
7936
- "testimonials-brand-background-quotes",
8749
+ "testimonials-non-carded",
7937
8750
  "faq-contained-help",
7938
8751
  "contact-form-panel"
7939
8752
  ],
@@ -7943,8 +8756,9 @@ var init_curatedSiteStyles = __esm({
7943
8756
  "minimal-transparent"
7944
8757
  ],
7945
8758
  recommendedFooterLookIds: [
7946
- "footer-muted-grounding",
7947
- "site-footer-brand-two-band"
8759
+ "footer-centered-calm",
8760
+ "footer-editorial-columns",
8761
+ "footer-muted-grounding"
7948
8762
  ],
7949
8763
  buttonPersonalityChoices: [
7950
8764
  buttonChoice("soft-pill"),
@@ -7952,7 +8766,7 @@ var init_curatedSiteStyles = __esm({
7952
8766
  buttonChoice("editorial-link")
7953
8767
  ],
7954
8768
  paletteVariantChoices: [
7955
- paletteChoice("brand-led-cool"),
8769
+ paletteChoice("soft-natural-lilac"),
7956
8770
  paletteChoice("soft-natural-watercolor"),
7957
8771
  paletteChoice("soft-natural-stone"),
7958
8772
  paletteChoice("warm-neutral-cream")
@@ -7961,6 +8775,11 @@ var init_curatedSiteStyles = __esm({
7961
8775
  defineCuratedSiteStyle({
7962
8776
  id: "site-style:personal-retreat-journal",
7963
8777
  name: "Personal Retreat Journal",
8778
+ themeOverrides: {
8779
+ accordions: editorialDividedAccordionSystem,
8780
+ testimonialQuote: serifDisplayQuote
8781
+ },
8782
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
7964
8783
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
7965
8784
  generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
7966
8785
  siteCreatorSelection: {
@@ -8005,6 +8824,11 @@ var init_curatedSiteStyles = __esm({
8005
8824
  defineCuratedSiteStyle({
8006
8825
  id: "site-style:tactile-workshop",
8007
8826
  name: "Tactile Workshop",
8827
+ themeOverrides: {
8828
+ accordions: warmInsetAccordionSystem,
8829
+ testimonialQuote: accentGlyphQuote
8830
+ },
8831
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
8008
8832
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
8009
8833
  generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
8010
8834
  siteCreatorSelection: {
@@ -8055,6 +8879,7 @@ var init_curatedSiteStyles = __esm({
8055
8879
  defineCuratedSiteStyle({
8056
8880
  id: SOFT_EARTH_SITE_STYLE_ID,
8057
8881
  name: "Soft Earth",
8882
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
8058
8883
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
8059
8884
  generationBrief: "Use cream space, terracotta CTAs, olive quote bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community quotes, and an FAQ with a full-width intro above two columns of questions when content allows.",
8060
8885
  siteCreatorSelection: {
@@ -8127,7 +8952,8 @@ var init_curatedSiteStyles = __esm({
8127
8952
  headingSize: "editorial"
8128
8953
  }
8129
8954
  },
8130
- accordions: softEarthAccordionSystem
8955
+ accordions: softEarthAccordionSystem,
8956
+ testimonialQuote: accentGlyphQuote
8131
8957
  },
8132
8958
  defaultBlockVariants: {
8133
8959
  "block.faq": "question-columns"
@@ -8137,7 +8963,7 @@ var init_curatedSiteStyles = __esm({
8137
8963
  "intro-organic-statement",
8138
8964
  "feature-cards-raised-rule",
8139
8965
  "events-lined-panel",
8140
- "testimonials-brand-background-quotes",
8966
+ "testimonials-non-carded",
8141
8967
  "contact-form-panel"
8142
8968
  ],
8143
8969
  recommendedHeaderLookIds: [
@@ -8165,6 +8991,11 @@ var init_curatedSiteStyles = __esm({
8165
8991
  defineCuratedSiteStyle({
8166
8992
  id: "site-style:bold-launch",
8167
8993
  name: "Bold Launch",
8994
+ themeOverrides: {
8995
+ accordions: boldBorderedAccordionSystem,
8996
+ testimonialQuote: accentGlyphQuote
8997
+ },
8998
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
8168
8999
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
8169
9000
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
8170
9001
  siteCreatorSelection: {
@@ -8210,6 +9041,7 @@ var init_curatedSiteStyles = __esm({
8210
9041
  defineCuratedSiteStyle({
8211
9042
  id: "site-style:south-west-twerk-school",
8212
9043
  name: "South West Twerk School",
9044
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
8213
9045
  description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
8214
9046
  generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
8215
9047
  tokenRecipes: {
@@ -8229,6 +9061,9 @@ var init_curatedSiteStyles = __esm({
8229
9061
  ],
8230
9062
  defaultTypographyPresetId: "typography-preset:bold-display",
8231
9063
  themeOverrides: {
9064
+ accordions: boldBorderedAccordionSystem,
9065
+ cards: southWestCardSystem,
9066
+ testimonialQuote: accentGlyphQuote,
8232
9067
  bodyText: {
8233
9068
  intro: {
8234
9069
  paragraphSize: "editorial",
@@ -8241,7 +9076,7 @@ var init_curatedSiteStyles = __esm({
8241
9076
  "hero-brand-scrim-fixed-frame",
8242
9077
  "body-text-editorial-intro",
8243
9078
  "schedule-details-brand-depth",
8244
- "testimonials-accent-quote-cards",
9079
+ "testimonials-statement-cards",
8245
9080
  "contact-form-brand-depth-card"
8246
9081
  ],
8247
9082
  recommendedHeaderLookIds: [
@@ -8347,6 +9182,23 @@ var init_pageDesignEditorModel = __esm({
8347
9182
  }
8348
9183
  });
8349
9184
 
9185
+ // ../theme-core/src/tokens/tokens.ts
9186
+ var init_tokens = __esm({
9187
+ "../theme-core/src/tokens/tokens.ts"() {
9188
+ }
9189
+ });
9190
+
9191
+ // ../theme-core/src/tokens/index.ts
9192
+ var init_tokens2 = __esm({
9193
+ "../theme-core/src/tokens/index.ts"() {
9194
+ init_tokens();
9195
+ init_blockColorTokens();
9196
+ init_themeColorTokens();
9197
+ init_colorTokenParts();
9198
+ init_resolver();
9199
+ }
9200
+ });
9201
+
8350
9202
  // ../theme-core/src/site-styles/resolver.ts
8351
9203
  var init_resolver2 = __esm({
8352
9204
  "../theme-core/src/site-styles/resolver.ts"() {
@@ -8392,38 +9244,6 @@ var init_expandPalette = __esm({
8392
9244
  init_onColor();
8393
9245
  }
8394
9246
  });
8395
-
8396
- // ../theme-core/src/site-styles/rawStyleFields.ts
8397
- var themeV2RuntimeStyleFieldNames, themeV2BlockSpecificRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNames;
8398
- var init_rawStyleFields = __esm({
8399
- "../theme-core/src/site-styles/rawStyleFields.ts"() {
8400
- themeV2RuntimeStyleFieldNames = [
8401
- "_frameStyles",
8402
- "_sectionStyles",
8403
- "_containerStyles",
8404
- "_cardStyles",
8405
- // styleGroup is legacy runtime transition wiring rather than a nested
8406
- // override object, but normal editors should still never see it directly.
8407
- "styleGroup"
8408
- ];
8409
- themeV2BlockSpecificRawStyleFieldNames = [
8410
- "_contentCardStyles",
8411
- "_heroLayoutStyles",
8412
- "_textCardStyles"
8413
- ];
8414
- themeV2NormalEditorRawStyleFieldNames = [
8415
- ...themeV2RuntimeStyleFieldNames,
8416
- ...themeV2BlockSpecificRawStyleFieldNames
8417
- ];
8418
- new Set(
8419
- themeV2NormalEditorRawStyleFieldNames
8420
- );
8421
- [
8422
- ...themeV2RuntimeStyleFieldNames,
8423
- ...themeV2BlockSpecificRawStyleFieldNames
8424
- ];
8425
- }
8426
- });
8427
9247
  function uniqueNonEmpty(values) {
8428
9248
  const uniqueValues = [...new Set(values)];
8429
9249
  const firstValue = uniqueValues[0];
@@ -8589,6 +9409,16 @@ var init_runtimeCompiler = __esm({
8589
9409
  }
8590
9410
  });
8591
9411
 
9412
+ // ../theme-core/src/site-styles/siteStyleThemeCompiler.ts
9413
+ var init_siteStyleThemeCompiler = __esm({
9414
+ "../theme-core/src/site-styles/siteStyleThemeCompiler.ts"() {
9415
+ init_schema3();
9416
+ init_curatedSiteStyles();
9417
+ init_typographyPresets();
9418
+ init_runtimeCompiler();
9419
+ }
9420
+ });
9421
+
8592
9422
  // ../theme-core/src/site-styles/previewCustomization.ts
8593
9423
  var init_previewCustomization = __esm({
8594
9424
  "../theme-core/src/site-styles/previewCustomization.ts"() {
@@ -8600,6 +9430,8 @@ var init_previewCustomization = __esm({
8600
9430
  var init_previewCompiler = __esm({
8601
9431
  "../theme-core/src/site-styles/previewCompiler.ts"() {
8602
9432
  init_schema3();
9433
+ init_onColor();
9434
+ init_tokens2();
8603
9435
  init_personalities();
8604
9436
  init_variants();
8605
9437
  init_curatedChoices();
@@ -8610,6 +9442,8 @@ var init_previewCompiler = __esm({
8610
9442
  init_footerLooks();
8611
9443
  init_headerLooks();
8612
9444
  init_runtimeCompiler();
9445
+ init_rawStyleFields();
9446
+ init_siteStyleThemeCompiler();
8613
9447
  init_blockFlow();
8614
9448
  init_pageDesignEditorModel();
8615
9449
  init_pageDesignIntent();
@@ -8939,6 +9773,7 @@ var init_site_styles = __esm({
8939
9773
  init_headerLooks();
8940
9774
  init_headerOpeningSection();
8941
9775
  init_lookResolution();
9776
+ init_logoBranding();
8942
9777
  init_pageDesignAuthority();
8943
9778
  init_pageDesignEditorErrors();
8944
9779
  init_pageDesignEditorModel();
@@ -8949,6 +9784,7 @@ var init_site_styles = __esm({
8949
9784
  init_records();
8950
9785
  init_resolver2();
8951
9786
  init_runtimeCompiler();
9787
+ init_siteStyleThemeCompiler();
8952
9788
  init_siteStyleBlockPolicies();
8953
9789
  init_sourceCatalogs();
8954
9790
  init_styleTags();
@@ -9588,11 +10424,11 @@ function bind(from, options) {
9588
10424
  }
9589
10425
  });
9590
10426
  }
9591
- function when(path24, options) {
10427
+ function when(path25, options) {
9592
10428
  return (node) => ({
9593
10429
  ...node,
9594
10430
  $when: {
9595
- when: { from: path24 },
10431
+ when: { from: path25 },
9596
10432
  ...options?.equals !== void 0 ? { equals: options.equals } : {},
9597
10433
  ...options?.not ? { not: true } : {}
9598
10434
  }
@@ -9699,7 +10535,7 @@ var init_builder = __esm({
9699
10535
  });
9700
10536
 
9701
10537
  // ../blocks/src/system/node/fragments/backgroundLayer.ts
9702
- function backgroundLayer(path24, options = {}) {
10538
+ function backgroundLayer(path25, options = {}) {
9703
10539
  const {
9704
10540
  styleClassName = "background-style rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none",
9705
10541
  imageClassName,
@@ -9713,7 +10549,7 @@ function backgroundLayer(path24, options = {}) {
9713
10549
  className: styleClassName,
9714
10550
  style: {
9715
10551
  $bind: {
9716
- from: path24,
10552
+ from: path25,
9717
10553
  transforms: [
9718
10554
  {
9719
10555
  id: "background.resolveStyle",
@@ -9723,20 +10559,20 @@ function backgroundLayer(path24, options = {}) {
9723
10559
  }
9724
10560
  }
9725
10561
  });
9726
- const imageLayer = createBackgroundImageNode(path24, imageClassName, {
10562
+ const imageLayer = createBackgroundImageNode(path25, imageClassName, {
9727
10563
  loading: imageLoading,
9728
10564
  fetchPriority: imageFetchPriority
9729
10565
  });
9730
- const overlayLayer = createBackgroundOverlayNode(path24, overlayClassName);
10566
+ const overlayLayer = createBackgroundOverlayNode(path25, overlayClassName);
9731
10567
  return omitImageLayer ? [styleLayer, overlayLayer] : [styleLayer, imageLayer, overlayLayer];
9732
10568
  }
9733
- function createBackgroundImageNode(path24, baseClassName = "rb-absolute rb-z-neg-10", options = {}) {
9734
- const imagePath = `${path24}.image`;
10569
+ function createBackgroundImageNode(path25, baseClassName = "rb-absolute rb-z-neg-10", options = {}) {
10570
+ const imagePath = `${path25}.image`;
9735
10571
  return media(
9736
10572
  {
9737
10573
  className: {
9738
10574
  $bind: {
9739
- from: path24,
10575
+ from: path25,
9740
10576
  transforms: [
9741
10577
  {
9742
10578
  id: "background.resolveImageClassName",
@@ -9747,7 +10583,7 @@ function createBackgroundImageNode(path24, baseClassName = "rb-absolute rb-z-neg
9747
10583
  },
9748
10584
  style: {
9749
10585
  $bind: {
9750
- from: path24,
10586
+ from: path25,
9751
10587
  transforms: [{ id: "background.resolveImageStyle" }]
9752
10588
  }
9753
10589
  },
@@ -9759,8 +10595,8 @@ function createBackgroundImageNode(path24, baseClassName = "rb-absolute rb-z-neg
9759
10595
  bind(imagePath)
9760
10596
  );
9761
10597
  }
9762
- function createBackgroundOverlayNode(path24, className = "background-overlay rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none") {
9763
- const overlayPath = `${path24}.overlay`;
10598
+ function createBackgroundOverlayNode(path25, className = "background-overlay rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none") {
10599
+ const overlayPath = `${path25}.overlay`;
9764
10600
  return el("div", {
9765
10601
  className,
9766
10602
  style: {
@@ -10552,10 +11388,10 @@ var init_themeColorResolution = __esm({
10552
11388
  });
10553
11389
 
10554
11390
  // ../blocks/src/system/transforms/registry/boxStyles.ts
10555
- function readPath(source, path24) {
10556
- if (!source || !path24) return void 0;
10557
- if (!path24.includes(".")) return source[path24];
10558
- return path24.split(".").reduce((acc, segment) => {
11391
+ function readPath(source, path25) {
11392
+ if (!source || !path25) return void 0;
11393
+ if (!path25.includes(".")) return source[path25];
11394
+ return path25.split(".").reduce((acc, segment) => {
10559
11395
  if (acc && typeof acc === "object" && segment in acc) {
10560
11396
  return acc[segment];
10561
11397
  }
@@ -10591,13 +11427,14 @@ function isTileTreatment(value) {
10591
11427
  function isEventListTreatment(value) {
10592
11428
  return typeof value === "string" && eventListTreatmentSet.has(value);
10593
11429
  }
10594
- var spacingTransform, raisedTransform, roundedTransform, boxStylesCompositeTransform, boxStylesBorderColorTransform, fixedFrameScopeClass, tileTreatmentClassMap, tileTreatmentSet, eventListTreatmentClassMap, eventListTreatmentSet, sectionClassNameTransform, containerStylesResolveClassName, containerStylesResolveBoxClassName, sectionTextColorStyleTransform, sectionHeadingColorStyleTransform, sectionColorsStyleTransform, GAP_CLASS_MAP, GAP_VALUE_MAP, semanticGapTransform, semanticGapValueTransform, boxStylesTransforms;
11430
+ var spacingTransform, raisedTransform, roundedTransform, boxStylesCompositeTransform, cardVariantClassTransform, boxStylesBorderColorTransform, fixedFrameScopeClass, tileTreatmentClassMap, tileTreatmentSet, eventListTreatmentClassMap, eventListTreatmentSet, sectionClassNameTransform, containerStylesResolveClassName, containerStylesResolveBoxClassName, sectionTextColorStyleTransform, sectionHeadingColorStyleTransform, sectionColorsStyleTransform, GAP_CLASS_MAP, GAP_VALUE_MAP, semanticGapTransform, semanticGapValueTransform, boxStylesTransforms;
10595
11431
  var init_boxStyles2 = __esm({
10596
11432
  "../blocks/src/system/transforms/registry/boxStyles.ts"() {
10597
11433
  init_core3();
10598
11434
  init_spacing();
10599
11435
  init_site_styles();
10600
11436
  init_colorStyles();
11437
+ init_cards();
10601
11438
  init_blockColorTokens();
10602
11439
  init_themeColorResolution();
10603
11440
  spacingTransform = {
@@ -10725,6 +11562,18 @@ var init_boxStyles2 = __esm({
10725
11562
  }
10726
11563
  if (input.treatment === "accent-quote") {
10727
11564
  classes.push("rb-card-treatment-accent-quote");
11565
+ } else if (input.treatment === "editorial-rule") {
11566
+ classes.push("rb-card-treatment-editorial-rule");
11567
+ } else if (input.treatment === "soft-panel") {
11568
+ classes.push("rb-card-treatment-soft-panel");
11569
+ } else if (input.treatment === "editorial-serif-quote") {
11570
+ classes.push("rb-card-treatment-editorial-serif-quote");
11571
+ } else if (input.treatment === "editorial-open") {
11572
+ classes.push("rb-card-treatment-editorial-open");
11573
+ }
11574
+ const cardVariant = normalizeBoxStylesCardVariant(input.cardVariant);
11575
+ if (cardVariant && cardVariant !== "none") {
11576
+ classes.push(`card-${cardVariant}`);
10728
11577
  }
10729
11578
  if (hasFixedFrameBackgroundMotion(input)) {
10730
11579
  classes.push(fixedFrameScopeClass);
@@ -10732,6 +11581,19 @@ var init_boxStyles2 = __esm({
10732
11581
  return classes.join(" ").trim() || "";
10733
11582
  }
10734
11583
  };
11584
+ cardVariantClassTransform = {
11585
+ id: "boxStyles.cardVariantClass",
11586
+ kind: "string",
11587
+ summary: "Map a site-style card variant role to its card-{role} CSS class",
11588
+ run: (value, options) => {
11589
+ const baseClass = options?.baseClass?.trim() ?? "";
11590
+ const cardVariant = normalizeBoxStylesCardVariant(value);
11591
+ if (!cardVariant || cardVariant === "none") {
11592
+ return baseClass;
11593
+ }
11594
+ return baseClass ? `${baseClass} card-${cardVariant}` : `card-${cardVariant}`;
11595
+ }
11596
+ };
10735
11597
  boxStylesBorderColorTransform = {
10736
11598
  id: "boxStyles.borderColor",
10737
11599
  kind: "string",
@@ -11015,6 +11877,7 @@ var init_boxStyles2 = __esm({
11015
11877
  raisedTransform,
11016
11878
  roundedTransform,
11017
11879
  boxStylesCompositeTransform,
11880
+ cardVariantClassTransform,
11018
11881
  boxStylesBorderColorTransform,
11019
11882
  sectionClassNameTransform,
11020
11883
  containerStylesResolveClassName,
@@ -11326,28 +12189,39 @@ var init_sectionState = __esm({
11326
12189
  // ../blocks/src/system/node/fragments/headingDecoration.ts
11327
12190
  function headingDecoration({
11328
12191
  bindFrom = defaultBindFrom,
11329
- family,
11330
- placement,
11331
12192
  className
11332
- }) {
12193
+ } = {}) {
11333
12194
  return el(
11334
12195
  "div",
11335
- {
11336
- "aria-hidden": "true",
11337
- className: {
11338
- $bind: {
11339
- from: bindFrom,
11340
- transforms: [
11341
- {
11342
- id: "ui.headingDecorationClassName",
11343
- options: { baseClass: className, family }
11344
- }
11345
- ]
12196
+ // Full-width block row so the mark inherits the heading's alignment. The
12197
+ // heading stacks are flexbox; `text-align` positions inline content, not flex
12198
+ // items, so the inline-block mark must sit inside a stretched block for a
12199
+ // centred heading to centre it (and a left heading to keep it at the start).
12200
+ { "aria-hidden": "true", className: "rb-heading-decoration-row" },
12201
+ [
12202
+ el("div", {
12203
+ className: {
12204
+ $bind: {
12205
+ from: bindFrom,
12206
+ transforms: [
12207
+ {
12208
+ id: "ui.headingDecorationClassName",
12209
+ options: { baseClass: className }
12210
+ }
12211
+ ]
12212
+ }
11346
12213
  }
11347
- }
11348
- },
11349
- null,
11350
- when(`${bindFrom}.placement`, { equals: placement })
12214
+ })
12215
+ ],
12216
+ // Gate on the presence of `family`. The render-time theme projection omits
12217
+ // `headingDecoration` entirely for absent/none signatures, so the
12218
+ // dominant "no decoration" case is absent → falsy → not rendered. A presence
12219
+ // check (rather than `family !== 'none'`) is deliberate: `when`'s only
12220
+ // negation form would render on *absent* values, which would emit a stub on
12221
+ // every undecorated heading. The remaining edge — hand-authored content with
12222
+ // an explicit `{ family: 'none' }` — renders an aria-hidden `rb-hidden`
12223
+ // (display:none) stub with no visual or layout impact.
12224
+ when(`${bindFrom}.family`)
11351
12225
  );
11352
12226
  }
11353
12227
  var defaultBindFrom;
@@ -11573,27 +12447,27 @@ function scopePropValue(value, scope) {
11573
12447
  }
11574
12448
  return value;
11575
12449
  }
11576
- function scopeContentPath(path24, scope) {
12450
+ function scopeContentPath(path25, scope) {
11577
12451
  if (!scope || scope.length === 0) {
11578
- return path24;
12452
+ return path25;
11579
12453
  }
11580
- if (path24 === "content") {
12454
+ if (path25 === "content") {
11581
12455
  return `content.${scope}`;
11582
12456
  }
11583
- if (path24.startsWith("content.")) {
11584
- const remainder = path24.slice("content.".length);
12457
+ if (path25.startsWith("content.")) {
12458
+ const remainder = path25.slice("content.".length);
11585
12459
  return remainder.length > 0 ? `content.${scope}.${remainder}` : `content.${scope}`;
11586
12460
  }
11587
- if (path24.startsWith("content[")) {
11588
- return path24.replace(/^content/, `content.${scope}`);
12461
+ if (path25.startsWith("content[")) {
12462
+ return path25.replace(/^content/, `content.${scope}`);
11589
12463
  }
11590
- if (path24.startsWith("$root.")) {
11591
- return path24;
12464
+ if (path25.startsWith("$root.")) {
12465
+ return path25;
11592
12466
  }
11593
- if (path24.includes(".")) {
11594
- return path24;
12467
+ if (path25.includes(".")) {
12468
+ return path25;
11595
12469
  }
11596
- return `content.${scope}.${path24}`;
12470
+ return `content.${scope}.${path25}`;
11597
12471
  }
11598
12472
  var FRAGMENT_ID_PATTERN, FIELD_ID_PATTERN, dataLoaderSchema, fragmentDataSchema, fragmentConfigSchema, FragmentConfigError;
11599
12473
  var init_types13 = __esm({
@@ -12228,10 +13102,7 @@ var init_testimonialsHeading = __esm({
12228
13102
  when("content.heading"),
12229
13103
  bind("content.heading")
12230
13104
  ),
12231
- headingDecoration({
12232
- family: "short-center-rule",
12233
- placement: "under-centered-heading"
12234
- }),
13105
+ headingDecoration(),
12235
13106
  text(
12236
13107
  {
12237
13108
  as: "p",
@@ -12316,7 +13187,10 @@ function buildTestimonialCard(...mods) {
12316
13187
  {
12317
13188
  stylesFrom: "content._cardStyles",
12318
13189
  backgroundFrom: "content._cardStyles.background",
12319
- baseClassName: "card-default rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
13190
+ // The `.card-{id}` variant class comes from _cardStyles.cardVariant via
13191
+ // the boxStyles transform (driven by the look's testimonialCardTreatment),
13192
+ // so it is not hardcoded here.
13193
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
12320
13194
  },
12321
13195
  ...mods
12322
13196
  );
@@ -12380,6 +13254,17 @@ function buildGridLayout() {
12380
13254
  buildResponsiveGridCards()
12381
13255
  );
12382
13256
  }
13257
+ function buildHighlightLayout() {
13258
+ return el(
13259
+ "div",
13260
+ { className: "rb-mt-10 rb-testimonials-highlight rb-mx-auto rb-max-w-3xl" },
13261
+ [
13262
+ buildTestimonialCard(
13263
+ repeat("data.entries", "testimonial", { limit: 1 })
13264
+ )
13265
+ ]
13266
+ );
13267
+ }
12383
13268
  function buildGridCardsLayout(className) {
12384
13269
  return el(
12385
13270
  "div",
@@ -12959,7 +13844,44 @@ var init_blogFeaturedPost = __esm({
12959
13844
  });
12960
13845
 
12961
13846
  // ../blocks/src/system/fragments/library/faqHeading.ts
12962
- var faqHeadingFragment;
13847
+ function faqHeadingLayout(options = {}) {
13848
+ return stack(
13849
+ {
13850
+ gap: "sm",
13851
+ className: "rb-mx-auto rb-max-w-3xl rb-text-center rb-mb-4"
13852
+ },
13853
+ [
13854
+ text(
13855
+ {
13856
+ as: "p",
13857
+ // Color is theme-owned (see theme/blocks-static/hero.css .heading-eyebrow)
13858
+ className: eyebrowClassName("faq-eyebrow rb-eyebrow heading-eyebrow")
13859
+ },
13860
+ when("content.eyebrow"),
13861
+ bind("content.eyebrow")
13862
+ ),
13863
+ text(
13864
+ {
13865
+ as: "h2",
13866
+ // h2 now gets size/weight from theme typography CSS
13867
+ className: "faq-title"
13868
+ },
13869
+ when("content.title"),
13870
+ bind("content.title")
13871
+ ),
13872
+ ...options.decorated ? [headingDecoration()] : [],
13873
+ richText(
13874
+ {
13875
+ className: "faq-description rb-prose rb-mx-auto rb-max-w-none",
13876
+ style: textColorStyle("mutedText")
13877
+ },
13878
+ when("content.description"),
13879
+ bind("content.description")
13880
+ )
13881
+ ]
13882
+ );
13883
+ }
13884
+ var faqHeadingFragment, decoratedFaqHeadingLayout;
12963
13885
  var init_faqHeading = __esm({
12964
13886
  "../blocks/src/system/fragments/library/faqHeading.ts"() {
12965
13887
  init_types13();
@@ -12994,41 +13916,9 @@ var init_faqHeading = __esm({
12994
13916
  ui: { variant: "limited" }
12995
13917
  }
12996
13918
  ],
12997
- layout: stack(
12998
- {
12999
- gap: "sm",
13000
- className: "rb-mx-auto rb-max-w-3xl rb-text-center rb-mb-4"
13001
- },
13002
- [
13003
- text(
13004
- {
13005
- as: "p",
13006
- // Color is theme-owned (see theme/blocks-static/hero.css .heading-eyebrow)
13007
- className: eyebrowClassName("faq-eyebrow rb-eyebrow heading-eyebrow")
13008
- },
13009
- when("content.eyebrow"),
13010
- bind("content.eyebrow")
13011
- ),
13012
- text(
13013
- {
13014
- as: "h2",
13015
- // h2 now gets size/weight from theme typography CSS
13016
- className: "faq-title"
13017
- },
13018
- when("content.title"),
13019
- bind("content.title")
13020
- ),
13021
- richText(
13022
- {
13023
- className: "faq-description rb-prose rb-mx-auto rb-max-w-none",
13024
- style: textColorStyle("mutedText")
13025
- },
13026
- when("content.description"),
13027
- bind("content.description")
13028
- )
13029
- ]
13030
- )
13919
+ layout: faqHeadingLayout()
13031
13920
  });
13921
+ decoratedFaqHeadingLayout = faqHeadingLayout({ decorated: true });
13032
13922
  }
13033
13923
  });
13034
13924
 
@@ -13112,7 +14002,7 @@ var init_faqAccordion = __esm({
13112
14002
  });
13113
14003
 
13114
14004
  // ../blocks/src/system/fragments/library/card.ts
13115
- var cardFragment;
14005
+ var cardVariantOptions, cardFragment;
13116
14006
  var init_card = __esm({
13117
14007
  "../blocks/src/system/fragments/library/card.ts"() {
13118
14008
  init_types13();
@@ -13120,6 +14010,11 @@ var init_card = __esm({
13120
14010
  init_ctas();
13121
14011
  init_ctaRow();
13122
14012
  init_colorStyles();
14013
+ init_cards();
14014
+ cardVariantOptions = cardVariantRoleValues.map((value) => ({
14015
+ value,
14016
+ label: value === "default" ? "Default" : "Alternative"
14017
+ }));
13123
14018
  cardFragment = defineFragment({
13124
14019
  id: "card",
13125
14020
  title: "Card",
@@ -13176,11 +14071,7 @@ var init_card = __esm({
13176
14071
  description: "Choose a card style from your theme",
13177
14072
  required: false,
13178
14073
  defaultValue: "default",
13179
- options: [
13180
- { value: "default", label: "Default" },
13181
- { value: "variant1", label: "Variant 1" },
13182
- { value: "variant2", label: "Variant 2" }
13183
- ],
14074
+ options: cardVariantOptions,
13184
14075
  ui: { intent: "style" }
13185
14076
  }
13186
14077
  ],
@@ -13190,9 +14081,9 @@ var init_card = __esm({
13190
14081
  className: {
13191
14082
  $bind: {
13192
14083
  from: "variant",
13193
- fallback: "default"
13194
- },
13195
- $prepend: "card-"
14084
+ fallback: "default",
14085
+ transforms: [{ id: "boxStyles.cardVariantClass" }]
14086
+ }
13196
14087
  }
13197
14088
  },
13198
14089
  [
@@ -14436,8 +15327,8 @@ function decodeSuccess(value) {
14436
15327
  function decodeFailure(issues) {
14437
15328
  return { ok: false, issues };
14438
15329
  }
14439
- function zodIssuePath(path24) {
14440
- return path24.flatMap((segment) => {
15330
+ function zodIssuePath(path25) {
15331
+ return path25.flatMap((segment) => {
14441
15332
  if (typeof segment === "string" || typeof segment === "number") {
14442
15333
  return [segment];
14443
15334
  }
@@ -14642,66 +15533,66 @@ var init_media2 = __esm({
14642
15533
  "archive",
14643
15534
  "audio"
14644
15535
  ];
14645
- hotspotSchema2 = z41.object({
14646
- x: z41.number().min(0).max(1),
14647
- y: z41.number().min(0).max(1),
14648
- radius: z41.number().optional()
15536
+ hotspotSchema2 = z42.object({
15537
+ x: z42.number().min(0).max(1),
15538
+ y: z42.number().min(0).max(1),
15539
+ radius: z42.number().optional()
14649
15540
  });
14650
- rotationSchema2 = z41.union([z41.literal(0), z41.literal(90), z41.literal(180), z41.literal(270)]);
14651
- rectSchema2 = z41.tuple([z41.number(), z41.number(), z41.number(), z41.number()]);
14652
- aspectCropSchema2 = z41.object({
14653
- aspect: z41.preprocess((value) => value == null ? void 0 : value, z41.string().optional()),
14654
- rect: z41.preprocess((value) => value == null ? void 0 : value, rectSchema2.optional()),
14655
- hotspot: z41.preprocess((value) => value == null ? void 0 : value, hotspotSchema2.optional()),
14656
- rotation: z41.preprocess((value) => value == null ? void 0 : value, rotationSchema2.optional())
15541
+ rotationSchema2 = z42.union([z42.literal(0), z42.literal(90), z42.literal(180), z42.literal(270)]);
15542
+ rectSchema2 = z42.tuple([z42.number(), z42.number(), z42.number(), z42.number()]);
15543
+ aspectCropSchema2 = z42.object({
15544
+ aspect: z42.preprocess((value) => value == null ? void 0 : value, z42.string().optional()),
15545
+ rect: z42.preprocess((value) => value == null ? void 0 : value, rectSchema2.optional()),
15546
+ hotspot: z42.preprocess((value) => value == null ? void 0 : value, hotspotSchema2.optional()),
15547
+ rotation: z42.preprocess((value) => value == null ? void 0 : value, rotationSchema2.optional())
14657
15548
  });
14658
- transformSchema2 = z41.object({
14659
- aspectCrops: z41.preprocess((value) => {
15549
+ transformSchema2 = z42.object({
15550
+ aspectCrops: z42.preprocess((value) => {
14660
15551
  if (!value || typeof value !== "object" || Array.isArray(value)) {
14661
15552
  return void 0;
14662
15553
  }
14663
15554
  return value;
14664
- }, z41.record(z41.string(), aspectCropSchema2.catch({}))).optional(),
15555
+ }, z42.record(z42.string(), aspectCropSchema2.catch({}))).optional(),
14665
15556
  rect: rectSchema2.optional(),
14666
15557
  hotspot: hotspotSchema2.optional(),
14667
15558
  rotation: rotationSchema2.optional()
14668
15559
  });
14669
- mediaPosterSchema = z41.discriminatedUnion("tag", [
14670
- z41.object({
14671
- tag: z41.literal("storage"),
14672
- assetId: z41.string().optional(),
14673
- storageBucket: z41.string().min(1),
14674
- storagePath: z41.string().min(1)
15560
+ mediaPosterSchema = z42.discriminatedUnion("tag", [
15561
+ z42.object({
15562
+ tag: z42.literal("storage"),
15563
+ assetId: z42.string().optional(),
15564
+ storageBucket: z42.string().min(1),
15565
+ storagePath: z42.string().min(1)
14675
15566
  }),
14676
- z41.object({
14677
- tag: z41.literal("external-src"),
14678
- assetId: z41.string().optional(),
14679
- src: z41.string().url()
15567
+ z42.object({
15568
+ tag: z42.literal("external-src"),
15569
+ assetId: z42.string().optional(),
15570
+ src: z42.string().url()
14680
15571
  })
14681
15572
  ]);
14682
- mediaBaseSchema = z41.object({
14683
- purpose: z41.string().optional(),
14684
- placeholder: z41.boolean().default(true).optional(),
14685
- assetId: z41.string().optional(),
14686
- identifier: z41.string().optional(),
14687
- src: z41.string().optional(),
14688
- alt: z41.string().optional(),
14689
- filename: z41.string().optional(),
14690
- mimeType: z41.string().optional(),
14691
- width: z41.number().optional(),
14692
- height: z41.number().optional(),
14693
- storageBucket: z41.string().optional(),
14694
- storagePath: z41.string().optional(),
15573
+ mediaBaseSchema = z42.object({
15574
+ purpose: z42.string().optional(),
15575
+ placeholder: z42.boolean().default(true).optional(),
15576
+ assetId: z42.string().optional(),
15577
+ identifier: z42.string().optional(),
15578
+ src: z42.string().optional(),
15579
+ alt: z42.string().optional(),
15580
+ filename: z42.string().optional(),
15581
+ mimeType: z42.string().optional(),
15582
+ width: z42.number().optional(),
15583
+ height: z42.number().optional(),
15584
+ storageBucket: z42.string().optional(),
15585
+ storagePath: z42.string().optional(),
14695
15586
  poster: mediaPosterSchema.optional(),
14696
15587
  transform: transformSchema2.optional()
14697
15588
  });
14698
- imageMediaSchema = mediaBaseSchema.extend({ type: z41.literal("image") });
14699
- videoMediaSchema = mediaBaseSchema.extend({ type: z41.literal("video") });
14700
- audioMediaSchema = mediaBaseSchema.extend({ type: z41.literal("audio") });
14701
- documentMediaSchema = mediaBaseSchema.extend({ type: z41.literal("document") });
14702
- spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z41.literal("spreadsheet") });
14703
- archiveMediaSchema = mediaBaseSchema.extend({ type: z41.literal("archive") });
14704
- mediaSchema2 = z41.discriminatedUnion("type", [
15589
+ imageMediaSchema = mediaBaseSchema.extend({ type: z42.literal("image") });
15590
+ videoMediaSchema = mediaBaseSchema.extend({ type: z42.literal("video") });
15591
+ audioMediaSchema = mediaBaseSchema.extend({ type: z42.literal("audio") });
15592
+ documentMediaSchema = mediaBaseSchema.extend({ type: z42.literal("document") });
15593
+ spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z42.literal("spreadsheet") });
15594
+ archiveMediaSchema = mediaBaseSchema.extend({ type: z42.literal("archive") });
15595
+ mediaSchema2 = z42.discriminatedUnion("type", [
14705
15596
  imageMediaSchema,
14706
15597
  videoMediaSchema,
14707
15598
  audioMediaSchema,
@@ -14972,10 +15863,15 @@ var init_schemas2 = __esm({
14972
15863
  });
14973
15864
 
14974
15865
  // ../blocks/src/system/blocks/events/shared/fields.ts
14975
- var cardStylingFields, eventDisplayFields, emptyStateField, sectionHeaderFields, layoutField, columnsField;
15866
+ var cardVariantOptions2, cardStylingFields, eventDisplayFields, emptyStateField, sectionHeaderFields, layoutField, columnsField;
14976
15867
  var init_fields = __esm({
14977
15868
  "../blocks/src/system/blocks/events/shared/fields.ts"() {
14978
15869
  init_button();
15870
+ init_cards();
15871
+ cardVariantOptions2 = cardVariantRoleValues.map((value) => ({
15872
+ value,
15873
+ label: value === "default" ? "Default" : "Alternative"
15874
+ }));
14979
15875
  cardStylingFields = [
14980
15876
  {
14981
15877
  id: "cardVariant",
@@ -14985,11 +15881,7 @@ var init_fields = __esm({
14985
15881
  required: false,
14986
15882
  multiple: false,
14987
15883
  defaultValue: "default",
14988
- options: [
14989
- { value: "default", label: "Default" },
14990
- { value: "variant1", label: "Variant 1" },
14991
- { value: "variant2", label: "Variant 2" }
14992
- ],
15884
+ options: cardVariantOptions2,
14993
15885
  ui: { intent: "style" }
14994
15886
  },
14995
15887
  createButtonVariantField({
@@ -15820,16 +16712,21 @@ var init_shared4 = __esm({
15820
16712
  init_utils();
15821
16713
  }
15822
16714
  });
15823
- var cardVariantSchema2, cardOrientationSchema, eventBlockKindSchema, eventSurfaceScopeSchema, eventScheduleScopeSchema2, eventListingSourceSchema, eventListingDisplaySchema, eventListingHydrationSchema, eventListingRenderSchema, eventListingBlockRuntime;
16715
+ var legacyEventCardVariantSchema, eventCardVariantInputSchema, cardOrientationSchema, eventBlockKindSchema, eventSurfaceScopeSchema, eventScheduleScopeSchema2, eventListingSourceSchema, eventListingDisplaySchema, eventListingHydrationSchema, eventListingRenderSchema, eventListingBlockRuntime;
15824
16716
  var init_EventListing_interactive = __esm({
15825
16717
  "../blocks/src/system/runtime/nodes/events/EventListing.interactive.ts"() {
16718
+ init_cards();
15826
16719
  init_schemas2();
15827
16720
  init_shared2();
15828
16721
  init_islands();
15829
16722
  init_runtime();
15830
16723
  init_shared4();
15831
16724
  init_contract_schemas();
15832
- cardVariantSchema2 = z.enum(["default", "variant1", "variant2"]);
16725
+ legacyEventCardVariantSchema = z.enum(["variant1", "variant2"]);
16726
+ eventCardVariantInputSchema = z.union([
16727
+ cardVariantRoleSchema,
16728
+ legacyEventCardVariantSchema
16729
+ ]);
15833
16730
  cardOrientationSchema = z.enum(["vertical", "horizontal"]);
15834
16731
  eventBlockKindSchema = z.enum(eventBlockKindValues);
15835
16732
  eventSurfaceScopeSchema = z.enum(eventSurfaceScopeValues);
@@ -15845,7 +16742,7 @@ var init_EventListing_interactive = __esm({
15845
16742
  paginationMode: z.enum(["loadMore", "seeAllLink"]).optional(),
15846
16743
  seeAllUrl: z.string().optional(),
15847
16744
  loadMoreText: z.string().optional(),
15848
- cardVariant: cardVariantSchema2.optional(),
16745
+ cardVariant: eventCardVariantInputSchema.optional(),
15849
16746
  buttonVariant: eventButtonVariantSchema.optional(),
15850
16747
  buttonText: z.string().optional(),
15851
16748
  showVenue: z.boolean().optional(),
@@ -15873,7 +16770,7 @@ var init_EventListing_interactive = __esm({
15873
16770
  emptyMessage: z.string(),
15874
16771
  loadingMessage: z.string(),
15875
16772
  containerClass: z.string(),
15876
- cardVariant: cardVariantSchema2,
16773
+ cardVariant: cardVariantRoleSchema,
15877
16774
  buttonVariant: eventButtonVariantSchema,
15878
16775
  buttonText: z.string(),
15879
16776
  showVenue: z.boolean(),
@@ -15934,7 +16831,7 @@ var init_EventListing_interactive = __esm({
15934
16831
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled.",
15935
16832
  loadingMessage: "Loading events\u2026",
15936
16833
  containerClass: getContainerClass(layout, source.columns ?? "3"),
15937
- cardVariant: source.cardVariant ?? "default",
16834
+ cardVariant: normalizeCardVariantRole(source.cardVariant) ?? "default",
15938
16835
  buttonVariant: source.buttonVariant ?? "primary",
15939
16836
  buttonText: source.buttonText ?? "Book now",
15940
16837
  showVenue: source.showVenue ?? true,
@@ -17737,6 +18634,23 @@ var ENDPOINT_DEFINITIONS = {
17737
18634
  auth: "user",
17738
18635
  responseKind: "json"
17739
18636
  },
18637
+ getSdkDeploymentHealth: {
18638
+ path: "/sites/{siteId}/sdk-deployment/health",
18639
+ method: "GET",
18640
+ tags: ["site-{siteId}", "webhooks"],
18641
+ auth: "user",
18642
+ errors: [],
18643
+ responseKind: "json"
18644
+ },
18645
+ setupSdkDeploymentRevalidationWebhook: {
18646
+ path: "/sites/{siteId}/sdk-deployment/revalidation-webhook",
18647
+ method: "POST",
18648
+ tags: ["site-{siteId}", "webhooks"],
18649
+ auth: "user",
18650
+ errors: ["validation:invalid_input", "resource:conflict"],
18651
+ responseKind: "json",
18652
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
18653
+ },
17740
18654
  // API Keys (Site-scoped)
17741
18655
  listSiteApiKeys: {
17742
18656
  path: "/sites/{siteId}/api-keys",
@@ -23231,6 +24145,13 @@ var ENDPOINT_DEFINITIONS = {
23231
24145
  auth: "service",
23232
24146
  responseKind: "json"
23233
24147
  },
24148
+ sdkSetupRevalidationWebhook: {
24149
+ path: "/sdk/{siteId}/webhooks/revalidation/setup",
24150
+ method: "POST",
24151
+ auth: "service",
24152
+ responseKind: "json",
24153
+ errors: ["validation:invalid_input", "server:internal_error"]
24154
+ },
23234
24155
  // Customer portal
23235
24156
  portalGetProfile: {
23236
24157
  path: "/portal/me",
@@ -24197,11 +25118,11 @@ function validationContext(options = {}) {
24197
25118
  allowIncomplete: isDraft || (options.allowIncomplete ?? false)
24198
25119
  };
24199
25120
  }
24200
- function formatFieldPath(path24) {
24201
- return path24.map((segment) => String(segment)).join(".");
25121
+ function formatFieldPath(path25) {
25122
+ return path25.map((segment) => String(segment)).join(".");
24202
25123
  }
24203
- function toZodIssuePath(path24) {
24204
- return [...path24];
25124
+ function toZodIssuePath(path25) {
25125
+ return [...path25];
24205
25126
  }
24206
25127
  function fieldIssueToMessage(issue2) {
24207
25128
  switch (issue2.kind) {
@@ -24255,7 +25176,7 @@ function pluralize(label, count) {
24255
25176
  if (count === 1) return label;
24256
25177
  return label.endsWith("s") ? label : `${label}s`;
24257
25178
  }
24258
- function deriveFieldValidationPlan(field, path24 = [field.id]) {
25179
+ function deriveFieldValidationPlan(field, path25 = [field.id]) {
24259
25180
  const required = Boolean(field.required);
24260
25181
  switch (field.type) {
24261
25182
  case "text": {
@@ -24266,7 +25187,7 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
24266
25187
  });
24267
25188
  if (typeof field.ui?.min === "number") constraints2.push({ kind: "numberMin", minimum: field.ui.min });
24268
25189
  if (typeof field.ui?.max === "number") constraints2.push({ kind: "numberMax", maximum: field.ui.max });
24269
- return makePlan("number", "number", field, path24, required, constraints2);
25190
+ return makePlan("number", "number", field, path25, required, constraints2);
24270
25191
  }
24271
25192
  const constraints = commonConstraints(required, {
24272
25193
  kind: field.ui?.widget === "iconPicker" ? "blockIconValue" : "textType"
@@ -24275,7 +25196,7 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
24275
25196
  if (inputType === "tel") constraints.push({ kind: "phoneFormat" });
24276
25197
  if (field.ui?.pattern) constraints.push({ kind: "patternFormat", pattern: field.ui.pattern });
24277
25198
  if (typeof field.maxLength === "number") constraints.push({ kind: "maxLength", maximum: field.maxLength });
24278
- return makePlan("string", "string", field, path24, required, constraints);
25199
+ return makePlan("string", "string", field, path25, required, constraints);
24279
25200
  }
24280
25201
  case "number": {
24281
25202
  const constraints = commonConstraints(required, {
@@ -24283,34 +25204,34 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
24283
25204
  });
24284
25205
  if (typeof field.min === "number") constraints.push({ kind: "numberMin", minimum: field.min });
24285
25206
  if (typeof field.max === "number") constraints.push({ kind: "numberMax", maximum: field.max });
24286
- return makePlan("number", "number", field, path24, required, constraints);
25207
+ return makePlan("number", "number", field, path25, required, constraints);
24287
25208
  }
24288
25209
  case "slug": {
24289
25210
  const constraints = commonConstraints(required, { kind: "textType" }, { kind: "slugFormat" });
24290
25211
  if (typeof field.maxLength === "number") constraints.push({ kind: "maxLength", maximum: field.maxLength });
24291
- return makePlan("string", "string", field, path24, required, constraints);
25212
+ return makePlan("string", "string", field, path25, required, constraints);
24292
25213
  }
24293
25214
  case "url":
24294
25215
  return makePlan(
24295
25216
  "string",
24296
25217
  "string",
24297
25218
  field,
24298
- path24,
25219
+ path25,
24299
25220
  required,
24300
25221
  commonConstraints(required, { kind: "textType" }, { kind: "urlFormat", allowRelative: Boolean(field.allowRelative) })
24301
25222
  );
24302
25223
  case "reference":
24303
- return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "referenceText" }));
25224
+ return makePlan("string", "string", field, path25, required, commonConstraints(required, { kind: "referenceText" }));
24304
25225
  case "date":
24305
- return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }, { kind: "dateFormat" }));
25226
+ return makePlan("string", "string", field, path25, required, commonConstraints(required, { kind: "textType" }, { kind: "dateFormat" }));
24306
25227
  case "time":
24307
- return makePlan("string", "string", field, path24, required, commonConstraints(required, { kind: "textType" }, { kind: "timeFormat" }));
25228
+ return makePlan("string", "string", field, path25, required, commonConstraints(required, { kind: "textType" }, { kind: "timeFormat" }));
24308
25229
  case "datetime":
24309
25230
  return makePlan(
24310
25231
  "string",
24311
25232
  "string",
24312
25233
  field,
24313
- path24,
25234
+ path25,
24314
25235
  required,
24315
25236
  commonConstraints(required, { kind: "textType" }, { kind: "datetimeFormat" })
24316
25237
  );
@@ -24319,7 +25240,7 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
24319
25240
  "select",
24320
25241
  "select",
24321
25242
  field,
24322
- path24,
25243
+ path25,
24323
25244
  required,
24324
25245
  commonConstraints(required, {
24325
25246
  kind: "selectOption",
@@ -24328,40 +25249,40 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
24328
25249
  })
24329
25250
  );
24330
25251
  case "richText":
24331
- return makePlan("richText", "object", field, path24, required, commonConstraints(required, { kind: "richTextDoc" }));
25252
+ return makePlan("richText", "object", field, path25, required, commonConstraints(required, { kind: "richTextDoc" }));
24332
25253
  case "media":
24333
25254
  case "file":
24334
- return makePlan("media", "object", field, path24, required, commonConstraints(required, { kind: "mediaObject" }));
25255
+ return makePlan("media", "object", field, path25, required, commonConstraints(required, { kind: "mediaObject" }));
24335
25256
  case "link":
24336
- return makePlan("link", "object", field, path24, required, commonConstraints(required, { kind: "linkObject" }));
25257
+ return makePlan("link", "object", field, path25, required, commonConstraints(required, { kind: "linkObject" }));
24337
25258
  case "boolean":
24338
- return makePlan("boolean", "boolean", field, path24, required, requiredConstraints(required));
25259
+ return makePlan("boolean", "boolean", field, path25, required, requiredConstraints(required));
24339
25260
  case "repeater":
24340
25261
  return {
24341
- ...makePlan("repeater", "array", field, path24, required, commonConstraints(required, { kind: "arrayType" })),
25262
+ ...makePlan("repeater", "array", field, path25, required, commonConstraints(required, { kind: "arrayType" })),
24342
25263
  ...field.polymorphic && field.itemTypes ? {
24343
- repeatedItemVariants: deriveRepeatedItemVariants(field, [...path24, 0])
25264
+ repeatedItemVariants: deriveRepeatedItemVariants(field, [...path25, 0])
24344
25265
  } : {
24345
- repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path24, 0])
25266
+ repeatedItemPlan: deriveNestedFieldPlans(getRepeaterFields(field), [...path25, 0])
24346
25267
  },
24347
25268
  constraints: withRepeaterItemConstraints(field, commonConstraints(required, { kind: "arrayType" }))
24348
25269
  };
24349
25270
  case "group":
24350
25271
  case "modal":
24351
25272
  return {
24352
- ...makePlan("group", "object", field, path24, required, requiredConstraints(required)),
24353
- children: deriveNestedFieldPlans(field.schema?.fields ?? [], path24),
25273
+ ...makePlan("group", "object", field, path25, required, requiredConstraints(required)),
25274
+ children: deriveNestedFieldPlans(field.schema?.fields ?? [], path25),
24354
25275
  allowNullChildren: field.type === "group" && field.ui?.widget === "locationPicker"
24355
25276
  };
24356
25277
  case "tabGroup":
24357
25278
  return {
24358
- ...makePlan("group", "object", field, path24, required, requiredConstraints(required)),
24359
- children: field.tabs.flatMap((tab) => deriveNestedFieldPlans(tab.fields, path24))
25279
+ ...makePlan("group", "object", field, path25, required, requiredConstraints(required)),
25280
+ children: field.tabs.flatMap((tab) => deriveNestedFieldPlans(tab.fields, path25))
24360
25281
  };
24361
25282
  case "presetOrCustom":
24362
25283
  case "contentTypeSelect":
24363
25284
  case "entryPicker":
24364
- return makePlan("passthrough", "unknown", field, path24, false, []);
25285
+ return makePlan("passthrough", "unknown", field, path25, false, []);
24365
25286
  default:
24366
25287
  return assertNever2(field);
24367
25288
  }
@@ -24375,14 +25296,14 @@ function commonConstraints(required, ...specific) {
24375
25296
  function requiredConstraints(required) {
24376
25297
  return required ? [{ kind: "required" }] : [];
24377
25298
  }
24378
- function makePlan(kind, valueKind2, field, path24, required, constraints) {
25299
+ function makePlan(kind, valueKind2, field, path25, required, constraints) {
24379
25300
  return {
24380
25301
  kind,
24381
25302
  valueKind: valueKind2,
24382
25303
  fieldId: field.id,
24383
25304
  label: field.label,
24384
25305
  fieldType: field.type,
24385
- path: path24,
25306
+ path: path25,
24386
25307
  required,
24387
25308
  visibility: fieldVisibility(field),
24388
25309
  constraints
@@ -24719,18 +25640,18 @@ function materializeRepeaterItemPlan(plan, parentPath, index) {
24719
25640
  return rebaseFieldPlanPath(plan, [...parentPath, 0], [...parentPath, index]);
24720
25641
  }
24721
25642
  function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
24722
- const path24 = rebaseFieldPath(plan.path, fromPrefix, toPrefix);
25643
+ const path25 = rebaseFieldPath(plan.path, fromPrefix, toPrefix);
24723
25644
  switch (plan.kind) {
24724
25645
  case "group":
24725
25646
  return {
24726
25647
  ...plan,
24727
- path: path24,
25648
+ path: path25,
24728
25649
  children: plan.children.map((childPlan) => rebaseFieldPlanPath(childPlan, fromPrefix, toPrefix))
24729
25650
  };
24730
25651
  case "repeater":
24731
25652
  return {
24732
25653
  ...plan,
24733
- path: path24,
25654
+ path: path25,
24734
25655
  ...plan.repeatedItemVariants ? {
24735
25656
  repeatedItemVariants: plan.repeatedItemVariants.map((variant) => ({
24736
25657
  ...variant,
@@ -24751,20 +25672,20 @@ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
24751
25672
  case "passthrough":
24752
25673
  return {
24753
25674
  ...plan,
24754
- path: path24
25675
+ path: path25
24755
25676
  };
24756
25677
  default:
24757
25678
  return assertNever2(plan);
24758
25679
  }
24759
25680
  }
24760
- function rebaseFieldPath(path24, fromPrefix, toPrefix) {
24761
- if (!startsWithFieldPath(path24, fromPrefix)) {
24762
- throw new Error(`Cannot rebase field path ${formatFieldPath(path24)} from ${formatFieldPath(fromPrefix)}`);
25681
+ function rebaseFieldPath(path25, fromPrefix, toPrefix) {
25682
+ if (!startsWithFieldPath(path25, fromPrefix)) {
25683
+ throw new Error(`Cannot rebase field path ${formatFieldPath(path25)} from ${formatFieldPath(fromPrefix)}`);
24763
25684
  }
24764
- return [...toPrefix, ...path24.slice(fromPrefix.length)];
25685
+ return [...toPrefix, ...path25.slice(fromPrefix.length)];
24765
25686
  }
24766
- function startsWithFieldPath(path24, prefix) {
24767
- return prefix.every((segment, index) => path24[index] === segment);
25687
+ function startsWithFieldPath(path25, prefix) {
25688
+ return prefix.every((segment, index) => path25[index] === segment);
24768
25689
  }
24769
25690
  function issue(plan, kind, extra) {
24770
25691
  return {
@@ -24790,8 +25711,8 @@ function fieldPlanToZod(plan, options = {}) {
24790
25711
  }
24791
25712
  function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
24792
25713
  const message = fieldIssueToMessage(validationIssue);
24793
- const path24 = relativeZodIssuePath(validationIssue.path, rootPath);
24794
- const issuePath = path24.length > 0 ? { path: toZodIssuePath(path24) } : {};
25714
+ const path25 = relativeZodIssuePath(validationIssue.path, rootPath);
25715
+ const issuePath = path25.length > 0 ? { path: toZodIssuePath(path25) } : {};
24795
25716
  switch (validationIssue.kind) {
24796
25717
  case "required":
24797
25718
  if (validationIssue.emptyOrigin) {
@@ -24844,8 +25765,8 @@ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
24844
25765
  assertNever2(validationIssue);
24845
25766
  }
24846
25767
  }
24847
- function relativeZodIssuePath(path24, rootPath) {
24848
- return startsWithFieldPath(path24, rootPath) ? path24.slice(rootPath.length) : path24;
25768
+ function relativeZodIssuePath(path25, rootPath) {
25769
+ return startsWithFieldPath(path25, rootPath) ? path25.slice(rootPath.length) : path25;
24849
25770
  }
24850
25771
  function compilePattern(pattern) {
24851
25772
  try {
@@ -25332,10 +26253,7 @@ function introHeadingGroup(className) {
25332
26253
  },
25333
26254
  [
25334
26255
  introHeading(className),
25335
- headingDecoration({
25336
- family: "organic-squiggle",
25337
- placement: "after-heading"
25338
- })
26256
+ headingDecoration()
25339
26257
  ]
25340
26258
  );
25341
26259
  }
@@ -25357,10 +26275,7 @@ function introCopyStack(options = {}) {
25357
26275
  },
25358
26276
  [
25359
26277
  introHeading(options.headingClassName ?? "rb-intro-title"),
25360
- headingDecoration({
25361
- family: "organic-squiggle",
25362
- placement: "after-heading"
25363
- }),
26278
+ headingDecoration(),
25364
26279
  introBody(options.bodyClassName),
25365
26280
  introCtas(options.ctaJustify)
25366
26281
  ]
@@ -26163,10 +27078,6 @@ init_fragments2();
26163
27078
  init_faqAccordion();
26164
27079
  init_builder();
26165
27080
  init_boxStyles();
26166
- var faqComposition = composeFragments([
26167
- { fragment: faqHeadingFragment, fieldPriority: 0 },
26168
- { fragment: faqAccordionFragment, fieldPriority: 1 }
26169
- ]);
26170
27081
  function fragmentLayoutNode(layout) {
26171
27082
  return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
26172
27083
  }
@@ -26175,13 +27086,17 @@ function isNodeDefinitionArray(layout) {
26175
27086
  }
26176
27087
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
26177
27088
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
27089
+ var decoratedHeadingLayout = fragmentLayoutNode(decoratedFaqHeadingLayout);
26178
27090
  var questionColumnsAccordionLayout = createFaqAccordionLayout({
26179
27091
  rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
26180
27092
  });
26181
27093
  var defaultLayout = styledSection({
26182
27094
  children: styledContainer({
26183
27095
  baseClassName: "rb-relative rb-isolate",
26184
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
27096
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, [
27097
+ decoratedHeadingLayout,
27098
+ accordionLayout
27099
+ ])
26185
27100
  }),
26186
27101
  baseClass: ""
26187
27102
  });
@@ -26207,7 +27122,7 @@ var questionColumnsLayout = styledSection({
26207
27122
  children: stack(
26208
27123
  { gap: "xl", className: "rb-w-full" },
26209
27124
  [
26210
- headingLayout,
27125
+ decoratedHeadingLayout,
26211
27126
  questionColumnsAccordionLayout
26212
27127
  ]
26213
27128
  )
@@ -26403,7 +27318,6 @@ var eyebrowTreatmentClassMap = {
26403
27318
  };
26404
27319
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
26405
27320
  var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
26406
- var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
26407
27321
  var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
26408
27322
  function isEyebrowTreatment(value) {
26409
27323
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
@@ -26411,9 +27325,6 @@ function isEyebrowTreatment(value) {
26411
27325
  function isHeadingDecorationFamily(value) {
26412
27326
  return typeof value === "string" && headingDecorationFamilySet.has(value);
26413
27327
  }
26414
- function isHeadingDecorationPlacement(value) {
26415
- return typeof value === "string" && headingDecorationPlacementSet.has(value);
26416
- }
26417
27328
  function isHeadingDecorationColorToken(value) {
26418
27329
  return typeof value === "string" && headingDecorationColorTokenSet.has(value);
26419
27330
  }
@@ -26919,15 +27830,11 @@ var uiTransforms = [
26919
27830
  const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
26920
27831
  const decoration = asPartialObject(value);
26921
27832
  const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
26922
- const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
26923
- const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
26924
27833
  const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
26925
- if (!family || !placement) return "rb-hidden";
26926
- if (allowedFamily && family !== allowedFamily) return "rb-hidden";
27834
+ if (!family) return "rb-hidden";
26927
27835
  return joinClasses3([
26928
27836
  baseClass,
26929
27837
  `rb-heading-decoration-${family}`,
26930
- `rb-heading-decoration-placement-${placement}`,
26931
27838
  `rb-heading-decoration-color-${colorToken}`
26932
27839
  ]);
26933
27840
  }
@@ -26977,6 +27884,95 @@ function planSiteChromePlacement(positioning) {
26977
27884
  var joinClasses4 = (parts) => parts.filter(
26978
27885
  (part) => typeof part === "string" && part.trim().length > 0
26979
27886
  ).join(" ").replace(/\s+/g, " ").trim();
27887
+ function resolveHeaderBrandDisplay(logo) {
27888
+ const display = logo?.brandDisplay ?? "logo-plus-title";
27889
+ if (display === "logo-only" || display === "title-only") return display;
27890
+ return "logo-plus-title";
27891
+ }
27892
+ function resolveHeaderLogoSizeClass(logo) {
27893
+ switch (logo?.size ?? "standard") {
27894
+ case "compact":
27895
+ return "header-logo-size-compact";
27896
+ case "generous":
27897
+ return "header-logo-size-generous";
27898
+ case "display":
27899
+ return "header-logo-size-display";
27900
+ case "auto":
27901
+ case "standard":
27902
+ default:
27903
+ return "header-logo-size-standard";
27904
+ }
27905
+ }
27906
+ function resolveHeaderLogoAccommodationClass(logo) {
27907
+ if (resolveHeaderBrandDisplay(logo) === "title-only") {
27908
+ return "header-logo-accommodation-title-only";
27909
+ }
27910
+ switch (logo?.accommodation) {
27911
+ case "logo-plate":
27912
+ return "header-logo-accommodation-plate";
27913
+ case "centered-badge":
27914
+ return "header-logo-accommodation-centered-badge";
27915
+ case "popout-badge":
27916
+ return "header-logo-accommodation-popout-badge";
27917
+ case "centered-masthead":
27918
+ return "header-logo-accommodation-centered-masthead";
27919
+ case "hero-badge":
27920
+ return "header-logo-accommodation-hero-badge";
27921
+ case "inline-logo-only":
27922
+ return "header-logo-accommodation-inline-logo-only";
27923
+ case "inline-wordmark":
27924
+ return "header-logo-accommodation-inline-wordmark";
27925
+ case "inline-mark-with-title":
27926
+ return "header-logo-accommodation-inline-mark-with-title";
27927
+ case "title-only":
27928
+ return "header-logo-accommodation-title-only";
27929
+ case void 0:
27930
+ default:
27931
+ return "header-logo-accommodation-inline";
27932
+ }
27933
+ }
27934
+ var headerLogoClassSchema = z.object({
27935
+ base: z.string().optional()
27936
+ });
27937
+ var headerLogoClassTransform = {
27938
+ id: "layout.headerLogoClass",
27939
+ kind: "string",
27940
+ summary: "Compose header logo wrapper classes from brand display and accommodation settings",
27941
+ schema: headerLogoClassSchema,
27942
+ run: (value, options) => {
27943
+ const logo = asPartialObject(value);
27944
+ return joinClasses4([
27945
+ options.base ?? "header-logo rb-flex rb-min-w-0 rb-items-center rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80",
27946
+ `header-brand-display-${resolveHeaderBrandDisplay(logo)}`,
27947
+ resolveHeaderLogoSizeClass(logo),
27948
+ resolveHeaderLogoAccommodationClass(logo)
27949
+ ]);
27950
+ }
27951
+ };
27952
+ var headerLogoMediaClassTransform = {
27953
+ id: "layout.headerLogoMediaClass",
27954
+ kind: "string",
27955
+ summary: "Compose header logo media classes from brand display and size settings",
27956
+ schema: headerLogoClassSchema,
27957
+ run: (value, options) => {
27958
+ const logo = asPartialObject(value);
27959
+ const hiddenClass = resolveHeaderBrandDisplay(logo) === "title-only" ? "rb-hidden" : null;
27960
+ return joinClasses4([
27961
+ options.base ?? "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300",
27962
+ resolveHeaderLogoSizeClass(logo),
27963
+ hiddenClass
27964
+ ]);
27965
+ }
27966
+ };
27967
+ var headerLogoTextVisibleTransform = {
27968
+ id: "layout.headerLogoTextVisible",
27969
+ kind: "formatter",
27970
+ summary: "Return whether header logo text should render",
27971
+ run: (value) => {
27972
+ const logo = asPartialObject(value);
27973
+ return resolveHeaderBrandDisplay(logo) !== "logo-only";
27974
+ }
27975
+ };
26980
27976
  var maxWidthClassSchema = z.object({
26981
27977
  base: z.string().optional(),
26982
27978
  container: z.string().optional(),
@@ -27327,6 +28323,13 @@ var footerBottomBarStyleTransform = {
27327
28323
  return mergeStyles(...styleParts);
27328
28324
  }
27329
28325
  };
28326
+ function resolveFooterNavLayoutClasses(navLayout) {
28327
+ return {
28328
+ alignClass: footerAlignClassMap[navLayout?.align ?? "start"] ?? "rb-justify-start",
28329
+ gapX: footerGapXClassMap[navLayout?.gapX ?? "default"] ?? "rb-gap-x-6",
28330
+ gapY: footerGapYClassMap[navLayout?.gapY ?? "compact"] ?? "rb-gap-y-3"
28331
+ };
28332
+ }
27330
28333
  var footerSplitNavSingleClassTransform = {
27331
28334
  id: "layout.footerSplitNavSingleClass",
27332
28335
  kind: "string",
@@ -27334,9 +28337,7 @@ var footerSplitNavSingleClassTransform = {
27334
28337
  run: (value) => {
27335
28338
  const navLayout = asPartialObject(value);
27336
28339
  const mode = navLayout?.layout ?? "stack";
27337
- const alignClass = footerAlignClassMap[navLayout?.align ?? "start"] ?? "rb-justify-start";
27338
- const gapX = footerGapXClassMap[navLayout?.gapX ?? "default"] ?? "rb-gap-x-6";
27339
- const gapY = footerGapYClassMap[navLayout?.gapY ?? "compact"] ?? "rb-gap-y-3";
28340
+ const { alignClass, gapX, gapY } = resolveFooterNavLayoutClasses(navLayout);
27340
28341
  if (mode === "stack") {
27341
28342
  return "rb-w-full rb-space-y-3 rb-text-left";
27342
28343
  }
@@ -27355,6 +28356,42 @@ var footerSplitNavSingleClassTransform = {
27355
28356
  ]);
27356
28357
  }
27357
28358
  };
28359
+ var footerSimpleRootClassTransform = {
28360
+ id: "layout.footerSimpleRootClass",
28361
+ kind: "string",
28362
+ summary: "Compose simple-footer root classes from maxWidth and nav alignment",
28363
+ run: (value) => {
28364
+ const footer = asPartialObject(value);
28365
+ const align = footer?.navLayout?.align;
28366
+ const alignClasses = align === "center" ? "rb-items-center rb-text-center" : align === "end" ? "rb-items-end rb-text-right" : "rb-items-start rb-text-left";
28367
+ return joinClasses4([
28368
+ footer?.maxWidth === "full" ? "rb-container-full" : "rb-container",
28369
+ "rb-flex rb-w-full rb-flex-col rb-gap-4 rb-py-10",
28370
+ alignClasses
28371
+ ]);
28372
+ }
28373
+ };
28374
+ var footerSimpleNavClassTransform = {
28375
+ id: "layout.footerSimpleNavClass",
28376
+ kind: "string",
28377
+ summary: "Compose simple-footer nav classes from navLayout controls",
28378
+ run: (value) => {
28379
+ const navLayout = asPartialObject(value);
28380
+ if (!navLayout) {
28381
+ return "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3";
28382
+ }
28383
+ const { alignClass, gapX, gapY } = resolveFooterNavLayoutClasses(navLayout);
28384
+ if (navLayout.layout === "stack") {
28385
+ return "footer-nav rb-w-full rb-space-y-3";
28386
+ }
28387
+ return joinClasses4([
28388
+ "footer-nav rb-flex rb-flex-row rb-flex-wrap rb-items-center",
28389
+ alignClass,
28390
+ gapX,
28391
+ gapY
28392
+ ]);
28393
+ }
28394
+ };
27358
28395
  var footerSplitMainClassSchema = z.object({
27359
28396
  base: z.string().optional(),
27360
28397
  reverseClass: z.string().optional()
@@ -27376,7 +28413,8 @@ var footerSplitMainClassTransform = {
27376
28413
  }
27377
28414
  };
27378
28415
  var footerLogoClassSchema = z.object({
27379
- base: z.string().optional()
28416
+ base: z.string().optional(),
28417
+ requireExplicitShow: z.boolean().optional()
27380
28418
  });
27381
28419
  var footerLogoClassTransform = {
27382
28420
  id: "layout.footerLogoClass",
@@ -27386,7 +28424,7 @@ var footerLogoClassTransform = {
27386
28424
  run: (value, options) => {
27387
28425
  const logo = asPartialObject(value);
27388
28426
  const align = logo?.align ?? "end";
27389
- const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
28427
+ const hiddenClass = options.requireExplicitShow ? logo?.showLogo === true ? null : "rb-hidden" : logo?.showLogo === false ? "rb-hidden" : null;
27390
28428
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
27391
28429
  return joinClasses4([
27392
28430
  options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80",
@@ -27437,6 +28475,9 @@ function extractBackgroundColorToken(background, fallback) {
27437
28475
  var layoutTransforms = [
27438
28476
  maxWidthClassTransform,
27439
28477
  headerRootClassTransform,
28478
+ headerLogoClassTransform,
28479
+ headerLogoMediaClassTransform,
28480
+ headerLogoTextVisibleTransform,
27440
28481
  footerRootClassTransform,
27441
28482
  headerRootStyleTransform,
27442
28483
  headerSectionBackgroundTransform,
@@ -27446,6 +28487,8 @@ var layoutTransforms = [
27446
28487
  footerBottomBarStyleTransform,
27447
28488
  footerSplitNavSingleClassTransform,
27448
28489
  footerSplitMainClassTransform,
28490
+ footerSimpleRootClassTransform,
28491
+ footerSimpleNavClassTransform,
27449
28492
  footerLogoClassTransform,
27450
28493
  footerLogoMediaClassTransform,
27451
28494
  footerLogoTextVisibleTransform
@@ -27474,9 +28517,9 @@ function maybeBuildSupabaseTransformUrl(inputUrl, options) {
27474
28517
  const remainder = url.pathname.slice(idx + marker.length);
27475
28518
  const parts = remainder.split("/").filter(Boolean);
27476
28519
  const bucket = parts[0];
27477
- const path24 = parts.slice(1).join("/");
27478
- if (!bucket || !path24) return inputUrl;
27479
- url.pathname = `/storage/v1/render/image/public/${bucket}/${path24}`;
28520
+ const path25 = parts.slice(1).join("/");
28521
+ if (!bucket || !path25) return inputUrl;
28522
+ url.pathname = `/storage/v1/render/image/public/${bucket}/${path25}`;
27480
28523
  url.search = "";
27481
28524
  if (width) url.searchParams.set("width", String(width));
27482
28525
  if (height) url.searchParams.set("height", String(height));
@@ -27641,15 +28684,35 @@ init_colorStyles();
27641
28684
  var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
27642
28685
 
27643
28686
  // ../blocks/src/system/blocks/site-header.ts
28687
+ var whenTransformed = (from, transformId, equals = true) => (node) => ({
28688
+ ...node,
28689
+ $when: {
28690
+ when: {
28691
+ from,
28692
+ transforms: [{ id: transformId }]
28693
+ },
28694
+ equals
28695
+ }
28696
+ });
27644
28697
  var logoRow = link(
27645
28698
  {
27646
28699
  href: "/",
27647
- className: "header-logo rb-flex rb-min-w-0 rb-items-center rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80"
28700
+ className: bindProp("$root.theme.header.logo", {
28701
+ transforms: pipe(tx("layout.headerLogoClass")),
28702
+ fallback: "header-logo rb-flex rb-min-w-0 rb-items-center rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80"
28703
+ })
27648
28704
  },
27649
28705
  [
27650
28706
  media(
27651
28707
  {
27652
- className: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
28708
+ className: bindProp("$root.theme.header.logo", {
28709
+ transforms: pipe(
28710
+ tx("layout.headerLogoMediaClass", {
28711
+ base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
28712
+ })
28713
+ ),
28714
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
28715
+ })
27653
28716
  },
27654
28717
  when("content.logo"),
27655
28718
  bind("content.logo")
@@ -27659,7 +28722,14 @@ var logoRow = link(
27659
28722
  [
27660
28723
  media(
27661
28724
  {
27662
- className: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
28725
+ className: bindProp("$root.theme.header.logo", {
28726
+ transforms: pipe(
28727
+ tx("layout.headerLogoMediaClass", {
28728
+ base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
28729
+ })
28730
+ ),
28731
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
28732
+ })
27663
28733
  },
27664
28734
  when("site.logo"),
27665
28735
  bind("site.logo")
@@ -27673,6 +28743,10 @@ var logoRow = link(
27673
28743
  as: "strong",
27674
28744
  className: "header-logo-text rb-truncate"
27675
28745
  },
28746
+ whenTransformed(
28747
+ "$root.theme.header.logo",
28748
+ "layout.headerLogoTextVisible"
28749
+ ),
27676
28750
  bind("site.title", { fallback: "Your Site" })
27677
28751
  )
27678
28752
  ]
@@ -27680,12 +28754,26 @@ var logoRow = link(
27680
28754
  var centeredLogoRow = link(
27681
28755
  {
27682
28756
  href: "/",
27683
- className: "header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80"
28757
+ className: bindProp("$root.theme.header.logo", {
28758
+ transforms: pipe(
28759
+ tx("layout.headerLogoClass", {
28760
+ base: "header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80"
28761
+ })
28762
+ ),
28763
+ fallback: "header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80"
28764
+ })
27684
28765
  },
27685
28766
  [
27686
28767
  media(
27687
28768
  {
27688
- className: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
28769
+ className: bindProp("$root.theme.header.logo", {
28770
+ transforms: pipe(
28771
+ tx("layout.headerLogoMediaClass", {
28772
+ base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
28773
+ })
28774
+ ),
28775
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
28776
+ })
27689
28777
  },
27690
28778
  when("content.logo"),
27691
28779
  bind("content.logo")
@@ -27695,7 +28783,14 @@ var centeredLogoRow = link(
27695
28783
  [
27696
28784
  media(
27697
28785
  {
27698
- className: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
28786
+ className: bindProp("$root.theme.header.logo", {
28787
+ transforms: pipe(
28788
+ tx("layout.headerLogoMediaClass", {
28789
+ base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
28790
+ })
28791
+ ),
28792
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
28793
+ })
27699
28794
  },
27700
28795
  when("site.logo"),
27701
28796
  bind("site.logo")
@@ -27706,6 +28801,10 @@ var centeredLogoRow = link(
27706
28801
  // Logo text font-size controlled by CSS (styles.css) for shrink transitions
27707
28802
  text(
27708
28803
  { as: "strong", className: "header-logo-text" },
28804
+ whenTransformed(
28805
+ "$root.theme.header.logo",
28806
+ "layout.headerLogoTextVisible"
28807
+ ),
27709
28808
  bind("site.title", { fallback: "Your Site" })
27710
28809
  )
27711
28810
  ]
@@ -27840,12 +28939,12 @@ var mobileHeaderBar = inline(
27840
28939
  className: bindProp("$root.theme.header.maxWidth", {
27841
28940
  transforms: pipe(
27842
28941
  tx("layout.maxWidthClass", {
27843
- base: `rb-header-layout ${mobileOnlyDisplay("flex")} rb-w-full rb-items-center rb-justify-between`
28942
+ base: `rb-header-layout header-mobile-bar ${mobileOnlyDisplay("flex")} rb-w-full rb-items-start rb-justify-between`
27844
28943
  })
27845
28944
  ),
27846
- fallback: `rb-container rb-header-layout ${mobileOnlyDisplay("flex")} rb-w-full rb-items-center rb-justify-between`
28945
+ fallback: `rb-container rb-header-layout header-mobile-bar ${mobileOnlyDisplay("flex")} rb-w-full rb-items-start rb-justify-between`
27847
28946
  }),
27848
- align: "center",
28947
+ align: "start",
27849
28948
  justify: "between"
27850
28949
  },
27851
28950
  [logoRow, mobileToggleButton]
@@ -27916,12 +29015,12 @@ var floatingLayout = inline(
27916
29015
  className: bindProp("$root.theme.header.maxWidth", {
27917
29016
  transforms: pipe(
27918
29017
  tx("layout.maxWidthClass", {
27919
- base: `rb-header-layout header-floating-container rb-absolute rb-left-1/2 rb-top-4 ${desktopOnlyDisplay("flex")} rb-w-calc-100-minus-2rem rb-max-w-7xl rb-translate-x-neg-1/2 rb-items-center rb-gap-6 rb-px-6`,
29018
+ base: `rb-header-layout header-floating-container rb-absolute rb-left-1/2 rb-top-4 ${desktopOnlyDisplay("flex")} rb-w-calc-100-minus-2rem rb-max-w-7xl rb-translate-x-neg-1/2 rb-items-start rb-gap-6 rb-px-6`,
27920
29019
  container: "",
27921
29020
  full: ""
27922
29021
  })
27923
29022
  ),
27924
- fallback: `rb-header-layout header-floating-container rb-absolute rb-left-1/2 rb-top-4 ${desktopOnlyDisplay("flex")} rb-w-calc-100-minus-2rem rb-max-w-7xl rb-translate-x-neg-1/2 rb-items-center rb-gap-6 rb-px-6`
29023
+ fallback: `rb-header-layout header-floating-container rb-absolute rb-left-1/2 rb-top-4 ${desktopOnlyDisplay("flex")} rb-w-calc-100-minus-2rem rb-max-w-7xl rb-translate-x-neg-1/2 rb-items-start rb-gap-6 rb-px-6`
27925
29024
  }),
27926
29025
  align: "center"
27927
29026
  },
@@ -28039,7 +29138,7 @@ var footerNavGroupsLayout = stack(
28039
29138
  // ../blocks/src/system/blocks/site-footer.ts
28040
29139
  init_colorStyles();
28041
29140
  var footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
28042
- var whenTransformed = (from, transformId, equals = true) => (node) => ({
29141
+ var whenTransformed2 = (from, transformId, equals = true) => (node) => ({
28043
29142
  ...node,
28044
29143
  $when: {
28045
29144
  when: {
@@ -28077,30 +29176,89 @@ var inlineBottomTextLayout = () => {
28077
29176
  when("$root.theme.footer.bottomBar.enabled", { equals: true, not: true })(bottomTextNode)
28078
29177
  ];
28079
29178
  };
28080
- var simpleFooterLayout = stack(
29179
+ var simpleFooterLogo = link(
28081
29180
  {
28082
- gap: "md",
28083
- align: "start",
29181
+ href: "/",
28084
29182
  className: {
28085
29183
  $bind: {
28086
- from: "$root.theme.footer.maxWidth",
29184
+ from: "$root.theme.footer.logo",
28087
29185
  transforms: [
28088
29186
  {
28089
- id: "layout.maxWidthClass",
28090
- options: {
28091
- base: "rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
28092
- }
29187
+ id: "layout.footerLogoClass",
29188
+ options: { requireExplicitShow: true }
28093
29189
  }
28094
29190
  ],
29191
+ fallback: "rb-hidden"
29192
+ }
29193
+ }
29194
+ },
29195
+ [
29196
+ media(
29197
+ {
29198
+ className: {
29199
+ $bind: {
29200
+ from: "$root.theme.footer.logo",
29201
+ transforms: [{ id: "layout.footerLogoMediaClass" }],
29202
+ fallback: "rb-w-auto"
29203
+ }
29204
+ }
29205
+ },
29206
+ when("content.logo"),
29207
+ bind("content.logo")
29208
+ ),
29209
+ stack(
29210
+ { className: "rb-contents" },
29211
+ [
29212
+ media(
29213
+ {
29214
+ className: {
29215
+ $bind: {
29216
+ from: "$root.theme.footer.logo",
29217
+ transforms: [{ id: "layout.footerLogoMediaClass" }],
29218
+ fallback: "rb-w-auto"
29219
+ }
29220
+ }
29221
+ },
29222
+ when("site.logo"),
29223
+ bind("site.logo")
29224
+ )
29225
+ ],
29226
+ when("content.logo", { not: true })
29227
+ ),
29228
+ text(
29229
+ {
29230
+ as: "strong",
29231
+ className: "footer-logo-text rb-nav-text"
29232
+ },
29233
+ whenTransformed2("$root.theme.footer", "layout.footerLogoTextVisible"),
29234
+ bind("site.title", { fallback: "Your Site" })
29235
+ )
29236
+ ]
29237
+ );
29238
+ var simpleFooterLayout = stack(
29239
+ {
29240
+ gap: "md",
29241
+ align: "start",
29242
+ className: {
29243
+ $bind: {
29244
+ from: "$root.theme.footer",
29245
+ transforms: [{ id: "layout.footerSimpleRootClass" }],
28095
29246
  fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
28096
29247
  }
28097
29248
  }
28098
29249
  },
28099
29250
  [
29251
+ simpleFooterLogo,
28100
29252
  footerNav({
28101
29253
  collectionPath: "footerMenu.items",
28102
29254
  mode: "flatten",
28103
- className: "rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3",
29255
+ className: {
29256
+ $bind: {
29257
+ from: "$root.theme.footer.navLayout",
29258
+ transforms: [{ id: "layout.footerSimpleNavClass" }],
29259
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
29260
+ }
29261
+ },
28104
29262
  linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
28105
29263
  }),
28106
29264
  ...bodyTextLayout(),
@@ -28141,7 +29299,7 @@ var columnsFooterLayout = stack(
28141
29299
  className: "rb-block rb-nav-text",
28142
29300
  style: textColorStyle("text")
28143
29301
  },
28144
- whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"),
29302
+ whenTransformed2("$root.theme.footer", "layout.footerLogoTextVisible"),
28145
29303
  bind("site.title", { fallback: "Your Site" })
28146
29304
  ),
28147
29305
  footerNav({
@@ -28255,7 +29413,7 @@ var splitFooterLayout = stack(
28255
29413
  as: "strong",
28256
29414
  className: "footer-logo-text rb-nav-text"
28257
29415
  },
28258
- whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"),
29416
+ whenTransformed2("$root.theme.footer", "layout.footerLogoTextVisible"),
28259
29417
  bind("site.title", { fallback: "Your Site" })
28260
29418
  )
28261
29419
  ]
@@ -28391,6 +29549,7 @@ var wrapVariant = (variantLayout) => styledSection({
28391
29549
  });
28392
29550
  var carouselLayout = wrapVariant(buildCarouselLayout());
28393
29551
  var gridLayout2 = wrapVariant(buildGridLayout());
29552
+ var highlightLayout = wrapVariant(buildHighlightLayout());
28394
29553
  var splitHeading = stack(
28395
29554
  { gap: "md", className: "rb-testimonials-split-heading-copy rb-max-w-xl" },
28396
29555
  [
@@ -28399,10 +29558,7 @@ var splitHeading = stack(
28399
29558
  when("content.heading"),
28400
29559
  bind("content.heading")
28401
29560
  ),
28402
- headingDecoration({
28403
- family: "short-center-rule",
28404
- placement: "after-heading"
28405
- }),
29561
+ headingDecoration(),
28406
29562
  text(
28407
29563
  {
28408
29564
  as: "p",
@@ -28420,7 +29576,9 @@ var splitGridLayout = styledSection({
28420
29576
  children: el(
28421
29577
  "div",
28422
29578
  {
28423
- className: "rb-testimonials-split-grid rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
29579
+ // Desktop columns (title 1fr + cards 3fr = 25/25/25/25) are set in
29580
+ // testimonials.css on .rb-testimonials-split-grid; mobile stays 1-col.
29581
+ className: "rb-testimonials-split-grid rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-items-start"
28424
29582
  },
28425
29583
  [
28426
29584
  el("div", { className: "rb-testimonials-split-grid-heading" }, [splitHeading]),
@@ -28500,7 +29658,8 @@ var testimonialsManifest = createBlockManifest({
28500
29658
  variants: {
28501
29659
  carousel: carouselLayout,
28502
29660
  grid: gridLayout2,
28503
- "split-grid": splitGridLayout
29661
+ "split-grid": splitGridLayout,
29662
+ highlight: highlightLayout
28504
29663
  },
28505
29664
  defaultVariant: "carousel",
28506
29665
  variantOptions: {
@@ -28518,6 +29677,11 @@ var testimonialsManifest = createBlockManifest({
28518
29677
  label: "Split grid",
28519
29678
  description: "Heading on the left with testimonial cards on the right",
28520
29679
  icon: "PanelLeft"
29680
+ },
29681
+ highlight: {
29682
+ label: "Highlight",
29683
+ description: "A single, centered testimonial with no carousel",
29684
+ icon: "Quote"
28521
29685
  }
28522
29686
  },
28523
29687
  // Fields (variant field is auto-generated by augmentManifest)
@@ -28955,10 +30119,7 @@ var sectionHeading = stack(
28955
30119
  when("content.title"),
28956
30120
  bind("content.title")
28957
30121
  ),
28958
- headingDecoration({
28959
- family: "short-center-rule",
28960
- placement: "under-centered-heading"
28961
- }),
30122
+ headingDecoration(),
28962
30123
  richText(
28963
30124
  {
28964
30125
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -34407,8 +35568,7 @@ var systemBlockDefinitionsRaw = [
34407
35568
  withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
34408
35569
  sectionSurfaces: "supported",
34409
35570
  contentFrames: ["plain", "panel"],
34410
- itemSurfaces: "unsupported",
34411
- headingDecorations: ["organic-squiggle"]
35571
+ itemSurfaces: "unsupported"
34412
35572
  }), defineBlockDesignMetadata({
34413
35573
  flow: bodyFlow,
34414
35574
  layoutProfiles: [
@@ -34524,7 +35684,7 @@ var systemBlockDefinitionsRaw = [
34524
35684
  sectionSurfaces: "supported",
34525
35685
  contentFrames: ["plain", "panel"],
34526
35686
  itemSurfaces: "supported",
34527
- testimonialCardTreatments: ["default", "accent-quote"],
35687
+ testimonialCardTreatments: ["default", "statement", "non-carded", "accent-quote", "editorial-serif-quote"],
34528
35688
  headingDecorations: ["short-center-rule"]
34529
35689
  }), defineBlockDesignMetadata({
34530
35690
  flow: proofFlow,
@@ -34546,6 +35706,12 @@ var systemBlockDefinitionsRaw = [
34546
35706
  family: "split",
34547
35707
  weight: "featured",
34548
35708
  bias: "soft"
35709
+ }),
35710
+ layoutProfile({
35711
+ variantKey: "highlight",
35712
+ family: "centered",
35713
+ weight: "featured",
35714
+ bias: "soft"
34549
35715
  })
34550
35716
  ]
34551
35717
  })),
@@ -34560,8 +35726,7 @@ var systemBlockDefinitionsRaw = [
34560
35726
  withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
34561
35727
  sectionSurfaces: "supported",
34562
35728
  contentFrames: ["plain", "panel"],
34563
- itemSurfaces: "supported",
34564
- headingDecorations: ["short-center-rule"]
35729
+ itemSurfaces: "supported"
34565
35730
  }), defineBlockDesignMetadata({
34566
35731
  flow: offeringsFlow,
34567
35732
  layoutProfiles: [
@@ -34769,17 +35934,173 @@ function listBlockDefinitions() {
34769
35934
  return Array.from(blockStore.values());
34770
35935
  }
34771
35936
 
34772
- // ../theme-core/src/tokens/index.ts
34773
- init_blockColorTokens();
34774
- init_themeColorTokens();
34775
- init_colorTokenParts();
34776
- init_resolver();
34777
-
34778
35937
  // ../blocks/src/system/transforms/registry/index.ts
34779
35938
  init_core3();
34780
35939
 
34781
35940
  // ../blocks/src/system/transforms/registry/background.ts
34782
35941
  init_background2();
35942
+
35943
+ // ../theme-core/src/gradients/index.ts
35944
+ init_types9();
35945
+
35946
+ // ../theme-core/src/gradients/presets.ts
35947
+ var GRADIENT_PRESETS = [
35948
+ // Cross-color gradients
35949
+ {
35950
+ id: "primary-secondary",
35951
+ name: "Primary to Secondary",
35952
+ description: "Blend your primary and secondary brand colors",
35953
+ type: "linear",
35954
+ angle: 135,
35955
+ stops: [
35956
+ { color: "primary-500", position: 0 },
35957
+ { color: "secondary-500", position: 100 }
35958
+ ]
35959
+ },
35960
+ {
35961
+ id: "primary-accent",
35962
+ name: "Primary to Accent",
35963
+ description: "Energetic gradient from primary to accent",
35964
+ type: "linear",
35965
+ angle: 135,
35966
+ stops: [
35967
+ { color: "primary-500", position: 0 },
35968
+ { color: "accent-500", position: 100 }
35969
+ ]
35970
+ },
35971
+ {
35972
+ id: "secondary-accent",
35973
+ name: "Secondary to Accent",
35974
+ description: "Vibrant secondary to accent blend",
35975
+ type: "linear",
35976
+ angle: 135,
35977
+ stops: [
35978
+ { color: "secondary-500", position: 0 },
35979
+ { color: "accent-500", position: 100 }
35980
+ ]
35981
+ },
35982
+ // Monochromatic gradients (same family, different shades)
35983
+ {
35984
+ id: "primary-light-dark",
35985
+ name: "Primary Light to Dark",
35986
+ description: "Subtle primary color fade",
35987
+ type: "linear",
35988
+ angle: 180,
35989
+ stops: [
35990
+ { color: "primary-500", position: 0 },
35991
+ { color: "primary-900", position: 100 }
35992
+ ]
35993
+ },
35994
+ {
35995
+ id: "primary-dark-light",
35996
+ name: "Primary Dark to Light",
35997
+ description: "Reverse primary fade",
35998
+ type: "linear",
35999
+ angle: 180,
36000
+ stops: [
36001
+ { color: "primary-900", position: 0 },
36002
+ { color: "primary-50", position: 100 }
36003
+ ]
36004
+ },
36005
+ {
36006
+ id: "secondary-light-dark",
36007
+ name: "Secondary Light to Dark",
36008
+ description: "Subtle secondary color fade",
36009
+ type: "linear",
36010
+ angle: 180,
36011
+ stops: [
36012
+ { color: "secondary-500", position: 0 },
36013
+ { color: "secondary-900", position: 100 }
36014
+ ]
36015
+ },
36016
+ {
36017
+ id: "accent-light-dark",
36018
+ name: "Accent Light to Dark",
36019
+ description: "Accent color depth fade",
36020
+ type: "linear",
36021
+ angle: 180,
36022
+ stops: [
36023
+ { color: "accent-500", position: 0 },
36024
+ { color: "accent-900", position: 100 }
36025
+ ]
36026
+ },
36027
+ // Surface gradients
36028
+ {
36029
+ id: "background-surface",
36030
+ name: "Background to Surface",
36031
+ description: "Subtle depth using base colors",
36032
+ type: "linear",
36033
+ angle: 180,
36034
+ stops: [
36035
+ { color: "background", position: 0 },
36036
+ { color: "surface", position: 100 }
36037
+ ]
36038
+ },
36039
+ // Neutral fades
36040
+ {
36041
+ id: "neutral-fade",
36042
+ name: "Neutral Gradient",
36043
+ description: "Elegant neutral color fade",
36044
+ type: "linear",
36045
+ angle: 180,
36046
+ stops: [
36047
+ { color: "neutral-900", position: 0 },
36048
+ { color: "neutral-50", position: 100 }
36049
+ ]
36050
+ },
36051
+ // Radial gradients (spotlight effects)
36052
+ {
36053
+ id: "primary-radial",
36054
+ name: "Primary Spotlight",
36055
+ description: "Radial primary gradient from center",
36056
+ type: "radial",
36057
+ position: "center",
36058
+ stops: [
36059
+ { color: "primary-500", position: 0 },
36060
+ { color: "primary-900", position: 100 }
36061
+ ]
36062
+ },
36063
+ {
36064
+ id: "accent-radial",
36065
+ name: "Accent Spotlight",
36066
+ description: "Radial accent gradient from center",
36067
+ type: "radial",
36068
+ position: "center",
36069
+ stops: [
36070
+ { color: "accent-500", position: 0 },
36071
+ { color: "accent-900", position: 100 }
36072
+ ]
36073
+ },
36074
+ // Tri-color gradients
36075
+ {
36076
+ id: "primary-secondary-accent",
36077
+ name: "Brand Trio",
36078
+ description: "All three brand colors in harmony",
36079
+ type: "linear",
36080
+ angle: 135,
36081
+ stops: [
36082
+ { color: "primary-500", position: 0 },
36083
+ { color: "secondary-500", position: 50 },
36084
+ { color: "accent-500", position: 100 }
36085
+ ]
36086
+ }
36087
+ ];
36088
+
36089
+ // ../theme-core/src/gradients/utils.ts
36090
+ function gradientToCss(config2, tokens) {
36091
+ const stops = config2.stops.map((stop) => {
36092
+ const hex = tokens[stop.color] ?? "#000000";
36093
+ return `${hex} ${stop.position}%`;
36094
+ }).join(", ");
36095
+ if (config2.type === "radial") {
36096
+ const position = config2.position ?? "center";
36097
+ return `radial-gradient(circle at ${position}, ${stops})`;
36098
+ }
36099
+ const angle = config2.angle ?? 180;
36100
+ return `linear-gradient(${angle}deg, ${stops})`;
36101
+ }
36102
+
36103
+ // ../blocks/src/system/transforms/registry/background.ts
34783
36104
  init_themeColorResolution();
34784
36105
 
34785
36106
  // ../blocks/src/system/helpers/backgroundMedia.ts
@@ -34825,6 +36146,22 @@ function appendBackgroundMediaClasses(baseClassName, input) {
34825
36146
  backgroundVideoMobileClassNames(input)
34826
36147
  ].filter(Boolean).join(" ");
34827
36148
  }
36149
+ function gradientPresetCss(value) {
36150
+ if (!isString(value)) return null;
36151
+ const preset2 = GRADIENT_PRESETS.find(
36152
+ (candidate) => candidate.id === value.trim()
36153
+ );
36154
+ if (!preset2) return null;
36155
+ return gradientToCss(
36156
+ preset2,
36157
+ Object.fromEntries(
36158
+ preset2.stops.map((stop) => [
36159
+ stop.color,
36160
+ `rgb(var(--tb-${stop.color}))`
36161
+ ])
36162
+ )
36163
+ );
36164
+ }
34828
36165
  var resolveImageStyleTransform = {
34829
36166
  id: "background.resolveImageStyle",
34830
36167
  kind: "formatter",
@@ -34971,7 +36308,7 @@ var backgroundTransforms = [
34971
36308
  }
34972
36309
  const input = value;
34973
36310
  const color = isString(input.color) ? input.color.trim() : null;
34974
- const gradient = isString(input.gradient) ? input.gradient.trim() : null;
36311
+ const gradient = isString(input.gradient) ? input.gradient.trim() : gradientPresetCss(input.gradientPresetId);
34975
36312
  const opacity = parseOpacity(input.opacity);
34976
36313
  const style = {};
34977
36314
  if (color) {
@@ -35262,6 +36599,7 @@ init_generateCardCss();
35262
36599
  // ../theme-core/src/accordions/generateAccordionCss.ts
35263
36600
  init_types7();
35264
36601
  init_constants2();
36602
+ init_colorStyles();
35265
36603
 
35266
36604
  // ../theme-core/src/inputs/generateInputCss.ts
35267
36605
  init_types8();
@@ -35287,6 +36625,9 @@ init_resolver();
35287
36625
  // ../theme-core/src/layout/generateLayoutCss.ts
35288
36626
  init_breakpoints();
35289
36627
 
36628
+ // ../theme-core/src/runtime/buildThemeRuntime.ts
36629
+ init_tokens2();
36630
+
35290
36631
  // ../theme-core/src/blocks/vars/event-registration.ts
35291
36632
  function generateEventRegistrationVars({
35292
36633
  themeId
@@ -35626,14 +36967,78 @@ ${root} {
35626
36967
  }
35627
36968
 
35628
36969
  // ../theme-core/src/blocks/vars/testimonials.ts
35629
- function generateTestimonialsVars({ themeId }) {
36970
+ init_colorStyles();
36971
+ var QUOTE_SCALE_SIZE = {
36972
+ sm: "2.5rem",
36973
+ md: "3.5rem",
36974
+ // 4.375rem == 3.5rem * 1.25, matching the legacy accent-quote mark size.
36975
+ lg: "4.375rem",
36976
+ xl: "clamp(3.5rem, 2rem + 4vw, 5.5rem)"
36977
+ };
36978
+ function resolveTestimonialQuoteVars(treatment) {
36979
+ if (!treatment) {
36980
+ return {
36981
+ size: QUOTE_SCALE_SIZE.md,
36982
+ opacity: "0.08",
36983
+ color: "rgb(var(--tb-primary))",
36984
+ font: "inherit",
36985
+ weight: "700",
36986
+ display: "block"
36987
+ };
36988
+ }
36989
+ if (treatment.style === "none") {
36990
+ return {
36991
+ size: QUOTE_SCALE_SIZE.md,
36992
+ opacity: "0",
36993
+ color: "rgb(var(--tb-primary))",
36994
+ font: "inherit",
36995
+ weight: "700",
36996
+ display: "none"
36997
+ };
36998
+ }
36999
+ const base = treatment.style === "serif-display" ? {
37000
+ fontFamily: "heading",
37001
+ scale: "xl",
37002
+ colorToken: "primary",
37003
+ opacity: 1
37004
+ } : {
37005
+ // accent-glyph
37006
+ fontFamily: "body",
37007
+ scale: "lg",
37008
+ colorToken: "secondary",
37009
+ opacity: 1
37010
+ };
37011
+ const fontFamily = treatment.fontFamily ?? base.fontFamily;
37012
+ const scale = treatment.scale ?? base.scale;
37013
+ const colorToken = treatment.colorToken ?? base.colorToken;
37014
+ const opacity = treatment.opacity ?? base.opacity;
37015
+ return {
37016
+ size: QUOTE_SCALE_SIZE[scale],
37017
+ opacity: String(opacity),
37018
+ color: rgbColorValue(colorToken),
37019
+ font: fontFamily === "heading" ? "var(--font-heading)" : "var(--font-body, inherit)",
37020
+ // Heading-font display marks render at the family's natural weight (Forum
37021
+ // ships a single 400) to avoid synthetic bold; glyph marks stay heavy.
37022
+ weight: fontFamily === "heading" ? "400" : "700",
37023
+ display: "block"
37024
+ };
37025
+ }
37026
+ function generateTestimonialsVars({
37027
+ themeId,
37028
+ theme
37029
+ }) {
35630
37030
  const root = `:where([data-theme-scope="${themeId}"]) :where([data-block="testimonials"])`;
37031
+ const quote = resolveTestimonialQuoteVars(theme.testimonialQuote);
35631
37032
  return `
35632
37033
  ${root} {
35633
37034
  --rb-testimonial-avatar-size: 3rem;
35634
37035
  --rb-testimonial-avatar-border-radius: 9999px;
35635
- --rb-testimonial-quote-size: 3.5rem;
35636
- --rb-testimonial-quote-opacity: 0.08;
37036
+ --rb-testimonial-quote-size: ${quote.size};
37037
+ --rb-testimonial-quote-opacity: ${quote.opacity};
37038
+ --rb-testimonial-quote-color: ${quote.color};
37039
+ --rb-testimonial-quote-font: ${quote.font};
37040
+ --rb-testimonial-quote-weight: ${quote.weight};
37041
+ --rb-testimonial-quote-display: ${quote.display};
35637
37042
 
35638
37043
  /* Carousel arrows (defaults: primary background + onPrimary icon) */
35639
37044
  --rb-testimonial-carousel-arrow-bg: rgb(var(--tb-primary));
@@ -36003,10 +37408,10 @@ var BrowserImage = class extends ImageBase {
36003
37408
  );
36004
37409
  }
36005
37410
  this.image = img;
36006
- return new Promise((resolve12, reject) => {
37411
+ return new Promise((resolve13, reject) => {
36007
37412
  const onImageLoad = () => {
36008
37413
  this._initCanvas();
36009
- resolve12(this);
37414
+ resolve13(this);
36010
37415
  };
36011
37416
  if (img.complete) {
36012
37417
  onImageLoad();
@@ -37047,9 +38452,7 @@ init_schema3();
37047
38452
  init_site_styles();
37048
38453
  init_buttons();
37049
38454
  init_cards();
37050
-
37051
- // ../theme-core/src/gradients/index.ts
37052
- init_types9();
38455
+ init_tokens2();
37053
38456
 
37054
38457
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
37055
38458
  init_colorConversion();
@@ -38772,8 +40175,8 @@ var TEMPLATE_BINDING_META_PATHS = [
38772
40175
  "createdAt",
38773
40176
  "updatedAt"
38774
40177
  ];
38775
- function describeInvalidTemplateBindingMetaPath(path24) {
38776
- return `Meta path "${path24}" is not valid. Allowed: ${TEMPLATE_BINDING_META_PATHS.join(", ")}`;
40178
+ function describeInvalidTemplateBindingMetaPath(path25) {
40179
+ return `Meta path "${path25}" is not valid. Allowed: ${TEMPLATE_BINDING_META_PATHS.join(", ")}`;
38777
40180
  }
38778
40181
 
38779
40182
  // ../content-model/src/routeTemplate.ts
@@ -39162,7 +40565,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
39162
40565
  });
39163
40566
  }
39164
40567
  const paths = data.pages.map((p) => p.path);
39165
- const duplicatePaths = paths.filter((path24, i) => paths.indexOf(path24) !== i);
40568
+ const duplicatePaths = paths.filter((path25, i) => paths.indexOf(path25) !== i);
39166
40569
  if (duplicatePaths.length > 0) {
39167
40570
  ctx.addIssue({
39168
40571
  code: z.ZodIssueCode.custom,
@@ -39219,18 +40622,18 @@ function validateLayoutNodeTypes(layout) {
39219
40622
  errors
39220
40623
  };
39221
40624
  }
39222
- function validateNodeTypesRecursive(node, path24, errors) {
40625
+ function validateNodeTypesRecursive(node, path25, errors) {
39223
40626
  if (!ALLOWED_NODE_TYPES_SET.has(node.type)) {
39224
40627
  errors.push({
39225
- path: `${path24}.type`,
40628
+ path: `${path25}.type`,
39226
40629
  type: "invalid_node_type",
39227
40630
  value: node.type,
39228
- message: `Unknown node type "${node.type}" at ${path24}. Valid types: section, stack, text, etc.`
40631
+ message: `Unknown node type "${node.type}" at ${path25}. Valid types: section, stack, text, etc.`
39229
40632
  });
39230
40633
  }
39231
40634
  if (node.children && Array.isArray(node.children)) {
39232
40635
  node.children.forEach((child, index) => {
39233
- validateNodeTypesRecursive(child, `${path24}.children[${index}]`, errors);
40636
+ validateNodeTypesRecursive(child, `${path25}.children[${index}]`, errors);
39234
40637
  });
39235
40638
  }
39236
40639
  }
@@ -39242,45 +40645,45 @@ function validateTransformIds(layout) {
39242
40645
  errors
39243
40646
  };
39244
40647
  }
39245
- function validateTransformIdsRecursive(node, path24, errors) {
40648
+ function validateTransformIdsRecursive(node, path25, errors) {
39246
40649
  if (node.$bind?.transforms && Array.isArray(node.$bind.transforms)) {
39247
- validateTransformList(node.$bind.transforms, `${path24}.$bind.transforms`, errors);
40650
+ validateTransformList(node.$bind.transforms, `${path25}.$bind.transforms`, errors);
39248
40651
  }
39249
40652
  if (node.$repeat?.collection?.transforms && Array.isArray(node.$repeat.collection.transforms)) {
39250
- validateTransformList(node.$repeat.collection.transforms, `${path24}.$repeat.collection.transforms`, errors);
40653
+ validateTransformList(node.$repeat.collection.transforms, `${path25}.$repeat.collection.transforms`, errors);
39251
40654
  }
39252
40655
  if (node.$when?.when?.transforms && Array.isArray(node.$when.when.transforms)) {
39253
- validateTransformList(node.$when.when.transforms, `${path24}.$when.when.transforms`, errors);
40656
+ validateTransformList(node.$when.when.transforms, `${path25}.$when.when.transforms`, errors);
39254
40657
  }
39255
40658
  if (node.$scopes && Array.isArray(node.$scopes)) {
39256
40659
  node.$scopes.forEach((scope, index) => {
39257
40660
  if (scope.from?.transforms && Array.isArray(scope.from.transforms)) {
39258
- validateTransformList(scope.from.transforms, `${path24}.$scopes[${index}].from.transforms`, errors);
40661
+ validateTransformList(scope.from.transforms, `${path25}.$scopes[${index}].from.transforms`, errors);
39259
40662
  }
39260
40663
  });
39261
40664
  }
39262
40665
  if (node.props) {
39263
- validatePropsTransforms(node.props, `${path24}.props`, errors);
40666
+ validatePropsTransforms(node.props, `${path25}.props`, errors);
39264
40667
  }
39265
40668
  if (node.children && Array.isArray(node.children)) {
39266
40669
  node.children.forEach((child, index) => {
39267
- validateTransformIdsRecursive(child, `${path24}.children[${index}]`, errors);
40670
+ validateTransformIdsRecursive(child, `${path25}.children[${index}]`, errors);
39268
40671
  });
39269
40672
  }
39270
40673
  }
39271
- function validateTransformList(transforms, path24, errors) {
40674
+ function validateTransformList(transforms, path25, errors) {
39272
40675
  transforms.forEach((transform, index) => {
39273
40676
  if (!ALLOWED_TRANSFORM_IDS_SET.has(transform.id)) {
39274
40677
  errors.push({
39275
- path: `${path24}[${index}].id`,
40678
+ path: `${path25}[${index}].id`,
39276
40679
  type: "invalid_transform_id",
39277
40680
  value: transform.id,
39278
- message: `Unknown transform "${transform.id}" at ${path24}. Valid transforms: string.uppercase, value.fallback, etc.`
40681
+ message: `Unknown transform "${transform.id}" at ${path25}. Valid transforms: string.uppercase, value.fallback, etc.`
39279
40682
  });
39280
40683
  }
39281
40684
  });
39282
40685
  }
39283
- function validatePropsTransforms(props2, path24, errors) {
40686
+ function validatePropsTransforms(props2, path25, errors) {
39284
40687
  for (const [key, value] of Object.entries(props2)) {
39285
40688
  if (isBindingObject(value)) {
39286
40689
  const binding = value;
@@ -39288,16 +40691,16 @@ function validatePropsTransforms(props2, path24, errors) {
39288
40691
  binding.$bind.transforms.forEach((transform, index) => {
39289
40692
  if (!ALLOWED_TRANSFORM_IDS_SET.has(transform.id)) {
39290
40693
  errors.push({
39291
- path: `${path24}.${key}.$bind.transforms[${index}].id`,
40694
+ path: `${path25}.${key}.$bind.transforms[${index}].id`,
39292
40695
  type: "invalid_transform_id",
39293
40696
  value: transform.id,
39294
- message: `Unknown transform "${transform.id}" at ${path24}.${key}. Valid transforms: string.uppercase, value.fallback, etc.`
40697
+ message: `Unknown transform "${transform.id}" at ${path25}.${key}. Valid transforms: string.uppercase, value.fallback, etc.`
39295
40698
  });
39296
40699
  }
39297
40700
  });
39298
40701
  }
39299
40702
  } else if (value && typeof value === "object" && !Array.isArray(value)) {
39300
- validatePropsTransforms(value, `${path24}.${key}`, errors);
40703
+ validatePropsTransforms(value, `${path25}.${key}`, errors);
39301
40704
  }
39302
40705
  }
39303
40706
  }
@@ -39841,8 +41244,8 @@ async function readApiResponse(response, requestInfo, options = {}) {
39841
41244
  function createHttpClient(config2) {
39842
41245
  const baseUrl = `${config2.dashboardUrl}/api/sdk/${config2.siteId}`;
39843
41246
  const timeout = config2.timeout ?? 3e4;
39844
- async function request(method, path24, options) {
39845
- let url = `${baseUrl}${path24}`;
41247
+ async function request(method, path25, options) {
41248
+ let url = `${baseUrl}${path25}`;
39846
41249
  if (options?.params && Object.keys(options.params).length > 0) {
39847
41250
  const searchParams = new URLSearchParams(options.params);
39848
41251
  url = `${url}?${searchParams.toString()}`;
@@ -39865,7 +41268,7 @@ function createHttpClient(config2) {
39865
41268
  } catch (error) {
39866
41269
  const requestInfo2 = buildRequestInfo({
39867
41270
  method,
39868
- path: path24,
41271
+ path: path25,
39869
41272
  url,
39870
41273
  baseUrl,
39871
41274
  dashboardUrl: config2.dashboardUrl,
@@ -39890,7 +41293,7 @@ function createHttpClient(config2) {
39890
41293
  }
39891
41294
  const requestInfo = buildRequestInfo({
39892
41295
  method,
39893
- path: path24,
41296
+ path: path25,
39894
41297
  url,
39895
41298
  baseUrl,
39896
41299
  dashboardUrl: config2.dashboardUrl,
@@ -39920,17 +41323,17 @@ function createHttpClient(config2) {
39920
41323
  return json.data;
39921
41324
  }
39922
41325
  return {
39923
- async get(path24, params) {
39924
- return request("GET", path24, { params });
41326
+ async get(path25, params) {
41327
+ return request("GET", path25, { params });
39925
41328
  },
39926
- async post(path24, body) {
39927
- return request("POST", path24, { body });
41329
+ async post(path25, body) {
41330
+ return request("POST", path25, { body });
39928
41331
  },
39929
- async patch(path24, body) {
39930
- return request("PATCH", path24, { body });
41332
+ async patch(path25, body) {
41333
+ return request("PATCH", path25, { body });
39931
41334
  },
39932
- async delete(path24, body) {
39933
- await request("DELETE", path24, { body });
41335
+ async delete(path25, body) {
41336
+ await request("DELETE", path25, { body });
39934
41337
  }
39935
41338
  };
39936
41339
  }
@@ -40602,6 +42005,15 @@ function createMediaOperations(config2) {
40602
42005
  };
40603
42006
  }
40604
42007
 
42008
+ // src/client/management/webhooks.ts
42009
+ function createWebhookOperations(http) {
42010
+ return {
42011
+ setupRevalidation(input) {
42012
+ return http.post("/webhooks/revalidation/setup", input);
42013
+ }
42014
+ };
42015
+ }
42016
+
40605
42017
  // src/client/management/index.ts
40606
42018
  function createManagementClient(config2) {
40607
42019
  if (!config2.dashboardUrl) {
@@ -40631,6 +42043,7 @@ function createManagementClient(config2) {
40631
42043
  blocks: createBlockOperations(http),
40632
42044
  navigation: createNavigationOperations(http),
40633
42045
  settings: createSettingsOperations(http),
42046
+ webhooks: createWebhookOperations(http),
40634
42047
  forms: createFormOperations(http),
40635
42048
  theme: createThemeOperations(http),
40636
42049
  footer: createFooterOperations(http),
@@ -41049,10 +42462,10 @@ async function confirmAction(message, options, isRemote) {
41049
42462
  input: process.stdin,
41050
42463
  output: process.stdout
41051
42464
  });
41052
- return new Promise((resolve12) => {
42465
+ return new Promise((resolve13) => {
41053
42466
  rl.question(`${message} (y/N): `, (answer) => {
41054
42467
  rl.close();
41055
- resolve12(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
42468
+ resolve13(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
41056
42469
  });
41057
42470
  });
41058
42471
  }
@@ -41363,12 +42776,12 @@ function collectPushConfigSyncWarnings(sync) {
41363
42776
  async function pushToDashboard(output, dashboardUrl, siteId, apiKey, config2, options) {
41364
42777
  const normalizedDashboardUrl = dashboardUrl.replace(/\/+$/, "");
41365
42778
  const baseUrl = `${normalizedDashboardUrl}/api`;
41366
- const path24 = `/sites/${siteId}/sdk-config`;
41367
- const pushUrl = `${baseUrl}${path24}`;
42779
+ const path25 = `/sites/${siteId}/sdk-config`;
42780
+ const pushUrl = `${baseUrl}${path25}`;
41368
42781
  output.info(`Pushing config to ${pushUrl}...`);
41369
42782
  const requestInfo = {
41370
42783
  method: "POST",
41371
- path: path24,
42784
+ path: path25,
41372
42785
  url: pushUrl,
41373
42786
  baseUrl,
41374
42787
  dashboardUrl: normalizedDashboardUrl,
@@ -42965,7 +44378,7 @@ var DEFAULT_RETRY_CONFIG = {
42965
44378
  // 10 seconds
42966
44379
  };
42967
44380
  function sleep(ms) {
42968
- return new Promise((resolve12) => setTimeout(resolve12, ms));
44381
+ return new Promise((resolve13) => setTimeout(resolve13, ms));
42969
44382
  }
42970
44383
  function getBackoffDelay(attempt, baseDelayMs, maxDelayMs) {
42971
44384
  const exponentialDelay = baseDelayMs * Math.pow(2, attempt);
@@ -44251,11 +45664,11 @@ function findChangedFields(local, remote, prefix = "") {
44251
45664
  const changes = [];
44252
45665
  const allKeys = /* @__PURE__ */ new Set([...Object.keys(local), ...Object.keys(remote)]);
44253
45666
  for (const key of allKeys) {
44254
- const path24 = prefix ? `${prefix}.${key}` : key;
45667
+ const path25 = prefix ? `${prefix}.${key}` : key;
44255
45668
  const localVal = local[key];
44256
45669
  const remoteVal = remote[key];
44257
45670
  if (!equal(localVal, remoteVal)) {
44258
- changes.push(path24);
45671
+ changes.push(path25);
44259
45672
  }
44260
45673
  }
44261
45674
  return changes;
@@ -45325,11 +46738,11 @@ function findChangedFieldsWithValues(local, remote, prefix = "") {
45325
46738
  const changes = [];
45326
46739
  const allKeys = /* @__PURE__ */ new Set([...Object.keys(local), ...Object.keys(remote)]);
45327
46740
  for (const key of allKeys) {
45328
- const path24 = prefix ? `${prefix}.${key}` : key;
46741
+ const path25 = prefix ? `${prefix}.${key}` : key;
45329
46742
  const localVal = local[key];
45330
46743
  const remoteVal = remote[key];
45331
46744
  if (!equal(localVal, remoteVal)) {
45332
- changes.push({ path: path24, before: remoteVal, after: localVal });
46745
+ changes.push({ path: path25, before: remoteVal, after: localVal });
45333
46746
  }
45334
46747
  }
45335
46748
  return changes;
@@ -50004,13 +51417,13 @@ function collectOfferingRequires(input, intervals, intervalPath) {
50004
51417
  function optionalRef(ref, field) {
50005
51418
  return ref ? [{ ref, field }] : [];
50006
51419
  }
50007
- function collectVenueRefsFromIntervals(intervals, path24) {
50008
- return intervals.flatMap((interval, index) => optionalRef(interval.venueRef, `${path24}[${index}].venueRef`));
51420
+ function collectVenueRefsFromIntervals(intervals, path25) {
51421
+ return intervals.flatMap((interval, index) => optionalRef(interval.venueRef, `${path25}[${index}].venueRef`));
50009
51422
  }
50010
- function collectNavigationRefs(items, path24) {
51423
+ function collectNavigationRefs(items, path25) {
50011
51424
  return items.flatMap((item, index) => {
50012
51425
  if (!isRecord12(item)) return [];
50013
- const itemPath = `${path24}[${index}]`;
51426
+ const itemPath = `${path25}[${index}]`;
50014
51427
  const refs = [];
50015
51428
  if (typeof item.pageRef === "string") {
50016
51429
  refs.push({ ref: item.pageRef, field: `${itemPath}.pageRef` });
@@ -50024,26 +51437,26 @@ function collectNavigationRefs(items, path24) {
50024
51437
  return refs;
50025
51438
  });
50026
51439
  }
50027
- function collectBlockRefs(blocks, path24) {
51440
+ function collectBlockRefs(blocks, path25) {
50028
51441
  return blocks.flatMap((block, index) => {
50029
51442
  if (!isRecord12(block)) return [];
50030
- const blockPath = `${path24}[${index}]`;
51443
+ const blockPath = `${path25}[${index}]`;
50031
51444
  return [
50032
51445
  ...collectNestedRefs(block.props, `${blockPath}.props`),
50033
51446
  ...collectNestedRefs(block.children, `${blockPath}.children`)
50034
51447
  ];
50035
51448
  });
50036
51449
  }
50037
- function collectNestedRefs(value, path24) {
51450
+ function collectNestedRefs(value, path25) {
50038
51451
  if (typeof value === "string") {
50039
51452
  const parsed = parseResourceRef(value);
50040
- return parsed.ok ? [{ ref: value, field: path24 }] : [];
51453
+ return parsed.ok ? [{ ref: value, field: path25 }] : [];
50041
51454
  }
50042
51455
  if (Array.isArray(value)) {
50043
- return value.flatMap((item, index) => collectNestedRefs(item, `${path24}[${index}]`));
51456
+ return value.flatMap((item, index) => collectNestedRefs(item, `${path25}[${index}]`));
50044
51457
  }
50045
51458
  if (!isRecord12(value)) return [];
50046
- return Object.entries(value).flatMap(([key, child]) => collectNestedRefs(child, `${path24}.${key}`));
51459
+ return Object.entries(value).flatMap(([key, child]) => collectNestedRefs(child, `${path25}.${key}`));
50047
51460
  }
50048
51461
 
50049
51462
  // ../site-commands/src/staticExecutionGaps.ts
@@ -50322,8 +51735,8 @@ function invalidPayloadError(input, issue2) {
50322
51735
  message: `${field}: ${issue2.message}`
50323
51736
  };
50324
51737
  }
50325
- function commandIndexForIssuePath(path24) {
50326
- return path24[0] === "commands" && typeof path24[1] === "number" ? path24[1] : -1;
51738
+ function commandIndexForIssuePath(path25) {
51739
+ return path25[0] === "commands" && typeof path25[1] === "number" ? path25[1] : -1;
50327
51740
  }
50328
51741
  function commandTypeForIssue(input, commandIndex) {
50329
51742
  if (!isRecord12(input) || !isUnknownArray3(input.commands)) return null;
@@ -50333,9 +51746,9 @@ function commandTypeForIssue(input, commandIndex) {
50333
51746
  function isUnknownArray3(value) {
50334
51747
  return Array.isArray(value);
50335
51748
  }
50336
- function formatIssuePath(path24) {
50337
- if (path24.length === 0) return "<root>";
50338
- return path24.reduce((formatted, segment) => {
51749
+ function formatIssuePath(path25) {
51750
+ if (path25.length === 0) return "<root>";
51751
+ return path25.reduce((formatted, segment) => {
50339
51752
  if (typeof segment === "number") return `${formatted}[${segment}]`;
50340
51753
  if (formatted.length === 0) return String(segment);
50341
51754
  return `${formatted}.${String(segment)}`;
@@ -54424,7 +55837,7 @@ function firstNestedContainerChange(localChanges, remoteChanges) {
54424
55837
  }
54425
55838
  function firstSameFieldConflictPath(localChanges, remoteChanges) {
54426
55839
  const remotePaths = new Set(remoteChanges.keys());
54427
- return [...localChanges.keys()].filter((path24) => remotePaths.has(path24)).sort()[0] ?? null;
55840
+ return [...localChanges.keys()].filter((path25) => remotePaths.has(path25)).sort()[0] ?? null;
54428
55841
  }
54429
55842
  function unsupportedNestedMerge(subject, fieldPath) {
54430
55843
  return {
@@ -54506,37 +55919,37 @@ function valueKind(value) {
54506
55919
  if (typeof value === "object") return "object";
54507
55920
  return "scalar";
54508
55921
  }
54509
- function entryChange(path24, value, containerKind) {
55922
+ function entryChange(path25, value, containerKind) {
54510
55923
  switch (containerKind) {
54511
55924
  case "array":
54512
- if (Array.isArray(value)) return { path: path24, value, containerKind };
55925
+ if (Array.isArray(value)) return { path: path25, value, containerKind };
54513
55926
  break;
54514
55927
  case "object":
54515
55928
  if (value && typeof value === "object" && !Array.isArray(value)) {
54516
- return { path: path24, value, containerKind };
55929
+ return { path: path25, value, containerKind };
54517
55930
  }
54518
55931
  break;
54519
55932
  case "null":
54520
- if (value === null || value === void 0) return { path: path24, value, containerKind };
55933
+ if (value === null || value === void 0) return { path: path25, value, containerKind };
54521
55934
  break;
54522
55935
  case "scalar":
54523
- if (isScalarEntryChangeValue(value)) return { path: path24, value, containerKind };
55936
+ if (isScalarEntryChangeValue(value)) return { path: path25, value, containerKind };
54524
55937
  break;
54525
55938
  default:
54526
55939
  assertNever(containerKind);
54527
55940
  }
54528
- throw new Error(`Invalid entry merge change at ${path24}.`);
55941
+ throw new Error(`Invalid entry merge change at ${path25}.`);
54529
55942
  }
54530
55943
  function isScalarEntryChangeValue(value) {
54531
55944
  return value === void 0 || value === null || ["boolean", "number", "string"].includes(typeof value);
54532
55945
  }
54533
- function expectStringValue(path24, value) {
55946
+ function expectStringValue(path25, value) {
54534
55947
  if (typeof value === "string") return value;
54535
- throw new Error(`Entry merge expected ${path24} to be a string.`);
55948
+ throw new Error(`Entry merge expected ${path25} to be a string.`);
54536
55949
  }
54537
- function expectBooleanValue(path24, value) {
55950
+ function expectBooleanValue(path25, value) {
54538
55951
  if (typeof value === "boolean") return value;
54539
- throw new Error(`Entry merge expected ${path24} to be a boolean.`);
55952
+ throw new Error(`Entry merge expected ${path25} to be a boolean.`);
54540
55953
  }
54541
55954
  function expectStatusValue(value) {
54542
55955
  if (value === "draft" || value === "published") return value;
@@ -57560,9 +58973,9 @@ var THEME_FIELD_CATEGORY_MAP = {
57560
58973
  "Core Fields": ["name", "description", "rationale", "siteStyleId"],
57561
58974
  "Design Axes": ["axes"],
57562
58975
  "Palette": ["palette"],
57563
- "Typography": ["typography", "bodyText"],
58976
+ "Typography": ["typography", "bodyText", "headingDecoration"],
57564
58977
  "Style Primitives": ["space", "border", "shadow", "motion", "corners", "gradients"],
57565
- "Component Systems": ["buttons", "buttonSystem", "cards", "accordions", "inputs", "inputStyle", "blockOverrides"],
58978
+ "Component Systems": ["buttons", "buttonSystem", "cards", "accordions", "testimonialQuote", "inputs", "inputStyle", "blockOverrides"],
57566
58979
  "Layout": ["header", "footer", "layout", "hero"],
57567
58980
  "Custom CSS": [
57568
58981
  "customCssRules",
@@ -58959,7 +60372,7 @@ var SimpleCache = class {
58959
60372
  };
58960
60373
 
58961
60374
  // src/version.ts
58962
- var SDK_VERSION = "0.79.0";
60375
+ var SDK_VERSION = "0.80.0";
58963
60376
 
58964
60377
  // src/client/error.ts
58965
60378
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -59358,7 +60771,7 @@ function getRetryDelay(error, attempt, config2) {
59358
60771
  return calculateBackoff(attempt, config2);
59359
60772
  }
59360
60773
  function sleep2(ms) {
59361
- return new Promise((resolve12) => setTimeout(resolve12, ms));
60774
+ return new Promise((resolve13) => setTimeout(resolve13, ms));
59362
60775
  }
59363
60776
  var CircuitOpenError = class extends Error {
59364
60777
  constructor(state) {
@@ -59881,14 +61294,14 @@ function createRiverbankClient(config2) {
59881
61294
  );
59882
61295
  }
59883
61296
  async function getPageWithResilienceInternal(params) {
59884
- const { siteId, path: path24, preview = false, signal } = params;
59885
- const cacheKey = `page:${siteId}:${path24}:${preview}`;
61297
+ const { siteId, path: path25, preview = false, signal } = params;
61298
+ const cacheKey = `page:${siteId}:${path25}:${preview}`;
59886
61299
  return resilientFetch(
59887
61300
  cacheKey,
59888
61301
  async (sig) => {
59889
61302
  return await apiClient({
59890
61303
  endpoint: "getContentByPath",
59891
- params: { siteId, path: path24, preview: String(preview) },
61304
+ params: { siteId, path: path25, preview: String(preview) },
59892
61305
  options: { signal: sig }
59893
61306
  });
59894
61307
  },
@@ -59896,7 +61309,7 @@ function createRiverbankClient(config2) {
59896
61309
  preview,
59897
61310
  signal,
59898
61311
  // Prebuild fallback only for published pages (not preview)
59899
- prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadPage(siteId, path24) : void 0
61312
+ prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadPage(siteId, path25) : void 0
59900
61313
  }
59901
61314
  );
59902
61315
  }
@@ -60320,17 +61733,17 @@ function createRiverbankClient(config2) {
60320
61733
  };
60321
61734
  },
60322
61735
  async checkRedirect(params) {
60323
- const { siteId, path: path24, signal } = params;
60324
- if (!siteId || !path24) {
61736
+ const { siteId, path: path25, signal } = params;
61737
+ if (!siteId || !path25) {
60325
61738
  throw new Error("checkRedirect() requires siteId and path");
60326
61739
  }
60327
- const cacheKey = `redirect:${siteId}:${path24}`;
61740
+ const cacheKey = `redirect:${siteId}:${path25}`;
60328
61741
  return resilientFetchData(
60329
61742
  cacheKey,
60330
61743
  async (sig) => {
60331
61744
  return await apiClient({
60332
61745
  endpoint: "checkRedirect",
60333
- params: { site: siteId, path: path24 },
61746
+ params: { site: siteId, path: path25 },
60334
61747
  options: { signal: sig }
60335
61748
  });
60336
61749
  },
@@ -60739,7 +62152,7 @@ async function loadDeployConfig() {
60739
62152
  }
60740
62153
  async function checkWorkingDirectoryClean(git, prebuildOutput) {
60741
62154
  const status = await git.status();
60742
- const dirtyFiles = status.files.map((f) => f.path).filter((path24) => !path24.startsWith(prebuildOutput));
62155
+ const dirtyFiles = status.files.map((f) => f.path).filter((path25) => !path25.startsWith(prebuildOutput));
60743
62156
  return {
60744
62157
  clean: dirtyFiles.length === 0,
60745
62158
  dirtyFiles
@@ -61270,25 +62683,25 @@ function mapMediaGuardDiagnosticsToAuditIssues(diagnostics) {
61270
62683
  }
61271
62684
  }));
61272
62685
  }
61273
- function extractEmbedReferences(data, path24 = []) {
62686
+ function extractEmbedReferences(data, path25 = []) {
61274
62687
  const refs = [];
61275
62688
  if (!data || typeof data !== "object") return refs;
61276
62689
  if (Array.isArray(data)) {
61277
62690
  data.forEach((item, index) => {
61278
- refs.push(...extractEmbedReferences(item, [...path24, String(index)]));
62691
+ refs.push(...extractEmbedReferences(item, [...path25, String(index)]));
61279
62692
  });
61280
62693
  return refs;
61281
62694
  }
61282
62695
  const obj = data;
61283
62696
  if (obj.kind === "embed" && obj.contentType && obj.identifier) {
61284
62697
  refs.push({
61285
- path: path24.join("."),
62698
+ path: path25.join("."),
61286
62699
  contentType: String(obj.contentType),
61287
62700
  identifier: String(obj.identifier)
61288
62701
  });
61289
62702
  }
61290
62703
  for (const [key, value] of Object.entries(obj)) {
61291
- refs.push(...extractEmbedReferences(value, [...path24, key]));
62704
+ refs.push(...extractEmbedReferences(value, [...path25, key]));
61292
62705
  }
61293
62706
  return refs;
61294
62707
  }
@@ -62222,7 +63635,7 @@ function formatThemeSummaryForPrompt(summary) {
62222
63635
  }
62223
63636
 
62224
63637
  // src/manifest/validation/layout-utils.ts
62225
- function collectLayoutNodeInfos(node, path24 = "layout", out = []) {
63638
+ function collectLayoutNodeInfos(node, path25 = "layout", out = []) {
62226
63639
  if (!node || typeof node !== "object") return out;
62227
63640
  const n = node;
62228
63641
  const type = typeof n.type === "string" ? n.type : "unknown";
@@ -62231,10 +63644,10 @@ function collectLayoutNodeInfos(node, path24 = "layout", out = []) {
62231
63644
  const b = n.$bind;
62232
63645
  if (typeof b.from === "string") bindFrom = b.from;
62233
63646
  }
62234
- out.push({ path: path24, type, bindFrom });
63647
+ out.push({ path: path25, type, bindFrom });
62235
63648
  if (Array.isArray(n.children)) {
62236
63649
  for (let i = 0; i < n.children.length; i++) {
62237
- collectLayoutNodeInfos(n.children[i], `${path24}.children[${i}]`, out);
63650
+ collectLayoutNodeInfos(n.children[i], `${path25}.children[${i}]`, out);
62238
63651
  }
62239
63652
  }
62240
63653
  return out;
@@ -62656,7 +64069,7 @@ function extractNestedHrefBindFromProps(props2) {
62656
64069
  const bind2 = href.$bind;
62657
64070
  return bind2 && typeof bind2 === "object" ? bind2 : null;
62658
64071
  }
62659
- function findMissingLinkHrefs(node, blockId, fields3, path24 = "layout", repeatStack = []) {
64072
+ function findMissingLinkHrefs(node, blockId, fields3, path25 = "layout", repeatStack = []) {
62660
64073
  const errors = [];
62661
64074
  if (!node || typeof node !== "object") return errors;
62662
64075
  const n = node;
@@ -62685,21 +64098,21 @@ function findMissingLinkHrefs(node, blockId, fields3, path24 = "layout", repeatS
62685
64098
  if (isBoundToLinkField) {
62686
64099
  if (!hrefBind || !hrefFrom) {
62687
64100
  errors.push({
62688
- path: path24,
62689
- message: `Block "${blockId}": ${nodeType} node at ${path24} is bound to a link field but is missing props.href binding`,
64101
+ path: path25,
64102
+ message: `Block "${blockId}": ${nodeType} node at ${path25} is bound to a link field but is missing props.href binding`,
62690
64103
  suggestion: `Add props.href: { "$bind": { "from": "${bindFrom ?? "content.yourLinkField"}", "fallback": null, "transforms": [{ "id": "links.resolve" }] } }`
62691
64104
  });
62692
64105
  } else if (!bindingHasTransform(hrefBind, "links.resolve")) {
62693
64106
  errors.push({
62694
- path: path24,
62695
- message: `Block "${blockId}": ${nodeType} node at ${path24} has props.href binding but is missing transforms: [{id:"links.resolve"}]`,
64107
+ path: path25,
64108
+ message: `Block "${blockId}": ${nodeType} node at ${path25} has props.href binding but is missing transforms: [{id:"links.resolve"}]`,
62696
64109
  suggestion: `Set props.href.$bind.transforms to [{ "id": "links.resolve" }].`
62697
64110
  });
62698
64111
  }
62699
64112
  if (bindFrom && bindFieldType === "link" && !bindingHasTransform(bind2, "links.label")) {
62700
64113
  errors.push({
62701
- path: path24,
62702
- message: `Block "${blockId}": ${nodeType} node at ${path24} binds label from a link field but is missing links.label transform`,
64114
+ path: path25,
64115
+ message: `Block "${blockId}": ${nodeType} node at ${path25} binds label from a link field but is missing links.label transform`,
62703
64116
  suggestion: `Set node.$bind.transforms to [{ "id": "links.label" }] so the label renders as text.`
62704
64117
  });
62705
64118
  }
@@ -62712,7 +64125,7 @@ function findMissingLinkHrefs(node, blockId, fields3, path24 = "layout", repeatS
62712
64125
  n.children[i],
62713
64126
  blockId,
62714
64127
  fields3,
62715
- `${path24}.children[${i}]`,
64128
+ `${path25}.children[${i}]`,
62716
64129
  nextRepeatStack
62717
64130
  )
62718
64131
  );
@@ -62720,7 +64133,7 @@ function findMissingLinkHrefs(node, blockId, fields3, path24 = "layout", repeatS
62720
64133
  }
62721
64134
  return errors;
62722
64135
  }
62723
- function detectRedundantLinkLabels(node, blockId, fields3, path24 = "layout", repeatStack = []) {
64136
+ function detectRedundantLinkLabels(node, blockId, fields3, path25 = "layout", repeatStack = []) {
62724
64137
  const errors = [];
62725
64138
  if (!node || typeof node !== "object") return errors;
62726
64139
  const n = node;
@@ -62742,7 +64155,7 @@ function detectRedundantLinkLabels(node, blockId, fields3, path24 = "layout", re
62742
64155
  const redundancies = findRedundantLinkTextSiblings(
62743
64156
  children,
62744
64157
  nextRepeatStack,
62745
- path24
64158
+ path25
62746
64159
  );
62747
64160
  errors.push(
62748
64161
  ...redundancies.map((r) => ({
@@ -62759,7 +64172,7 @@ function detectRedundantLinkLabels(node, blockId, fields3, path24 = "layout", re
62759
64172
  n.children[i],
62760
64173
  blockId,
62761
64174
  fields3,
62762
- `${path24}.children[${i}]`,
64175
+ `${path25}.children[${i}]`,
62763
64176
  nextRepeatStack
62764
64177
  )
62765
64178
  );
@@ -62998,19 +64411,19 @@ function extractBlockIdFromSelector(selector) {
62998
64411
  const match = selector.match(/\[data-block=(["'])(custom\.[^"']+)\1\]/);
62999
64412
  return match?.[2] ?? null;
63000
64413
  }
63001
- function validateNodeType(nodeType, path24, ctx) {
64414
+ function validateNodeType(nodeType, path25, ctx) {
63002
64415
  if (!ALLOWED_NODE_TYPES.includes(
63003
64416
  nodeType
63004
64417
  )) {
63005
64418
  return {
63006
- path: `${path24}.type`,
63007
- message: `Block "${ctx.blockId}": Unknown node type "${nodeType}" at ${path24}`,
64419
+ path: `${path25}.type`,
64420
+ message: `Block "${ctx.blockId}": Unknown node type "${nodeType}" at ${path25}`,
63008
64421
  suggestion: `ALLOWED: ${ALLOWED_NODE_TYPES.slice(0, 10).join(", ")}... FIX: Replace "${nodeType}" with a valid node type.`
63009
64422
  };
63010
64423
  }
63011
64424
  return null;
63012
64425
  }
63013
- function validateTransforms(transforms, path24, ctx) {
64426
+ function validateTransforms(transforms, path25, ctx) {
63014
64427
  const errors = [];
63015
64428
  for (let i = 0; i < transforms.length; i++) {
63016
64429
  const transform = transforms[i];
@@ -63019,7 +64432,7 @@ function validateTransforms(transforms, path24, ctx) {
63019
64432
  transform.id
63020
64433
  )) {
63021
64434
  errors.push({
63022
- path: `${path24}.transforms[${i}].id`,
64435
+ path: `${path25}.transforms[${i}].id`,
63023
64436
  message: `Block "${ctx.blockId}": Unknown transform "${transform.id}"`,
63024
64437
  suggestion: `ALLOWED: ${ALLOWED_TRANSFORM_IDS.slice(0, 8).join(", ")}... FIX: Replace with a valid transform ID or remove.`
63025
64438
  });
@@ -63028,7 +64441,7 @@ function validateTransforms(transforms, path24, ctx) {
63028
64441
  }
63029
64442
  return errors;
63030
64443
  }
63031
- function validateBinding(bind2, path24, ctx) {
64444
+ function validateBinding(bind2, path25, ctx) {
63032
64445
  const errors = [];
63033
64446
  if ("from" in bind2 && typeof bind2.from === "string") {
63034
64447
  const bindPath = bind2.from;
@@ -63036,7 +64449,7 @@ function validateBinding(bind2, path24, ctx) {
63036
64449
  const fieldId = bindPath.replace("content.", "").split(".")[0] ?? "";
63037
64450
  if (fieldId && !ctx.fieldIds.has(fieldId)) {
63038
64451
  errors.push({
63039
- path: `${path24}.from`,
64452
+ path: `${path25}.from`,
63040
64453
  message: `Block "${ctx.blockId}": $bind references unknown field "${fieldId}"`,
63041
64454
  suggestion: `DEFINED FIELDS: ${Array.from(ctx.fieldIds).join(", ")}. FIX: Add field { id: '${fieldId}', type: '...' } or use existing field.`
63042
64455
  });
@@ -63044,31 +64457,31 @@ function validateBinding(bind2, path24, ctx) {
63044
64457
  }
63045
64458
  }
63046
64459
  if ("transforms" in bind2 && Array.isArray(bind2.transforms)) {
63047
- errors.push(...validateTransforms(bind2.transforms, path24, ctx));
64460
+ errors.push(...validateTransforms(bind2.transforms, path25, ctx));
63048
64461
  }
63049
64462
  return errors;
63050
64463
  }
63051
- function validateLayoutDeep(node, blockId, fields3, path24 = "layout") {
64464
+ function validateLayoutDeep(node, blockId, fields3, path25 = "layout") {
63052
64465
  const ctx = {
63053
64466
  blockId,
63054
64467
  fieldIds: collectFieldIds(fields3)
63055
64468
  };
63056
- return validateLayoutNode(node, path24, ctx);
64469
+ return validateLayoutNode(node, path25, ctx);
63057
64470
  }
63058
- function validateLayoutNode(node, path24, ctx) {
64471
+ function validateLayoutNode(node, path25, ctx) {
63059
64472
  const errors = [];
63060
64473
  if (!node || typeof node !== "object") {
63061
64474
  return errors;
63062
64475
  }
63063
64476
  const n = node;
63064
64477
  if ("type" in n && typeof n.type === "string") {
63065
- const typeError = validateNodeType(n.type, path24, ctx);
64478
+ const typeError = validateNodeType(n.type, path25, ctx);
63066
64479
  if (typeError) errors.push(typeError);
63067
64480
  }
63068
64481
  if ("$bind" in n && n.$bind && typeof n.$bind === "object") {
63069
64482
  const bindErrors = validateBinding(
63070
64483
  n.$bind,
63071
- `${path24}.$bind`,
64484
+ `${path25}.$bind`,
63072
64485
  ctx
63073
64486
  );
63074
64487
  errors.push(...bindErrors);
@@ -63076,7 +64489,7 @@ function validateLayoutNode(node, path24, ctx) {
63076
64489
  if ("props" in n && n.props && typeof n.props === "object") {
63077
64490
  const propsErrors = validatePropsBindings(
63078
64491
  n.props,
63079
- `${path24}.props`,
64492
+ `${path25}.props`,
63080
64493
  ctx
63081
64494
  );
63082
64495
  errors.push(...propsErrors);
@@ -63085,7 +64498,7 @@ function validateLayoutNode(node, path24, ctx) {
63085
64498
  for (let i = 0; i < n.children.length; i++) {
63086
64499
  const childErrors = validateLayoutNode(
63087
64500
  n.children[i],
63088
- `${path24}.children[${i}]`,
64501
+ `${path25}.children[${i}]`,
63089
64502
  ctx
63090
64503
  );
63091
64504
  errors.push(...childErrors);
@@ -63093,17 +64506,17 @@ function validateLayoutNode(node, path24, ctx) {
63093
64506
  }
63094
64507
  return errors;
63095
64508
  }
63096
- function validatePropsBindings(props2, path24, ctx) {
64509
+ function validatePropsBindings(props2, path25, ctx) {
63097
64510
  const errors = [];
63098
64511
  for (const [key, value] of Object.entries(props2)) {
63099
64512
  if (value && typeof value === "object" && "$bind" in value) {
63100
64513
  const bind2 = value.$bind;
63101
- const bindErrors = validateBinding(bind2, `${path24}.${key}.$bind`, ctx);
64514
+ const bindErrors = validateBinding(bind2, `${path25}.${key}.$bind`, ctx);
63102
64515
  errors.push(...bindErrors);
63103
64516
  } else if (value && typeof value === "object" && !Array.isArray(value)) {
63104
64517
  const nestedErrors = validatePropsBindings(
63105
64518
  value,
63106
- `${path24}.${key}`,
64519
+ `${path25}.${key}`,
63107
64520
  ctx
63108
64521
  );
63109
64522
  errors.push(...nestedErrors);
@@ -63236,7 +64649,7 @@ function collectUsedFieldRefs(node) {
63236
64649
  visit(node, []);
63237
64650
  return { topLevel, nestedByRepeater, itemNameByRepeater };
63238
64651
  }
63239
- function findMissingBindings(node, blockId, path24 = "layout") {
64652
+ function findMissingBindings(node, blockId, path25 = "layout") {
63240
64653
  const errors = [];
63241
64654
  if (!node || typeof node !== "object") {
63242
64655
  return errors;
@@ -63246,15 +64659,15 @@ function findMissingBindings(node, blockId, path24 = "layout") {
63246
64659
  if ("$repeat" in n && n.$repeat && typeof n.$repeat === "object") {
63247
64660
  if (nodeType && CONTENT_NODE_TYPES.includes(nodeType)) {
63248
64661
  errors.push({
63249
- path: path24,
63250
- message: `Block "${blockId}": ${nodeType} node at ${path24} uses $repeat, but content nodes cannot be repeat containers`,
64662
+ path: path25,
64663
+ message: `Block "${blockId}": ${nodeType} node at ${path25} uses $repeat, but content nodes cannot be repeat containers`,
63251
64664
  suggestion: `Move $repeat to a container node (grid/stack/div) and put a ${nodeType} child inside with $bind.from like "item.field".`
63252
64665
  });
63253
64666
  }
63254
64667
  if (!Array.isArray(n.children) || n.children.length === 0) {
63255
64668
  errors.push({
63256
- path: path24,
63257
- message: `Block "${blockId}": node at ${path24} uses $repeat but has no children to repeat`,
64669
+ path: path25,
64670
+ message: `Block "${blockId}": node at ${path25} uses $repeat but has no children to repeat`,
63258
64671
  suggestion: 'Add one or more child nodes under children[] that bind to the repeat item (e.g., $bind.from: "item.text").'
63259
64672
  });
63260
64673
  }
@@ -63263,15 +64676,15 @@ function findMissingBindings(node, blockId, path24 = "layout") {
63263
64676
  const hasBind = "$bind" in n && n.$bind && typeof n.$bind === "object" && "from" in n.$bind;
63264
64677
  if (Array.isArray(n.children) && n.children.length > 0) {
63265
64678
  errors.push({
63266
- path: path24,
63267
- message: `Block "${blockId}": ${nodeType} node at ${path24} has children, but content nodes must have children: null`,
64679
+ path: path25,
64680
+ message: `Block "${blockId}": ${nodeType} node at ${path25} has children, but content nodes must have children: null`,
63268
64681
  suggestion: `Replace this ${nodeType} with a container node (div/stack/inline) and put the ${nodeType} nodes inside it.`
63269
64682
  });
63270
64683
  }
63271
64684
  if (!hasBind) {
63272
64685
  errors.push({
63273
- path: `${path24}`,
63274
- message: `Block "${blockId}": ${nodeType} node at ${path24} has no $bind - it won't display any content`,
64686
+ path: `${path25}`,
64687
+ message: `Block "${blockId}": ${nodeType} node at ${path25} has no $bind - it won't display any content`,
63275
64688
  suggestion: `Add $bind: { from: "content.fieldName" } to connect this ${nodeType} to a field. Example: { "type": "${nodeType}", "$bind": { "from": "content.headline" } }`
63276
64689
  });
63277
64690
  }
@@ -63281,7 +64694,7 @@ function findMissingBindings(node, blockId, path24 = "layout") {
63281
64694
  const childErrors = findMissingBindings(
63282
64695
  n.children[i],
63283
64696
  blockId,
63284
- `${path24}.children[${i}]`
64697
+ `${path25}.children[${i}]`
63285
64698
  );
63286
64699
  errors.push(...childErrors);
63287
64700
  }
@@ -63298,13 +64711,13 @@ function getMaxDepth(node, currentDepth = 0) {
63298
64711
  );
63299
64712
  }
63300
64713
  var CONTAINER_NODE_TYPES = ["section", "stack", "grid", "div", "inline"];
63301
- function detectPotentialTruncation(node, maxAllowedDepth, currentDepth = 0, path24 = "layout") {
64714
+ function detectPotentialTruncation(node, maxAllowedDepth, currentDepth = 0, path25 = "layout") {
63302
64715
  if (!node || typeof node !== "object") return [];
63303
64716
  const n = node;
63304
64717
  const truncatedPaths = [];
63305
64718
  if (currentDepth === maxAllowedDepth && n.children === null) {
63306
64719
  if (CONTAINER_NODE_TYPES.includes(n.type || "")) {
63307
- truncatedPaths.push(`${path24} (${n.type} at depth ${currentDepth})`);
64720
+ truncatedPaths.push(`${path25} (${n.type} at depth ${currentDepth})`);
63308
64721
  }
63309
64722
  }
63310
64723
  if (n.children && Array.isArray(n.children)) {
@@ -63314,7 +64727,7 @@ function detectPotentialTruncation(node, maxAllowedDepth, currentDepth = 0, path
63314
64727
  child,
63315
64728
  maxAllowedDepth,
63316
64729
  currentDepth + 1,
63317
- `${path24}.children[${i}]`
64730
+ `${path25}.children[${i}]`
63318
64731
  )
63319
64732
  );
63320
64733
  });
@@ -63334,8 +64747,8 @@ function formatValidationFeedback(errors, output) {
63334
64747
  `The layout reached the maximum depth of ${MAX_LAYOUT_DEPTH} levels.`
63335
64748
  );
63336
64749
  lines.push("These container nodes at the depth limit have no children:");
63337
- for (const path24 of truncatedPaths) {
63338
- lines.push(` \u26A0\uFE0F ${path24}`);
64750
+ for (const path25 of truncatedPaths) {
64751
+ lines.push(` \u26A0\uFE0F ${path25}`);
63339
64752
  }
63340
64753
  lines.push("");
63341
64754
  lines.push(
@@ -63797,11 +65210,11 @@ var pass3bOutputSchema = z.object({
63797
65210
  customCssAtRules: z.array(llmMediaAtRuleSchema).nullable(),
63798
65211
  rationale: z.string()
63799
65212
  });
63800
- function getNodeAtPath(layout, path24) {
63801
- if (path24 === "" || path24 === "root" || path24 === "layout") {
65213
+ function getNodeAtPath(layout, path25) {
65214
+ if (path25 === "" || path25 === "root" || path25 === "layout") {
63802
65215
  return layout;
63803
65216
  }
63804
- let normalizedPath = path24;
65217
+ let normalizedPath = path25;
63805
65218
  if (normalizedPath.startsWith("layout.")) {
63806
65219
  normalizedPath = normalizedPath.slice(7);
63807
65220
  }
@@ -66130,6 +67543,147 @@ Examples:
66130
67543
  $ riverbankcms style apply --site-style-id site-style:calm-studio --base-selection-version 3 --palette-variant-id soft-natural-sage
66131
67544
  `).addCommand(listCommand8).addCommand(applyCommand);
66132
67545
 
67546
+ // src/cli/commands/webhooks.ts
67547
+ init_src();
67548
+ var RIVERBANK_WEBHOOK_SECRET_ENV = "RIVERBANK_WEBHOOK_SECRET";
67549
+ function isNodeError(error) {
67550
+ return error instanceof Error && "code" in error;
67551
+ }
67552
+ function ensureTrailingNewline(content) {
67553
+ return content.length > 0 && !content.endsWith("\n") ? `${content}
67554
+ ` : content;
67555
+ }
67556
+ function planEnvSecretPatch(existingContent, secret) {
67557
+ const line = `${RIVERBANK_WEBHOOK_SECRET_ENV}=${secret}`;
67558
+ if (existingContent === null) {
67559
+ return { tag: "create-file", nextContent: `${line}
67560
+ ` };
67561
+ }
67562
+ const pattern = new RegExp(`^${RIVERBANK_WEBHOOK_SECRET_ENV}=.*$`, "m");
67563
+ if (pattern.test(existingContent)) {
67564
+ const nextContent = existingContent.replace(pattern, line);
67565
+ return nextContent === existingContent ? { tag: "unchanged", nextContent } : { tag: "replace-key", nextContent };
67566
+ }
67567
+ return {
67568
+ tag: "append-key",
67569
+ nextContent: `${ensureTrailingNewline(existingContent)}${line}
67570
+ `
67571
+ };
67572
+ }
67573
+ async function readEnvFile(filePath) {
67574
+ try {
67575
+ return await fs5.readFile(filePath, "utf-8");
67576
+ } catch (error) {
67577
+ if (isNodeError(error) && error.code === "ENOENT") {
67578
+ return null;
67579
+ }
67580
+ throw error;
67581
+ }
67582
+ }
67583
+ async function writeEnvSecret(filePath, secret) {
67584
+ const existing = await readEnvFile(filePath);
67585
+ const plan = planEnvSecretPatch(existing, secret);
67586
+ if (plan.tag === "unchanged") {
67587
+ return { path: filePath, plan, written: false };
67588
+ }
67589
+ await fs5.writeFile(filePath, plan.nextContent, "utf-8");
67590
+ return { path: filePath, plan, written: true };
67591
+ }
67592
+ function hasSecret(result) {
67593
+ return result.dryRun === false && (result.action === "created" || result.action === "rotated");
67594
+ }
67595
+ function formatAction(action) {
67596
+ return action.split("_").join(" ");
67597
+ }
67598
+ function envPatchLabel(tag) {
67599
+ switch (tag) {
67600
+ case "create-file":
67601
+ return "created .env.local";
67602
+ case "append-key":
67603
+ return "added RIVERBANK_WEBHOOK_SECRET to .env.local";
67604
+ case "replace-key":
67605
+ return "updated RIVERBANK_WEBHOOK_SECRET in .env.local";
67606
+ case "unchanged":
67607
+ return "left .env.local unchanged";
67608
+ default:
67609
+ return assertNever(tag);
67610
+ }
67611
+ }
67612
+ function planHumanResultOutput(input) {
67613
+ const { result, envWrite, writeEnv } = input;
67614
+ const details = [`Action: ${formatAction(result.action)}`];
67615
+ if (result.endpoint) {
67616
+ details.push(`Endpoint: ${result.endpoint.name} (${result.endpoint.url})`);
67617
+ } else {
67618
+ details.push(`Endpoint: ${result.plannedEndpoint.name} (${result.plannedEndpoint.url})`);
67619
+ }
67620
+ if (envWrite) {
67621
+ details.push(`Env: ${envPatchLabel(envWrite.plan.tag)} at ${path5.relative(process.cwd(), envWrite.path)}`);
67622
+ } else if (hasSecret(result) && writeEnv) {
67623
+ details.push("Env: no local env file changes were made");
67624
+ }
67625
+ if (hasSecret(result) && !writeEnv) {
67626
+ details.push("", "One-time secret:", result.secret);
67627
+ }
67628
+ if (result.checklist.length > 0) {
67629
+ details.push("", "Next steps:");
67630
+ result.checklist.forEach((item, index) => {
67631
+ details.push(` ${index + 1}. ${item}`);
67632
+ });
67633
+ }
67634
+ return { summary: result.message, details };
67635
+ }
67636
+ function printHumanResult(input) {
67637
+ const { output, ...planInput } = input;
67638
+ const outputPlan = planHumanResultOutput(planInput);
67639
+ output.success(outputPlan.summary);
67640
+ outputPlan.details.forEach((line) => output.info(line));
67641
+ }
67642
+ var setupCommand = new Command("setup").description("Create or update the CMS-managed SDK revalidation webhook").requiredOption("--url <url>", "Public SDK revalidation URL, e.g. https://www.example.com/api/revalidate").option("--name <name>", "CMS webhook endpoint name").option("--rotate-secret", "Rotate the webhook secret and return the new one-time secret").option("--dry-run", "Show the planned CMS change without mutating webhooks or env files").option("--no-write-env", "Do not write returned one-time secrets to .env.local").option("--vercel", "Print Vercel env setup guidance").option("--yes", "Confirm remote mutations").addHelpText("after", `
67643
+ Examples:
67644
+ $ riverbankcms webhooks setup --url=https://www.example.com/api/revalidate
67645
+ $ riverbankcms webhooks setup --env=remote --url=https://www.example.com/api/revalidate --yes --vercel
67646
+ $ riverbankcms webhooks setup --url=https://www.example.com/api/revalidate --rotate-secret
67647
+ $ riverbankcms webhooks setup --url=https://www.example.com/api/revalidate --dry-run
67648
+ `).action(
67649
+ withErrorHandling(async (options, command) => {
67650
+ const ctx = createCommandContext(command);
67651
+ if (ctx.isRemote && options.dryRun !== true && options.yes !== true) {
67652
+ ctx.output.error("Remote webhook setup requires --yes", {
67653
+ suggestion: "Add --yes to confirm mutating the remote CMS webhook endpoint."
67654
+ });
67655
+ }
67656
+ const writeEnv = options.writeEnv !== false;
67657
+ const result = await ctx.client.webhooks.setupRevalidation({
67658
+ url: options.url,
67659
+ name: options.name,
67660
+ rotateSecret: options.rotateSecret,
67661
+ dryRun: options.dryRun,
67662
+ vercel: options.vercel
67663
+ });
67664
+ const envPath = path5.resolve(process.cwd(), ".env.local");
67665
+ const envWrite = hasSecret(result) && writeEnv && !result.dryRun ? await writeEnvSecret(envPath, result.secret) : null;
67666
+ if (ctx.isJsonOutput) {
67667
+ ctx.output.json({
67668
+ ...result,
67669
+ env: envWrite ? {
67670
+ path: envWrite.path,
67671
+ action: envWrite.plan.tag,
67672
+ written: envWrite.written
67673
+ } : null
67674
+ });
67675
+ return;
67676
+ }
67677
+ printHumanResult({
67678
+ output: ctx.output,
67679
+ result,
67680
+ envWrite,
67681
+ writeEnv
67682
+ });
67683
+ })
67684
+ );
67685
+ var webhooksCommand = new Command("webhooks").description("Webhook setup and maintenance").addCommand(setupCommand);
67686
+
66133
67687
  // src/cli/index.ts
66134
67688
  config({ path: ".env.local" });
66135
67689
  config({ path: ".env" });
@@ -66180,6 +67734,7 @@ program.addCommand(compareCommand);
66180
67734
  program.addCommand(eventCommand);
66181
67735
  program.addCommand(courseCommand2);
66182
67736
  program.addCommand(styleCommand);
67737
+ program.addCommand(webhooksCommand);
66183
67738
  program.addCommand(manifestCommand);
66184
67739
  program.addCommand(envCommand);
66185
67740
  program.addCommand(migrateCommand);