@riverbankcms/sdk 0.107.0 → 0.108.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 (159) hide show
  1. package/dist/{PreviewEditorSidebar-DpAbAl08.mjs → PreviewEditorSidebar-BBT-kZAM.mjs} +46 -11
  2. package/dist/{PreviewEditorUI-O7cn6Xxv.mjs → PreviewEditorUI-D69xNKT2.mjs} +10 -9
  3. package/dist/{PreviewQueryProvider-D0tnKl0t.mjs → PreviewQueryProvider-RRu7wyQ5.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-CVB7urtl.mjs → SdkPreviewModeRuntime-CuDjXH6o.mjs} +426 -72
  5. package/dist/{SiteChromeCustomizeContext-C_sizso-.mjs → SiteChromeCustomizeContext-BQUY2dEk.mjs} +3865 -544
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +3712 -220
  7. package/dist/_dts/api/src/blocks.d.ts +41 -7
  8. package/dist/_dts/api/src/bookingRecords.d.ts +180 -115
  9. package/dist/_dts/api/src/cache-tags.d.ts +3 -0
  10. package/dist/_dts/api/src/contentRuntime.d.ts +19 -1
  11. package/dist/_dts/api/src/endpoints.d.ts +99 -0
  12. package/dist/_dts/api/src/footer-settings.d.ts +1 -0
  13. package/dist/_dts/api/src/footerSettings.d.ts +8 -0
  14. package/dist/_dts/api/src/index.d.ts +5 -2
  15. package/dist/_dts/api/src/navigation/contracts.d.ts +3 -3
  16. package/dist/_dts/api/src/previewContentContract.d.ts +4 -0
  17. package/dist/_dts/api/src/sdkContracts.d.ts +62 -0
  18. package/dist/_dts/api/src/siteBanner.d.ts +2 -2
  19. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +143 -55
  20. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +7 -1
  21. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +41 -1
  22. package/dist/_dts/blocks/src/primitives/layout/Section.d.ts +0 -1
  23. package/dist/_dts/blocks/src/rendering/server.d.ts +1 -0
  24. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +50 -0
  25. package/dist/_dts/blocks/src/system/blocks/site-footer.d.ts +9 -48
  26. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  27. package/dist/_dts/blocks/src/system/icons/registry.d.ts +2 -1
  28. package/dist/_dts/blocks/src/system/icons/social.d.ts +5 -0
  29. package/dist/_dts/blocks/src/system/icons/svg.d.ts +1 -0
  30. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +2 -2
  31. package/dist/_dts/blocks/src/system/node/fragments/backgroundLayer.d.ts +13 -0
  32. package/dist/_dts/blocks/src/system/node/fragments/footerNav.d.ts +2 -0
  33. package/dist/_dts/blocks/src/system/node/fragments/styledContainer.d.ts +4 -4
  34. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +3 -12
  35. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +1 -1
  37. package/dist/_dts/blocks/src/system/types/link.d.ts +3 -3
  38. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +14 -0
  39. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +27 -8
  40. package/dist/_dts/content-editor/src/footerComposer.d.ts +56 -0
  41. package/dist/_dts/content-editor/src/hooks/useEntryActions.d.ts +1 -1
  42. package/dist/_dts/content-editor/src/hooks/useEntryMutations.d.ts +5 -5
  43. package/dist/_dts/content-editor/src/index.d.ts +2 -0
  44. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +3 -1
  45. package/dist/_dts/content-editor/src/services/contentEntryServices.d.ts +20 -36
  46. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +5 -1
  47. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +11 -0
  48. package/dist/_dts/content-model/src/content-types/schema.d.ts +1 -1
  49. package/dist/_dts/content-model/src/definitions/shared.d.ts +3 -0
  50. package/dist/_dts/core/src/branded.d.ts +3 -0
  51. package/dist/_dts/core/src/editor-state.d.ts +4 -0
  52. package/dist/_dts/core/src/footer-composition.d.ts +143 -0
  53. package/dist/_dts/core/src/index.d.ts +2 -0
  54. package/dist/_dts/core/src/public-profile.d.ts +73 -0
  55. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3043 -2941
  56. package/dist/_dts/db/src/schemas/forms.d.ts +10 -10
  57. package/dist/_dts/editor/src/primitives/rich-text/RichTextEditorSurface.d.ts +5 -0
  58. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +1 -0
  59. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +2 -1
  60. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +2 -1
  61. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +2 -1
  62. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +10 -0
  63. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +1 -0
  64. package/dist/_dts/path-utils/src/index.d.ts +5 -0
  65. package/dist/_dts/preview-next/src/client/preview/PreviewChromeLayer.d.ts +5 -0
  66. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -1
  67. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -0
  68. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -1
  69. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -1
  70. package/dist/_dts/preview-next/src/client/preview/previewErrorMessages.d.ts +4 -0
  71. package/dist/_dts/sdk/src/cli/content/reader.d.ts +1 -0
  72. package/dist/_dts/sdk/src/client/management/blocks.d.ts +14 -1
  73. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -0
  74. package/dist/_dts/sdk/src/client/management/types.d.ts +15 -1
  75. package/dist/_dts/sdk/src/config/content-types.d.ts +2 -0
  76. package/dist/_dts/sdk/src/config/content-validation.d.ts +4 -0
  77. package/dist/_dts/sdk/src/navigation/index.d.ts +2 -0
  78. package/dist/_dts/sdk/src/public-api/contracts.d.ts +3 -2
  79. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -1
  80. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +1 -1
  81. package/dist/_dts/sdk/src/version.d.ts +1 -1
  82. package/dist/_dts/site-commands/src/commands.d.ts +13 -10
  83. package/dist/_dts/theme-core/src/accordions/types.d.ts +2 -2
  84. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  85. package/dist/_dts/theme-core/src/buttons/personalities/two-tone-pill.d.ts +17 -0
  86. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  87. package/dist/_dts/theme-core/src/buttons/types.d.ts +3 -3
  88. package/dist/_dts/theme-core/src/cards/types.d.ts +3 -3
  89. package/dist/_dts/theme-core/src/footer/mode.d.ts +15 -0
  90. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  91. package/dist/_dts/theme-core/src/interactive/baseSchema.d.ts +1 -1
  92. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +36 -30
  93. package/dist/_dts/theme-core/src/navigation/types.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/schema.d.ts +1186 -34
  95. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +12 -1
  96. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +15 -0
  97. package/dist/cli/index.mjs +760 -374
  98. package/dist/client/{DiscountCodeDisclosure-BwGkvmVH.mjs → DiscountCodeDisclosure-D6TOf6Hi.mjs} +1 -1
  99. package/dist/client/{EventCombined.client-JnWE6Hzc.mjs → EventCombined.client-Dao3zxRk.mjs} +3 -3
  100. package/dist/client/{EventListing.client-DQewc_kg.mjs → EventListing.client-B2NNt4y1.mjs} +2 -2
  101. package/dist/client/{LeafletStaticMap-DPAU3SFt.mjs → LeafletStaticMap-BhwFo16w.mjs} +1 -1
  102. package/dist/client/{MagicLinkForm-D4kpWCbW.mjs → MagicLinkForm-BWnB7cMR.mjs} +2 -2
  103. package/dist/client/{StepIndicator-CBlkb4rA.mjs → StepIndicator-TzRiQ0BY.mjs} +2 -2
  104. package/dist/client/{accordion-DAIBVpTS.mjs → accordion-BPy-AJ4_.mjs} +1 -1
  105. package/dist/client/{bookingForm-DZ-4l5_1.mjs → bookingForm-BL4PGZds.mjs} +6 -6
  106. package/dist/client/bookings.mjs +143 -94
  107. package/dist/client/{buttons-DJgynGHQ.mjs → buttons-EBjyslaX.mjs} +144 -95
  108. package/dist/client/{carousel-D-SLfX8r.mjs → carousel-C2b7Cn9-.mjs} +1 -1
  109. package/dist/client/{cart-CEgbgJhX.mjs → cart-BQcbXIVD.mjs} +3 -3
  110. package/dist/client/{checkout-CXWrCRAA.mjs → checkout-DEmpGRJu.mjs} +3 -3
  111. package/dist/client/client.mjs +827 -434
  112. package/dist/client/{courseRegistration-DVmLrRVz.mjs → courseRegistration-BqRZPmsq.mjs} +7 -7
  113. package/dist/client/{eventCalendar-DCuyPY_c.mjs → eventCalendar-B8N_tSl5.mjs} +5 -5
  114. package/dist/client/{eventCombined-kP2CA2D4.mjs → eventCombined-Gjn6gtq7.mjs} +2 -2
  115. package/dist/client/{eventDetails-DU0LeF5e.mjs → eventDetails-M-VCxA-r.mjs} +3 -3
  116. package/dist/client/{eventListing-CcHF87BI.mjs → eventListing-DR19hqYi.mjs} +2 -2
  117. package/dist/client/{eventRegistration-DJnR0yFH.mjs → eventRegistration-BR02a0k3.mjs} +7 -7
  118. package/dist/client/{form-CH1lCusH.mjs → form-LY2xIbwg.mjs} +2 -2
  119. package/dist/client/{headerSection-CBPFZoku.mjs → headerSection-CYwwXJfh.mjs} +3 -3
  120. package/dist/client/hooks.mjs +377 -362
  121. package/dist/client/{locationMap-Cx1hBg5n.mjs → locationMap-DWnBXrFq.mjs} +2 -2
  122. package/dist/client/{newsletterForm-1ZL_ti9u.mjs → newsletterForm-D9s-fQ2P.mjs} +2 -2
  123. package/dist/client/{pricing-BIbzmV0G.mjs → pricing-DDq80oYc.mjs} +1 -1
  124. package/dist/client/{productDetail-BTh5gHBV.mjs → productDetail-B0SbWd45.mjs} +3 -3
  125. package/dist/client/{productList-Cc7OMrqN.mjs → productList-PwYlZn0y.mjs} +3 -3
  126. package/dist/client/{propsDecoder-oR-M-ISN.mjs → propsDecoder-BRWBiH7i.mjs} +33 -9
  127. package/dist/client/rendering/client.mjs +247 -40
  128. package/dist/client/rendering/islands.mjs +18 -18
  129. package/dist/client/rendering.mjs +478 -270
  130. package/dist/client/{shop-CQ_YbCnn.mjs → shop-CMwZPYME.mjs} +6 -6
  131. package/dist/client/{shop-commerce-BM-AoD3M.mjs → shop-commerce-BuxsFate.mjs} +5 -5
  132. package/dist/client/{shop-commerce-store-DFMQhU5p.mjs → shop-commerce-store-boYlEJ91.mjs} +1 -1
  133. package/dist/client/{shopShared-D0SKO2Cu.mjs → shopShared-D2naaOes.mjs} +2 -2
  134. package/dist/client/{useDiscountCodeUi-CrG4_ARt.mjs → useDiscountCodeUi-D9RHpVoj.mjs} +1 -1
  135. package/dist/client/{useEventFilters-CxK8Fekl.mjs → useEventFilters-igGiK1re.mjs} +3 -3
  136. package/dist/client/{usePolling-jcVryNgZ.mjs → usePolling-CI7MbsFB.mjs} +2 -2
  137. package/dist/preview-next/before-render.mjs +178 -0
  138. package/dist/preview-next/client/runtime.mjs +4 -4
  139. package/dist/preview-next/middleware.mjs +178 -0
  140. package/dist/{previewAuthStore-BPcJPzdz.mjs → previewAuthStore-a_cBD28m.mjs} +178 -0
  141. package/dist/{sdk-runtime-C39Rsk-x.mjs → sdk-runtime-MBzD-GmP.mjs} +2 -2
  142. package/dist/{separator-BoMSQnsP.mjs → separator-5ahRBC85.mjs} +1 -1
  143. package/dist/server/components.mjs +556 -366
  144. package/dist/server/config-validation.mjs +384 -363
  145. package/dist/server/config.mjs +384 -364
  146. package/dist/server/data.mjs +377 -362
  147. package/dist/server/index.mjs +179 -1
  148. package/dist/server/navigation.mjs +9 -3
  149. package/dist/server/next.mjs +1384 -995
  150. package/dist/server/page-converter.mjs +368 -355
  151. package/dist/server/prebuild.mjs +1 -1
  152. package/dist/server/rendering/server.mjs +539 -360
  153. package/dist/server/rendering.mjs +556 -366
  154. package/dist/server/routing.mjs +613 -543
  155. package/dist/server/server.mjs +554 -361
  156. package/dist/server/theme-bridge.mjs +189 -98
  157. package/dist/server/theme.mjs +161 -95
  158. package/dist/styles/index.css +7 -1
  159. package/package.json +1 -1
