@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
@@ -4554,104 +4554,153 @@ const showtimePill = defineButtonPersonality({
4554
4554
  }
4555
4555
  });
4556
4556
  //#endregion
4557
- //#region ../theme-core/src/buttons/personalities/index.ts
4558
- const buttonPersonalities = [
4559
- defineButtonPersonality({
4560
- id: "soft-pill",
4561
- name: "Soft Pill",
4562
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
4563
- tags: {
4564
- tone: "classic",
4565
- energy: "calm",
4566
- motion: "subtle",
4567
- era: "organic"
4557
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
4558
+ /**
4559
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
4560
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
4561
+ */
4562
+ const softPill = defineButtonPersonality({
4563
+ id: "soft-pill",
4564
+ name: "Soft Pill",
4565
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
4566
+ tags: {
4567
+ tone: "classic",
4568
+ energy: "calm",
4569
+ motion: "subtle",
4570
+ era: "organic"
4571
+ },
4572
+ buttonSystem: {
4573
+ global: {
4574
+ cornerStyle: "pill",
4575
+ shadow: "low",
4576
+ textTransform: "none",
4577
+ fontWeight: 500,
4578
+ borderWidth: 2,
4579
+ hoverTransform: "lift",
4580
+ hoverColor: "none"
4568
4581
  },
4569
- buttonSystem: {
4570
- global: {
4571
- cornerStyle: "pill",
4572
- shadow: "low",
4573
- textTransform: "none",
4574
- fontWeight: 500,
4575
- borderWidth: 2,
4576
- hoverTransform: "lift",
4577
- hoverColor: "none"
4578
- },
4579
- variants: [
4580
- {
4581
- id: "primary",
4582
- name: "Primary",
4583
- enabled: true,
4584
- priority: 1,
4585
- background: {
4586
- type: "solid",
4587
- colorToken: "primary"
4588
- },
4589
- textColorToken: "primaryForeground",
4590
- borderRadius: "rounded-full",
4591
- shadow: {
4592
- elevation: "low",
4593
- softness: "soft",
4594
- position: "bottom"
4595
- },
4596
- effects: {
4597
- hover: [{
4598
- effectId: "lift",
4599
- options: { translateY: "-1px" }
4600
- }],
4601
- active: [{
4602
- effectId: "scale-down",
4603
- options: { scale: "0.98" }
4604
- }]
4605
- }
4606
- },
4607
- {
4608
- id: "secondary",
4609
- name: "Secondary",
4610
- enabled: true,
4611
- priority: 2,
4612
- background: { type: "transparent" },
4613
- textColorToken: "primary",
4614
- borderRadius: "rounded-full",
4615
- border: {
4616
- widthClass: "border-2",
4617
- colorToken: "primary"
4618
- },
4619
- effects: { hover: [{
4620
- effectId: "background-on-hover",
4621
- options: { colorToken: "surface" }
4622
- }] }
4582
+ variants: [
4583
+ {
4584
+ id: "primary",
4585
+ name: "Primary",
4586
+ enabled: true,
4587
+ priority: 1,
4588
+ background: {
4589
+ type: "solid",
4590
+ colorToken: "primary"
4623
4591
  },
4624
- {
4625
- id: "outline",
4626
- name: "Outline",
4627
- enabled: true,
4628
- priority: 3,
4629
- background: { type: "transparent" },
4630
- textColorToken: "text",
4631
- borderRadius: "rounded-full",
4632
- border: {
4633
- widthClass: "border",
4634
- colorToken: "border"
4635
- },
4636
- effects: { hover: [{
4637
- effectId: "background-on-hover",
4638
- options: { colorToken: "surface" }
4639
- }] }
4592
+ textColorToken: "primaryForeground",
4593
+ borderRadius: "rounded-full",
4594
+ shadow: {
4595
+ elevation: "low",
4596
+ softness: "soft",
4597
+ position: "bottom"
4640
4598
  },
4641
- {
4642
- id: "ghost",
4643
- name: "Ghost",
4644
- enabled: true,
4645
- priority: 3,
4646
- background: { type: "transparent" },
4647
- textColorToken: "text",
4648
- borderRadius: "rounded-full",
4649
- effects: { hover: [{
4650
- effectId: "background-on-hover",
4651
- options: { colorToken: "surface" }
4652
- }] }
4599
+ effects: {
4600
+ hover: [{
4601
+ effectId: "lift",
4602
+ options: { translateY: "-1px" }
4603
+ }],
4604
+ active: [{
4605
+ effectId: "scale-down",
4606
+ options: { scale: "0.98" }
4607
+ }]
4653
4608
  }
4654
- ]
4609
+ },
4610
+ {
4611
+ id: "secondary",
4612
+ name: "Secondary",
4613
+ enabled: true,
4614
+ priority: 2,
4615
+ background: { type: "transparent" },
4616
+ textColorToken: "primary",
4617
+ borderRadius: "rounded-full",
4618
+ border: {
4619
+ widthClass: "border-2",
4620
+ colorToken: "primary"
4621
+ },
4622
+ effects: { hover: [{
4623
+ effectId: "background-on-hover",
4624
+ options: { colorToken: "surface" }
4625
+ }] }
4626
+ },
4627
+ {
4628
+ id: "outline",
4629
+ name: "Outline",
4630
+ enabled: true,
4631
+ priority: 3,
4632
+ background: { type: "transparent" },
4633
+ textColorToken: "text",
4634
+ borderRadius: "rounded-full",
4635
+ border: {
4636
+ widthClass: "border",
4637
+ colorToken: "border"
4638
+ },
4639
+ effects: { hover: [{
4640
+ effectId: "background-on-hover",
4641
+ options: { colorToken: "surface" }
4642
+ }] }
4643
+ },
4644
+ {
4645
+ id: "ghost",
4646
+ name: "Ghost",
4647
+ enabled: true,
4648
+ priority: 3,
4649
+ background: { type: "transparent" },
4650
+ textColorToken: "text",
4651
+ borderRadius: "rounded-full",
4652
+ effects: { hover: [{
4653
+ effectId: "background-on-hover",
4654
+ options: { colorToken: "surface" }
4655
+ }] }
4656
+ }
4657
+ ]
4658
+ }
4659
+ });
4660
+ //#endregion
4661
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
4662
+ const solidSecondary = {
4663
+ id: "secondary",
4664
+ name: "Secondary",
4665
+ enabled: true,
4666
+ priority: 2,
4667
+ background: {
4668
+ type: "solid",
4669
+ colorToken: "secondary"
4670
+ },
4671
+ textColorToken: "onSecondary",
4672
+ borderRadius: "rounded-full",
4673
+ shadow: {
4674
+ elevation: "none",
4675
+ softness: null,
4676
+ position: "bottom"
4677
+ },
4678
+ effects: {
4679
+ hover: [{
4680
+ effectId: "background-on-hover-alpha",
4681
+ options: {
4682
+ colorToken: "secondary",
4683
+ opacity: 88
4684
+ }
4685
+ }],
4686
+ active: [{
4687
+ effectId: "scale-down",
4688
+ options: { scale: "0.98" }
4689
+ }]
4690
+ }
4691
+ };
4692
+ //#endregion
4693
+ //#region ../theme-core/src/buttons/personalities/index.ts
4694
+ const buttonPersonalities = [
4695
+ softPill,
4696
+ defineButtonPersonality({
4697
+ id: "two-tone-pill",
4698
+ name: "Two-tone Pill",
4699
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
4700
+ tags: softPill.tags,
4701
+ buttonSystem: {
4702
+ ...softPill.buttonSystem,
4703
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
4655
4704
  }
4656
4705
  }),
4657
4706
  earthPill,
@@ -6110,6 +6159,7 @@ const navFontWeight = z$1.enum([
6110
6159
  "bold"
6111
6160
  ]);
6112
6161
  const headerMaxWidth = z$1.enum(["container", "full"]);
6162
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
6113
6163
  const headerContainerSchema = z$1.object({
6114
6164
  rounded: z$1.enum([
6115
6165
  "none",
@@ -6254,6 +6304,7 @@ const headerSchema = z$1.object({
6254
6304
  positioning: headerPositioning,
6255
6305
  shrinkOnScroll: z$1.boolean(),
6256
6306
  maxWidth: headerMaxWidth,
6307
+ barFrame: headerBarFrame.optional(),
6257
6308
  logoOverride: mediaSchema$1.nullable().optional(),
6258
6309
  background: headerBackgroundSchema.default({
6259
6310
  type: "color",
@@ -6263,6 +6314,7 @@ const headerSchema = z$1.object({
6263
6314
  navStyle: headerNavStyle,
6264
6315
  navColor: themeColorTokenSchema.nullable().optional(),
6265
6316
  navWeight: navFontWeight.default("medium"),
6317
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
6266
6318
  navTypography: z$1.enum(["body", "heading"]).optional(),
6267
6319
  navTextSize: navLinkStyleSchema.shape.textSize,
6268
6320
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -6278,7 +6330,21 @@ const headerSchema = z$1.object({
6278
6330
  ctaTreatment: headerCtaTreatmentSchema.optional(),
6279
6331
  ctaVariant: z$1.string().min(1).optional(),
6280
6332
  dropdownStyle: dropdownStyleSchema
6281
- });
6333
+ }).transform(normaliseHeaderNavFontRole);
6334
+ /**
6335
+ * Normalises the legacy `navTypography` font-role alias into the canonical
6336
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
6337
+ * a data migration. `navFontRole` always wins when both are present; the legacy
6338
+ * field is dropped so we never carry a dual write forward.
6339
+ */
6340
+ function normaliseHeaderNavFontRole(header) {
6341
+ if (header.navTypography === void 0) return header;
6342
+ const { navTypography, ...rest } = header;
6343
+ return header.navFontRole === void 0 ? {
6344
+ ...rest,
6345
+ navFontRole: navTypography
6346
+ } : rest;
6347
+ }
6282
6348
  const footerVariant = z$1.enum([
6283
6349
  "simple",
6284
6350
  "columns",
@@ -8084,7 +8150,7 @@ const overlayLogoAccommodations = [
8084
8150
  * optional nested styling fields that would otherwise leak from another Look.
8085
8151
  */
8086
8152
  function baseHeader(theme) {
8087
- 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;
8153
+ 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;
8088
8154
  return {
8089
8155
  ...header,
8090
8156
  navContainer: {
@@ -8233,6 +8299,17 @@ const headerStyleCatalog = defineExactCatalog()([
8233
8299
  navTypography: "brand-caps",
8234
8300
  moods: ["expressive"]
8235
8301
  },
8302
+ {
8303
+ id: asHeaderStyleId("brand-capsule"),
8304
+ label: "Brand Capsule",
8305
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
8306
+ supportedLayoutIds: supportedLayouts(["classic"]),
8307
+ navInteraction: "pill-background",
8308
+ surface: "brand-solid",
8309
+ defaultDepth: "shadow",
8310
+ navTypography: "quiet-caps",
8311
+ moods: ["expressive", "professional"]
8312
+ },
8236
8313
  {
8237
8314
  id: asHeaderStyleId("serif-line"),
8238
8315
  label: "Serif Line",
@@ -8326,6 +8403,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8326
8403
  "brand-bar",
8327
8404
  "brand-underline",
8328
8405
  "brand-pill",
8406
+ "brand-capsule",
8329
8407
  "serif-line",
8330
8408
  "flat-tabs"
8331
8409
  ])],
@@ -8363,6 +8441,11 @@ headerStyleRepairChain([
8363
8441
  "brand-pill",
8364
8442
  "brand-bar",
8365
8443
  "minimal"
8444
+ ]), headerStyleRepairChain([
8445
+ "brand-capsule",
8446
+ "brand-pill",
8447
+ "brand-bar",
8448
+ "minimal"
8366
8449
  ]), headerStyleRepairChain([
8367
8450
  "pill-nav",
8368
8451
  "soft-bar",
@@ -10600,6 +10683,7 @@ const curatedSiteStyles = [
10600
10683
  ],
10601
10684
  buttonPersonalityChoices: [
10602
10685
  buttonChoice("soft-pill"),
10686
+ buttonChoice("two-tone-pill"),
10603
10687
  buttonChoice("pebble"),
10604
10688
  buttonChoice("editorial-link"),
10605
10689
  buttonChoice("brushed-wash")
@@ -11779,6 +11863,7 @@ const curatedSiteStyles = [
11779
11863
  ],
11780
11864
  buttonPersonalityChoices: [
11781
11865
  buttonChoice("quiet-arrow"),
11866
+ buttonChoice("two-tone-pill"),
11782
11867
  buttonChoice("flat-ink"),
11783
11868
  buttonChoice("editorial-link")
11784
11869
  ],
@@ -12637,7 +12722,7 @@ const ALLOWED_TRANSFORM_IDS = [
12637
12722
  "media.fromUrl",
12638
12723
  "background.resolveStyle",
12639
12724
  "background.resolveColorsStyle",
12640
- "background.resolveAllowOverflow",
12725
+ "background.resolveFrameClassName",
12641
12726
  "background.resolveImageStyle",
12642
12727
  "background.resolveImageClassName",
12643
12728
  "background.resolveOverlayStyle",
@@ -14265,6 +14350,7 @@ function devValidate(node) {
14265
14350
  }
14266
14351
  //#endregion
14267
14352
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
14353
+ 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";
14268
14354
  /**
14269
14355
  * Creates background layer nodes for rendering backgrounds from field data.
14270
14356
  *
@@ -14330,6 +14416,34 @@ function backgroundLayer(path, options = {}) {
14330
14416
  ];
14331
14417
  }
14332
14418
  /**
14419
+ * Wrap decorative background layers in their own clipping frame.
14420
+ *
14421
+ * Foreground content remains outside this frame, so editor outlines, focus
14422
+ * rings, and floating controls are never clipped by a visual background.
14423
+ * Backgrounds that explicitly opt into overflow keep that behavior within
14424
+ * the decorative layer rather than changing the content root.
14425
+ */
14426
+ function backgroundFrame(path, options = {}) {
14427
+ const { leadingNodes = [], ...layerOptions } = options;
14428
+ const framedLayerOptions = {
14429
+ ...layerOptions,
14430
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
14431
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
14432
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
14433
+ };
14434
+ return el("div", {
14435
+ className: { $bind: {
14436
+ from: path,
14437
+ transforms: [{
14438
+ id: "background.resolveFrameClassName",
14439
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
14440
+ }],
14441
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
14442
+ } },
14443
+ style: { borderRadius: "inherit" }
14444
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
14445
+ }
14446
+ /**
14333
14447
  * Creates a media node for rendering background image/video media with conditional rendering.
14334
14448
  *
14335
14449
  * This helper creates a media element that:
@@ -14491,8 +14605,8 @@ function sectionContainer(children, opts) {
14491
14605
  * - content
14492
14606
  */
14493
14607
  function styledContainer(config) {
14494
- 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;
14495
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
14608
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
14609
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
14496
14610
  const childrenArray = Array.isArray(children) ? children : [children];
14497
14611
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
14498
14612
  return el(rootType, {
@@ -14515,7 +14629,7 @@ function styledContainer(config) {
14515
14629
  }],
14516
14630
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
14517
14631
  } }
14518
- }, [...backgroundNodes, ...childrenArray]);
14632
+ }, [backgroundNode, ...childrenArray]);
14519
14633
  }
14520
14634
  //#endregion
14521
14635
  //#region ../blocks/src/system/spacing.ts
@@ -14532,7 +14646,7 @@ const DEFAULT_SECTION_SPACING = "medium";
14532
14646
  * - Creating a section wrapper with background theme
14533
14647
  * - Adding background color/gradient/image layers
14534
14648
  * - Binding className to section styles with transform
14535
- * - Binding allowOverflow for background positioning
14649
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
14536
14650
  * - Wrapping content children
14537
14651
  *
14538
14652
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -14568,8 +14682,8 @@ const DEFAULT_SECTION_SPACING = "medium";
14568
14682
  * });
14569
14683
  */
14570
14684
  function styledSection(config) {
14571
- 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;
14572
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
14685
+ 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;
14686
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
14573
14687
  imageClassName,
14574
14688
  fallbackToken: background,
14575
14689
  omitImageLayer: !renderBackgroundImage,
@@ -14592,13 +14706,8 @@ function styledSection(config) {
14592
14706
  fullWidthPath
14593
14707
  }
14594
14708
  }]
14595
- } },
14596
- allowOverflow: allowOverflow ? true : { $bind: {
14597
- from: `${bindFrom}.background`,
14598
- transforms: [{ id: "background.resolveAllowOverflow" }],
14599
- fallback: false
14600
14709
  } }
14601
- }, [...renderedBackgroundNodes, ...childrenArray]);
14710
+ }, [renderedBackgroundNode, ...childrenArray]);
14602
14711
  }
14603
14712
  //#endregion
14604
14713
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -15009,9 +15118,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
15009
15118
  //#endregion
15010
15119
  //#region ../blocks/src/system/node/fragments/styledCard.ts
15011
15120
  function styledCard(children, opts, ...mods) {
15012
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
15013
- 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" });
15014
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
15121
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
15122
+ const defaultBackgroundLayer = el("div", {
15123
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
15124
+ style: { borderRadius: "inherit" }
15125
+ });
15126
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
15015
15127
  const style = {
15016
15128
  ...opts.style ?? {},
15017
15129
  borderColor: { $bind: {
@@ -15038,7 +15150,7 @@ function styledCard(children, opts, ...mods) {
15038
15150
  ...style ? { style } : {}
15039
15151
  }, [
15040
15152
  defaultBackgroundLayer,
15041
- ...backgroundNodes,
15153
+ backgroundNode,
15042
15154
  ...children
15043
15155
  ], ...mods);
15044
15156
  }
@@ -16041,7 +16153,7 @@ function buildTestimonialCard(...mods) {
16041
16153
  }, 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())])], {
16042
16154
  stylesFrom: "content._cardStyles",
16043
16155
  backgroundFrom: "content._cardStyles.background",
16044
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
16156
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
16045
16157
  }, ...mods);
16046
16158
  }
16047
16159
  /**
@@ -16513,39 +16625,6 @@ const formEmbedFragment = defineFragment({
16513
16625
  }
16514
16626
  });
16515
16627
  //#endregion
16516
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
16517
- const footerBottomTextFragment = defineFragment({
16518
- id: "footerBottomText",
16519
- title: "Footer Text",
16520
- description: "Rich text content for the main footer body and optional bottom bar.",
16521
- fields: [{
16522
- id: "bodyText",
16523
- type: "richText",
16524
- label: "Body text",
16525
- description: "Appears in the main footer area.",
16526
- ui: { variant: "limited" }
16527
- }, {
16528
- id: "bottomText",
16529
- type: "richText",
16530
- label: "Bottom bar text",
16531
- description: "Appears in the optional footer bottom bar.",
16532
- ui: { variant: "limited" }
16533
- }],
16534
- layout: [richText({
16535
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
16536
- style: textColorStyle("text/80")
16537
- }, when("bodyText"), bind("bodyText", { transforms: [{
16538
- id: "content.interpolateRichTextTokens",
16539
- options: { tokens: ["year", "site_name"] }
16540
- }] })), richText({
16541
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
16542
- style: textColorStyle("text/80")
16543
- }, when("bottomText"), bind("bottomText", { transforms: [{
16544
- id: "content.interpolateRichTextTokens",
16545
- options: { tokens: ["year", "site_name"] }
16546
- }] }))]
16547
- });
16548
- //#endregion
16549
16628
  //#region ../blocks/src/system/fragments/library/singleButton.ts
16550
16629
  const singleButtonFragment = defineFragment({
16551
16630
  id: "singleButton",
@@ -16718,7 +16797,7 @@ function createFaqAccordionLayout(options = {}) {
16718
16797
  options: {
16719
16798
  axis: "all",
16720
16799
  includeSpacing: false,
16721
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
16800
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
16722
16801
  }
16723
16802
  }]
16724
16803
  },
@@ -17842,7 +17921,6 @@ function splitLayoutWith(children) {
17842
17921
  }
17843
17922
  }),
17844
17923
  renderBackgroundImage: false,
17845
- allowOverflow: true,
17846
17924
  baseClass: ""
17847
17925
  });
17848
17926
  }
@@ -18470,7 +18548,7 @@ function postCard(children, ...mods) {
18470
18548
  return styledCard(children, {
18471
18549
  stylesFrom: "content._cardStyles",
18472
18550
  backgroundFrom: "content._cardStyles.background",
18473
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
18551
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
18474
18552
  }, ...mods);
18475
18553
  }
18476
18554
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -18506,7 +18584,7 @@ const stackPostCard = styledCard([inline({
18506
18584
  ])])], {
18507
18585
  stylesFrom: "content._cardStyles",
18508
18586
  backgroundFrom: "content._cardStyles.background",
18509
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
18587
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
18510
18588
  }, repeat("data.posts", "post"));
18511
18589
  const emptyState$2 = {
18512
18590
  ...styledCard([text({
@@ -18515,7 +18593,7 @@ const emptyState$2 = {
18515
18593
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
18516
18594
  stylesFrom: "content._cardStyles",
18517
18595
  backgroundFrom: "content._cardStyles.background",
18518
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
18596
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
18519
18597
  }),
18520
18598
  $when: {
18521
18599
  when: { from: "data.posts[0]" },
@@ -18525,7 +18603,7 @@ const emptyState$2 = {
18525
18603
  function blogListingShell(children) {
18526
18604
  return styledSection({
18527
18605
  children: styledContainer({
18528
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
18606
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
18529
18607
  children
18530
18608
  }),
18531
18609
  baseClass: ""
@@ -18937,7 +19015,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
18937
19015
  const formSurface = styledContainer({
18938
19016
  bindFrom: "_containerStyles",
18939
19017
  constrainWidth: false,
18940
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
19018
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
18941
19019
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
18942
19020
  });
18943
19021
  function createFormLayout(variant) {
@@ -19371,7 +19449,7 @@ function desktopOnlyDisplay(display) {
19371
19449
  }
19372
19450
  //#endregion
19373
19451
  //#region ../blocks/src/system/blocks/site-header.ts
19374
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
19452
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
19375
19453
  ...node,
19376
19454
  $when: {
19377
19455
  when: {
@@ -19399,7 +19477,7 @@ const logoRow = link({
19399
19477
  text({
19400
19478
  as: "strong",
19401
19479
  className: "header-logo-text rb-truncate"
19402
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19480
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19403
19481
  ]);
19404
19482
  const centeredLogoRow = link({
19405
19483
  href: "/",
@@ -19419,7 +19497,7 @@ const centeredLogoRow = link({
19419
19497
  text({
19420
19498
  as: "strong",
19421
19499
  className: "header-logo-text"
19422
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19500
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19423
19501
  ]);
19424
19502
  const createNavRow = (className, align = "end") => navRow({
19425
19503
  className: `${className} header-nav-row`,
@@ -19551,7 +19629,7 @@ const classicLayout = inline({
19551
19629
  logoRow,
19552
19630
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
19553
19631
  headerCta
19554
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
19632
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
19555
19633
  const classicCenteredNavLayout = inline({
19556
19634
  className: bindProp("$root.theme.header.maxWidth", {
19557
19635
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -19562,7 +19640,7 @@ const classicCenteredNavLayout = inline({
19562
19640
  logoRow,
19563
19641
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
19564
19642
  headerCta
19565
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
19643
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
19566
19644
  const centeredLayout = stack({
19567
19645
  gap: "md",
19568
19646
  align: "center",
@@ -19625,7 +19703,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
19625
19703
  transforms: pipe(tx("layout.headerSectionBackground")),
19626
19704
  fallback: "background"
19627
19705
  }),
19628
- allowOverflow: true,
19629
19706
  className: bindProp("$root.theme.header", {
19630
19707
  transforms: pipe(tx("layout.headerRootClass")),
19631
19708
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -19675,218 +19752,154 @@ const footerNavGroupsLayout = stack({
19675
19752
  linkRequired: true,
19676
19753
  target: { $bind: { from: "entry.target" } },
19677
19754
  rel: { $bind: { from: "entry.rel" } }
19678
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
19755
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
19679
19756
  //#endregion
19680
19757
  //#region ../blocks/src/system/blocks/site-footer.ts
19681
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
19682
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
19683
- ...node,
19684
- $when: {
19685
- when: {
19686
- from,
19687
- transforms: [{ id: transformId }]
19688
- },
19689
- equals
19690
- }
19691
- });
19692
- const bottomBarTextLayout = () => {
19693
- const bottomTextNode = footerTextLayout()[1];
19694
- return bottomTextNode ? [bottomTextNode] : [];
19695
- };
19696
- const bodyTextLayout = () => {
19697
- const bodyTextNode = footerTextLayout()[0];
19698
- return bodyTextNode ? [bodyTextNode] : [];
19699
- };
19700
- const businessAddressLayout = () => [text({
19701
- as: "p",
19702
- className: "rb-caption rb-opacity-80"
19703
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
19704
- const inlineBottomTextLayout = () => {
19705
- const bottomTextNode = footerTextLayout()[1];
19706
- if (!bottomTextNode) return [];
19707
- return [when("$root.theme.footer.bottomBar.enabled", {
19708
- equals: true,
19709
- not: true
19710
- })(bottomTextNode)];
19711
- };
19712
- const simpleFooterLayout = stack({
19713
- gap: "md",
19714
- align: "start",
19715
- className: { $bind: {
19716
- from: "$root.theme.footer",
19717
- transforms: [{ id: "layout.footerSimpleRootClass" }],
19718
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
19719
- } }
19720
- }, [
19721
- link({
19722
- href: "/",
19723
- className: { $bind: {
19724
- from: "$root.theme.footer.logo",
19725
- transforms: [{
19726
- id: "layout.footerLogoClass",
19727
- options: { requireExplicitShow: true }
19728
- }],
19729
- fallback: "rb-hidden"
19730
- } }
19731
- }, [
19732
- media({ className: { $bind: {
19733
- from: "$root.theme.footer.logo",
19734
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19735
- fallback: "rb-w-auto"
19736
- } } }, when("content.logo"), bind("content.logo")),
19737
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
19738
- from: "$root.theme.footer.logo",
19739
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19740
- fallback: "rb-w-auto"
19741
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
19742
- text({
19743
- as: "strong",
19744
- className: "footer-logo-text rb-nav-text"
19745
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19746
- ]),
19747
- footerNav({
19748
- collectionPath: "footerMenu.items",
19749
- mode: "flatten",
19750
- className: { $bind: {
19751
- from: "$root.theme.footer.navLayout",
19752
- transforms: [{ id: "layout.footerSimpleNavClass" }],
19753
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
19754
- } },
19755
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
19756
- }),
19757
- ...bodyTextLayout(),
19758
- ...businessAddressLayout(),
19759
- ...inlineBottomTextLayout()
19760
- ], when("$root.theme.footer.variant", { equals: "simple" }));
19761
- const columnsFooterLayout = stack({
19762
- gap: "xl",
19763
- align: "start",
19758
+ const brandLogo = link({
19759
+ href: "/",
19764
19760
  className: { $bind: {
19765
- from: "$root.theme.footer.maxWidth",
19761
+ from: "$root.theme.footer.logo",
19766
19762
  transforms: [{
19767
- id: "layout.maxWidthClass",
19768
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
19763
+ id: "layout.footerLogoClass",
19764
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
19769
19765
  }],
19770
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
19766
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
19771
19767
  } }
19772
- }, [
19773
- footerNavGroupsLayout,
19774
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
19775
- as: "strong",
19776
- className: "rb-block rb-nav-text",
19777
- style: textColorStyle("text")
19778
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
19779
- collectionPath: "footerMenu.items",
19780
- mode: "links-only",
19781
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
19782
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
19783
- })]),
19784
- ...bodyTextLayout(),
19785
- ...businessAddressLayout(),
19786
- ...inlineBottomTextLayout()
19787
- ], when("$root.theme.footer.variant", { equals: "columns" }));
19788
- const splitFooterLayout = stack({
19789
- gap: "xl",
19790
- align: "start",
19768
+ }, [media({ className: { $bind: {
19769
+ from: "$root.theme.footer.logo",
19770
+ transforms: [{
19771
+ id: "layout.footerLogoMediaClass",
19772
+ options: { base: "rb-h-10 rb-w-auto" }
19773
+ }],
19774
+ fallback: "rb-h-10 rb-w-auto"
19775
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
19776
+ as: "strong",
19777
+ className: "footer-logo-text rb-nav-text"
19778
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
19779
+ const navigation = stack({
19780
+ gap: "md",
19781
+ className: "rb-w-full"
19782
+ }, [footerNavGroupsLayout, footerNav({
19783
+ collectionPath: "footerMenu.items",
19784
+ mode: "links-only",
19791
19785
  className: { $bind: {
19792
- from: "$root.theme.footer.maxWidth",
19793
- transforms: [{
19794
- id: "layout.maxWidthClass",
19795
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
19796
- }],
19797
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
19798
- } }
19786
+ from: "module.navigationClassName",
19787
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
19788
+ } },
19789
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
19790
+ })], when("module.kind", { equals: "navigation" }));
19791
+ const legalNavigation = footerNav({
19792
+ collectionPath: "legalFooterMenu.items",
19793
+ mode: "links-only",
19794
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
19795
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
19796
+ });
19797
+ const address = text({
19798
+ as: "address",
19799
+ className: "rb-not-italic rb-opacity-80"
19800
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
19801
+ const contact = stack({
19802
+ gap: "sm",
19803
+ className: "rb-items-start"
19804
+ }, [link({
19805
+ href: { $bind: { from: "contactLink.href" } },
19806
+ className: "rb-nav-text rb-break-words transition-theme-standard"
19807
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
19808
+ const hours = stack({
19809
+ gap: "sm",
19810
+ className: "rb-w-full"
19811
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
19812
+ as: "span",
19813
+ className: "rb-label"
19814
+ }, bind("hoursDay.weekday")), text({
19815
+ as: "span",
19816
+ className: "rb-caption rb-opacity-80"
19817
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
19818
+ as: "p",
19819
+ className: "rb-caption rb-opacity-70"
19820
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
19821
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
19822
+ href: { $bind: { from: "social.href" } },
19823
+ target: "_blank",
19824
+ rel: "noreferrer noopener",
19825
+ "aria-label": { $bind: { from: "social.label" } },
19826
+ className: "rb-nav-text transition-theme-standard"
19827
+ }, [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" }));
19828
+ const authoredCopy = richText({
19829
+ className: "rb-prose rb-prose-sm rb-max-w-none",
19830
+ style: textColorStyle("text/80")
19831
+ }, when("module.content"), bind("module.content", { transforms: [{
19832
+ id: "content.interpolateRichTextTokens",
19833
+ options: { tokens: ["year", "site_name"] }
19834
+ }] }));
19835
+ const footerGroup = stack({
19836
+ gap: "md",
19837
+ align: "stretch",
19838
+ className: "rb-min-w-0",
19839
+ "data-footer-group": { $bind: { from: "group.kind" } }
19840
+ }, [stack({
19841
+ gap: "md",
19842
+ align: "start",
19843
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
19799
19844
  }, [
19800
- inline({ className: { $bind: {
19801
- from: "$root.theme.footer.logo",
19802
- transforms: [{ id: "layout.footerSplitMainClass" }],
19803
- 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"
19804
- } } }, [stack({}, [footerNav({
19805
- collectionPath: "footerMenu.items",
19806
- mode: "flatten",
19807
- className: { $bind: {
19808
- from: "$root.theme.footer.navLayout",
19809
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
19810
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
19811
- } },
19812
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
19813
- })]), link({
19814
- href: "/",
19815
- className: { $bind: {
19816
- from: "$root.theme.footer.logo",
19817
- transforms: [{ id: "layout.footerLogoClass" }],
19818
- 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"
19819
- } }
19820
- }, [
19821
- media({ className: { $bind: {
19822
- from: "$root.theme.footer.logo",
19823
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19824
- fallback: "rb-w-auto"
19825
- } } }, when("content.logo"), bind("content.logo")),
19826
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
19827
- from: "$root.theme.footer.logo",
19828
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19829
- fallback: "rb-w-auto"
19830
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
19831
- text({
19832
- as: "strong",
19833
- className: "footer-logo-text rb-nav-text"
19834
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19835
- ])]),
19836
- ...businessAddressLayout(),
19837
- ...inlineBottomTextLayout()
19838
- ], when("$root.theme.footer.variant", { equals: "split" }));
19839
- const footerLayout = section({
19840
- background: "background",
19845
+ text({
19846
+ as: "h2",
19847
+ className: "rb-label",
19848
+ style: textColorStyle("text/70")
19849
+ }, bind("module.heading"), when("module.heading")),
19850
+ brandLogo,
19851
+ navigation,
19852
+ stack({
19853
+ gap: "sm",
19854
+ className: "rb-w-full"
19855
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
19856
+ address,
19857
+ contact,
19858
+ hours,
19859
+ socials,
19860
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
19861
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
19862
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
19863
+ const footerMainRegion = stack({
19864
+ className: { $bind: { from: "region.className" } },
19865
+ "data-footer-region": { $bind: { from: "region.kind" } }
19866
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
19867
+ const footerBottomRegion = stack({ className: { $bind: {
19868
+ from: "$root.theme.footer",
19869
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
19870
+ fallback: "rb-w-full"
19871
+ } } }, [stack({
19841
19872
  className: { $bind: {
19842
19873
  from: "$root.theme.footer",
19843
- transforms: [{ id: "layout.footerRootClass" }],
19844
- fallback: "rb-w-full rb-border-t transition-theme"
19874
+ transforms: [{ id: "layout.footerBottomBarClass" }],
19875
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
19845
19876
  } },
19846
19877
  style: { $bind: {
19847
19878
  from: "$root.theme.footer",
19848
- transforms: [{ id: "layout.footerRootStyle" }],
19849
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
19850
- } }
19851
- }, [
19852
- simpleFooterLayout,
19853
- columnsFooterLayout,
19854
- splitFooterLayout,
19855
- stack({
19856
- className: { $bind: {
19857
- from: "$root.theme.footer",
19858
- transforms: [{ id: "layout.footerBottomBarClass" }],
19859
- fallback: "rb-w-full rb-border-t rb-py-5"
19860
- } },
19861
- style: { $bind: {
19862
- from: "$root.theme.footer",
19863
- transforms: [{ id: "layout.footerBottomBarStyle" }]
19864
- } }
19865
- }, [stack({ className: { $bind: {
19866
- from: "$root.theme.footer",
19867
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
19868
- fallback: "rb-container"
19869
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
19870
- ]);
19879
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
19880
+ } },
19881
+ "data-footer-region": "bottom"
19882
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
19871
19883
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
19872
19884
  id: "block.site-footer",
19873
19885
  title: "Site Footer",
19874
19886
  category: "layout",
19875
- fragments: [{
19876
- fragment: footerBottomTextFragment,
19877
- fieldPriority: 0
19878
- }],
19879
19887
  skipSectionStyles: true,
19880
- additionalFields: [{
19881
- id: "showBusinessAddress",
19882
- type: "boolean",
19883
- label: "Add business address to site footer?",
19884
- required: false,
19885
- defaultValue: false,
19886
- ui: { intent: "content" }
19887
- }],
19888
- layout: footerLayout,
19889
- description: "Site-wide footer with navigation links and optional columns.",
19888
+ layout: section({
19889
+ background: "background",
19890
+ className: { $bind: {
19891
+ from: "$root.theme.footer",
19892
+ transforms: [{ id: "layout.footerRootClass" }],
19893
+ fallback: "rb-w-full rb-border-t transition-theme"
19894
+ } },
19895
+ style: { $bind: {
19896
+ from: "$root.theme.footer",
19897
+ transforms: [{ id: "layout.footerRootStyle" }],
19898
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
19899
+ } },
19900
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
19901
+ }, [footerMainRegion, footerBottomRegion]),
19902
+ description: "Site-wide composed footer with canonical shared details.",
19890
19903
  styleTokens: { spacing: "md" },
19891
19904
  paletteHidden: true
19892
19905
  }) };
@@ -20364,7 +20377,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
20364
20377
  id: "boxStyles.all",
20365
20378
  options: {
20366
20379
  axis: "all",
20367
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
20380
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
20368
20381
  }
20369
20382
  }]
20370
20383
  },