@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
@@ -24,6 +24,14 @@ var __exportAll = (all, no_symbols) => {
24
24
  if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
25
25
  return target;
26
26
  };
27
+ //#endregion
28
+ //#region ../api/src/apiEndpointTypes.ts
29
+ function allowedDemoMutationPolicy() {
30
+ return {
31
+ classification: "allowed",
32
+ publicMessage: ""
33
+ };
34
+ }
27
35
  function blockedDemoMutationPolicy(classification, publicMessage) {
28
36
  if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
29
37
  return {
@@ -49,6 +57,7 @@ const TAG_TEMPLATES = {
49
57
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
50
58
  routeById: "riverbank:route:{routeId}",
51
59
  pageById: "riverbank:page:{pageId}",
60
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
52
61
  workflowRunById: "riverbank:workflow-run:{runId}",
53
62
  siteForms: "riverbank:site:{siteId}:forms",
54
63
  formById: "riverbank:form:{formId}",
@@ -74,6 +83,7 @@ const TAG_TEMPLATES = {
74
83
  const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
75
84
  const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
76
85
  const DEMO_MUTATION_INTERNAL_ONLY = blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
86
+ const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
77
87
  const API_ENDPOINTS$1 = {
78
88
  aiContentUpdateChat: {
79
89
  path: "/ai/content-update-chat",
@@ -2212,6 +2222,49 @@ const API_ENDPOINTS$1 = {
2212
2222
  auth: "user",
2213
2223
  responseKind: "json"
2214
2224
  },
2225
+ updatePageSurfaceDraftContent: {
2226
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/content",
2227
+ method: "PUT",
2228
+ errors: [
2229
+ "validation:invalid_input",
2230
+ "resource:not_found",
2231
+ "resource:conflict",
2232
+ "server:internal_error"
2233
+ ],
2234
+ tags: [TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById],
2235
+ auth: "user",
2236
+ responseKind: "json"
2237
+ },
2238
+ discardPageSurfaceDraftContent: {
2239
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/content/draft",
2240
+ method: "DELETE",
2241
+ errors: [
2242
+ "validation:invalid_input",
2243
+ "resource:not_found",
2244
+ "resource:conflict",
2245
+ "server:internal_error"
2246
+ ],
2247
+ tags: [TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById],
2248
+ auth: "user",
2249
+ responseKind: "json"
2250
+ },
2251
+ updatePageSurfaceRouteMetadata: {
2252
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/metadata",
2253
+ method: "PATCH",
2254
+ errors: [
2255
+ "validation:invalid_input",
2256
+ "resource:not_found",
2257
+ "resource:conflict",
2258
+ "server:internal_error"
2259
+ ],
2260
+ tags: [
2261
+ TAG_TEMPLATES.siteCollection,
2262
+ TAG_TEMPLATES.siteRoutableContent,
2263
+ TAG_TEMPLATES.pageSurfaceById
2264
+ ],
2265
+ auth: "user",
2266
+ responseKind: "json"
2267
+ },
2215
2268
  runSdkWorkflow: {
2216
2269
  path: "/sites/{siteId}/content/{type}/{entryId}/workflows/{workflowId}/run",
2217
2270
  method: "POST",
@@ -2592,6 +2645,50 @@ const API_ENDPOINTS$1 = {
2592
2645
  errors: [],
2593
2646
  responseKind: "json"
2594
2647
  },
2648
+ getFooterComposition: {
2649
+ path: "/sites/{siteId}/settings/footer-composition",
2650
+ method: "GET",
2651
+ revalidate: 120,
2652
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2653
+ auth: "user",
2654
+ errors: ["resource:not_found", "server:internal_error"],
2655
+ responseKind: "json"
2656
+ },
2657
+ updateFooterComposition: {
2658
+ path: "/sites/{siteId}/settings/footer-composition",
2659
+ method: "POST",
2660
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2661
+ auth: "user",
2662
+ demoMutation: DEMO_MUTATION_ALLOWED,
2663
+ errors: [
2664
+ "validation:invalid_input",
2665
+ "resource:not_found",
2666
+ "server:internal_error"
2667
+ ],
2668
+ responseKind: "json"
2669
+ },
2670
+ getPublicProfile: {
2671
+ path: "/sites/{siteId}/settings/public-profile",
2672
+ method: "GET",
2673
+ revalidate: 120,
2674
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2675
+ auth: "user",
2676
+ errors: ["resource:not_found", "server:internal_error"],
2677
+ responseKind: "json"
2678
+ },
2679
+ updatePublicProfile: {
2680
+ path: "/sites/{siteId}/settings/public-profile",
2681
+ method: "POST",
2682
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2683
+ auth: "user",
2684
+ demoMutation: DEMO_MUTATION_ALLOWED,
2685
+ errors: [
2686
+ "validation:invalid_input",
2687
+ "resource:not_found",
2688
+ "server:internal_error"
2689
+ ],
2690
+ responseKind: "json"
2691
+ },
2595
2692
  updateSiteLayoutSettings: {
2596
2693
  path: "/sites/{siteId}/settings/layout",
2597
2694
  method: "POST",
@@ -3664,6 +3761,76 @@ const API_ENDPOINTS$1 = {
3664
3761
  responseKind: "json",
3665
3762
  errors: ["resource:not_found"]
3666
3763
  },
3764
+ listPageSurfaceContentSlots: {
3765
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots",
3766
+ method: "GET",
3767
+ tags: [
3768
+ TAG_TEMPLATES.siteCollection,
3769
+ TAG_TEMPLATES.pageSurfaceById,
3770
+ "surface-slots",
3771
+ "blocks"
3772
+ ],
3773
+ auth: "user",
3774
+ responseKind: "json",
3775
+ errors: [
3776
+ "resource:not_found",
3777
+ "resource:conflict",
3778
+ "server:internal_error"
3779
+ ]
3780
+ },
3781
+ createPageSurfaceSlotBlock: {
3782
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots/{slotKey}/blocks",
3783
+ method: "POST",
3784
+ tags: [
3785
+ TAG_TEMPLATES.siteCollection,
3786
+ TAG_TEMPLATES.pageSurfaceById,
3787
+ "surface-slot-{slotKey}",
3788
+ "blocks"
3789
+ ],
3790
+ auth: "user",
3791
+ responseKind: "json",
3792
+ errors: [
3793
+ "validation:invalid_input",
3794
+ "resource:not_found",
3795
+ "resource:conflict",
3796
+ "server:internal_error"
3797
+ ]
3798
+ },
3799
+ reorderPageSurfaceSlotBlocks: {
3800
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots/{slotKey}/blocks/reorder",
3801
+ method: "POST",
3802
+ tags: [
3803
+ TAG_TEMPLATES.siteCollection,
3804
+ TAG_TEMPLATES.pageSurfaceById,
3805
+ "surface-slot-{slotKey}",
3806
+ "blocks"
3807
+ ],
3808
+ auth: "user",
3809
+ responseKind: "json",
3810
+ errors: [
3811
+ "validation:invalid_input",
3812
+ "resource:not_found",
3813
+ "resource:conflict",
3814
+ "server:internal_error"
3815
+ ]
3816
+ },
3817
+ deletePageSurfaceSlotBlock: {
3818
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots/{slotKey}/blocks/{blockId}",
3819
+ method: "DELETE",
3820
+ tags: [
3821
+ TAG_TEMPLATES.siteCollection,
3822
+ TAG_TEMPLATES.pageSurfaceById,
3823
+ "surface-slot-{slotKey}",
3824
+ "blocks"
3825
+ ],
3826
+ auth: "user",
3827
+ responseKind: "json",
3828
+ errors: [
3829
+ "resource:not_found",
3830
+ "resource:conflict",
3831
+ "server:internal_error"
3832
+ ]
3833
+ },
3667
3834
  createBlock: {
3668
3835
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3669
3836
  method: "POST",
@@ -6276,6 +6443,19 @@ const API_ENDPOINTS$1 = {
6276
6443
  auth: "service",
6277
6444
  responseKind: "json"
6278
6445
  },
6446
+ sdkPatchPageBlock: {
6447
+ path: "/sdk/{siteId}/pages/{identifier}/blocks/{blockIdentifier}",
6448
+ method: "PATCH",
6449
+ errors: [
6450
+ "validation:invalid_input",
6451
+ "resource:not_found",
6452
+ "resource:conflict",
6453
+ "billing:plan_limit_exceeded",
6454
+ "server:internal_error"
6455
+ ],
6456
+ auth: "service",
6457
+ responseKind: "json"
6458
+ },
6279
6459
  sdkReorderPageBlocks: {
6280
6460
  path: "/sdk/{siteId}/pages/{identifier}/blocks/reorder",
6281
6461
  method: "POST",
@@ -6938,6 +7118,108 @@ const API_ENDPOINTS$1 = {
6938
7118
  ]
6939
7119
  }
6940
7120
  };
7121
+ const API_ERROR_CODE_SET = /* @__PURE__ */ new Set([
7122
+ "auth:unauthenticated",
7123
+ "auth:token_expired",
7124
+ "auth:token_invalid",
7125
+ "auth:forbidden",
7126
+ "auth:mfa_required",
7127
+ "auth:sudo_required",
7128
+ "auth:insufficient_permissions",
7129
+ "auth:impersonation_restricted",
7130
+ "validation:invalid_input",
7131
+ "validation:missing_field",
7132
+ "validation:invalid_format",
7133
+ "validation:payload_too_large",
7134
+ "resource:not_found",
7135
+ "resource:already_exists",
7136
+ "resource:conflict",
7137
+ "resource:gone",
7138
+ "rate_limit:exceeded",
7139
+ "billing:payment_required",
7140
+ "billing:plan_limit_exceeded",
7141
+ "billing:pass_redemption_failed",
7142
+ "server:internal_error",
7143
+ "server:unavailable",
7144
+ "external:service_error",
7145
+ "external:registrar_orphaned_contact_profile",
7146
+ "network:connection_error",
7147
+ "network:timeout",
7148
+ "network:dns_error"
7149
+ ]);
7150
+ function isApiErrorCode(value) {
7151
+ return typeof value === "string" && API_ERROR_CODE_SET.has(value);
7152
+ }
7153
+ function isApiError(result) {
7154
+ return result.success === false;
7155
+ }
7156
+ function isApiSuccess(result) {
7157
+ return result.success === true;
7158
+ }
7159
+ function isRecord$32(value) {
7160
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7161
+ }
7162
+ function isFieldError(value) {
7163
+ return isRecord$32(value) && typeof value.field === "string" && typeof value.code === "string" && typeof value.message === "string";
7164
+ }
7165
+ function fieldErrorsFromUnknown(value) {
7166
+ if (!Array.isArray(value)) return null;
7167
+ return value.every(isFieldError) ? value : null;
7168
+ }
7169
+ function extractEnvelopeErrorObject(body) {
7170
+ if (!isRecord$32(body)) return null;
7171
+ const error = body.error;
7172
+ if (!isRecord$32(error)) return null;
7173
+ if ("success" in body && body.success !== false) return null;
7174
+ return error;
7175
+ }
7176
+ function extractApiEnvelopeErrorDetails(body) {
7177
+ const error = extractEnvelopeErrorObject(body);
7178
+ if (!error) return {
7179
+ rawCode: null,
7180
+ code: null,
7181
+ message: null,
7182
+ status: null,
7183
+ fieldErrors: null
7184
+ };
7185
+ const rawCode = typeof error.code === "string" ? error.code : null;
7186
+ const message = typeof error.message === "string" && error.message.trim().length > 0 ? error.message : null;
7187
+ return {
7188
+ rawCode,
7189
+ code: isApiErrorCode(rawCode) ? rawCode : null,
7190
+ message,
7191
+ status: typeof error.status === "number" && Number.isFinite(error.status) ? error.status : null,
7192
+ fieldErrors: fieldErrorsFromUnknown(error.fieldErrors)
7193
+ };
7194
+ }
7195
+ /**
7196
+ * Error class for API failures that can be thrown from unwrapResponse.
7197
+ * Preserves all error metadata from the envelope.
7198
+ */
7199
+ var ApiEnvelopeError = class extends Error {
7200
+ constructor(error) {
7201
+ super(error.message);
7202
+ this.name = "ApiEnvelopeError";
7203
+ this.code = error.code;
7204
+ this.requestId = error.requestId;
7205
+ this.timestamp = error.timestamp;
7206
+ this.status = error.status;
7207
+ this.fieldErrors = error.fieldErrors;
7208
+ }
7209
+ };
7210
+ /**
7211
+ * Unwrap a successful API response or throw on error.
7212
+ *
7213
+ * @example
7214
+ * ```typescript
7215
+ * const response = await apiClient({ endpoint: 'getUser', params: { id } });
7216
+ * const user = unwrapResponse(response); // Throws if not success
7217
+ * ```
7218
+ */
7219
+ function unwrapResponse(result) {
7220
+ if (isApiSuccess(result)) return result.data;
7221
+ throw new ApiEnvelopeError(result.error);
7222
+ }
6941
7223
  //#endregion
6942
7224
  //#region ../core/src/result.ts
6943
7225
  function ok$2(value) {
@@ -7151,7 +7433,7 @@ var init_event_pricing = __esmMin((() => {
7151
7433
  //#endregion
7152
7434
  //#region ../core/src/event-page-surface-subject.ts
7153
7435
  function parseEventPageSurfaceSubject(value) {
7154
- if (!isRecord$30(value)) return err$2({ kind: "notObject" });
7436
+ if (!isRecord$31(value)) return err$2({ kind: "notObject" });
7155
7437
  switch (value.kind) {
7156
7438
  case "eventSeries": {
7157
7439
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -7194,7 +7476,7 @@ function parseEventPageSurfaceSubject(value) {
7194
7476
  });
7195
7477
  }
7196
7478
  }
7197
- function isRecord$30(value) {
7479
+ function isRecord$31(value) {
7198
7480
  return typeof value === "object" && value !== null && !Array.isArray(value);
7199
7481
  }
7200
7482
  var init_event_page_surface_subject = __esmMin((() => {
@@ -7588,6 +7870,25 @@ var init_participant_identity = __esmMin((() => {
7588
7870
  init_assertNever();
7589
7871
  }));
7590
7872
  var init_public_url_validation = __esmMin((() => {}));
7873
+ var init_public_profile = __esmMin((() => {
7874
+ init_public_url_validation();
7875
+ init_result();
7876
+ })), sectionKinds;
7877
+ var init_footer_composition = __esmMin((() => {
7878
+ init_result();
7879
+ sectionKinds = [
7880
+ "brand",
7881
+ "supporting-text",
7882
+ "social-links",
7883
+ "navigation",
7884
+ "business-address",
7885
+ "contact",
7886
+ "opening-hours",
7887
+ "legal-navigation",
7888
+ "legal"
7889
+ ];
7890
+ new Map(sectionKinds.map((kind, index) => [kind, index]));
7891
+ }));
7591
7892
  var init_number_input = __esmMin((() => {}));
7592
7893
  var init_field_errors = __esmMin((() => {})), init_form_submission_preview = __esmMin((() => {
7593
7894
  init_string();
@@ -7622,7 +7923,7 @@ function sortStableJsonValue(value) {
7622
7923
  if (typeof value === "object") {
7623
7924
  const prototype = Object.getPrototypeOf(value);
7624
7925
  if (prototype !== Object.prototype && prototype !== null) throw new TypeError("Stable JSON only supports plain objects");
7625
- return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, child]) => [key, sortStableJsonValue(child)]));
7926
+ return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([key, child]) => [key, sortStableJsonValue(child)]));
7626
7927
  }
7627
7928
  throw new TypeError(`Stable JSON does not support ${typeof value}`);
7628
7929
  }
@@ -7685,6 +7986,8 @@ var init_src$3 = __esmMin((() => {
7685
7986
  init_participants();
7686
7987
  init_participant_identity();
7687
7988
  init_public_url_validation();
7989
+ init_public_profile();
7990
+ init_footer_composition();
7688
7991
  init_number_input();
7689
7992
  init_field_errors();
7690
7993
  init_form_submission_preview();
@@ -7992,7 +8295,7 @@ function containsUnsafePathSegmentCharacter(value) {
7992
8295
  function isReservedPathSegment(value) {
7993
8296
  return value === "." || value === "..";
7994
8297
  }
7995
- function isUnsafePathSegment(segment) {
8298
+ function isUnsafePathSegment$1(segment) {
7996
8299
  return segment.trim().length === 0 || segment !== segment.trim() || isReservedPathSegment(segment) || containsUnsafePathSegmentCharacter(segment);
7997
8300
  }
7998
8301
  var CONTROL_CHARACTER_PATTERN$1, init_fileSafety = __esmMin((() => {
@@ -8021,7 +8324,7 @@ function parseStoragePath(value) {
8021
8324
  * that every tenant/site identifier remains one segment, never a nested path.
8022
8325
  */
8023
8326
  function joinStoragePathSegments(segments) {
8024
- if (segments.some(isUnsafePathSegment)) return err$2("unsafe-path-segment");
8327
+ if (segments.some(isUnsafePathSegment$1)) return err$2("unsafe-path-segment");
8025
8328
  return ok$2(unsafeAsStoragePath(segments.join("/")));
8026
8329
  }
8027
8330
  var FILE_STORAGE_BUCKETS, PRIVATE_SITE_FILE_BUCKET_MIME_TYPES;
@@ -8107,11 +8410,11 @@ var init_storagePathDomain = __esmMin((() => {}));
8107
8410
  var init_fileAssetLegacyProjection = __esmMin((() => {}));
8108
8411
  //#endregion
8109
8412
  //#region ../media-core/src/typeGuards.ts
8110
- function isRecord$28(value) {
8413
+ function isRecord$27(value) {
8111
8414
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
8112
8415
  }
8113
8416
  function asRecord$3(value) {
8114
- return isRecord$28(value) ? value : void 0;
8417
+ return isRecord$27(value) ? value : void 0;
8115
8418
  }
8116
8419
  var init_typeGuards$1 = __esmMin((() => {}));
8117
8420
  function isFileJsonObject(value) {
@@ -8121,7 +8424,7 @@ function isFileJsonValue(value) {
8121
8424
  if (value === null || typeof value === "string" || typeof value === "boolean") return true;
8122
8425
  if (typeof value === "number") return Number.isFinite(value);
8123
8426
  if (Array.isArray(value)) return value.every(isFileJsonValue);
8124
- return isRecord$28(value) && isFileJsonObject(value);
8427
+ return isRecord$27(value) && isFileJsonObject(value);
8125
8428
  }
8126
8429
  var init_filePersistence = __esmMin((() => {
8127
8430
  init_src$3();
@@ -8486,7 +8789,7 @@ function isCmsMediaObjectType(value) {
8486
8789
  return typeof value === "string" && CMS_MEDIA_OBJECT_TYPES.includes(value);
8487
8790
  }
8488
8791
  function isCmsMediaObject(value) {
8489
- if (!isRecord$28(value)) return false;
8792
+ if (!isRecord$27(value)) return false;
8490
8793
  const type = value.type;
8491
8794
  if (!isCmsMediaObjectType(type)) return false;
8492
8795
  if ("attrs" in value) return false;
@@ -8497,7 +8800,7 @@ function collectMediaObjects(value, out, location = "") {
8497
8800
  value.forEach((item, index) => collectMediaObjects(item, out, `${location}[${index}]`));
8498
8801
  return;
8499
8802
  }
8500
- if (!isRecord$28(value)) return;
8803
+ if (!isRecord$27(value)) return;
8501
8804
  if (isCmsMediaObject(value)) out.push({
8502
8805
  obj: value,
8503
8806
  location
@@ -8531,8 +8834,8 @@ function walkAndCollectImageAttrs(value, out, location = "") {
8531
8834
  value.forEach((item, index) => walkAndCollectImageAttrs(item, out, `${location}[${index}]`));
8532
8835
  return;
8533
8836
  }
8534
- if (!isRecord$28(value)) return;
8535
- if (value.type === "image" && isRecord$28(value.attrs)) out.push({
8837
+ if (!isRecord$27(value)) return;
8838
+ if (value.type === "image" && isRecord$27(value.attrs)) out.push({
8536
8839
  attrs: value.attrs,
8537
8840
  location: location ? `${location}.attrs` : "attrs"
8538
8841
  });
@@ -8901,7 +9204,7 @@ var init_validation_constants = __esmMin((() => {
8901
9204
  "media.fromUrl",
8902
9205
  "background.resolveStyle",
8903
9206
  "background.resolveColorsStyle",
8904
- "background.resolveAllowOverflow",
9207
+ "background.resolveFrameClassName",
8905
9208
  "background.resolveImageStyle",
8906
9209
  "background.resolveImageClassName",
8907
9210
  "background.resolveOverlayStyle",
@@ -8937,13 +9240,13 @@ function mqDown(px) {
8937
9240
  function mqBetween(minPx, maxPx) {
8938
9241
  return `${mqUp(minPx)} and ${mqDown(maxPx)}`;
8939
9242
  }
8940
- var BREAKPOINT_LG, BREAKPOINT_XL, BREAKPOINT_LG_DOWN, MQ_SM_UP, MQ_LG_UP, MQ_SM_DOWN, MQ_MD_DOWN, MQ_TABLET_ONLY;
9243
+ var BREAKPOINT_LG, BREAKPOINT_XL, BREAKPOINT_LG_DOWN, MQ_SM_UP, MQ_MD_UP, MQ_LG_UP, MQ_SM_DOWN, MQ_MD_DOWN, MQ_TABLET_ONLY;
8941
9244
  var init_breakpoints = __esmMin((() => {
8942
9245
  BREAKPOINT_LG = 1024;
8943
9246
  BREAKPOINT_XL = 1280;
8944
9247
  BREAKPOINT_LG_DOWN = BREAKPOINT_LG - 1;
8945
9248
  MQ_SM_UP = mqUp(640);
8946
- mqUp(768);
9249
+ MQ_MD_UP = mqUp(768);
8947
9250
  MQ_LG_UP = mqUp(BREAKPOINT_LG);
8948
9251
  mqUp(BREAKPOINT_XL);
8949
9252
  MQ_SM_DOWN = mqDown(639);
@@ -10752,7 +11055,7 @@ function getSemanticIconComponent(name) {
10752
11055
  //#endregion
10753
11056
  //#region ../blocks/src/system/icons/value.ts
10754
11057
  const NO_BLOCK_ICON_VALUE = { kind: "none" };
10755
- function isRecord$27(value) {
11058
+ function isRecord$26(value) {
10756
11059
  return typeof value === "object" && value !== null && !Array.isArray(value);
10757
11060
  }
10758
11061
  function parseBlockIconValue(value) {
@@ -10760,7 +11063,7 @@ function parseBlockIconValue(value) {
10760
11063
  kind: "semantic",
10761
11064
  iconId: value
10762
11065
  };
10763
- if (!isRecord$27(value)) return NO_BLOCK_ICON_VALUE;
11066
+ if (!isRecord$26(value)) return NO_BLOCK_ICON_VALUE;
10764
11067
  switch (value.kind) {
10765
11068
  case "none": return NO_BLOCK_ICON_VALUE;
10766
11069
  case "semantic": return isSemanticIconId(value.iconId) ? {
@@ -10833,7 +11136,7 @@ function buildGeneratedBlockIconRenderAssetLookupFromUnknown(value) {
10833
11136
  if (!Array.isArray(value)) return { kind: "invalid_asset_list" };
10834
11137
  const inputs = [];
10835
11138
  for (const [index, item] of value.entries()) {
10836
- if (!isRecord$27(item)) return {
11139
+ if (!isRecord$26(item)) return {
10837
11140
  kind: "invalid_asset_entry",
10838
11141
  index,
10839
11142
  reason: "not_object"
@@ -18448,6 +18751,53 @@ var init_soft_pill = __esmMin((() => {
18448
18751
  ]
18449
18752
  }
18450
18753
  });
18754
+ }));
18755
+ //#endregion
18756
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
18757
+ var solidSecondary, twoTonePill;
18758
+ var init_two_tone_pill = __esmMin((() => {
18759
+ init_soft_pill();
18760
+ init_types$13();
18761
+ solidSecondary = {
18762
+ id: "secondary",
18763
+ name: "Secondary",
18764
+ enabled: true,
18765
+ priority: 2,
18766
+ background: {
18767
+ type: "solid",
18768
+ colorToken: "secondary"
18769
+ },
18770
+ textColorToken: "onSecondary",
18771
+ borderRadius: "rounded-full",
18772
+ shadow: {
18773
+ elevation: "none",
18774
+ softness: null,
18775
+ position: "bottom"
18776
+ },
18777
+ effects: {
18778
+ hover: [{
18779
+ effectId: "background-on-hover-alpha",
18780
+ options: {
18781
+ colorToken: "secondary",
18782
+ opacity: 88
18783
+ }
18784
+ }],
18785
+ active: [{
18786
+ effectId: "scale-down",
18787
+ options: { scale: "0.98" }
18788
+ }]
18789
+ }
18790
+ };
18791
+ twoTonePill = defineButtonPersonality({
18792
+ id: "two-tone-pill",
18793
+ name: "Two-tone Pill",
18794
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
18795
+ tags: softPill.tags,
18796
+ buttonSystem: {
18797
+ ...softPill.buttonSystem,
18798
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
18799
+ }
18800
+ });
18451
18801
  })), buttonPersonalities;
18452
18802
  var init_personalities = __esmMin((() => {
18453
18803
  init_brushed_wash();
@@ -18462,9 +18812,11 @@ var init_personalities = __esmMin((() => {
18462
18812
  init_quiet_arrow();
18463
18813
  init_showtime_pill();
18464
18814
  init_soft_pill();
18815
+ init_two_tone_pill();
18465
18816
  init_types$13();
18466
18817
  buttonPersonalities = [
18467
18818
  softPill,
18819
+ twoTonePill,
18468
18820
  earthPill,
18469
18821
  confidentChip,
18470
18822
  editorialLink,
@@ -18906,7 +19258,7 @@ function asHeaderStyleId(value) {
18906
19258
  * optional nested styling fields that would otherwise leak from another Look.
18907
19259
  */
18908
19260
  function baseHeader(theme) {
18909
- 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;
19261
+ 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;
18910
19262
  return {
18911
19263
  ...header,
18912
19264
  navContainer: {
@@ -19528,6 +19880,17 @@ var init_headerLooks = __esmMin((() => {
19528
19880
  navTypography: "brand-caps",
19529
19881
  moods: ["expressive"]
19530
19882
  },
19883
+ {
19884
+ id: asHeaderStyleId("brand-capsule"),
19885
+ label: "Brand Capsule",
19886
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
19887
+ supportedLayoutIds: supportedLayouts(["classic"]),
19888
+ navInteraction: "pill-background",
19889
+ surface: "brand-solid",
19890
+ defaultDepth: "shadow",
19891
+ navTypography: "quiet-caps",
19892
+ moods: ["expressive", "professional"]
19893
+ },
19531
19894
  {
19532
19895
  id: asHeaderStyleId("serif-line"),
19533
19896
  label: "Serif Line",
@@ -19621,6 +19984,7 @@ var init_headerLooks = __esmMin((() => {
19621
19984
  "brand-bar",
19622
19985
  "brand-underline",
19623
19986
  "brand-pill",
19987
+ "brand-capsule",
19624
19988
  "serif-line",
19625
19989
  "flat-tabs"
19626
19990
  ])],
@@ -19655,6 +20019,11 @@ var init_headerLooks = __esmMin((() => {
19655
20019
  "brand-pill",
19656
20020
  "brand-bar",
19657
20021
  "minimal"
20022
+ ]), headerStyleRepairChain([
20023
+ "brand-capsule",
20024
+ "brand-pill",
20025
+ "brand-bar",
20026
+ "minimal"
19658
20027
  ]), headerStyleRepairChain([
19659
20028
  "pill-nav",
19660
20029
  "soft-bar",
@@ -23206,7 +23575,7 @@ function generateVariantCSS(variant, themeId, tokens, theme) {
23206
23575
  rules.push(`display: flex`);
23207
23576
  rules.push(`flex-direction: column`);
23208
23577
  rules.push(`position: relative`);
23209
- rules.push(`overflow: hidden`);
23578
+ rules.push(`overflow: visible`);
23210
23579
  const mediaRadius = MEDIA_CORNER_MAP[corners];
23211
23580
  const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
23212
23581
  const contentRules = [`padding: ${CONTENT_PADDING_MAP[variant.spacing] || CONTENT_PADDING_MAP.comfortable}`];
@@ -24221,7 +24590,24 @@ var init_tokenOrColor = __esmMin((() => {
24221
24590
  "white",
24222
24591
  "yellow"
24223
24592
  ]);
24224
- })), axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, eyebrowTypographyStyleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, testimonialQuoteTreatmentSchema, themeSchema;
24593
+ }));
24594
+ //#endregion
24595
+ //#region ../theme-core/src/schema.ts
24596
+ /**
24597
+ * Normalises the legacy `navTypography` font-role alias into the canonical
24598
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
24599
+ * a data migration. `navFontRole` always wins when both are present; the legacy
24600
+ * field is dropped so we never carry a dual write forward.
24601
+ */
24602
+ function normaliseHeaderNavFontRole(header) {
24603
+ if (header.navTypography === void 0) return header;
24604
+ const { navTypography, ...rest } = header;
24605
+ return header.navFontRole === void 0 ? {
24606
+ ...rest,
24607
+ navFontRole: navTypography
24608
+ } : rest;
24609
+ }
24610
+ var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, eyebrowTypographyStyleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerBarFrame, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, testimonialQuoteTreatmentSchema, themeSchema;
24225
24611
  var init_schema = __esmMin((() => {
24226
24612
  init_media$2();
24227
24613
  init_buttons();
@@ -24654,6 +25040,7 @@ var init_schema = __esmMin((() => {
24654
25040
  "bold"
24655
25041
  ]);
24656
25042
  headerMaxWidth = z$1.enum(["container", "full"]);
25043
+ headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
24657
25044
  headerContainerSchema = z$1.object({
24658
25045
  rounded: z$1.enum([
24659
25046
  "none",
@@ -24794,6 +25181,7 @@ var init_schema = __esmMin((() => {
24794
25181
  positioning: headerPositioning,
24795
25182
  shrinkOnScroll: z$1.boolean(),
24796
25183
  maxWidth: headerMaxWidth,
25184
+ barFrame: headerBarFrame.optional(),
24797
25185
  logoOverride: mediaSchema$1.nullable().optional(),
24798
25186
  background: headerBackgroundSchema.default({
24799
25187
  type: "color",
@@ -24803,6 +25191,7 @@ var init_schema = __esmMin((() => {
24803
25191
  navStyle: headerNavStyle,
24804
25192
  navColor: themeColorTokenSchema.nullable().optional(),
24805
25193
  navWeight: navFontWeight.default("medium"),
25194
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
24806
25195
  navTypography: z$1.enum(["body", "heading"]).optional(),
24807
25196
  navTextSize: navLinkStyleSchema.shape.textSize,
24808
25197
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -24818,7 +25207,7 @@ var init_schema = __esmMin((() => {
24818
25207
  ctaTreatment: headerCtaTreatmentSchema.optional(),
24819
25208
  ctaVariant: z$1.string().min(1).optional(),
24820
25209
  dropdownStyle: dropdownStyleSchema
24821
- });
25210
+ }).transform(normaliseHeaderNavFontRole);
24822
25211
  footerVariant = z$1.enum([
24823
25212
  "simple",
24824
25213
  "columns",
@@ -25870,6 +26259,7 @@ var init_curatedSiteStyles = __esmMin((() => {
25870
26259
  ],
25871
26260
  buttonPersonalityChoices: [
25872
26261
  buttonChoice("soft-pill"),
26262
+ buttonChoice("two-tone-pill"),
25873
26263
  buttonChoice("pebble"),
25874
26264
  buttonChoice("editorial-link"),
25875
26265
  buttonChoice("brushed-wash")
@@ -27049,6 +27439,7 @@ var init_curatedSiteStyles = __esmMin((() => {
27049
27439
  ],
27050
27440
  buttonPersonalityChoices: [
27051
27441
  buttonChoice("quiet-arrow"),
27442
+ buttonChoice("two-tone-pill"),
27052
27443
  buttonChoice("flat-ink"),
27053
27444
  buttonChoice("editorial-link")
27054
27445
  ],
@@ -27343,6 +27734,21 @@ var init_siteChromeBackgrounds = __esmMin((() => {
27343
27734
  quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
27344
27735
  siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
27345
27736
  }));
27737
+ /**
27738
+ * Applies the user's nav font-role/size overrides on top of a style-resolved
27739
+ * nav link style. This is where the precedence contract lands:
27740
+ *
27741
+ * - The nav typography TREATMENT (case/tracking identity: plain / heading /
27742
+ * quiet-caps / brand-caps) is ALWAYS owned by the active header style and is
27743
+ * baked into `style` before this call (see `applyNavTypography` in
27744
+ * headerLooks.ts).
27745
+ * - Each treatment resolves through a DEFAULT font role: `heading` resolves
27746
+ * through the heading role; `plain` / `quiet-caps` / `brand-caps` resolve
27747
+ * through the body role.
27748
+ * - The user's `navFontRole` (surfaced here as `preferences.typography`) only
27749
+ * overrides which font ROLE the treatment resolves through. It never changes
27750
+ * the treatment. `'inherit'` keeps the treatment's default role.
27751
+ */
27346
27752
  function mergeHeaderNavTypographyPreference(style, preferences) {
27347
27753
  return preferences.typography === "inherit" && preferences.fontSize === "inherit" ? style : {
27348
27754
  ...style,
@@ -28573,6 +28979,34 @@ function backgroundLayer(path, options = {}) {
28573
28979
  ];
28574
28980
  }
28575
28981
  /**
28982
+ * Wrap decorative background layers in their own clipping frame.
28983
+ *
28984
+ * Foreground content remains outside this frame, so editor outlines, focus
28985
+ * rings, and floating controls are never clipped by a visual background.
28986
+ * Backgrounds that explicitly opt into overflow keep that behavior within
28987
+ * the decorative layer rather than changing the content root.
28988
+ */
28989
+ function backgroundFrame(path, options = {}) {
28990
+ const { leadingNodes = [], ...layerOptions } = options;
28991
+ const framedLayerOptions = {
28992
+ ...layerOptions,
28993
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
28994
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
28995
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
28996
+ };
28997
+ return el("div", {
28998
+ className: { $bind: {
28999
+ from: path,
29000
+ transforms: [{
29001
+ id: "background.resolveFrameClassName",
29002
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
29003
+ }],
29004
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
29005
+ } },
29006
+ style: { borderRadius: "inherit" }
29007
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
29008
+ }
29009
+ /**
28576
29010
  * Creates a media node for rendering background image/video media with conditional rendering.
28577
29011
  *
28578
29012
  * This helper creates a media element that:
@@ -28647,8 +29081,10 @@ function createBackgroundOverlayNode(path, className = "background-overlay rb-ab
28647
29081
  } }
28648
29082
  });
28649
29083
  }
29084
+ var BACKGROUND_FRAME_BASE_CLASS;
28650
29085
  var init_backgroundLayer = __esmMin((() => {
28651
29086
  init_builder$1();
29087
+ 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";
28652
29088
  }));
28653
29089
  //#endregion
28654
29090
  //#region ../blocks/src/system/node/fragments/eyebrow.ts
@@ -28749,8 +29185,8 @@ var init_sectionContainer = __esmMin((() => {
28749
29185
  * - content
28750
29186
  */
28751
29187
  function styledContainer(config) {
28752
- 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;
28753
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
29188
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
29189
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
28754
29190
  const childrenArray = Array.isArray(children) ? children : [children];
28755
29191
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
28756
29192
  return el(rootType, {
@@ -28773,7 +29209,7 @@ function styledContainer(config) {
28773
29209
  }],
28774
29210
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
28775
29211
  } }
28776
- }, [...backgroundNodes, ...childrenArray]);
29212
+ }, [backgroundNode, ...childrenArray]);
28777
29213
  }
28778
29214
  var init_styledContainer = __esmMin((() => {
28779
29215
  init_builder$1();
@@ -28871,7 +29307,7 @@ var init_spacing = __esmMin((() => {
28871
29307
  * - Creating a section wrapper with background theme
28872
29308
  * - Adding background color/gradient/image layers
28873
29309
  * - Binding className to section styles with transform
28874
- * - Binding allowOverflow for background positioning
29310
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
28875
29311
  * - Wrapping content children
28876
29312
  *
28877
29313
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -28907,8 +29343,8 @@ var init_spacing = __esmMin((() => {
28907
29343
  * });
28908
29344
  */
28909
29345
  function styledSection(config) {
28910
- 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;
28911
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
29346
+ 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;
29347
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
28912
29348
  imageClassName,
28913
29349
  fallbackToken: background,
28914
29350
  omitImageLayer: !renderBackgroundImage,
@@ -28931,13 +29367,8 @@ function styledSection(config) {
28931
29367
  fullWidthPath
28932
29368
  }
28933
29369
  }]
28934
- } },
28935
- allowOverflow: allowOverflow ? true : { $bind: {
28936
- from: `${bindFrom}.background`,
28937
- transforms: [{ id: "background.resolveAllowOverflow" }],
28938
- fallback: false
28939
29370
  } }
28940
- }, [...renderedBackgroundNodes, ...childrenArray]);
29371
+ }, [renderedBackgroundNode, ...childrenArray]);
28941
29372
  }
28942
29373
  var init_styledSection = __esmMin((() => {
28943
29374
  init_builder$1();
@@ -29749,9 +30180,12 @@ var init_responsiveTwoColumn = __esmMin((() => {
29749
30180
  //#endregion
29750
30181
  //#region ../blocks/src/system/node/fragments/styledCard.ts
29751
30182
  function styledCard(children, opts, ...mods) {
29752
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
29753
- 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" });
29754
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
30183
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
30184
+ const defaultBackgroundLayer = el("div", {
30185
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
30186
+ style: { borderRadius: "inherit" }
30187
+ });
30188
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
29755
30189
  const style = {
29756
30190
  ...opts.style ?? {},
29757
30191
  borderColor: { $bind: {
@@ -29778,7 +30212,7 @@ function styledCard(children, opts, ...mods) {
29778
30212
  ...style ? { style } : {}
29779
30213
  }, [
29780
30214
  defaultBackgroundLayer,
29781
- ...backgroundNodes,
30215
+ backgroundNode,
29782
30216
  ...children
29783
30217
  ], ...mods);
29784
30218
  }
@@ -30753,7 +31187,7 @@ function buildTestimonialCard(...mods) {
30753
31187
  }, [stack({ gap: "md" }, [quoteMark, body]), el("div", { className: "rb-testimonial-attribution" }, buildAttributionNodes())])], {
30754
31188
  stylesFrom: "content._cardStyles",
30755
31189
  backgroundFrom: "content._cardStyles.background",
30756
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
31190
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
30757
31191
  }, ...mods);
30758
31192
  }
30759
31193
  /**
@@ -31523,7 +31957,7 @@ function createFaqAccordionLayout(options = {}) {
31523
31957
  options: {
31524
31958
  axis: "all",
31525
31959
  includeSpacing: false,
31526
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
31960
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
31527
31961
  }
31528
31962
  }]
31529
31963
  },
@@ -33194,7 +33628,6 @@ function splitLayoutWith(children) {
33194
33628
  }
33195
33629
  }),
33196
33630
  renderBackgroundImage: false,
33197
- allowOverflow: true,
33198
33631
  baseClass: ""
33199
33632
  });
33200
33633
  }
@@ -33839,7 +34272,7 @@ function postCard(children, ...mods) {
33839
34272
  return styledCard(children, {
33840
34273
  stylesFrom: "content._cardStyles",
33841
34274
  backgroundFrom: "content._cardStyles.background",
33842
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
34275
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
33843
34276
  }, ...mods);
33844
34277
  }
33845
34278
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -33875,7 +34308,7 @@ const stackPostCard = styledCard([inline({
33875
34308
  ])])], {
33876
34309
  stylesFrom: "content._cardStyles",
33877
34310
  backgroundFrom: "content._cardStyles.background",
33878
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
34311
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
33879
34312
  }, repeat("data.posts", "post"));
33880
34313
  const emptyState$2 = {
33881
34314
  ...styledCard([text({
@@ -33884,7 +34317,7 @@ const emptyState$2 = {
33884
34317
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
33885
34318
  stylesFrom: "content._cardStyles",
33886
34319
  backgroundFrom: "content._cardStyles.background",
33887
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
34320
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
33888
34321
  }),
33889
34322
  $when: {
33890
34323
  when: { from: "data.posts[0]" },
@@ -33894,7 +34327,7 @@ const emptyState$2 = {
33894
34327
  function blogListingShell(children) {
33895
34328
  return styledSection({
33896
34329
  children: styledContainer({
33897
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
34330
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
33898
34331
  children
33899
34332
  }),
33900
34333
  baseClass: ""
@@ -34444,7 +34877,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
34444
34877
  const formSurface = styledContainer({
34445
34878
  bindFrom: "_containerStyles",
34446
34879
  constrainWidth: false,
34447
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
34880
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
34448
34881
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
34449
34882
  });
34450
34883
  function createFormLayout(variant) {
@@ -35743,6 +36176,7 @@ const headerRootClassTransform = {
35743
36176
  ];
35744
36177
  const variant = header?.variant;
35745
36178
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
36179
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
35746
36180
  return joinClasses$4(classes);
35747
36181
  }
35748
36182
  };
@@ -36116,7 +36550,7 @@ const mediaTransforms = [{
36116
36550
  /**
36117
36551
  * Strict record guard: excludes null, primitives, and arrays.
36118
36552
  */
36119
- function isRecord$25(value) {
36553
+ function isRecord$24(value) {
36120
36554
  return typeof value === "object" && value !== null && !Array.isArray(value);
36121
36555
  }
36122
36556
  /**
@@ -36138,16 +36572,16 @@ const interpolateRichTextTokensOptionsSchema = z$1.object({ tokens: z$1.array(su
36138
36572
  const richTextTokenPattern = /\{\{\s*([a-zA-Z0-9_]+)\s*\}\}/g;
36139
36573
  function getSiteName(context) {
36140
36574
  const viewModel = context.viewModel;
36141
- if (!isRecord$25(viewModel)) return null;
36575
+ if (!isRecord$24(viewModel)) return null;
36142
36576
  const site = viewModel.site;
36143
- if (isRecord$25(site) && typeof site.title === "string") {
36577
+ if (isRecord$24(site) && typeof site.title === "string") {
36144
36578
  const title = site.title.trim();
36145
36579
  return title.length > 0 ? title : null;
36146
36580
  }
36147
36581
  const root = viewModel.$root;
36148
- if (isRecord$25(root)) {
36582
+ if (isRecord$24(root)) {
36149
36583
  const rootSite = root.site;
36150
- if (isRecord$25(rootSite) && typeof rootSite.title === "string") {
36584
+ if (isRecord$24(rootSite) && typeof rootSite.title === "string") {
36151
36585
  const title = rootSite.title.trim();
36152
36586
  if (title.length > 0) return title;
36153
36587
  }
@@ -36169,7 +36603,7 @@ function replaceTokenText(input, allowedTokens, tokenValues) {
36169
36603
  });
36170
36604
  }
36171
36605
  function visitRichTextNode(node, allowedTokens, tokenValues) {
36172
- if (!isRecord$25(node)) return node;
36606
+ if (!isRecord$24(node)) return node;
36173
36607
  let changed = false;
36174
36608
  const nextNode = { ...node };
36175
36609
  if (nextNode.type === "text" && typeof nextNode.text === "string") {
@@ -36190,13 +36624,13 @@ function visitRichTextNode(node, allowedTokens, tokenValues) {
36190
36624
  return changed ? nextNode : node;
36191
36625
  }
36192
36626
  function interpolateRichTextTokens(value, options, context) {
36193
- if (!isRecord$25(value)) return value;
36627
+ if (!isRecord$24(value)) return value;
36194
36628
  const allowedTokens = new Set(options.tokens);
36195
36629
  const tokenValues = {
36196
36630
  year: String((/* @__PURE__ */ new Date()).getFullYear()),
36197
36631
  site_name: getSiteName(context)
36198
36632
  };
36199
- if (isRecord$25(value.doc)) {
36633
+ if (isRecord$24(value.doc)) {
36200
36634
  const nextDoc = visitRichTextNode(value.doc, allowedTokens, tokenValues);
36201
36635
  if (nextDoc === value.doc) return value;
36202
36636
  return {
@@ -36296,7 +36730,7 @@ init_builder$1();
36296
36730
  init_fragments$1();
36297
36731
  init_defineBlock();
36298
36732
  init_colorStyles();
36299
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
36733
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
36300
36734
  ...node,
36301
36735
  $when: {
36302
36736
  when: {
@@ -36324,7 +36758,7 @@ const logoRow = link({
36324
36758
  text({
36325
36759
  as: "strong",
36326
36760
  className: "header-logo-text rb-truncate"
36327
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
36761
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
36328
36762
  ]);
36329
36763
  const centeredLogoRow = link({
36330
36764
  href: "/",
@@ -36344,7 +36778,7 @@ const centeredLogoRow = link({
36344
36778
  text({
36345
36779
  as: "strong",
36346
36780
  className: "header-logo-text"
36347
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
36781
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
36348
36782
  ]);
36349
36783
  const createNavRow = (className, align = "end") => navRow({
36350
36784
  className: `${className} header-nav-row`,
@@ -36476,7 +36910,7 @@ const classicLayout = inline({
36476
36910
  logoRow,
36477
36911
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
36478
36912
  headerCta
36479
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
36913
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
36480
36914
  const classicCenteredNavLayout = inline({
36481
36915
  className: bindProp("$root.theme.header.maxWidth", {
36482
36916
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -36487,7 +36921,7 @@ const classicCenteredNavLayout = inline({
36487
36921
  logoRow,
36488
36922
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
36489
36923
  headerCta
36490
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
36924
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
36491
36925
  const centeredLayout = stack({
36492
36926
  gap: "md",
36493
36927
  align: "center",
@@ -36550,7 +36984,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
36550
36984
  transforms: pipe(tx("layout.headerSectionBackground")),
36551
36985
  fallback: "background"
36552
36986
  }),
36553
- allowOverflow: true,
36554
36987
  className: bindProp("$root.theme.header", {
36555
36988
  transforms: pipe(tx("layout.headerRootClass")),
36556
36989
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -36576,6 +37009,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
36576
37009
  //#region ../blocks/src/system/blocks/site-footer-nav-groups-layout.ts
36577
37010
  init_builder$1();
36578
37011
  init_colorStyles();
37012
+ init_footerNav();
36579
37013
  const footerNavGroupsLayout = stack({
36580
37014
  gap: "lg",
36581
37015
  align: "start",
@@ -36602,225 +37036,160 @@ const footerNavGroupsLayout = stack({
36602
37036
  linkRequired: true,
36603
37037
  target: { $bind: { from: "entry.target" } },
36604
37038
  rel: { $bind: { from: "entry.rel" } }
36605
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
37039
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
36606
37040
  //#endregion
36607
37041
  //#region ../blocks/src/system/blocks/site-footer.ts
36608
37042
  init_fragments$1();
36609
37043
  init_builder$1();
36610
- init_fragments();
36611
37044
  init_defineBlock();
36612
37045
  init_colorStyles();
36613
37046
  init_surfaces();
36614
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
36615
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
36616
- ...node,
36617
- $when: {
36618
- when: {
36619
- from,
36620
- transforms: [{ id: transformId }]
36621
- },
36622
- equals
36623
- }
36624
- });
36625
- const bottomBarTextLayout = () => {
36626
- const bottomTextNode = footerTextLayout()[1];
36627
- return bottomTextNode ? [bottomTextNode] : [];
36628
- };
36629
- const bodyTextLayout = () => {
36630
- const bodyTextNode = footerTextLayout()[0];
36631
- return bodyTextNode ? [bodyTextNode] : [];
36632
- };
36633
- const businessAddressLayout = () => [text({
36634
- as: "p",
36635
- className: "rb-caption rb-opacity-80"
36636
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
36637
- const inlineBottomTextLayout = () => {
36638
- const bottomTextNode = footerTextLayout()[1];
36639
- if (!bottomTextNode) return [];
36640
- return [when("$root.theme.footer.bottomBar.enabled", {
36641
- equals: true,
36642
- not: true
36643
- })(bottomTextNode)];
36644
- };
36645
- const simpleFooterLogo = link({
37047
+ const brandLogo = link({
36646
37048
  href: "/",
36647
37049
  className: { $bind: {
36648
37050
  from: "$root.theme.footer.logo",
36649
37051
  transforms: [{
36650
37052
  id: "layout.footerLogoClass",
36651
- options: { requireExplicitShow: true }
37053
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
36652
37054
  }],
36653
- fallback: "rb-hidden"
37055
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
36654
37056
  } }
36655
- }, [
36656
- media({ className: { $bind: {
36657
- from: "$root.theme.footer.logo",
36658
- transforms: [{ id: "layout.footerLogoMediaClass" }],
36659
- fallback: "rb-w-auto"
36660
- } } }, when("content.logo"), bind("content.logo")),
36661
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
36662
- from: "$root.theme.footer.logo",
36663
- transforms: [{ id: "layout.footerLogoMediaClass" }],
36664
- fallback: "rb-w-auto"
36665
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
36666
- text({
36667
- as: "strong",
36668
- className: "footer-logo-text rb-nav-text"
36669
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
36670
- ]);
36671
- const simpleFooterLayout = stack({
37057
+ }, [media({ className: { $bind: {
37058
+ from: "$root.theme.footer.logo",
37059
+ transforms: [{
37060
+ id: "layout.footerLogoMediaClass",
37061
+ options: { base: "rb-h-10 rb-w-auto" }
37062
+ }],
37063
+ fallback: "rb-h-10 rb-w-auto"
37064
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
37065
+ as: "strong",
37066
+ className: "footer-logo-text rb-nav-text"
37067
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
37068
+ const navigation = stack({
36672
37069
  gap: "md",
36673
- align: "start",
36674
- className: { $bind: {
36675
- from: "$root.theme.footer",
36676
- transforms: [{ id: "layout.footerSimpleRootClass" }],
36677
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
36678
- } }
36679
- }, [
36680
- simpleFooterLogo,
36681
- footerNav({
36682
- collectionPath: "footerMenu.items",
36683
- mode: "flatten",
36684
- className: { $bind: {
36685
- from: "$root.theme.footer.navLayout",
36686
- transforms: [{ id: "layout.footerSimpleNavClass" }],
36687
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
36688
- } },
36689
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
36690
- }),
36691
- ...bodyTextLayout(),
36692
- ...businessAddressLayout(),
36693
- ...inlineBottomTextLayout()
36694
- ], when("$root.theme.footer.variant", { equals: "simple" }));
36695
- const columnsFooterLayout = stack({
36696
- gap: "xl",
36697
- align: "start",
37070
+ className: "rb-w-full"
37071
+ }, [footerNavGroupsLayout, footerNav({
37072
+ collectionPath: "footerMenu.items",
37073
+ mode: "links-only",
36698
37074
  className: { $bind: {
36699
- from: "$root.theme.footer.maxWidth",
36700
- transforms: [{
36701
- id: "layout.maxWidthClass",
36702
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
36703
- }],
36704
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
36705
- } }
36706
- }, [
36707
- footerNavGroupsLayout,
36708
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
36709
- as: "strong",
36710
- className: "rb-block rb-nav-text",
36711
- style: textColorStyle("text")
36712
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
36713
- collectionPath: "footerMenu.items",
36714
- mode: "links-only",
36715
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
36716
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
36717
- })]),
36718
- ...bodyTextLayout(),
36719
- ...businessAddressLayout(),
36720
- ...inlineBottomTextLayout()
36721
- ], when("$root.theme.footer.variant", { equals: "columns" }));
36722
- const splitFooterLayout = stack({
36723
- gap: "xl",
37075
+ from: "module.navigationClassName",
37076
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
37077
+ } },
37078
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
37079
+ })], when("module.kind", { equals: "navigation" }));
37080
+ const legalNavigation = footerNav({
37081
+ collectionPath: "legalFooterMenu.items",
37082
+ mode: "links-only",
37083
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
37084
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
37085
+ });
37086
+ const address = text({
37087
+ as: "address",
37088
+ className: "rb-not-italic rb-opacity-80"
37089
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
37090
+ const contact = stack({
37091
+ gap: "sm",
37092
+ className: "rb-items-start"
37093
+ }, [link({
37094
+ href: { $bind: { from: "contactLink.href" } },
37095
+ className: "rb-nav-text rb-break-words transition-theme-standard"
37096
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
37097
+ const hours = stack({
37098
+ gap: "sm",
37099
+ className: "rb-w-full"
37100
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
37101
+ as: "span",
37102
+ className: "rb-label"
37103
+ }, bind("hoursDay.weekday")), text({
37104
+ as: "span",
37105
+ className: "rb-caption rb-opacity-80"
37106
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
37107
+ as: "p",
37108
+ className: "rb-caption rb-opacity-70"
37109
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
37110
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
37111
+ href: { $bind: { from: "social.href" } },
37112
+ target: "_blank",
37113
+ rel: "noreferrer noopener",
37114
+ "aria-label": { $bind: { from: "social.label" } },
37115
+ className: "rb-nav-text transition-theme-standard"
37116
+ }, [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" }));
37117
+ const authoredCopy = richText({
37118
+ className: "rb-prose rb-prose-sm rb-max-w-none",
37119
+ style: textColorStyle("text/80")
37120
+ }, when("module.content"), bind("module.content", { transforms: [{
37121
+ id: "content.interpolateRichTextTokens",
37122
+ options: { tokens: ["year", "site_name"] }
37123
+ }] }));
37124
+ const footerModule = stack({
37125
+ gap: "md",
36724
37126
  align: "start",
36725
- className: { $bind: {
36726
- from: "$root.theme.footer.maxWidth",
36727
- transforms: [{
36728
- id: "layout.maxWidthClass",
36729
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
36730
- }],
36731
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
36732
- } }
37127
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
36733
37128
  }, [
36734
- inline({ className: { $bind: {
36735
- from: "$root.theme.footer.logo",
36736
- transforms: [{ id: "layout.footerSplitMainClass" }],
36737
- 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"
36738
- } } }, [stack({}, [footerNav({
36739
- collectionPath: "footerMenu.items",
36740
- mode: "flatten",
36741
- className: { $bind: {
36742
- from: "$root.theme.footer.navLayout",
36743
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
36744
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
36745
- } },
36746
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
36747
- })]), link({
36748
- href: "/",
36749
- className: { $bind: {
36750
- from: "$root.theme.footer.logo",
36751
- transforms: [{ id: "layout.footerLogoClass" }],
36752
- 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"
36753
- } }
36754
- }, [
36755
- media({ className: { $bind: {
36756
- from: "$root.theme.footer.logo",
36757
- transforms: [{ id: "layout.footerLogoMediaClass" }],
36758
- fallback: "rb-w-auto"
36759
- } } }, when("content.logo"), bind("content.logo")),
36760
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
36761
- from: "$root.theme.footer.logo",
36762
- transforms: [{ id: "layout.footerLogoMediaClass" }],
36763
- fallback: "rb-w-auto"
36764
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
36765
- text({
36766
- as: "strong",
36767
- className: "footer-logo-text rb-nav-text"
36768
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
36769
- ])]),
36770
- ...businessAddressLayout(),
36771
- ...inlineBottomTextLayout()
36772
- ], when("$root.theme.footer.variant", { equals: "split" }));
36773
- const footerLayout = section$1({
36774
- background: "background",
37129
+ text({
37130
+ as: "h2",
37131
+ className: "rb-label",
37132
+ style: textColorStyle("text/70")
37133
+ }, bind("module.heading"), when("module.heading")),
37134
+ brandLogo,
37135
+ navigation,
37136
+ stack({
37137
+ gap: "sm",
37138
+ className: "rb-w-full"
37139
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
37140
+ address,
37141
+ contact,
37142
+ hours,
37143
+ socials,
37144
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
37145
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
37146
+ ], repeat("group.modules", "module"));
37147
+ const footerGroup = stack({
37148
+ gap: "md",
37149
+ align: "stretch",
37150
+ className: "rb-min-w-0",
37151
+ "data-footer-group": { $bind: { from: "group.kind" } }
37152
+ }, [footerModule], repeat("region.groups", "group"));
37153
+ const footerMainRegion = stack({
37154
+ className: { $bind: { from: "region.className" } },
37155
+ "data-footer-region": { $bind: { from: "region.kind" } }
37156
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
37157
+ const footerBottomRegion = stack({ className: { $bind: {
37158
+ from: "$root.theme.footer",
37159
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
37160
+ fallback: "rb-w-full"
37161
+ } } }, [stack({
36775
37162
  className: { $bind: {
36776
37163
  from: "$root.theme.footer",
36777
- transforms: [{ id: "layout.footerRootClass" }],
36778
- fallback: "rb-w-full rb-border-t transition-theme"
37164
+ transforms: [{ id: "layout.footerBottomBarClass" }],
37165
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
36779
37166
  } },
36780
37167
  style: { $bind: {
36781
37168
  from: "$root.theme.footer",
36782
- transforms: [{ id: "layout.footerRootStyle" }],
36783
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
36784
- } }
36785
- }, [
36786
- simpleFooterLayout,
36787
- columnsFooterLayout,
36788
- splitFooterLayout,
36789
- stack({
36790
- className: { $bind: {
36791
- from: "$root.theme.footer",
36792
- transforms: [{ id: "layout.footerBottomBarClass" }],
36793
- fallback: "rb-w-full rb-border-t rb-py-5"
36794
- } },
36795
- style: { $bind: {
36796
- from: "$root.theme.footer",
36797
- transforms: [{ id: "layout.footerBottomBarStyle" }]
36798
- } }
36799
- }, [stack({ className: { $bind: {
36800
- from: "$root.theme.footer",
36801
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
36802
- fallback: "rb-container"
36803
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
36804
- ]);
37169
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
37170
+ } },
37171
+ "data-footer-region": "bottom"
37172
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
36805
37173
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
36806
37174
  id: "block.site-footer",
36807
37175
  title: "Site Footer",
36808
37176
  category: "layout",
36809
- fragments: [{
36810
- fragment: footerBottomTextFragment,
36811
- fieldPriority: 0
36812
- }],
36813
37177
  skipSectionStyles: true,
36814
- additionalFields: [{
36815
- id: "showBusinessAddress",
36816
- type: "boolean",
36817
- label: "Add business address to site footer?",
36818
- required: false,
36819
- defaultValue: false,
36820
- ui: { intent: "content" }
36821
- }],
36822
- layout: footerLayout,
36823
- description: "Site-wide footer with navigation links and optional columns.",
37178
+ layout: section$1({
37179
+ background: "background",
37180
+ className: { $bind: {
37181
+ from: "$root.theme.footer",
37182
+ transforms: [{ id: "layout.footerRootClass" }],
37183
+ fallback: "rb-w-full rb-border-t transition-theme"
37184
+ } },
37185
+ style: { $bind: {
37186
+ from: "$root.theme.footer",
37187
+ transforms: [{ id: "layout.footerRootStyle" }],
37188
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
37189
+ } },
37190
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
37191
+ }, [footerMainRegion, footerBottomRegion]),
37192
+ description: "Site-wide composed footer with canonical shared details.",
36824
37193
  styleTokens: { spacing: "md" },
36825
37194
  paletteHidden: true
36826
37195
  }) };
@@ -37320,7 +37689,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
37320
37689
  id: "boxStyles.all",
37321
37690
  options: {
37322
37691
  axis: "all",
37323
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
37692
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
37324
37693
  }
37325
37694
  }]
37326
37695
  },
@@ -37510,11 +37879,11 @@ function resolveFeatureCardGeneratedIconSizePx(value) {
37510
37879
  const parsed = parseFeatureCardGeneratedIconSizePx(value);
37511
37880
  return parsed.ok ? parsed.value : unsafeAsFeatureCardGeneratedIconSizePx(FEATURE_CARD_GENERATED_ICON_SIZE_PX.default);
37512
37881
  }
37513
- function isRecord$24(value) {
37882
+ function isRecord$23(value) {
37514
37883
  return typeof value === "object" && value !== null && !Array.isArray(value);
37515
37884
  }
37516
37885
  function toPlainTextFromTipTap(value) {
37517
- if (!isRecord$24(value)) return "";
37886
+ if (!isRecord$23(value)) return "";
37518
37887
  if (typeof value.text === "string") return value.text;
37519
37888
  const content = value.content;
37520
37889
  if (!Array.isArray(content)) return "";
@@ -38825,10 +39194,10 @@ var init_media$1 = __esmMin((() => {
38825
39194
  * helper inside `@riverbankcms/blocks/bindings`.
38826
39195
  */
38827
39196
  function unwrapRichTextRoot(value) {
38828
- if (!isRecord$25(value)) return value;
39197
+ if (!isRecord$24(value)) return value;
38829
39198
  if (!("doc" in value)) return value;
38830
39199
  const inner = value.doc;
38831
- if (isRecord$25(inner) && inner.type === "doc") return inner;
39200
+ if (isRecord$24(inner) && inner.type === "doc") return inner;
38832
39201
  return value;
38833
39202
  }
38834
39203
  function createHardBreakNode() {
@@ -39823,11 +40192,11 @@ var init_eventScope = __esmMin((() => {
39823
40192
  }));
39824
40193
  //#endregion
39825
40194
  //#region ../blocks/src/system/runtime/nodes/events/shared/destination.ts
39826
- function isRecord$23(value) {
40195
+ function isRecord$22(value) {
39827
40196
  return typeof value === "object" && value !== null && !Array.isArray(value);
39828
40197
  }
39829
40198
  function isRuntimeEventDestination(value) {
39830
- if (!isRecord$23(value) || typeof value.kind !== "string") return false;
40199
+ if (!isRecord$22(value) || typeof value.kind !== "string") return false;
39831
40200
  if (value.kind === "native") return (value.mode === "cms-managed" || value.mode === "system-managed") && typeof value.path === "string";
39832
40201
  return value.kind === "external" && typeof value.url === "string" && typeof value.label === "string";
39833
40202
  }
@@ -39890,15 +40259,15 @@ function resolveRuntimeEventPricing(event) {
39890
40259
  function readCurrency(value) {
39891
40260
  return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY$1;
39892
40261
  }
39893
- function isRecord$22(value) {
40262
+ function isRecord$21(value) {
39894
40263
  return typeof value === "object" && value !== null && !Array.isArray(value);
39895
40264
  }
39896
40265
  function isPublicEventPricing(value) {
39897
- if (!isRecord$22(value) || typeof value.kind !== "string") return false;
40266
+ if (!isRecord$21(value) || typeof value.kind !== "string") return false;
39898
40267
  return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "sliding_scale" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
39899
40268
  }
39900
40269
  function isPublicEventTicketType(value) {
39901
- return isRecord$22(value) && typeof value.id === "string";
40270
+ return isRecord$21(value) && typeof value.id === "string";
39902
40271
  }
39903
40272
  function readTicketTypePriceDisplay(value, currency) {
39904
40273
  const display = readLegacyPriceDisplay(value, currency);
@@ -39908,7 +40277,7 @@ function readTicketTypePriceDisplay(value, currency) {
39908
40277
  } : display;
39909
40278
  }
39910
40279
  function readLegacyPriceDisplay(value, currency) {
39911
- if (!isRecord$22(value) || typeof value.kind !== "string") return {
40280
+ if (!isRecord$21(value) || typeof value.kind !== "string") return {
39912
40281
  kind: "unavailable",
39913
40282
  currency
39914
40283
  };
@@ -39960,7 +40329,7 @@ function readLegacyPriceDisplay(value, currency) {
39960
40329
  kind: "unavailable",
39961
40330
  currency: displayCurrency
39962
40331
  };
39963
- case "course": return isRecord$22(value.display) ? {
40332
+ case "course": return isRecord$21(value.display) ? {
39964
40333
  kind: "course",
39965
40334
  display: readCoursePriceDisplay(value.display, displayCurrency)
39966
40335
  } : {
@@ -40218,14 +40587,14 @@ function buildEventRegistrationShellBodyText(stepLabels) {
40218
40587
  return "Preparing dates, tickets, and booking details.";
40219
40588
  }
40220
40589
  function normalizeEventRegistrationEventInput(value) {
40221
- if (!isRecord$21(value)) return value;
40590
+ if (!isRecord$20(value)) return value;
40222
40591
  return {
40223
40592
  ...value,
40224
40593
  destination: resolveRuntimeEventDestination(value),
40225
40594
  pricing: resolveRuntimeEventPricing(value)
40226
40595
  };
40227
40596
  }
40228
- function isRecord$21(value) {
40597
+ function isRecord$20(value) {
40229
40598
  return typeof value === "object" && value !== null && !Array.isArray(value);
40230
40599
  }
40231
40600
  function buildEventRegistrationInteractiveIslandProps(props) {
@@ -46598,7 +46967,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
46598
46967
  return keys.length >= 2 ? keys : [];
46599
46968
  }
46600
46969
  function normalizeOfferingsPreviewContentForWrite(value) {
46601
- if (!isRecord$19(value)) return null;
46970
+ if (!isRecord$18(value)) return null;
46602
46971
  const groupOrderValue = value.groupOrder;
46603
46972
  if (Array.isArray(groupOrderValue)) {
46604
46973
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -46611,7 +46980,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
46611
46980
  ...value,
46612
46981
  groupOrder: []
46613
46982
  };
46614
- const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord$19) : []);
46983
+ const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord$18) : []);
46615
46984
  return legacyOrder.length > 0 ? {
46616
46985
  ...value,
46617
46986
  groupOrder: legacyOrder
@@ -46676,7 +47045,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
46676
47045
  }
46677
47046
  return keys;
46678
47047
  }
46679
- function isRecord$19(value) {
47048
+ function isRecord$18(value) {
46680
47049
  return typeof value === "object" && value !== null && !Array.isArray(value);
46681
47050
  }
46682
47051
  function mergeOrderedKeysWithDefaults(orderedKeys, defaultKeys) {
@@ -47169,7 +47538,7 @@ function isOfferingsPreviewItemLimit(value) {
47169
47538
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
47170
47539
  }
47171
47540
  function normalizeOfferingsPreviewGroupOverride(value) {
47172
- if (!isRecord$18(value)) return [];
47541
+ if (!isRecord$17(value)) return [];
47173
47542
  const override = {};
47174
47543
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) override.sourceKey = value.sourceKey;
47175
47544
  if (typeof value.title === "string" || value.title === null) override.title = value.title;
@@ -47185,12 +47554,12 @@ function isButtonVariant(value) {
47185
47554
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
47186
47555
  }
47187
47556
  function normalizeCardStylesContent(value) {
47188
- return isRecord$18(value) || value === null ? value : void 0;
47557
+ return isRecord$17(value) || value === null ? value : void 0;
47189
47558
  }
47190
47559
  function normalizeSectionStylesContent(value) {
47191
- return isRecord$18(value) || value === null ? value : void 0;
47560
+ return isRecord$17(value) || value === null ? value : void 0;
47192
47561
  }
47193
- function isRecord$18(value) {
47562
+ function isRecord$17(value) {
47194
47563
  return typeof value === "object" && value !== null && !Array.isArray(value);
47195
47564
  }
47196
47565
  //#endregion
@@ -53000,16 +53369,17 @@ const backgroundTransforms = [
53000
53369
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
53001
53370
  },
53002
53371
  {
53003
- id: "background.resolveAllowOverflow",
53372
+ id: "background.resolveFrameClassName",
53004
53373
  kind: "formatter",
53005
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
53006
- run: (value) => {
53007
- if (!value || typeof value !== "object") return false;
53374
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
53375
+ run: (value, options) => {
53376
+ const baseClass = options?.baseClass?.trim() ?? "";
53377
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
53008
53378
  const input = value;
53009
- if (input.overflow === true) return true;
53379
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
53010
53380
  const objectFit = isString$2(input.objectFit) ? input.objectFit.trim() : null;
53011
53381
  const scale = isString$2(input.scale) ? input.scale.trim() : isNumber$2(input.scale) ? String(input.scale) : null;
53012
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
53382
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
53013
53383
  }
53014
53384
  },
53015
53385
  {
@@ -53297,7 +53667,7 @@ init_core();
53297
53667
  init_src$3();
53298
53668
  const LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
53299
53669
  function coerceLinkedContentEntriesPayload(payload) {
53300
- if (!isRecord$16(payload)) return payload;
53670
+ if (!isRecord$15(payload)) return payload;
53301
53671
  const response = payload;
53302
53672
  if (!Array.isArray(response.entries)) return payload;
53303
53673
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -53305,16 +53675,16 @@ function coerceLinkedContentEntriesPayload(payload) {
53305
53675
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
53306
53676
  }
53307
53677
  function getLinkedContentEntryMeta(value) {
53308
- if (!isRecord$16(value)) return null;
53678
+ if (!isRecord$15(value)) return null;
53309
53679
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
53310
53680
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
53311
53681
  }
53312
53682
  function buildLinkedContentEditTarget(input) {
53313
53683
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
53314
- if (!isRecord$16(entry)) return null;
53684
+ if (!isRecord$15(entry)) return null;
53315
53685
  const meta = getLinkedContentEntryMeta(entry);
53316
53686
  if (!meta || meta.support.kind !== "supported") return null;
53317
- const content = isRecord$16(entry.content) ? entry.content : {};
53687
+ const content = isRecord$15(entry.content) ? entry.content : {};
53318
53688
  return {
53319
53689
  kind: "linked-content-entry",
53320
53690
  entryId: meta.entryId,
@@ -53378,12 +53748,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
53378
53748
  };
53379
53749
  }
53380
53750
  function enrichLinkedContentEntry(entry, contentType) {
53381
- if (!isRecord$16(entry)) return entry;
53751
+ if (!isRecord$15(entry)) return entry;
53382
53752
  const entryId = typeof entry.id === "string" ? entry.id : null;
53383
53753
  if (!entryId) return entry;
53384
53754
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
53385
53755
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
53386
- const content = isRecord$16(entry.content) ? entry.content : {};
53756
+ const content = isRecord$15(entry.content) ? entry.content : {};
53387
53757
  const meta = {
53388
53758
  kind: "linked-content-entry",
53389
53759
  entryId,
@@ -53479,7 +53849,7 @@ function capitalize(value) {
53479
53849
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
53480
53850
  }
53481
53851
  function parsePublicContentTypeMeta(value) {
53482
- if (!isRecord$16(value)) return null;
53852
+ if (!isRecord$15(value)) return null;
53483
53853
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
53484
53854
  return {
53485
53855
  key: value.key,
@@ -53489,7 +53859,7 @@ function parsePublicContentTypeMeta(value) {
53489
53859
  };
53490
53860
  }
53491
53861
  function parsePublicContentTypeLinkedEntryEditing(value) {
53492
- if (!isRecord$16(value) || typeof value.kind !== "string") return null;
53862
+ if (!isRecord$15(value) || typeof value.kind !== "string") return null;
53493
53863
  switch (value.kind) {
53494
53864
  case "generic": return { kind: "generic" };
53495
53865
  case "unsupported-domain-backed": return {
@@ -53500,7 +53870,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
53500
53870
  }
53501
53871
  }
53502
53872
  function parsePublicContentTypeFieldMeta(value) {
53503
- if (!isRecord$16(value)) return [];
53873
+ if (!isRecord$15(value)) return [];
53504
53874
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
53505
53875
  return [{
53506
53876
  id: value.id,
@@ -53515,14 +53885,14 @@ function parseStringArray(value) {
53515
53885
  return value.filter((item) => typeof item === "string");
53516
53886
  }
53517
53887
  function isLinkedContentEntryMeta(value) {
53518
- if (!isRecord$16(value)) return false;
53888
+ if (!isRecord$15(value)) return false;
53519
53889
  if (value.kind !== "linked-content-entry") return false;
53520
53890
  if (typeof value.entryId !== "string") return false;
53521
53891
  if (typeof value.contentTypeKey !== "string") return false;
53522
53892
  if (typeof value.contentTypeLabel !== "string") return false;
53523
53893
  if (typeof value.title !== "string") return false;
53524
53894
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
53525
- if (!isRecord$16(value.contentType)) return false;
53895
+ if (!isRecord$15(value.contentType)) return false;
53526
53896
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
53527
53897
  return isLinkedContentEditSupport(value.support);
53528
53898
  }
@@ -53530,7 +53900,7 @@ function isLinkedEntryFieldSourceArray(value) {
53530
53900
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
53531
53901
  }
53532
53902
  function isLinkedEntryFieldSource(value) {
53533
- if (!isRecord$16(value)) return false;
53903
+ if (!isRecord$15(value)) return false;
53534
53904
  if (typeof value.displayPath !== "string") return false;
53535
53905
  switch (value.kind) {
53536
53906
  case "content-field": return typeof value.fieldPath === "string" && (value.fieldType === "text" || value.fieldType === "richText");
@@ -53551,7 +53921,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
53551
53921
  }
53552
53922
  }
53553
53923
  function isLinkedContentEditSupport(value) {
53554
- if (!isRecord$16(value) || typeof value.kind !== "string") return false;
53924
+ if (!isRecord$15(value) || typeof value.kind !== "string") return false;
53555
53925
  switch (value.kind) {
53556
53926
  case "supported": return true;
53557
53927
  case "unsupported-domain-backed":
@@ -53560,17 +53930,17 @@ function isLinkedContentEditSupport(value) {
53560
53930
  default: return false;
53561
53931
  }
53562
53932
  }
53563
- function isRecord$16(value) {
53933
+ function isRecord$15(value) {
53564
53934
  return typeof value === "object" && value !== null && !Array.isArray(value);
53565
53935
  }
53566
53936
  //#endregion
53567
53937
  //#region ../blocks/src/primitives/layout/Section.tsx
53568
53938
  init_clsx();
53569
53939
  init_colorStyles();
53570
- const Section$1 = forwardRef(function Section({ as: Comp = "section", children, background, className = "", allowOverflow = false, style, "data-slot": dataSlot }, ref) {
53940
+ const Section$1 = forwardRef(function Section({ as: Comp = "section", children, background, className = "", style, "data-slot": dataSlot }, ref) {
53571
53941
  return /* @__PURE__ */ jsx(Comp, {
53572
53942
  ref,
53573
- className: clsx("rb-relative rb-isolate", allowOverflow ? "rb-overflow-visible" : "rb-overflow-hidden", className),
53943
+ className: clsx("rb-relative rb-isolate rb-overflow-visible", className),
53574
53944
  style: mergeStyles(typeof background === "string" && background.trim().length > 0 ? backgroundColorStyle(background.trim()) : void 0, style),
53575
53945
  "data-slot": dataSlot ?? "section",
53576
53946
  children
@@ -53694,10 +54064,7 @@ function Grid({ as: Comp = "div", cols = {
53694
54064
  }
53695
54065
  //#endregion
53696
54066
  //#region ../blocks/src/system/runtime/nodes/layout.tsx
53697
- const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, allowOverflow, ...props }) => /* @__PURE__ */ jsx(Section$1, {
53698
- ...props,
53699
- allowOverflow
53700
- });
54067
+ const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Section$1, { ...props });
53701
54068
  const StackNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Stack, { ...props });
53702
54069
  const InlineNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Inline, { ...props });
53703
54070
  const GridNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Grid, { ...props });
@@ -53707,18 +54074,43 @@ const FigureNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _b
53707
54074
  //#region ../path-utils/src/index.ts
53708
54075
  const PATH_SEPARATOR_REGEX$1 = /\./g;
53709
54076
  const BRACKET_ACCESS_REGEX$1 = /\[([^\]]+)\]/g;
53710
- function isRecord$15(value) {
54077
+ /**
54078
+ * Segments that would traverse or mutate the prototype chain.
54079
+ *
54080
+ * `setAtPath` creates nested objects along the path, so allowing these
54081
+ * segments is a prototype-pollution vector. They are rejected everywhere a
54082
+ * path is parsed (string or pre-parsed array form) — fail closed.
54083
+ */
54084
+ const UNSAFE_PATH_SEGMENTS = /* @__PURE__ */ new Set([
54085
+ "__proto__",
54086
+ "constructor",
54087
+ "prototype"
54088
+ ]);
54089
+ var UnsafePathSegmentError = class extends Error {
54090
+ constructor(segment) {
54091
+ super(`Unsafe path segment: "${segment}"`);
54092
+ this.name = "UnsafePathSegmentError";
54093
+ this.segment = segment;
54094
+ }
54095
+ };
54096
+ function assertSafePathSegments(segments) {
54097
+ for (const segment of segments) if (typeof segment === "string" && UNSAFE_PATH_SEGMENTS.has(segment)) throw new UnsafePathSegmentError(segment);
54098
+ }
54099
+ function isRecord$14(value) {
53711
54100
  return typeof value === "object" && value !== null && !Array.isArray(value);
53712
54101
  }
53713
54102
  function isPathContainer(value) {
53714
- return Array.isArray(value) || isRecord$15(value);
54103
+ return Array.isArray(value) || isRecord$14(value);
53715
54104
  }
53716
54105
  function getContainerValue(container, segment) {
53717
54106
  if (typeof segment === "number") return Array.isArray(container) ? container[segment] : void 0;
53718
54107
  if (segment in container) return Reflect.get(container, segment);
53719
54108
  }
53720
54109
  function parsePath(path) {
53721
- if (Array.isArray(path)) return path;
54110
+ if (Array.isArray(path)) {
54111
+ assertSafePathSegments(path);
54112
+ return path;
54113
+ }
53722
54114
  const segments = [];
53723
54115
  const parts = path.split(PATH_SEPARATOR_REGEX$1);
53724
54116
  for (const raw of parts) {
@@ -53738,6 +54130,7 @@ function parsePath(path) {
53738
54130
  }
53739
54131
  if (baseMatch === null && !raw.includes("[")) segments.push(raw);
53740
54132
  }
54133
+ assertSafePathSegments(segments);
53741
54134
  return segments;
53742
54135
  }
53743
54136
  function getAtPath(source, path) {
@@ -53989,6 +54382,59 @@ function getCtaIconComponent(name) {
53989
54382
  return CTA_ICON_COMPONENTS[name] ?? null;
53990
54383
  }
53991
54384
  //#endregion
54385
+ //#region ../blocks/src/system/icons/social.tsx
54386
+ init_svg();
54387
+ const SOCIAL_ICON_NAMES = [
54388
+ "SocialFacebook",
54389
+ "SocialInstagram",
54390
+ "SocialLinkedIn",
54391
+ "SocialTikTok",
54392
+ "SocialX",
54393
+ "SocialYouTube"
54394
+ ];
54395
+ const socialIcons = {
54396
+ SocialFacebook: createIcon("SocialFacebookIcon", /* @__PURE__ */ jsx("path", { d: "M14 8h3V4h-3c-3 0-5 2-5 5v3H6v4h3v6h4v-6h3l1-4h-4V9c0-.7.3-1 1-1Z" })),
54397
+ SocialInstagram: createIcon("SocialInstagramIcon", /* @__PURE__ */ jsxs(Fragment, { children: [
54398
+ /* @__PURE__ */ jsx("rect", {
54399
+ x: "3",
54400
+ y: "3",
54401
+ width: "18",
54402
+ height: "18",
54403
+ rx: "5"
54404
+ }),
54405
+ /* @__PURE__ */ jsx("circle", {
54406
+ cx: "12",
54407
+ cy: "12",
54408
+ r: "4"
54409
+ }),
54410
+ /* @__PURE__ */ jsx("circle", {
54411
+ cx: "17.5",
54412
+ cy: "6.5",
54413
+ r: ".75",
54414
+ fill: "currentColor",
54415
+ stroke: "none"
54416
+ })
54417
+ ] })),
54418
+ SocialLinkedIn: createIcon("SocialLinkedInIcon", /* @__PURE__ */ jsxs(Fragment, { children: [
54419
+ /* @__PURE__ */ jsx("path", { d: "M6 9v10" }),
54420
+ /* @__PURE__ */ jsx("path", {
54421
+ d: "M6 5.5v.01",
54422
+ strokeWidth: "3"
54423
+ }),
54424
+ /* @__PURE__ */ jsx("path", { d: "M10.5 19v-6a4 4 0 0 1 8 0v6" }),
54425
+ /* @__PURE__ */ jsx("path", { d: "M10.5 9v10" })
54426
+ ] })),
54427
+ 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" })] })),
54428
+ SocialX: createIcon("SocialXIcon", /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("path", { d: "m5 4 14 16" }), /* @__PURE__ */ jsx("path", { d: "M19 4 5 20" })] })),
54429
+ 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" })] }))
54430
+ };
54431
+ function isSocialIconName(value) {
54432
+ return typeof value === "string" && SOCIAL_ICON_NAMES.includes(value);
54433
+ }
54434
+ function getSocialIconComponent(value) {
54435
+ return isSocialIconName(value) ? socialIcons[value] : null;
54436
+ }
54437
+ //#endregion
53992
54438
  //#region ../blocks/src/system/icons/registry.ts
53993
54439
  init_presets$1();
53994
54440
  function buildSearchText(parts) {
@@ -54019,7 +54465,7 @@ function semanticOptionsForPreset(preset) {
54019
54465
  }
54020
54466
  semanticOptionsForPreset("feature");
54021
54467
  function getIconComponent(name) {
54022
- return getCtaIconComponent(name) ?? getSemanticIconComponent(name);
54468
+ return getCtaIconComponent(name) ?? getSemanticIconComponent(name) ?? getSocialIconComponent(name);
54023
54469
  }
54024
54470
  //#endregion
54025
54471
  //#region ../blocks/src/system/runtime/nodes/buttonAffordance.ts
@@ -54058,7 +54504,7 @@ function resolveButtonAffordance(input) {
54058
54504
  function coerceRichTextDoc(value) {
54059
54505
  const raw = unwrapRichTextRoot(value);
54060
54506
  if (typeof raw === "string") return createRichTextDocFromMarkdown(raw);
54061
- if (isRecord$25(raw) && typeof raw.type === "string") return raw;
54507
+ if (isRecord$24(raw) && typeof raw.type === "string") return raw;
54062
54508
  return null;
54063
54509
  }
54064
54510
  var init_richText_coerce = __esmMin((() => {
@@ -54838,7 +55284,6 @@ const HeaderSectionNode = ({ blockId, children, className, "data-preview-site-ch
54838
55284
  const asProp = rest.as;
54839
55285
  const styleProp = rest.style;
54840
55286
  const backgroundProp = typeof rest.background === "string" ? rest.background : void 0;
54841
- const allowOverflowProp = typeof rest.allowOverflow === "boolean" ? rest.allowOverflow : void 0;
54842
55287
  const dataSlotProp = typeof rest["data-slot"] === "string" ? rest["data-slot"] : void 0;
54843
55288
  return /* @__PURE__ */ jsxs("nav", {
54844
55289
  ...getIslandRootProps("headerSection", blockId),
@@ -54853,7 +55298,6 @@ const HeaderSectionNode = ({ blockId, children, className, "data-preview-site-ch
54853
55298
  as: asProp,
54854
55299
  style: styleProp,
54855
55300
  background: backgroundProp ?? "background",
54856
- allowOverflow: allowOverflowProp,
54857
55301
  "data-slot": dataSlotProp,
54858
55302
  className: sectionClasses || void 0,
54859
55303
  children
@@ -55045,7 +55489,7 @@ function successSubmissionFeedback(message) {
55045
55489
  message
55046
55490
  };
55047
55491
  }
55048
- function isRecord$13(value) {
55492
+ function isRecord$12(value) {
55049
55493
  return typeof value === "object" && value !== null && !Array.isArray(value);
55050
55494
  }
55051
55495
  function deepEqualJsonValue(left, right) {
@@ -55055,8 +55499,8 @@ function deepEqualJsonValue(left, right) {
55055
55499
  if (left.length !== right.length) return false;
55056
55500
  return left.every((item, index) => deepEqualJsonValue(item, right[index]));
55057
55501
  }
55058
- if (isRecord$13(left) || isRecord$13(right)) {
55059
- if (!isRecord$13(left) || !isRecord$13(right)) return false;
55502
+ if (isRecord$12(left) || isRecord$12(right)) {
55503
+ if (!isRecord$12(left) || !isRecord$12(right)) return false;
55060
55504
  const leftKeys = Object.keys(left).sort();
55061
55505
  if (!deepEqualJsonValue(leftKeys, Object.keys(right).sort())) return false;
55062
55506
  return leftKeys.every((key) => deepEqualJsonValue(left[key], right[key]));
@@ -55213,12 +55657,12 @@ function resolveBookingSiteId(siteId, form) {
55213
55657
  return siteId || form?.siteId || "";
55214
55658
  }
55215
55659
  function normalizeBookingFormConfig(form) {
55216
- if (!isRecord$12(form)) return null;
55660
+ if (!isRecord$11(form)) return null;
55217
55661
  const id = readNonEmptyString(form.id);
55218
55662
  const name = readNonEmptyString(form.name);
55219
55663
  if (!id || !name) return null;
55220
- const schemaSource = isRecord$12(form.schema) ? form.schema : isRecord$12(form.schemaJson) ? form.schemaJson : null;
55221
- const settingsSource = isRecord$12(form.settings) ? form.settings : isRecord$12(form.settingsJson) ? form.settingsJson : null;
55664
+ const schemaSource = isRecord$11(form.schema) ? form.schema : isRecord$11(form.schemaJson) ? form.schemaJson : null;
55665
+ const settingsSource = isRecord$11(form.settings) ? form.settings : isRecord$11(form.settingsJson) ? form.settingsJson : null;
55222
55666
  return {
55223
55667
  id,
55224
55668
  name,
@@ -55238,8 +55682,8 @@ function normalizeBookingServices(services) {
55238
55682
  };
55239
55683
  if (!services) return [];
55240
55684
  if (Array.isArray(services)) return services.filter(isBookingFormService).map(normalizeService);
55241
- if (isRecord$12(services) && "services" in services) return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
55242
- return isRecord$12(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
55685
+ if (isRecord$11(services) && "services" in services) return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
55686
+ return isRecord$11(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
55243
55687
  }
55244
55688
  function normalizeBookingSchema(value) {
55245
55689
  if (!value) return void 0;
@@ -55250,7 +55694,7 @@ function normalizeBookingSchema(value) {
55250
55694
  };
55251
55695
  }
55252
55696
  function readBookingFormField(value) {
55253
- if (!isRecord$12(value)) return null;
55697
+ if (!isRecord$11(value)) return null;
55254
55698
  const id = readNonEmptyString(value.id);
55255
55699
  const label = readNonEmptyString(value.label);
55256
55700
  const type = readBookingFieldType(value.type);
@@ -55294,7 +55738,7 @@ function readBookingFieldOptions(value) {
55294
55738
  return options.length > 0 ? options : void 0;
55295
55739
  }
55296
55740
  function readBookingFieldOption(value) {
55297
- if (!isRecord$12(value)) return null;
55741
+ if (!isRecord$11(value)) return null;
55298
55742
  const optionValue = readNonEmptyString(value.value);
55299
55743
  const label = readNonEmptyString(value.label);
55300
55744
  return optionValue && label ? {
@@ -55314,7 +55758,7 @@ function normalizeBookingSettings(value) {
55314
55758
  };
55315
55759
  }
55316
55760
  function isBookingFormService(value) {
55317
- return isRecord$12(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
55761
+ return isRecord$11(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
55318
55762
  }
55319
55763
  function collectBookingCustomFields(data) {
55320
55764
  const customFields = {};
@@ -55364,7 +55808,7 @@ function readStringArray(value) {
55364
55808
  const strings = value.filter((item) => typeof item === "string");
55365
55809
  return strings.length > 0 ? strings : void 0;
55366
55810
  }
55367
- function isRecord$12(value) {
55811
+ function isRecord$11(value) {
55368
55812
  return typeof value === "object" && value !== null;
55369
55813
  }
55370
55814
  function getBookingServicePaymentSelectionMode(service) {
@@ -57608,7 +58052,7 @@ function resolveGroupFrame(cardStyles) {
57608
58052
  contentClassName: "offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
57609
58053
  };
57610
58054
  return {
57611
- 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(" "),
58055
+ 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(" "),
57612
58056
  containerStyle: resolveGroupFrameStyle(cardStyles),
57613
58057
  contentClassName: "card-content offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
57614
58058
  };
@@ -59923,14 +60367,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
59923
60367
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
59924
60368
  }
59925
60369
  function readVariant(blockContent) {
59926
- if (!isRecord$11(blockContent)) return void 0;
60370
+ if (!isRecord$10(blockContent)) return void 0;
59927
60371
  const variant = blockContent.variant;
59928
60372
  return typeof variant === "string" ? variant : void 0;
59929
60373
  }
59930
60374
  function isFaqDecoratedVariant(variant) {
59931
60375
  return variant === "default" || variant === "question-columns";
59932
60376
  }
59933
- function isRecord$11(value) {
60377
+ function isRecord$10(value) {
59934
60378
  return typeof value === "object" && value !== null && !Array.isArray(value);
59935
60379
  }
59936
60380
  function buildHeadingDecorationWrapperClassName(className) {
@@ -60684,9 +61128,9 @@ function isReactNode(value) {
60684
61128
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
60685
61129
  */
60686
61130
  function resolveNode(node, context, indexFallback) {
60687
- if (!shouldRenderNode(node, context)) return null;
60688
61131
  const scopeContext = applyScopes(node, context);
60689
61132
  if (node.$repeat) return resolveRepeater(node, scopeContext);
61133
+ if (!shouldRenderNode(node, scopeContext)) return null;
60690
61134
  const registry = scopeContext.registry ?? serverComponentRegistry;
60691
61135
  const normalizedType = node.type.toLowerCase();
60692
61136
  const component = registry[node.type] ?? registry[normalizedType] ?? (normalizedType === "section" ? SectionNode : void 0);
@@ -61005,7 +61449,7 @@ function applyStyleOverride(target, key, defaults) {
61005
61449
  //#endregion
61006
61450
  //#region ../blocks/src/system/runtime/blockComposition.ts
61007
61451
  function readBlockComposition(value) {
61008
- if (!isRecord$10(value) || typeof value.kind !== "string") return null;
61452
+ if (!isRecord$9(value) || typeof value.kind !== "string") return null;
61009
61453
  switch (value.kind) {
61010
61454
  case "intro": return value.treatment === "editorial-statement" || value.treatment === "portrait-bio" ? {
61011
61455
  kind: "intro",
@@ -61018,7 +61462,7 @@ function readBlockComposition(value) {
61018
61462
  default: return null;
61019
61463
  }
61020
61464
  }
61021
- function isRecord$10(value) {
61465
+ function isRecord$9(value) {
61022
61466
  return typeof value === "object" && value !== null && !Array.isArray(value);
61023
61467
  }
61024
61468
  //#endregion
@@ -61190,11 +61634,11 @@ init_repeaterGrid();
61190
61634
  //#endregion
61191
61635
  //#region ../blocks/src/system/media/constrainedVideoMedia.ts
61192
61636
  init_src$2();
61193
- function isRecord$9(value) {
61637
+ function isRecord$8(value) {
61194
61638
  return typeof value === "object" && value !== null && !Array.isArray(value);
61195
61639
  }
61196
61640
  function valueAtField(current, fieldId) {
61197
- return isRecord$9(current) ? current[fieldId] : void 0;
61641
+ return isRecord$8(current) ? current[fieldId] : void 0;
61198
61642
  }
61199
61643
  function collectConstrainedVideoMediaValues(options) {
61200
61644
  const { blockKind, fields, currentValue, parentPath = [] } = options;
@@ -61205,7 +61649,7 @@ function collectConstrainedVideoMediaValues(options) {
61205
61649
  const fieldValue = valueAtField(currentValue, field.id);
61206
61650
  switch (field.type) {
61207
61651
  case "media": {
61208
- if (!isRecord$9(fieldValue) || fieldValue.type !== "video") break;
61652
+ if (!isRecord$8(fieldValue) || fieldValue.type !== "video") break;
61209
61653
  const policy = deriveVideoSlotPolicy(resolveVideoSelectionIntentForMediaField({
61210
61654
  fieldPath,
61211
61655
  mediaKinds: field.mediaKinds
@@ -62141,6 +62585,19 @@ init_breakpoints();
62141
62585
  init_navDropdownSizing();
62142
62586
  const HEADER_BLUR = "blur(12px)";
62143
62587
  const FLOATING_BLUR = "blur(16px)";
62588
+ const INSET_SHELL_MARKER_CLASS = "header-bar-frame-inset-shell";
62589
+ const INSET_SHELL_EDGE = "1rem";
62590
+ const INSET_SHELL_INSET_BLOCK = "0.875rem";
62591
+ const INSET_SHELL_RADIUS = "9999px";
62592
+ const INSET_SHELL_CONTAINER_MAX = "80rem";
62593
+ const INSET_SHELL_INTERIOR_PADDING_X = "1.75rem";
62594
+ /**
62595
+ * Whether the classic header should render as an inset "brand capsule" shell.
62596
+ * The facet is only meaningful for the classic layout; other variants ignore it.
62597
+ */
62598
+ function usesInsetShell(header) {
62599
+ return header.barFrame === "inset-shell" && header.variant === "classic";
62600
+ }
62144
62601
  /**
62145
62602
  * Generate complete CSS for header system from theme config
62146
62603
  *
@@ -62240,7 +62697,36 @@ function generateHeaderRootStyles(header, themeId, tokens, _theme) {
62240
62697
  const baseBlock = `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
62241
62698
  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`;
62242
62699
  if (isContainedNav || backgroundRules.length === 0) return `${baseBlock}\n${overlayFix}`;
62243
- 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}`;
62700
+ 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) : ""}`;
62701
+ }
62702
+ /**
62703
+ * Reshapes the full-bleed header paint layer into a contained brand capsule at
62704
+ * the desktop breakpoint. The capsule is centred, capped to the page container
62705
+ * width, inset from the top, fully rounded, and carries the header depth so it
62706
+ * reads as a floating pill. Root border/shadow are neutralised on desktop so a
62707
+ * bordered style does not leave a full-width hairline around the capsule. Sticky
62708
+ * positioning is unaffected — the root stays full width and sticky while the
62709
+ * ::before paint provides the capsule.
62710
+ */
62711
+ function generateInsetShellStyles(header, themeId) {
62712
+ const scope = `:where([data-theme-scope="${themeId}"])`;
62713
+ const shellRootSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}`;
62714
+ const shellBeforeSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}::before`;
62715
+ const layoutSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS} .rb-header-layout`;
62716
+ const widthValue = header.maxWidth === "full" ? `calc(100% - (${INSET_SHELL_EDGE} * 2))` : `min(${INSET_SHELL_CONTAINER_MAX}, calc(100% - (${INSET_SHELL_EDGE} * 2)))`;
62717
+ const shadowVar = getComponentShadowVar(header.shadow?.elevation ?? "none");
62718
+ const rootRules = ["border: none;", "box-shadow: none;"];
62719
+ const beforeRules = [
62720
+ `inset: ${INSET_SHELL_INSET_BLOCK} auto;`,
62721
+ "left: 50%;",
62722
+ "right: auto;",
62723
+ "transform: translateX(-50%);",
62724
+ `width: ${widthValue};`,
62725
+ `border-radius: ${INSET_SHELL_RADIUS};`,
62726
+ ...shadowVar ? [`box-shadow: ${shadowVar};`] : []
62727
+ ];
62728
+ const layoutRules = [`padding-inline: ${INSET_SHELL_INTERIOR_PADDING_X};`];
62729
+ 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`;
62244
62730
  }
62245
62731
  /**
62246
62732
  * Generate logo typography styles
@@ -62318,7 +62804,7 @@ function generateLogoTextBehaviorStyles(logoText, themeId) {
62318
62804
  */
62319
62805
  function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment, navTextSize) {
62320
62806
  const navPreferences = {
62321
- typography: header.navTypography ?? "inherit",
62807
+ typography: header.navFontRole ?? header.navTypography ?? "inherit",
62322
62808
  fontSize: readHeaderNavFontSizePreference(header.navTextSize)
62323
62809
  };
62324
62810
  if (header.navLinkStyle) return generateNavLinkCSS({
@@ -64986,7 +65472,7 @@ function hydrateValue(value, context) {
64986
65472
  const resolvedItems = value.map((item) => hydrateValue(item, context));
64987
65473
  return resolvedItems.every((item, index) => item === value[index]) ? value : resolvedItems;
64988
65474
  }
64989
- if (isRecord$25(value)) {
65475
+ if (isRecord$24(value)) {
64990
65476
  if (isInternalLink$1(value)) return hydrateInternalLink(value, context.routes);
64991
65477
  if (isPageLink$1(value)) return hydratePageLink(value, context);
64992
65478
  if (isEntryLink$1(value)) return hydrateEntryLink(value, context);
@@ -66688,6 +67174,12 @@ const containerResponsiveThemeCss = `/*
66688
67174
  .rb-lg-hidden {
66689
67175
  display: none;
66690
67176
  }
67177
+ .rb-lg-flex-row {
67178
+ flex-direction: row;
67179
+ }
67180
+ .rb-lg-items-center {
67181
+ align-items: center;
67182
+ }
66691
67183
  }
66692
67184
 
66693
67185
  }
@@ -78124,7 +78616,7 @@ const containerResponsiveThemeCss = `/*
78124
78616
  [data-block="feature-cards"][data-block-composition="asymmetric-emphasis"]
78125
78617
  .rb-feature-card {
78126
78618
  height: auto;
78127
- overflow: hidden;
78619
+ overflow: visible;
78128
78620
  border: 0;
78129
78621
  border-radius: 0;
78130
78622
  background: transparent;
@@ -79632,108 +80124,6 @@ function getCmsApiUrl$1() {
79632
80124
  function resolveApiBaseUrl() {
79633
80125
  return getCmsApiUrl$1();
79634
80126
  }
79635
- const API_ERROR_CODE_SET = /* @__PURE__ */ new Set([
79636
- "auth:unauthenticated",
79637
- "auth:token_expired",
79638
- "auth:token_invalid",
79639
- "auth:forbidden",
79640
- "auth:mfa_required",
79641
- "auth:sudo_required",
79642
- "auth:insufficient_permissions",
79643
- "auth:impersonation_restricted",
79644
- "validation:invalid_input",
79645
- "validation:missing_field",
79646
- "validation:invalid_format",
79647
- "validation:payload_too_large",
79648
- "resource:not_found",
79649
- "resource:already_exists",
79650
- "resource:conflict",
79651
- "resource:gone",
79652
- "rate_limit:exceeded",
79653
- "billing:payment_required",
79654
- "billing:plan_limit_exceeded",
79655
- "billing:pass_redemption_failed",
79656
- "server:internal_error",
79657
- "server:unavailable",
79658
- "external:service_error",
79659
- "external:registrar_orphaned_contact_profile",
79660
- "network:connection_error",
79661
- "network:timeout",
79662
- "network:dns_error"
79663
- ]);
79664
- function isApiErrorCode(value) {
79665
- return typeof value === "string" && API_ERROR_CODE_SET.has(value);
79666
- }
79667
- function isApiError(result) {
79668
- return result.success === false;
79669
- }
79670
- function isApiSuccess(result) {
79671
- return result.success === true;
79672
- }
79673
- function isRecord$7(value) {
79674
- return typeof value === "object" && value !== null && !Array.isArray(value);
79675
- }
79676
- function isFieldError(value) {
79677
- return isRecord$7(value) && typeof value.field === "string" && typeof value.code === "string" && typeof value.message === "string";
79678
- }
79679
- function fieldErrorsFromUnknown(value) {
79680
- if (!Array.isArray(value)) return null;
79681
- return value.every(isFieldError) ? value : null;
79682
- }
79683
- function extractEnvelopeErrorObject(body) {
79684
- if (!isRecord$7(body)) return null;
79685
- const error = body.error;
79686
- if (!isRecord$7(error)) return null;
79687
- if ("success" in body && body.success !== false) return null;
79688
- return error;
79689
- }
79690
- function extractApiEnvelopeErrorDetails(body) {
79691
- const error = extractEnvelopeErrorObject(body);
79692
- if (!error) return {
79693
- rawCode: null,
79694
- code: null,
79695
- message: null,
79696
- status: null,
79697
- fieldErrors: null
79698
- };
79699
- const rawCode = typeof error.code === "string" ? error.code : null;
79700
- const message = typeof error.message === "string" && error.message.trim().length > 0 ? error.message : null;
79701
- return {
79702
- rawCode,
79703
- code: isApiErrorCode(rawCode) ? rawCode : null,
79704
- message,
79705
- status: typeof error.status === "number" && Number.isFinite(error.status) ? error.status : null,
79706
- fieldErrors: fieldErrorsFromUnknown(error.fieldErrors)
79707
- };
79708
- }
79709
- /**
79710
- * Error class for API failures that can be thrown from unwrapResponse.
79711
- * Preserves all error metadata from the envelope.
79712
- */
79713
- var ApiEnvelopeError = class extends Error {
79714
- constructor(error) {
79715
- super(error.message);
79716
- this.name = "ApiEnvelopeError";
79717
- this.code = error.code;
79718
- this.requestId = error.requestId;
79719
- this.timestamp = error.timestamp;
79720
- this.status = error.status;
79721
- this.fieldErrors = error.fieldErrors;
79722
- }
79723
- };
79724
- /**
79725
- * Unwrap a successful API response or throw on error.
79726
- *
79727
- * @example
79728
- * ```typescript
79729
- * const response = await apiClient({ endpoint: 'getUser', params: { id } });
79730
- * const user = unwrapResponse(response); // Throws if not success
79731
- * ```
79732
- */
79733
- function unwrapResponse(result) {
79734
- if (isApiSuccess(result)) return result.data;
79735
- throw new ApiEnvelopeError(result.error);
79736
- }
79737
80127
  //#endregion
79738
80128
  //#region ../api/src/request.ts
79739
80129
  let revalidateTag = null;
@@ -151946,7 +152336,7 @@ var init_event_registration_client = __esmMin((() => {
151946
152336
  * Loads Leaflet CSS/JS from CDN to avoid bundling in the blocks package.
151947
152337
  */
151948
152338
  function isLeafletApi(value) {
151949
- if (!isRecord$25(value)) return false;
152339
+ if (!isRecord$24(value)) return false;
151950
152340
  return typeof value.map === "function" && typeof value.tileLayer === "function" && typeof value.marker === "function";
151951
152341
  }
151952
152342
  function loadLeaflet() {
@@ -158599,6 +158989,9 @@ function BlocksIslandsHydrator(props = {}) {
158599
158989
  return null;
158600
158990
  }
158601
158991
  //#endregion
158992
+ //#region ../blocks/src/system/blocks/site-footer-runtime.ts
158993
+ init_src$3();
158994
+ //#endregion
158602
158995
  //#region ../blocks/src/rendering/server.ts
158603
158996
  init_schema$1();
158604
158997
  //#endregion
@@ -158944,7 +159337,7 @@ var SimpleCache = class {
158944
159337
  * 1. This constant
158945
159338
  * 2. The "version" field in package.json
158946
159339
  */
158947
- const SDK_VERSION = "0.107.0";
159340
+ const SDK_VERSION = "0.108.0";
158948
159341
  //#endregion
158949
159342
  //#region src/client/error.ts
158950
159343
  let _Symbol$for;