@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
@@ -45,8 +45,6 @@ function fallbackBinding(...sources) {
45
45
  sources: [...sources]
46
46
  };
47
47
  }
48
- //#endregion
49
- //#region ../api/src/apiEndpointTypes.ts
50
48
  function blockedDemoMutationPolicy(classification, publicMessage) {
51
49
  if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
52
50
  return {
@@ -74,6 +72,7 @@ const TAG_TEMPLATES = {
74
72
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
75
73
  routeById: "riverbank:route:{routeId}",
76
74
  pageById: "riverbank:page:{pageId}",
75
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
77
76
  workflowRunById: "riverbank:workflow-run:{runId}",
78
77
  siteForms: "riverbank:site:{siteId}:forms",
79
78
  formById: "riverbank:form:{formId}",
@@ -97,7 +96,7 @@ const TAG_TEMPLATES = {
97
96
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
98
97
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
99
98
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
100
- TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
99
+ TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
101
100
  //#endregion
102
101
  //#region ../core/src/result.ts
103
102
  function ok(value) {
@@ -5112,104 +5111,153 @@ const showtimePill = defineButtonPersonality({
5112
5111
  }
5113
5112
  });
5114
5113
  //#endregion
5115
- //#region ../theme-core/src/buttons/personalities/index.ts
5116
- const buttonPersonalities = [
5117
- defineButtonPersonality({
5118
- id: "soft-pill",
5119
- name: "Soft Pill",
5120
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5121
- tags: {
5122
- tone: "classic",
5123
- energy: "calm",
5124
- motion: "subtle",
5125
- era: "organic"
5114
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
5115
+ /**
5116
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
5117
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
5118
+ */
5119
+ const softPill = defineButtonPersonality({
5120
+ id: "soft-pill",
5121
+ name: "Soft Pill",
5122
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5123
+ tags: {
5124
+ tone: "classic",
5125
+ energy: "calm",
5126
+ motion: "subtle",
5127
+ era: "organic"
5128
+ },
5129
+ buttonSystem: {
5130
+ global: {
5131
+ cornerStyle: "pill",
5132
+ shadow: "low",
5133
+ textTransform: "none",
5134
+ fontWeight: 500,
5135
+ borderWidth: 2,
5136
+ hoverTransform: "lift",
5137
+ hoverColor: "none"
5126
5138
  },
5127
- buttonSystem: {
5128
- global: {
5129
- cornerStyle: "pill",
5130
- shadow: "low",
5131
- textTransform: "none",
5132
- fontWeight: 500,
5133
- borderWidth: 2,
5134
- hoverTransform: "lift",
5135
- hoverColor: "none"
5136
- },
5137
- variants: [
5138
- {
5139
- id: "primary",
5140
- name: "Primary",
5141
- enabled: true,
5142
- priority: 1,
5143
- background: {
5144
- type: "solid",
5145
- colorToken: "primary"
5146
- },
5147
- textColorToken: "primaryForeground",
5148
- borderRadius: "rounded-full",
5149
- shadow: {
5150
- elevation: "low",
5151
- softness: "soft",
5152
- position: "bottom"
5153
- },
5154
- effects: {
5155
- hover: [{
5156
- effectId: "lift",
5157
- options: { translateY: "-1px" }
5158
- }],
5159
- active: [{
5160
- effectId: "scale-down",
5161
- options: { scale: "0.98" }
5162
- }]
5163
- }
5164
- },
5165
- {
5166
- id: "secondary",
5167
- name: "Secondary",
5168
- enabled: true,
5169
- priority: 2,
5170
- background: { type: "transparent" },
5171
- textColorToken: "primary",
5172
- borderRadius: "rounded-full",
5173
- border: {
5174
- widthClass: "border-2",
5175
- colorToken: "primary"
5176
- },
5177
- effects: { hover: [{
5178
- effectId: "background-on-hover",
5179
- options: { colorToken: "surface" }
5180
- }] }
5139
+ variants: [
5140
+ {
5141
+ id: "primary",
5142
+ name: "Primary",
5143
+ enabled: true,
5144
+ priority: 1,
5145
+ background: {
5146
+ type: "solid",
5147
+ colorToken: "primary"
5181
5148
  },
5182
- {
5183
- id: "outline",
5184
- name: "Outline",
5185
- enabled: true,
5186
- priority: 3,
5187
- background: { type: "transparent" },
5188
- textColorToken: "text",
5189
- borderRadius: "rounded-full",
5190
- border: {
5191
- widthClass: "border",
5192
- colorToken: "border"
5193
- },
5194
- effects: { hover: [{
5195
- effectId: "background-on-hover",
5196
- options: { colorToken: "surface" }
5197
- }] }
5149
+ textColorToken: "primaryForeground",
5150
+ borderRadius: "rounded-full",
5151
+ shadow: {
5152
+ elevation: "low",
5153
+ softness: "soft",
5154
+ position: "bottom"
5198
5155
  },
5199
- {
5200
- id: "ghost",
5201
- name: "Ghost",
5202
- enabled: true,
5203
- priority: 3,
5204
- background: { type: "transparent" },
5205
- textColorToken: "text",
5206
- borderRadius: "rounded-full",
5207
- effects: { hover: [{
5208
- effectId: "background-on-hover",
5209
- options: { colorToken: "surface" }
5210
- }] }
5156
+ effects: {
5157
+ hover: [{
5158
+ effectId: "lift",
5159
+ options: { translateY: "-1px" }
5160
+ }],
5161
+ active: [{
5162
+ effectId: "scale-down",
5163
+ options: { scale: "0.98" }
5164
+ }]
5211
5165
  }
5212
- ]
5166
+ },
5167
+ {
5168
+ id: "secondary",
5169
+ name: "Secondary",
5170
+ enabled: true,
5171
+ priority: 2,
5172
+ background: { type: "transparent" },
5173
+ textColorToken: "primary",
5174
+ borderRadius: "rounded-full",
5175
+ border: {
5176
+ widthClass: "border-2",
5177
+ colorToken: "primary"
5178
+ },
5179
+ effects: { hover: [{
5180
+ effectId: "background-on-hover",
5181
+ options: { colorToken: "surface" }
5182
+ }] }
5183
+ },
5184
+ {
5185
+ id: "outline",
5186
+ name: "Outline",
5187
+ enabled: true,
5188
+ priority: 3,
5189
+ background: { type: "transparent" },
5190
+ textColorToken: "text",
5191
+ borderRadius: "rounded-full",
5192
+ border: {
5193
+ widthClass: "border",
5194
+ colorToken: "border"
5195
+ },
5196
+ effects: { hover: [{
5197
+ effectId: "background-on-hover",
5198
+ options: { colorToken: "surface" }
5199
+ }] }
5200
+ },
5201
+ {
5202
+ id: "ghost",
5203
+ name: "Ghost",
5204
+ enabled: true,
5205
+ priority: 3,
5206
+ background: { type: "transparent" },
5207
+ textColorToken: "text",
5208
+ borderRadius: "rounded-full",
5209
+ effects: { hover: [{
5210
+ effectId: "background-on-hover",
5211
+ options: { colorToken: "surface" }
5212
+ }] }
5213
+ }
5214
+ ]
5215
+ }
5216
+ });
5217
+ //#endregion
5218
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
5219
+ const solidSecondary = {
5220
+ id: "secondary",
5221
+ name: "Secondary",
5222
+ enabled: true,
5223
+ priority: 2,
5224
+ background: {
5225
+ type: "solid",
5226
+ colorToken: "secondary"
5227
+ },
5228
+ textColorToken: "onSecondary",
5229
+ borderRadius: "rounded-full",
5230
+ shadow: {
5231
+ elevation: "none",
5232
+ softness: null,
5233
+ position: "bottom"
5234
+ },
5235
+ effects: {
5236
+ hover: [{
5237
+ effectId: "background-on-hover-alpha",
5238
+ options: {
5239
+ colorToken: "secondary",
5240
+ opacity: 88
5241
+ }
5242
+ }],
5243
+ active: [{
5244
+ effectId: "scale-down",
5245
+ options: { scale: "0.98" }
5246
+ }]
5247
+ }
5248
+ };
5249
+ //#endregion
5250
+ //#region ../theme-core/src/buttons/personalities/index.ts
5251
+ const buttonPersonalities = [
5252
+ softPill,
5253
+ defineButtonPersonality({
5254
+ id: "two-tone-pill",
5255
+ name: "Two-tone Pill",
5256
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
5257
+ tags: softPill.tags,
5258
+ buttonSystem: {
5259
+ ...softPill.buttonSystem,
5260
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
5213
5261
  }
5214
5262
  }),
5215
5263
  earthPill,
@@ -6743,6 +6791,7 @@ const navFontWeight = z$1.enum([
6743
6791
  "bold"
6744
6792
  ]);
6745
6793
  const headerMaxWidth = z$1.enum(["container", "full"]);
6794
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
6746
6795
  const headerContainerSchema = z$1.object({
6747
6796
  rounded: z$1.enum([
6748
6797
  "none",
@@ -6887,6 +6936,7 @@ const headerSchema = z$1.object({
6887
6936
  positioning: headerPositioning,
6888
6937
  shrinkOnScroll: z$1.boolean(),
6889
6938
  maxWidth: headerMaxWidth,
6939
+ barFrame: headerBarFrame.optional(),
6890
6940
  logoOverride: mediaSchema$1.nullable().optional(),
6891
6941
  background: headerBackgroundSchema.default({
6892
6942
  type: "color",
@@ -6896,6 +6946,7 @@ const headerSchema = z$1.object({
6896
6946
  navStyle: headerNavStyle,
6897
6947
  navColor: themeColorTokenSchema.nullable().optional(),
6898
6948
  navWeight: navFontWeight.default("medium"),
6949
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
6899
6950
  navTypography: z$1.enum(["body", "heading"]).optional(),
6900
6951
  navTextSize: navLinkStyleSchema.shape.textSize,
6901
6952
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -6911,7 +6962,21 @@ const headerSchema = z$1.object({
6911
6962
  ctaTreatment: headerCtaTreatmentSchema.optional(),
6912
6963
  ctaVariant: z$1.string().min(1).optional(),
6913
6964
  dropdownStyle: dropdownStyleSchema
6914
- });
6965
+ }).transform(normaliseHeaderNavFontRole);
6966
+ /**
6967
+ * Normalises the legacy `navTypography` font-role alias into the canonical
6968
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
6969
+ * a data migration. `navFontRole` always wins when both are present; the legacy
6970
+ * field is dropped so we never carry a dual write forward.
6971
+ */
6972
+ function normaliseHeaderNavFontRole(header) {
6973
+ if (header.navTypography === void 0) return header;
6974
+ const { navTypography, ...rest } = header;
6975
+ return header.navFontRole === void 0 ? {
6976
+ ...rest,
6977
+ navFontRole: navTypography
6978
+ } : rest;
6979
+ }
6915
6980
  const footerVariant = z$1.enum([
6916
6981
  "simple",
6917
6982
  "columns",
@@ -8717,7 +8782,7 @@ const overlayLogoAccommodations = [
8717
8782
  * optional nested styling fields that would otherwise leak from another Look.
8718
8783
  */
8719
8784
  function baseHeader(theme) {
8720
- 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;
8785
+ 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;
8721
8786
  return {
8722
8787
  ...header,
8723
8788
  navContainer: {
@@ -8866,6 +8931,17 @@ const headerStyleCatalog = defineExactCatalog()([
8866
8931
  navTypography: "brand-caps",
8867
8932
  moods: ["expressive"]
8868
8933
  },
8934
+ {
8935
+ id: asHeaderStyleId("brand-capsule"),
8936
+ label: "Brand Capsule",
8937
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
8938
+ supportedLayoutIds: supportedLayouts(["classic"]),
8939
+ navInteraction: "pill-background",
8940
+ surface: "brand-solid",
8941
+ defaultDepth: "shadow",
8942
+ navTypography: "quiet-caps",
8943
+ moods: ["expressive", "professional"]
8944
+ },
8869
8945
  {
8870
8946
  id: asHeaderStyleId("serif-line"),
8871
8947
  label: "Serif Line",
@@ -8959,6 +9035,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8959
9035
  "brand-bar",
8960
9036
  "brand-underline",
8961
9037
  "brand-pill",
9038
+ "brand-capsule",
8962
9039
  "serif-line",
8963
9040
  "flat-tabs"
8964
9041
  ])],
@@ -8996,6 +9073,11 @@ headerStyleRepairChain([
8996
9073
  "brand-pill",
8997
9074
  "brand-bar",
8998
9075
  "minimal"
9076
+ ]), headerStyleRepairChain([
9077
+ "brand-capsule",
9078
+ "brand-pill",
9079
+ "brand-bar",
9080
+ "minimal"
8999
9081
  ]), headerStyleRepairChain([
9000
9082
  "pill-nav",
9001
9083
  "soft-bar",
@@ -11233,6 +11315,7 @@ const curatedSiteStyles = [
11233
11315
  ],
11234
11316
  buttonPersonalityChoices: [
11235
11317
  buttonChoice("soft-pill"),
11318
+ buttonChoice("two-tone-pill"),
11236
11319
  buttonChoice("pebble"),
11237
11320
  buttonChoice("editorial-link"),
11238
11321
  buttonChoice("brushed-wash")
@@ -12412,6 +12495,7 @@ const curatedSiteStyles = [
12412
12495
  ],
12413
12496
  buttonPersonalityChoices: [
12414
12497
  buttonChoice("quiet-arrow"),
12498
+ buttonChoice("two-tone-pill"),
12415
12499
  buttonChoice("flat-ink"),
12416
12500
  buttonChoice("editorial-link")
12417
12501
  ],
@@ -13299,7 +13383,7 @@ const ALLOWED_TRANSFORM_IDS = [
13299
13383
  "media.fromUrl",
13300
13384
  "background.resolveStyle",
13301
13385
  "background.resolveColorsStyle",
13302
- "background.resolveAllowOverflow",
13386
+ "background.resolveFrameClassName",
13303
13387
  "background.resolveImageStyle",
13304
13388
  "background.resolveImageClassName",
13305
13389
  "background.resolveOverlayStyle",
@@ -14966,6 +15050,7 @@ function devValidate(node) {
14966
15050
  }
14967
15051
  //#endregion
14968
15052
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
15053
+ const BACKGROUND_FRAME_BASE_CLASS = "rb-background-frame rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-isolate rb-pointer-events-none";
14969
15054
  /**
14970
15055
  * Creates background layer nodes for rendering backgrounds from field data.
14971
15056
  *
@@ -15031,6 +15116,34 @@ function backgroundLayer(path, options = {}) {
15031
15116
  ];
15032
15117
  }
15033
15118
  /**
15119
+ * Wrap decorative background layers in their own clipping frame.
15120
+ *
15121
+ * Foreground content remains outside this frame, so editor outlines, focus
15122
+ * rings, and floating controls are never clipped by a visual background.
15123
+ * Backgrounds that explicitly opt into overflow keep that behavior within
15124
+ * the decorative layer rather than changing the content root.
15125
+ */
15126
+ function backgroundFrame(path, options = {}) {
15127
+ const { leadingNodes = [], ...layerOptions } = options;
15128
+ const framedLayerOptions = {
15129
+ ...layerOptions,
15130
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
15131
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
15132
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
15133
+ };
15134
+ return el("div", {
15135
+ className: { $bind: {
15136
+ from: path,
15137
+ transforms: [{
15138
+ id: "background.resolveFrameClassName",
15139
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
15140
+ }],
15141
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
15142
+ } },
15143
+ style: { borderRadius: "inherit" }
15144
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
15145
+ }
15146
+ /**
15034
15147
  * Creates a media node for rendering background image/video media with conditional rendering.
15035
15148
  *
15036
15149
  * This helper creates a media element that:
@@ -15192,8 +15305,8 @@ function sectionContainer(children, opts) {
15192
15305
  * - content
15193
15306
  */
15194
15307
  function styledContainer(config) {
15195
- 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;
15196
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
15308
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
15309
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
15197
15310
  const childrenArray = Array.isArray(children) ? children : [children];
15198
15311
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
15199
15312
  return el(rootType, {
@@ -15216,7 +15329,7 @@ function styledContainer(config) {
15216
15329
  }],
15217
15330
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
15218
15331
  } }
15219
- }, [...backgroundNodes, ...childrenArray]);
15332
+ }, [backgroundNode, ...childrenArray]);
15220
15333
  }
15221
15334
  //#endregion
15222
15335
  //#region ../blocks/src/system/spacing.ts
@@ -15349,7 +15462,7 @@ const DEFAULT_SECTION_SPACING = "medium";
15349
15462
  * - Creating a section wrapper with background theme
15350
15463
  * - Adding background color/gradient/image layers
15351
15464
  * - Binding className to section styles with transform
15352
- * - Binding allowOverflow for background positioning
15465
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
15353
15466
  * - Wrapping content children
15354
15467
  *
15355
15468
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -15385,8 +15498,8 @@ const DEFAULT_SECTION_SPACING = "medium";
15385
15498
  * });
15386
15499
  */
15387
15500
  function styledSection(config) {
15388
- 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;
15389
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
15501
+ 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;
15502
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
15390
15503
  imageClassName,
15391
15504
  fallbackToken: background,
15392
15505
  omitImageLayer: !renderBackgroundImage,
@@ -15409,13 +15522,8 @@ function styledSection(config) {
15409
15522
  fullWidthPath
15410
15523
  }
15411
15524
  }]
15412
- } },
15413
- allowOverflow: allowOverflow ? true : { $bind: {
15414
- from: `${bindFrom}.background`,
15415
- transforms: [{ id: "background.resolveAllowOverflow" }],
15416
- fallback: false
15417
15525
  } }
15418
- }, [...renderedBackgroundNodes, ...childrenArray]);
15526
+ }, [renderedBackgroundNode, ...childrenArray]);
15419
15527
  }
15420
15528
  //#endregion
15421
15529
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -16267,9 +16375,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
16267
16375
  //#endregion
16268
16376
  //#region ../blocks/src/system/node/fragments/styledCard.ts
16269
16377
  function styledCard(children, opts, ...mods) {
16270
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
16271
- 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" });
16272
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
16378
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
16379
+ const defaultBackgroundLayer = el("div", {
16380
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
16381
+ style: { borderRadius: "inherit" }
16382
+ });
16383
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
16273
16384
  const style = {
16274
16385
  ...opts.style ?? {},
16275
16386
  borderColor: { $bind: {
@@ -16296,7 +16407,7 @@ function styledCard(children, opts, ...mods) {
16296
16407
  ...style ? { style } : {}
16297
16408
  }, [
16298
16409
  defaultBackgroundLayer,
16299
- ...backgroundNodes,
16410
+ backgroundNode,
16300
16411
  ...children
16301
16412
  ], ...mods);
16302
16413
  }
@@ -17305,7 +17416,7 @@ function buildTestimonialCard(...mods) {
17305
17416
  }, props({ value: "“" })), richText({ className: "rb-prose rb-max-w-none" }, bind("testimonial.content.body"), when("testimonial.content.body"))]), el("div", { className: "rb-testimonial-attribution" }, buildAttributionNodes())])], {
17306
17417
  stylesFrom: "content._cardStyles",
17307
17418
  backgroundFrom: "content._cardStyles.background",
17308
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
17419
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
17309
17420
  }, ...mods);
17310
17421
  }
17311
17422
  /**
@@ -17777,39 +17888,6 @@ const formEmbedFragment = defineFragment({
17777
17888
  }
17778
17889
  });
17779
17890
  //#endregion
17780
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
17781
- const footerBottomTextFragment = defineFragment({
17782
- id: "footerBottomText",
17783
- title: "Footer Text",
17784
- description: "Rich text content for the main footer body and optional bottom bar.",
17785
- fields: [{
17786
- id: "bodyText",
17787
- type: "richText",
17788
- label: "Body text",
17789
- description: "Appears in the main footer area.",
17790
- ui: { variant: "limited" }
17791
- }, {
17792
- id: "bottomText",
17793
- type: "richText",
17794
- label: "Bottom bar text",
17795
- description: "Appears in the optional footer bottom bar.",
17796
- ui: { variant: "limited" }
17797
- }],
17798
- layout: [richText({
17799
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17800
- style: textColorStyle("text/80")
17801
- }, when("bodyText"), bind("bodyText", { transforms: [{
17802
- id: "content.interpolateRichTextTokens",
17803
- options: { tokens: ["year", "site_name"] }
17804
- }] })), richText({
17805
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17806
- style: textColorStyle("text/80")
17807
- }, when("bottomText"), bind("bottomText", { transforms: [{
17808
- id: "content.interpolateRichTextTokens",
17809
- options: { tokens: ["year", "site_name"] }
17810
- }] }))]
17811
- });
17812
- //#endregion
17813
17891
  //#region ../blocks/src/system/fragments/library/singleButton.ts
17814
17892
  const singleButtonFragment = defineFragment({
17815
17893
  id: "singleButton",
@@ -17982,7 +18060,7 @@ function createFaqAccordionLayout(options = {}) {
17982
18060
  options: {
17983
18061
  axis: "all",
17984
18062
  includeSpacing: false,
17985
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
18063
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
17986
18064
  }
17987
18065
  }]
17988
18066
  },
@@ -19106,7 +19184,6 @@ function splitLayoutWith(children) {
19106
19184
  }
19107
19185
  }),
19108
19186
  renderBackgroundImage: false,
19109
- allowOverflow: true,
19110
19187
  baseClass: ""
19111
19188
  });
19112
19189
  }
@@ -19734,7 +19811,7 @@ function postCard(children, ...mods) {
19734
19811
  return styledCard(children, {
19735
19812
  stylesFrom: "content._cardStyles",
19736
19813
  backgroundFrom: "content._cardStyles.background",
19737
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
19814
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
19738
19815
  }, ...mods);
19739
19816
  }
19740
19817
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -19770,7 +19847,7 @@ const stackPostCard = styledCard([inline({
19770
19847
  ])])], {
19771
19848
  stylesFrom: "content._cardStyles",
19772
19849
  backgroundFrom: "content._cardStyles.background",
19773
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
19850
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
19774
19851
  }, repeat("data.posts", "post"));
19775
19852
  const emptyState$2 = {
19776
19853
  ...styledCard([text({
@@ -19779,7 +19856,7 @@ const emptyState$2 = {
19779
19856
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
19780
19857
  stylesFrom: "content._cardStyles",
19781
19858
  backgroundFrom: "content._cardStyles.background",
19782
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
19859
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
19783
19860
  }),
19784
19861
  $when: {
19785
19862
  when: { from: "data.posts[0]" },
@@ -19789,7 +19866,7 @@ const emptyState$2 = {
19789
19866
  function blogListingShell(children) {
19790
19867
  return styledSection({
19791
19868
  children: styledContainer({
19792
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
19869
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19793
19870
  children
19794
19871
  }),
19795
19872
  baseClass: ""
@@ -20201,7 +20278,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
20201
20278
  const formSurface = styledContainer({
20202
20279
  bindFrom: "_containerStyles",
20203
20280
  constrainWidth: false,
20204
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
20281
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
20205
20282
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
20206
20283
  });
20207
20284
  function createFormLayout(variant) {
@@ -21418,6 +21495,7 @@ const headerRootClassTransform = {
21418
21495
  ];
21419
21496
  const variant = header?.variant;
21420
21497
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
21498
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
21421
21499
  return joinClasses(classes);
21422
21500
  }
21423
21501
  };
@@ -21931,7 +22009,7 @@ function desktopOnlyDisplay(display) {
21931
22009
  }
21932
22010
  //#endregion
21933
22011
  //#region ../blocks/src/system/blocks/site-header.ts
21934
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
22012
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
21935
22013
  ...node,
21936
22014
  $when: {
21937
22015
  when: {
@@ -21959,7 +22037,7 @@ const logoRow = link({
21959
22037
  text({
21960
22038
  as: "strong",
21961
22039
  className: "header-logo-text rb-truncate"
21962
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22040
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21963
22041
  ]);
21964
22042
  const centeredLogoRow = link({
21965
22043
  href: "/",
@@ -21979,7 +22057,7 @@ const centeredLogoRow = link({
21979
22057
  text({
21980
22058
  as: "strong",
21981
22059
  className: "header-logo-text"
21982
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22060
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21983
22061
  ]);
21984
22062
  const createNavRow = (className, align = "end") => navRow({
21985
22063
  className: `${className} header-nav-row`,
@@ -22111,7 +22189,7 @@ const classicLayout = inline({
22111
22189
  logoRow,
22112
22190
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
22113
22191
  headerCta
22114
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
22192
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
22115
22193
  const classicCenteredNavLayout = inline({
22116
22194
  className: bindProp("$root.theme.header.maxWidth", {
22117
22195
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -22122,7 +22200,7 @@ const classicCenteredNavLayout = inline({
22122
22200
  logoRow,
22123
22201
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
22124
22202
  headerCta
22125
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
22203
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
22126
22204
  const centeredLayout = stack({
22127
22205
  gap: "md",
22128
22206
  align: "center",
@@ -22185,7 +22263,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22185
22263
  transforms: pipe(tx("layout.headerSectionBackground")),
22186
22264
  fallback: "background"
22187
22265
  }),
22188
- allowOverflow: true,
22189
22266
  className: bindProp("$root.theme.header", {
22190
22267
  transforms: pipe(tx("layout.headerRootClass")),
22191
22268
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -22235,218 +22312,154 @@ const footerNavGroupsLayout = stack({
22235
22312
  linkRequired: true,
22236
22313
  target: { $bind: { from: "entry.target" } },
22237
22314
  rel: { $bind: { from: "entry.rel" } }
22238
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
22315
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
22239
22316
  //#endregion
22240
22317
  //#region ../blocks/src/system/blocks/site-footer.ts
22241
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
22242
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
22243
- ...node,
22244
- $when: {
22245
- when: {
22246
- from,
22247
- transforms: [{ id: transformId }]
22248
- },
22249
- equals
22250
- }
22251
- });
22252
- const bottomBarTextLayout = () => {
22253
- const bottomTextNode = footerTextLayout()[1];
22254
- return bottomTextNode ? [bottomTextNode] : [];
22255
- };
22256
- const bodyTextLayout = () => {
22257
- const bodyTextNode = footerTextLayout()[0];
22258
- return bodyTextNode ? [bodyTextNode] : [];
22259
- };
22260
- const businessAddressLayout = () => [text({
22261
- as: "p",
22262
- className: "rb-caption rb-opacity-80"
22263
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
22264
- const inlineBottomTextLayout = () => {
22265
- const bottomTextNode = footerTextLayout()[1];
22266
- if (!bottomTextNode) return [];
22267
- return [when("$root.theme.footer.bottomBar.enabled", {
22268
- equals: true,
22269
- not: true
22270
- })(bottomTextNode)];
22271
- };
22272
- const simpleFooterLayout = stack({
22273
- gap: "md",
22274
- align: "start",
22275
- className: { $bind: {
22276
- from: "$root.theme.footer",
22277
- transforms: [{ id: "layout.footerSimpleRootClass" }],
22278
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
22279
- } }
22280
- }, [
22281
- link({
22282
- href: "/",
22283
- className: { $bind: {
22284
- from: "$root.theme.footer.logo",
22285
- transforms: [{
22286
- id: "layout.footerLogoClass",
22287
- options: { requireExplicitShow: true }
22288
- }],
22289
- fallback: "rb-hidden"
22290
- } }
22291
- }, [
22292
- media({ className: { $bind: {
22293
- from: "$root.theme.footer.logo",
22294
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22295
- fallback: "rb-w-auto"
22296
- } } }, when("content.logo"), bind("content.logo")),
22297
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22298
- from: "$root.theme.footer.logo",
22299
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22300
- fallback: "rb-w-auto"
22301
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22302
- text({
22303
- as: "strong",
22304
- className: "footer-logo-text rb-nav-text"
22305
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22306
- ]),
22307
- footerNav({
22308
- collectionPath: "footerMenu.items",
22309
- mode: "flatten",
22310
- className: { $bind: {
22311
- from: "$root.theme.footer.navLayout",
22312
- transforms: [{ id: "layout.footerSimpleNavClass" }],
22313
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
22314
- } },
22315
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22316
- }),
22317
- ...bodyTextLayout(),
22318
- ...businessAddressLayout(),
22319
- ...inlineBottomTextLayout()
22320
- ], when("$root.theme.footer.variant", { equals: "simple" }));
22321
- const columnsFooterLayout = stack({
22322
- gap: "xl",
22323
- align: "start",
22318
+ const brandLogo = link({
22319
+ href: "/",
22324
22320
  className: { $bind: {
22325
- from: "$root.theme.footer.maxWidth",
22321
+ from: "$root.theme.footer.logo",
22326
22322
  transforms: [{
22327
- id: "layout.maxWidthClass",
22328
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22323
+ id: "layout.footerLogoClass",
22324
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
22329
22325
  }],
22330
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22326
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
22331
22327
  } }
22332
- }, [
22333
- footerNavGroupsLayout,
22334
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
22335
- as: "strong",
22336
- className: "rb-block rb-nav-text",
22337
- style: textColorStyle("text")
22338
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
22339
- collectionPath: "footerMenu.items",
22340
- mode: "links-only",
22341
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
22342
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22343
- })]),
22344
- ...bodyTextLayout(),
22345
- ...businessAddressLayout(),
22346
- ...inlineBottomTextLayout()
22347
- ], when("$root.theme.footer.variant", { equals: "columns" }));
22348
- const splitFooterLayout = stack({
22349
- gap: "xl",
22350
- align: "start",
22328
+ }, [media({ className: { $bind: {
22329
+ from: "$root.theme.footer.logo",
22330
+ transforms: [{
22331
+ id: "layout.footerLogoMediaClass",
22332
+ options: { base: "rb-h-10 rb-w-auto" }
22333
+ }],
22334
+ fallback: "rb-h-10 rb-w-auto"
22335
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
22336
+ as: "strong",
22337
+ className: "footer-logo-text rb-nav-text"
22338
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
22339
+ const navigation = stack({
22340
+ gap: "md",
22341
+ className: "rb-w-full"
22342
+ }, [footerNavGroupsLayout, footerNav({
22343
+ collectionPath: "footerMenu.items",
22344
+ mode: "links-only",
22351
22345
  className: { $bind: {
22352
- from: "$root.theme.footer.maxWidth",
22353
- transforms: [{
22354
- id: "layout.maxWidthClass",
22355
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22356
- }],
22357
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22358
- } }
22346
+ from: "module.navigationClassName",
22347
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
22348
+ } },
22349
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
22350
+ })], when("module.kind", { equals: "navigation" }));
22351
+ const legalNavigation = footerNav({
22352
+ collectionPath: "legalFooterMenu.items",
22353
+ mode: "links-only",
22354
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
22355
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
22356
+ });
22357
+ const address = text({
22358
+ as: "address",
22359
+ className: "rb-not-italic rb-opacity-80"
22360
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
22361
+ const contact = stack({
22362
+ gap: "sm",
22363
+ className: "rb-items-start"
22364
+ }, [link({
22365
+ href: { $bind: { from: "contactLink.href" } },
22366
+ className: "rb-nav-text rb-break-words transition-theme-standard"
22367
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
22368
+ const hours = stack({
22369
+ gap: "sm",
22370
+ className: "rb-w-full"
22371
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
22372
+ as: "span",
22373
+ className: "rb-label"
22374
+ }, bind("hoursDay.weekday")), text({
22375
+ as: "span",
22376
+ className: "rb-caption rb-opacity-80"
22377
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
22378
+ as: "p",
22379
+ className: "rb-caption rb-opacity-70"
22380
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
22381
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
22382
+ href: { $bind: { from: "social.href" } },
22383
+ target: "_blank",
22384
+ rel: "noreferrer noopener",
22385
+ "aria-label": { $bind: { from: "social.label" } },
22386
+ className: "rb-nav-text transition-theme-standard"
22387
+ }, [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" }));
22388
+ const authoredCopy = richText({
22389
+ className: "rb-prose rb-prose-sm rb-max-w-none",
22390
+ style: textColorStyle("text/80")
22391
+ }, when("module.content"), bind("module.content", { transforms: [{
22392
+ id: "content.interpolateRichTextTokens",
22393
+ options: { tokens: ["year", "site_name"] }
22394
+ }] }));
22395
+ const footerGroup = stack({
22396
+ gap: "md",
22397
+ align: "stretch",
22398
+ className: "rb-min-w-0",
22399
+ "data-footer-group": { $bind: { from: "group.kind" } }
22400
+ }, [stack({
22401
+ gap: "md",
22402
+ align: "start",
22403
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
22359
22404
  }, [
22360
- inline({ className: { $bind: {
22361
- from: "$root.theme.footer.logo",
22362
- transforms: [{ id: "layout.footerSplitMainClass" }],
22363
- 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"
22364
- } } }, [stack({}, [footerNav({
22365
- collectionPath: "footerMenu.items",
22366
- mode: "flatten",
22367
- className: { $bind: {
22368
- from: "$root.theme.footer.navLayout",
22369
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
22370
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
22371
- } },
22372
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
22373
- })]), link({
22374
- href: "/",
22375
- className: { $bind: {
22376
- from: "$root.theme.footer.logo",
22377
- transforms: [{ id: "layout.footerLogoClass" }],
22378
- 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"
22379
- } }
22380
- }, [
22381
- media({ className: { $bind: {
22382
- from: "$root.theme.footer.logo",
22383
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22384
- fallback: "rb-w-auto"
22385
- } } }, when("content.logo"), bind("content.logo")),
22386
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22387
- from: "$root.theme.footer.logo",
22388
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22389
- fallback: "rb-w-auto"
22390
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22391
- text({
22392
- as: "strong",
22393
- className: "footer-logo-text rb-nav-text"
22394
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22395
- ])]),
22396
- ...businessAddressLayout(),
22397
- ...inlineBottomTextLayout()
22398
- ], when("$root.theme.footer.variant", { equals: "split" }));
22399
- const footerLayout = section({
22400
- background: "background",
22405
+ text({
22406
+ as: "h2",
22407
+ className: "rb-label",
22408
+ style: textColorStyle("text/70")
22409
+ }, bind("module.heading"), when("module.heading")),
22410
+ brandLogo,
22411
+ navigation,
22412
+ stack({
22413
+ gap: "sm",
22414
+ className: "rb-w-full"
22415
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
22416
+ address,
22417
+ contact,
22418
+ hours,
22419
+ socials,
22420
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
22421
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
22422
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
22423
+ const footerMainRegion = stack({
22424
+ className: { $bind: { from: "region.className" } },
22425
+ "data-footer-region": { $bind: { from: "region.kind" } }
22426
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
22427
+ const footerBottomRegion = stack({ className: { $bind: {
22428
+ from: "$root.theme.footer",
22429
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22430
+ fallback: "rb-w-full"
22431
+ } } }, [stack({
22401
22432
  className: { $bind: {
22402
22433
  from: "$root.theme.footer",
22403
- transforms: [{ id: "layout.footerRootClass" }],
22404
- fallback: "rb-w-full rb-border-t transition-theme"
22434
+ transforms: [{ id: "layout.footerBottomBarClass" }],
22435
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
22405
22436
  } },
22406
22437
  style: { $bind: {
22407
22438
  from: "$root.theme.footer",
22408
- transforms: [{ id: "layout.footerRootStyle" }],
22409
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22410
- } }
22411
- }, [
22412
- simpleFooterLayout,
22413
- columnsFooterLayout,
22414
- splitFooterLayout,
22415
- stack({
22416
- className: { $bind: {
22417
- from: "$root.theme.footer",
22418
- transforms: [{ id: "layout.footerBottomBarClass" }],
22419
- fallback: "rb-w-full rb-border-t rb-py-5"
22420
- } },
22421
- style: { $bind: {
22422
- from: "$root.theme.footer",
22423
- transforms: [{ id: "layout.footerBottomBarStyle" }]
22424
- } }
22425
- }, [stack({ className: { $bind: {
22426
- from: "$root.theme.footer",
22427
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22428
- fallback: "rb-container"
22429
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
22430
- ]);
22439
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
22440
+ } },
22441
+ "data-footer-region": "bottom"
22442
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
22431
22443
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
22432
22444
  id: "block.site-footer",
22433
22445
  title: "Site Footer",
22434
22446
  category: "layout",
22435
- fragments: [{
22436
- fragment: footerBottomTextFragment,
22437
- fieldPriority: 0
22438
- }],
22439
22447
  skipSectionStyles: true,
22440
- additionalFields: [{
22441
- id: "showBusinessAddress",
22442
- type: "boolean",
22443
- label: "Add business address to site footer?",
22444
- required: false,
22445
- defaultValue: false,
22446
- ui: { intent: "content" }
22447
- }],
22448
- layout: footerLayout,
22449
- description: "Site-wide footer with navigation links and optional columns.",
22448
+ layout: section({
22449
+ background: "background",
22450
+ className: { $bind: {
22451
+ from: "$root.theme.footer",
22452
+ transforms: [{ id: "layout.footerRootClass" }],
22453
+ fallback: "rb-w-full rb-border-t transition-theme"
22454
+ } },
22455
+ style: { $bind: {
22456
+ from: "$root.theme.footer",
22457
+ transforms: [{ id: "layout.footerRootStyle" }],
22458
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22459
+ } },
22460
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
22461
+ }, [footerMainRegion, footerBottomRegion]),
22462
+ description: "Site-wide composed footer with canonical shared details.",
22450
22463
  styleTokens: { spacing: "md" },
22451
22464
  paletteHidden: true
22452
22465
  }) };
@@ -22924,7 +22937,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
22924
22937
  id: "boxStyles.all",
22925
22938
  options: {
22926
22939
  axis: "all",
22927
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
22940
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
22928
22941
  }
22929
22942
  }]
22930
22943
  },
@@ -34486,16 +34499,17 @@ const backgroundTransforms = [
34486
34499
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
34487
34500
  },
34488
34501
  {
34489
- id: "background.resolveAllowOverflow",
34502
+ id: "background.resolveFrameClassName",
34490
34503
  kind: "formatter",
34491
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
34492
- run: (value) => {
34493
- if (!value || typeof value !== "object") return false;
34504
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
34505
+ run: (value, options) => {
34506
+ const baseClass = options?.baseClass?.trim() ?? "";
34507
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
34494
34508
  const input = value;
34495
- if (input.overflow === true) return true;
34509
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
34496
34510
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
34497
34511
  const scale = isString(input.scale) ? input.scale.trim() : isNumber(input.scale) ? String(input.scale) : null;
34498
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
34512
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
34499
34513
  }
34500
34514
  },
34501
34515
  {
@@ -36110,8 +36124,14 @@ const navigationMenuConfigSchema = z$1.object({
36110
36124
  name: z$1.string().min(1, "Name is required"),
36111
36125
  isPrimary: z$1.boolean().optional(),
36112
36126
  isFooter: z$1.boolean().optional(),
36127
+ footerRole: z$1.enum(["main", "legal-policy"]).nullable().optional(),
36113
36128
  items: z$1.array(navigationItemConfigSchema)
36114
36129
  }).superRefine((menu, ctx) => {
36130
+ if (menu.footerRole !== void 0 && menu.isFooter !== void 0 && menu.isFooter !== (menu.footerRole === "main")) ctx.addIssue({
36131
+ code: "custom",
36132
+ message: "footerRole and isFooter disagree",
36133
+ path: ["footerRole"]
36134
+ });
36115
36135
  const portalStats = collectPortalLinkStats(menu.items);
36116
36136
  if (portalStats.count > 1) ctx.addIssue({
36117
36137
  code: z$1.ZodIssueCode.custom,