@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
@@ -225,7 +225,7 @@ function formatEventPricing(pricing, options = {}) {
225
225
  //#endregion
226
226
  //#region ../core/src/event-page-surface-subject.ts
227
227
  function parseEventPageSurfaceSubject(value) {
228
- if (!isRecord$31(value)) return err$3({ kind: "notObject" });
228
+ if (!isRecord$33(value)) return err$3({ kind: "notObject" });
229
229
  switch (value.kind) {
230
230
  case "eventSeries": {
231
231
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -268,7 +268,7 @@ function parseEventPageSurfaceSubject(value) {
268
268
  });
269
269
  }
270
270
  }
271
- function isRecord$31(value) {
271
+ function isRecord$33(value) {
272
272
  return typeof value === "object" && value !== null && !Array.isArray(value);
273
273
  }
274
274
  //#endregion
@@ -483,6 +483,17 @@ function toLocationCoordinates(value) {
483
483
  lng: value.lng
484
484
  };
485
485
  }
486
+ new Map([
487
+ "brand",
488
+ "supporting-text",
489
+ "social-links",
490
+ "navigation",
491
+ "business-address",
492
+ "contact",
493
+ "opening-hours",
494
+ "legal-navigation",
495
+ "legal"
496
+ ].map((kind, index) => [kind, index]));
486
497
  function sortStableJsonValue(value) {
487
498
  if (value === null) return null;
488
499
  if (typeof value === "string" || typeof value === "boolean") return value;
@@ -494,7 +505,7 @@ function sortStableJsonValue(value) {
494
505
  if (typeof value === "object") {
495
506
  const prototype = Object.getPrototypeOf(value);
496
507
  if (prototype !== Object.prototype && prototype !== null) throw new TypeError("Stable JSON only supports plain objects");
497
- return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, child]) => [key, sortStableJsonValue(child)]));
508
+ return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([key, child]) => [key, sortStableJsonValue(child)]));
498
509
  }
499
510
  throw new TypeError(`Stable JSON does not support ${typeof value}`);
500
511
  }
