@riverbankcms/sdk 0.153.0 → 0.154.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 (216) hide show
  1. package/dist/{EventEmbeddedCheckoutStep-veN-QiAE.mjs → EventEmbeddedCheckoutStep-ba9npQtb.mjs} +1 -1
  2. package/dist/{PreviewEditorSidebar-jI_4DTZY.mjs → PreviewEditorSidebar-C7FiaxlF.mjs} +194 -22
  3. package/dist/{PreviewEditorUI-ORkVZhfu.mjs → PreviewEditorUI-DFst50q1.mjs} +20 -44
  4. package/dist/{SdkPreviewModeRuntime-DaNqevI1.mjs → SdkPreviewModeRuntime-BUNV_YHZ.mjs} +49 -32
  5. package/dist/{SiteChromeCustomizeContext-CgNuBHC0.mjs → SiteChromeCustomizeContext-DEj7qppF.mjs} +3558 -2321
  6. package/dist/{ThemedButton-X2UxhW6F.mjs → ThemedButton-C8kzu0hY.mjs} +400 -81
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +364 -130
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +1035 -477
  9. package/dist/_dts/api/src/billing.d.ts +2 -0
  10. package/dist/_dts/api/src/billingEndpointDefinitions.d.ts +78 -0
  11. package/dist/_dts/api/src/bookingAdjustments.d.ts +3 -2
  12. package/dist/_dts/api/src/bookingOperations.d.ts +7 -2
  13. package/dist/_dts/api/src/bookingPeople.d.ts +19 -0
  14. package/dist/_dts/api/src/bookingPeopleEndpointDefinitions.d.ts +8 -0
  15. package/dist/_dts/api/src/bookingRecords.d.ts +4 -106
  16. package/dist/_dts/api/src/bookings.d.ts +2 -3
  17. package/dist/_dts/api/src/contentRuntime.d.ts +1 -0
  18. package/dist/_dts/api/src/endpoints.d.ts +88 -43
  19. package/dist/_dts/api/src/index.d.ts +4 -2
  20. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -0
  21. package/dist/_dts/api/src/moneyPayments.d.ts +116 -0
  22. package/dist/_dts/api/src/onboarding/surfaceData.d.ts +2 -0
  23. package/dist/_dts/api/src/sdk-event-upsert.d.ts +2 -2
  24. package/dist/_dts/api/src/sdkThemeWire.d.ts +162 -103
  25. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +18 -0
  26. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +17 -16
  27. package/dist/_dts/api/src/siteSettings.d.ts +1 -0
  28. package/dist/_dts/api/src/stripeConnectSetup.d.ts +90 -0
  29. package/dist/_dts/api/src/types.d.ts +11 -31
  30. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +2 -4
  31. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -1
  32. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +8 -96
  33. package/dist/_dts/blocks/src/primitives/content/components/RichText.d.ts +1 -1
  34. package/dist/_dts/blocks/src/primitives/content/primitives.d.ts +4 -1
  35. package/dist/_dts/blocks/src/primitives/layout/Section.d.ts +1 -0
  36. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +1 -1
  37. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +1 -1
  38. package/dist/_dts/blocks/src/system/blocks/events/shared/fields.d.ts +0 -4
  39. package/dist/_dts/blocks/src/system/blocks/events/shared/index.d.ts +0 -1
  40. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +4 -4
  41. package/dist/_dts/blocks/src/system/blocks/form.d.ts +10 -0
  42. package/dist/_dts/blocks/src/system/blocks/image-gallery/fields.d.ts +1 -0
  43. package/dist/_dts/blocks/src/system/blocks/image-gallery.d.ts +6 -1
  44. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  45. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -45
  46. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +12 -0
  47. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime-layout.d.ts +23 -0
  48. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime-profile.d.ts +20 -0
  49. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +17 -16
  50. package/dist/_dts/blocks/src/system/blocks/site-footer.d.ts +1 -1
  51. package/dist/_dts/blocks/src/system/customize/facets.d.ts +75 -9
  52. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +24 -24
  53. package/dist/_dts/blocks/src/system/node/fragments/index.d.ts +1 -0
  54. package/dist/_dts/blocks/src/system/node/fragments/lookSlot.d.ts +1 -1
  55. package/dist/_dts/blocks/src/system/node/fragments/responsiveTwoColumn.d.ts +3 -1
  56. package/dist/_dts/blocks/src/system/node/fragments/sectionHead.d.ts +15 -0
  57. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +18 -198
  58. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -99
  59. package/dist/_dts/blocks/src/system/runtime/lookSurfaces.d.ts +16 -4
  60. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +2 -1
  61. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/lookPresentation.d.ts +10 -4
  62. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/presentation.d.ts +1 -1
  63. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/dates.d.ts +1 -1
  64. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +29 -17
  65. package/dist/_dts/blocks/src/system/runtime/nodes/form.fields.d.ts +5 -2
  66. package/dist/_dts/blocks/src/system/runtime/nodes/form.interactive.d.ts +11 -79
  67. package/dist/_dts/blocks/src/system/runtime/nodes/form.parts.d.ts +7 -0
  68. package/dist/_dts/blocks/src/system/runtime/nodes/form.server.d.ts +2 -13
  69. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +8 -72
  70. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.parts.d.ts +6 -6
  71. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +3 -2
  72. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +2 -2
  73. package/dist/_dts/blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.d.ts +3 -0
  74. package/dist/_dts/blocks/src/system/transforms/registry/footerArrangement.d.ts +6 -0
  75. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +0 -11
  76. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -10
  77. package/dist/_dts/commerce/src/purchase/orderConfirmationPlanning.d.ts +1 -0
  78. package/dist/_dts/content-editor/src/FooterComposerOverview.d.ts +5 -2
  79. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +1 -1
  80. package/dist/_dts/content-editor/src/FooterNavigationLayoutControl.d.ts +6 -3
  81. package/dist/_dts/content-editor/src/controller/editorLeaseParticipation.d.ts +1 -1
  82. package/dist/_dts/content-editor/src/footerComposer.d.ts +2 -1
  83. package/dist/_dts/content-editor/src/footerComposerPanelTypes.d.ts +3 -1
  84. package/dist/_dts/content-editor/src/footerNavigationLayoutState.d.ts +56 -0
  85. package/dist/_dts/content-editor/src/footerPreviewRuntime.d.ts +2 -1
  86. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +3 -4
  87. package/dist/_dts/content-editor/src/useFooterNavigationLayout.d.ts +11 -8
  88. package/dist/_dts/core/src/booking-refunds.d.ts +2 -0
  89. package/dist/_dts/core/src/date-display.d.ts +85 -0
  90. package/dist/_dts/core/src/date-time-formatter.d.ts +2 -0
  91. package/dist/_dts/core/src/footer-arrangement.d.ts +8 -1
  92. package/dist/_dts/core/src/footer-composition-types.d.ts +6 -1
  93. package/dist/_dts/core/src/footer-composition.d.ts +1 -1
  94. package/dist/_dts/core/src/footer-navigation-layout.d.ts +3 -0
  95. package/dist/_dts/core/src/index.d.ts +2 -0
  96. package/dist/_dts/core/src/mailing-list-setup.d.ts +3 -0
  97. package/dist/_dts/core/src/mailing-list-submission.d.ts +6 -1
  98. package/dist/_dts/core/src/public-profile.d.ts +3 -1
  99. package/dist/_dts/core/src/scheduled-date-time.d.ts +69 -0
  100. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +50 -9
  101. package/dist/_dts/db/src/schemas/forms.d.ts +16 -16
  102. package/dist/_dts/preview-next/src/client/blocks/ArrangementBlockToolbar.d.ts +2 -1
  103. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +1 -0
  104. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +1 -0
  105. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -1
  106. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +27 -5
  107. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +2 -0
  108. package/dist/_dts/preview-next/src/client/preview/useConfirmedPreferenceRecord.d.ts +12 -0
  109. package/dist/_dts/preview-next/src/client/preview/usePersistedFooterPreferences.d.ts +26 -0
  110. package/dist/_dts/preview-next/src/client/preview/usePersistedHeaderPreferences.d.ts +40 -2
  111. package/dist/_dts/sdk/src/config/validation.d.ts +3 -3
  112. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +4 -46
  113. package/dist/_dts/sdk/src/date-time/index.d.ts +2 -68
  114. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -0
  115. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -1
  116. package/dist/_dts/sdk/src/version.d.ts +1 -1
  117. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +2 -0
  118. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +2 -0
  119. package/dist/_dts/theme-core/src/buttons/styles/recipes/lanternRecipes.d.ts +60 -0
  120. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +57 -0
  121. package/dist/_dts/theme-core/src/buttons/styles/selection.d.ts +10 -1
  122. package/dist/_dts/theme-core/src/buttons/types.d.ts +358 -46
  123. package/dist/_dts/theme-core/src/buttons/typography.d.ts +24 -0
  124. package/dist/_dts/theme-core/src/cards/types.d.ts +8 -8
  125. package/dist/_dts/theme-core/src/footer/effectiveNavLinkStyle.d.ts +1 -1
  126. package/dist/_dts/theme-core/src/footer/generateFooterCss.d.ts +4 -1
  127. package/dist/_dts/theme-core/src/footer/mode.d.ts +2 -11
  128. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  129. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +234 -147
  130. package/dist/_dts/theme-core/src/navigation/types.d.ts +4 -4
  131. package/dist/_dts/theme-core/src/schema.d.ts +300 -192
  132. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +23 -7
  133. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  134. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +4 -6
  135. package/dist/_dts/theme-core/src/site-styles/compileFooterAgainstRow.d.ts +121 -0
  136. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -0
  137. package/dist/_dts/theme-core/src/site-styles/footerLookDefaults.d.ts +45 -0
  138. package/dist/_dts/theme-core/src/site-styles/footerLookRecipe.d.ts +50 -0
  139. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +9 -35
  140. package/dist/_dts/theme-core/src/site-styles/footerPreferences.d.ts +29 -0
  141. package/dist/_dts/theme-core/src/site-styles/headerPreferencesPersistence.d.ts +2 -3
  142. package/dist/_dts/theme-core/src/site-styles/index.d.ts +4 -0
  143. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +2 -2
  144. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  145. package/dist/_dts/theme-core/src/site-styles/siteChromeBackgrounds.d.ts +8 -0
  146. package/dist/_dts/theme-core/src/site-styles/themeParity.d.ts +1 -1
  147. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  148. package/dist/_dts/ui/src/card.d.ts +1 -1
  149. package/dist/client/{BookingMailingListNote-DrchYW1m.mjs → BookingMailingListNote-CNoSqFtf.mjs} +2 -2
  150. package/dist/client/{CardListItem-CC_GVmF6.mjs → CardListItem-BkTkqBkh.mjs} +3 -3
  151. package/dist/client/{CheckboxChoice-Dq30m3DO.mjs → CheckboxChoice-CHJpsty4.mjs} +1 -1
  152. package/dist/client/{DemoBookingPortalAccess-ojwbVUmx.mjs → DemoBookingPortalAccess-C7KQKFNt.mjs} +2 -2
  153. package/dist/client/{EventCombined.client-DyN0v0Xk.mjs → EventCombined.client-BgeYMjHJ.mjs} +5 -5
  154. package/dist/client/{EventEmbeddedCheckoutStep-CgfpKc3n.mjs → EventEmbeddedCheckoutStep-BTc_lTkM.mjs} +2 -2
  155. package/dist/client/{EventListing.client-CuOuvYMz.mjs → EventListing.client-ChRs9Hl2.mjs} +2 -2
  156. package/dist/client/{LeafletStaticMap-B0WhRr3j.mjs → LeafletStaticMap-C_dNQgd0.mjs} +1 -1
  157. package/dist/client/{RichText-C1fIXBzA.mjs → RichText-BI9bzbjo.mjs} +75 -42
  158. package/dist/client/{ThemedButton-B7HFqFBg.mjs → ThemedButton-wl3Z3wkH.mjs} +1 -1
  159. package/dist/client/{accordion-DCDVWSye.mjs → accordion-6Yz8Wd83.mjs} +1 -1
  160. package/dist/client/{bookingForm-BJ3C4GlM.mjs → bookingForm-i_pKIGiY.mjs} +8 -8
  161. package/dist/client/bookings.mjs +12565 -11839
  162. package/dist/client/{carousel-BSCBhfHY.mjs → carousel-DNqd_PjC.mjs} +2 -2
  163. package/dist/client/{carousel.client-GEtOGsxo.mjs → carousel.client-BUgjPbb6.mjs} +1 -1
  164. package/dist/client/{cart-Yv-aAtck.mjs → cart-D8OBHuF4.mjs} +3 -3
  165. package/dist/client/{checkout-B9xDkl30.mjs → checkout-F3-9IGLU.mjs} +3 -3
  166. package/dist/client/client.mjs +6109 -4778
  167. package/dist/client/{context-BOGe3rIA.mjs → context-Dg4ZrxDD.mjs} +1 -1
  168. package/dist/client/{eventCalendar-D6M0T9hs.mjs → eventCalendar-BUc7YIBM.mjs} +8 -8
  169. package/dist/client/{eventCombined-NM4UFBq8.mjs → eventCombined-BwfShk2a.mjs} +4 -4
  170. package/dist/client/{eventDetails-f_FhV4O8.mjs → eventDetails-BMOVC3go.mjs} +3 -3
  171. package/dist/client/{eventListing-WLkfAROh.mjs → eventListing-BwE9PM-t.mjs} +4 -4
  172. package/dist/client/{eventRegistration-D3ejfLvW.mjs → eventRegistration-CCWPYDc7.mjs} +9 -9
  173. package/dist/client/{form-D5Or2Jyu.mjs → form-CXFr0Gd5.mjs} +115 -51
  174. package/dist/client/{headerSection-hWgnv27V.mjs → headerSection-BX8qw8kH.mjs} +3 -3
  175. package/dist/client/hooks.mjs +2041 -1193
  176. package/dist/client/{locationMap-Di1K0O2S.mjs → locationMap-B3La71m0.mjs} +3 -3
  177. package/dist/client/{media-D29-F1u_.mjs → media-B1Cbv721.mjs} +1 -1
  178. package/dist/client/{newsletterForm-CwxcwTNO.mjs → newsletterForm-DnGyR0x7.mjs} +50 -14
  179. package/dist/client/{productDetail-BLSnhPdA.mjs → productDetail-BVgTqvkb.mjs} +3 -3
  180. package/dist/client/{productList-oGytONOX.mjs → productList-CcO7kUQw.mjs} +3 -3
  181. package/dist/client/{propsDecoder-lf_dTeZS.mjs → propsDecoder-B1OeWavE.mjs} +706 -229
  182. package/dist/client/rendering/client.mjs +11868 -11098
  183. package/dist/client/rendering/islands.mjs +17 -17
  184. package/dist/client/rendering.mjs +6058 -4676
  185. package/dist/client/{routeIslandApiConfig-Bc_WVPS8.mjs → routeIslandApiConfig-Dl4vglJm.mjs} +1 -1
  186. package/dist/client/{shop-BQ3bR7fA.mjs → shop-P72nX5Fs.mjs} +7 -7
  187. package/dist/client/{shop-commerce-DDPll6ZC.mjs → shop-commerce-Bt7uraDx.mjs} +8 -8
  188. package/dist/client/{shop-commerce-store-DO-e1pTe.mjs → shop-commerce-store-C1-mxSye.mjs} +1 -1
  189. package/dist/client/{shopShared-BylM9jh1.mjs → shopShared-Db-cRGu3.mjs} +4 -4
  190. package/dist/client/{useDiscountCodeUi-B1Puub2v.mjs → useDiscountCodeUi-jvAiUoUX.mjs} +1 -1
  191. package/dist/client/{useEventPagination-BBhkmQaT.mjs → useEventPagination-BdWpCniq.mjs} +6 -6
  192. package/dist/preview-next/before-render.mjs +133 -51
  193. package/dist/preview-next/client/runtime.mjs +3 -3
  194. package/dist/preview-next/editor-chrome.css +5 -2
  195. package/dist/preview-next/keepAlive.mjs +133 -51
  196. package/dist/preview-next/middleware.mjs +133 -51
  197. package/dist/{sdk-runtime-DWCvhJGu.mjs → sdk-runtime-DLhjF2Nw.mjs} +1 -1
  198. package/dist/server/components.mjs +11284 -10014
  199. package/dist/server/config-validation.mjs +2016 -1188
  200. package/dist/server/config.mjs +2016 -1188
  201. package/dist/server/data.mjs +2041 -1193
  202. package/dist/server/date-time.mjs +258 -116
  203. package/dist/server/index.mjs +134 -52
  204. package/dist/server/next.mjs +10571 -9350
  205. package/dist/server/page-converter.mjs +1629 -941
  206. package/dist/server/prebuild.mjs +1 -1
  207. package/dist/server/rendering/server.mjs +11156 -9872
  208. package/dist/server/rendering.mjs +11284 -10014
  209. package/dist/server/routing.mjs +2204 -1283
  210. package/dist/server/server.mjs +2369 -1570
  211. package/dist/server/theme-bridge.mjs +838 -124
  212. package/dist/server/theme.mjs +348 -64
  213. package/dist/{spinner-BYM-Y81w.mjs → spinner-MTooKfck.mjs} +1 -1
  214. package/dist/styles/index.css +254 -1
  215. package/package.json +1 -1
  216. package/dist/_dts/blocks/src/system/blocks/events/shared/layout.d.ts +0 -12
@@ -8,6 +8,19 @@ const footerModeSchema = z.enum([
8
8
  "default+blocks",
9
9
  "none"
10
10
  ]);
11
+ z.object({
12
+ variant: z.enum([
13
+ "simple",
14
+ "columns",
15
+ "split",
16
+ "centred"
17
+ ]),
18
+ showLogoText: z.boolean().optional(),
19
+ logo: z.object({
20
+ showLogo: z.boolean().optional(),
21
+ showLogoText: z.boolean().optional()
22
+ }).optional()
23
+ });
11
24
  //#endregion
12
25
  //#region ../api/src/defineEndpointDefinitions.ts