@@ -987,7 +987,7 @@ function mqBetween(minPx, maxPx) {
987
987
  return `${mqUp(minPx)} and ${mqDown(maxPx)}`;
988
988
  }
989
989
  const MQ_SM_UP = mqUp(640);
990
- mqUp(768);
990
+ const MQ_MD_UP = mqUp(768);
991
991
  const MQ_LG_UP = mqUp(BREAKPOINT_LG);
992
992
  mqUp(BREAKPOINT_XL);
993
993
  const MQ_SM_DOWN = mqDown(639);
@@ -9944,104 +9944,153 @@ const showtimePill = defineButtonPersonality({
9944
9944
  }
9945
9945
  });
9946
9946
  //#endregion
9947
- //#region ../theme-core/src/buttons/personalities/index.ts
9948
- const buttonPersonalities = [
9949
- defineButtonPersonality({
9950
- id: "soft-pill",
9951
- name: "Soft Pill",
9952
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
9953
- tags: {
9954
- tone: "classic",
9955
- energy: "calm",
9956
- motion: "subtle",
9957
- era: "organic"
9947
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
9948
+ /**
9949
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
9950
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
9951
+ */
9952
+ const softPill = defineButtonPersonality({
9953
+ id: "soft-pill",
9954
+ name: "Soft Pill",
9955
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
9956
+ tags: {
9957
+ tone: "classic",
9958
+ energy: "calm",
9959
+ motion: "subtle",
9960
+ era: "organic"
9961
+ },
9962
+ buttonSystem: {
9963
+ global: {
9964
+ cornerStyle: "pill",
9965
+ shadow: "low",
9966
+ textTransform: "none",
9967
+ fontWeight: 500,
9968
+ borderWidth: 2,
9969
+ hoverTransform: "lift",
9970
+ hoverColor: "none"
9958
9971
  },
9959
- buttonSystem: {
9960
- global: {
9961
- cornerStyle: "pill",
9962
- shadow: "low",
9963
- textTransform: "none",
9964
- fontWeight: 500,
9965
- borderWidth: 2,
9966
- hoverTransform: "lift",
9967
- hoverColor: "none"
9968
- },
9969
- variants: [
9970
- {
9971
- id: "primary",
9972
- name: "Primary",
9973
- enabled: true,
9974
- priority: 1,
9975
- background: {
9976
- type: "solid",
9977
- colorToken: "primary"
9978
- },
9979
- textColorToken: "primaryForeground",
9980
- borderRadius: "rounded-full",
9981
- shadow: {
9982
- elevation: "low",
9983
- softness: "soft",
9984
- position: "bottom"
9985
- },
9986
- effects: {
9987
- hover: [{
9988
- effectId: "lift",
9989
- options: { translateY: "-1px" }
9990
- }],
9991
- active: [{
9992
- effectId: "scale-down",
9993
- options: { scale: "0.98" }
9994
- }]
9995
- }
9996
- },
9997
- {
9998
- id: "secondary",
9999
- name: "Secondary",
10000
- enabled: true,
10001
- priority: 2,
10002
- background: { type: "transparent" },
10003
- textColorToken: "primary",
10004
- borderRadius: "rounded-full",
10005
- border: {
10006
- widthClass: "border-2",
10007
- colorToken: "primary"
10008
- },
10009
- effects: { hover: [{
10010
- effectId: "background-on-hover",
10011
- options: { colorToken: "surface" }
10012
- }] }
9972
+ variants: [
9973
+ {
9974
+ id: "primary",
9975
+ name: "Primary",
9976
+ enabled: true,
9977
+ priority: 1,
9978
+ background: {
9979
+ type: "solid",
9980
+ colorToken: "primary"
10013
9981
  },
10014
- {
10015
- id: "outline",
10016
- name: "Outline",
10017
- enabled: true,
10018
- priority: 3,
10019
- background: { type: "transparent" },
10020
- textColorToken: "text",
10021
- borderRadius: "rounded-full",
10022
- border: {
10023
- widthClass: "border",
10024
- colorToken: "border"
10025
- },
10026
- effects: { hover: [{
10027
- effectId: "background-on-hover",
10028
- options: { colorToken: "surface" }
10029
- }] }
9982
+ textColorToken: "primaryForeground",
9983
+ borderRadius: "rounded-full",
9984
+ shadow: {
9985
+ elevation: "low",
9986
+ softness: "soft",
9987
+ position: "bottom"
10030
9988
  },
10031
- {
10032
- id: "ghost",
10033
- name: "Ghost",
10034
- enabled: true,
10035
- priority: 3,
10036
- background: { type: "transparent" },
10037
- textColorToken: "text",
10038
- borderRadius: "rounded-full",
10039
- effects: { hover: [{
10040
- effectId: "background-on-hover",
10041
- options: { colorToken: "surface" }
10042
- }] }
9989
+ effects: {
9990
+ hover: [{
9991
+ effectId: "lift",
9992
+ options: { translateY: "-1px" }
9993
+ }],
9994
+ active: [{
9995
+ effectId: "scale-down",
9996
+ options: { scale: "0.98" }
9997
+ }]
10043
9998
  }
10044
- ]
9999
+ },
10000
+ {
10001
+ id: "secondary",
10002
+ name: "Secondary",
10003
+ enabled: true,
10004
+ priority: 2,
10005
+ background: { type: "transparent" },
10006
+ textColorToken: "primary",
10007
+ borderRadius: "rounded-full",
10008
+ border: {
10009
+ widthClass: "border-2",
10010
+ colorToken: "primary"
10011
+ },
10012
+ effects: { hover: [{
10013
+ effectId: "background-on-hover",
10014
+ options: { colorToken: "surface" }
10015
+ }] }
10016
+ },
10017
+ {
10018
+ id: "outline",
10019
+ name: "Outline",
10020
+ enabled: true,
10021
+ priority: 3,
10022
+ background: { type: "transparent" },
10023
+ textColorToken: "text",
10024
+ borderRadius: "rounded-full",
10025
+ border: {
10026
+ widthClass: "border",
10027
+ colorToken: "border"
10028
+ },
10029
+ effects: { hover: [{
10030
+ effectId: "background-on-hover",
10031
+ options: { colorToken: "surface" }
10032
+ }] }
10033
+ },
10034
+ {
10035
+ id: "ghost",
10036
+ name: "Ghost",
10037
+ enabled: true,
10038
+ priority: 3,
10039
+ background: { type: "transparent" },
10040
+ textColorToken: "text",
10041
+ borderRadius: "rounded-full",
10042
+ effects: { hover: [{
10043
+ effectId: "background-on-hover",
10044
+ options: { colorToken: "surface" }
10045
+ }] }
10046
+ }
10047
+ ]
10048
+ }
10049
+ });
10050
+ //#endregion
10051
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
10052
+ const solidSecondary = {
10053
+ id: "secondary",
10054
+ name: "Secondary",
10055
+ enabled: true,
10056
+ priority: 2,
10057
+ background: {
10058
+ type: "solid",
10059
+ colorToken: "secondary"
10060
+ },
10061
+ textColorToken: "onSecondary",
10062
+ borderRadius: "rounded-full",
10063
+ shadow: {
10064
+ elevation: "none",
10065
+ softness: null,
10066
+ position: "bottom"
10067
+ },
10068
+ effects: {
10069
+ hover: [{
10070
+ effectId: "background-on-hover-alpha",
10071
+ options: {
10072
+ colorToken: "secondary",
10073
+ opacity: 88
10074
+ }
10075
+ }],
10076
+ active: [{
10077
+ effectId: "scale-down",
10078
+ options: { scale: "0.98" }
10079
+ }]
10080
+ }
10081
+ };
10082
+ //#endregion
10083
+ //#region ../theme-core/src/buttons/personalities/index.ts
10084
+ const buttonPersonalities = [
10085
+ softPill,
10086
+ defineButtonPersonality({
10087
+ id: "two-tone-pill",
10088
+ name: "Two-tone Pill",
10089
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
10090
+ tags: softPill.tags,
10091
+ buttonSystem: {
10092
+ ...softPill.buttonSystem,
10093
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
10045
10094
  }
10046
10095
  }),
10047
10096
  earthPill,
@@ -10665,7 +10714,7 @@ const overlayLogoAccommodations = [
10665
10714
  * optional nested styling fields that would otherwise leak from another Look.
10666
10715
  */
10667
10716
  function baseHeader(theme) {
10668
- const { navLinkStyle: _navLinkStyle, navTypography: _navTypography, navTextSize: _navTextSize, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
10717
+ const { navLinkStyle: _navLinkStyle, navFontRole: _navFontRole, navTypography: _navTypography, navTextSize: _navTextSize, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
10669
10718
  return {
10670
10719
  ...header,
10671
10720
  navContainer: {
@@ -10814,6 +10863,17 @@ const headerStyleCatalog = defineExactCatalog()([
10814
10863
  navTypography: "brand-caps",
10815
10864
  moods: ["expressive"]
10816
10865
  },
10866
+ {
10867
+ id: asHeaderStyleId("brand-capsule"),
10868
+ label: "Brand Capsule",
10869
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
10870
+ supportedLayoutIds: supportedLayouts(["classic"]),
10871
+ navInteraction: "pill-background",
10872
+ surface: "brand-solid",
10873
+ defaultDepth: "shadow",
10874
+ navTypography: "quiet-caps",
10875
+ moods: ["expressive", "professional"]
10876
+ },
10817
10877
  {
10818
10878
  id: asHeaderStyleId("serif-line"),
10819
10879
  label: "Serif Line",
@@ -10907,6 +10967,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
10907
10967
  "brand-bar",
10908
10968
  "brand-underline",
10909
10969
  "brand-pill",
10970
+ "brand-capsule",
10910
10971
  "serif-line",
10911
10972
  "flat-tabs"
10912
10973
  ])],
@@ -10944,6 +11005,11 @@ headerStyleRepairChain([
10944
11005
  "brand-pill",
10945
11006
  "brand-bar",
10946
11007
  "minimal"
11008
+ ]), headerStyleRepairChain([
11009
+ "brand-capsule",
11010
+ "brand-pill",
11011
+ "brand-bar",
11012
+ "minimal"
10947
11013
  ]), headerStyleRepairChain([
10948
11014
  "pill-nav",
10949
11015
  "soft-bar",
@@ -14881,7 +14947,7 @@ function generateVariantCSS(variant, themeId, tokens, theme) {
14881
14947
  rules.push(`display: flex`);
14882
14948
  rules.push(`flex-direction: column`);
14883
14949
  rules.push(`position: relative`);
14884
- rules.push(`overflow: hidden`);
14950
+ rules.push(`overflow: visible`);
14885
14951
  const mediaRadius = MEDIA_CORNER_MAP[corners];
14886
14952
  const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
14887
14953
  const contentRules = [`padding: ${CONTENT_PADDING_MAP[variant.spacing] || CONTENT_PADDING_MAP.comfortable}`];
@@ -16405,6 +16471,7 @@ const navFontWeight = z$1.enum([
16405
16471
  "bold"
16406
16472
  ]);
16407
16473
  const headerMaxWidth = z$1.enum(["container", "full"]);
16474
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
16408
16475
  const headerContainerSchema = z$1.object({
16409
16476
  rounded: z$1.enum([
16410
16477
  "none",
@@ -16549,6 +16616,7 @@ const headerSchema = z$1.object({
16549
16616
  positioning: headerPositioning,
16550
16617
  shrinkOnScroll: z$1.boolean(),
16551
16618
  maxWidth: headerMaxWidth,
16619
+ barFrame: headerBarFrame.optional(),
16552
16620
  logoOverride: mediaSchema$1.nullable().optional(),
16553
16621
  background: headerBackgroundSchema.default({
16554
16622
  type: "color",
@@ -16558,6 +16626,7 @@ const headerSchema = z$1.object({
16558
16626
  navStyle: headerNavStyle,
16559
16627
  navColor: themeColorTokenSchema.nullable().optional(),
16560
16628
  navWeight: navFontWeight.default("medium"),
16629
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
16561
16630
  navTypography: z$1.enum(["body", "heading"]).optional(),
16562
16631
  navTextSize: navLinkStyleSchema.shape.textSize,
16563
16632
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -16573,7 +16642,21 @@ const headerSchema = z$1.object({
16573
16642
  ctaTreatment: headerCtaTreatmentSchema.optional(),
16574
16643
  ctaVariant: z$1.string().min(1).optional(),
16575
16644
  dropdownStyle: dropdownStyleSchema
16576
- });
16645
+ }).transform(normaliseHeaderNavFontRole);
16646
+ /**
16647
+ * Normalises the legacy `navTypography` font-role alias into the canonical
16648
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
16649
+ * a data migration. `navFontRole` always wins when both are present; the legacy
16650
+ * field is dropped so we never carry a dual write forward.
16651
+ */
16652
+ function normaliseHeaderNavFontRole(header) {
16653
+ if (header.navTypography === void 0) return header;
16654
+ const { navTypography, ...rest } = header;
16655
+ return header.navFontRole === void 0 ? {
16656
+ ...rest,
16657
+ navFontRole: navTypography
16658
+ } : rest;
16659
+ }
16577
16660
  const footerVariant = z$1.enum([
16578
16661
  "simple",
16579
16662
  "columns",
@@ -17607,6 +17690,7 @@ const curatedSiteStyles = [
17607
17690
  ],
17608
17691
  buttonPersonalityChoices: [
17609
17692
  buttonChoice("soft-pill"),
17693
+ buttonChoice("two-tone-pill"),
17610
17694
  buttonChoice("pebble"),
17611
17695
  buttonChoice("editorial-link"),
17612
17696
  buttonChoice("brushed-wash")
@@ -18786,6 +18870,7 @@ const curatedSiteStyles = [
18786
18870
  ],
18787
18871
  buttonPersonalityChoices: [
18788
18872
  buttonChoice("quiet-arrow"),
18873
+ buttonChoice("two-tone-pill"),
18789
18874
  buttonChoice("flat-ink"),
18790
18875
  buttonChoice("editorial-link")
18791
18876
  ],
@@ -18995,6 +19080,21 @@ function toSiteChromeBackgroundColorTokens(tokenNames) {
18995
19080
  }
18996
19081
  //#endregion
18997
19082
  //#region ../theme-core/src/site-styles/siteChromeNavPreferences.ts
19083
+ /**
19084
+ * Applies the user's nav font-role/size overrides on top of a style-resolved
19085
+ * nav link style. This is where the precedence contract lands:
19086
+ *
19087
+ * - The nav typography TREATMENT (case/tracking identity: plain / heading /
19088
+ * quiet-caps / brand-caps) is ALWAYS owned by the active header style and is
19089
+ * baked into `style` before this call (see `applyNavTypography` in
19090
+ * headerLooks.ts).
19091
+ * - Each treatment resolves through a DEFAULT font role: `heading` resolves
19092
+ * through the heading role; `plain` / `quiet-caps` / `brand-caps` resolve
19093
+ * through the body role.
19094
+ * - The user's `navFontRole` (surfaced here as `preferences.typography`) only
19095
+ * overrides which font ROLE the treatment resolves through. It never changes
19096
+ * the treatment. `'inherit'` keeps the treatment's default role.
19097
+ */
18998
19098
  function mergeHeaderNavTypographyPreference(style, preferences) {
18999
19099
  return preferences.typography === "inherit" && preferences.fontSize === "inherit" ? style : {
19000
19100
  ...style,
@@ -20029,6 +20129,7 @@ function devValidate(node) {
20029
20129
  }
20030
20130
  //#endregion
20031
20131
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
20132
+ const BACKGROUND_FRAME_BASE_CLASS = "rb-background-frame rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-isolate rb-pointer-events-none";
20032
20133
  /**
20033
20134
  * Creates background layer nodes for rendering backgrounds from field data.
20034
20135
  *
@@ -20094,6 +20195,34 @@ function backgroundLayer(path, options = {}) {
20094
20195
  ];
20095
20196
  }
20096
20197
  /**
20198
+ * Wrap decorative background layers in their own clipping frame.
20199
+ *
20200
+ * Foreground content remains outside this frame, so editor outlines, focus
20201
+ * rings, and floating controls are never clipped by a visual background.
20202
+ * Backgrounds that explicitly opt into overflow keep that behavior within
20203
+ * the decorative layer rather than changing the content root.
20204
+ */
20205
+ function backgroundFrame(path, options = {}) {
20206
+ const { leadingNodes = [], ...layerOptions } = options;
20207
+ const framedLayerOptions = {
20208
+ ...layerOptions,
20209
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
20210
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
20211
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
20212
+ };
20213
+ return el("div", {
20214
+ className: { $bind: {
20215
+ from: path,
20216
+ transforms: [{
20217
+ id: "background.resolveFrameClassName",
20218
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
20219
+ }],
20220
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
20221
+ } },
20222
+ style: { borderRadius: "inherit" }
20223
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
20224
+ }
20225
+ /**
20097
20226
  * Creates a media node for rendering background image/video media with conditional rendering.
20098
20227
  *
20099
20228
  * This helper creates a media element that:
@@ -20255,8 +20384,8 @@ function sectionContainer(children, opts) {
20255
20384
  * - content
20256
20385
  */
20257
20386
  function styledContainer(config) {
20258
- const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-hidden", imageClassName = "rb-absolute rb-z-neg-10", constrainWidth = true } = config;
20259
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
20387
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
20388
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
20260
20389
  const childrenArray = Array.isArray(children) ? children : [children];
20261
20390
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
20262
20391
  return el(rootType, {
@@ -20279,7 +20408,7 @@ function styledContainer(config) {
20279
20408
  }],
20280
20409
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
20281
20410
  } }
20282
- }, [...backgroundNodes, ...childrenArray]);
20411
+ }, [backgroundNode, ...childrenArray]);
20283
20412
  }
20284
20413
  //#endregion
20285
20414
  //#region ../blocks/src/system/spacing.ts
@@ -20412,7 +20541,7 @@ const DEFAULT_SECTION_SPACING = "medium";
20412
20541
  * - Creating a section wrapper with background theme
20413
20542
  * - Adding background color/gradient/image layers
20414
20543
  * - Binding className to section styles with transform
20415
- * - Binding allowOverflow for background positioning
20544
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
20416
20545
  * - Wrapping content children
20417
20546
  *
20418
20547
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -20448,8 +20577,8 @@ const DEFAULT_SECTION_SPACING = "medium";
20448
20577
  * });
20449
20578
  */
20450
20579
  function styledSection(config) {
20451
- const { children, baseClass = "rb-px-6", spacing = DEFAULT_SECTION_SPACING, background = "background", bindFrom = "_sectionStyles", imageClassName = "rb-absolute rb-z-neg-10", renderBackgroundImage = true, backgroundImageLoading, backgroundImageFetchPriority, allowOverflow = false, fullWidthPath } = config;
20452
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
20580
+ const { children, baseClass = "rb-px-6", spacing = DEFAULT_SECTION_SPACING, background = "background", bindFrom = "_sectionStyles", imageClassName = "rb-absolute rb-z-0", renderBackgroundImage = true, backgroundImageLoading, backgroundImageFetchPriority, fullWidthPath } = config;
20581
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
20453
20582
  imageClassName,
20454
20583
  fallbackToken: background,
20455
20584
  omitImageLayer: !renderBackgroundImage,
@@ -20472,13 +20601,8 @@ function styledSection(config) {
20472
20601
  fullWidthPath
20473
20602
  }
20474
20603
  }]
20475
- } },
20476
- allowOverflow: allowOverflow ? true : { $bind: {
20477
- from: `${bindFrom}.background`,
20478
- transforms: [{ id: "background.resolveAllowOverflow" }],
20479
- fallback: false
20480
20604
  } }
20481
- }, [...renderedBackgroundNodes, ...childrenArray]);
20605
+ }, [renderedBackgroundNode, ...childrenArray]);
20482
20606
  }
20483
20607
  //#endregion
20484
20608
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -21339,9 +21463,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
21339
21463
  //#endregion
21340
21464
  //#region ../blocks/src/system/node/fragments/styledCard.ts
21341
21465
  function styledCard(children, opts, ...mods) {
21342
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
21343
- const defaultBackgroundLayer = el("div", { className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface" });
21344
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
21466
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
21467
+ const defaultBackgroundLayer = el("div", {
21468
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
21469
+ style: { borderRadius: "inherit" }
21470
+ });
21471
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
21345
21472
  const style = {
21346
21473
  ...opts.style ?? {},
21347
21474
  borderColor: { $bind: {
@@ -21368,7 +21495,7 @@ function styledCard(children, opts, ...mods) {
21368
21495
  ...style ? { style } : {}
21369
21496
  }, [
21370
21497
  defaultBackgroundLayer,
21371
- ...backgroundNodes,
21498
+ backgroundNode,
21372
21499
  ...children
21373
21500
  ], ...mods);
21374
21501
  }
@@ -22241,7 +22368,7 @@ function buildTestimonialCard(...mods) {
22241
22368
  }, props({ value: "“" })), richText({ className: "rb-prose rb-max-w-none" }, bind("testimonial.content.body"), when("testimonial.content.body"))]), el("div", { className: "rb-testimonial-attribution" }, buildAttributionNodes())])], {
22242
22369
  stylesFrom: "content._cardStyles",
22243
22370
  backgroundFrom: "content._cardStyles.background",
22244
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
22371
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
22245
22372
  }, ...mods);
22246
22373
  }
22247
22374
  /**
@@ -22969,7 +23096,7 @@ function createFaqAccordionLayout(options = {}) {
22969
23096
  options: {
22970
23097
  axis: "all",
22971
23098
  includeSpacing: false,
22972
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
23099
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
22973
23100
  }
22974
23101
  }]
22975
23102
  },
@@ -24301,7 +24428,6 @@ function splitLayoutWith(children) {
24301
24428
  }
24302
24429
  }),
24303
24430
  renderBackgroundImage: false,
24304
- allowOverflow: true,
24305
24431
  baseClass: ""
24306
24432
  });
24307
24433
  }
@@ -24929,7 +25055,7 @@ function postCard(children, ...mods) {
24929
25055
  return styledCard(children, {
24930
25056
  stylesFrom: "content._cardStyles",
24931
25057
  backgroundFrom: "content._cardStyles.background",
24932
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
25058
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
24933
25059
  }, ...mods);
24934
25060
  }
24935
25061
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -24965,7 +25091,7 @@ const stackPostCard = styledCard([inline({
24965
25091
  ])])], {
24966
25092
  stylesFrom: "content._cardStyles",
24967
25093
  backgroundFrom: "content._cardStyles.background",
24968
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
25094
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
24969
25095
  }, repeat("data.posts", "post"));
24970
25096
  const emptyState$2 = {
24971
25097
  ...styledCard([text({
@@ -24974,7 +25100,7 @@ const emptyState$2 = {
24974
25100
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
24975
25101
  stylesFrom: "content._cardStyles",
24976
25102
  backgroundFrom: "content._cardStyles.background",
24977
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
25103
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
24978
25104
  }),
24979
25105
  $when: {
24980
25106
  when: { from: "data.posts[0]" },
@@ -24984,7 +25110,7 @@ const emptyState$2 = {
24984
25110
  function blogListingShell(children) {
24985
25111
  return styledSection({
24986
25112
  children: styledContainer({
24987
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
25113
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
24988
25114
  children
24989
25115
  }),
24990
25116
  baseClass: ""
@@ -25418,7 +25544,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
25418
25544
  const formSurface = styledContainer({
25419
25545
  bindFrom: "_containerStyles",
25420
25546
  constrainWidth: false,
25421
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
25547
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
25422
25548
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
25423
25549
  });
25424
25550
  function createFormLayout(variant) {
@@ -26695,6 +26821,7 @@ const headerRootClassTransform = {
26695
26821
  ];
26696
26822
  const variant = header?.variant;
26697
26823
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
26824
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
26698
26825
  return joinClasses$2(classes);
26699
26826
  }
26700
26827
  };
@@ -27251,7 +27378,7 @@ function markEditableSurfaceForwarding(component) {
27251
27378
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
27252
27379
  //#endregion
27253
27380
  //#region ../blocks/src/system/blocks/site-header.ts
27254
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
27381
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
27255
27382
  ...node,
27256
27383
  $when: {
27257
27384
  when: {
@@ -27279,7 +27406,7 @@ const logoRow = link({
27279
27406
  text({
27280
27407
  as: "strong",
27281
27408
  className: "header-logo-text rb-truncate"
27282
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27409
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27283
27410
  ]);
27284
27411
  const centeredLogoRow = link({
27285
27412
  href: "/",
@@ -27299,7 +27426,7 @@ const centeredLogoRow = link({
27299
27426
  text({
27300
27427
  as: "strong",
27301
27428
  className: "header-logo-text"
27302
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27429
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27303
27430
  ]);
27304
27431
  const createNavRow = (className, align = "end") => navRow({
27305
27432
  className: `${className} header-nav-row`,
@@ -27431,7 +27558,7 @@ const classicLayout = inline({
27431
27558
  logoRow,
27432
27559
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
27433
27560
  headerCta
27434
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
27561
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
27435
27562
  const classicCenteredNavLayout = inline({
27436
27563
  className: bindProp("$root.theme.header.maxWidth", {
27437
27564
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -27442,7 +27569,7 @@ const classicCenteredNavLayout = inline({
27442
27569
  logoRow,
27443
27570
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
27444
27571
  headerCta
27445
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
27572
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
27446
27573
  const centeredLayout = stack({
27447
27574
  gap: "md",
27448
27575
  align: "center",
@@ -27505,7 +27632,6 @@ const siteHeaderManifest = createBlockManifest({
27505
27632
  transforms: pipe(tx("layout.headerSectionBackground")),
27506
27633
  fallback: "background"
27507
27634
  }),
27508
- allowOverflow: true,
27509
27635
  className: bindProp("$root.theme.header", {
27510
27636
  transforms: pipe(tx("layout.headerRootClass")),
27511
27637
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -27556,218 +27682,154 @@ const footerNavGroupsLayout = stack({
27556
27682
  linkRequired: true,
27557
27683
  target: { $bind: { from: "entry.target" } },
27558
27684
  rel: { $bind: { from: "entry.rel" } }
27559
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
27685
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
27560
27686
  //#endregion
27561
27687
  //#region ../blocks/src/system/blocks/site-footer.ts
27562
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
27563
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
27564
- ...node,
27565
- $when: {
27566
- when: {
27567
- from,
27568
- transforms: [{ id: transformId }]
27569
- },
27570
- equals
27571
- }
27572
- });
27573
- const bottomBarTextLayout = () => {
27574
- const bottomTextNode = footerTextLayout()[1];
27575
- return bottomTextNode ? [bottomTextNode] : [];
27576
- };
27577
- const bodyTextLayout = () => {
27578
- const bodyTextNode = footerTextLayout()[0];
27579
- return bodyTextNode ? [bodyTextNode] : [];
27580
- };
27581
- const businessAddressLayout = () => [text({
27582
- as: "p",
27583
- className: "rb-caption rb-opacity-80"
27584
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
27585
- const inlineBottomTextLayout = () => {
27586
- const bottomTextNode = footerTextLayout()[1];
27587
- if (!bottomTextNode) return [];
27588
- return [when("$root.theme.footer.bottomBar.enabled", {
27589
- equals: true,
27590
- not: true
27591
- })(bottomTextNode)];
27592
- };
27593
- const simpleFooterLayout = stack({
27594
- gap: "md",
27595
- align: "start",
27596
- className: { $bind: {
27597
- from: "$root.theme.footer",
27598
- transforms: [{ id: "layout.footerSimpleRootClass" }],
27599
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
27600
- } }
27601
- }, [
27602
- link({
27603
- href: "/",
27604
- className: { $bind: {
27605
- from: "$root.theme.footer.logo",
27606
- transforms: [{
27607
- id: "layout.footerLogoClass",
27608
- options: { requireExplicitShow: true }
27609
- }],
27610
- fallback: "rb-hidden"
27611
- } }
27612
- }, [
27613
- media({ className: { $bind: {
27614
- from: "$root.theme.footer.logo",
27615
- transforms: [{ id: "layout.footerLogoMediaClass" }],
27616
- fallback: "rb-w-auto"
27617
- } } }, when("content.logo"), bind("content.logo")),
27618
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
27619
- from: "$root.theme.footer.logo",
27620
- transforms: [{ id: "layout.footerLogoMediaClass" }],
27621
- fallback: "rb-w-auto"
27622
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
27623
- text({
27624
- as: "strong",
27625
- className: "footer-logo-text rb-nav-text"
27626
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27627
- ]),
27628
- footerNav({
27629
- collectionPath: "footerMenu.items",
27630
- mode: "flatten",
27631
- className: { $bind: {
27632
- from: "$root.theme.footer.navLayout",
27633
- transforms: [{ id: "layout.footerSimpleNavClass" }],
27634
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
27635
- } },
27636
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
27637
- }),
27638
- ...bodyTextLayout(),
27639
- ...businessAddressLayout(),
27640
- ...inlineBottomTextLayout()
27641
- ], when("$root.theme.footer.variant", { equals: "simple" }));
27642
- const columnsFooterLayout = stack({
27643
- gap: "xl",
27644
- align: "start",
27688
+ const brandLogo = link({
27689
+ href: "/",
27645
27690
  className: { $bind: {
27646
- from: "$root.theme.footer.maxWidth",
27691
+ from: "$root.theme.footer.logo",
27647
27692
  transforms: [{
27648
- id: "layout.maxWidthClass",
27649
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
27693
+ id: "layout.footerLogoClass",
27694
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
27650
27695
  }],
27651
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
27696
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
27652
27697
  } }
27653
- }, [
27654
- footerNavGroupsLayout,
27655
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
27656
- as: "strong",
27657
- className: "rb-block rb-nav-text",
27658
- style: textColorStyle("text")
27659
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
27660
- collectionPath: "footerMenu.items",
27661
- mode: "links-only",
27662
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
27663
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
27664
- })]),
27665
- ...bodyTextLayout(),
27666
- ...businessAddressLayout(),
27667
- ...inlineBottomTextLayout()
27668
- ], when("$root.theme.footer.variant", { equals: "columns" }));
27669
- const splitFooterLayout = stack({
27670
- gap: "xl",
27671
- align: "start",
27698
+ }, [media({ className: { $bind: {
27699
+ from: "$root.theme.footer.logo",
27700
+ transforms: [{
27701
+ id: "layout.footerLogoMediaClass",
27702
+ options: { base: "rb-h-10 rb-w-auto" }
27703
+ }],
27704
+ fallback: "rb-h-10 rb-w-auto"
27705
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
27706
+ as: "strong",
27707
+ className: "footer-logo-text rb-nav-text"
27708
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
27709
+ const navigation = stack({
27710
+ gap: "md",
27711
+ className: "rb-w-full"
27712
+ }, [footerNavGroupsLayout, footerNav({
27713
+ collectionPath: "footerMenu.items",
27714
+ mode: "links-only",
27672
27715
  className: { $bind: {
27673
- from: "$root.theme.footer.maxWidth",
27674
- transforms: [{
27675
- id: "layout.maxWidthClass",
27676
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
27677
- }],
27678
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
27679
- } }
27716
+ from: "module.navigationClassName",
27717
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
27718
+ } },
27719
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
27720
+ })], when("module.kind", { equals: "navigation" }));
27721
+ const legalNavigation = footerNav({
27722
+ collectionPath: "legalFooterMenu.items",
27723
+ mode: "links-only",
27724
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
27725
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
27726
+ });
27727
+ const address = text({
27728
+ as: "address",
27729
+ className: "rb-not-italic rb-opacity-80"
27730
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
27731
+ const contact = stack({
27732
+ gap: "sm",
27733
+ className: "rb-items-start"
27734
+ }, [link({
27735
+ href: { $bind: { from: "contactLink.href" } },
27736
+ className: "rb-nav-text rb-break-words transition-theme-standard"
27737
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
27738
+ const hours = stack({
27739
+ gap: "sm",
27740
+ className: "rb-w-full"
27741
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
27742
+ as: "span",
27743
+ className: "rb-label"
27744
+ }, bind("hoursDay.weekday")), text({
27745
+ as: "span",
27746
+ className: "rb-caption rb-opacity-80"
27747
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
27748
+ as: "p",
27749
+ className: "rb-caption rb-opacity-70"
27750
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
27751
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
27752
+ href: { $bind: { from: "social.href" } },
27753
+ target: "_blank",
27754
+ rel: "noreferrer noopener",
27755
+ "aria-label": { $bind: { from: "social.label" } },
27756
+ className: "rb-nav-text transition-theme-standard"
27757
+ }, [icon({ className: "rb-h-5 rb-w-5" }, bind("social.icon"), when("social.icon")), text({ as: "span" }, bind("social.label"), when("social.icon", { equals: null }))], repeat("module.socialLinks", "social"))], when("module.kind", { equals: "social-links" }));
27758
+ const authoredCopy = richText({
27759
+ className: "rb-prose rb-prose-sm rb-max-w-none",
27760
+ style: textColorStyle("text/80")
27761
+ }, when("module.content"), bind("module.content", { transforms: [{
27762
+ id: "content.interpolateRichTextTokens",
27763
+ options: { tokens: ["year", "site_name"] }
27764
+ }] }));
27765
+ const footerGroup = stack({
27766
+ gap: "md",
27767
+ align: "stretch",
27768
+ className: "rb-min-w-0",
27769
+ "data-footer-group": { $bind: { from: "group.kind" } }
27770
+ }, [stack({
27771
+ gap: "md",
27772
+ align: "start",
27773
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
27680
27774
  }, [
27681
- inline({ className: { $bind: {
27682
- from: "$root.theme.footer.logo",
27683
- transforms: [{ id: "layout.footerSplitMainClass" }],
27684
- fallback: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
27685
- } } }, [stack({}, [footerNav({
27686
- collectionPath: "footerMenu.items",
27687
- mode: "flatten",
27688
- className: { $bind: {
27689
- from: "$root.theme.footer.navLayout",
27690
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
27691
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
27692
- } },
27693
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
27694
- })]), link({
27695
- href: "/",
27696
- className: { $bind: {
27697
- from: "$root.theme.footer.logo",
27698
- transforms: [{ id: "layout.footerLogoClass" }],
27699
- fallback: "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-self-end rb-no-underline rb-text-right rb-transition-opacity rb-hover-opacity-80"
27700
- } }
27701
- }, [
27702
- media({ className: { $bind: {
27703
- from: "$root.theme.footer.logo",
27704
- transforms: [{ id: "layout.footerLogoMediaClass" }],
27705
- fallback: "rb-w-auto"
27706
- } } }, when("content.logo"), bind("content.logo")),
27707
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
27708
- from: "$root.theme.footer.logo",
27709
- transforms: [{ id: "layout.footerLogoMediaClass" }],
27710
- fallback: "rb-w-auto"
27711
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
27712
- text({
27713
- as: "strong",
27714
- className: "footer-logo-text rb-nav-text"
27715
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27716
- ])]),
27717
- ...businessAddressLayout(),
27718
- ...inlineBottomTextLayout()
27719
- ], when("$root.theme.footer.variant", { equals: "split" }));
27720
- const footerLayout = section({
27721
- background: "background",
27775
+ text({
27776
+ as: "h2",
27777
+ className: "rb-label",
27778
+ style: textColorStyle("text/70")
27779
+ }, bind("module.heading"), when("module.heading")),
27780
+ brandLogo,
27781
+ navigation,
27782
+ stack({
27783
+ gap: "sm",
27784
+ className: "rb-w-full"
27785
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
27786
+ address,
27787
+ contact,
27788
+ hours,
27789
+ socials,
27790
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
27791
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
27792
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
27793
+ const footerMainRegion = stack({
27794
+ className: { $bind: { from: "region.className" } },
27795
+ "data-footer-region": { $bind: { from: "region.kind" } }
27796
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
27797
+ const footerBottomRegion = stack({ className: { $bind: {
27798
+ from: "$root.theme.footer",
27799
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
27800
+ fallback: "rb-w-full"
27801
+ } } }, [stack({
27722
27802
  className: { $bind: {
27723
27803
  from: "$root.theme.footer",
27724
- transforms: [{ id: "layout.footerRootClass" }],
27725
- fallback: "rb-w-full rb-border-t transition-theme"
27804
+ transforms: [{ id: "layout.footerBottomBarClass" }],
27805
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
27726
27806
  } },
27727
27807
  style: { $bind: {
27728
27808
  from: "$root.theme.footer",
27729
- transforms: [{ id: "layout.footerRootStyle" }],
27730
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
27731
- } }
27732
- }, [
27733
- simpleFooterLayout,
27734
- columnsFooterLayout,
27735
- splitFooterLayout,
27736
- stack({
27737
- className: { $bind: {
27738
- from: "$root.theme.footer",
27739
- transforms: [{ id: "layout.footerBottomBarClass" }],
27740
- fallback: "rb-w-full rb-border-t rb-py-5"
27741
- } },
27742
- style: { $bind: {
27743
- from: "$root.theme.footer",
27744
- transforms: [{ id: "layout.footerBottomBarStyle" }]
27745
- } }
27746
- }, [stack({ className: { $bind: {
27747
- from: "$root.theme.footer",
27748
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
27749
- fallback: "rb-container"
27750
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
27751
- ]);
27809
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
27810
+ } },
27811
+ "data-footer-region": "bottom"
27812
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
27752
27813
  const siteFooterManifest = createBlockManifest({
27753
27814
  id: "block.site-footer",
27754
27815
  title: "Site Footer",
27755
27816
  category: "layout",
27756
- fragments: [{
27757
- fragment: footerBottomTextFragment,
27758
- fieldPriority: 0
27759
- }],
27760
27817
  skipSectionStyles: true,
27761
- additionalFields: [{
27762
- id: "showBusinessAddress",
27763
- type: "boolean",
27764
- label: "Add business address to site footer?",
27765
- required: false,
27766
- defaultValue: false,
27767
- ui: { intent: "content" }
27768
- }],
27769
- layout: footerLayout,
27770
- description: "Site-wide footer with navigation links and optional columns.",
27818
+ layout: section({
27819
+ background: "background",
27820
+ className: { $bind: {
27821
+ from: "$root.theme.footer",
27822
+ transforms: [{ id: "layout.footerRootClass" }],
27823
+ fallback: "rb-w-full rb-border-t transition-theme"
27824
+ } },
27825
+ style: { $bind: {
27826
+ from: "$root.theme.footer",
27827
+ transforms: [{ id: "layout.footerRootStyle" }],
27828
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
27829
+ } },
27830
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
27831
+ }, [footerMainRegion, footerBottomRegion]),
27832
+ description: "Site-wide composed footer with canonical shared details.",
27771
27833
  styleTokens: { spacing: "md" },
27772
27834
  paletteHidden: true
27773
27835
  });
@@ -28246,7 +28308,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
28246
28308
  id: "boxStyles.all",
28247
28309
  options: {
28248
28310
  axis: "all",
28249
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
28311
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
28250
28312
  }
28251
28313
  }]
28252
28314
  },
@@ -43154,16 +43216,17 @@ const backgroundTransforms = [
43154
43216
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
43155
43217
  },
43156
43218
  {
43157
- id: "background.resolveAllowOverflow",
43219
+ id: "background.resolveFrameClassName",
43158
43220
  kind: "formatter",
43159
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
43160
- run: (value) => {
43161
- if (!value || typeof value !== "object") return false;
43221
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
43222
+ run: (value, options) => {
43223
+ const baseClass = options?.baseClass?.trim() ?? "";
43224
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
43162
43225
  const input = value;
43163
- if (input.overflow === true) return true;
43226
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
43164
43227
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
43165
43228
  const scale = isString(input.scale) ? input.scale.trim() : isNumber(input.scale) ? String(input.scale) : null;
43166
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
43229
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
43167
43230
  }
43168
43231
  },
43169
43232
  {
@@ -43713,10 +43776,10 @@ function isRecord$7(value) {
43713
43776
  }
43714
43777
  //#endregion
43715
43778
  //#region ../blocks/src/primitives/layout/Section.tsx
43716
- const Section = forwardRef(function Section({ as: Comp = "section", children, background, className = "", allowOverflow = false, style, "data-slot": dataSlot }, ref) {
43779
+ const Section = forwardRef(function Section({ as: Comp = "section", children, background, className = "", style, "data-slot": dataSlot }, ref) {
43717
43780
  return /* @__PURE__ */ jsx(Comp, {
43718
43781
  ref,
43719
- className: clsx("rb-relative rb-isolate", allowOverflow ? "rb-overflow-visible" : "rb-overflow-hidden", className),
43782
+ className: clsx("rb-relative rb-isolate rb-overflow-visible", className),
43720
43783
  style: mergeStyles(typeof background === "string" && background.trim().length > 0 ? backgroundColorStyle(background.trim()) : void 0, style),
43721
43784
  "data-slot": dataSlot ?? "section",
43722
43785
  children
@@ -43837,10 +43900,7 @@ function Grid({ as: Comp = "div", cols = {
43837
43900
  }
43838
43901
  //#endregion
43839
43902
  //#region ../blocks/src/system/runtime/nodes/layout.tsx
43840
- const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, allowOverflow, ...props }) => /* @__PURE__ */ jsx(Section, {
43841
- ...props,
43842
- allowOverflow
43843
- });
43903
+ const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Section, { ...props });
43844
43904
  const StackNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Stack, { ...props });
43845
43905
  const InlineNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Inline, { ...props });
43846
43906
  const GridNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Grid, { ...props });
@@ -43850,6 +43910,28 @@ const FigureNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _b
43850
43910
  //#region ../path-utils/src/index.ts
43851
43911
  const PATH_SEPARATOR_REGEX$1 = /\./g;
43852
43912
  const BRACKET_ACCESS_REGEX$1 = /\[([^\]]+)\]/g;
43913
+ /**
43914
+ * Segments that would traverse or mutate the prototype chain.
43915
+ *
43916
+ * `setAtPath` creates nested objects along the path, so allowing these
43917
+ * segments is a prototype-pollution vector. They are rejected everywhere a
43918
+ * path is parsed (string or pre-parsed array form) — fail closed.
43919
+ */
43920
+ const UNSAFE_PATH_SEGMENTS = /* @__PURE__ */ new Set([
43921
+ "__proto__",
43922
+ "constructor",
43923
+ "prototype"
43924
+ ]);
43925
+ var UnsafePathSegmentError = class extends Error {
43926
+ constructor(segment) {
43927
+ super(`Unsafe path segment: "${segment}"`);
43928
+ this.name = "UnsafePathSegmentError";
43929
+ this.segment = segment;
43930
+ }
43931
+ };
43932
+ function assertSafePathSegments(segments) {
43933
+ for (const segment of segments) if (typeof segment === "string" && UNSAFE_PATH_SEGMENTS.has(segment)) throw new UnsafePathSegmentError(segment);
43934
+ }
43853
43935
  function isRecord$6(value) {
43854
43936
  return typeof value === "object" && value !== null && !Array.isArray(value);
43855
43937
  }
@@ -43861,7 +43943,10 @@ function getContainerValue(container, segment) {
43861
43943
  if (segment in container) return Reflect.get(container, segment);
43862
43944
  }
43863
43945
  function parsePath(path) {
43864
- if (Array.isArray(path)) return path;
43946
+ if (Array.isArray(path)) {
43947
+ assertSafePathSegments(path);
43948
+ return path;
43949
+ }
43865
43950
  const segments = [];
43866
43951
  const parts = path.split(PATH_SEPARATOR_REGEX$1);
43867
43952
  for (const raw of parts) {
@@ -43881,6 +43966,7 @@ function parsePath(path) {
43881
43966
  }
43882
43967
  if (baseMatch === null && !raw.includes("[")) segments.push(raw);
43883
43968
  }
43969
+ assertSafePathSegments(segments);
43884
43970
  return segments;
43885
43971
  }
43886
43972
  function getAtPath(source, path) {
@@ -44122,6 +44208,58 @@ function getCtaIconComponent(name) {
44122
44208
  return CTA_ICON_COMPONENTS[name] ?? null;
44123
44209
  }
44124
44210
  //#endregion
44211
+ //#region ../blocks/src/system/icons/social.tsx
44212
+ const SOCIAL_ICON_NAMES = [
44213
+ "SocialFacebook",
44214
+ "SocialInstagram",
44215
+ "SocialLinkedIn",
44216
+ "SocialTikTok",
44217
+ "SocialX",
44218
+ "SocialYouTube"
44219
+ ];
44220
+ const socialIcons = {
44221
+ SocialFacebook: createIcon("SocialFacebookIcon", /* @__PURE__ */ jsx("path", { d: "M14 8h3V4h-3c-3 0-5 2-5 5v3H6v4h3v6h4v-6h3l1-4h-4V9c0-.7.3-1 1-1Z" })),
44222
+ SocialInstagram: createIcon("SocialInstagramIcon", /* @__PURE__ */ jsxs(Fragment, { children: [
44223
+ /* @__PURE__ */ jsx("rect", {
44224
+ x: "3",
44225
+ y: "3",
44226
+ width: "18",
44227
+ height: "18",
44228
+ rx: "5"
44229
+ }),
44230
+ /* @__PURE__ */ jsx("circle", {
44231
+ cx: "12",
44232
+ cy: "12",
44233
+ r: "4"
44234
+ }),
44235
+ /* @__PURE__ */ jsx("circle", {
44236
+ cx: "17.5",
44237
+ cy: "6.5",
44238
+ r: ".75",
44239
+ fill: "currentColor",
44240
+ stroke: "none"
44241
+ })
44242
+ ] })),
44243
+ SocialLinkedIn: createIcon("SocialLinkedInIcon", /* @__PURE__ */ jsxs(Fragment, { children: [
44244
+ /* @__PURE__ */ jsx("path", { d: "M6 9v10" }),
44245
+ /* @__PURE__ */ jsx("path", {
44246
+ d: "M6 5.5v.01",
44247
+ strokeWidth: "3"
44248
+ }),
44249
+ /* @__PURE__ */ jsx("path", { d: "M10.5 19v-6a4 4 0 0 1 8 0v6" }),
44250
+ /* @__PURE__ */ jsx("path", { d: "M10.5 9v10" })
44251
+ ] })),
44252
+ SocialTikTok: createIcon("SocialTikTokIcon", /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("path", { d: "M14 4v11.5a4.5 4.5 0 1 1-4-4.47" }), /* @__PURE__ */ jsx("path", { d: "M14 4c.7 3 2.4 4.5 5 4.5" })] })),
44253
+ SocialX: createIcon("SocialXIcon", /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("path", { d: "m5 4 14 16" }), /* @__PURE__ */ jsx("path", { d: "M19 4 5 20" })] })),
44254
+ SocialYouTube: createIcon("SocialYouTubeIcon", /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("path", { d: "M21 12c0 3.5-.5 5.5-1.3 6.3S16.5 19.5 12 19.5s-6.9-.4-7.7-1.2S3 15.5 3 12s.5-5.5 1.3-6.3S7.5 4.5 12 4.5s6.9.4 7.7 1.2S21 8.5 21 12Z" }), /* @__PURE__ */ jsx("path", { d: "m10 9 5 3-5 3Z" })] }))
44255
+ };
44256
+ function isSocialIconName(value) {
44257
+ return typeof value === "string" && SOCIAL_ICON_NAMES.includes(value);
44258
+ }
44259
+ function getSocialIconComponent(value) {
44260
+ return isSocialIconName(value) ? socialIcons[value] : null;
44261
+ }
44262
+ //#endregion
44125
44263
  //#region ../blocks/src/system/icons/registry.ts
44126
44264
  function buildSearchText(parts) {
44127
44265
  return parts.map((part) => part.trim()).filter(Boolean).join(" ");
@@ -44151,7 +44289,7 @@ function semanticOptionsForPreset(preset) {
44151
44289
  }
44152
44290
  semanticOptionsForPreset("feature");
44153
44291
  function getIconComponent(name) {
44154
- return getCtaIconComponent(name) ?? getSemanticIconComponent(name);
44292
+ return getCtaIconComponent(name) ?? getSemanticIconComponent(name) ?? getSocialIconComponent(name);
44155
44293
  }
44156
44294
  //#endregion
44157
44295
  //#region ../blocks/src/system/runtime/nodes/buttonAffordance.ts
@@ -44943,7 +45081,6 @@ const HeaderSectionNode = ({ blockId, children, className, "data-preview-site-ch
44943
45081
  const asProp = rest.as;
44944
45082
  const styleProp = rest.style;
44945
45083
  const backgroundProp = typeof rest.background === "string" ? rest.background : void 0;
44946
- const allowOverflowProp = typeof rest.allowOverflow === "boolean" ? rest.allowOverflow : void 0;
44947
45084
  const dataSlotProp = typeof rest["data-slot"] === "string" ? rest["data-slot"] : void 0;
44948
45085
  return /* @__PURE__ */ jsxs("nav", {
44949
45086
  ...getIslandRootProps("headerSection", blockId),
@@ -44958,7 +45095,6 @@ const HeaderSectionNode = ({ blockId, children, className, "data-preview-site-ch
44958
45095
  as: asProp,
44959
45096
  style: styleProp,
44960
45097
  background: backgroundProp ?? "background",
44961
- allowOverflow: allowOverflowProp,
44962
45098
  "data-slot": dataSlotProp,
44963
45099
  className: sectionClasses || void 0,
44964
45100
  children
@@ -47205,7 +47341,7 @@ function resolveGroupFrame(cardStyles) {
47205
47341
  contentClassName: "offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
47206
47342
  };
47207
47343
  return {
47208
- containerClassName: ["offerings-preview-card offerings-preview-card--framed rb-relative rb-isolate rb-h-full rb-min-h-full rb-overflow-hidden rb-bg-surface rb-border rb-border-border", resolveGroupFrameClasses(cardStyles)].filter(Boolean).join(" "),
47344
+ containerClassName: ["offerings-preview-card offerings-preview-card--framed rb-relative rb-isolate rb-h-full rb-min-h-full rb-overflow-visible rb-bg-surface rb-border rb-border-border", resolveGroupFrameClasses(cardStyles)].filter(Boolean).join(" "),
47209
47345
  containerStyle: resolveGroupFrameStyle(cardStyles),
47210
47346
  contentClassName: "card-content offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
47211
47347
  };
@@ -50238,9 +50374,9 @@ function isReactNode(value) {
50238
50374
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
50239
50375
  */
50240
50376
  function resolveNode(node, context, indexFallback) {
50241
- if (!shouldRenderNode(node, context)) return null;
50242
50377
  const scopeContext = applyScopes(node, context);
50243
50378
  if (node.$repeat) return resolveRepeater(node, scopeContext);
50379
+ if (!shouldRenderNode(node, scopeContext)) return null;
50244
50380
  const registry = scopeContext.registry ?? serverComponentRegistry;
50245
50381
  const normalizedType = node.type.toLowerCase();
50246
50382
  const component = registry[node.type] ?? registry[normalizedType] ?? (normalizedType === "section" ? SectionNode : void 0);
@@ -51613,6 +51749,19 @@ const NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
51613
51749
  //#region ../theme-core/src/header/generateHeaderCss.ts
51614
51750
  const HEADER_BLUR = "blur(12px)";
51615
51751
  const FLOATING_BLUR = "blur(16px)";
51752
+ const INSET_SHELL_MARKER_CLASS = "header-bar-frame-inset-shell";
51753
+ const INSET_SHELL_EDGE = "1rem";
51754
+ const INSET_SHELL_INSET_BLOCK = "0.875rem";
51755
+ const INSET_SHELL_RADIUS = "9999px";
51756
+ const INSET_SHELL_CONTAINER_MAX = "80rem";
51757
+ const INSET_SHELL_INTERIOR_PADDING_X = "1.75rem";
51758
+ /**
51759
+ * Whether the classic header should render as an inset "brand capsule" shell.
51760
+ * The facet is only meaningful for the classic layout; other variants ignore it.
51761
+ */
51762
+ function usesInsetShell(header) {
51763
+ return header.barFrame === "inset-shell" && header.variant === "classic";
51764
+ }
51616
51765
  /**
51617
51766
  * Generate complete CSS for header system from theme config
51618
51767
  *
@@ -51712,7 +51861,36 @@ function generateHeaderRootStyles(header, themeId, tokens, _theme) {
51712
51861
  const baseBlock = `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
51713
51862
  const overlayFix = `\n${`${selector}:has([data-nav-mobile-overlay][aria-hidden="false"])`} {\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n}\n`;
51714
51863
  if (isContainedNav || backgroundRules.length === 0) return `${baseBlock}\n${overlayFix}`;
51715
- return `${baseBlock}\n${`\n${backgroundSelector} {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n border-radius: inherit;\n z-index: -1;\n ${backgroundRules.join("\n ")}\n}\n`}\n${overlayFix}`;
51864
+ return `${baseBlock}\n${`\n${backgroundSelector} {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n border-radius: inherit;\n z-index: -1;\n ${backgroundRules.join("\n ")}\n}\n`}\n${overlayFix}${usesInsetShell(header) ? generateInsetShellStyles(header, themeId) : ""}`;
51865
+ }
51866
+ /**
51867
+ * Reshapes the full-bleed header paint layer into a contained brand capsule at
51868
+ * the desktop breakpoint. The capsule is centred, capped to the page container
51869
+ * width, inset from the top, fully rounded, and carries the header depth so it
51870
+ * reads as a floating pill. Root border/shadow are neutralised on desktop so a
51871
+ * bordered style does not leave a full-width hairline around the capsule. Sticky
51872
+ * positioning is unaffected — the root stays full width and sticky while the
51873
+ * ::before paint provides the capsule.
51874
+ */
51875
+ function generateInsetShellStyles(header, themeId) {
51876
+ const scope = `:where([data-theme-scope="${themeId}"])`;
51877
+ const shellRootSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}`;
51878
+ const shellBeforeSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}::before`;
51879
+ const layoutSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS} .rb-header-layout`;
51880
+ const widthValue = header.maxWidth === "full" ? `calc(100% - (${INSET_SHELL_EDGE} * 2))` : `min(${INSET_SHELL_CONTAINER_MAX}, calc(100% - (${INSET_SHELL_EDGE} * 2)))`;
51881
+ const shadowVar = getComponentShadowVar(header.shadow?.elevation ?? "none");
51882
+ const rootRules = ["border: none;", "box-shadow: none;"];
51883
+ const beforeRules = [
51884
+ `inset: ${INSET_SHELL_INSET_BLOCK} auto;`,
51885
+ "left: 50%;",
51886
+ "right: auto;",
51887
+ "transform: translateX(-50%);",
51888
+ `width: ${widthValue};`,
51889
+ `border-radius: ${INSET_SHELL_RADIUS};`,
51890
+ ...shadowVar ? [`box-shadow: ${shadowVar};`] : []
51891
+ ];
51892
+ const layoutRules = [`padding-inline: ${INSET_SHELL_INTERIOR_PADDING_X};`];
51893
+ return `\n@media ${MQ_MD_UP} {\n${shellRootSelector} {\n ${rootRules.join("\n ")}\n}\n${shellBeforeSelector} {\n ${beforeRules.join("\n ")}\n}\n${layoutSelector} {\n ${layoutRules.join("\n ")}\n}\n}\n`;
51716
51894
  }
51717
51895
  /**
51718
51896
  * Generate logo typography styles
@@ -51790,7 +51968,7 @@ function generateLogoTextBehaviorStyles(logoText, themeId) {
51790
51968
  */
51791
51969
  function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment, navTextSize) {
51792
51970
  const navPreferences = {
51793
- typography: header.navTypography ?? "inherit",
51971
+ typography: header.navFontRole ?? header.navTypography ?? "inherit",
51794
51972
  fontSize: readHeaderNavFontSizePreference(header.navTextSize)
51795
51973
  };
51796
51974
  if (header.navLinkStyle) return generateNavLinkCSS({
@@ -56140,6 +56318,12 @@ const containerResponsiveThemeCss = `/*
56140
56318
  .rb-lg-hidden {
56141
56319
  display: none;
56142
56320
  }
56321
+ .rb-lg-flex-row {
56322
+ flex-direction: row;
56323
+ }
56324
+ .rb-lg-items-center {
56325
+ align-items: center;
56326
+ }
56143
56327
  }
56144
56328
 
56145
56329
  }
@@ -67576,7 +67760,7 @@ const containerResponsiveThemeCss = `/*
67576
67760
  [data-block="feature-cards"][data-block-composition="asymmetric-emphasis"]
67577
67761
  .rb-feature-card {
67578
67762
  height: auto;
67579
- overflow: hidden;
67763
+ overflow: visible;
67580
67764
  border: 0;
67581
67765
  border-radius: 0;
67582
67766
  background: transparent;
@@ -68607,19 +68791,9 @@ function getPrimaryNavigation(navigation) {
68607
68791
  return a.id.localeCompare(b.id);
68608
68792
  })[0] ?? null;
68609
68793
  }
68610
- /**
68611
- * Get the footer navigation menu object.
68612
- * Returns menu marked as isFooter, or null if none marked.
68613
- *
68614
- * @example
68615
- * ```ts
68616
- * const menu = getFooterNavigation(siteData.navigation);
68617
- * console.log(menu?.name); // "Footer menu"
68618
- * ```
68619
- */
68620
- function getFooterNavigation(navigation) {
68794
+ function getFooterNavigationByRole(navigation, role) {
68621
68795
  if (!navigation || navigation.length === 0) return null;
68622
- const footerMenus = navigation.filter((menu) => menu.isFooter);
68796
+ const footerMenus = navigation.filter((menu) => menu.footerRole === role || role === "main" && menu.footerRole == null && menu.isFooter);
68623
68797
  if (footerMenus.length > 1) console.warn(`[riverbank/sdk] Multiple footer navigation menus detected (${footerMenus.length}); using first flagged menu by input order.`);
68624
68798
  return footerMenus[0] ?? null;
68625
68799
  }
@@ -68832,7 +69006,10 @@ function buildMenu(navigation, routes, options) {
68832
69006
  * ```
68833
69007
  */
68834
69008
  function buildFooterMenu(navigation, routes, options) {
68835
- const menu = getFooterNavigation(navigation);
69009
+ return buildFooterMenuForRole(navigation, routes, "main", options);
69010
+ }
69011
+ function buildFooterMenuForRole(navigation, routes, role, options) {
69012
+ const menu = getFooterNavigationByRole(navigation, role);
68836
69013
  if (!menu) return {
68837
69014
  items: [],
68838
69015
  ctaItem: null,
@@ -68999,6 +69176,7 @@ async function Layout({ siteData: providedSiteData, client, siteId, slug, domain
68999
69176
  };
69000
69177
  const menuViewModel = buildMenu(navigation, routes, navigationOptions);
69001
69178
  const footerMenuViewModel = buildFooterMenu(navigation, routes, navigationOptions);
69179
+ const legalFooterMenuViewModel = buildFooterMenuForRole(navigation, routes, "legal-policy", navigationOptions);
69002
69180
  const logoViewModel = buildLogo(layout.logo ?? null, site.title);
69003
69181
  const headerData = {
69004
69182
  menu: menuViewModel,
@@ -69010,6 +69188,7 @@ async function Layout({ siteData: providedSiteData, client, siteId, slug, domain
69010
69188
  const footerData = {
69011
69189
  menu: menuViewModel,
69012
69190
  footerMenu: footerMenuViewModel,
69191
+ legalFooterMenu: legalFooterMenuViewModel,
69013
69192
  logo: logoViewModel,
69014
69193
  site,
69015
69194
  theme,
@@ -69045,6 +69224,7 @@ async function Layout({ siteData: providedSiteData, client, siteId, slug, domain
69045
69224
  site,
69046
69225
  menu: menuViewModel,
69047
69226
  footerMenu: footerMenuViewModel,
69227
+ legalFooterMenu: legalFooterMenuViewModel,
69048
69228
  content: { logo: logoViewModel }
69049
69229
  };
69050
69230
  let headerElement = null;
@@ -69471,8 +69651,6 @@ function normalizeLoaderParams(endpoint, params, context) {
69471
69651
  ensureSiteId(out, context);
69472
69652
  return out;
69473
69653
  }
69474
- //#endregion
69475
- //#region ../api/src/apiEndpointTypes.ts
69476
69654
  function blockedDemoMutationPolicy(classification, publicMessage) {
69477
69655
  if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
69478
69656
  return {
@@ -69500,6 +69678,7 @@ const TAG_TEMPLATES = {
69500
69678
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
69501
69679
  routeById: "riverbank:route:{routeId}",
69502
69680
  pageById: "riverbank:page:{pageId}",
69681
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
69503
69682
  workflowRunById: "riverbank:workflow-run:{runId}",
69504
69683
  siteForms: "riverbank:site:{siteId}:forms",
69505
69684
  formById: "riverbank:form:{formId}",
@@ -69523,7 +69702,7 @@ const TAG_TEMPLATES = {
69523
69702
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
69524
69703
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
69525
69704
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
69526
- TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
69705
+ TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
69527
69706
  z$1.object({
69528
69707
  formulaVersion: z$1.literal("managed-domain-overage-v1"),
69529
69708
  conversionRule: z$1.literal("usd-to-gbp-1-to-1-v1"),