@@ -524,7 +535,7 @@ function containsUnsafePathSegmentCharacter(value) {
524
535
  function isReservedPathSegment(value) {
525
536
  return value === "." || value === "..";
526
537
  }
527
- function isUnsafePathSegment(segment) {
538
+ function isUnsafePathSegment$1(segment) {
528
539
  return segment.trim().length === 0 || segment !== segment.trim() || isReservedPathSegment(segment) || containsUnsafePathSegmentCharacter(segment);
529
540
  }
530
541
  ({
@@ -540,7 +551,7 @@ function parseStoragePath(value) {
540
551
  * that every tenant/site identifier remains one segment, never a nested path.
541
552
  */
542
553
  function joinStoragePathSegments(segments) {
543
- if (segments.some(isUnsafePathSegment)) return err$3("unsafe-path-segment");
554
+ if (segments.some(isUnsafePathSegment$1)) return err$3("unsafe-path-segment");
544
555
  return ok$3(unsafeAsStoragePath(segments.join("/")));
545
556
  }
546
557
  //#endregion
@@ -1200,7 +1211,7 @@ const ALLOWED_TRANSFORM_IDS = [
1200
1211
  "media.fromUrl",
1201
1212
  "background.resolveStyle",
1202
1213
  "background.resolveColorsStyle",
1203
- "background.resolveAllowOverflow",
1214
+ "background.resolveFrameClassName",
1204
1215
  "background.resolveImageStyle",
1205
1216
  "background.resolveImageClassName",
1206
1217
  "background.resolveOverlayStyle",
@@ -1230,7 +1241,7 @@ function mqBetween(minPx, maxPx) {
1230
1241
  return `${mqUp(minPx)} and ${mqDown(maxPx)}`;
1231
1242
  }
1232
1243
  const MQ_SM_UP = mqUp(640);
1233
- mqUp(768);
1244
+ const MQ_MD_UP = mqUp(768);
1234
1245
  const MQ_LG_UP = mqUp(BREAKPOINT_LG);
1235
1246
  mqUp(BREAKPOINT_XL);
1236
1247
  const MQ_SM_DOWN = mqDown(639);
@@ -10274,104 +10285,153 @@ const showtimePill = defineButtonPersonality({
10274
10285
  }
10275
10286
  });
10276
10287
  //#endregion
10277
- //#region ../theme-core/src/buttons/personalities/index.ts
10278
- const buttonPersonalities = [
10279
- defineButtonPersonality({
10280
- id: "soft-pill",
10281
- name: "Soft Pill",
10282
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10283
- tags: {
10284
- tone: "classic",
10285
- energy: "calm",
10286
- motion: "subtle",
10287
- era: "organic"
10288
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
10289
+ /**
10290
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
10291
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
10292
+ */
10293
+ const softPill = defineButtonPersonality({
10294
+ id: "soft-pill",
10295
+ name: "Soft Pill",
10296
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10297
+ tags: {
10298
+ tone: "classic",
10299
+ energy: "calm",
10300
+ motion: "subtle",
10301
+ era: "organic"
10302
+ },
10303
+ buttonSystem: {
10304
+ global: {
10305
+ cornerStyle: "pill",
10306
+ shadow: "low",
10307
+ textTransform: "none",
10308
+ fontWeight: 500,
10309
+ borderWidth: 2,
10310
+ hoverTransform: "lift",
10311
+ hoverColor: "none"
10288
10312
  },
10289
- buttonSystem: {
10290
- global: {
10291
- cornerStyle: "pill",
10292
- shadow: "low",
10293
- textTransform: "none",
10294
- fontWeight: 500,
10295
- borderWidth: 2,
10296
- hoverTransform: "lift",
10297
- hoverColor: "none"
10298
- },
10299
- variants: [
10300
- {
10301
- id: "primary",
10302
- name: "Primary",
10303
- enabled: true,
10304
- priority: 1,
10305
- background: {
10306
- type: "solid",
10307
- colorToken: "primary"
10308
- },
10309
- textColorToken: "primaryForeground",
10310
- borderRadius: "rounded-full",
10311
- shadow: {
10312
- elevation: "low",
10313
- softness: "soft",
10314
- position: "bottom"
10315
- },
10316
- effects: {
10317
- hover: [{
10318
- effectId: "lift",
10319
- options: { translateY: "-1px" }
10320
- }],
10321
- active: [{
10322
- effectId: "scale-down",
10323
- options: { scale: "0.98" }
10324
- }]
10325
- }
10326
- },
10327
- {
10328
- id: "secondary",
10329
- name: "Secondary",
10330
- enabled: true,
10331
- priority: 2,
10332
- background: { type: "transparent" },
10333
- textColorToken: "primary",
10334
- borderRadius: "rounded-full",
10335
- border: {
10336
- widthClass: "border-2",
10337
- colorToken: "primary"
10338
- },
10339
- effects: { hover: [{
10340
- effectId: "background-on-hover",
10341
- options: { colorToken: "surface" }
10342
- }] }
10313
+ variants: [
10314
+ {
10315
+ id: "primary",
10316
+ name: "Primary",
10317
+ enabled: true,
10318
+ priority: 1,
10319
+ background: {
10320
+ type: "solid",
10321
+ colorToken: "primary"
10343
10322
  },
10344
- {
10345
- id: "outline",
10346
- name: "Outline",
10347
- enabled: true,
10348
- priority: 3,
10349
- background: { type: "transparent" },
10350
- textColorToken: "text",
10351
- borderRadius: "rounded-full",
10352
- border: {
10353
- widthClass: "border",
10354
- colorToken: "border"
10355
- },
10356
- effects: { hover: [{
10357
- effectId: "background-on-hover",
10358
- options: { colorToken: "surface" }
10359
- }] }
10323
+ textColorToken: "primaryForeground",
10324
+ borderRadius: "rounded-full",
10325
+ shadow: {
10326
+ elevation: "low",
10327
+ softness: "soft",
10328
+ position: "bottom"
10360
10329
  },
10361
- {
10362
- id: "ghost",
10363
- name: "Ghost",
10364
- enabled: true,
10365
- priority: 3,
10366
- background: { type: "transparent" },
10367
- textColorToken: "text",
10368
- borderRadius: "rounded-full",
10369
- effects: { hover: [{
10370
- effectId: "background-on-hover",
10371
- options: { colorToken: "surface" }
10372
- }] }
10330
+ effects: {
10331
+ hover: [{
10332
+ effectId: "lift",
10333
+ options: { translateY: "-1px" }
10334
+ }],
10335
+ active: [{
10336
+ effectId: "scale-down",
10337
+ options: { scale: "0.98" }
10338
+ }]
10373
10339
  }
10374
- ]
10340
+ },
10341
+ {
10342
+ id: "secondary",
10343
+ name: "Secondary",
10344
+ enabled: true,
10345
+ priority: 2,
10346
+ background: { type: "transparent" },
10347
+ textColorToken: "primary",
10348
+ borderRadius: "rounded-full",
10349
+ border: {
10350
+ widthClass: "border-2",
10351
+ colorToken: "primary"
10352
+ },
10353
+ effects: { hover: [{
10354
+ effectId: "background-on-hover",
10355
+ options: { colorToken: "surface" }
10356
+ }] }
10357
+ },
10358
+ {
10359
+ id: "outline",
10360
+ name: "Outline",
10361
+ enabled: true,
10362
+ priority: 3,
10363
+ background: { type: "transparent" },
10364
+ textColorToken: "text",
10365
+ borderRadius: "rounded-full",
10366
+ border: {
10367
+ widthClass: "border",
10368
+ colorToken: "border"
10369
+ },
10370
+ effects: { hover: [{
10371
+ effectId: "background-on-hover",
10372
+ options: { colorToken: "surface" }
10373
+ }] }
10374
+ },
10375
+ {
10376
+ id: "ghost",
10377
+ name: "Ghost",
10378
+ enabled: true,
10379
+ priority: 3,
10380
+ background: { type: "transparent" },
10381
+ textColorToken: "text",
10382
+ borderRadius: "rounded-full",
10383
+ effects: { hover: [{
10384
+ effectId: "background-on-hover",
10385
+ options: { colorToken: "surface" }
10386
+ }] }
10387
+ }
10388
+ ]
10389
+ }
10390
+ });
10391
+ //#endregion
10392
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
10393
+ const solidSecondary = {
10394
+ id: "secondary",
10395
+ name: "Secondary",
10396
+ enabled: true,
10397
+ priority: 2,
10398
+ background: {
10399
+ type: "solid",
10400
+ colorToken: "secondary"
10401
+ },
10402
+ textColorToken: "onSecondary",
10403
+ borderRadius: "rounded-full",
10404
+ shadow: {
10405
+ elevation: "none",
10406
+ softness: null,
10407
+ position: "bottom"
10408
+ },
10409
+ effects: {
10410
+ hover: [{
10411
+ effectId: "background-on-hover-alpha",
10412
+ options: {
10413
+ colorToken: "secondary",
10414
+ opacity: 88
10415
+ }
10416
+ }],
10417
+ active: [{
10418
+ effectId: "scale-down",
10419
+ options: { scale: "0.98" }
10420
+ }]
10421
+ }
10422
+ };
10423
+ //#endregion
10424
+ //#region ../theme-core/src/buttons/personalities/index.ts
10425
+ const buttonPersonalities = [
10426
+ softPill,
10427
+ defineButtonPersonality({
10428
+ id: "two-tone-pill",
10429
+ name: "Two-tone Pill",
10430
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
10431
+ tags: softPill.tags,
10432
+ buttonSystem: {
10433
+ ...softPill.buttonSystem,
10434
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
10375
10435
  }
10376
10436
  }),
10377
10437
  earthPill,
@@ -10993,7 +11053,7 @@ const overlayLogoAccommodations = [
10993
11053
  * optional nested styling fields that would otherwise leak from another Look.
10994
11054
  */
10995
11055
  function baseHeader(theme) {
10996
- 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;
11056
+ 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;
10997
11057
  return {
10998
11058
  ...header,
10999
11059
  navContainer: {
@@ -11142,6 +11202,17 @@ const headerStyleCatalog = defineExactCatalog()([
11142
11202
  navTypography: "brand-caps",
11143
11203
  moods: ["expressive"]
11144
11204
  },
11205
+ {
11206
+ id: asHeaderStyleId("brand-capsule"),
11207
+ label: "Brand Capsule",
11208
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
11209
+ supportedLayoutIds: supportedLayouts(["classic"]),
11210
+ navInteraction: "pill-background",
11211
+ surface: "brand-solid",
11212
+ defaultDepth: "shadow",
11213
+ navTypography: "quiet-caps",
11214
+ moods: ["expressive", "professional"]
11215
+ },
11145
11216
  {
11146
11217
  id: asHeaderStyleId("serif-line"),
11147
11218
  label: "Serif Line",
@@ -11235,6 +11306,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11235
11306
  "brand-bar",
11236
11307
  "brand-underline",
11237
11308
  "brand-pill",
11309
+ "brand-capsule",
11238
11310
  "serif-line",
11239
11311
  "flat-tabs"
11240
11312
  ])],
@@ -11272,6 +11344,11 @@ headerStyleRepairChain([
11272
11344
  "brand-pill",
11273
11345
  "brand-bar",
11274
11346
  "minimal"
11347
+ ]), headerStyleRepairChain([
11348
+ "brand-capsule",
11349
+ "brand-pill",
11350
+ "brand-bar",
11351
+ "minimal"
11275
11352
  ]), headerStyleRepairChain([
11276
11353
  "pill-nav",
11277
11354
  "soft-bar",
@@ -15205,7 +15282,7 @@ function generateVariantCSS(variant, themeId, tokens, theme) {
15205
15282
  rules.push(`display: flex`);
15206
15283
  rules.push(`flex-direction: column`);
15207
15284
  rules.push(`position: relative`);
15208
- rules.push(`overflow: hidden`);
15285
+ rules.push(`overflow: visible`);
15209
15286
  const mediaRadius = MEDIA_CORNER_MAP[corners];
15210
15287
  const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
15211
15288
  const contentRules = [`padding: ${CONTENT_PADDING_MAP[variant.spacing] || CONTENT_PADDING_MAP.comfortable}`];
@@ -16729,6 +16806,7 @@ const navFontWeight = z$1.enum([
16729
16806
  "bold"
16730
16807
  ]);
16731
16808
  const headerMaxWidth = z$1.enum(["container", "full"]);
16809
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
16732
16810
  const headerContainerSchema = z$1.object({
16733
16811
  rounded: z$1.enum([
16734
16812
  "none",
@@ -16873,6 +16951,7 @@ const headerSchema = z$1.object({
16873
16951
  positioning: headerPositioning,
16874
16952
  shrinkOnScroll: z$1.boolean(),
16875
16953
  maxWidth: headerMaxWidth,
16954
+ barFrame: headerBarFrame.optional(),
16876
16955
  logoOverride: mediaSchema$1.nullable().optional(),
16877
16956
  background: headerBackgroundSchema.default({
16878
16957
  type: "color",
@@ -16882,6 +16961,7 @@ const headerSchema = z$1.object({
16882
16961
  navStyle: headerNavStyle,
16883
16962
  navColor: themeColorTokenSchema.nullable().optional(),
16884
16963
  navWeight: navFontWeight.default("medium"),
16964
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
16885
16965
  navTypography: z$1.enum(["body", "heading"]).optional(),
16886
16966
  navTextSize: navLinkStyleSchema.shape.textSize,
16887
16967
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -16897,7 +16977,21 @@ const headerSchema = z$1.object({
16897
16977
  ctaTreatment: headerCtaTreatmentSchema.optional(),
16898
16978
  ctaVariant: z$1.string().min(1).optional(),
16899
16979
  dropdownStyle: dropdownStyleSchema
16900
- });
16980
+ }).transform(normaliseHeaderNavFontRole);
16981
+ /**
16982
+ * Normalises the legacy `navTypography` font-role alias into the canonical
16983
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
16984
+ * a data migration. `navFontRole` always wins when both are present; the legacy
16985
+ * field is dropped so we never carry a dual write forward.
16986
+ */
16987
+ function normaliseHeaderNavFontRole(header) {
16988
+ if (header.navTypography === void 0) return header;
16989
+ const { navTypography, ...rest } = header;
16990
+ return header.navFontRole === void 0 ? {
16991
+ ...rest,
16992
+ navFontRole: navTypography
16993
+ } : rest;
16994
+ }
16901
16995
  const footerVariant = z$1.enum([
16902
16996
  "simple",
16903
16997
  "columns",
@@ -17929,6 +18023,7 @@ const curatedSiteStyles = [
17929
18023
  ],
17930
18024
  buttonPersonalityChoices: [
17931
18025
  buttonChoice("soft-pill"),
18026
+ buttonChoice("two-tone-pill"),
17932
18027
  buttonChoice("pebble"),
17933
18028
  buttonChoice("editorial-link"),
17934
18029
  buttonChoice("brushed-wash")
@@ -19108,6 +19203,7 @@ const curatedSiteStyles = [
19108
19203
  ],
19109
19204
  buttonPersonalityChoices: [
19110
19205
  buttonChoice("quiet-arrow"),
19206
+ buttonChoice("two-tone-pill"),
19111
19207
  buttonChoice("flat-ink"),
19112
19208
  buttonChoice("editorial-link")
19113
19209
  ],
@@ -19315,6 +19411,21 @@ function toSiteChromeBackgroundColorTokens(tokenNames) {
19315
19411
  return token ? [token] : [];
19316
19412
  });
19317
19413
  }
19414
+ /**
19415
+ * Applies the user's nav font-role/size overrides on top of a style-resolved
19416
+ * nav link style. This is where the precedence contract lands:
19417
+ *
19418
+ * - The nav typography TREATMENT (case/tracking identity: plain / heading /
19419
+ * quiet-caps / brand-caps) is ALWAYS owned by the active header style and is
19420
+ * baked into `style` before this call (see `applyNavTypography` in
19421
+ * headerLooks.ts).
19422
+ * - Each treatment resolves through a DEFAULT font role: `heading` resolves
19423
+ * through the heading role; `plain` / `quiet-caps` / `brand-caps` resolve
19424
+ * through the body role.
19425
+ * - The user's `navFontRole` (surfaced here as `preferences.typography`) only
19426
+ * overrides which font ROLE the treatment resolves through. It never changes
19427
+ * the treatment. `'inherit'` keeps the treatment's default role.
19428
+ */
19318
19429
  function mergeHeaderNavTypographyPreference(style, preferences) {
19319
19430
  return preferences.typography === "inherit" && preferences.fontSize === "inherit" ? style : {
19320
19431
  ...style,
@@ -20434,6 +20545,7 @@ function devValidate(node) {
20434
20545
  }
20435
20546
  //#endregion
20436
20547
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
20548
+ 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";
20437
20549
  /**
20438
20550
  * Creates background layer nodes for rendering backgrounds from field data.
20439
20551
  *
@@ -20499,6 +20611,34 @@ function backgroundLayer(path, options = {}) {
20499
20611
  ];
20500
20612
  }
20501
20613
  /**
20614
+ * Wrap decorative background layers in their own clipping frame.
20615
+ *
20616
+ * Foreground content remains outside this frame, so editor outlines, focus
20617
+ * rings, and floating controls are never clipped by a visual background.
20618
+ * Backgrounds that explicitly opt into overflow keep that behavior within
20619
+ * the decorative layer rather than changing the content root.
20620
+ */
20621
+ function backgroundFrame(path, options = {}) {
20622
+ const { leadingNodes = [], ...layerOptions } = options;
20623
+ const framedLayerOptions = {
20624
+ ...layerOptions,
20625
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
20626
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
20627
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
20628
+ };
20629
+ return el("div", {
20630
+ className: { $bind: {
20631
+ from: path,
20632
+ transforms: [{
20633
+ id: "background.resolveFrameClassName",
20634
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
20635
+ }],
20636
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
20637
+ } },
20638
+ style: { borderRadius: "inherit" }
20639
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
20640
+ }
20641
+ /**
20502
20642
  * Creates a media node for rendering background image/video media with conditional rendering.
20503
20643
  *
20504
20644
  * This helper creates a media element that:
@@ -20660,8 +20800,8 @@ function sectionContainer(children, opts) {
20660
20800
  * - content
20661
20801
  */
20662
20802
  function styledContainer(config) {
20663
- 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;
20664
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
20803
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
20804
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
20665
20805
  const childrenArray = Array.isArray(children) ? children : [children];
20666
20806
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
20667
20807
  return el(rootType, {
@@ -20684,7 +20824,7 @@ function styledContainer(config) {
20684
20824
  }],
20685
20825
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
20686
20826
  } }
20687
- }, [...backgroundNodes, ...childrenArray]);
20827
+ }, [backgroundNode, ...childrenArray]);
20688
20828
  }
20689
20829
  //#endregion
20690
20830
  //#region ../blocks/src/system/spacing.ts
@@ -20817,7 +20957,7 @@ const DEFAULT_SECTION_SPACING = "medium";
20817
20957
  * - Creating a section wrapper with background theme
20818
20958
  * - Adding background color/gradient/image layers
20819
20959
  * - Binding className to section styles with transform
20820
- * - Binding allowOverflow for background positioning
20960
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
20821
20961
  * - Wrapping content children
20822
20962
  *
20823
20963
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -20853,8 +20993,8 @@ const DEFAULT_SECTION_SPACING = "medium";
20853
20993
  * });
20854
20994
  */
20855
20995
  function styledSection(config) {
20856
- 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;
20857
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
20996
+ 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;
20997
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
20858
20998
  imageClassName,
20859
20999
  fallbackToken: background,
20860
21000
  omitImageLayer: !renderBackgroundImage,
@@ -20877,13 +21017,8 @@ function styledSection(config) {
20877
21017
  fullWidthPath
20878
21018
  }
20879
21019
  }]
20880
- } },
20881
- allowOverflow: allowOverflow ? true : { $bind: {
20882
- from: `${bindFrom}.background`,
20883
- transforms: [{ id: "background.resolveAllowOverflow" }],
20884
- fallback: false
20885
21020
  } }
20886
- }, [...renderedBackgroundNodes, ...childrenArray]);
21021
+ }, [renderedBackgroundNode, ...childrenArray]);
20887
21022
  }
20888
21023
  //#endregion
20889
21024
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -21744,9 +21879,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
21744
21879
  //#endregion
21745
21880
  //#region ../blocks/src/system/node/fragments/styledCard.ts
21746
21881
  function styledCard(children, opts, ...mods) {
21747
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
21748
- 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" });
21749
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
21882
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
21883
+ const defaultBackgroundLayer = el("div", {
21884
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
21885
+ style: { borderRadius: "inherit" }
21886
+ });
21887
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
21750
21888
  const style = {
21751
21889
  ...opts.style ?? {},
21752
21890
  borderColor: { $bind: {
@@ -21773,7 +21911,7 @@ function styledCard(children, opts, ...mods) {
21773
21911
  ...style ? { style } : {}
21774
21912
  }, [
21775
21913
  defaultBackgroundLayer,
21776
- ...backgroundNodes,
21914
+ backgroundNode,
21777
21915
  ...children
21778
21916
  ], ...mods);
21779
21917
  }
@@ -22646,7 +22784,7 @@ function buildTestimonialCard(...mods) {
22646
22784
  }, 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())])], {
22647
22785
  stylesFrom: "content._cardStyles",
22648
22786
  backgroundFrom: "content._cardStyles.background",
22649
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
22787
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
22650
22788
  }, ...mods);
22651
22789
  }
22652
22790
  /**
@@ -23374,7 +23512,7 @@ function createFaqAccordionLayout(options = {}) {
23374
23512
  options: {
23375
23513
  axis: "all",
23376
23514
  includeSpacing: false,
23377
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
23515
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
23378
23516
  }
23379
23517
  }]
23380
23518
  },
@@ -24899,7 +25037,6 @@ function splitLayoutWith(children) {
24899
25037
  }
24900
25038
  }),
24901
25039
  renderBackgroundImage: false,
24902
- allowOverflow: true,
24903
25040
  baseClass: ""
24904
25041
  });
24905
25042
  }
@@ -25527,7 +25664,7 @@ function postCard(children, ...mods) {
25527
25664
  return styledCard(children, {
25528
25665
  stylesFrom: "content._cardStyles",
25529
25666
  backgroundFrom: "content._cardStyles.background",
25530
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
25667
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
25531
25668
  }, ...mods);
25532
25669
  }
25533
25670
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -25563,7 +25700,7 @@ const stackPostCard = styledCard([inline({
25563
25700
  ])])], {
25564
25701
  stylesFrom: "content._cardStyles",
25565
25702
  backgroundFrom: "content._cardStyles.background",
25566
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
25703
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
25567
25704
  }, repeat("data.posts", "post"));
25568
25705
  const emptyState$2 = {
25569
25706
  ...styledCard([text({
@@ -25572,7 +25709,7 @@ const emptyState$2 = {
25572
25709
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
25573
25710
  stylesFrom: "content._cardStyles",
25574
25711
  backgroundFrom: "content._cardStyles.background",
25575
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
25712
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
25576
25713
  }),
25577
25714
  $when: {
25578
25715
  when: { from: "data.posts[0]" },
@@ -25582,7 +25719,7 @@ const emptyState$2 = {
25582
25719
  function blogListingShell(children) {
25583
25720
  return styledSection({
25584
25721
  children: styledContainer({
25585
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
25722
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
25586
25723
  children
25587
25724
  }),
25588
25725
  baseClass: ""
@@ -26016,7 +26153,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
26016
26153
  const formSurface = styledContainer({
26017
26154
  bindFrom: "_containerStyles",
26018
26155
  constrainWidth: false,
26019
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
26156
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
26020
26157
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
26021
26158
  });
26022
26159
  function createFormLayout(variant) {
@@ -27293,6 +27430,7 @@ const headerRootClassTransform = {
27293
27430
  ];
27294
27431
  const variant = header?.variant;
27295
27432
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
27433
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
27296
27434
  return joinClasses$2(classes);
27297
27435
  }
27298
27436
  };
@@ -27837,7 +27975,7 @@ function markEditableSurfaceForwarding(component) {
27837
27975
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
27838
27976
  //#endregion
27839
27977
  //#region ../blocks/src/system/blocks/site-header.ts
27840
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
27978
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
27841
27979
  ...node,
27842
27980
  $when: {
27843
27981
  when: {
@@ -27865,7 +28003,7 @@ const logoRow = link({
27865
28003
  text({
27866
28004
  as: "strong",
27867
28005
  className: "header-logo-text rb-truncate"
27868
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
28006
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27869
28007
  ]);
27870
28008
  const centeredLogoRow = link({
27871
28009
  href: "/",
@@ -27885,7 +28023,7 @@ const centeredLogoRow = link({
27885
28023
  text({
27886
28024
  as: "strong",
27887
28025
  className: "header-logo-text"
27888
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
28026
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27889
28027
  ]);
27890
28028
  const createNavRow = (className, align = "end") => navRow({
27891
28029
  className: `${className} header-nav-row`,
@@ -28017,7 +28155,7 @@ const classicLayout = inline({
28017
28155
  logoRow,
28018
28156
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
28019
28157
  headerCta
28020
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
28158
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
28021
28159
  const classicCenteredNavLayout = inline({
28022
28160
  className: bindProp("$root.theme.header.maxWidth", {
28023
28161
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -28028,7 +28166,7 @@ const classicCenteredNavLayout = inline({
28028
28166
  logoRow,
28029
28167
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
28030
28168
  headerCta
28031
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
28169
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
28032
28170
  const centeredLayout = stack({
28033
28171
  gap: "md",
28034
28172
  align: "center",
@@ -28091,7 +28229,6 @@ const siteHeaderManifest = createBlockManifest({
28091
28229
  transforms: pipe(tx("layout.headerSectionBackground")),
28092
28230
  fallback: "background"
28093
28231
  }),
28094
- allowOverflow: true,
28095
28232
  className: bindProp("$root.theme.header", {
28096
28233
  transforms: pipe(tx("layout.headerRootClass")),
28097
28234
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -28142,218 +28279,154 @@ const footerNavGroupsLayout = stack({
28142
28279
  linkRequired: true,
28143
28280
  target: { $bind: { from: "entry.target" } },
28144
28281
  rel: { $bind: { from: "entry.rel" } }
28145
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
28282
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
28146
28283
  //#endregion
28147
28284
  //#region ../blocks/src/system/blocks/site-footer.ts
28148
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
28149
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
28150
- ...node,
28151
- $when: {
28152
- when: {
28153
- from,
28154
- transforms: [{ id: transformId }]
28155
- },
28156
- equals
28157
- }
28158
- });
28159
- const bottomBarTextLayout = () => {
28160
- const bottomTextNode = footerTextLayout()[1];
28161
- return bottomTextNode ? [bottomTextNode] : [];
28162
- };
28163
- const bodyTextLayout = () => {
28164
- const bodyTextNode = footerTextLayout()[0];
28165
- return bodyTextNode ? [bodyTextNode] : [];
28166
- };
28167
- const businessAddressLayout = () => [text({
28168
- as: "p",
28169
- className: "rb-caption rb-opacity-80"
28170
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
28171
- const inlineBottomTextLayout = () => {
28172
- const bottomTextNode = footerTextLayout()[1];
28173
- if (!bottomTextNode) return [];
28174
- return [when("$root.theme.footer.bottomBar.enabled", {
28175
- equals: true,
28176
- not: true
28177
- })(bottomTextNode)];
28178
- };
28179
- const simpleFooterLayout = stack({
28180
- gap: "md",
28181
- align: "start",
28182
- className: { $bind: {
28183
- from: "$root.theme.footer",
28184
- transforms: [{ id: "layout.footerSimpleRootClass" }],
28185
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
28186
- } }
28187
- }, [
28188
- link({
28189
- href: "/",
28190
- className: { $bind: {
28191
- from: "$root.theme.footer.logo",
28192
- transforms: [{
28193
- id: "layout.footerLogoClass",
28194
- options: { requireExplicitShow: true }
28195
- }],
28196
- fallback: "rb-hidden"
28197
- } }
28198
- }, [
28199
- media({ className: { $bind: {
28200
- from: "$root.theme.footer.logo",
28201
- transforms: [{ id: "layout.footerLogoMediaClass" }],
28202
- fallback: "rb-w-auto"
28203
- } } }, when("content.logo"), bind("content.logo")),
28204
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
28205
- from: "$root.theme.footer.logo",
28206
- transforms: [{ id: "layout.footerLogoMediaClass" }],
28207
- fallback: "rb-w-auto"
28208
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
28209
- text({
28210
- as: "strong",
28211
- className: "footer-logo-text rb-nav-text"
28212
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
28213
- ]),
28214
- footerNav({
28215
- collectionPath: "footerMenu.items",
28216
- mode: "flatten",
28217
- className: { $bind: {
28218
- from: "$root.theme.footer.navLayout",
28219
- transforms: [{ id: "layout.footerSimpleNavClass" }],
28220
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
28221
- } },
28222
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
28223
- }),
28224
- ...bodyTextLayout(),
28225
- ...businessAddressLayout(),
28226
- ...inlineBottomTextLayout()
28227
- ], when("$root.theme.footer.variant", { equals: "simple" }));
28228
- const columnsFooterLayout = stack({
28229
- gap: "xl",
28230
- align: "start",
28285
+ const brandLogo = link({
28286
+ href: "/",
28231
28287
  className: { $bind: {
28232
- from: "$root.theme.footer.maxWidth",
28288
+ from: "$root.theme.footer.logo",
28233
28289
  transforms: [{
28234
- id: "layout.maxWidthClass",
28235
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
28290
+ id: "layout.footerLogoClass",
28291
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
28236
28292
  }],
28237
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
28293
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
28238
28294
  } }
28239
- }, [
28240
- footerNavGroupsLayout,
28241
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
28242
- as: "strong",
28243
- className: "rb-block rb-nav-text",
28244
- style: textColorStyle("text")
28245
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
28246
- collectionPath: "footerMenu.items",
28247
- mode: "links-only",
28248
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
28249
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
28250
- })]),
28251
- ...bodyTextLayout(),
28252
- ...businessAddressLayout(),
28253
- ...inlineBottomTextLayout()
28254
- ], when("$root.theme.footer.variant", { equals: "columns" }));
28255
- const splitFooterLayout = stack({
28256
- gap: "xl",
28257
- align: "start",
28295
+ }, [media({ className: { $bind: {
28296
+ from: "$root.theme.footer.logo",
28297
+ transforms: [{
28298
+ id: "layout.footerLogoMediaClass",
28299
+ options: { base: "rb-h-10 rb-w-auto" }
28300
+ }],
28301
+ fallback: "rb-h-10 rb-w-auto"
28302
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
28303
+ as: "strong",
28304
+ className: "footer-logo-text rb-nav-text"
28305
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
28306
+ const navigation = stack({
28307
+ gap: "md",
28308
+ className: "rb-w-full"
28309
+ }, [footerNavGroupsLayout, footerNav({
28310
+ collectionPath: "footerMenu.items",
28311
+ mode: "links-only",
28258
28312
  className: { $bind: {
28259
- from: "$root.theme.footer.maxWidth",
28260
- transforms: [{
28261
- id: "layout.maxWidthClass",
28262
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
28263
- }],
28264
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
28265
- } }
28313
+ from: "module.navigationClassName",
28314
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
28315
+ } },
28316
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
28317
+ })], when("module.kind", { equals: "navigation" }));
28318
+ const legalNavigation = footerNav({
28319
+ collectionPath: "legalFooterMenu.items",
28320
+ mode: "links-only",
28321
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
28322
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
28323
+ });
28324
+ const address = text({
28325
+ as: "address",
28326
+ className: "rb-not-italic rb-opacity-80"
28327
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
28328
+ const contact = stack({
28329
+ gap: "sm",
28330
+ className: "rb-items-start"
28331
+ }, [link({
28332
+ href: { $bind: { from: "contactLink.href" } },
28333
+ className: "rb-nav-text rb-break-words transition-theme-standard"
28334
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
28335
+ const hours = stack({
28336
+ gap: "sm",
28337
+ className: "rb-w-full"
28338
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
28339
+ as: "span",
28340
+ className: "rb-label"
28341
+ }, bind("hoursDay.weekday")), text({
28342
+ as: "span",
28343
+ className: "rb-caption rb-opacity-80"
28344
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
28345
+ as: "p",
28346
+ className: "rb-caption rb-opacity-70"
28347
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
28348
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
28349
+ href: { $bind: { from: "social.href" } },
28350
+ target: "_blank",
28351
+ rel: "noreferrer noopener",
28352
+ "aria-label": { $bind: { from: "social.label" } },
28353
+ className: "rb-nav-text transition-theme-standard"
28354
+ }, [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" }));
28355
+ const authoredCopy = richText({
28356
+ className: "rb-prose rb-prose-sm rb-max-w-none",
28357
+ style: textColorStyle("text/80")
28358
+ }, when("module.content"), bind("module.content", { transforms: [{
28359
+ id: "content.interpolateRichTextTokens",
28360
+ options: { tokens: ["year", "site_name"] }
28361
+ }] }));
28362
+ const footerGroup = stack({
28363
+ gap: "md",
28364
+ align: "stretch",
28365
+ className: "rb-min-w-0",
28366
+ "data-footer-group": { $bind: { from: "group.kind" } }
28367
+ }, [stack({
28368
+ gap: "md",
28369
+ align: "start",
28370
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
28266
28371
  }, [
28267
- inline({ className: { $bind: {
28268
- from: "$root.theme.footer.logo",
28269
- transforms: [{ id: "layout.footerSplitMainClass" }],
28270
- 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"
28271
- } } }, [stack({}, [footerNav({
28272
- collectionPath: "footerMenu.items",
28273
- mode: "flatten",
28274
- className: { $bind: {
28275
- from: "$root.theme.footer.navLayout",
28276
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
28277
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
28278
- } },
28279
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
28280
- })]), link({
28281
- href: "/",
28282
- className: { $bind: {
28283
- from: "$root.theme.footer.logo",
28284
- transforms: [{ id: "layout.footerLogoClass" }],
28285
- 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"
28286
- } }
28287
- }, [
28288
- media({ className: { $bind: {
28289
- from: "$root.theme.footer.logo",
28290
- transforms: [{ id: "layout.footerLogoMediaClass" }],
28291
- fallback: "rb-w-auto"
28292
- } } }, when("content.logo"), bind("content.logo")),
28293
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
28294
- from: "$root.theme.footer.logo",
28295
- transforms: [{ id: "layout.footerLogoMediaClass" }],
28296
- fallback: "rb-w-auto"
28297
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
28298
- text({
28299
- as: "strong",
28300
- className: "footer-logo-text rb-nav-text"
28301
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
28302
- ])]),
28303
- ...businessAddressLayout(),
28304
- ...inlineBottomTextLayout()
28305
- ], when("$root.theme.footer.variant", { equals: "split" }));
28306
- const footerLayout = section$1({
28307
- background: "background",
28372
+ text({
28373
+ as: "h2",
28374
+ className: "rb-label",
28375
+ style: textColorStyle("text/70")
28376
+ }, bind("module.heading"), when("module.heading")),
28377
+ brandLogo,
28378
+ navigation,
28379
+ stack({
28380
+ gap: "sm",
28381
+ className: "rb-w-full"
28382
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
28383
+ address,
28384
+ contact,
28385
+ hours,
28386
+ socials,
28387
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
28388
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
28389
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
28390
+ const footerMainRegion = stack({
28391
+ className: { $bind: { from: "region.className" } },
28392
+ "data-footer-region": { $bind: { from: "region.kind" } }
28393
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
28394
+ const footerBottomRegion = stack({ className: { $bind: {
28395
+ from: "$root.theme.footer",
28396
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
28397
+ fallback: "rb-w-full"
28398
+ } } }, [stack({
28308
28399
  className: { $bind: {
28309
28400
  from: "$root.theme.footer",
28310
- transforms: [{ id: "layout.footerRootClass" }],
28311
- fallback: "rb-w-full rb-border-t transition-theme"
28401
+ transforms: [{ id: "layout.footerBottomBarClass" }],
28402
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
28312
28403
  } },
28313
28404
  style: { $bind: {
28314
28405
  from: "$root.theme.footer",
28315
- transforms: [{ id: "layout.footerRootStyle" }],
28316
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
28317
- } }
28318
- }, [
28319
- simpleFooterLayout,
28320
- columnsFooterLayout,
28321
- splitFooterLayout,
28322
- stack({
28323
- className: { $bind: {
28324
- from: "$root.theme.footer",
28325
- transforms: [{ id: "layout.footerBottomBarClass" }],
28326
- fallback: "rb-w-full rb-border-t rb-py-5"
28327
- } },
28328
- style: { $bind: {
28329
- from: "$root.theme.footer",
28330
- transforms: [{ id: "layout.footerBottomBarStyle" }]
28331
- } }
28332
- }, [stack({ className: { $bind: {
28333
- from: "$root.theme.footer",
28334
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
28335
- fallback: "rb-container"
28336
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
28337
- ]);
28406
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
28407
+ } },
28408
+ "data-footer-region": "bottom"
28409
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
28338
28410
  const siteFooterManifest = createBlockManifest({
28339
28411
  id: "block.site-footer",
28340
28412
  title: "Site Footer",
28341
28413
  category: "layout",
28342
- fragments: [{
28343
- fragment: footerBottomTextFragment,
28344
- fieldPriority: 0
28345
- }],
28346
28414
  skipSectionStyles: true,
28347
- additionalFields: [{
28348
- id: "showBusinessAddress",
28349
- type: "boolean",
28350
- label: "Add business address to site footer?",
28351
- required: false,
28352
- defaultValue: false,
28353
- ui: { intent: "content" }
28354
- }],
28355
- layout: footerLayout,
28356
- description: "Site-wide footer with navigation links and optional columns.",
28415
+ layout: section$1({
28416
+ background: "background",
28417
+ className: { $bind: {
28418
+ from: "$root.theme.footer",
28419
+ transforms: [{ id: "layout.footerRootClass" }],
28420
+ fallback: "rb-w-full rb-border-t transition-theme"
28421
+ } },
28422
+ style: { $bind: {
28423
+ from: "$root.theme.footer",
28424
+ transforms: [{ id: "layout.footerRootStyle" }],
28425
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
28426
+ } },
28427
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
28428
+ }, [footerMainRegion, footerBottomRegion]),
28429
+ description: "Site-wide composed footer with canonical shared details.",
28357
28430
  styleTokens: { spacing: "md" },
28358
28431
  paletteHidden: true
28359
28432
  });
@@ -28832,7 +28905,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
28832
28905
  id: "boxStyles.all",
28833
28906
  options: {
28834
28907
  axis: "all",
28835
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
28908
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
28836
28909
  }
28837
28910
  }]
28838
28911
  },
@@ -43820,16 +43893,17 @@ const backgroundTransforms = [
43820
43893
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
43821
43894
  },
43822
43895
  {
43823
- id: "background.resolveAllowOverflow",
43896
+ id: "background.resolveFrameClassName",
43824
43897
  kind: "formatter",
43825
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
43826
- run: (value) => {
43827
- if (!value || typeof value !== "object") return false;
43898
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
43899
+ run: (value, options) => {
43900
+ const baseClass = options?.baseClass?.trim() ?? "";
43901
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
43828
43902
  const input = value;
43829
- if (input.overflow === true) return true;
43903
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
43830
43904
  const objectFit = isString$1(input.objectFit) ? input.objectFit.trim() : null;
43831
43905
  const scale = isString$1(input.scale) ? input.scale.trim() : isNumber$1(input.scale) ? String(input.scale) : null;
43832
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
43906
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
43833
43907
  }
43834
43908
  },
43835
43909
  {
@@ -44377,10 +44451,10 @@ function isRecord$17(value) {
44377
44451
  }
44378
44452
  //#endregion
44379
44453
  //#region ../blocks/src/primitives/layout/Section.tsx
44380
- const Section = forwardRef(function Section({ as: Comp = "section", children, background, className = "", allowOverflow = false, style, "data-slot": dataSlot }, ref) {
44454
+ const Section = forwardRef(function Section({ as: Comp = "section", children, background, className = "", style, "data-slot": dataSlot }, ref) {
44381
44455
  return /* @__PURE__ */ jsx(Comp, {
44382
44456
  ref,
44383
- className: clsx("rb-relative rb-isolate", allowOverflow ? "rb-overflow-visible" : "rb-overflow-hidden", className),
44457
+ className: clsx("rb-relative rb-isolate rb-overflow-visible", className),
44384
44458
  style: mergeStyles(typeof background === "string" && background.trim().length > 0 ? backgroundColorStyle(background.trim()) : void 0, style),
44385
44459
  "data-slot": dataSlot ?? "section",
44386
44460
  children
@@ -44501,10 +44575,7 @@ function Grid({ as: Comp = "div", cols = {
44501
44575
  }
44502
44576
  //#endregion
44503
44577
  //#region ../blocks/src/system/runtime/nodes/layout.tsx
44504
- const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, allowOverflow, ...props }) => /* @__PURE__ */ jsx(Section, {
44505
- ...props,
44506
- allowOverflow
44507
- });
44578
+ const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Section, { ...props });
44508
44579
  const StackNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Stack, { ...props });
44509
44580
  const InlineNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Inline, { ...props });
44510
44581
  const GridNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Grid, { ...props });
@@ -44514,6 +44585,28 @@ const FigureNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _b
44514
44585
  //#region ../path-utils/src/index.ts
44515
44586
  const PATH_SEPARATOR_REGEX$1 = /\./g;
44516
44587
  const BRACKET_ACCESS_REGEX$1 = /\[([^\]]+)\]/g;
44588
+ /**
44589
+ * Segments that would traverse or mutate the prototype chain.
44590
+ *
44591
+ * `setAtPath` creates nested objects along the path, so allowing these
44592
+ * segments is a prototype-pollution vector. They are rejected everywhere a
44593
+ * path is parsed (string or pre-parsed array form) — fail closed.
44594
+ */
44595
+ const UNSAFE_PATH_SEGMENTS = /* @__PURE__ */ new Set([
44596
+ "__proto__",
44597
+ "constructor",
44598
+ "prototype"
44599
+ ]);
44600
+ var UnsafePathSegmentError = class extends Error {
44601
+ constructor(segment) {
44602
+ super(`Unsafe path segment: "${segment}"`);
44603
+ this.name = "UnsafePathSegmentError";
44604
+ this.segment = segment;
44605
+ }
44606
+ };
44607
+ function assertSafePathSegments(segments) {
44608
+ for (const segment of segments) if (typeof segment === "string" && UNSAFE_PATH_SEGMENTS.has(segment)) throw new UnsafePathSegmentError(segment);
44609
+ }
44517
44610
  function isRecord$16(value) {
44518
44611
  return typeof value === "object" && value !== null && !Array.isArray(value);
44519
44612
  }
@@ -44525,7 +44618,10 @@ function getContainerValue(container, segment) {
44525
44618
  if (segment in container) return Reflect.get(container, segment);
44526
44619
  }
44527
44620
  function parsePath(path) {
44528
- if (Array.isArray(path)) return path;
44621
+ if (Array.isArray(path)) {
44622
+ assertSafePathSegments(path);
44623
+ return path;
44624
+ }
44529
44625
  const segments = [];
44530
44626
  const parts = path.split(PATH_SEPARATOR_REGEX$1);
44531
44627
  for (const raw of parts) {
@@ -44545,6 +44641,7 @@ function parsePath(path) {
44545
44641
  }
44546
44642
  if (baseMatch === null && !raw.includes("[")) segments.push(raw);
44547
44643
  }
44644
+ assertSafePathSegments(segments);
44548
44645
  return segments;
44549
44646
  }
44550
44647
  function getAtPath(source, path) {
@@ -44786,6 +44883,58 @@ function getCtaIconComponent(name) {
44786
44883
  return CTA_ICON_COMPONENTS[name] ?? null;
44787
44884
  }
44788
44885
  //#endregion
44886
+ //#region ../blocks/src/system/icons/social.tsx
44887
+ const SOCIAL_ICON_NAMES = [
44888
+ "SocialFacebook",
44889
+ "SocialInstagram",
44890
+ "SocialLinkedIn",
44891
+ "SocialTikTok",
44892
+ "SocialX",
44893
+ "SocialYouTube"
44894
+ ];
44895
+ const socialIcons = {
44896
+ SocialFacebook: createIcon("SocialFacebookIcon", /* @__PURE__ */ jsx("path", { d: "M14 8h3V4h-3c-3 0-5 2-5 5v3H6v4h3v6h4v-6h3l1-4h-4V9c0-.7.3-1 1-1Z" })),
44897
+ SocialInstagram: createIcon("SocialInstagramIcon", /* @__PURE__ */ jsxs(Fragment, { children: [
44898
+ /* @__PURE__ */ jsx("rect", {
44899
+ x: "3",
44900
+ y: "3",
44901
+ width: "18",
44902
+ height: "18",
44903
+ rx: "5"
44904
+ }),
44905
+ /* @__PURE__ */ jsx("circle", {
44906
+ cx: "12",
44907
+ cy: "12",
44908
+ r: "4"
44909
+ }),
44910
+ /* @__PURE__ */ jsx("circle", {
44911
+ cx: "17.5",
44912
+ cy: "6.5",
44913
+ r: ".75",
44914
+ fill: "currentColor",
44915
+ stroke: "none"
44916
+ })
44917
+ ] })),
44918
+ SocialLinkedIn: createIcon("SocialLinkedInIcon", /* @__PURE__ */ jsxs(Fragment, { children: [
44919
+ /* @__PURE__ */ jsx("path", { d: "M6 9v10" }),
44920
+ /* @__PURE__ */ jsx("path", {
44921
+ d: "M6 5.5v.01",
44922
+ strokeWidth: "3"
44923
+ }),
44924
+ /* @__PURE__ */ jsx("path", { d: "M10.5 19v-6a4 4 0 0 1 8 0v6" }),
44925
+ /* @__PURE__ */ jsx("path", { d: "M10.5 9v10" })
44926
+ ] })),
44927
+ 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" })] })),
44928
+ SocialX: createIcon("SocialXIcon", /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("path", { d: "m5 4 14 16" }), /* @__PURE__ */ jsx("path", { d: "M19 4 5 20" })] })),
44929
+ 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" })] }))
44930
+ };
44931
+ function isSocialIconName(value) {
44932
+ return typeof value === "string" && SOCIAL_ICON_NAMES.includes(value);
44933
+ }
44934
+ function getSocialIconComponent(value) {
44935
+ return isSocialIconName(value) ? socialIcons[value] : null;
44936
+ }
44937
+ //#endregion
44789
44938
  //#region ../blocks/src/system/icons/registry.ts
44790
44939
  function buildSearchText(parts) {
44791
44940
  return parts.map((part) => part.trim()).filter(Boolean).join(" ");
@@ -44815,7 +44964,7 @@ function semanticOptionsForPreset(preset) {
44815
44964
  }
44816
44965
  semanticOptionsForPreset("feature");
44817
44966
  function getIconComponent(name) {
44818
- return getCtaIconComponent(name) ?? getSemanticIconComponent(name);
44967
+ return getCtaIconComponent(name) ?? getSemanticIconComponent(name) ?? getSocialIconComponent(name);
44819
44968
  }
44820
44969
  //#endregion
44821
44970
  //#region ../blocks/src/system/runtime/nodes/buttonAffordance.ts
@@ -45607,7 +45756,6 @@ const HeaderSectionNode = ({ blockId, children, className, "data-preview-site-ch
45607
45756
  const asProp = rest.as;
45608
45757
  const styleProp = rest.style;
45609
45758
  const backgroundProp = typeof rest.background === "string" ? rest.background : void 0;
45610
- const allowOverflowProp = typeof rest.allowOverflow === "boolean" ? rest.allowOverflow : void 0;
45611
45759
  const dataSlotProp = typeof rest["data-slot"] === "string" ? rest["data-slot"] : void 0;
45612
45760
  return /* @__PURE__ */ jsxs("nav", {
45613
45761
  ...getIslandRootProps("headerSection", blockId),
@@ -45622,7 +45770,6 @@ const HeaderSectionNode = ({ blockId, children, className, "data-preview-site-ch
45622
45770
  as: asProp,
45623
45771
  style: styleProp,
45624
45772
  background: backgroundProp ?? "background",
45625
- allowOverflow: allowOverflowProp,
45626
45773
  "data-slot": dataSlotProp,
45627
45774
  className: sectionClasses || void 0,
45628
45775
  children
@@ -50342,7 +50489,7 @@ function resolveGroupFrame(cardStyles) {
50342
50489
  contentClassName: "offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
50343
50490
  };
50344
50491
  return {
50345
- 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(" "),
50492
+ 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(" "),
50346
50493
  containerStyle: resolveGroupFrameStyle(cardStyles),
50347
50494
  contentClassName: "card-content offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
50348
50495
  };
@@ -53375,9 +53522,9 @@ function isReactNode(value) {
53375
53522
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
53376
53523
  */
53377
53524
  function resolveNode(node, context, indexFallback) {
53378
- if (!shouldRenderNode(node, context)) return null;
53379
53525
  const scopeContext = applyScopes(node, context);
53380
53526
  if (node.$repeat) return resolveRepeater(node, scopeContext);
53527
+ if (!shouldRenderNode(node, scopeContext)) return null;
53381
53528
  const registry = scopeContext.registry ?? serverComponentRegistry;
53382
53529
  const normalizedType = node.type.toLowerCase();
53383
53530
  const component = registry[node.type] ?? registry[normalizedType] ?? (normalizedType === "section" ? SectionNode : void 0);
@@ -54835,6 +54982,19 @@ const NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
54835
54982
  //#region ../theme-core/src/header/generateHeaderCss.ts
54836
54983
  const HEADER_BLUR = "blur(12px)";
54837
54984
  const FLOATING_BLUR = "blur(16px)";
54985
+ const INSET_SHELL_MARKER_CLASS = "header-bar-frame-inset-shell";
54986
+ const INSET_SHELL_EDGE = "1rem";
54987
+ const INSET_SHELL_INSET_BLOCK = "0.875rem";
54988
+ const INSET_SHELL_RADIUS = "9999px";
54989
+ const INSET_SHELL_CONTAINER_MAX = "80rem";
54990
+ const INSET_SHELL_INTERIOR_PADDING_X = "1.75rem";
54991
+ /**
54992
+ * Whether the classic header should render as an inset "brand capsule" shell.
54993
+ * The facet is only meaningful for the classic layout; other variants ignore it.
54994
+ */
54995
+ function usesInsetShell(header) {
54996
+ return header.barFrame === "inset-shell" && header.variant === "classic";
54997
+ }
54838
54998
  /**
54839
54999
  * Generate complete CSS for header system from theme config
54840
55000
  *
@@ -54934,7 +55094,36 @@ function generateHeaderRootStyles(header, themeId, tokens, _theme) {
54934
55094
  const baseBlock = `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
54935
55095
  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`;
54936
55096
  if (isContainedNav || backgroundRules.length === 0) return `${baseBlock}\n${overlayFix}`;
54937
- 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}`;
55097
+ 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) : ""}`;
55098
+ }
55099
+ /**
55100
+ * Reshapes the full-bleed header paint layer into a contained brand capsule at
55101
+ * the desktop breakpoint. The capsule is centred, capped to the page container
55102
+ * width, inset from the top, fully rounded, and carries the header depth so it
55103
+ * reads as a floating pill. Root border/shadow are neutralised on desktop so a
55104
+ * bordered style does not leave a full-width hairline around the capsule. Sticky
55105
+ * positioning is unaffected — the root stays full width and sticky while the
55106
+ * ::before paint provides the capsule.
55107
+ */
55108
+ function generateInsetShellStyles(header, themeId) {
55109
+ const scope = `:where([data-theme-scope="${themeId}"])`;
55110
+ const shellRootSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}`;
55111
+ const shellBeforeSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}::before`;
55112
+ const layoutSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS} .rb-header-layout`;
55113
+ const widthValue = header.maxWidth === "full" ? `calc(100% - (${INSET_SHELL_EDGE} * 2))` : `min(${INSET_SHELL_CONTAINER_MAX}, calc(100% - (${INSET_SHELL_EDGE} * 2)))`;
55114
+ const shadowVar = getComponentShadowVar(header.shadow?.elevation ?? "none");
55115
+ const rootRules = ["border: none;", "box-shadow: none;"];
55116
+ const beforeRules = [
55117
+ `inset: ${INSET_SHELL_INSET_BLOCK} auto;`,
55118
+ "left: 50%;",
55119
+ "right: auto;",
55120
+ "transform: translateX(-50%);",
55121
+ `width: ${widthValue};`,
55122
+ `border-radius: ${INSET_SHELL_RADIUS};`,
55123
+ ...shadowVar ? [`box-shadow: ${shadowVar};`] : []
55124
+ ];
55125
+ const layoutRules = [`padding-inline: ${INSET_SHELL_INTERIOR_PADDING_X};`];
55126
+ 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`;
54938
55127
  }
54939
55128
  /**
54940
55129
  * Generate logo typography styles
@@ -55012,7 +55201,7 @@ function generateLogoTextBehaviorStyles(logoText, themeId) {
55012
55201
  */
55013
55202
  function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment, navTextSize) {
55014
55203
  const navPreferences = {
55015
- typography: header.navTypography ?? "inherit",
55204
+ typography: header.navFontRole ?? header.navTypography ?? "inherit",
55016
55205
  fontSize: readHeaderNavFontSizePreference(header.navTextSize)
55017
55206
  };
55018
55207
  if (header.navLinkStyle) return generateNavLinkCSS({
@@ -59325,6 +59514,12 @@ const containerResponsiveThemeCss = `/*
59325
59514
  .rb-lg-hidden {
59326
59515
  display: none;
59327
59516
  }
59517
+ .rb-lg-flex-row {
59518
+ flex-direction: row;
59519
+ }
59520
+ .rb-lg-items-center {
59521
+ align-items: center;
59522
+ }
59328
59523
  }
59329
59524
 
59330
59525
  }
@@ -70761,7 +70956,7 @@ const containerResponsiveThemeCss = `/*
70761
70956
  [data-block="feature-cards"][data-block-composition="asymmetric-emphasis"]
70762
70957
  .rb-feature-card {
70763
70958
  height: auto;
70764
- overflow: hidden;
70959
+ overflow: visible;
70765
70960
  border: 0;
70766
70961
  border-radius: 0;
70767
70962
  background: transparent;
@@ -71380,8 +71575,6 @@ function ThemeScope$1({ theme, children, themeId = "theme-default", responsiveMo
71380
71575
  children
71381
71576
  });
71382
71577
  }
71383
- //#endregion
71384
- //#region ../theme-core/src/footer/mode.ts
71385
71578
  /**
71386
71579
  * Resolve what to render for the footer given the current mode and whether the
71387
71580
  * site is SDK-managed.
@@ -71880,19 +72073,9 @@ function getPrimaryNavigation(navigation) {
71880
72073
  return a.id.localeCompare(b.id);
71881
72074
  })[0] ?? null;
71882
72075
  }
71883
- /**
71884
- * Get the footer navigation menu object.
71885
- * Returns menu marked as isFooter, or null if none marked.
71886
- *
71887
- * @example
71888
- * ```ts
71889
- * const menu = getFooterNavigation(siteData.navigation);
71890
- * console.log(menu?.name); // "Footer menu"
71891
- * ```
71892
- */
71893
- function getFooterNavigation(navigation) {
72076
+ function getFooterNavigationByRole(navigation, role) {
71894
72077
  if (!navigation || navigation.length === 0) return null;
71895
- const footerMenus = navigation.filter((menu) => menu.isFooter);
72078
+ const footerMenus = navigation.filter((menu) => menu.footerRole === role || role === "main" && menu.footerRole == null && menu.isFooter);
71896
72079
  if (footerMenus.length > 1) console.warn(`[riverbank/sdk] Multiple footer navigation menus detected (${footerMenus.length}); using first flagged menu by input order.`);
71897
72080
  return footerMenus[0] ?? null;
71898
72081
  }
@@ -72105,7 +72288,10 @@ function buildMenu(navigation, routes, options) {
72105
72288
  * ```
72106
72289
  */
72107
72290
  function buildFooterMenu(navigation, routes, options) {
72108
- const menu = getFooterNavigation(navigation);
72291
+ return buildFooterMenuForRole(navigation, routes, "main", options);
72292
+ }
72293
+ function buildFooterMenuForRole(navigation, routes, role, options) {
72294
+ const menu = getFooterNavigationByRole(navigation, role);
72109
72295
  if (!menu) return {
72110
72296
  items: [],
72111
72297
  ctaItem: null,
@@ -72272,6 +72458,7 @@ async function Layout({ siteData: providedSiteData, client, siteId, slug, domain
72272
72458
  };
72273
72459
  const menuViewModel = buildMenu(navigation, routes, navigationOptions);
72274
72460
  const footerMenuViewModel = buildFooterMenu(navigation, routes, navigationOptions);
72461
+ const legalFooterMenuViewModel = buildFooterMenuForRole(navigation, routes, "legal-policy", navigationOptions);
72275
72462
  const logoViewModel = buildLogo(layout.logo ?? null, site.title);
72276
72463
  const headerData = {
72277
72464
  menu: menuViewModel,
@@ -72283,6 +72470,7 @@ async function Layout({ siteData: providedSiteData, client, siteId, slug, domain
72283
72470
  const footerData = {
72284
72471
  menu: menuViewModel,
72285
72472
  footerMenu: footerMenuViewModel,
72473
+ legalFooterMenu: legalFooterMenuViewModel,
72286
72474
  logo: logoViewModel,
72287
72475
  site,
72288
72476
  theme,
@@ -72318,6 +72506,7 @@ async function Layout({ siteData: providedSiteData, client, siteId, slug, domain
72318
72506
  site,
72319
72507
  menu: menuViewModel,
72320
72508
  footerMenu: footerMenuViewModel,
72509
+ legalFooterMenu: legalFooterMenuViewModel,
72321
72510
  content: { logo: logoViewModel }
72322
72511
  };
72323
72512
  let headerElement = null;
@@ -72848,6 +73037,7 @@ const TAG_TEMPLATES = {
72848
73037
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
72849
73038
  routeById: "riverbank:route:{routeId}",
72850
73039
  pageById: "riverbank:page:{pageId}",
73040
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
72851
73041
  workflowRunById: "riverbank:workflow-run:{runId}",
72852
73042
  siteForms: "riverbank:site:{siteId}:forms",
72853
73043
  formById: "riverbank:form:{formId}",
@@ -72871,7 +73061,7 @@ const TAG_TEMPLATES = {
72871
73061
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
72872
73062
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
72873
73063
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
72874
- 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;
73064
+ 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;
72875
73065
  z$1.object({
72876
73066
  formulaVersion: z$1.literal("managed-domain-overage-v1"),
72877
73067
  conversionRule: z$1.literal("usd-to-gbp-1-to-1-v1"),