13
26
  /**
@@ -2081,6 +2094,25 @@ function validateBookingPaymentOptionKinds(kinds) {
2081
2094
  return ok(void 0);
2082
2095
  }
2083
2096
  //#endregion
2097
+ //#region ../core/src/date-time-formatter.ts
2098
+ /** Shared Intl engine, internal to core's date presentation owners. */
2099
+ const FORMATTER_CACHE_LIMIT = 100;
2100
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
2101
+ function getDateTimeFormatter(locale, timeZone, format) {
2102
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
2103
+ const cached = dateTimeFormatterCache.get(key);
2104
+ if (cached !== void 0) return cached;
2105
+ if (typeof locale !== "string" || Intl.DateTimeFormat.supportedLocalesOf([locale]).length === 0) throw new RangeError("An explicit supported locale is required");
2106
+ if (typeof timeZone !== "string" || timeZone.length === 0) throw new RangeError("An explicit time zone is required");
2107
+ const formatter = new Intl.DateTimeFormat(locale, {
2108
+ ...format,
2109
+ timeZone
2110
+ });
2111
+ if (dateTimeFormatterCache.size >= FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
2112
+ dateTimeFormatterCache.set(key, formatter);
2113
+ return formatter;
2114
+ }
2115
+ //#endregion
2084
2116
  //#region ../core/src/booking-time-zone.ts
2085
2117
  const TIME_ZONE_VALIDITY_CACHE_LIMIT = 100;
2086
2118
  const timeZoneValidityCache = /* @__PURE__ */ new Map();
@@ -2117,8 +2149,6 @@ const START_OF_DAY = {
2117
2149
  second: 0
2118
2150
  };
2119
2151
  const LOCAL_DATE_PATTERN = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
2120
- const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
2121
- const dateTimeFormatterCache = /* @__PURE__ */ new Map();
2122
2152
  function getSafeTimeZone(timeZone) {
2123
2153
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
2124
2154
  return normalized.length > 0 && isValidBookingTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
@@ -2135,19 +2165,7 @@ function formatParseError(error) {
2135
2165
  }
2136
2166
  }
2137
2167
  function formatToPartsLookup(date, locale, timeZone, format) {
2138
- return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
2139
- }
2140
- function getCachedDateTimeFormatter(locale, timeZone, format) {
2141
- const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
2142
- const cached = dateTimeFormatterCache.get(key);
2143
- if (cached !== void 0) return cached;
2144
- const formatter = new Intl.DateTimeFormat(locale, {
2145
- ...format,
2146
- timeZone
2147
- });
2148
- if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
2149
- dateTimeFormatterCache.set(key, formatter);
2150
- return formatter;
2168
+ return new Map(getDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
2151
2169
  }
2152
2170
  function getZonedDateTimeParts(date, timeZone) {
2153
2171
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -2235,7 +2253,7 @@ function toScheduledBookingDateTime(input) {
2235
2253
  function formatBookingInstant(isoString, options) {
2236
2254
  const date = new Date(isoString);
2237
2255
  if (Number.isNaN(date.getTime())) return isoString;
2238
- return getCachedDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
2256
+ return getDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
2239
2257
  }
2240
2258
  function formatBookingDate(input, format = {
2241
2259
  weekday: "long",
@@ -2360,6 +2378,17 @@ function localScheduleDateTimeToUtcDate(localDate, localTime, timeZone) {
2360
2378
  return new Date(guess);
2361
2379
  }
2362
2380
  //#endregion
2381
+ //#region ../core/src/date-display.ts
2382
+ /** Site-language policy, shared by customer emails and public event adapters. */
2383
+ function inferSiteDateLocale(siteTimeZone) {
2384
+ if (siteTimeZone === null || siteTimeZone === void 0 || siteTimeZone === "") return "en-US";
2385
+ if (siteTimeZone === "Europe/Dublin") return "en-IE";
2386
+ if (siteTimeZone.startsWith("Europe/")) return "en-GB";
2387
+ if (siteTimeZone.startsWith("Australia/")) return "en-AU";
2388
+ if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
2389
+ return "en-US";
2390
+ }
2391
+ //#endregion
2363
2392
  //#region ../core/src/location.ts
2364
2393
  function normalizeLocationAddressText(value) {
2365
2394
  if (typeof value !== "string") return null;
@@ -2477,6 +2506,10 @@ function parseGlobalFields(value) {
2477
2506
  preset: "emailName",
2478
2507
  name: value.name
2479
2508
  } : null;
2509
+ case "emailFirstName": return isRequirement(value.firstName) ? {
2510
+ preset: "emailFirstName",
2511
+ firstName: value.firstName
2512
+ } : null;
2480
2513
  case "emailFirstLast": return isRequirement(value.firstName) && isRequirement(value.lastName) ? {
2481
2514
  preset: "emailFirstLast",
2482
2515
  firstName: value.firstName,
@@ -4213,6 +4246,129 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
4213
4246
  tags: ["billing"],
4214
4247
  auth: "user",
4215
4248
  responseKind: "json"
4249
+ },
4250
+ stripeConnectSetupStart: {
4251
+ path: "/sites/{siteId}/billing/connect/setup",
4252
+ method: "POST",
4253
+ tags: ["site-{siteId}", "stripe-connect"],
4254
+ auth: "user",
4255
+ responseKind: "json",
4256
+ errors: [
4257
+ "validation:invalid_input",
4258
+ "auth:forbidden",
4259
+ "resource:conflict",
4260
+ "server:internal_error"
4261
+ ]
4262
+ },
4263
+ stripeConnectSetupDiscard: {
4264
+ path: "/sites/{siteId}/billing/connect/setup",
4265
+ method: "DELETE",
4266
+ tags: ["site-{siteId}", "stripe-connect"],
4267
+ auth: "user",
4268
+ responseKind: "json",
4269
+ errors: [
4270
+ "validation:invalid_input",
4271
+ "auth:forbidden",
4272
+ "resource:conflict",
4273
+ "server:internal_error"
4274
+ ]
4275
+ },
4276
+ stripeConnectSetupSave: {
4277
+ path: "/sites/{siteId}/billing/connect/setup/save",
4278
+ method: "POST",
4279
+ tags: ["site-{siteId}", "stripe-connect"],
4280
+ auth: "user",
4281
+ responseKind: "json",
4282
+ errors: [
4283
+ "validation:invalid_input",
4284
+ "auth:forbidden",
4285
+ "resource:conflict",
4286
+ "server:internal_error"
4287
+ ]
4288
+ },
4289
+ stripeConnectAccountSession: {
4290
+ path: "/sites/{siteId}/billing/connect/session",
4291
+ method: "POST",
4292
+ tags: ["site-{siteId}", "stripe-connect"],
4293
+ auth: "user",
4294
+ responseKind: "json",
4295
+ errors: [
4296
+ "validation:invalid_input",
4297
+ "auth:forbidden",
4298
+ "resource:conflict",
4299
+ "server:internal_error"
4300
+ ]
4301
+ },
4302
+ stripeConnectStart: {
4303
+ path: "/sites/{siteId}/billing/connect/start",
4304
+ method: "POST",
4305
+ tags: ["site-{siteId}", "stripe-connect"],
4306
+ auth: "user",
4307
+ responseKind: "json",
4308
+ errors: [
4309
+ "validation:invalid_input",
4310
+ "auth:forbidden",
4311
+ "resource:conflict",
4312
+ "server:internal_error"
4313
+ ]
4314
+ },
4315
+ stripeConnectStatus: {
4316
+ path: "/sites/{siteId}/billing/connect/status",
4317
+ method: "GET",
4318
+ tags: ["site-{siteId}", "stripe-connect"],
4319
+ auth: "user",
4320
+ responseKind: "json",
4321
+ errors: [
4322
+ "validation:invalid_input",
4323
+ "auth:forbidden",
4324
+ "resource:conflict",
4325
+ "server:internal_error"
4326
+ ]
4327
+ },
4328
+ stripeAutomaticTaxUpdate: {
4329
+ path: "/sites/{siteId}/billing/automatic-tax",
4330
+ method: "POST",
4331
+ tags: [
4332
+ "site-{siteId}",
4333
+ "billing",
4334
+ "stripe-tax"
4335
+ ],
4336
+ auth: "user",
4337
+ responseKind: "json",
4338
+ errors: [
4339
+ "validation:invalid_input",
4340
+ "auth:forbidden",
4341
+ "resource:not_found",
4342
+ "server:unavailable",
4343
+ "server:internal_error"
4344
+ ]
4345
+ },
4346
+ stripeConnectDisconnect: {
4347
+ path: "/sites/{siteId}/billing/connect/disconnect",
4348
+ method: "DELETE",
4349
+ tags: ["site-{siteId}", "stripe-connect"],
4350
+ auth: "user",
4351
+ responseKind: "json",
4352
+ errors: [
4353
+ "validation:invalid_input",
4354
+ "auth:forbidden",
4355
+ "resource:conflict",
4356
+ "server:internal_error"
4357
+ ]
4358
+ },
4359
+ billingConnectReturn: {
4360
+ path: "/billing/connect/return",
4361
+ method: "GET",
4362
+ auth: "user",
4363
+ responseKind: "void",
4364
+ errors: []
4365
+ },
4366
+ billingConnectRefresh: {
4367
+ path: "/billing/connect/refresh",
4368
+ method: "GET",
4369
+ auth: "user",
4370
+ responseKind: "void",
4371
+ errors: []
4216
4372
  }
4217
4373
  });
4218
4374
  //#endregion
@@ -4377,6 +4533,14 @@ const PAGE_SURFACE_EDITOR_ENDPOINT_DEFINITIONS = {
4377
4533
  * person when nothing is attached to them.
4378
4534
  */
4379
4535
  const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
4536
+ getBookingPerson: {
4537
+ path: "/sites/{siteId}/bookings/people/{personId}",
4538
+ method: "GET",
4539
+ tags: ["site-{siteId}", "customers-{siteId}"],
4540
+ auth: "user",
4541
+ responseKind: "json",
4542
+ errors: ["resource:not_found", "server:internal_error"]
4543
+ },
4380
4544
  listPeople: {
4381
4545
  path: "/sites/{siteId}/bookings/people",
4382
4546
  method: "GET",
@@ -8174,6 +8338,29 @@ const paletteSchema = z.object({
8174
8338
  };
8175
8339
  });
8176
8340
  //#endregion
8341
+ //#region ../theme-core/src/buttons/typography.ts
8342
+ const textTransformSchema = z.enum([
8343
+ "none",
8344
+ "uppercase",
8345
+ "lowercase",
8346
+ "capitalize"
8347
+ ]);
8348
+ const fontWeightSchema = z.union([
8349
+ z.literal(400),
8350
+ z.literal(500),
8351
+ z.literal(600),
8352
+ z.literal(700),
8353
+ z.literal(800)
8354
+ ]);
8355
+ const buttonTypographySchema = z.enum(["body", "heading"]);
8356
+ const letterSpacingSchema = z.enum([
8357
+ "tight",
8358
+ "normal",
8359
+ "slight",
8360
+ "loose",
8361
+ "wide"
8362
+ ]);
8363
+ //#endregion
8177
8364
  //#region ../theme-core/src/buttons/types.ts
8178
8365
  /**
8179
8366
  * Standard semantic variant roles a theme exposes.
@@ -8289,6 +8476,7 @@ const buttonEffectApplicationSchema = z.discriminatedUnion("effectId", [
8289
8476
  z.strictObject({
8290
8477
  effectId: z.literal("lift"),
8291
8478
  options: z.strictObject({ amount: z.enum([
8479
+ "0.125",
8292
8480
  "0.25",
8293
8481
  "0.5",
8294
8482
  "1"
@@ -8335,24 +8523,6 @@ const shadowSizeSchema = z.enum([
8335
8523
  "medium",
8336
8524
  "high"
8337
8525
  ]);
8338
- const textTransformSchema = z.enum([
8339
- "none",
8340
- "uppercase",
8341
- "lowercase",
8342
- "capitalize"
8343
- ]);
8344
- const fontWeightSchema = z.union([
8345
- z.literal(500),
8346
- z.literal(600),
8347
- z.literal(700),
8348
- z.literal(800)
8349
- ]);
8350
- const buttonTypographySchema = z.enum(["body", "heading"]);
8351
- const letterSpacingSchema = z.enum([
8352
- "tight",
8353
- "normal",
8354
- "loose"
8355
- ]);
8356
8526
  const hoverTransformSchema = z.enum([
8357
8527
  "none",
8358
8528
  "lift",
@@ -8424,7 +8594,8 @@ const paddingShorthandSchema = z.string().refine((value) => {
8424
8594
  }, { message: "Padding must be two space-separated CSS length tokens (e.g. \"0.5rem 1rem\"). Use `0` for zero." });
8425
8595
  const buttonSizeConfigSchema = z.object({
8426
8596
  padding: paddingShorthandSchema,
8427
- fontSize: z.string().optional()
8597
+ fontSize: z.string().optional(),
8598
+ borderRadius: z.string().optional()
8428
8599
  });
8429
8600
  /**
8430
8601
  * `xl` is optional on the wire so themes persisted before the `xl` size was
@@ -8547,12 +8718,20 @@ const buttonVisualAppearanceSchema = z.strictObject({
8547
8718
  textTransform: textTransformSchema
8548
8719
  }),
8549
8720
  effects: z.array(buttonEffectApplicationSchema),
8721
+ transform: z.literal("none").optional(),
8550
8722
  contextualHover: contextualButtonHoverSchema.optional()
8551
8723
  });
8552
8724
  const buttonVisualStatesSchema = z.strictObject({
8553
8725
  base: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
8554
8726
  hover: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
8555
- focus: buttonVisualAppearanceSchema.extend({ shadow: z.literal("focus-indicator") }),
8727
+ focus: buttonVisualAppearanceSchema.extend({
8728
+ shadow: z.literal("focus-indicator"),
8729
+ indicator: z.strictObject({
8730
+ kind: z.literal("surface-ink"),
8731
+ width: z.union([z.literal(2), z.literal(3)]),
8732
+ offset: z.union([z.literal(3), z.literal(4)])
8733
+ }).optional()
8734
+ }),
8556
8735
  active: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
8557
8736
  disabled: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema })
8558
8737
  });
@@ -9019,6 +9198,10 @@ function validateButtonTextContrast(input) {
9019
9198
  }
9020
9199
  };
9021
9200
  }
9201
+ /** A text-token slab inverts the palette's text/background pair, including text shades. */
9202
+ function solidForegroundToken(backgroundToken) {
9203
+ return /^text(?:-\d+)?$/.test(backgroundToken) ? "background" : onColorTokenName(backgroundToken);
9204
+ }
9022
9205
  //#endregion
9023
9206
  //#region ../theme-core/src/buttons/contextualHover.ts
9024
9207
  function resolveContextualHoverPreference(input) {
@@ -9116,7 +9299,7 @@ function candidate(family, shade, currentShade, direction, seedHex, palette) {
9116
9299
  }
9117
9300
  function hasSafeTextContrast(token, palette) {
9118
9301
  const background = palette[token];
9119
- const foreground = palette[onColorTokenName(token)];
9302
+ const foreground = palette[solidForegroundToken(token)];
9120
9303
  return typeof background === "string" && typeof foreground === "string" && contrastRatio(background, foreground) >= BUTTON_CONTRAST_POLICY.textMinimumRatio;
9121
9304
  }
9122
9305
  function isSafeCandidate(token, palette, surface) {
@@ -9211,6 +9394,13 @@ function compileDeclaredVisualStates(input, states) {
9211
9394
  const colours = collectStateColours(mapVisualStates((state) => compileDeclaredVisualState(input, states, state, state === "hover" ? hover.treatment : states[state].background)));
9212
9395
  return colours.ok ? {
9213
9396
  ...colours,
9397
+ focusIndicator: states.focus.indicator ? {
9398
+ kind: "surface-role",
9399
+ colorCss: input.surface?.foregroundCss ?? surfaceForegroundValue("text"),
9400
+ width: states.focus.indicator.width,
9401
+ offset: states.focus.indicator.offset,
9402
+ minimumSurfaceContrast: BUTTON_CONTRAST_POLICY.nonTextMinimumRatio
9403
+ } : colours.focusIndicator,
9214
9404
  contextualHoverRepair: hover.repair
9215
9405
  } : colours;
9216
9406
  }
@@ -9348,7 +9538,7 @@ function resolveFocusIndicator(colour) {
9348
9538
  function resolveSolid(input, backgroundToken, edge) {
9349
9539
  const backgroundHex = paletteHex(input, backgroundToken);
9350
9540
  if (!backgroundHex.ok) return backgroundHex;
9351
- const foregroundToken = unsafeAsOpaqueButtonColourToken(onColorTokenName(backgroundToken));
9541
+ const foregroundToken = unsafeAsOpaqueButtonColourToken(solidForegroundToken(backgroundToken));
9352
9542
  const foregroundHex = input.palette[foregroundToken];
9353
9543
  if (typeof foregroundHex !== "string") return {
9354
9544
  ok: false,
@@ -10522,6 +10712,287 @@ function normalizeAppearance(appearance) {
10522
10712
  };
10523
10713
  }
10524
10714
  //#endregion
10715
+ //#region ../theme-core/src/buttons/styles/recipes/lanternRecipes.ts
10716
+ const flatShadow = {
10717
+ elevation: "none",
10718
+ softness: null,
10719
+ position: "bottom"
10720
+ };
10721
+ const lift$1 = {
10722
+ effectId: "lift",
10723
+ options: { amount: "0.125" }
10724
+ };
10725
+ const tags = {
10726
+ tone: "classic",
10727
+ energy: "calm",
10728
+ motion: "subtle",
10729
+ era: "editorial"
10730
+ };
10731
+ /** Each role supplies complete states, including a flat surface-ink focus ring. */
10732
+ function states(base, hover, offset = 4, width = 2) {
10733
+ return {
10734
+ base,
10735
+ hover,
10736
+ focus: {
10737
+ ...base,
10738
+ shadow: "focus-indicator",
10739
+ indicator: {
10740
+ kind: "surface-ink",
10741
+ width,
10742
+ offset
10743
+ }
10744
+ },
10745
+ active: {
10746
+ ...base,
10747
+ transform: "none"
10748
+ },
10749
+ disabled: {
10750
+ ...base,
10751
+ effects: []
10752
+ }
10753
+ };
10754
+ }
10755
+ const gilt = {
10756
+ text: "treatment",
10757
+ border: "none",
10758
+ borderRadius: "rounded-10px",
10759
+ shadow: flatShadow,
10760
+ sizes: {
10761
+ sm: {
10762
+ padding: "10px 20px",
10763
+ fontSize: "text-base",
10764
+ borderRadius: "rounded-lg"
10765
+ },
10766
+ md: {
10767
+ padding: "18px 36px",
10768
+ fontSize: "text-19px"
10769
+ },
10770
+ lg: {
10771
+ padding: "18px 36px",
10772
+ fontSize: "text-19px"
10773
+ },
10774
+ xl: {
10775
+ padding: "18px 36px",
10776
+ fontSize: "text-19px"
10777
+ }
10778
+ },
10779
+ typography: {
10780
+ fontWeight: 400,
10781
+ typography: "heading",
10782
+ fontSize: "text-19px",
10783
+ letterSpacing: "slight",
10784
+ italic: false,
10785
+ textTransform: "none"
10786
+ },
10787
+ effects: []
10788
+ };
10789
+ const giltPrimary = {
10790
+ ...gilt,
10791
+ background: {
10792
+ type: "gradient",
10793
+ stops: ["accent", "primary"],
10794
+ direction: "to-br",
10795
+ foregroundToken: "onAccent"
10796
+ }
10797
+ };
10798
+ const giltPrimaryHover = {
10799
+ ...giltPrimary,
10800
+ background: {
10801
+ ...giltPrimary.background,
10802
+ stops: ["accent-400", "primary-400"],
10803
+ foregroundToken: "secondary-950"
10804
+ },
10805
+ effects: [lift$1]
10806
+ };
10807
+ const giltSecondary = {
10808
+ ...gilt,
10809
+ background: {
10810
+ type: "solid",
10811
+ colorToken: "text"
10812
+ }
10813
+ };
10814
+ const giltSecondaryHover = {
10815
+ ...giltSecondary,
10816
+ effects: [lift$1],
10817
+ contextualHover: {
10818
+ kind: "shade-shift",
10819
+ seedToken: unsafeAsOpaqueButtonColourToken("text"),
10820
+ fallbackDirection: "lighter"
10821
+ }
10822
+ };
10823
+ const giltPrimaryStates = states(giltPrimary, giltPrimaryHover);
10824
+ const giltSecondaryStates = states(giltSecondary, giltSecondaryHover);
10825
+ const giltSlabRecipe = defineStaticButtonStyleRecipe({
10826
+ id: "gilt-slab",
10827
+ accessibilityLabel: "Gilt slab",
10828
+ tags,
10829
+ system: { roles: {
10830
+ primary: { states: giltPrimaryStates },
10831
+ secondary: { states: giltSecondaryStates },
10832
+ outline: { states: giltSecondaryStates },
10833
+ ghost: { states: giltSecondaryStates },
10834
+ accent: { states: giltPrimaryStates }
10835
+ } }
10836
+ });
10837
+ const hairline = {
10838
+ text: "treatment",
10839
+ borderRadius: "rounded-3px",
10840
+ shadow: flatShadow,
10841
+ sizes: {
10842
+ sm: {
10843
+ padding: "9px 16px",
10844
+ fontSize: "text-xs"
10845
+ },
10846
+ md: {
10847
+ padding: "15px 28px",
10848
+ fontSize: "text-13px"
10849
+ },
10850
+ lg: {
10851
+ padding: "15px 28px",
10852
+ fontSize: "text-13px"
10853
+ },
10854
+ xl: {
10855
+ padding: "15px 28px",
10856
+ fontSize: "text-13px"
10857
+ }
10858
+ },
10859
+ typography: {
10860
+ fontWeight: 700,
10861
+ typography: "body",
10862
+ fontSize: "text-13px",
10863
+ letterSpacing: "wide",
10864
+ italic: false,
10865
+ textTransform: "uppercase"
10866
+ },
10867
+ effects: []
10868
+ };
10869
+ const hairlinePrimary = {
10870
+ ...hairline,
10871
+ background: {
10872
+ type: "solid",
10873
+ colorToken: "primary"
10874
+ },
10875
+ border: {
10876
+ widthClass: "border",
10877
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
10878
+ }
10879
+ };
10880
+ const hairlineOutline = {
10881
+ ...hairline,
10882
+ background: {
10883
+ type: "surface",
10884
+ role: "link"
10885
+ },
10886
+ border: {
10887
+ widthClass: "border",
10888
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
10889
+ }
10890
+ };
10891
+ const hairlineSecondary = {
10892
+ ...hairlineOutline,
10893
+ border: {
10894
+ widthClass: "border",
10895
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
10896
+ }
10897
+ };
10898
+ const hairlineFilled = {
10899
+ ...hairlineSecondary,
10900
+ background: {
10901
+ type: "solid",
10902
+ colorToken: "accent"
10903
+ }
10904
+ };
10905
+ const hairlinePrimaryStates = states(hairlinePrimary, hairlineOutline, 3);
10906
+ const hairlineSecondaryStates = states(hairlineSecondary, hairlineFilled, 3);
10907
+ const hairlineTabRecipe = defineStaticButtonStyleRecipe({
10908
+ id: "hairline-tab",
10909
+ accessibilityLabel: "Hairline tab",
10910
+ tags,
10911
+ system: { roles: {
10912
+ primary: { states: hairlinePrimaryStates },
10913
+ secondary: { states: hairlineSecondaryStates },
10914
+ outline: { states: hairlineSecondaryStates },
10915
+ ghost: { states: hairlineSecondaryStates },
10916
+ accent: { states: states(hairlineFilled, hairlineSecondary, 3) }
10917
+ } }
10918
+ });
10919
+ const marqueeAccent = {
10920
+ text: "treatment",
10921
+ borderRadius: "rounded-none",
10922
+ shadow: flatShadow,
10923
+ sizes: {
10924
+ sm: {
10925
+ padding: "8px 17px",
10926
+ fontSize: "text-15px"
10927
+ },
10928
+ md: {
10929
+ padding: "14px 25px",
10930
+ fontSize: "text-17px"
10931
+ },
10932
+ lg: {
10933
+ padding: "14px 25px",
10934
+ fontSize: "text-17px"
10935
+ },
10936
+ xl: {
10937
+ padding: "14px 25px",
10938
+ fontSize: "text-17px"
10939
+ }
10940
+ },
10941
+ typography: {
10942
+ fontWeight: 800,
10943
+ typography: "body",
10944
+ fontSize: "text-17px",
10945
+ letterSpacing: "loose",
10946
+ italic: false,
10947
+ textTransform: "uppercase"
10948
+ },
10949
+ effects: [],
10950
+ background: {
10951
+ type: "solid",
10952
+ colorToken: "accent"
10953
+ },
10954
+ border: {
10955
+ widthClass: "border-2",
10956
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
10957
+ }
10958
+ };
10959
+ const marqueePrimary = {
10960
+ ...marqueeAccent,
10961
+ background: {
10962
+ type: "solid",
10963
+ colorToken: "primary"
10964
+ },
10965
+ border: {
10966
+ widthClass: "border-2",
10967
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
10968
+ }
10969
+ };
10970
+ const marqueeSecondary = {
10971
+ ...marqueeAccent,
10972
+ background: {
10973
+ type: "solid",
10974
+ colorToken: "text"
10975
+ },
10976
+ border: {
10977
+ widthClass: "border-2",
10978
+ boundaryInk: unsafeAsOpaqueButtonColourToken("text")
10979
+ }
10980
+ };
10981
+ const marqueePrimaryStates = states(marqueeAccent, marqueePrimary, 4, 3);
10982
+ const marqueeSecondaryStates = states(marqueeSecondary, marqueeAccent, 4, 3);
10983
+ const marqueeRecipe = defineStaticButtonStyleRecipe({
10984
+ id: "marquee",
10985
+ accessibilityLabel: "Marquee",
10986
+ tags,
10987
+ system: { roles: {
10988
+ primary: { states: marqueePrimaryStates },
10989
+ secondary: { states: marqueeSecondaryStates },
10990
+ outline: { states: marqueeSecondaryStates },
10991
+ ghost: { states: marqueeSecondaryStates },
10992
+ accent: { states: marqueePrimaryStates }
10993
+ } }
10994
+ });
10995
+ //#endregion
10525
10996
  //#region ../theme-core/src/buttons/styles/recipes/fulcrumRecipe.ts
10526
10997
  const fulcrumSizes = {
10527
10998
  sm: {
@@ -11263,7 +11734,10 @@ const BUTTON_STYLE_IDS = [
11263
11734
  "offset-block",
11264
11735
  "ringed-pill",
11265
11736
  "square-outline",
11266
- "fulcrum"
11737
+ "fulcrum",
11738
+ "gilt-slab",
11739
+ "hairline-tab",
11740
+ "marquee"
11267
11741
  ];
11268
11742
  const quietArrowParametersSchema = z.object({ secondaryTreatment: z.enum(["outlined", "solid-accent"]) }).strict();
11269
11743
  const flatInkHoverTreatmentSchema = z.enum([
@@ -11300,7 +11774,10 @@ const buttonStyleSelectionSchema = z.discriminatedUnion("styleId", [
11300
11774
  selectionBranch("offset-block", emptyParametersSchema),
11301
11775
  selectionBranch("ringed-pill", emptyParametersSchema),
11302
11776
  selectionBranch("square-outline", emptyParametersSchema),
11303
- selectionBranch("fulcrum", emptyParametersSchema)
11777
+ selectionBranch("fulcrum", emptyParametersSchema),
11778
+ selectionBranch("gilt-slab", emptyParametersSchema),
11779
+ selectionBranch("hairline-tab", emptyParametersSchema),
11780
+ selectionBranch("marquee", emptyParametersSchema)
11304
11781
  ]);
11305
11782
  //#endregion
11306
11783
  //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
@@ -14816,7 +15293,10 @@ const buttonStyleRecipes = [
14816
15293
  offsetBlockRecipe,
14817
15294
  ringedPillRecipe,
14818
15295
  squareOutlineRecipe,
14819
- fulcrumRecipe
15296
+ fulcrumRecipe,
15297
+ giltSlabRecipe,
15298
+ hairlineTabRecipe,
15299
+ marqueeRecipe
14820
15300
  ];
14821
15301
  const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
14822
15302
  function findButtonStyleRecipe(id) {
@@ -14832,6 +15312,9 @@ function resolveButtonStyleSelection(selection) {
14832
15312
  case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
14833
15313
  case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
14834
15314
  case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
15315
+ case "gilt-slab": return resolveButtonStyleRecipe(giltSlabRecipe, selection.parameters);
15316
+ case "hairline-tab": return resolveButtonStyleRecipe(hairlineTabRecipe, selection.parameters);
15317
+ case "marquee": return resolveButtonStyleRecipe(marqueeRecipe, selection.parameters);
14835
15318
  case "fulcrum": return resolveButtonStyleRecipe(fulcrumRecipe, selection.parameters);
14836
15319
  case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
14837
15320
  case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
@@ -17063,20 +17546,15 @@ const headerSchema = z.object({
17063
17546
  const footerVariant = z.enum([
17064
17547
  "simple",
17065
17548
  "columns",
17066
- "split"
17067
- ]);
17549
+ "split",
17550
+ "centred"
17551
+ ]).transform((value) => value === "columns" ? "simple" : value);
17068
17552
  const footerMaxWidth = z.enum(["container", "full"]);
17069
17553
  const footerNavLayoutMode = z.enum([
17070
17554
  "stack",
17071
17555
  "inline",
17072
17556
  "inline-wrap"
17073
17557
  ]);
17074
- const footerNavLayoutAlign = z.enum([
17075
- "start",
17076
- "center",
17077
- "end",
17078
- "space-between"
17079
- ]);
17080
17558
  const footerSpacing = z.enum([
17081
17559
  "none",
17082
17560
  "tight",
@@ -17085,12 +17563,6 @@ const footerSpacing = z.enum([
17085
17563
  "relaxed",
17086
17564
  "spacious"
17087
17565
  ]);
17088
- const footerLogoPlacement = z.enum([
17089
- "left",
17090
- "right",
17091
- "above",
17092
- "below"
17093
- ]);
17094
17566
  const footerLogoSize = z.enum([
17095
17567
  "sm",
17096
17568
  "md",
@@ -17131,17 +17603,8 @@ const footerBottomBarSchema = z.object({
17131
17603
  ]).optional()
17132
17604
  }).optional()
17133
17605
  });
17134
- const footerNavLayoutSchema = z.object({
17135
- layout: footerNavLayoutMode.optional(),
17136
- align: footerNavLayoutAlign.optional(),
17137
- gapX: footerSpacing.optional(),
17138
- gapY: footerSpacing.optional(),
17139
- columns: z.number().int().min(1).max(6).optional()
17140
- });
17606
+ const footerNavLayoutSchema = z.object({ layout: footerNavLayoutMode.optional() });
17141
17607
  const footerLogoSchema = z.object({
17142
- showLogo: z.boolean().default(true),
17143
- showLogoText: z.boolean().optional(),
17144
- placement: footerLogoPlacement.optional(),
17145
17608
  size: footerLogoSize.optional(),
17146
17609
  maxHeight: footerLogoMaxHeight.optional(),
17147
17610
  align: z.enum([
@@ -17151,15 +17614,8 @@ const footerLogoSchema = z.object({
17151
17614
  ]).optional()
17152
17615
  });
17153
17616
  const footerSchema = z.object({
17154
- /**
17155
- * SDK-only footer rendering mode.
17156
- *
17157
- * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
17158
- */
17159
- mode: footerModeSchema.optional(),
17160
17617
  variant: footerVariant,
17161
17618
  maxWidth: footerMaxWidth,
17162
- showLogoText: z.boolean().optional(),
17163
17619
  background: headerBackgroundSchema.default({
17164
17620
  type: "color",
17165
17621
  color: "surface"
@@ -17342,7 +17798,9 @@ const cardListKnobBlocks = [...cardListFamilyBlocks, "block.event-calendar"];
17342
17798
  const lookKnobBlocks = {
17343
17799
  actionStyle: cardListKnobBlocks,
17344
17800
  titleSize: "block.hero",
17345
- imagePosition: "block.hero",
17801
+ imagePosition: ["block.hero", "block.media-text"],
17802
+ imageShape: "block.media-text",
17803
+ aspectRatio: "block.media-text",
17346
17804
  stickerLine: "block.hero",
17347
17805
  smallCaption: "block.hero",
17348
17806
  candleGlow: "block.hero",
@@ -17352,7 +17810,11 @@ const lookKnobBlocks = {
17352
17810
  dates: "block.offerings-preview",
17353
17811
  showCapacity: "block.event-calendar",
17354
17812
  quoteCount: "block.testimonials",
17355
- archFrame: "block.testimonials",
17813
+ archFrame: [
17814
+ "block.testimonials",
17815
+ "block.newsletter-signup",
17816
+ "block.form"
17817
+ ],
17356
17818
  tilt: "block.testimonials"
17357
17819
  };
17358
17820
  function isArrangementAppearancePreset(preset) {
@@ -17379,13 +17841,25 @@ function cardListKnobDefaults(block, arrangement, knobs, defaults) {
17379
17841
  }
17380
17842
  };
17381
17843
  }
17844
+ const arrangementLookTargets = {
17845
+ hero: "hero",
17846
+ "feature-cards": "feature-cards",
17847
+ "event-calendar": "events",
17848
+ testimonials: "testimonials",
17849
+ "event-details": "events",
17850
+ "media-text": "media-text",
17851
+ "image-gallery": "image-gallery",
17852
+ "newsletter-signup": "newsletter",
17853
+ form: "contact-form",
17854
+ "body-text": "body-text"
17855
+ };
17382
17856
  function defineArrangementLook(id, block, name, arrangement, knobs, input = {}) {
17383
17857
  const mode = block === "event-calendar" ? "list" : null;
17384
17858
  return {
17385
17859
  id: asAppearancePresetId(id),
17386
17860
  blockKinds: [`block.${block}`],
17387
17861
  label: name,
17388
- target: block === "event-calendar" || block === "event-details" ? "events" : block === "hero" ? "hero" : block === "testimonials" ? "testimonials" : "feature-cards",
17862
+ target: arrangementLookTargets[block],
17389
17863
  structure: {
17390
17864
  kind: "arrangement",
17391
17865
  byMode: { [mode ?? "default"]: arrangement },
@@ -18205,6 +18679,15 @@ const appearancePresets = [
18205
18679
  eyebrowTreatment: "accent"
18206
18680
  }
18207
18681
  }),
18682
+ defineArrangementLook("body-text-reading-column", "body-text", "Reading column", "prose", []),
18683
+ defineArrangementLook("form-beside-introduction-arched-panel", "form", "Introduction beside an arched form", "two-column", [], { slotRoles: { panel: "card" } }),
18684
+ defineArrangementLook("newsletter-signup-in-arch", "newsletter-signup", "Signup in an arch", "arch", []),
18685
+ defineArrangementLook("image-gallery-square-tiles", "image-gallery", "Square tiles", "tiles", []),
18686
+ defineArrangementLook("image-gallery-arched-captions", "image-gallery", "Arched photos with captions", "tiles", [], { styleFallback: [id$1("image-gallery-square-tiles")] }),
18687
+ defineArrangementLook("media-text-circle-beside-text", "media-text", "Circle beside the text", "circle-beside", ["imagePosition"], { forcedKnobs: {
18688
+ imageShape: "circle",
18689
+ aspectRatio: "1/1"
18690
+ } }),
18208
18691
  defineArrangementLook("hero-photo-beside-text", "hero", "Photo beside the text", "split", heroKnobs, { slotRoles: { sticker: "highlight" } }),
18209
18692
  defineArrangementLook("hero-headline-row", "hero", "Big headline, then text and photo", "headline-row", heroKnobs, {
18210
18693
  slotRoles: { sticker: "highlight" },
@@ -18790,6 +19273,49 @@ function requireThemeColorToken$1(value) {
18790
19273
  return token;
18791
19274
  }
18792
19275
  //#endregion
19276
+ //#region ../theme-core/src/header/rootPaint.ts
19277
+ /** The nav container takes precedence when a floating header also has one. */
19278
+ function headerRootPaint(header) {
19279
+ const navContainerType = header?.navContainer?.type ?? "none";
19280
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
19281
+ return header?.variant === "floating" ? "overlay" : "own-surface";
19282
+ }
19283
+ //#endregion
19284
+ //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
19285
+ const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
19286
+ const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
19287
+ siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
19288
+ function parseSiteChromeBackgroundColorToken(value) {
19289
+ const token = parseBackgroundAppearanceColorToken(value);
19290
+ return token ? token : null;
19291
+ }
19292
+ function toSiteChromeBackgroundColorTokens(tokenNames) {
19293
+ return tokenNames.flatMap((name) => {
19294
+ const token = parseSiteChromeBackgroundColorToken(name);
19295
+ return token ? [token] : [];
19296
+ });
19297
+ }
19298
+ const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
19299
+ const token = parseSiteChromeBackgroundColorToken(value);
19300
+ if (token === null) {
19301
+ ctx.addIssue({
19302
+ code: "custom",
19303
+ message: "Unknown site chrome background colour token"
19304
+ });
19305
+ return z.NEVER;
19306
+ }
19307
+ return token;
19308
+ });
19309
+ const siteChromeBackgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
19310
+ kind: z.literal("color"),
19311
+ token: backgroundColorTokenSchema
19312
+ }).strict()]);
19313
+ z.object({
19314
+ background: siteChromeBackgroundOverrideSchema,
19315
+ navigationLayout: z.enum(["inline-wrap", "stack"])
19316
+ }).strict();
19317
+ z.object({ background: siteChromeBackgroundOverrideSchema }).strict();
19318
+ //#endregion
18793
19319
  //#region ../theme-core/src/site-styles/compilationPlan.ts
18794
19320
  const defaultHeaderBrandPreferences = {
18795
19321
  brandDisplay: "auto",
@@ -18950,6 +19476,9 @@ function fallbackEndsAtOffer(entry, mode, style, catalogue, visited) {
18950
19476
  appearancePresets.filter(isArrangementAppearancePreset);
18951
19477
  /** Closed structural hooks shared by block arrangements and bounded skins. */
18952
19478
  const arrangementSlotNames = [
19479
+ "contact",
19480
+ "social",
19481
+ "base",
18953
19482
  "section",
18954
19483
  "stack",
18955
19484
  "inline",
@@ -19036,6 +19565,238 @@ function validateOfferKnobs(style, catalogue) {
19036
19565
  });
19037
19566
  }
19038
19567
  //#endregion
19568
+ //#region ../theme-core/src/site-styles/footerLookDefaults.ts
19569
+ const defaultFooterLookRecipes = {
19570
+ "footer-centred-name": {
19571
+ arrangement: "centred",
19572
+ ground: {
19573
+ kind: "token",
19574
+ token: "surface"
19575
+ },
19576
+ nav: {
19577
+ weight: "regular",
19578
+ colorToken: "text",
19579
+ hoverColorToken: "primary",
19580
+ typography: "body"
19581
+ },
19582
+ legal: {
19583
+ kind: "separate",
19584
+ bar: null
19585
+ },
19586
+ brandAlign: "center"
19587
+ },
19588
+ "footer-links-row": {
19589
+ arrangement: "simple",
19590
+ ground: {
19591
+ kind: "token",
19592
+ token: "surface"
19593
+ },
19594
+ nav: {
19595
+ weight: "regular",
19596
+ colorToken: "text",
19597
+ hoverColorToken: "primary",
19598
+ typography: "body"
19599
+ },
19600
+ legal: { kind: "integrated" },
19601
+ brandAlign: "start"
19602
+ }
19603
+ };
19604
+ /** A whole authored recipe replaces the default; facets are never deep-merged. */
19605
+ function resolveFooterLookRecipe(style, id) {
19606
+ return style?.footerLookRecipes?.[id] ?? defaultFooterLookRecipes[id];
19607
+ }
19608
+ //#endregion
19609
+ //#region ../theme-core/src/navigation/presets.ts
19610
+ /**
19611
+ * Built-in nav link style presets
19612
+ *
19613
+ * Each preset uses composable effects to achieve its look.
19614
+ */
19615
+ const NAV_LINK_PRESETS = {
19616
+ /**
19617
+ * Minimal - subtle color change on hover
19618
+ */
19619
+ minimal: {
19620
+ name: "Minimal",
19621
+ typography: "body",
19622
+ fontWeight: "medium",
19623
+ textTransform: "none",
19624
+ italic: false,
19625
+ colorToken: "text",
19626
+ hoverColorToken: "primary",
19627
+ padding: "none",
19628
+ borderRadius: "none",
19629
+ effects: { hover: [{
19630
+ effectId: "text-color-change",
19631
+ options: { hoverColorToken: "primary" }
19632
+ }] }
19633
+ },
19634
+ /**
19635
+ * Underline - static underline appears on hover
19636
+ */
19637
+ underline: {
19638
+ name: "Underline",
19639
+ typography: "body",
19640
+ fontWeight: "medium",
19641
+ textTransform: "none",
19642
+ italic: false,
19643
+ colorToken: "text",
19644
+ padding: "none",
19645
+ borderRadius: "none",
19646
+ effects: { hover: [{
19647
+ effectId: "nav-underline",
19648
+ options: { style: "static" }
19649
+ }] }
19650
+ },
19651
+ /**
19652
+ * Underline Grow - animated underline grows from center on hover
19653
+ */
19654
+ "underline-grow": {
19655
+ name: "Underline Grow",
19656
+ typography: "body",
19657
+ fontWeight: "medium",
19658
+ textTransform: "none",
19659
+ italic: false,
19660
+ colorToken: "text",
19661
+ padding: "none",
19662
+ borderRadius: "none",
19663
+ effects: { hover: [{
19664
+ effectId: "nav-underline",
19665
+ options: { style: "grow" }
19666
+ }] }
19667
+ },
19668
+ /**
19669
+ * Capsule - pill-shaped background on hover
19670
+ */
19671
+ capsule: {
19672
+ name: "Capsule",
19673
+ typography: "body",
19674
+ fontWeight: "medium",
19675
+ textTransform: "none",
19676
+ italic: false,
19677
+ colorToken: "text",
19678
+ padding: "compact",
19679
+ borderRadius: "full",
19680
+ effects: {
19681
+ hover: [{
19682
+ effectId: "background-on-hover-alpha",
19683
+ options: {
19684
+ colorToken: "primary",
19685
+ opacity: 10
19686
+ }
19687
+ }],
19688
+ active: [{
19689
+ effectId: "background-on-hover-alpha",
19690
+ options: {
19691
+ colorToken: "primary",
19692
+ opacity: 15
19693
+ }
19694
+ }]
19695
+ }
19696
+ },
19697
+ /**
19698
+ * Solid - solid background color on hover
19699
+ */
19700
+ solid: {
19701
+ name: "Solid",
19702
+ typography: "body",
19703
+ fontWeight: "medium",
19704
+ textTransform: "none",
19705
+ italic: false,
19706
+ colorToken: "text",
19707
+ padding: "compact",
19708
+ borderRadius: "none",
19709
+ effects: {
19710
+ hover: [{
19711
+ effectId: "background-on-hover",
19712
+ options: {
19713
+ colorToken: "primary",
19714
+ textColorToken: "primaryForeground"
19715
+ }
19716
+ }],
19717
+ active: [{
19718
+ effectId: "background-on-hover",
19719
+ options: {
19720
+ colorToken: "primary",
19721
+ textColorToken: "primaryForeground"
19722
+ }
19723
+ }]
19724
+ }
19725
+ },
19726
+ /**
19727
+ * Scale - gentle scale-up on hover
19728
+ */
19729
+ scale: {
19730
+ name: "Scale",
19731
+ typography: "body",
19732
+ fontWeight: "medium",
19733
+ textTransform: "none",
19734
+ italic: false,
19735
+ colorToken: "text",
19736
+ padding: "none",
19737
+ borderRadius: "none",
19738
+ effects: { hover: [{
19739
+ effectId: "scale-up",
19740
+ options: { scale: 1.05 }
19741
+ }] }
19742
+ },
19743
+ /**
19744
+ * Frosted - semi-transparent glass-like background
19745
+ */
19746
+ frosted: {
19747
+ name: "Frosted",
19748
+ typography: "body",
19749
+ fontWeight: "medium",
19750
+ textTransform: "none",
19751
+ italic: false,
19752
+ colorToken: "text",
19753
+ padding: "compact",
19754
+ borderRadius: "md",
19755
+ effects: {
19756
+ base: [{ effectId: "nav-frosted-base" }],
19757
+ hover: [{ effectId: "nav-frosted-hover" }],
19758
+ active: [{ effectId: "nav-frosted-active" }]
19759
+ }
19760
+ }
19761
+ };
19762
+ /**
19763
+ * Get a nav link style preset by ID
19764
+ */
19765
+ function getNavLinkPreset(presetId) {
19766
+ return NAV_LINK_PRESETS[presetId];
19767
+ }
19768
+ Object.keys(NAV_LINK_PRESETS);
19769
+ //#endregion
19770
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
19771
+ function effectiveFooterNavLinkStyle(footer) {
19772
+ if (!footer) return null;
19773
+ if (footer.navLinkStyle) return footer.navLinkStyle;
19774
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
19775
+ if (!basePreset) return null;
19776
+ return {
19777
+ ...basePreset,
19778
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
19779
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
19780
+ };
19781
+ }
19782
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
19783
+ if (!footer) return {};
19784
+ const style = effectiveFooterNavLinkStyle(footer);
19785
+ return {
19786
+ text: footer.background?.textColor ?? (footer.variant === "centred" ? "text" : void 0),
19787
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
19788
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
19789
+ };
19790
+ }
19791
+ //#endregion
19792
+ //#region ../theme-core/src/site-styles/footerLookRecipe.ts
19793
+ /** Reject undeclared references when the curated catalogue is loaded, before rendering. */
19794
+ function validateFooterRecipeSurfaces(style, recipe) {
19795
+ [recipe.ground, ...recipe.legal.kind === "separate" && recipe.legal.bar ? [recipe.legal.bar.background] : []].forEach((ground) => {
19796
+ if (ground.kind === "style-surface" && (style.looks.kind !== "offers" || !style.looks.surfaces[ground.surface])) throw new Error(`Undeclared footer surface: ${ground.surface}`);
19797
+ });
19798
+ }
19799
+ //#endregion
19039
19800
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
19040
19801
  /**
19041
19802
  * Reusable accordion "looks" for curated site styles.
@@ -19763,52 +20524,14 @@ defineLookOptionGroup({
19763
20524
  function asFooterLookId(value) {
19764
20525
  return value;
19765
20526
  }
19766
- function quietFooterLinks(theme) {
19767
- return {
19768
- ...theme.footer,
19769
- navStyle: "minimal",
19770
- navWeight: "regular",
19771
- navColor: "text",
19772
- navLinkStyle: {
19773
- typography: "body",
19774
- fontWeight: "regular",
19775
- textTransform: "none",
19776
- italic: false,
19777
- colorToken: "text",
19778
- hoverColorToken: "primary",
19779
- padding: "none",
19780
- borderRadius: "none"
19781
- }
19782
- };
19783
- }
19784
- function emphasizedFooterLinks(theme) {
19785
- return {
19786
- ...theme.footer,
19787
- navStyle: "minimal",
19788
- navWeight: "medium",
19789
- navColor: "text",
19790
- navLinkStyle: {
19791
- typography: "body",
19792
- fontWeight: "medium",
19793
- textTransform: "none",
19794
- italic: false,
19795
- colorToken: "text",
19796
- hoverColorToken: "primary",
19797
- padding: "none",
19798
- borderRadius: "none"
19799
- }
19800
- };
19801
- }
19802
20527
  const footerLookCatalog = defineExactCatalog()([{
19803
- id: asFooterLookId("footer-links-quiet"),
19804
- label: "Quiet links",
19805
- description: "Regular-weight footer navigation with a restrained hover.",
19806
- compile: quietFooterLinks
20528
+ id: asFooterLookId("footer-links-row"),
20529
+ label: "Links in a row",
20530
+ description: "Your links in a row, with the other footer sections in columns beside them."
19807
20531
  }, {
19808
- id: asFooterLookId("footer-links-emphasized"),
19809
- label: "Emphasized links",
19810
- description: "Medium-weight footer navigation with a clearer emphasis.",
19811
- compile: emphasizedFooterLinks
20532
+ id: asFooterLookId("footer-centred-name"),
20533
+ label: "Centred name, links beneath",
20534
+ description: "Your site name centred, with your links, contact details and social links beneath it."
19812
20535
  }]);
19813
20536
  new Map(footerLookCatalog.map((look) => [look.id, look]));
19814
20537
  //#endregion
@@ -21225,6 +21948,7 @@ function defineCuratedSiteStyle(input) {
21225
21948
  recommendedAppearancePresetIds
21226
21949
  },
21227
21950
  headerCuration: headerCurationBySiteStyle[input.id],
21951
+ footerLookRecipes: input.footerLookRecipes,
21228
21952
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
21229
21953
  buttonStyleChoices: input.buttonStyleChoices,
21230
21954
  paletteRecommendations: input.paletteRecommendations,
@@ -21710,7 +22434,11 @@ const lanternLooks = {
21710
22434
  margin: "40px"
21711
22435
  },
21712
22436
  fontLoading: {
21713
- extraBodyFontWeights: [500, 700],
22437
+ extraBodyFontWeights: [
22438
+ 500,
22439
+ 700,
22440
+ 800
22441
+ ],
21714
22442
  italicBodyFontWeights: [400]
21715
22443
  },
21716
22444
  surfaces: {
@@ -21760,6 +22488,38 @@ const lanternLooks = {
21760
22488
  ]
21761
22489
  },
21762
22490
  offers: [
22491
+ {
22492
+ id: id("body-text-reading-column"),
22493
+ treatment: "reading-column",
22494
+ roleMap: lanternRoles
22495
+ },
22496
+ {
22497
+ id: id("form-beside-introduction-arched-panel"),
22498
+ treatment: "arched-panel",
22499
+ addKnobs: ["archFrame"],
22500
+ roleMap: lanternRoles
22501
+ },
22502
+ {
22503
+ id: id("newsletter-signup-in-arch"),
22504
+ treatment: "signup-arch",
22505
+ addKnobs: ["archFrame"],
22506
+ roleMap: lanternRoles
22507
+ },
22508
+ {
22509
+ id: id("image-gallery-square-tiles"),
22510
+ treatment: "square-tiles",
22511
+ roleMap: lanternRoles
22512
+ },
22513
+ {
22514
+ id: id("image-gallery-arched-captions"),
22515
+ treatment: "arched-captions",
22516
+ roleMap: lanternRoles
22517
+ },
22518
+ {
22519
+ id: id("media-text-circle-beside-text"),
22520
+ treatment: "circle-beside",
22521
+ roleMap: lanternRoles
22522
+ },
21763
22523
  {
21764
22524
  id: id("event-details-panel"),
21765
22525
  treatment: "quiet",
@@ -22198,7 +22958,7 @@ const curatedSiteStyles = [
22198
22958
  "faq-contained-help",
22199
22959
  "contact-form-panel"
22200
22960
  ],
22201
- recommendedFooterLookIds: ["footer-links-quiet"],
22961
+ recommendedFooterLookIds: ["footer-links-row"],
22202
22962
  buttonStyleChoices: [
22203
22963
  buttonChoice("soft-pill"),
22204
22964
  buttonChoice("pebble"),
@@ -22317,7 +23077,7 @@ const curatedSiteStyles = [
22317
23077
  "testimonials-non-carded",
22318
23078
  "contact-form-panel"
22319
23079
  ],
22320
- recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
23080
+ recommendedFooterLookIds: ["footer-links-row"],
22321
23081
  buttonStyleChoices: [
22322
23082
  buttonChoice("earth-pill"),
22323
23083
  buttonChoice("soft-pill"),
@@ -22372,7 +23132,41 @@ const curatedSiteStyles = [
22372
23132
  "testimonials-brand-statement-cards",
22373
23133
  "contact-form-panel"
22374
23134
  ],
22375
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
23135
+ footerLookRecipes: { "footer-links-row": {
23136
+ arrangement: "split",
23137
+ ground: {
23138
+ kind: "token",
23139
+ token: "primary-800"
23140
+ },
23141
+ nav: {
23142
+ weight: "medium",
23143
+ colorToken: "primaryForeground",
23144
+ hoverColorToken: "secondary",
23145
+ typography: "body"
23146
+ },
23147
+ legal: {
23148
+ kind: "separate",
23149
+ bar: {
23150
+ fullBleed: true,
23151
+ background: {
23152
+ kind: "token",
23153
+ token: "primary-900"
23154
+ },
23155
+ textColor: "primaryForeground",
23156
+ textAlign: "center",
23157
+ paddingY: "compact",
23158
+ paddingX: "default",
23159
+ borderTop: { width: "none" }
23160
+ },
23161
+ linkStyle: {
23162
+ colorToken: "secondary",
23163
+ decorationColorToken: "secondary"
23164
+ }
23165
+ },
23166
+ brandAlign: "start",
23167
+ brandLogoSize: "sm"
23168
+ } },
23169
+ recommendedFooterLookIds: ["footer-links-row"],
22376
23170
  buttonStyleChoices: [
22377
23171
  buttonChoice("showtime-pill"),
22378
23172
  buttonChoice("confident-chip"),
@@ -22443,7 +23237,7 @@ const curatedSiteStyles = [
22443
23237
  "testimonials-statement-cards",
22444
23238
  "contact-form-panel"
22445
23239
  ],
22446
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
23240
+ recommendedFooterLookIds: ["footer-links-row"],
22447
23241
  buttonStyleChoices: [
22448
23242
  buttonChoice("ornate-ritual"),
22449
23243
  buttonChoice("joy-stamp"),
@@ -22490,7 +23284,22 @@ const curatedSiteStyles = [
22490
23284
  } }
22491
23285
  },
22492
23286
  recommendedAppearancePresetIds: ["feature-cards-bold-colors", "testimonials-statement-cards"],
22493
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
23287
+ footerLookRecipes: { "footer-links-row": {
23288
+ arrangement: "simple",
23289
+ ground: {
23290
+ kind: "token",
23291
+ token: "surface"
23292
+ },
23293
+ nav: {
23294
+ weight: "medium",
23295
+ colorToken: "text",
23296
+ hoverColorToken: "primary",
23297
+ typography: "body"
23298
+ },
23299
+ legal: { kind: "integrated" },
23300
+ brandAlign: "start"
23301
+ } },
23302
+ recommendedFooterLookIds: ["footer-links-row"],
22494
23303
  buttonStyleChoices: [
22495
23304
  buttonChoice("joy-stamp"),
22496
23305
  buttonChoice("ink-stamp"),
@@ -22542,7 +23351,7 @@ const curatedSiteStyles = [
22542
23351
  },
22543
23352
  testimonialQuote: serifDisplayQuote
22544
23353
  },
22545
- recommendedFooterLookIds: ["footer-links-quiet"],
23354
+ recommendedFooterLookIds: ["footer-links-row"],
22546
23355
  buttonStyleChoices: [
22547
23356
  buttonChoice("fulcrum"),
22548
23357
  buttonChoice("editorial-link"),
@@ -22619,7 +23428,7 @@ const curatedSiteStyles = [
22619
23428
  "faq-base-accordion",
22620
23429
  "booking-brand-band"
22621
23430
  ],
22622
- recommendedFooterLookIds: ["footer-links-quiet"],
23431
+ recommendedFooterLookIds: ["footer-links-row"],
22623
23432
  buttonStyleChoices: [
22624
23433
  buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
22625
23434
  buttonChoice("flat-ink"),
@@ -22657,7 +23466,22 @@ const curatedSiteStyles = [
22657
23466
  accordions: boldBorderedAccordionSystem,
22658
23467
  testimonialQuote: accentGlyphQuote
22659
23468
  },
22660
- recommendedFooterLookIds: ["footer-links-emphasized"],
23469
+ footerLookRecipes: { "footer-links-row": {
23470
+ arrangement: "simple",
23471
+ ground: {
23472
+ kind: "token",
23473
+ token: "surface"
23474
+ },
23475
+ nav: {
23476
+ weight: "medium",
23477
+ colorToken: "text",
23478
+ hoverColorToken: "primary",
23479
+ typography: "body"
23480
+ },
23481
+ legal: { kind: "integrated" },
23482
+ brandAlign: "start"
23483
+ } },
23484
+ recommendedFooterLookIds: ["footer-links-row"],
22661
23485
  buttonStyleChoices: [
22662
23486
  buttonChoice("offset-block"),
22663
23487
  buttonChoice("ink-stamp"),
@@ -22696,8 +23520,29 @@ const curatedSiteStyles = [
22696
23520
  accordions: warmInsetAccordionSystem,
22697
23521
  testimonialQuote: serifDisplayQuote
22698
23522
  },
22699
- recommendedFooterLookIds: ["footer-links-quiet"],
23523
+ footerLookRecipes: { "footer-centred-name": {
23524
+ arrangement: "centred",
23525
+ ground: {
23526
+ kind: "style-surface",
23527
+ surface: "deep"
23528
+ },
23529
+ nav: {
23530
+ weight: "regular",
23531
+ colorToken: "text",
23532
+ hoverColorToken: "primary",
23533
+ typography: "heading"
23534
+ },
23535
+ legal: {
23536
+ kind: "separate",
23537
+ bar: null
23538
+ },
23539
+ brandAlign: "center"
23540
+ } },
23541
+ recommendedFooterLookIds: ["footer-centred-name", "footer-links-row"],
22700
23542
  buttonStyleChoices: [
23543
+ buttonChoice("gilt-slab"),
23544
+ buttonChoice("hairline-tab"),
23545
+ buttonChoice("marquee"),
22701
23546
  buttonChoice("ringed-pill"),
22702
23547
  buttonChoice("earth-pill"),
22703
23548
  buttonChoice("editorial-link")
@@ -22732,7 +23577,7 @@ const curatedSiteStyles = [
22732
23577
  accordions: editorialDividedAccordionSystem,
22733
23578
  testimonialQuote: serifDisplayQuote
22734
23579
  },
22735
- recommendedFooterLookIds: ["footer-links-quiet"],
23580
+ recommendedFooterLookIds: ["footer-links-row"],
22736
23581
  buttonStyleChoices: [
22737
23582
  buttonChoice("flat-ink", void 0, { corners: "square" }),
22738
23583
  buttonChoice("editorial-link"),
@@ -22760,6 +23605,7 @@ function curatedStyleTemplate(input) {
22760
23605
  }
22761
23606
  curatedSiteStyles.forEach((style) => {
22762
23607
  if (style.looks.kind === "offers") validateLookFallbacks(style.looks);
23608
+ (/* @__PURE__ */ new Set([...Object.values(style.footerLookRecipes ?? {}), ...style.recommendedFooterLookIds.map((id) => resolveFooterLookRecipe(style, id))])).forEach((recipe) => validateFooterRecipeSurfaces(style, recipe));
22763
23609
  });
22764
23610
  //#endregion
22765
23611
  //#region ../theme-core/src/site-styles/effectiveArrangement.ts
@@ -22835,29 +23681,6 @@ const blockDesignFallback = {
22835
23681
  };
22836
23682
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
22837
23683
  //#endregion
22838
- //#region ../theme-core/src/header/rootPaint.ts
22839
- /** The nav container takes precedence when a floating header also has one. */
22840
- function headerRootPaint(header) {
22841
- const navContainerType = header?.navContainer?.type ?? "none";
22842
- if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
22843
- return header?.variant === "floating" ? "overlay" : "own-surface";
22844
- }
22845
- //#endregion
22846
- //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
22847
- const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
22848
- const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
22849
- siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
22850
- function parseSiteChromeBackgroundColorToken(value) {
22851
- const token = parseBackgroundAppearanceColorToken(value);
22852
- return token ? token : null;
22853
- }
22854
- function toSiteChromeBackgroundColorTokens(tokenNames) {
22855
- return tokenNames.flatMap((name) => {
22856
- const token = parseSiteChromeBackgroundColorToken(name);
22857
- return token ? [token] : [];
22858
- });
22859
- }
22860
- //#endregion
22861
23684
  //#region ../theme-core/src/site-styles/siteChromeNavPreferences.ts
22862
23685
  const headerNavTypographyPreferenceValues = [
22863
23686
  "inherit",
@@ -22973,21 +23796,6 @@ z.object({
22973
23796
  }).strict();
22974
23797
  //#endregion
22975
23798
  //#region ../theme-core/src/site-styles/headerPreferencesPersistence.ts
22976
- const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
22977
- const token = parseSiteChromeBackgroundColorToken(value);
22978
- if (token === null) {
22979
- ctx.addIssue({
22980
- code: "custom",
22981
- message: "Unknown site chrome background colour token"
22982
- });
22983
- return z.NEVER;
22984
- }
22985
- return token;
22986
- });
22987
- const backgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
22988
- kind: z.literal("color"),
22989
- token: backgroundColorTokenSchema
22990
- }).strict()]);
22991
23799
  const logoTextIntentSchema = z.object({
22992
23800
  mobileMaxWidth: z.enum([
22993
23801
  "xs",
@@ -23013,7 +23821,7 @@ const headerPreferencesShape = {
23013
23821
  navFontRole: z.enum(headerNavTypographyPreferenceValues),
23014
23822
  navTextSize: z.enum(headerNavFontSizePreferenceValues),
23015
23823
  interactionPalette: z.union([z.literal("recommended"), z.enum(headerInteractionPaletteValues)]),
23016
- background: backgroundOverrideSchema,
23824
+ background: siteChromeBackgroundOverrideSchema,
23017
23825
  structure: structureSchema
23018
23826
  };
23019
23827
  z.object(headerPreferencesShape).strict();
@@ -23022,167 +23830,6 @@ z.object(headerPreferencesShape).omit({
23022
23830
  structure: true
23023
23831
  }).strict();
23024
23832
  //#endregion
23025
- //#region ../theme-core/src/navigation/presets.ts
23026
- /**
23027
- * Built-in nav link style presets
23028
- *
23029
- * Each preset uses composable effects to achieve its look.
23030
- */
23031
- const NAV_LINK_PRESETS = {
23032
- /**
23033
- * Minimal - subtle color change on hover
23034
- */
23035
- minimal: {
23036
- name: "Minimal",
23037
- typography: "body",
23038
- fontWeight: "medium",
23039
- textTransform: "none",
23040
- italic: false,
23041
- colorToken: "text",
23042
- hoverColorToken: "primary",
23043
- padding: "none",
23044
- borderRadius: "none",
23045
- effects: { hover: [{
23046
- effectId: "text-color-change",
23047
- options: { hoverColorToken: "primary" }
23048
- }] }
23049
- },
23050
- /**
23051
- * Underline - static underline appears on hover
23052
- */
23053
- underline: {
23054
- name: "Underline",
23055
- typography: "body",
23056
- fontWeight: "medium",
23057
- textTransform: "none",
23058
- italic: false,
23059
- colorToken: "text",
23060
- padding: "none",
23061
- borderRadius: "none",
23062
- effects: { hover: [{
23063
- effectId: "nav-underline",
23064
- options: { style: "static" }
23065
- }] }
23066
- },
23067
- /**
23068
- * Underline Grow - animated underline grows from center on hover
23069
- */
23070
- "underline-grow": {
23071
- name: "Underline Grow",
23072
- typography: "body",
23073
- fontWeight: "medium",
23074
- textTransform: "none",
23075
- italic: false,
23076
- colorToken: "text",
23077
- padding: "none",
23078
- borderRadius: "none",
23079
- effects: { hover: [{
23080
- effectId: "nav-underline",
23081
- options: { style: "grow" }
23082
- }] }
23083
- },
23084
- /**
23085
- * Capsule - pill-shaped background on hover
23086
- */
23087
- capsule: {
23088
- name: "Capsule",
23089
- typography: "body",
23090
- fontWeight: "medium",
23091
- textTransform: "none",
23092
- italic: false,
23093
- colorToken: "text",
23094
- padding: "compact",
23095
- borderRadius: "full",
23096
- effects: {
23097
- hover: [{
23098
- effectId: "background-on-hover-alpha",
23099
- options: {
23100
- colorToken: "primary",
23101
- opacity: 10
23102
- }
23103
- }],
23104
- active: [{
23105
- effectId: "background-on-hover-alpha",
23106
- options: {
23107
- colorToken: "primary",
23108
- opacity: 15
23109
- }
23110
- }]
23111
- }
23112
- },
23113
- /**
23114
- * Solid - solid background color on hover
23115
- */
23116
- solid: {
23117
- name: "Solid",
23118
- typography: "body",
23119
- fontWeight: "medium",
23120
- textTransform: "none",
23121
- italic: false,
23122
- colorToken: "text",
23123
- padding: "compact",
23124
- borderRadius: "none",
23125
- effects: {
23126
- hover: [{
23127
- effectId: "background-on-hover",
23128
- options: {
23129
- colorToken: "primary",
23130
- textColorToken: "primaryForeground"
23131
- }
23132
- }],
23133
- active: [{
23134
- effectId: "background-on-hover",
23135
- options: {
23136
- colorToken: "primary",
23137
- textColorToken: "primaryForeground"
23138
- }
23139
- }]
23140
- }
23141
- },
23142
- /**
23143
- * Scale - gentle scale-up on hover
23144
- */
23145
- scale: {
23146
- name: "Scale",
23147
- typography: "body",
23148
- fontWeight: "medium",
23149
- textTransform: "none",
23150
- italic: false,
23151
- colorToken: "text",
23152
- padding: "none",
23153
- borderRadius: "none",
23154
- effects: { hover: [{
23155
- effectId: "scale-up",
23156
- options: { scale: 1.05 }
23157
- }] }
23158
- },
23159
- /**
23160
- * Frosted - semi-transparent glass-like background
23161
- */
23162
- frosted: {
23163
- name: "Frosted",
23164
- typography: "body",
23165
- fontWeight: "medium",
23166
- textTransform: "none",
23167
- italic: false,
23168
- colorToken: "text",
23169
- padding: "compact",
23170
- borderRadius: "md",
23171
- effects: {
23172
- base: [{ effectId: "nav-frosted-base" }],
23173
- hover: [{ effectId: "nav-frosted-hover" }],
23174
- active: [{ effectId: "nav-frosted-active" }]
23175
- }
23176
- }
23177
- };
23178
- /**
23179
- * Get a nav link style preset by ID
23180
- */
23181
- function getNavLinkPreset(presetId) {
23182
- return NAV_LINK_PRESETS[presetId];
23183
- }
23184
- Object.keys(NAV_LINK_PRESETS);
23185
- //#endregion
23186
23833
  //#region ../theme-core/src/header/legacyNavLinkStyle.ts
23187
23834
  function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
23188
23835
  const navStyle = header.navStyle ?? "minimal";
@@ -23427,28 +24074,6 @@ z.object({
23427
24074
  motion: z.enum(themeTokenRecipeOptions.motion)
23428
24075
  });
23429
24076
  //#endregion
23430
- //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
23431
- function effectiveFooterNavLinkStyle(footer) {
23432
- if (!footer) return null;
23433
- if (footer.navLinkStyle) return footer.navLinkStyle;
23434
- const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
23435
- if (!basePreset) return null;
23436
- return {
23437
- ...basePreset,
23438
- fontWeight: footer.navWeight ?? basePreset.fontWeight,
23439
- colorToken: footer.navColor?.trim() || basePreset.colorToken
23440
- };
23441
- }
23442
- function footerForegroundCandidates(footer, proseHoverCandidate) {
23443
- if (!footer) return {};
23444
- const style = effectiveFooterNavLinkStyle(footer);
23445
- return {
23446
- text: footer.background?.textColor,
23447
- link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
23448
- linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
23449
- };
23450
- }
23451
- //#endregion
23452
24077
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
23453
24078
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
23454
24079
  //#endregion
@@ -26544,7 +27169,12 @@ function resolveRuntimeSectionSurface(value, context, options) {
26544
27169
  }
26545
27170
  function arrangementSurfaceInk(foreground, context) {
26546
27171
  if (context.data?._lookSlots === void 0) return {};
26547
- const decorations = surfaceDecorationColors(foreground, context.theme.palette);
27172
+ return surfaceInkStyles(foreground, context.theme.palette);
27173
+ }
27174
+ /** Decoration roles already resolved by the surface owner, shared with footer arrangements. */
27175
+ function surfaceInkStyles(foreground, palette) {
27176
+ if (foreground.kind === "unknown") return {};
27177
+ const decorations = surfaceDecorationColors(foreground, palette);
26548
27178
  return {
26549
27179
  "--rb-surface-muted-color": foreground.roles.muted ?? foreground.roles.text,
26550
27180
  ...decorations ? {
@@ -27155,48 +27785,50 @@ const boxStylesTransforms = [
27155
27785
  ];
27156
27786
  //#endregion
27157
27787
  //#region ../blocks/src/system/node/fragments/responsiveTwoColumn.ts
27158
- function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapClassName = "rb-gap-6", gapFrom, gapFallback = "comfortable", containerClassName = "rb-flex rb-flex-col rb-md-flex-row", imageWrapperClassName = "rb-w-full rb-shrink-0", textWrapperClassName = "rb-w-full rb-min-w-0 rb-flex-1" }) {
27159
- const baseClass = !gapFrom ? `${containerClassName} ${gapClassName}`.trim() : containerClassName;
27160
- const props = { className: { $bind: {
27161
- from: imagePositionFrom,
27162
- transforms: [{
27163
- id: "ui.twoColumnContainerClass",
27164
- options: {
27165
- base: baseClass,
27166
- reverseClass: "rb-md-flex-row-reverse"
27167
- }
27168
- }],
27169
- fallback: baseClass
27170
- } } };
27171
- if (gapFrom) props.style = { gap: { $bind: {
27172
- from: gapFrom,
27173
- transforms: [{
27174
- id: "boxStyles.semanticGapValue",
27175
- options: { fallback: gapFallback }
27176
- }],
27177
- fallback: GAP_VALUE_MAP[gapFallback]
27178
- } } };
27179
- return el("div", props, [el("div", {
27180
- className: imageWrapperClassName,
27181
- style: { flexBasis: { $bind: {
27182
- from: ratioFrom,
27788
+ /** The shared two-column shell keeps Look hooks opt-in and absent for legacy content. */
27789
+ function responsiveTwoColumn(config) {
27790
+ return el("div", twoColumnProps(config), [twoColumnWrapper(config, "image", config.image), twoColumnWrapper(config, "text", config.text)]);
27791
+ }
27792
+ function twoColumnProps(config) {
27793
+ const base = `${config.containerClassName ?? "rb-flex rb-flex-col rb-md-flex-row"} ${config.gapFrom ? "" : config.gapClassName ?? "rb-gap-6"}`.trim();
27794
+ const fallback = config.gapFallback ?? "comfortable";
27795
+ return {
27796
+ ...config.lookSlots ? lookSlot("frame") : {},
27797
+ className: { $bind: {
27798
+ from: config.imagePositionFrom,
27183
27799
  transforms: [{
27184
- id: "ui.twoColumnFlexBasis",
27185
- options: { side: "image" }
27800
+ id: "ui.twoColumnContainerClass",
27801
+ options: {
27802
+ base,
27803
+ reverseClass: "rb-md-flex-row-reverse"
27804
+ }
27186
27805
  }],
27187
- fallback: "50%"
27188
- } } }
27189
- }, [image]), el("div", {
27190
- className: textWrapperClassName,
27806
+ fallback: base
27807
+ } },
27808
+ ...config.gapFrom ? { style: { gap: { $bind: {
27809
+ from: config.gapFrom,
27810
+ transforms: [{
27811
+ id: "boxStyles.semanticGapValue",
27812
+ options: { fallback }
27813
+ }],
27814
+ fallback: GAP_VALUE_MAP[fallback]
27815
+ } } } } : {}
27816
+ };
27817
+ }
27818
+ function twoColumnWrapper(config, side, child) {
27819
+ const className = side === "image" ? config.imageWrapperClassName ?? "rb-w-full rb-shrink-0" : config.textWrapperClassName ?? "rb-w-full rb-min-w-0 rb-flex-1";
27820
+ return el("div", {
27821
+ ...config.lookSlots ? lookSlot(side === "image" ? "media" : "copy") : {},
27822
+ className,
27191
27823
  style: { flexBasis: { $bind: {
27192
- from: ratioFrom,
27824
+ from: config.ratioFrom,
27193
27825
  transforms: [{
27194
27826
  id: "ui.twoColumnFlexBasis",
27195
- options: { side: "text" }
27827
+ options: { side }
27196
27828
  }],
27197
27829
  fallback: "50%"
27198
27830
  } } }
27199
- }, [text])]);
27831
+ }, [child]);
27200
27832
  }
27201
27833
  //#endregion
27202
27834
  //#region ../blocks/src/system/node/fragments/styledCard.ts
@@ -27383,6 +28015,47 @@ function sectionState(opts) {
27383
28015
  })]);
27384
28016
  }
27385
28017
  //#endregion
28018
+ //#region ../blocks/src/system/node/fragments/sectionHead.ts
28019
+ const recoverEmptyHeadingWhenActive = {
28020
+ kind: "recover-empty-when-active",
28021
+ placeholder: "Add heading"
28022
+ };
28023
+ const recoverEmptyDescriptionWhenActive = {
28024
+ kind: "recover-empty-when-active",
28025
+ placeholder: "Add description"
28026
+ };
28027
+ function sectionHeaderLayoutNodes(options = {}) {
28028
+ const headingNode = text({
28029
+ as: "h2",
28030
+ ...lookSlot("heading")
28031
+ }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
28032
+ const descriptionNode = richText({
28033
+ className: "rb-prose rb-max-w-none",
28034
+ ...lookSlot("intro")
28035
+ }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
28036
+ if (options.splitClassName) return [el("div", {
28037
+ className: options.splitClassName,
28038
+ ...lookSlot("head")
28039
+ }, [headingNode, descriptionNode])];
28040
+ return [headingNode, descriptionNode];
28041
+ }
28042
+ /** Shared optional section copy. Existing consumers keep their description ID. */
28043
+ const sectionHeaderFields = (defaultHeading, introLabel = "Description") => [{
28044
+ id: "heading",
28045
+ type: "text",
28046
+ label: "Heading",
28047
+ description: "Main heading for the section",
28048
+ required: false,
28049
+ multiline: false,
28050
+ ...defaultHeading === void 0 ? {} : { defaultValue: defaultHeading }
28051
+ }, {
28052
+ id: "description",
28053
+ type: "richText",
28054
+ label: introLabel,
28055
+ description: "Optional introductory text",
28056
+ required: false
28057
+ }];
28058
+ //#endregion
27386
28059
  //#region ../blocks/src/system/fragments/types.ts
27387
28060
  const FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
27388
28061
  const FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;
@@ -27715,6 +28388,7 @@ const bodyCopyFragment = defineFragment({
27715
28388
  ],
27716
28389
  layout: stack({
27717
28390
  gap: "md",
28391
+ ...lookSlot("copy"),
27718
28392
  className: "body-copy-container",
27719
28393
  align: { $bind: {
27720
28394
  from: "content.alignment",
@@ -27723,6 +28397,7 @@ const bodyCopyFragment = defineFragment({
27723
28397
  } }
27724
28398
  }, [text({
27725
28399
  as: "h2",
28400
+ ...lookSlot("heading"),
27726
28401
  className: { $bind: {
27727
28402
  from: "content.alignment",
27728
28403
  transforms: [{
@@ -27731,14 +28406,22 @@ const bodyCopyFragment = defineFragment({
27731
28406
  }],
27732
28407
  fallback: "body-copy-heading"
27733
28408
  } }
27734
- }, when("content.heading"), bind("content.heading")), richText({ className: { $bind: {
27735
- from: "content.alignment",
27736
- transforms: [{
27737
- id: "ui.bodyClassFromAlignment",
27738
- options: { base: "body-copy-body rb-prose rb-max-w-none" }
27739
- }],
27740
- fallback: "body-copy-body rb-prose rb-max-w-none"
27741
- } } }, bind("content.body"))])
28409
+ }, when("content.heading", { authoringPresence: {
28410
+ kind: "recover-empty-when-active",
28411
+ placeholder: "Add heading"
28412
+ } }), bind("content.heading")), richText({
28413
+ ...lookSlot("item-body"),
28414
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
28415
+ lookSlots: { $bind: { from: "content._lookSlots" } },
28416
+ className: { $bind: {
28417
+ from: "content.alignment",
28418
+ transforms: [{
28419
+ id: "ui.bodyClassFromAlignment",
28420
+ options: { base: "body-copy-body rb-prose rb-max-w-none" }
28421
+ }],
28422
+ fallback: "body-copy-body rb-prose rb-max-w-none"
28423
+ } }
28424
+ }, bind("content.body"))])
27742
28425
  });
27743
28426
  //#endregion
27744
28427
  //#region ../blocks/src/system/fragments/library/heroCopy.ts
@@ -28754,8 +29437,19 @@ const formCopyFragment = defineFragment({
28754
29437
  }],
28755
29438
  layout: [text({
28756
29439
  as: "h2",
29440
+ ...lookSlot("heading"),
28757
29441
  className: "form-copy-title"
28758
- }, when("content.title"), bind("content.title")), richText({ className: "form-copy-intro rb-prose rb-max-w-none" }, when("content.intro"), bind("content.intro"))]
29442
+ }, when("content.title", { authoringPresence: {
29443
+ kind: "recover-empty-when-active",
29444
+ placeholder: "Add heading"
29445
+ } }), bind("content.title")), richText({
29446
+ className: "form-copy-intro rb-prose rb-max-w-none",
29447
+ ...lookSlot("intro"),
29448
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } }
29449
+ }, when("content.intro", { authoringPresence: {
29450
+ kind: "recover-empty-when-active",
29451
+ placeholder: "Add introduction"
29452
+ } }), bind("content.intro"))]
28759
29453
  });
28760
29454
  //#endregion
28761
29455
  //#region ../blocks/src/system/helpers/api-bindings.ts
@@ -28804,6 +29498,7 @@ const formEmbedFragment = defineFragment({
28804
29498
  }
28805
29499
  ],
28806
29500
  layout: [form(withApiBindings({
29501
+ lookSlots: { $bind: { from: "content._lookSlots" } },
28807
29502
  spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
28808
29503
  submitLabel: { $bind: { from: "submitLabel" } },
28809
29504
  successMessage: { $bind: { from: "successMessage" } }
@@ -29057,8 +29752,18 @@ const newsletterCopyFragment = defineFragment({
29057
29752
  }],
29058
29753
  layout: [text({
29059
29754
  as: "h2",
29060
- className: "newsletter-copy-title"
29061
- }, when("content.title"), bind("content.title")), richText({ className: "newsletter-copy-subtitle rb-prose rb-max-w-none" }, when("content.subtitle"), bind("content.subtitle"))]
29755
+ className: "newsletter-copy-title",
29756
+ ...lookSlot("heading")
29757
+ }, when("content.title", { authoringPresence: {
29758
+ kind: "recover-empty-when-active",
29759
+ placeholder: "Add heading"
29760
+ } }), bind("content.title")), richText({
29761
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none",
29762
+ ...lookSlot("intro")
29763
+ }, when("content.subtitle", { authoringPresence: {
29764
+ kind: "recover-empty-when-active",
29765
+ placeholder: "Add introduction"
29766
+ } }), bind("content.subtitle"))]
29062
29767
  });
29063
29768
  //#endregion
29064
29769
  //#region ../blocks/src/system/fragments/library/newsletterForm.ts
@@ -29126,6 +29831,7 @@ const newsletterFormFragment = defineFragment({
29126
29831
  }
29127
29832
  ],
29128
29833
  layout: [el("newsletter-form", withApiBindings({
29834
+ lookSlots: { $bind: { from: "content._lookSlots" } },
29129
29835
  source: { $bind: {
29130
29836
  from: "mailingListSource",
29131
29837
  fallback: "block"
@@ -30618,18 +31324,11 @@ const introBlockDefinition = { manifest: createBlockManifest({
30618
31324
  //#endregion
30619
31325
  //#region ../blocks/src/system/blocks/body-text.ts
30620
31326
  const bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
30621
- const proseLayout = styledSection({
30622
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
30623
- spacing: "medium",
30624
- baseClass: ""
30625
- });
30626
- const introLayout = styledSection({
30627
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
30628
- spacing: "medium",
30629
- baseClass: ""
30630
- });
30631
- const narrowLayout = styledSection({
30632
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
31327
+ const bodyTextLayout = styledSection({
31328
+ children: stack({
31329
+ className: "rb-container",
31330
+ ...lookSlot("frame")
31331
+ }, bodyCopyComposition.layout),
30633
31332
  spacing: "medium",
30634
31333
  baseClass: ""
30635
31334
  });
@@ -30643,11 +31342,11 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
30643
31342
  fragment: bodyCopyFragment,
30644
31343
  fieldPriority: 0
30645
31344
  }],
30646
- layout: proseLayout,
31345
+ layout: bodyTextLayout,
30647
31346
  variants: {
30648
- prose: proseLayout,
30649
- intro: introLayout,
30650
- narrow: narrowLayout
31347
+ prose: bodyTextLayout,
31348
+ intro: bodyTextLayout,
31349
+ narrow: bodyTextLayout
30651
31350
  },
30652
31351
  variantMeaning: { kind: "arrangement" },
30653
31352
  defaultVariant: "prose",
@@ -31095,6 +31794,52 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
31095
31794
  styleTokens: { spacing: "md" }
31096
31795
  }) };
31097
31796
  //#endregion
31797
+ //#region ../blocks/src/system/runtime/lookSurfaces.ts
31798
+ const isPlainObject$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
31799
+ const lookListPresentationSchemaShape = {
31800
+ sectionAction: z.object({
31801
+ label: z.string(),
31802
+ href: z.string()
31803
+ }).optional(),
31804
+ actionSize: z.enum([
31805
+ "sm",
31806
+ "md",
31807
+ "lg"
31808
+ ]).optional(),
31809
+ itemActionStyle: z.enum(["button", "link"]).optional(),
31810
+ itemRoles: z.object({
31811
+ container: z.enum([
31812
+ "card",
31813
+ "statement",
31814
+ "highlight"
31815
+ ]).optional(),
31816
+ items: z.enum([
31817
+ "card",
31818
+ "statement",
31819
+ "highlight"
31820
+ ]).optional(),
31821
+ at: z.partialRecord(z.enum([
31822
+ "first",
31823
+ "last",
31824
+ "middle",
31825
+ "odd",
31826
+ "even"
31827
+ ]), z.enum([
31828
+ "card",
31829
+ "statement",
31830
+ "highlight"
31831
+ ])).optional()
31832
+ }).optional(),
31833
+ roleSurfaces: z.record(z.enum([
31834
+ "card",
31835
+ "statement",
31836
+ "highlight"
31837
+ ]), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
31838
+ panelHeading: z.string().optional(),
31839
+ lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
31840
+ itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
31841
+ };
31842
+ //#endregion
31098
31843
  //#region ../blocks/src/contracts/runtime.ts
31099
31844
  function decodeSuccess(value) {
31100
31845
  return {
@@ -31201,6 +31946,7 @@ const formFieldGroupSchema = z.discriminatedUnion("type", [z.object({
31201
31946
  fields: z.tuple([formFieldSchema, formFieldSchema])
31202
31947
  })]);
31203
31948
  const formSourceSchema = z.object({
31949
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
31204
31950
  value: formRecordSchema.optional(),
31205
31951
  siteId: z.string().optional(),
31206
31952
  apiBaseUrl: z.string().optional(),
@@ -31210,6 +31956,7 @@ const formSourceSchema = z.object({
31210
31956
  spamProtectionEnabled: z.boolean().optional()
31211
31957
  });
31212
31958
  const formDisplaySchema = z.object({
31959
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
31213
31960
  kind: z.literal("form"),
31214
31961
  state: z.enum(["missing", "ready"]),
31215
31962
  className: z.string().nullable(),
@@ -31230,17 +31977,30 @@ z.object({
31230
31977
  });
31231
31978
  function buildFormDisplay(source) {
31232
31979
  const form = source.value ?? null;
31233
- const fields = form?.schemaJson?.fields;
31234
- const groups = Array.isArray(fields) ? groupFormFields(fields) : [];
31980
+ const fields = formDisplayFields(form);
31235
31981
  return {
31236
31982
  kind: "form",
31237
- state: form ? "ready" : "missing",
31983
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
31984
+ state: fields.state,
31238
31985
  className: source.className ?? null,
31239
- formId: form?.id ?? null,
31986
+ formId: fields.formId,
31240
31987
  submitLabel: source.submitLabel?.trim() || "Submit",
31241
31988
  successMessage: source.successMessage ?? null,
31242
31989
  form,
31243
- groups
31990
+ groups: fields.groups
31991
+ };
31992
+ }
31993
+ function formDisplayFields(form) {
31994
+ if (!form) return {
31995
+ state: "missing",
31996
+ formId: null,
31997
+ groups: []
31998
+ };
31999
+ const fields = form.schemaJson?.fields;
32000
+ return {
32001
+ state: "ready",
32002
+ formId: form.id,
32003
+ groups: Array.isArray(fields) ? groupFormFields(fields) : []
31244
32004
  };
31245
32005
  }
31246
32006
  const formBlockRuntime = defineProgressiveBlockRuntime({
@@ -31263,18 +32023,27 @@ function fragmentLayoutNode$1(layout) {
31263
32023
  function isNodeDefinitionArray$1(layout) {
31264
32024
  return Array.isArray(layout);
31265
32025
  }
31266
- const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
32026
+ const copyLayout = props(lookSlot("head"))(fragmentLayoutNode$1(formCopyFragment.layout));
32027
+ const embedLayout$1 = fragmentLayoutNode$1(formEmbedFragment.layout);
31267
32028
  const formSurface = styledContainer({
32029
+ rootProps: lookSlot("panel"),
31268
32030
  bindFrom: "_containerStyles",
31269
32031
  constrainWidth: false,
31270
32032
  baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
31271
- children: fragmentLayoutNode$1(formEmbedFragment.layout)
32033
+ children: embedLayout$1
31272
32034
  });
31273
32035
  function createFormLayout(variant) {
31274
32036
  if (variant === "two-column") return styledSection({
31275
- children: el("div", { className: "rb-container" }, [el("div", { className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start" }, [stack({
32037
+ children: el("div", {
32038
+ className: "rb-container",
32039
+ ...lookSlot("layout")
32040
+ }, [el("div", {
32041
+ className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start",
32042
+ ...lookSlot("frame")
32043
+ }, [stack({
31276
32044
  gap: "md",
31277
- className: "rb-form-copy-column"
32045
+ className: "rb-form-copy-column",
32046
+ ...lookSlot("copy")
31278
32047
  }, [copyLayout]), formSurface])]),
31279
32048
  baseClass: "",
31280
32049
  spacing: "medium",
@@ -31302,6 +32071,15 @@ const formManifest = createBlockManifest({
31302
32071
  description: "Renders a saved form definition with server-side submit.",
31303
32072
  includeContainerStyles: true,
31304
32073
  fragments: [{ fragment: formCopyFragment }, { fragment: formEmbedFragment }],
32074
+ additionalFields: [{
32075
+ id: "archFrame",
32076
+ type: "boolean",
32077
+ label: "Arch frame",
32078
+ ui: {
32079
+ intent: "display",
32080
+ hidden: true
32081
+ }
32082
+ }],
31305
32083
  layout: formLayout,
31306
32084
  variants: {
31307
32085
  default: formLayout,
@@ -32057,7 +32835,7 @@ const heroTitleLengthThresholds = {
32057
32835
  maxWords: 11
32058
32836
  }
32059
32837
  };
32060
- function isPlainObject$1(value) {
32838
+ function isPlainObject(value) {
32061
32839
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
32062
32840
  }
32063
32841
  function readString(obj, key) {
@@ -32066,7 +32844,7 @@ function readString(obj, key) {
32066
32844
  }
32067
32845
  function resolveGeneratedHeroLayoutStyles(content) {
32068
32846
  const raw = content._heroLayoutStyles;
32069
- return isPlainObject$1(raw) ? raw : null;
32847
+ return isPlainObject(raw) ? raw : null;
32070
32848
  }
32071
32849
  function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
32072
32850
  const explicitValue = readString(content, fallbackKey);
@@ -32124,7 +32902,7 @@ const heroContentWrapperClassTransform = {
32124
32902
  summary: "Resolve hero content wrapper className from alignment + max width controls",
32125
32903
  schema: z.object({ base: z.string().optional() }),
32126
32904
  run: (value, options, context) => {
32127
- const content = isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {};
32905
+ const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
32128
32906
  const alignment = resolveHeroContentAlignment(content);
32129
32907
  const maxWidth = resolveHeroContentMaxWidth(content);
32130
32908
  const typographyScale = resolveHeroTypographyScale(content);
@@ -32146,7 +32924,7 @@ const heroCtaJustifyTransform = {
32146
32924
  kind: "string",
32147
32925
  summary: "Map hero contentAlignment to CTA row justify value",
32148
32926
  run: (value, _options, context) => {
32149
- const alignment = resolveHeroContentAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
32927
+ const alignment = resolveHeroContentAlignment(isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {});
32150
32928
  return alignment === "left" ? "start" : alignment === "right" ? "end" : "center";
32151
32929
  }
32152
32930
  };
@@ -32155,7 +32933,7 @@ const heroStackJustifyFromVerticalAlignmentTransform = {
32155
32933
  kind: "string",
32156
32934
  summary: "Map hero verticalAlignment to stack justify value",
32157
32935
  run: (value, _options, context) => {
32158
- const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
32936
+ const vertical = resolveHeroVerticalAlignment(isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {});
32159
32937
  return vertical === "top" ? "start" : vertical === "bottom" ? "end" : "center";
32160
32938
  }
32161
32939
  };
@@ -32165,7 +32943,7 @@ const heroGridClassFromVerticalAlignmentTransform = {
32165
32943
  summary: "Append align-items class for hero split layouts based on verticalAlignment",
32166
32944
  schema: z.object({ base: z.string() }),
32167
32945
  run: (value, options, context) => {
32168
- const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
32946
+ const vertical = resolveHeroVerticalAlignment(isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {});
32169
32947
  const itemsClass = vertical === "top" ? "rb-items-start" : vertical === "bottom" ? "rb-items-end" : "rb-items-center";
32170
32948
  return joinClasses$1([options.base, itemsClass]);
32171
32949
  }
@@ -32453,6 +33231,25 @@ function heroHeadlineText(content, policy) {
32453
33231
  return policy === "look" ? inlineTextToPlainText(coerceInlineTextWithFallback(content.headlineInline, plain)).trim() : plain?.trim() ?? "";
32454
33232
  }
32455
33233
  //#endregion
33234
+ //#region ../blocks/src/system/transforms/registry/footerArrangement.ts
33235
+ const footerBrandArrangementTransform = {
33236
+ id: "layout.footerBrandArrangement",
33237
+ kind: "string",
33238
+ run: (value) => {
33239
+ const module = asPartialObject(value);
33240
+ return module?.kind === "brand" ? module.slots ? "centred" : "row" : void 0;
33241
+ }
33242
+ };
33243
+ const footerModuleInkStyleTransform = {
33244
+ id: "layout.footerModuleInkStyle",
33245
+ kind: "formatter",
33246
+ run: (value, options) => value === "centred" ? void 0 : textColorStyle(asPartialObject(options)?.opacity === 70 ? "text/70" : "text/80")
33247
+ };
33248
+ /** A centred base without authored bar paint inherits its measured surface line. */
33249
+ function footerBottomBarBorderColorStyle(footer) {
33250
+ return footer?.variant === "centred" && !footer.bottomBar ? { borderColor: "var(--rb-surface-line-color)" } : borderColorStyle(footer?.bottomBar?.borderTop?.colorToken ?? "border");
33251
+ }
33252
+ //#endregion
32456
33253
  //#region ../blocks/src/system/runtime/header/runtimeContract.ts
32457
33254
  const headerScrollRuntimeSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("none") }), z.object({ kind: z.literal("threshold") })]);
32458
33255
  z.object({ scroll: headerScrollRuntimeSchema });
@@ -32684,6 +33481,7 @@ const footerRootStyleTransform = {
32684
33481
  }
32685
33482
  }
32686
33483
  styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
33484
+ if (footer?.variant === "centred") styleParts.push(surfaceInkStyles(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate), context.theme.palette));
32687
33485
  styleParts.push(borderColorStyle("border"));
32688
33486
  return mergeStyles(...styleParts);
32689
33487
  }
@@ -32745,7 +33543,7 @@ const footerBottomBarStyleTransform = {
32745
33543
  run: (value, _options, context) => {
32746
33544
  const footer = asPartialObject(value);
32747
33545
  const bottomBar = footer?.bottomBar;
32748
- return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : void 0, borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
33546
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : void 0, footerBottomBarBorderColorStyle(footer), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
32749
33547
  }
32750
33548
  };
32751
33549
  function footerBottomBarForegroundStyle(footer, palette) {
@@ -32767,62 +33565,15 @@ function measuredFooterBackdrop(footer, palette) {
32767
33565
  const foreground = resolveFooterRootForeground(footer, palette);
32768
33566
  return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
32769
33567
  }
32770
- const footerSplitMainClassTransform = {
32771
- id: "layout.footerSplitMainClass",
32772
- kind: "string",
32773
- summary: "Compose split-footer main row classes from footer logo placement",
32774
- schema: z.object({
32775
- base: z.string().optional(),
32776
- reverseClass: z.string().optional()
32777
- }),
32778
- run: (value, options) => {
32779
- const placement = asPartialObject(value)?.placement ?? "right";
32780
- const shouldPlaceLogoFirst = placement === "left" || placement === "above";
32781
- const baseClass = shouldPlaceLogoFirst ? "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-end rb-gap-8 rb-md-flex-row rb-md-items-end" : "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";
32782
- return joinClasses([options.base ?? baseClass, shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null]);
32783
- }
32784
- };
32785
33568
  const footerLogoClassTransform = {
32786
33569
  id: "layout.footerLogoClass",
32787
33570
  kind: "string",
32788
33571
  summary: "Compose split-footer logo wrapper classes from footer.logo controls",
32789
- schema: z.object({
32790
- base: z.string().optional(),
32791
- requireExplicitShow: z.boolean().optional()
32792
- }),
33572
+ schema: z.object({ base: z.string().optional() }),
32793
33573
  run: (value, options) => {
32794
- const logo = asPartialObject(value);
32795
- const align = logo?.align ?? "end";
32796
- const hiddenClass = options.requireExplicitShow ? logo?.showLogo === true ? null : "rb-hidden" : logo?.showLogo === false ? "rb-hidden" : null;
33574
+ const align = asPartialObject(value)?.align ?? "end";
32797
33575
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
32798
- return joinClasses([
32799
- options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80",
32800
- selfAlignClass,
32801
- hiddenClass
32802
- ]);
32803
- }
32804
- };
32805
- const footerLogoMediaClassTransform = {
32806
- id: "layout.footerLogoMediaClass",
32807
- kind: "string",
32808
- summary: "Compose footer logo image classes from size controls",
32809
- schema: z.object({ base: z.string().optional() }),
32810
- run: (_value, options) => {
32811
- return joinClasses([options.base ?? "rb-w-auto"]);
32812
- }
32813
- };
32814
- function shouldShowFooterLogoText(footer) {
32815
- if (!footer) return false;
32816
- const explicit = footer.logo?.showLogoText;
32817
- const legacy = footer.showLogoText === true;
32818
- return explicit === true || explicit === void 0 && legacy;
32819
- }
32820
- const footerLogoTextVisibleTransform = {
32821
- id: "layout.footerLogoTextVisible",
32822
- kind: "formatter",
32823
- summary: "Return whether footer logo text should render",
32824
- run: (value) => {
32825
- return shouldShowFooterLogoText(asPartialObject(value));
33576
+ return joinClasses([options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80", selfAlignClass]);
32826
33577
  }
32827
33578
  };
32828
33579
  function extractBackgroundColorToken(background, fallback) {
@@ -32841,13 +33592,12 @@ const layoutTransforms = [
32841
33592
  headerRootStyleTransform,
32842
33593
  headerSectionBackgroundTransform,
32843
33594
  footerRootStyleTransform,
33595
+ footerModuleInkStyleTransform,
33596
+ footerBrandArrangementTransform,
32844
33597
  footerBottomBarClassTransform,
32845
33598
  footerBottomBarContainerClassTransform,
32846
33599
  footerBottomBarStyleTransform,
32847
- footerSplitMainClassTransform,
32848
- footerLogoClassTransform,
32849
- footerLogoMediaClassTransform,
32850
- footerLogoTextVisibleTransform
33600
+ footerLogoClassTransform
32851
33601
  ];
32852
33602
  //#endregion
32853
33603
  //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
@@ -33343,7 +34093,14 @@ const footerNavGroupsLayout = stack({
33343
34093
  }, [text({
33344
34094
  as: "h3",
33345
34095
  className: "rb-label",
33346
- style: textColorStyle("text/70")
34096
+ "data-slot": { $bind: { from: "content.footerRuntime.slots.group-label" } },
34097
+ style: { $bind: {
34098
+ from: "content.footerRuntime.arrangement",
34099
+ transforms: [{
34100
+ id: "layout.footerModuleInkStyle",
34101
+ options: { opacity: 70 }
34102
+ }]
34103
+ } }
33347
34104
  }, when("group.label"), bind("group.label")), stack({
33348
34105
  gap: "sm",
33349
34106
  align: "start",
@@ -33373,6 +34130,14 @@ const footerMailingListBindings = {
33373
34130
  targeting: { $bind: { from: "module.engagement.runtime.targeting" } }
33374
34131
  };
33375
34132
  const footerSpamProtectionBinding = { spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } } };
34133
+ const brandMedia = media({ className: "rb-h-10 rb-w-auto" }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
34134
+ id: "layout.chromeLogo",
34135
+ options: { surface: "footer-root" }
34136
+ }] }));
34137
+ const brandTitle = text({
34138
+ as: "strong",
34139
+ className: "footer-logo-text rb-nav-text"
34140
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }));
33376
34141
  const brandLogo = link({
33377
34142
  href: "/",
33378
34143
  className: { $bind: {
@@ -33383,20 +34148,39 @@ const brandLogo = link({
33383
34148
  }],
33384
34149
  fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
33385
34150
  } }
33386
- }, [media({ className: { $bind: {
33387
- from: "$root.theme.footer.logo",
33388
- transforms: [{
33389
- id: "layout.footerLogoMediaClass",
33390
- options: { base: "rb-h-10 rb-w-auto" }
33391
- }],
33392
- fallback: "rb-h-10 rb-w-auto"
33393
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
33394
- id: "layout.chromeLogo",
33395
- options: { surface: "footer-root" }
33396
- }] })), text({
33397
- as: "strong",
33398
- className: "footer-logo-text rb-nav-text"
33399
- }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
34151
+ }, [brandMedia, brandTitle], (node) => ({
34152
+ ...node,
34153
+ $when: {
34154
+ when: {
34155
+ from: "module",
34156
+ transforms: [{ id: "layout.footerBrandArrangement" }]
34157
+ },
34158
+ equals: "row"
34159
+ }
34160
+ }));
34161
+ const centredBrand = stack({
34162
+ gap: "md",
34163
+ align: "center"
34164
+ }, [link({
34165
+ href: "/",
34166
+ "data-slot": { $bind: { from: "module.slots.media" } },
34167
+ className: "footer-logo rb-inline-flex rb-items-center rb-no-underline"
34168
+ }, [brandMedia], when("module.slots.media")), {
34169
+ ...brandTitle,
34170
+ props: {
34171
+ ...brandTitle.props,
34172
+ "data-slot": { $bind: { from: "module.slots.heading" } }
34173
+ }
34174
+ }], (node) => ({
34175
+ ...node,
34176
+ $when: {
34177
+ when: {
34178
+ from: "module",
34179
+ transforms: [{ id: "layout.footerBrandArrangement" }]
34180
+ },
34181
+ equals: "centred"
34182
+ }
34183
+ }));
33400
34184
  const navigation = stack({
33401
34185
  gap: "md",
33402
34186
  className: "rb-w-full"
@@ -33421,14 +34205,18 @@ const address = text({
33421
34205
  }, when("module.kind", { equals: "business-address" }), bind("module.address"));
33422
34206
  const contact = stack({
33423
34207
  gap: "sm",
33424
- className: "rb-items-start"
34208
+ className: { $bind: {
34209
+ from: "module.contactClassName",
34210
+ fallback: "rb-items-start"
34211
+ } }
33425
34212
  }, [link({
33426
34213
  href: { $bind: { from: "contactLink.href" } },
33427
34214
  className: "rb-nav-text rb-break-words transition-theme-standard"
33428
34215
  }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
33429
34216
  const hours = stack({
33430
34217
  gap: "sm",
33431
- className: "rb-w-full"
34218
+ className: "rb-w-full",
34219
+ "data-slot": { $bind: { from: "module.slots.schedule" } }
33432
34220
  }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
33433
34221
  as: "span",
33434
34222
  className: "rb-label"
@@ -33439,7 +34227,10 @@ const hours = stack({
33439
34227
  as: "p",
33440
34228
  className: "rb-caption rb-opacity-70"
33441
34229
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
33442
- const socials = inline({ className: "rb-footer-socials" }, [link({
34230
+ const socials = inline({
34231
+ className: "rb-footer-socials",
34232
+ "data-slot": { $bind: { from: "module.slots.social" } }
34233
+ }, [link({
33443
34234
  href: { $bind: { from: "social.href" } },
33444
34235
  target: "_blank",
33445
34236
  rel: "noreferrer noopener",
@@ -33448,7 +34239,14 @@ const socials = inline({ className: "rb-footer-socials" }, [link({
33448
34239
  }, [icon({ className: "rb-footer-social-icon" }, 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" }));
33449
34240
  const authoredCopy = richText({
33450
34241
  className: "rb-prose rb-prose-sm rb-max-w-none",
33451
- style: textColorStyle("text/80")
34242
+ "data-slot": { $bind: { from: "module.slots.copy" } },
34243
+ style: { $bind: {
34244
+ from: "content.footerRuntime.arrangement",
34245
+ transforms: [{
34246
+ id: "layout.footerModuleInkStyle",
34247
+ options: { opacity: 80 }
34248
+ }]
34249
+ } }
33452
34250
  }, when("module.content"), bind("module.content", { transforms: [{
33453
34251
  id: "content.interpolateRichTextTokens",
33454
34252
  options: { tokens: ["year", "site_name"] }
@@ -33486,27 +34284,44 @@ const platformAttribution = el("div", {
33486
34284
  ], when("module.kind", { equals: "attribution" }));
33487
34285
  const footerGroup = stack({
33488
34286
  gap: "md",
33489
- align: "stretch",
34287
+ align: { $bind: {
34288
+ from: "group.align",
34289
+ fallback: "stretch"
34290
+ } },
33490
34291
  className: { $bind: {
33491
34292
  from: "group.className",
33492
34293
  fallback: "rb-min-w-0"
33493
34294
  } },
34295
+ "data-slot": { $bind: { from: "group.slot" } },
33494
34296
  "data-footer-group": { $bind: { from: "group.kind" } }
33495
34297
  }, [stack({
33496
34298
  gap: "md",
33497
- align: "start",
34299
+ align: { $bind: {
34300
+ from: "module.align",
34301
+ fallback: "start"
34302
+ } },
34303
+ className: { $bind: { from: "module.className" } },
33498
34304
  "data-preview-footer-module-id": { $bind: { from: "module.id" } }
33499
34305
  }, [
33500
34306
  text({
33501
34307
  as: "h2",
33502
34308
  className: "rb-label",
33503
- style: textColorStyle("text/70")
34309
+ "data-slot": { $bind: { from: "module.slots.group-label" } },
34310
+ style: { $bind: {
34311
+ from: "content.footerRuntime.arrangement",
34312
+ transforms: [{
34313
+ id: "layout.footerModuleInkStyle",
34314
+ options: { opacity: 70 }
34315
+ }]
34316
+ } }
33504
34317
  }, bind("module.heading"), when("module.heading")),
33505
34318
  brandLogo,
34319
+ centredBrand,
33506
34320
  navigation,
33507
34321
  stack({
33508
34322
  gap: "sm",
33509
- className: "rb-w-full"
34323
+ className: "rb-w-full",
34324
+ "data-slot": { $bind: { from: "module.slots.navigation" } }
33510
34325
  }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
33511
34326
  address,
33512
34327
  contact,
@@ -33519,10 +34334,12 @@ const footerGroup = stack({
33519
34334
  ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
33520
34335
  const footerMainRegion = stack({
33521
34336
  className: { $bind: { from: "region.className" } },
34337
+ "data-slot": { $bind: { from: "region.slot" } },
33522
34338
  "data-footer-region": { $bind: { from: "region.kind" } }
33523
34339
  }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
33524
34340
  const footerEngagementRegion = stack({
33525
34341
  className: { $bind: { from: "region.className" } },
34342
+ "data-slot": { $bind: { from: "region.slot" } },
33526
34343
  "data-footer-region": "engagement-row"
33527
34344
  }, [footerGroup], when("region.kind", { equals: "engagement-row" }), repeat("content.footerRuntime.regions", "region"));
33528
34345
  const footerBottomRegion = stack({ className: { $bind: {
@@ -33539,6 +34356,7 @@ const footerBottomRegion = stack({ className: { $bind: {
33539
34356
  from: "$root.theme.footer",
33540
34357
  transforms: [{ id: "layout.footerBottomBarStyle" }]
33541
34358
  } },
34359
+ "data-slot": { $bind: { from: "region.slot" } },
33542
34360
  "data-footer-region": "bottom"
33543
34361
  }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
33544
34362
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
@@ -33560,6 +34378,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
33560
34378
  transforms: [{ id: "layout.footerRootStyle" }],
33561
34379
  fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
33562
34380
  } },
34381
+ "data-arrangement": { $bind: { from: "content.footerRuntime.arrangementHook" } },
33563
34382
  "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
33564
34383
  }, [
33565
34384
  footerEngagementRegion,
@@ -35161,17 +35980,30 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35161
35980
  }],
35162
35981
  fallback: ""
35163
35982
  } };
35164
- const copyHeading = el("div", { className: titleClassNameFromAlignment }, [text({
35983
+ const copyHeading = el("div", {
35984
+ className: titleClassNameFromAlignment,
35985
+ ...lookSlot("head")
35986
+ }, [text({
35165
35987
  as: "p",
35166
- className: eyebrowClassName("rb-eyebrow heading-eyebrow")
35167
- }, when("content.eyebrow"), bind("content.eyebrow")), text({ as: "h2" }, bind("content.title"))], when("content.title"));
35168
- const defaultTextColumn = el("div", {}, [styledCard([richText({ className: "rb-prose rb-max-w-none" }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText({ className: "rb-prose rb-max-w-none" }, when("content.wrapTextInCard", { not: true }), bind("content.text"))]);
35169
- const bioTextColumn = el("div", { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" }, [
35170
- copyHeading,
35171
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
35172
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
35173
- ]);
35988
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
35989
+ ...lookSlot("eyebrow")
35990
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
35991
+ as: "h2",
35992
+ ...lookSlot("heading")
35993
+ }, bind("content.title"))], when("content.title"));
35994
+ const textContentNodes = (className) => {
35995
+ const props = {
35996
+ className,
35997
+ ...lookSlot("intro"),
35998
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
35999
+ lookSlots: { $bind: { from: "content._lookSlots" } }
36000
+ };
36001
+ return [styledCard([richText(props, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText(props, when("content.wrapTextInCard", { not: true }), bind("content.text"))];
36002
+ };
36003
+ const defaultTextColumn = el("div", {}, textContentNodes("rb-prose rb-max-w-none"));
36004
+ const bioTextColumn = el("div", { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" }, [copyHeading, ...textContentNodes(bodyClassNameFromAlignment)]);
35174
36005
  const defaultImageCommonProps = {
36006
+ ...lookSlot("photo"),
35175
36007
  className: { $bind: {
35176
36008
  from: "content.imageShape",
35177
36009
  transforms: [{
@@ -35211,6 +36043,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35211
36043
  slidesToShow: 1
35212
36044
  }, [media(defaultImageCommonProps, bind("item.image"), repeat("content.images", "item"))]);
35213
36045
  const defaultImagesLayout = el("div", {}, [responsiveTwoColumn({
36046
+ lookSlots: true,
35214
36047
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
35215
36048
  text: defaultTextColumn,
35216
36049
  ratioFrom: "content.ratio",
@@ -35222,6 +36055,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35222
36055
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1"
35223
36056
  })], whenImagesLength(0, { not: true }));
35224
36057
  const bioImagesLayout = el("div", {}, [responsiveTwoColumn({
36058
+ lookSlots: true,
35225
36059
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
35226
36060
  text: bioTextColumn,
35227
36061
  ratioFrom: "content.ratio",
@@ -35232,15 +36066,15 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35232
36066
  imageWrapperClassName: "rb-w-full rb-shrink-0",
35233
36067
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
35234
36068
  })], whenImagesLength(0, { not: true }));
35235
- const defaultTextOnlyLayout = el("div", {}, [styledCard([richText({ className: "rb-prose rb-max-w-none" }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText({ className: "rb-prose rb-max-w-none" }, when("content.wrapTextInCard", { not: true }), bind("content.text"))], whenImagesLength(0));
35236
- const bioTextOnlyLayout = el("div", { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" }, [
35237
- text({
35238
- as: "h2",
35239
- className: titleClassNameFromAlignment
35240
- }, when("content.title"), bind("content.title")),
35241
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
35242
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
35243
- ], whenImagesLength(0));
36069
+ const defaultTextOnlyLayout = el("div", lookSlot("copy"), textContentNodes("rb-prose rb-max-w-none"), whenImagesLength(0));
36070
+ const bioTextOnlyLayout = el("div", {
36071
+ className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5",
36072
+ ...lookSlot("copy")
36073
+ }, [text({
36074
+ as: "h2",
36075
+ className: titleClassNameFromAlignment,
36076
+ ...lookSlot("heading")
36077
+ }, when("content.title"), bind("content.title")), ...textContentNodes(bodyClassNameFromAlignment)], whenImagesLength(0));
35244
36078
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
35245
36079
  const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
35246
36080
  const defaultLayout = styledSection({
@@ -35264,9 +36098,31 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35264
36098
  }),
35265
36099
  baseClass: "",
35266
36100
  spacing: "medium"
36101
+ }),
36102
+ "circle-beside": styledSection({
36103
+ baseClass: "",
36104
+ spacing: "medium",
36105
+ children: styledContainer({ children: el("div", lookSlot("frame"), [el("div", lookSlot("media"), [
36106
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(1)),
36107
+ el("div", {}, [el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))], whenImagesLength(0, { not: true })),
36108
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(0))
36109
+ ]), el("div", lookSlot("copy"), [el("div", lookSlot("head"), [text({
36110
+ as: "p",
36111
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
36112
+ ...lookSlot("eyebrow")
36113
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
36114
+ as: "h2",
36115
+ ...lookSlot("heading")
36116
+ }, bind("content.title"), when("content.title", { authoringPresence: {
36117
+ kind: "recover-empty-when-active",
36118
+ placeholder: "Add heading"
36119
+ } }))]), defaultTextColumn])]) })
35267
36120
  })
35268
36121
  },
35269
- variantMeaning: { kind: "arrangement" },
36122
+ variantMeaning: {
36123
+ kind: "arrangement",
36124
+ lookOnlyKeys: ["circle-beside"]
36125
+ },
35270
36126
  defaultVariant: "default",
35271
36127
  variantOptions: {
35272
36128
  default: { label: "Default" },
@@ -36362,24 +37218,6 @@ const emptyStateField = {
36362
37218
  ui: { intent: "display" }
36363
37219
  };
36364
37220
  /**
36365
- * Section heading and description fields
36366
- */
36367
- const sectionHeaderFields = (defaultHeading) => [{
36368
- id: "heading",
36369
- type: "text",
36370
- label: "Heading",
36371
- description: "Main heading for the events section",
36372
- required: false,
36373
- multiline: false,
36374
- defaultValue: defaultHeading
36375
- }, {
36376
- id: "description",
36377
- type: "richText",
36378
- label: "Description",
36379
- description: "Optional introductory text",
36380
- required: false
36381
- }];
36382
- /**
36383
37221
  * Layout selection field with grid/stack options
36384
37222
  */
36385
37223
  const layoutField = {
@@ -36492,31 +37330,6 @@ function normalizeEventStaffMemberId(value) {
36492
37330
  return trimmed ? trimmed : null;
36493
37331
  }
36494
37332
  //#endregion
36495
- //#region ../blocks/src/system/blocks/events/shared/layout.ts
36496
- const recoverEmptyHeadingWhenActive = {
36497
- kind: "recover-empty-when-active",
36498
- placeholder: "Add heading"
36499
- };
36500
- const recoverEmptyDescriptionWhenActive = {
36501
- kind: "recover-empty-when-active",
36502
- placeholder: "Add description"
36503
- };
36504
- function eventSectionHeaderLayoutNodes(options = {}) {
36505
- const headingNode = text({
36506
- as: "h2",
36507
- ...lookSlot("heading")
36508
- }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
36509
- const descriptionNode = richText({
36510
- className: "rb-prose rb-max-w-none",
36511
- ...lookSlot("intro")
36512
- }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
36513
- if (options.splitClassName) return [el("div", {
36514
- className: options.splitClassName,
36515
- ...lookSlot("head")
36516
- }, [headingNode, descriptionNode])];
36517
- return [headingNode, descriptionNode];
36518
- }
36519
- //#endregion
36520
37333
  //#region ../blocks/src/system/blocks/shop.shared.ts
36521
37334
  /**
36522
37335
  * Public pass product for shop display
@@ -36941,19 +37754,14 @@ function buildCalendarViewport(input) {
36941
37754
  *
36942
37755
  * Sites don't store a locale, and every public word around a date is English,
36943
37756
  * so the only open question is which English conventions to follow: day or
36944
- * month first, and a 24 or 12-hour clock. The site's time zone is the one
37757
+ * month first. The site's time zone is the one
36945
37758
  * fact every site carries about where it is. It is the site's, never an
36946
37759
  * event's: a venue left at UTC must not turn a UK site's dates American.
36947
37760
  * Anywhere this can't place (UTC, the Americas, Asia) keeps US English, which
36948
37761
  * is what these helpers wrote before sites were placed at all.
36949
37762
  */
36950
37763
  function eventDateLocale(siteTimeZone) {
36951
- if (!siteTimeZone) return "en-US";
36952
- if (siteTimeZone === "Europe/Dublin") return "en-IE";
36953
- if (siteTimeZone.startsWith("Europe/")) return "en-GB";
36954
- if (siteTimeZone.startsWith("Australia/")) return "en-AU";
36955
- if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
36956
- return "en-US";
37764
+ return inferSiteDateLocale(siteTimeZone);
36957
37765
  }
36958
37766
  function formatEventCompactDateRail(isoTimestamp, options, letterCase = "capitals") {
36959
37767
  const locale = options?.locale ?? "en-US";
@@ -38661,7 +39469,7 @@ const eventSpotlightBlockDefinition = {
38661
39469
  ],
38662
39470
  icon: "Star",
38663
39471
  layout: [styledSection({
38664
- children: sectionContainer([...eventSectionHeaderLayoutNodes(), el("event-spotlight", {
39472
+ children: sectionContainer([...sectionHeaderLayoutNodes(), el("event-spotlight", {
38665
39473
  events: { $bind: { from: "data.events" } },
38666
39474
  layout: { $bind: {
38667
39475
  from: "content.layout",
@@ -38717,52 +39525,6 @@ const eventSpotlightBlockDefinition = {
38717
39525
  } }
38718
39526
  };
38719
39527
  //#endregion
38720
- //#region ../blocks/src/system/runtime/lookSurfaces.ts
38721
- const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
38722
- const lookListPresentationSchemaShape = {
38723
- sectionAction: z.object({
38724
- label: z.string(),
38725
- href: z.string()
38726
- }).optional(),
38727
- actionSize: z.enum([
38728
- "sm",
38729
- "md",
38730
- "lg"
38731
- ]).optional(),
38732
- itemActionStyle: z.enum(["button", "link"]).optional(),
38733
- itemRoles: z.object({
38734
- container: z.enum([
38735
- "card",
38736
- "statement",
38737
- "highlight"
38738
- ]).optional(),
38739
- items: z.enum([
38740
- "card",
38741
- "statement",
38742
- "highlight"
38743
- ]).optional(),
38744
- at: z.partialRecord(z.enum([
38745
- "first",
38746
- "last",
38747
- "middle",
38748
- "odd",
38749
- "even"
38750
- ]), z.enum([
38751
- "card",
38752
- "statement",
38753
- "highlight"
38754
- ])).optional()
38755
- }).optional(),
38756
- roleSurfaces: z.record(z.enum([
38757
- "card",
38758
- "statement",
38759
- "highlight"
38760
- ]), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
38761
- panelHeading: z.string().optional(),
38762
- lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
38763
- itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
38764
- };
38765
- //#endregion
38766
39528
  //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
38767
39529
  /** Invalid saved selections fail closed rather than widening discovery. */
38768
39530
  function resolveEventSelection(mode, value) {
@@ -39537,7 +40299,7 @@ const eventListingBlockDefinition = {
39537
40299
  children: styledContainer({
39538
40300
  rootType: "stack",
39539
40301
  rootProps: { gap: "lg" },
39540
- children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
40302
+ children: [...sectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
39541
40303
  readAuthority: { $bind: { from: "$root.readAuthority" } },
39542
40304
  events: { $bind: { from: "data.events" } },
39543
40305
  stage: { $bind: {
@@ -39977,7 +40739,7 @@ const eventCalendarLayout = [styledSection({
39977
40739
  gap: "lg",
39978
40740
  ...lookSlot("layout")
39979
40741
  },
39980
- children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
40742
+ children: [...sectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
39981
40743
  readAuthority: { $bind: { from: "$root.readAuthority" } },
39982
40744
  events: { $bind: { from: "data.events" } },
39983
40745
  effectiveListArrangementKey: { $bind: { from: "$root.effectiveListArrangementKey" } },
@@ -41933,6 +42695,511 @@ const embedBlockDefinition = {
41933
42695
  } }
41934
42696
  };
41935
42697
  //#endregion
42698
+ //#region ../blocks/src/system/blocks/image-gallery/fields.ts
42699
+ const imageGalleryFields = parseFieldDefinitions([
42700
+ ...sectionHeaderFields(void 0, "Intro"),
42701
+ {
42702
+ id: "images",
42703
+ type: "repeater",
42704
+ label: "Images",
42705
+ itemLabel: "Image",
42706
+ minItems: 0,
42707
+ maxItems: 24,
42708
+ ui: {
42709
+ repeaterPreset: "thumbnailGrid",
42710
+ thumbnailField: "image",
42711
+ thumbnailAltField: "caption",
42712
+ thumbnailLabelField: "caption",
42713
+ thumbnailCardDensity: "compact"
42714
+ },
42715
+ schema: { fields: [{
42716
+ id: "image",
42717
+ type: "media",
42718
+ label: "Image",
42719
+ required: true,
42720
+ mediaKinds: ["image"]
42721
+ }, {
42722
+ id: "caption",
42723
+ type: "text",
42724
+ label: "Caption",
42725
+ description: "Optional caption displayed below the image and used as the editor card label",
42726
+ maxLength: 200
42727
+ }] }
42728
+ },
42729
+ {
42730
+ id: "fullBleed",
42731
+ type: "boolean",
42732
+ label: "Full bleed",
42733
+ description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
42734
+ defaultValue: false,
42735
+ ui: {
42736
+ intent: "display",
42737
+ visibleWhen: {
42738
+ field: "variant",
42739
+ notIn: ["marquee"]
42740
+ }
42741
+ }
42742
+ },
42743
+ {
42744
+ id: "aspectRatio",
42745
+ type: "select",
42746
+ label: "Aspect ratio",
42747
+ description: "Crop images to a consistent aspect ratio.",
42748
+ defaultValue: "1/1",
42749
+ options: [
42750
+ {
42751
+ value: "auto",
42752
+ label: "Original"
42753
+ },
42754
+ {
42755
+ value: "1/1",
42756
+ label: "1:1 (Square)"
42757
+ },
42758
+ {
42759
+ value: "4/3",
42760
+ label: "4:3 (Standard)"
42761
+ },
42762
+ {
42763
+ value: "16/9",
42764
+ label: "16:9 (Widescreen)"
42765
+ },
42766
+ {
42767
+ value: "3/2",
42768
+ label: "3:2 (Classic)"
42769
+ },
42770
+ {
42771
+ value: "3/4",
42772
+ label: "3:4 (Portrait)"
42773
+ }
42774
+ ],
42775
+ ui: {
42776
+ intent: "display",
42777
+ visibleWhen: {
42778
+ field: "variant",
42779
+ notIn: ["masonry", "marquee"]
42780
+ }
42781
+ }
42782
+ },
42783
+ {
42784
+ id: "slidesToShow",
42785
+ type: "select",
42786
+ label: "Images per view (mobile)",
42787
+ description: "Number of images visible at once on small screens.",
42788
+ defaultValue: "1",
42789
+ options: [
42790
+ {
42791
+ value: "1",
42792
+ label: "One at a time"
42793
+ },
42794
+ {
42795
+ value: "2",
42796
+ label: "Two at a time"
42797
+ },
42798
+ {
42799
+ value: "3",
42800
+ label: "Three at a time"
42801
+ }
42802
+ ],
42803
+ ui: {
42804
+ intent: "display",
42805
+ visibleWhen: {
42806
+ field: "variant",
42807
+ equals: "carousel"
42808
+ }
42809
+ }
42810
+ },
42811
+ {
42812
+ id: "slidesToShowTablet",
42813
+ type: "select",
42814
+ label: "Images per view (tablet)",
42815
+ description: "Number of images visible on medium screens.",
42816
+ options: [
42817
+ {
42818
+ value: "",
42819
+ label: "Same as mobile"
42820
+ },
42821
+ {
42822
+ value: "1",
42823
+ label: "One at a time"
42824
+ },
42825
+ {
42826
+ value: "2",
42827
+ label: "Two at a time"
42828
+ },
42829
+ {
42830
+ value: "3",
42831
+ label: "Three at a time"
42832
+ }
42833
+ ],
42834
+ ui: {
42835
+ intent: "display",
42836
+ visibleWhen: {
42837
+ field: "variant",
42838
+ equals: "carousel"
42839
+ }
42840
+ }
42841
+ },
42842
+ {
42843
+ id: "slidesToShowDesktop",
42844
+ type: "select",
42845
+ label: "Images per view (desktop)",
42846
+ description: "Number of images visible on large screens.",
42847
+ options: [
42848
+ {
42849
+ value: "",
42850
+ label: "Same as tablet"
42851
+ },
42852
+ {
42853
+ value: "1",
42854
+ label: "One at a time"
42855
+ },
42856
+ {
42857
+ value: "2",
42858
+ label: "Two at a time"
42859
+ },
42860
+ {
42861
+ value: "3",
42862
+ label: "Three at a time"
42863
+ }
42864
+ ],
42865
+ ui: {
42866
+ intent: "display",
42867
+ visibleWhen: {
42868
+ field: "variant",
42869
+ equals: "carousel"
42870
+ }
42871
+ }
42872
+ },
42873
+ {
42874
+ id: "transition",
42875
+ type: "select",
42876
+ label: "Transition",
42877
+ description: "Animation style between slides.",
42878
+ defaultValue: "slide",
42879
+ options: [{
42880
+ value: "slide",
42881
+ label: "Slide"
42882
+ }, {
42883
+ value: "fade",
42884
+ label: "Fade"
42885
+ }],
42886
+ ui: {
42887
+ intent: "display",
42888
+ visibleWhen: {
42889
+ field: "variant",
42890
+ equals: "carousel"
42891
+ }
42892
+ }
42893
+ },
42894
+ {
42895
+ id: "showControls",
42896
+ type: "boolean",
42897
+ label: "Show arrows",
42898
+ defaultValue: true,
42899
+ ui: {
42900
+ intent: "behavior",
42901
+ visibleWhen: {
42902
+ field: "variant",
42903
+ equals: "carousel"
42904
+ }
42905
+ }
42906
+ },
42907
+ {
42908
+ id: "showDots",
42909
+ type: "boolean",
42910
+ label: "Show dots",
42911
+ defaultValue: false,
42912
+ ui: {
42913
+ intent: "behavior",
42914
+ visibleWhen: {
42915
+ field: "variant",
42916
+ equals: "carousel"
42917
+ }
42918
+ }
42919
+ },
42920
+ {
42921
+ id: "autoplay",
42922
+ type: "boolean",
42923
+ label: "Autoplay",
42924
+ defaultValue: false,
42925
+ ui: {
42926
+ intent: "behavior",
42927
+ visibleWhen: {
42928
+ field: "variant",
42929
+ equals: "carousel"
42930
+ }
42931
+ }
42932
+ },
42933
+ {
42934
+ id: "autoplayDelay",
42935
+ type: "select",
42936
+ label: "Autoplay delay",
42937
+ defaultValue: "5000",
42938
+ options: [
42939
+ {
42940
+ value: "3000",
42941
+ label: "3 seconds"
42942
+ },
42943
+ {
42944
+ value: "5000",
42945
+ label: "5 seconds"
42946
+ },
42947
+ {
42948
+ value: "7000",
42949
+ label: "7 seconds"
42950
+ },
42951
+ {
42952
+ value: "10000",
42953
+ label: "10 seconds"
42954
+ }
42955
+ ],
42956
+ ui: {
42957
+ intent: "behavior",
42958
+ visibleWhen: {
42959
+ field: "variant",
42960
+ equals: "carousel"
42961
+ }
42962
+ }
42963
+ },
42964
+ {
42965
+ id: "arrowVisibility",
42966
+ type: "select",
42967
+ label: "Arrow visibility",
42968
+ defaultValue: "always",
42969
+ options: [{
42970
+ value: "always",
42971
+ label: "Always visible"
42972
+ }, {
42973
+ value: "hover",
42974
+ label: "Show on hover"
42975
+ }],
42976
+ ui: {
42977
+ intent: "behavior",
42978
+ visibleWhen: {
42979
+ field: "variant",
42980
+ equals: "carousel"
42981
+ }
42982
+ }
42983
+ },
42984
+ {
42985
+ id: "loop",
42986
+ type: "boolean",
42987
+ label: "Loop slides",
42988
+ defaultValue: true,
42989
+ ui: {
42990
+ intent: "behavior",
42991
+ visibleWhen: {
42992
+ field: "variant",
42993
+ equals: "carousel"
42994
+ }
42995
+ }
42996
+ },
42997
+ {
42998
+ id: "marqueeDirection",
42999
+ type: "select",
43000
+ label: "Scroll direction",
43001
+ options: [{
43002
+ value: "left",
43003
+ label: "Left"
43004
+ }, {
43005
+ value: "right",
43006
+ label: "Right"
43007
+ }],
43008
+ defaultValue: "left",
43009
+ ui: {
43010
+ intent: "display",
43011
+ visibleWhen: {
43012
+ field: "variant",
43013
+ equals: "marquee"
43014
+ }
43015
+ }
43016
+ },
43017
+ {
43018
+ id: "marqueeSpeed",
43019
+ type: "select",
43020
+ label: "Scroll speed",
43021
+ options: [
43022
+ {
43023
+ value: "slow",
43024
+ label: "Slow (60s)"
43025
+ },
43026
+ {
43027
+ value: "medium",
43028
+ label: "Medium (40s)"
43029
+ },
43030
+ {
43031
+ value: "fast",
43032
+ label: "Fast (20s)"
43033
+ }
43034
+ ],
43035
+ defaultValue: "medium",
43036
+ ui: {
43037
+ intent: "display",
43038
+ visibleWhen: {
43039
+ field: "variant",
43040
+ equals: "marquee"
43041
+ }
43042
+ }
43043
+ },
43044
+ {
43045
+ id: "marqueePauseOnHover",
43046
+ type: "boolean",
43047
+ label: "Pause on hover",
43048
+ defaultValue: true,
43049
+ ui: {
43050
+ intent: "behavior",
43051
+ visibleWhen: {
43052
+ field: "variant",
43053
+ equals: "marquee"
43054
+ }
43055
+ }
43056
+ },
43057
+ {
43058
+ id: "marqueeImageSize",
43059
+ type: "select",
43060
+ label: "Image size",
43061
+ options: [
43062
+ {
43063
+ value: "sm",
43064
+ label: "Small (200px)"
43065
+ },
43066
+ {
43067
+ value: "md",
43068
+ label: "Medium (256px)"
43069
+ },
43070
+ {
43071
+ value: "lg",
43072
+ label: "Large (320px)"
43073
+ },
43074
+ {
43075
+ value: "xl",
43076
+ label: "Extra large (400px)"
43077
+ }
43078
+ ],
43079
+ defaultValue: "md",
43080
+ ui: {
43081
+ intent: "display",
43082
+ visibleWhen: {
43083
+ field: "variant",
43084
+ equals: "marquee"
43085
+ }
43086
+ }
43087
+ },
43088
+ {
43089
+ id: "imageFilter",
43090
+ type: "select",
43091
+ label: "Image filter",
43092
+ options: [
43093
+ {
43094
+ value: "none",
43095
+ label: "None"
43096
+ },
43097
+ {
43098
+ value: "grayscale",
43099
+ label: "Grayscale"
43100
+ },
43101
+ {
43102
+ value: "grayscale-hover-reveal",
43103
+ label: "Grayscale (color on hover)"
43104
+ },
43105
+ {
43106
+ value: "sepia",
43107
+ label: "Sepia"
43108
+ }
43109
+ ],
43110
+ defaultValue: "grayscale-hover-reveal",
43111
+ ui: { intent: "style" }
43112
+ },
43113
+ {
43114
+ id: "imageBorder",
43115
+ type: "group",
43116
+ label: "Image border",
43117
+ schema: { fields: [
43118
+ {
43119
+ id: "enabled",
43120
+ type: "boolean",
43121
+ label: "Show border",
43122
+ defaultValue: true
43123
+ },
43124
+ {
43125
+ id: "colorToken",
43126
+ type: "text",
43127
+ label: "Border color",
43128
+ defaultValue: "accent",
43129
+ ui: { widget: "backgroundColor" }
43130
+ },
43131
+ {
43132
+ id: "opacity",
43133
+ type: "number",
43134
+ label: "Border opacity",
43135
+ defaultValue: 30,
43136
+ ui: {
43137
+ min: 0,
43138
+ max: 100
43139
+ }
43140
+ },
43141
+ {
43142
+ id: "width",
43143
+ type: "select",
43144
+ label: "Border width",
43145
+ options: [
43146
+ {
43147
+ value: "1",
43148
+ label: "Thin (1px)"
43149
+ },
43150
+ {
43151
+ value: "2",
43152
+ label: "Medium (2px)"
43153
+ },
43154
+ {
43155
+ value: "3",
43156
+ label: "Thick (3px)"
43157
+ }
43158
+ ],
43159
+ defaultValue: "2"
43160
+ }
43161
+ ] },
43162
+ ui: { intent: "style" }
43163
+ },
43164
+ {
43165
+ id: "imageCorners",
43166
+ type: "select",
43167
+ label: "Image corners",
43168
+ options: [
43169
+ {
43170
+ value: "none",
43171
+ label: "Square"
43172
+ },
43173
+ {
43174
+ value: "sm",
43175
+ label: "Slightly rounded"
43176
+ },
43177
+ {
43178
+ value: "md",
43179
+ label: "Rounded"
43180
+ },
43181
+ {
43182
+ value: "lg",
43183
+ label: "More rounded"
43184
+ },
43185
+ {
43186
+ value: "xl",
43187
+ label: "Very rounded"
43188
+ },
43189
+ {
43190
+ value: "2xl",
43191
+ label: "Extra rounded"
43192
+ },
43193
+ {
43194
+ value: "3xl",
43195
+ label: "Maximum rounded"
43196
+ }
43197
+ ],
43198
+ defaultValue: "3xl",
43199
+ ui: { intent: "style" }
43200
+ }
43201
+ ]);
43202
+ //#endregion
41936
43203
  //#region ../blocks/src/system/blocks/image-gallery.ts
41937
43204
  const grid$1 = (props, children, ...mods) => el("grid", props ?? void 0, children ?? void 0, ...mods);
41938
43205
  const galleryContainer = (children, opts) => {
@@ -42147,7 +43414,11 @@ const emptyState$1 = {
42147
43414
  }
42148
43415
  };
42149
43416
  const wrapVariant$1 = (layout, opts) => styledSection({
42150
- children: galleryContainer([layout, emptyState$1], {
43417
+ children: galleryContainer([
43418
+ ...sectionHeaderLayoutNodes(),
43419
+ layout,
43420
+ emptyState$1
43421
+ ], {
42151
43422
  gap: "md",
42152
43423
  fullWidth: opts?.fullWidth,
42153
43424
  className: opts?.className
@@ -42156,6 +43427,28 @@ const wrapVariant$1 = (layout, opts) => styledSection({
42156
43427
  spacing: "medium",
42157
43428
  background: "background"
42158
43429
  });
43430
+ const lookGalleryTile = (imageFrom, captionFrom, ...mods) => el("li", lookSlot("item"), [el("figure", lookSlot("figure"), [el("div", lookSlot("media"), [media(lookSlot("photo"), bind(imageFrom), when(imageFrom))]), text({
43431
+ as: "figcaption",
43432
+ ...lookSlot("caption")
43433
+ }, bind(captionFrom), when(captionFrom))])], ...mods);
43434
+ const tilesLayout = styledSection({
43435
+ children: el("div", {
43436
+ className: "rb-container",
43437
+ ...lookSlot("layout")
43438
+ }, [...sectionHeaderLayoutNodes({ splitClassName: "rb-grid" }), el("ol", lookSlot("items"), [lookGalleryTile("item.image", "item.caption", repeat("content.images", "item")), lookGalleryTile("content.images.0.image", "content.images.0.caption", (node) => ({
43439
+ ...node,
43440
+ $when: {
43441
+ when: {
43442
+ from: "content.images",
43443
+ transforms: [{ id: "array.length" }]
43444
+ },
43445
+ equals: 0
43446
+ }
43447
+ }))])]),
43448
+ baseClass: "",
43449
+ spacing: "medium",
43450
+ background: "background"
43451
+ });
42159
43452
  const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42160
43453
  id: "block.image-gallery",
42161
43454
  title: "Image Gallery",
@@ -42168,510 +43461,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42168
43461
  "marqueeSpeed",
42169
43462
  "marqueePauseOnHover"
42170
43463
  ] },
42171
- additionalFields: parseFieldDefinitions([
42172
- {
42173
- id: "images",
42174
- type: "repeater",
42175
- label: "Images",
42176
- itemLabel: "Image",
42177
- minItems: 0,
42178
- maxItems: 24,
42179
- ui: {
42180
- repeaterPreset: "thumbnailGrid",
42181
- thumbnailField: "image",
42182
- thumbnailAltField: "caption",
42183
- thumbnailLabelField: "caption",
42184
- thumbnailCardDensity: "compact"
42185
- },
42186
- schema: { fields: [{
42187
- id: "image",
42188
- type: "media",
42189
- label: "Image",
42190
- required: true,
42191
- mediaKinds: ["image"]
42192
- }, {
42193
- id: "caption",
42194
- type: "text",
42195
- label: "Caption",
42196
- description: "Optional caption displayed below the image and used as the editor card label",
42197
- maxLength: 200
42198
- }] }
42199
- },
42200
- {
42201
- id: "fullBleed",
42202
- type: "boolean",
42203
- label: "Full bleed",
42204
- description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
42205
- defaultValue: false,
42206
- ui: {
42207
- intent: "display",
42208
- visibleWhen: {
42209
- field: "variant",
42210
- notIn: ["marquee"]
42211
- }
42212
- }
42213
- },
42214
- {
42215
- id: "aspectRatio",
42216
- type: "select",
42217
- label: "Aspect ratio",
42218
- description: "Crop images to a consistent aspect ratio.",
42219
- defaultValue: "1/1",
42220
- options: [
42221
- {
42222
- value: "auto",
42223
- label: "Original"
42224
- },
42225
- {
42226
- value: "1/1",
42227
- label: "1:1 (Square)"
42228
- },
42229
- {
42230
- value: "4/3",
42231
- label: "4:3 (Standard)"
42232
- },
42233
- {
42234
- value: "16/9",
42235
- label: "16:9 (Widescreen)"
42236
- },
42237
- {
42238
- value: "3/2",
42239
- label: "3:2 (Classic)"
42240
- },
42241
- {
42242
- value: "3/4",
42243
- label: "3:4 (Portrait)"
42244
- }
42245
- ],
42246
- ui: {
42247
- intent: "display",
42248
- visibleWhen: {
42249
- field: "variant",
42250
- notIn: ["masonry", "marquee"]
42251
- }
42252
- }
42253
- },
42254
- {
42255
- id: "slidesToShow",
42256
- type: "select",
42257
- label: "Images per view (mobile)",
42258
- description: "Number of images visible at once on small screens.",
42259
- defaultValue: "1",
42260
- options: [
42261
- {
42262
- value: "1",
42263
- label: "One at a time"
42264
- },
42265
- {
42266
- value: "2",
42267
- label: "Two at a time"
42268
- },
42269
- {
42270
- value: "3",
42271
- label: "Three at a time"
42272
- }
42273
- ],
42274
- ui: {
42275
- intent: "display",
42276
- visibleWhen: {
42277
- field: "variant",
42278
- equals: "carousel"
42279
- }
42280
- }
42281
- },
42282
- {
42283
- id: "slidesToShowTablet",
42284
- type: "select",
42285
- label: "Images per view (tablet)",
42286
- description: "Number of images visible on medium screens.",
42287
- options: [
42288
- {
42289
- value: "",
42290
- label: "Same as mobile"
42291
- },
42292
- {
42293
- value: "1",
42294
- label: "One at a time"
42295
- },
42296
- {
42297
- value: "2",
42298
- label: "Two at a time"
42299
- },
42300
- {
42301
- value: "3",
42302
- label: "Three at a time"
42303
- }
42304
- ],
42305
- ui: {
42306
- intent: "display",
42307
- visibleWhen: {
42308
- field: "variant",
42309
- equals: "carousel"
42310
- }
42311
- }
42312
- },
42313
- {
42314
- id: "slidesToShowDesktop",
42315
- type: "select",
42316
- label: "Images per view (desktop)",
42317
- description: "Number of images visible on large screens.",
42318
- options: [
42319
- {
42320
- value: "",
42321
- label: "Same as tablet"
42322
- },
42323
- {
42324
- value: "1",
42325
- label: "One at a time"
42326
- },
42327
- {
42328
- value: "2",
42329
- label: "Two at a time"
42330
- },
42331
- {
42332
- value: "3",
42333
- label: "Three at a time"
42334
- }
42335
- ],
42336
- ui: {
42337
- intent: "display",
42338
- visibleWhen: {
42339
- field: "variant",
42340
- equals: "carousel"
42341
- }
42342
- }
42343
- },
42344
- {
42345
- id: "transition",
42346
- type: "select",
42347
- label: "Transition",
42348
- description: "Animation style between slides.",
42349
- defaultValue: "slide",
42350
- options: [{
42351
- value: "slide",
42352
- label: "Slide"
42353
- }, {
42354
- value: "fade",
42355
- label: "Fade"
42356
- }],
42357
- ui: {
42358
- intent: "display",
42359
- visibleWhen: {
42360
- field: "variant",
42361
- equals: "carousel"
42362
- }
42363
- }
42364
- },
42365
- {
42366
- id: "showControls",
42367
- type: "boolean",
42368
- label: "Show arrows",
42369
- defaultValue: true,
42370
- ui: {
42371
- intent: "behavior",
42372
- visibleWhen: {
42373
- field: "variant",
42374
- equals: "carousel"
42375
- }
42376
- }
42377
- },
42378
- {
42379
- id: "showDots",
42380
- type: "boolean",
42381
- label: "Show dots",
42382
- defaultValue: false,
42383
- ui: {
42384
- intent: "behavior",
42385
- visibleWhen: {
42386
- field: "variant",
42387
- equals: "carousel"
42388
- }
42389
- }
42390
- },
42391
- {
42392
- id: "autoplay",
42393
- type: "boolean",
42394
- label: "Autoplay",
42395
- defaultValue: false,
42396
- ui: {
42397
- intent: "behavior",
42398
- visibleWhen: {
42399
- field: "variant",
42400
- equals: "carousel"
42401
- }
42402
- }
42403
- },
42404
- {
42405
- id: "autoplayDelay",
42406
- type: "select",
42407
- label: "Autoplay delay",
42408
- defaultValue: "5000",
42409
- options: [
42410
- {
42411
- value: "3000",
42412
- label: "3 seconds"
42413
- },
42414
- {
42415
- value: "5000",
42416
- label: "5 seconds"
42417
- },
42418
- {
42419
- value: "7000",
42420
- label: "7 seconds"
42421
- },
42422
- {
42423
- value: "10000",
42424
- label: "10 seconds"
42425
- }
42426
- ],
42427
- ui: {
42428
- intent: "behavior",
42429
- visibleWhen: {
42430
- field: "variant",
42431
- equals: "carousel"
42432
- }
42433
- }
42434
- },
42435
- {
42436
- id: "arrowVisibility",
42437
- type: "select",
42438
- label: "Arrow visibility",
42439
- defaultValue: "always",
42440
- options: [{
42441
- value: "always",
42442
- label: "Always visible"
42443
- }, {
42444
- value: "hover",
42445
- label: "Show on hover"
42446
- }],
42447
- ui: {
42448
- intent: "behavior",
42449
- visibleWhen: {
42450
- field: "variant",
42451
- equals: "carousel"
42452
- }
42453
- }
42454
- },
42455
- {
42456
- id: "loop",
42457
- type: "boolean",
42458
- label: "Loop slides",
42459
- defaultValue: true,
42460
- ui: {
42461
- intent: "behavior",
42462
- visibleWhen: {
42463
- field: "variant",
42464
- equals: "carousel"
42465
- }
42466
- }
42467
- },
42468
- {
42469
- id: "marqueeDirection",
42470
- type: "select",
42471
- label: "Scroll direction",
42472
- options: [{
42473
- value: "left",
42474
- label: "Left"
42475
- }, {
42476
- value: "right",
42477
- label: "Right"
42478
- }],
42479
- defaultValue: "left",
42480
- ui: {
42481
- intent: "display",
42482
- visibleWhen: {
42483
- field: "variant",
42484
- equals: "marquee"
42485
- }
42486
- }
42487
- },
42488
- {
42489
- id: "marqueeSpeed",
42490
- type: "select",
42491
- label: "Scroll speed",
42492
- options: [
42493
- {
42494
- value: "slow",
42495
- label: "Slow (60s)"
42496
- },
42497
- {
42498
- value: "medium",
42499
- label: "Medium (40s)"
42500
- },
42501
- {
42502
- value: "fast",
42503
- label: "Fast (20s)"
42504
- }
42505
- ],
42506
- defaultValue: "medium",
42507
- ui: {
42508
- intent: "display",
42509
- visibleWhen: {
42510
- field: "variant",
42511
- equals: "marquee"
42512
- }
42513
- }
42514
- },
42515
- {
42516
- id: "marqueePauseOnHover",
42517
- type: "boolean",
42518
- label: "Pause on hover",
42519
- defaultValue: true,
42520
- ui: {
42521
- intent: "behavior",
42522
- visibleWhen: {
42523
- field: "variant",
42524
- equals: "marquee"
42525
- }
42526
- }
42527
- },
42528
- {
42529
- id: "marqueeImageSize",
42530
- type: "select",
42531
- label: "Image size",
42532
- options: [
42533
- {
42534
- value: "sm",
42535
- label: "Small (200px)"
42536
- },
42537
- {
42538
- value: "md",
42539
- label: "Medium (256px)"
42540
- },
42541
- {
42542
- value: "lg",
42543
- label: "Large (320px)"
42544
- },
42545
- {
42546
- value: "xl",
42547
- label: "Extra large (400px)"
42548
- }
42549
- ],
42550
- defaultValue: "md",
42551
- ui: {
42552
- intent: "display",
42553
- visibleWhen: {
42554
- field: "variant",
42555
- equals: "marquee"
42556
- }
42557
- }
42558
- },
42559
- {
42560
- id: "imageFilter",
42561
- type: "select",
42562
- label: "Image filter",
42563
- options: [
42564
- {
42565
- value: "none",
42566
- label: "None"
42567
- },
42568
- {
42569
- value: "grayscale",
42570
- label: "Grayscale"
42571
- },
42572
- {
42573
- value: "grayscale-hover-reveal",
42574
- label: "Grayscale (color on hover)"
42575
- },
42576
- {
42577
- value: "sepia",
42578
- label: "Sepia"
42579
- }
42580
- ],
42581
- defaultValue: "grayscale-hover-reveal",
42582
- ui: { intent: "style" }
42583
- },
42584
- {
42585
- id: "imageBorder",
42586
- type: "group",
42587
- label: "Image border",
42588
- schema: { fields: [
42589
- {
42590
- id: "enabled",
42591
- type: "boolean",
42592
- label: "Show border",
42593
- defaultValue: true
42594
- },
42595
- {
42596
- id: "colorToken",
42597
- type: "text",
42598
- label: "Border color",
42599
- defaultValue: "accent",
42600
- ui: { widget: "backgroundColor" }
42601
- },
42602
- {
42603
- id: "opacity",
42604
- type: "number",
42605
- label: "Border opacity",
42606
- defaultValue: 30,
42607
- ui: {
42608
- min: 0,
42609
- max: 100
42610
- }
42611
- },
42612
- {
42613
- id: "width",
42614
- type: "select",
42615
- label: "Border width",
42616
- options: [
42617
- {
42618
- value: "1",
42619
- label: "Thin (1px)"
42620
- },
42621
- {
42622
- value: "2",
42623
- label: "Medium (2px)"
42624
- },
42625
- {
42626
- value: "3",
42627
- label: "Thick (3px)"
42628
- }
42629
- ],
42630
- defaultValue: "2"
42631
- }
42632
- ] },
42633
- ui: { intent: "style" }
42634
- },
42635
- {
42636
- id: "imageCorners",
42637
- type: "select",
42638
- label: "Image corners",
42639
- options: [
42640
- {
42641
- value: "none",
42642
- label: "Square"
42643
- },
42644
- {
42645
- value: "sm",
42646
- label: "Slightly rounded"
42647
- },
42648
- {
42649
- value: "md",
42650
- label: "Rounded"
42651
- },
42652
- {
42653
- value: "lg",
42654
- label: "More rounded"
42655
- },
42656
- {
42657
- value: "xl",
42658
- label: "Very rounded"
42659
- },
42660
- {
42661
- value: "2xl",
42662
- label: "Extra rounded"
42663
- },
42664
- {
42665
- value: "3xl",
42666
- label: "Maximum rounded"
42667
- }
42668
- ],
42669
- defaultValue: "3xl",
42670
- ui: { intent: "style" }
42671
- }
42672
- ]),
43464
+ additionalFields: imageGalleryFields,
42673
43465
  layout: wrapVariant$1(gridLayout),
42674
43466
  variants: {
43467
+ tiles: tilesLayout,
42675
43468
  grid: wrapVariant$1(gridLayout),
42676
43469
  carousel: wrapVariant$1(carouselLayout),
42677
43470
  masonry: wrapVariant$1(masonryLayout),
@@ -42680,7 +43473,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42680
43473
  className: "rb-image-gallery-marquee-container"
42681
43474
  })
42682
43475
  },
42683
- variantMeaning: { kind: "arrangement" },
43476
+ variantMeaning: {
43477
+ kind: "arrangement",
43478
+ lookOnlyKeys: ["tiles"]
43479
+ },
42684
43480
  defaultVariant: "grid",
42685
43481
  variantOptions: {
42686
43482
  grid: {
@@ -44900,76 +45696,74 @@ const giftingBlockDefinition = {
44900
45696
  /**
44901
45697
  * Get form fields based on preset configuration.
44902
45698
  */
44903
- function getGlobalFormFields(form) {
44904
- const includePhone = form.includeOptionalPhone;
44905
- switch (form.fields.preset) {
44906
- case "emailOnly": return withOptionalPhone([{
44907
- id: "email",
44908
- type: "email",
44909
- label: "Email",
44910
- required: true,
44911
- placeholder: "your@email.com"
44912
- }], includePhone);
44913
- case "emailName": return withOptionalPhone([{
44914
- id: "email",
44915
- type: "email",
44916
- label: "Email",
44917
- required: true,
44918
- placeholder: "your@email.com"
44919
- }, {
45699
+ function getGlobalFormFields(form, presentation = {}) {
45700
+ const fields = withOptionalPhone(newsletterPresetFields(form.fields), form.includeOptionalPhone);
45701
+ return presentation.lookSlots ? fields.map((field) => ({
45702
+ ...field,
45703
+ label: lookFieldLabel(field)
45704
+ })) : fields;
45705
+ }
45706
+ function lookFieldLabel(field) {
45707
+ switch (field.id) {
45708
+ case "firstName": return "First name";
45709
+ case "lastName": return "Last name";
45710
+ default: return field.label;
45711
+ }
45712
+ }
45713
+ const emailField = {
45714
+ id: "email",
45715
+ type: "email",
45716
+ label: "Email",
45717
+ required: true,
45718
+ placeholder: "your@email.com"
45719
+ };
45720
+ const firstNameField = (required) => ({
45721
+ id: "firstName",
45722
+ type: "text",
45723
+ label: "First Name",
45724
+ required,
45725
+ placeholder: "First name"
45726
+ });
45727
+ function newsletterPresetFields(fields) {
45728
+ switch (fields.preset) {
45729
+ case "emailOnly": return [emailField];
45730
+ case "emailName": return [emailField, {
44920
45731
  id: "name",
44921
45732
  type: "text",
44922
45733
  label: "Name",
44923
- required: form.fields.name === "required",
45734
+ required: fields.name === "required",
44924
45735
  placeholder: "Your name"
44925
- }], includePhone);
44926
- case "emailFirstLast": return withOptionalPhone([
44927
- {
44928
- id: "email",
44929
- type: "email",
44930
- label: "Email",
44931
- required: true,
44932
- placeholder: "your@email.com"
44933
- },
44934
- {
44935
- id: "firstName",
44936
- type: "text",
44937
- label: "First Name",
44938
- required: form.fields.firstName === "required",
44939
- placeholder: "First name"
44940
- },
45736
+ }];
45737
+ case "emailFirstName": return [emailField, firstNameField(fields.firstName === "required")];
45738
+ case "emailFirstLast": return [
45739
+ emailField,
45740
+ firstNameField(fields.firstName === "required"),
44941
45741
  {
44942
45742
  id: "lastName",
44943
45743
  type: "text",
44944
45744
  label: "Last Name",
44945
- required: form.fields.lastName === "required",
45745
+ required: fields.lastName === "required",
44946
45746
  placeholder: "Last name"
44947
45747
  }
44948
- ], includePhone);
44949
- case "emailNameCompany": return withOptionalPhone([
44950
- {
44951
- id: "email",
44952
- type: "email",
44953
- label: "Email",
44954
- required: true,
44955
- placeholder: "your@email.com"
44956
- },
45748
+ ];
45749
+ case "emailNameCompany": return [
45750
+ emailField,
44957
45751
  {
44958
45752
  id: "name",
44959
45753
  type: "text",
44960
45754
  label: "Name",
44961
- required: form.fields.name === "required",
45755
+ required: fields.name === "required",
44962
45756
  placeholder: "Your name"
44963
45757
  },
44964
45758
  {
44965
45759
  id: "company",
44966
45760
  type: "text",
44967
45761
  label: "Company",
44968
- required: form.fields.company === "required",
45762
+ required: fields.company === "required",
44969
45763
  placeholder: "Company name"
44970
45764
  }
44971
- ], includePhone);
44972
- default: throw new Error("Unknown newsletter preset");
45765
+ ];
45766
+ default: return assertNever$2(fields);
44973
45767
  }
44974
45768
  }
44975
45769
  function withOptionalPhone(fields, includePhone) {
@@ -45031,6 +45825,7 @@ const mailingListSignupBlockSourceRefSchema = z.object({
45031
45825
  });
45032
45826
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
45033
45827
  const newsletterSourceCommonSchema = z.object({
45828
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
45034
45829
  siteId: z.string().optional(),
45035
45830
  apiBaseUrl: z.string().optional(),
45036
45831
  mailingList: mailingListContextSchema.optional(),
@@ -45063,6 +45858,7 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
45063
45858
  newsletterSourceCommonSchema.extend({ source: z.literal("preview") })
45064
45859
  ]);
45065
45860
  const newsletterDisplaySchema = z.object({
45861
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
45066
45862
  kind: z.literal("newsletter-form"),
45067
45863
  availability: z.enum(["ready", "unavailable"]),
45068
45864
  className: z.string().nullable(),
@@ -45129,13 +45925,14 @@ function buildNewsletterDisplay(source) {
45129
45925
  const choices = resolveRuntimeChoices(assessment);
45130
45926
  return {
45131
45927
  kind: "newsletter-form",
45928
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
45132
45929
  availability: assessment.tag === "available" ? "ready" : "unavailable",
45133
45930
  className: source.className ?? null,
45134
45931
  buttonLabel: form.buttonLabel,
45135
45932
  successMessage: form.successMessage,
45136
45933
  buttonVariant: source.buttonVariant ?? "primary",
45137
45934
  privacyNote: form.privacyNote,
45138
- fields: getGlobalFormFields(form),
45935
+ fields: getGlobalFormFields(form, source),
45139
45936
  choices
45140
45937
  };
45141
45938
  }
@@ -45207,32 +46004,50 @@ function parseRequiredMailingListSignedSourceToken(value) {
45207
46004
  //#region ../blocks/src/system/blocks/newsletter-signup.ts
45208
46005
  const stackedComposition = composeFragments([{ fragment: newsletterCopyFragment }, { fragment: newsletterFormFragment }]);
45209
46006
  const stackedLayout = styledSection({
45210
- children: sectionContainer(stackedComposition.layout, {
46007
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
45211
46008
  gap: "md",
45212
46009
  className: "rb-text-center newsletter-stacked"
45213
- }),
46010
+ })),
45214
46011
  baseClass: "",
45215
46012
  spacing: "medium",
45216
46013
  background: "surface"
45217
46014
  });
45218
46015
  const inlineLayout = styledSection({
45219
- children: sectionContainer(stackedComposition.layout, {
46016
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
45220
46017
  gap: "md",
45221
46018
  className: "newsletter-inline"
45222
- }),
46019
+ })),
45223
46020
  baseClass: "",
45224
46021
  spacing: "medium",
45225
46022
  background: "surface"
45226
46023
  });
45227
46024
  const editorialSplitLayout = styledSection({
45228
- children: sectionContainer([el("div", { className: "newsletter-editorial-split-copy" }, newsletterCopyFragment.layout), el("div", { className: "newsletter-editorial-split-form" }, newsletterFormFragment.layout)], {
46025
+ children: props(lookSlot("layout"))(sectionContainer([el("div", {
46026
+ className: "newsletter-editorial-split-copy",
46027
+ ...lookSlot("head")
46028
+ }, newsletterCopyFragment.layout), el("div", {
46029
+ className: "newsletter-editorial-split-form",
46030
+ ...lookSlot("panel")
46031
+ }, newsletterFormFragment.layout)], {
45229
46032
  gap: "lg",
45230
46033
  className: "newsletter-editorial-split"
45231
- }),
46034
+ })),
45232
46035
  baseClass: "",
45233
46036
  spacing: "comfortable",
45234
46037
  background: "surface"
45235
46038
  });
46039
+ const archLayout = styledSection({
46040
+ children: el("div", {
46041
+ className: "rb-container",
46042
+ ...lookSlot("layout")
46043
+ }, [el("div", lookSlot("frame"), [el("div", {
46044
+ className: "rb-grid",
46045
+ ...lookSlot("head")
46046
+ }, newsletterCopyFragment.layout), ...newsletterFormFragment.layout])]),
46047
+ baseClass: "",
46048
+ spacing: "medium",
46049
+ background: "surface"
46050
+ });
45236
46051
  const newsletterSignupManifest = createBlockManifest({
45237
46052
  id: "block.newsletter-signup",
45238
46053
  title: "Newsletter Signup",
@@ -45247,13 +46062,26 @@ const newsletterSignupManifest = createBlockManifest({
45247
46062
  fragment: newsletterFormFragment,
45248
46063
  fieldPriority: 1
45249
46064
  }],
46065
+ additionalFields: [{
46066
+ id: "archFrame",
46067
+ type: "boolean",
46068
+ label: "Arch frame",
46069
+ ui: {
46070
+ intent: "display",
46071
+ hidden: true
46072
+ }
46073
+ }],
45250
46074
  layout: stackedLayout,
45251
46075
  variants: {
46076
+ arch: archLayout,
45252
46077
  stacked: stackedLayout,
45253
46078
  inline: inlineLayout,
45254
46079
  "editorial-split": editorialSplitLayout
45255
46080
  },
45256
- variantMeaning: { kind: "arrangement" },
46081
+ variantMeaning: {
46082
+ kind: "arrangement",
46083
+ lookOnlyKeys: ["arch"]
46084
+ },
45257
46085
  defaultVariant: "stacked",
45258
46086
  variantOptions: {
45259
46087
  stacked: {
@@ -46340,7 +47168,7 @@ const systemBlockDefinitions = [
46340
47168
  })
46341
47169
  ]
46342
47170
  })),
46343
- withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47171
+ withDesignCapability("block.body-text", bodyTextBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
46344
47172
  flow: bodyFlow,
46345
47173
  layoutProfiles: [
46346
47174
  layoutProfile({
@@ -46715,7 +47543,7 @@ const systemBlockDefinitions = [
46715
47543
  weight: "quiet"
46716
47544
  })]
46717
47545
  })),
46718
- withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47546
+ withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
46719
47547
  flow: mediaFlow,
46720
47548
  layoutProfiles: [
46721
47549
  layoutProfile({
@@ -46804,7 +47632,7 @@ const systemBlockDefinitions = [
46804
47632
  weight: "standard"
46805
47633
  })]
46806
47634
  })),
46807
- withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47635
+ withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
46808
47636
  flow: conversionFlow,
46809
47637
  layoutProfiles: [
46810
47638
  layoutProfile({