@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
@@ -463,6 +463,25 @@ function validateBookingPaymentOptionKinds(kinds) {
463
463
  return ok(void 0);
464
464
  }
465
465
  //#endregion
466
+ //#region ../core/src/date-time-formatter.ts
467
+ /** Shared Intl engine, internal to core's date presentation owners. */
468
+ const FORMATTER_CACHE_LIMIT = 100;
469
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
470
+ function getDateTimeFormatter(locale, timeZone, format) {
471
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
472
+ const cached = dateTimeFormatterCache.get(key);
473
+ if (cached !== void 0) return cached;
474
+ if (typeof locale !== "string" || Intl.DateTimeFormat.supportedLocalesOf([locale]).length === 0) throw new RangeError("An explicit supported locale is required");
475
+ if (typeof timeZone !== "string" || timeZone.length === 0) throw new RangeError("An explicit time zone is required");
476
+ const formatter = new Intl.DateTimeFormat(locale, {
477
+ ...format,
478
+ timeZone
479
+ });
480
+ if (dateTimeFormatterCache.size >= FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
481
+ dateTimeFormatterCache.set(key, formatter);
482
+ return formatter;
483
+ }
484
+ //#endregion
466
485
  //#region ../core/src/booking-time-zone.ts
467
486
  const TIME_ZONE_VALIDITY_CACHE_LIMIT = 100;
468
487
  const timeZoneValidityCache = /* @__PURE__ */ new Map();
@@ -499,8 +518,6 @@ const START_OF_DAY = {
499
518
  second: 0
500
519
  };
501
520
  const LOCAL_DATE_PATTERN = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
502
- const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
503
- const dateTimeFormatterCache = /* @__PURE__ */ new Map();
504
521
  function getSafeTimeZone(timeZone) {
505
522
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
506
523
  return normalized.length > 0 && isValidBookingTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
@@ -517,19 +534,7 @@ function formatParseError(error) {
517
534
  }
518
535
  }
519
536
  function formatToPartsLookup(date, locale, timeZone, format) {
520
- return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
521
- }
522
- function getCachedDateTimeFormatter(locale, timeZone, format) {
523
- const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
524
- const cached = dateTimeFormatterCache.get(key);
525
- if (cached !== void 0) return cached;
526
- const formatter = new Intl.DateTimeFormat(locale, {
527
- ...format,
528
- timeZone
529
- });
530
- if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
531
- dateTimeFormatterCache.set(key, formatter);
532
- return formatter;
537
+ return new Map(getDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
533
538
  }
534
539
  function getZonedDateTimeParts(date, timeZone) {
535
540
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -617,7 +622,7 @@ function toScheduledBookingDateTime(input) {
617
622
  function formatBookingInstant(isoString, options) {
618
623
  const date = new Date(isoString);
619
624
  if (Number.isNaN(date.getTime())) return isoString;
620
- return getCachedDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
625
+ return getDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
621
626
  }
622
627
  function formatBookingDate(input, format = {
623
628
  weekday: "long",
@@ -742,6 +747,17 @@ function localScheduleDateTimeToUtcDate(localDate, localTime, timeZone) {
742
747
  return new Date(guess);
743
748
  }
744
749
  //#endregion
750
+ //#region ../core/src/date-display.ts
751
+ /** Site-language policy, shared by customer emails and public event adapters. */
752
+ function inferSiteDateLocale(siteTimeZone) {
753
+ if (siteTimeZone === null || siteTimeZone === void 0 || siteTimeZone === "") return "en-US";
754
+ if (siteTimeZone === "Europe/Dublin") return "en-IE";
755
+ if (siteTimeZone.startsWith("Europe/")) return "en-GB";
756
+ if (siteTimeZone.startsWith("Australia/")) return "en-AU";
757
+ if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
758
+ return "en-US";
759
+ }
760
+ //#endregion
745
761
  //#region ../core/src/location.ts
746
762
  function normalizeLocationAddressText(value) {
747
763
  if (typeof value !== "string") return null;
@@ -879,6 +895,10 @@ function parseGlobalFields(value) {
879
895
  preset: "emailName",
880
896
  name: value.name
881
897
  } : null;
898
+ case "emailFirstName": return isRequirement(value.firstName) ? {
899
+ preset: "emailFirstName",
900
+ firstName: value.firstName
901
+ } : null;
882
902
  case "emailFirstLast": return isRequirement(value.firstName) && isRequirement(value.lastName) ? {
883
903
  preset: "emailFirstLast",
884
904
  firstName: value.firstName,
@@ -5398,6 +5418,129 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
5398
5418
  tags: ["billing"],
5399
5419
  auth: "user",
5400
5420
  responseKind: "json"
5421
+ },
5422
+ stripeConnectSetupStart: {
5423
+ path: "/sites/{siteId}/billing/connect/setup",
5424
+ method: "POST",
5425
+ tags: ["site-{siteId}", "stripe-connect"],
5426
+ auth: "user",
5427
+ responseKind: "json",
5428
+ errors: [
5429
+ "validation:invalid_input",
5430
+ "auth:forbidden",
5431
+ "resource:conflict",
5432
+ "server:internal_error"
5433
+ ]
5434
+ },
5435
+ stripeConnectSetupDiscard: {
5436
+ path: "/sites/{siteId}/billing/connect/setup",
5437
+ method: "DELETE",
5438
+ tags: ["site-{siteId}", "stripe-connect"],
5439
+ auth: "user",
5440
+ responseKind: "json",
5441
+ errors: [
5442
+ "validation:invalid_input",
5443
+ "auth:forbidden",
5444
+ "resource:conflict",
5445
+ "server:internal_error"
5446
+ ]
5447
+ },
5448
+ stripeConnectSetupSave: {
5449
+ path: "/sites/{siteId}/billing/connect/setup/save",
5450
+ method: "POST",
5451
+ tags: ["site-{siteId}", "stripe-connect"],
5452
+ auth: "user",
5453
+ responseKind: "json",
5454
+ errors: [
5455
+ "validation:invalid_input",
5456
+ "auth:forbidden",
5457
+ "resource:conflict",
5458
+ "server:internal_error"
5459
+ ]
5460
+ },
5461
+ stripeConnectAccountSession: {
5462
+ path: "/sites/{siteId}/billing/connect/session",
5463
+ method: "POST",
5464
+ tags: ["site-{siteId}", "stripe-connect"],
5465
+ auth: "user",
5466
+ responseKind: "json",
5467
+ errors: [
5468
+ "validation:invalid_input",
5469
+ "auth:forbidden",
5470
+ "resource:conflict",
5471
+ "server:internal_error"
5472
+ ]
5473
+ },
5474
+ stripeConnectStart: {
5475
+ path: "/sites/{siteId}/billing/connect/start",
5476
+ method: "POST",
5477
+ tags: ["site-{siteId}", "stripe-connect"],
5478
+ auth: "user",
5479
+ responseKind: "json",
5480
+ errors: [
5481
+ "validation:invalid_input",
5482
+ "auth:forbidden",
5483
+ "resource:conflict",
5484
+ "server:internal_error"
5485
+ ]
5486
+ },
5487
+ stripeConnectStatus: {
5488
+ path: "/sites/{siteId}/billing/connect/status",
5489
+ method: "GET",
5490
+ tags: ["site-{siteId}", "stripe-connect"],
5491
+ auth: "user",
5492
+ responseKind: "json",
5493
+ errors: [
5494
+ "validation:invalid_input",
5495
+ "auth:forbidden",
5496
+ "resource:conflict",
5497
+ "server:internal_error"
5498
+ ]
5499
+ },
5500
+ stripeAutomaticTaxUpdate: {
5501
+ path: "/sites/{siteId}/billing/automatic-tax",
5502
+ method: "POST",
5503
+ tags: [
5504
+ "site-{siteId}",
5505
+ "billing",
5506
+ "stripe-tax"
5507
+ ],
5508
+ auth: "user",
5509
+ responseKind: "json",
5510
+ errors: [
5511
+ "validation:invalid_input",
5512
+ "auth:forbidden",
5513
+ "resource:not_found",
5514
+ "server:unavailable",
5515
+ "server:internal_error"
5516
+ ]
5517
+ },
5518
+ stripeConnectDisconnect: {
5519
+ path: "/sites/{siteId}/billing/connect/disconnect",
5520
+ method: "DELETE",
5521
+ tags: ["site-{siteId}", "stripe-connect"],
5522
+ auth: "user",
5523
+ responseKind: "json",
5524
+ errors: [
5525
+ "validation:invalid_input",
5526
+ "auth:forbidden",
5527
+ "resource:conflict",
5528
+ "server:internal_error"
5529
+ ]
5530
+ },
5531
+ billingConnectReturn: {
5532
+ path: "/billing/connect/return",
5533
+ method: "GET",
5534
+ auth: "user",
5535
+ responseKind: "void",
5536
+ errors: []
5537
+ },
5538
+ billingConnectRefresh: {
5539
+ path: "/billing/connect/refresh",
5540
+ method: "GET",
5541
+ auth: "user",
5542
+ responseKind: "void",
5543
+ errors: []
5401
5544
  }
5402
5545
  });
5403
5546
  //#endregion
@@ -5562,6 +5705,14 @@ const PAGE_SURFACE_EDITOR_ENDPOINT_DEFINITIONS = {
5562
5705
  * person when nothing is attached to them.
5563
5706
  */
5564
5707
  const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
5708
+ getBookingPerson: {
5709
+ path: "/sites/{siteId}/bookings/people/{personId}",
5710
+ method: "GET",
5711
+ tags: ["site-{siteId}", "customers-{siteId}"],
5712
+ auth: "user",
5713
+ responseKind: "json",
5714
+ errors: ["resource:not_found", "server:internal_error"]
5715
+ },
5565
5716
  listPeople: {
5566
5717
  path: "/sites/{siteId}/bookings/people",
5567
5718
  method: "GET",
@@ -5902,6 +6053,19 @@ const footerModeSchema = z.enum([
5902
6053
  "default+blocks",
5903
6054
  "none"
5904
6055
  ]);
6056
+ z.object({
6057
+ variant: z.enum([
6058
+ "simple",
6059
+ "columns",
6060
+ "split",
6061
+ "centred"
6062
+ ]),
6063
+ showLogoText: z.boolean().optional(),
6064
+ logo: z.object({
6065
+ showLogo: z.boolean().optional(),
6066
+ showLogoText: z.boolean().optional()
6067
+ }).optional()
6068
+ });
5905
6069
  //#endregion
5906
6070
  //#region ../theme-core/src/palette/utils/colorConversion.ts
5907
6071
  const clamp01 = (x) => Math.max(0, Math.min(1, x));
@@ -9101,6 +9265,29 @@ const paletteSchema = z.object({
9101
9265
  };
9102
9266
  });
9103
9267
  //#endregion
9268
+ //#region ../theme-core/src/buttons/typography.ts
9269
+ const textTransformSchema = z.enum([
9270
+ "none",
9271
+ "uppercase",
9272
+ "lowercase",
9273
+ "capitalize"
9274
+ ]);
9275
+ const fontWeightSchema = z.union([
9276
+ z.literal(400),
9277
+ z.literal(500),
9278
+ z.literal(600),
9279
+ z.literal(700),
9280
+ z.literal(800)
9281
+ ]);
9282
+ const buttonTypographySchema = z.enum(["body", "heading"]);
9283
+ const letterSpacingSchema = z.enum([
9284
+ "tight",
9285
+ "normal",
9286
+ "slight",
9287
+ "loose",
9288
+ "wide"
9289
+ ]);
9290
+ //#endregion
9104
9291
  //#region ../theme-core/src/buttons/types.ts
9105
9292
  /**
9106
9293
  * Standard semantic variant roles a theme exposes.
@@ -9216,6 +9403,7 @@ const buttonEffectApplicationSchema = z.discriminatedUnion("effectId", [
9216
9403
  z.strictObject({
9217
9404
  effectId: z.literal("lift"),
9218
9405
  options: z.strictObject({ amount: z.enum([
9406
+ "0.125",
9219
9407
  "0.25",
9220
9408
  "0.5",
9221
9409
  "1"
@@ -9262,24 +9450,6 @@ const shadowSizeSchema = z.enum([
9262
9450
  "medium",
9263
9451
  "high"
9264
9452
  ]);
9265
- const textTransformSchema = z.enum([
9266
- "none",
9267
- "uppercase",
9268
- "lowercase",
9269
- "capitalize"
9270
- ]);
9271
- const fontWeightSchema = z.union([
9272
- z.literal(500),
9273
- z.literal(600),
9274
- z.literal(700),
9275
- z.literal(800)
9276
- ]);
9277
- const buttonTypographySchema = z.enum(["body", "heading"]);
9278
- const letterSpacingSchema = z.enum([
9279
- "tight",
9280
- "normal",
9281
- "loose"
9282
- ]);
9283
9453
  const hoverTransformSchema = z.enum([
9284
9454
  "none",
9285
9455
  "lift",
@@ -9351,7 +9521,8 @@ const paddingShorthandSchema = z.string().refine((value) => {
9351
9521
  }, { message: "Padding must be two space-separated CSS length tokens (e.g. \"0.5rem 1rem\"). Use `0` for zero." });
9352
9522
  const buttonSizeConfigSchema = z.object({
9353
9523
  padding: paddingShorthandSchema,
9354
- fontSize: z.string().optional()
9524
+ fontSize: z.string().optional(),
9525
+ borderRadius: z.string().optional()
9355
9526
  });
9356
9527
  /**
9357
9528
  * `xl` is optional on the wire so themes persisted before the `xl` size was
@@ -9474,12 +9645,20 @@ const buttonVisualAppearanceSchema = z.strictObject({
9474
9645
  textTransform: textTransformSchema
9475
9646
  }),
9476
9647
  effects: z.array(buttonEffectApplicationSchema),
9648
+ transform: z.literal("none").optional(),
9477
9649
  contextualHover: contextualButtonHoverSchema.optional()
9478
9650
  });
9479
9651
  const buttonVisualStatesSchema = z.strictObject({
9480
9652
  base: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
9481
9653
  hover: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
9482
- focus: buttonVisualAppearanceSchema.extend({ shadow: z.literal("focus-indicator") }),
9654
+ focus: buttonVisualAppearanceSchema.extend({
9655
+ shadow: z.literal("focus-indicator"),
9656
+ indicator: z.strictObject({
9657
+ kind: z.literal("surface-ink"),
9658
+ width: z.union([z.literal(2), z.literal(3)]),
9659
+ offset: z.union([z.literal(3), z.literal(4)])
9660
+ }).optional()
9661
+ }),
9483
9662
  active: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
9484
9663
  disabled: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema })
9485
9664
  });
@@ -9946,6 +10125,10 @@ function validateButtonTextContrast(input) {
9946
10125
  }
9947
10126
  };
9948
10127
  }
10128
+ /** A text-token slab inverts the palette's text/background pair, including text shades. */
10129
+ function solidForegroundToken(backgroundToken) {
10130
+ return /^text(?:-\d+)?$/.test(backgroundToken) ? "background" : onColorTokenName(backgroundToken);
10131
+ }
9949
10132
  //#endregion
9950
10133
  //#region ../theme-core/src/buttons/contextualHover.ts
9951
10134
  function resolveContextualHoverPreference(input) {
@@ -10043,7 +10226,7 @@ function candidate(family, shade, currentShade, direction, seedHex, palette) {
10043
10226
  }
10044
10227
  function hasSafeTextContrast(token, palette) {
10045
10228
  const background = palette[token];
10046
- const foreground = palette[onColorTokenName(token)];
10229
+ const foreground = palette[solidForegroundToken(token)];
10047
10230
  return typeof background === "string" && typeof foreground === "string" && contrastRatio(background, foreground) >= BUTTON_CONTRAST_POLICY.textMinimumRatio;
10048
10231
  }
10049
10232
  function isSafeCandidate(token, palette, surface) {
@@ -10138,6 +10321,13 @@ function compileDeclaredVisualStates(input, states) {
10138
10321
  const colours = collectStateColours(mapVisualStates((state) => compileDeclaredVisualState(input, states, state, state === "hover" ? hover.treatment : states[state].background)));
10139
10322
  return colours.ok ? {
10140
10323
  ...colours,
10324
+ focusIndicator: states.focus.indicator ? {
10325
+ kind: "surface-role",
10326
+ colorCss: input.surface?.foregroundCss ?? surfaceForegroundValue("text"),
10327
+ width: states.focus.indicator.width,
10328
+ offset: states.focus.indicator.offset,
10329
+ minimumSurfaceContrast: BUTTON_CONTRAST_POLICY.nonTextMinimumRatio
10330
+ } : colours.focusIndicator,
10141
10331
  contextualHoverRepair: hover.repair
10142
10332
  } : colours;
10143
10333
  }
@@ -10275,7 +10465,7 @@ function resolveFocusIndicator(colour) {
10275
10465
  function resolveSolid(input, backgroundToken, edge) {
10276
10466
  const backgroundHex = paletteHex(input, backgroundToken);
10277
10467
  if (!backgroundHex.ok) return backgroundHex;
10278
- const foregroundToken = unsafeAsOpaqueButtonColourToken(onColorTokenName(backgroundToken));
10468
+ const foregroundToken = unsafeAsOpaqueButtonColourToken(solidForegroundToken(backgroundToken));
10279
10469
  const foregroundHex = input.palette[foregroundToken];
10280
10470
  if (typeof foregroundHex !== "string") return {
10281
10471
  ok: false,
@@ -11550,6 +11740,287 @@ function normalizeAppearance(appearance) {
11550
11740
  };
11551
11741
  }
11552
11742
  //#endregion
11743
+ //#region ../theme-core/src/buttons/styles/recipes/lanternRecipes.ts
11744
+ const flatShadow = {
11745
+ elevation: "none",
11746
+ softness: null,
11747
+ position: "bottom"
11748
+ };
11749
+ const lift$1 = {
11750
+ effectId: "lift",
11751
+ options: { amount: "0.125" }
11752
+ };
11753
+ const tags = {
11754
+ tone: "classic",
11755
+ energy: "calm",
11756
+ motion: "subtle",
11757
+ era: "editorial"
11758
+ };
11759
+ /** Each role supplies complete states, including a flat surface-ink focus ring. */
11760
+ function states(base, hover, offset = 4, width = 2) {
11761
+ return {
11762
+ base,
11763
+ hover,
11764
+ focus: {
11765
+ ...base,
11766
+ shadow: "focus-indicator",
11767
+ indicator: {
11768
+ kind: "surface-ink",
11769
+ width,
11770
+ offset
11771
+ }
11772
+ },
11773
+ active: {
11774
+ ...base,
11775
+ transform: "none"
11776
+ },
11777
+ disabled: {
11778
+ ...base,
11779
+ effects: []
11780
+ }
11781
+ };
11782
+ }
11783
+ const gilt = {
11784
+ text: "treatment",
11785
+ border: "none",
11786
+ borderRadius: "rounded-10px",
11787
+ shadow: flatShadow,
11788
+ sizes: {
11789
+ sm: {
11790
+ padding: "10px 20px",
11791
+ fontSize: "text-base",
11792
+ borderRadius: "rounded-lg"
11793
+ },
11794
+ md: {
11795
+ padding: "18px 36px",
11796
+ fontSize: "text-19px"
11797
+ },
11798
+ lg: {
11799
+ padding: "18px 36px",
11800
+ fontSize: "text-19px"
11801
+ },
11802
+ xl: {
11803
+ padding: "18px 36px",
11804
+ fontSize: "text-19px"
11805
+ }
11806
+ },
11807
+ typography: {
11808
+ fontWeight: 400,
11809
+ typography: "heading",
11810
+ fontSize: "text-19px",
11811
+ letterSpacing: "slight",
11812
+ italic: false,
11813
+ textTransform: "none"
11814
+ },
11815
+ effects: []
11816
+ };
11817
+ const giltPrimary = {
11818
+ ...gilt,
11819
+ background: {
11820
+ type: "gradient",
11821
+ stops: ["accent", "primary"],
11822
+ direction: "to-br",
11823
+ foregroundToken: "onAccent"
11824
+ }
11825
+ };
11826
+ const giltPrimaryHover = {
11827
+ ...giltPrimary,
11828
+ background: {
11829
+ ...giltPrimary.background,
11830
+ stops: ["accent-400", "primary-400"],
11831
+ foregroundToken: "secondary-950"
11832
+ },
11833
+ effects: [lift$1]
11834
+ };
11835
+ const giltSecondary = {
11836
+ ...gilt,
11837
+ background: {
11838
+ type: "solid",
11839
+ colorToken: "text"
11840
+ }
11841
+ };
11842
+ const giltSecondaryHover = {
11843
+ ...giltSecondary,
11844
+ effects: [lift$1],
11845
+ contextualHover: {
11846
+ kind: "shade-shift",
11847
+ seedToken: unsafeAsOpaqueButtonColourToken("text"),
11848
+ fallbackDirection: "lighter"
11849
+ }
11850
+ };
11851
+ const giltPrimaryStates = states(giltPrimary, giltPrimaryHover);
11852
+ const giltSecondaryStates = states(giltSecondary, giltSecondaryHover);
11853
+ const giltSlabRecipe = defineStaticButtonStyleRecipe({
11854
+ id: "gilt-slab",
11855
+ accessibilityLabel: "Gilt slab",
11856
+ tags,
11857
+ system: { roles: {
11858
+ primary: { states: giltPrimaryStates },
11859
+ secondary: { states: giltSecondaryStates },
11860
+ outline: { states: giltSecondaryStates },
11861
+ ghost: { states: giltSecondaryStates },
11862
+ accent: { states: giltPrimaryStates }
11863
+ } }
11864
+ });
11865
+ const hairline = {
11866
+ text: "treatment",
11867
+ borderRadius: "rounded-3px",
11868
+ shadow: flatShadow,
11869
+ sizes: {
11870
+ sm: {
11871
+ padding: "9px 16px",
11872
+ fontSize: "text-xs"
11873
+ },
11874
+ md: {
11875
+ padding: "15px 28px",
11876
+ fontSize: "text-13px"
11877
+ },
11878
+ lg: {
11879
+ padding: "15px 28px",
11880
+ fontSize: "text-13px"
11881
+ },
11882
+ xl: {
11883
+ padding: "15px 28px",
11884
+ fontSize: "text-13px"
11885
+ }
11886
+ },
11887
+ typography: {
11888
+ fontWeight: 700,
11889
+ typography: "body",
11890
+ fontSize: "text-13px",
11891
+ letterSpacing: "wide",
11892
+ italic: false,
11893
+ textTransform: "uppercase"
11894
+ },
11895
+ effects: []
11896
+ };
11897
+ const hairlinePrimary = {
11898
+ ...hairline,
11899
+ background: {
11900
+ type: "solid",
11901
+ colorToken: "primary"
11902
+ },
11903
+ border: {
11904
+ widthClass: "border",
11905
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
11906
+ }
11907
+ };
11908
+ const hairlineOutline = {
11909
+ ...hairline,
11910
+ background: {
11911
+ type: "surface",
11912
+ role: "link"
11913
+ },
11914
+ border: {
11915
+ widthClass: "border",
11916
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
11917
+ }
11918
+ };
11919
+ const hairlineSecondary = {
11920
+ ...hairlineOutline,
11921
+ border: {
11922
+ widthClass: "border",
11923
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
11924
+ }
11925
+ };
11926
+ const hairlineFilled = {
11927
+ ...hairlineSecondary,
11928
+ background: {
11929
+ type: "solid",
11930
+ colorToken: "accent"
11931
+ }
11932
+ };
11933
+ const hairlinePrimaryStates = states(hairlinePrimary, hairlineOutline, 3);
11934
+ const hairlineSecondaryStates = states(hairlineSecondary, hairlineFilled, 3);
11935
+ const hairlineTabRecipe = defineStaticButtonStyleRecipe({
11936
+ id: "hairline-tab",
11937
+ accessibilityLabel: "Hairline tab",
11938
+ tags,
11939
+ system: { roles: {
11940
+ primary: { states: hairlinePrimaryStates },
11941
+ secondary: { states: hairlineSecondaryStates },
11942
+ outline: { states: hairlineSecondaryStates },
11943
+ ghost: { states: hairlineSecondaryStates },
11944
+ accent: { states: states(hairlineFilled, hairlineSecondary, 3) }
11945
+ } }
11946
+ });
11947
+ const marqueeAccent = {
11948
+ text: "treatment",
11949
+ borderRadius: "rounded-none",
11950
+ shadow: flatShadow,
11951
+ sizes: {
11952
+ sm: {
11953
+ padding: "8px 17px",
11954
+ fontSize: "text-15px"
11955
+ },
11956
+ md: {
11957
+ padding: "14px 25px",
11958
+ fontSize: "text-17px"
11959
+ },
11960
+ lg: {
11961
+ padding: "14px 25px",
11962
+ fontSize: "text-17px"
11963
+ },
11964
+ xl: {
11965
+ padding: "14px 25px",
11966
+ fontSize: "text-17px"
11967
+ }
11968
+ },
11969
+ typography: {
11970
+ fontWeight: 800,
11971
+ typography: "body",
11972
+ fontSize: "text-17px",
11973
+ letterSpacing: "loose",
11974
+ italic: false,
11975
+ textTransform: "uppercase"
11976
+ },
11977
+ effects: [],
11978
+ background: {
11979
+ type: "solid",
11980
+ colorToken: "accent"
11981
+ },
11982
+ border: {
11983
+ widthClass: "border-2",
11984
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
11985
+ }
11986
+ };
11987
+ const marqueePrimary = {
11988
+ ...marqueeAccent,
11989
+ background: {
11990
+ type: "solid",
11991
+ colorToken: "primary"
11992
+ },
11993
+ border: {
11994
+ widthClass: "border-2",
11995
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
11996
+ }
11997
+ };
11998
+ const marqueeSecondary = {
11999
+ ...marqueeAccent,
12000
+ background: {
12001
+ type: "solid",
12002
+ colorToken: "text"
12003
+ },
12004
+ border: {
12005
+ widthClass: "border-2",
12006
+ boundaryInk: unsafeAsOpaqueButtonColourToken("text")
12007
+ }
12008
+ };
12009
+ const marqueePrimaryStates = states(marqueeAccent, marqueePrimary, 4, 3);
12010
+ const marqueeSecondaryStates = states(marqueeSecondary, marqueeAccent, 4, 3);
12011
+ const marqueeRecipe = defineStaticButtonStyleRecipe({
12012
+ id: "marquee",
12013
+ accessibilityLabel: "Marquee",
12014
+ tags,
12015
+ system: { roles: {
12016
+ primary: { states: marqueePrimaryStates },
12017
+ secondary: { states: marqueeSecondaryStates },
12018
+ outline: { states: marqueeSecondaryStates },
12019
+ ghost: { states: marqueeSecondaryStates },
12020
+ accent: { states: marqueePrimaryStates }
12021
+ } }
12022
+ });
12023
+ //#endregion
11553
12024
  //#region ../theme-core/src/buttons/styles/recipes/fulcrumRecipe.ts
11554
12025
  const fulcrumSizes = {
11555
12026
  sm: {
@@ -12291,7 +12762,10 @@ const BUTTON_STYLE_IDS = [
12291
12762
  "offset-block",
12292
12763
  "ringed-pill",
12293
12764
  "square-outline",
12294
- "fulcrum"
12765
+ "fulcrum",
12766
+ "gilt-slab",
12767
+ "hairline-tab",
12768
+ "marquee"
12295
12769
  ];
12296
12770
  const quietArrowParametersSchema = z.object({ secondaryTreatment: z.enum(["outlined", "solid-accent"]) }).strict();
12297
12771
  const flatInkHoverTreatmentSchema = z.enum([
@@ -12328,7 +12802,10 @@ const buttonStyleSelectionSchema = z.discriminatedUnion("styleId", [
12328
12802
  selectionBranch("offset-block", emptyParametersSchema),
12329
12803
  selectionBranch("ringed-pill", emptyParametersSchema),
12330
12804
  selectionBranch("square-outline", emptyParametersSchema),
12331
- selectionBranch("fulcrum", emptyParametersSchema)
12805
+ selectionBranch("fulcrum", emptyParametersSchema),
12806
+ selectionBranch("gilt-slab", emptyParametersSchema),
12807
+ selectionBranch("hairline-tab", emptyParametersSchema),
12808
+ selectionBranch("marquee", emptyParametersSchema)
12332
12809
  ]);
12333
12810
  //#endregion
12334
12811
  //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
@@ -15844,7 +16321,10 @@ const buttonStyleRecipes = [
15844
16321
  offsetBlockRecipe,
15845
16322
  ringedPillRecipe,
15846
16323
  squareOutlineRecipe,
15847
- fulcrumRecipe
16324
+ fulcrumRecipe,
16325
+ giltSlabRecipe,
16326
+ hairlineTabRecipe,
16327
+ marqueeRecipe
15848
16328
  ];
15849
16329
  const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
15850
16330
  function findButtonStyleRecipe(id) {
@@ -15860,6 +16340,9 @@ function resolveButtonStyleSelection(selection) {
15860
16340
  case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
15861
16341
  case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
15862
16342
  case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
16343
+ case "gilt-slab": return resolveButtonStyleRecipe(giltSlabRecipe, selection.parameters);
16344
+ case "hairline-tab": return resolveButtonStyleRecipe(hairlineTabRecipe, selection.parameters);
16345
+ case "marquee": return resolveButtonStyleRecipe(marqueeRecipe, selection.parameters);
15863
16346
  case "fulcrum": return resolveButtonStyleRecipe(fulcrumRecipe, selection.parameters);
15864
16347
  case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
15865
16348
  case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
@@ -18091,20 +18574,15 @@ const headerSchema = z.object({
18091
18574
  const footerVariant = z.enum([
18092
18575
  "simple",
18093
18576
  "columns",
18094
- "split"
18095
- ]);
18577
+ "split",
18578
+ "centred"
18579
+ ]).transform((value) => value === "columns" ? "simple" : value);
18096
18580
  const footerMaxWidth = z.enum(["container", "full"]);
18097
18581
  const footerNavLayoutMode = z.enum([
18098
18582
  "stack",
18099
18583
  "inline",
18100
18584
  "inline-wrap"
18101
18585
  ]);
18102
- const footerNavLayoutAlign = z.enum([
18103
- "start",
18104
- "center",
18105
- "end",
18106
- "space-between"
18107
- ]);
18108
18586
  const footerSpacing = z.enum([
18109
18587
  "none",
18110
18588
  "tight",
@@ -18113,12 +18591,6 @@ const footerSpacing = z.enum([
18113
18591
  "relaxed",
18114
18592
  "spacious"
18115
18593
  ]);
18116
- const footerLogoPlacement = z.enum([
18117
- "left",
18118
- "right",
18119
- "above",
18120
- "below"
18121
- ]);
18122
18594
  const footerLogoSize = z.enum([
18123
18595
  "sm",
18124
18596
  "md",
@@ -18159,17 +18631,8 @@ const footerBottomBarSchema = z.object({
18159
18631
  ]).optional()
18160
18632
  }).optional()
18161
18633
  });
18162
- const footerNavLayoutSchema = z.object({
18163
- layout: footerNavLayoutMode.optional(),
18164
- align: footerNavLayoutAlign.optional(),
18165
- gapX: footerSpacing.optional(),
18166
- gapY: footerSpacing.optional(),
18167
- columns: z.number().int().min(1).max(6).optional()
18168
- });
18634
+ const footerNavLayoutSchema = z.object({ layout: footerNavLayoutMode.optional() });
18169
18635
  const footerLogoSchema = z.object({
18170
- showLogo: z.boolean().default(true),
18171
- showLogoText: z.boolean().optional(),
18172
- placement: footerLogoPlacement.optional(),
18173
18636
  size: footerLogoSize.optional(),
18174
18637
  maxHeight: footerLogoMaxHeight.optional(),
18175
18638
  align: z.enum([
@@ -18179,15 +18642,8 @@ const footerLogoSchema = z.object({
18179
18642
  ]).optional()
18180
18643
  });
18181
18644
  const footerSchema = z.object({
18182
- /**
18183
- * SDK-only footer rendering mode.
18184
- *
18185
- * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
18186
- */
18187
- mode: footerModeSchema.optional(),
18188
18645
  variant: footerVariant,
18189
18646
  maxWidth: footerMaxWidth,
18190
- showLogoText: z.boolean().optional(),
18191
18647
  background: headerBackgroundSchema.default({
18192
18648
  type: "color",
18193
18649
  color: "surface"
@@ -18370,7 +18826,9 @@ const cardListKnobBlocks = [...cardListFamilyBlocks, "block.event-calendar"];
18370
18826
  const lookKnobBlocks = {
18371
18827
  actionStyle: cardListKnobBlocks,
18372
18828
  titleSize: "block.hero",
18373
- imagePosition: "block.hero",
18829
+ imagePosition: ["block.hero", "block.media-text"],
18830
+ imageShape: "block.media-text",
18831
+ aspectRatio: "block.media-text",
18374
18832
  stickerLine: "block.hero",
18375
18833
  smallCaption: "block.hero",
18376
18834
  candleGlow: "block.hero",
@@ -18380,7 +18838,11 @@ const lookKnobBlocks = {
18380
18838
  dates: "block.offerings-preview",
18381
18839
  showCapacity: "block.event-calendar",
18382
18840
  quoteCount: "block.testimonials",
18383
- archFrame: "block.testimonials",
18841
+ archFrame: [
18842
+ "block.testimonials",
18843
+ "block.newsletter-signup",
18844
+ "block.form"
18845
+ ],
18384
18846
  tilt: "block.testimonials"
18385
18847
  };
18386
18848
  function isArrangementAppearancePreset(preset) {
@@ -18407,13 +18869,25 @@ function cardListKnobDefaults(block, arrangement, knobs, defaults) {
18407
18869
  }
18408
18870
  };
18409
18871
  }
18872
+ const arrangementLookTargets = {
18873
+ hero: "hero",
18874
+ "feature-cards": "feature-cards",
18875
+ "event-calendar": "events",
18876
+ testimonials: "testimonials",
18877
+ "event-details": "events",
18878
+ "media-text": "media-text",
18879
+ "image-gallery": "image-gallery",
18880
+ "newsletter-signup": "newsletter",
18881
+ form: "contact-form",
18882
+ "body-text": "body-text"
18883
+ };
18410
18884
  function defineArrangementLook(id, block, name, arrangement, knobs, input = {}) {
18411
18885
  const mode = block === "event-calendar" ? "list" : null;
18412
18886
  return {
18413
18887
  id: asAppearancePresetId(id),
18414
18888
  blockKinds: [`block.${block}`],
18415
18889
  label: name,
18416
- target: block === "event-calendar" || block === "event-details" ? "events" : block === "hero" ? "hero" : block === "testimonials" ? "testimonials" : "feature-cards",
18890
+ target: arrangementLookTargets[block],
18417
18891
  structure: {
18418
18892
  kind: "arrangement",
18419
18893
  byMode: { [mode ?? "default"]: arrangement },
@@ -19302,6 +19776,15 @@ const appearancePresets = [
19302
19776
  eyebrowTreatment: "accent"
19303
19777
  }
19304
19778
  }),
19779
+ defineArrangementLook("body-text-reading-column", "body-text", "Reading column", "prose", []),
19780
+ defineArrangementLook("form-beside-introduction-arched-panel", "form", "Introduction beside an arched form", "two-column", [], { slotRoles: { panel: "card" } }),
19781
+ defineArrangementLook("newsletter-signup-in-arch", "newsletter-signup", "Signup in an arch", "arch", []),
19782
+ defineArrangementLook("image-gallery-square-tiles", "image-gallery", "Square tiles", "tiles", []),
19783
+ defineArrangementLook("image-gallery-arched-captions", "image-gallery", "Arched photos with captions", "tiles", [], { styleFallback: [id$1("image-gallery-square-tiles")] }),
19784
+ defineArrangementLook("media-text-circle-beside-text", "media-text", "Circle beside the text", "circle-beside", ["imagePosition"], { forcedKnobs: {
19785
+ imageShape: "circle",
19786
+ aspectRatio: "1/1"
19787
+ } }),
19305
19788
  defineArrangementLook("hero-photo-beside-text", "hero", "Photo beside the text", "split", heroKnobs, { slotRoles: { sticker: "highlight" } }),
19306
19789
  defineArrangementLook("hero-headline-row", "hero", "Big headline, then text and photo", "headline-row", heroKnobs, {
19307
19790
  slotRoles: { sticker: "highlight" },
@@ -19887,6 +20370,49 @@ function requireThemeColorToken$1(value) {
19887
20370
  return token;
19888
20371
  }
19889
20372
  //#endregion
20373
+ //#region ../theme-core/src/header/rootPaint.ts
20374
+ /** The nav container takes precedence when a floating header also has one. */
20375
+ function headerRootPaint(header) {
20376
+ const navContainerType = header?.navContainer?.type ?? "none";
20377
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
20378
+ return header?.variant === "floating" ? "overlay" : "own-surface";
20379
+ }
20380
+ //#endregion
20381
+ //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
20382
+ const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
20383
+ const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
20384
+ siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
20385
+ function parseSiteChromeBackgroundColorToken(value) {
20386
+ const token = parseBackgroundAppearanceColorToken(value);
20387
+ return token ? token : null;
20388
+ }
20389
+ function toSiteChromeBackgroundColorTokens(tokenNames) {
20390
+ return tokenNames.flatMap((name) => {
20391
+ const token = parseSiteChromeBackgroundColorToken(name);
20392
+ return token ? [token] : [];
20393
+ });
20394
+ }
20395
+ const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
20396
+ const token = parseSiteChromeBackgroundColorToken(value);
20397
+ if (token === null) {
20398
+ ctx.addIssue({
20399
+ code: "custom",
20400
+ message: "Unknown site chrome background colour token"
20401
+ });
20402
+ return z.NEVER;
20403
+ }
20404
+ return token;
20405
+ });
20406
+ const siteChromeBackgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
20407
+ kind: z.literal("color"),
20408
+ token: backgroundColorTokenSchema
20409
+ }).strict()]);
20410
+ z.object({
20411
+ background: siteChromeBackgroundOverrideSchema,
20412
+ navigationLayout: z.enum(["inline-wrap", "stack"])
20413
+ }).strict();
20414
+ z.object({ background: siteChromeBackgroundOverrideSchema }).strict();
20415
+ //#endregion
19890
20416
  //#region ../theme-core/src/site-styles/compilationPlan.ts
19891
20417
  const defaultHeaderBrandPreferences = {
19892
20418
  brandDisplay: "auto",
@@ -20047,6 +20573,9 @@ function fallbackEndsAtOffer(entry, mode, style, catalogue, visited) {
20047
20573
  appearancePresets.filter(isArrangementAppearancePreset);
20048
20574
  /** Closed structural hooks shared by block arrangements and bounded skins. */
20049
20575
  const arrangementSlotNames = [
20576
+ "contact",
20577
+ "social",
20578
+ "base",
20050
20579
  "section",
20051
20580
  "stack",
20052
20581
  "inline",
@@ -20133,6 +20662,238 @@ function validateOfferKnobs(style, catalogue) {
20133
20662
  });
20134
20663
  }
20135
20664
  //#endregion
20665
+ //#region ../theme-core/src/site-styles/footerLookDefaults.ts
20666
+ const defaultFooterLookRecipes = {
20667
+ "footer-centred-name": {
20668
+ arrangement: "centred",
20669
+ ground: {
20670
+ kind: "token",
20671
+ token: "surface"
20672
+ },
20673
+ nav: {
20674
+ weight: "regular",
20675
+ colorToken: "text",
20676
+ hoverColorToken: "primary",
20677
+ typography: "body"
20678
+ },
20679
+ legal: {
20680
+ kind: "separate",
20681
+ bar: null
20682
+ },
20683
+ brandAlign: "center"
20684
+ },
20685
+ "footer-links-row": {
20686
+ arrangement: "simple",
20687
+ ground: {
20688
+ kind: "token",
20689
+ token: "surface"
20690
+ },
20691
+ nav: {
20692
+ weight: "regular",
20693
+ colorToken: "text",
20694
+ hoverColorToken: "primary",
20695
+ typography: "body"
20696
+ },
20697
+ legal: { kind: "integrated" },
20698
+ brandAlign: "start"
20699
+ }
20700
+ };
20701
+ /** A whole authored recipe replaces the default; facets are never deep-merged. */
20702
+ function resolveFooterLookRecipe(style, id) {
20703
+ return style?.footerLookRecipes?.[id] ?? defaultFooterLookRecipes[id];
20704
+ }
20705
+ //#endregion
20706
+ //#region ../theme-core/src/navigation/presets.ts
20707
+ /**
20708
+ * Built-in nav link style presets
20709
+ *
20710
+ * Each preset uses composable effects to achieve its look.
20711
+ */
20712
+ const NAV_LINK_PRESETS = {
20713
+ /**
20714
+ * Minimal - subtle color change on hover
20715
+ */
20716
+ minimal: {
20717
+ name: "Minimal",
20718
+ typography: "body",
20719
+ fontWeight: "medium",
20720
+ textTransform: "none",
20721
+ italic: false,
20722
+ colorToken: "text",
20723
+ hoverColorToken: "primary",
20724
+ padding: "none",
20725
+ borderRadius: "none",
20726
+ effects: { hover: [{
20727
+ effectId: "text-color-change",
20728
+ options: { hoverColorToken: "primary" }
20729
+ }] }
20730
+ },
20731
+ /**
20732
+ * Underline - static underline appears on hover
20733
+ */
20734
+ underline: {
20735
+ name: "Underline",
20736
+ typography: "body",
20737
+ fontWeight: "medium",
20738
+ textTransform: "none",
20739
+ italic: false,
20740
+ colorToken: "text",
20741
+ padding: "none",
20742
+ borderRadius: "none",
20743
+ effects: { hover: [{
20744
+ effectId: "nav-underline",
20745
+ options: { style: "static" }
20746
+ }] }
20747
+ },
20748
+ /**
20749
+ * Underline Grow - animated underline grows from center on hover
20750
+ */
20751
+ "underline-grow": {
20752
+ name: "Underline Grow",
20753
+ typography: "body",
20754
+ fontWeight: "medium",
20755
+ textTransform: "none",
20756
+ italic: false,
20757
+ colorToken: "text",
20758
+ padding: "none",
20759
+ borderRadius: "none",
20760
+ effects: { hover: [{
20761
+ effectId: "nav-underline",
20762
+ options: { style: "grow" }
20763
+ }] }
20764
+ },
20765
+ /**
20766
+ * Capsule - pill-shaped background on hover
20767
+ */
20768
+ capsule: {
20769
+ name: "Capsule",
20770
+ typography: "body",
20771
+ fontWeight: "medium",
20772
+ textTransform: "none",
20773
+ italic: false,
20774
+ colorToken: "text",
20775
+ padding: "compact",
20776
+ borderRadius: "full",
20777
+ effects: {
20778
+ hover: [{
20779
+ effectId: "background-on-hover-alpha",
20780
+ options: {
20781
+ colorToken: "primary",
20782
+ opacity: 10
20783
+ }
20784
+ }],
20785
+ active: [{
20786
+ effectId: "background-on-hover-alpha",
20787
+ options: {
20788
+ colorToken: "primary",
20789
+ opacity: 15
20790
+ }
20791
+ }]
20792
+ }
20793
+ },
20794
+ /**
20795
+ * Solid - solid background color on hover
20796
+ */
20797
+ solid: {
20798
+ name: "Solid",
20799
+ typography: "body",
20800
+ fontWeight: "medium",
20801
+ textTransform: "none",
20802
+ italic: false,
20803
+ colorToken: "text",
20804
+ padding: "compact",
20805
+ borderRadius: "none",
20806
+ effects: {
20807
+ hover: [{
20808
+ effectId: "background-on-hover",
20809
+ options: {
20810
+ colorToken: "primary",
20811
+ textColorToken: "primaryForeground"
20812
+ }
20813
+ }],
20814
+ active: [{
20815
+ effectId: "background-on-hover",
20816
+ options: {
20817
+ colorToken: "primary",
20818
+ textColorToken: "primaryForeground"
20819
+ }
20820
+ }]
20821
+ }
20822
+ },
20823
+ /**
20824
+ * Scale - gentle scale-up on hover
20825
+ */
20826
+ scale: {
20827
+ name: "Scale",
20828
+ typography: "body",
20829
+ fontWeight: "medium",
20830
+ textTransform: "none",
20831
+ italic: false,
20832
+ colorToken: "text",
20833
+ padding: "none",
20834
+ borderRadius: "none",
20835
+ effects: { hover: [{
20836
+ effectId: "scale-up",
20837
+ options: { scale: 1.05 }
20838
+ }] }
20839
+ },
20840
+ /**
20841
+ * Frosted - semi-transparent glass-like background
20842
+ */
20843
+ frosted: {
20844
+ name: "Frosted",
20845
+ typography: "body",
20846
+ fontWeight: "medium",
20847
+ textTransform: "none",
20848
+ italic: false,
20849
+ colorToken: "text",
20850
+ padding: "compact",
20851
+ borderRadius: "md",
20852
+ effects: {
20853
+ base: [{ effectId: "nav-frosted-base" }],
20854
+ hover: [{ effectId: "nav-frosted-hover" }],
20855
+ active: [{ effectId: "nav-frosted-active" }]
20856
+ }
20857
+ }
20858
+ };
20859
+ /**
20860
+ * Get a nav link style preset by ID
20861
+ */
20862
+ function getNavLinkPreset(presetId) {
20863
+ return NAV_LINK_PRESETS[presetId];
20864
+ }
20865
+ Object.keys(NAV_LINK_PRESETS);
20866
+ //#endregion
20867
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
20868
+ function effectiveFooterNavLinkStyle(footer) {
20869
+ if (!footer) return null;
20870
+ if (footer.navLinkStyle) return footer.navLinkStyle;
20871
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
20872
+ if (!basePreset) return null;
20873
+ return {
20874
+ ...basePreset,
20875
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
20876
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
20877
+ };
20878
+ }
20879
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
20880
+ if (!footer) return {};
20881
+ const style = effectiveFooterNavLinkStyle(footer);
20882
+ return {
20883
+ text: footer.background?.textColor ?? (footer.variant === "centred" ? "text" : void 0),
20884
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
20885
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
20886
+ };
20887
+ }
20888
+ //#endregion
20889
+ //#region ../theme-core/src/site-styles/footerLookRecipe.ts
20890
+ /** Reject undeclared references when the curated catalogue is loaded, before rendering. */
20891
+ function validateFooterRecipeSurfaces(style, recipe) {
20892
+ [recipe.ground, ...recipe.legal.kind === "separate" && recipe.legal.bar ? [recipe.legal.bar.background] : []].forEach((ground) => {
20893
+ if (ground.kind === "style-surface" && (style.looks.kind !== "offers" || !style.looks.surfaces[ground.surface])) throw new Error(`Undeclared footer surface: ${ground.surface}`);
20894
+ });
20895
+ }
20896
+ //#endregion
20136
20897
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
20137
20898
  /**
20138
20899
  * Reusable accordion "looks" for curated site styles.
@@ -20860,52 +21621,14 @@ defineLookOptionGroup({
20860
21621
  function asFooterLookId(value) {
20861
21622
  return value;
20862
21623
  }
20863
- function quietFooterLinks(theme) {
20864
- return {
20865
- ...theme.footer,
20866
- navStyle: "minimal",
20867
- navWeight: "regular",
20868
- navColor: "text",
20869
- navLinkStyle: {
20870
- typography: "body",
20871
- fontWeight: "regular",
20872
- textTransform: "none",
20873
- italic: false,
20874
- colorToken: "text",
20875
- hoverColorToken: "primary",
20876
- padding: "none",
20877
- borderRadius: "none"
20878
- }
20879
- };
20880
- }
20881
- function emphasizedFooterLinks(theme) {
20882
- return {
20883
- ...theme.footer,
20884
- navStyle: "minimal",
20885
- navWeight: "medium",
20886
- navColor: "text",
20887
- navLinkStyle: {
20888
- typography: "body",
20889
- fontWeight: "medium",
20890
- textTransform: "none",
20891
- italic: false,
20892
- colorToken: "text",
20893
- hoverColorToken: "primary",
20894
- padding: "none",
20895
- borderRadius: "none"
20896
- }
20897
- };
20898
- }
20899
21624
  const footerLookCatalog = defineExactCatalog()([{
20900
- id: asFooterLookId("footer-links-quiet"),
20901
- label: "Quiet links",
20902
- description: "Regular-weight footer navigation with a restrained hover.",
20903
- compile: quietFooterLinks
21625
+ id: asFooterLookId("footer-links-row"),
21626
+ label: "Links in a row",
21627
+ description: "Your links in a row, with the other footer sections in columns beside them."
20904
21628
  }, {
20905
- id: asFooterLookId("footer-links-emphasized"),
20906
- label: "Emphasized links",
20907
- description: "Medium-weight footer navigation with a clearer emphasis.",
20908
- compile: emphasizedFooterLinks
21629
+ id: asFooterLookId("footer-centred-name"),
21630
+ label: "Centred name, links beneath",
21631
+ description: "Your site name centred, with your links, contact details and social links beneath it."
20909
21632
  }]);
20910
21633
  new Map(footerLookCatalog.map((look) => [look.id, look]));
20911
21634
  //#endregion
@@ -22322,6 +23045,7 @@ function defineCuratedSiteStyle(input) {
22322
23045
  recommendedAppearancePresetIds
22323
23046
  },
22324
23047
  headerCuration: headerCurationBySiteStyle[input.id],
23048
+ footerLookRecipes: input.footerLookRecipes,
22325
23049
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
22326
23050
  buttonStyleChoices: input.buttonStyleChoices,
22327
23051
  paletteRecommendations: input.paletteRecommendations,
@@ -22807,7 +23531,11 @@ const lanternLooks = {
22807
23531
  margin: "40px"
22808
23532
  },
22809
23533
  fontLoading: {
22810
- extraBodyFontWeights: [500, 700],
23534
+ extraBodyFontWeights: [
23535
+ 500,
23536
+ 700,
23537
+ 800
23538
+ ],
22811
23539
  italicBodyFontWeights: [400]
22812
23540
  },
22813
23541
  surfaces: {
@@ -22857,6 +23585,38 @@ const lanternLooks = {
22857
23585
  ]
22858
23586
  },
22859
23587
  offers: [
23588
+ {
23589
+ id: id("body-text-reading-column"),
23590
+ treatment: "reading-column",
23591
+ roleMap: lanternRoles
23592
+ },
23593
+ {
23594
+ id: id("form-beside-introduction-arched-panel"),
23595
+ treatment: "arched-panel",
23596
+ addKnobs: ["archFrame"],
23597
+ roleMap: lanternRoles
23598
+ },
23599
+ {
23600
+ id: id("newsletter-signup-in-arch"),
23601
+ treatment: "signup-arch",
23602
+ addKnobs: ["archFrame"],
23603
+ roleMap: lanternRoles
23604
+ },
23605
+ {
23606
+ id: id("image-gallery-square-tiles"),
23607
+ treatment: "square-tiles",
23608
+ roleMap: lanternRoles
23609
+ },
23610
+ {
23611
+ id: id("image-gallery-arched-captions"),
23612
+ treatment: "arched-captions",
23613
+ roleMap: lanternRoles
23614
+ },
23615
+ {
23616
+ id: id("media-text-circle-beside-text"),
23617
+ treatment: "circle-beside",
23618
+ roleMap: lanternRoles
23619
+ },
22860
23620
  {
22861
23621
  id: id("event-details-panel"),
22862
23622
  treatment: "quiet",
@@ -23295,7 +24055,7 @@ const curatedSiteStyles = [
23295
24055
  "faq-contained-help",
23296
24056
  "contact-form-panel"
23297
24057
  ],
23298
- recommendedFooterLookIds: ["footer-links-quiet"],
24058
+ recommendedFooterLookIds: ["footer-links-row"],
23299
24059
  buttonStyleChoices: [
23300
24060
  buttonChoice("soft-pill"),
23301
24061
  buttonChoice("pebble"),
@@ -23414,7 +24174,7 @@ const curatedSiteStyles = [
23414
24174
  "testimonials-non-carded",
23415
24175
  "contact-form-panel"
23416
24176
  ],
23417
- recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
24177
+ recommendedFooterLookIds: ["footer-links-row"],
23418
24178
  buttonStyleChoices: [
23419
24179
  buttonChoice("earth-pill"),
23420
24180
  buttonChoice("soft-pill"),
@@ -23469,7 +24229,41 @@ const curatedSiteStyles = [
23469
24229
  "testimonials-brand-statement-cards",
23470
24230
  "contact-form-panel"
23471
24231
  ],
23472
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
24232
+ footerLookRecipes: { "footer-links-row": {
24233
+ arrangement: "split",
24234
+ ground: {
24235
+ kind: "token",
24236
+ token: "primary-800"
24237
+ },
24238
+ nav: {
24239
+ weight: "medium",
24240
+ colorToken: "primaryForeground",
24241
+ hoverColorToken: "secondary",
24242
+ typography: "body"
24243
+ },
24244
+ legal: {
24245
+ kind: "separate",
24246
+ bar: {
24247
+ fullBleed: true,
24248
+ background: {
24249
+ kind: "token",
24250
+ token: "primary-900"
24251
+ },
24252
+ textColor: "primaryForeground",
24253
+ textAlign: "center",
24254
+ paddingY: "compact",
24255
+ paddingX: "default",
24256
+ borderTop: { width: "none" }
24257
+ },
24258
+ linkStyle: {
24259
+ colorToken: "secondary",
24260
+ decorationColorToken: "secondary"
24261
+ }
24262
+ },
24263
+ brandAlign: "start",
24264
+ brandLogoSize: "sm"
24265
+ } },
24266
+ recommendedFooterLookIds: ["footer-links-row"],
23473
24267
  buttonStyleChoices: [
23474
24268
  buttonChoice("showtime-pill"),
23475
24269
  buttonChoice("confident-chip"),
@@ -23540,7 +24334,7 @@ const curatedSiteStyles = [
23540
24334
  "testimonials-statement-cards",
23541
24335
  "contact-form-panel"
23542
24336
  ],
23543
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
24337
+ recommendedFooterLookIds: ["footer-links-row"],
23544
24338
  buttonStyleChoices: [
23545
24339
  buttonChoice("ornate-ritual"),
23546
24340
  buttonChoice("joy-stamp"),
@@ -23587,7 +24381,22 @@ const curatedSiteStyles = [
23587
24381
  } }
23588
24382
  },
23589
24383
  recommendedAppearancePresetIds: ["feature-cards-bold-colors", "testimonials-statement-cards"],
23590
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
24384
+ footerLookRecipes: { "footer-links-row": {
24385
+ arrangement: "simple",
24386
+ ground: {
24387
+ kind: "token",
24388
+ token: "surface"
24389
+ },
24390
+ nav: {
24391
+ weight: "medium",
24392
+ colorToken: "text",
24393
+ hoverColorToken: "primary",
24394
+ typography: "body"
24395
+ },
24396
+ legal: { kind: "integrated" },
24397
+ brandAlign: "start"
24398
+ } },
24399
+ recommendedFooterLookIds: ["footer-links-row"],
23591
24400
  buttonStyleChoices: [
23592
24401
  buttonChoice("joy-stamp"),
23593
24402
  buttonChoice("ink-stamp"),
@@ -23639,7 +24448,7 @@ const curatedSiteStyles = [
23639
24448
  },
23640
24449
  testimonialQuote: serifDisplayQuote
23641
24450
  },
23642
- recommendedFooterLookIds: ["footer-links-quiet"],
24451
+ recommendedFooterLookIds: ["footer-links-row"],
23643
24452
  buttonStyleChoices: [
23644
24453
  buttonChoice("fulcrum"),
23645
24454
  buttonChoice("editorial-link"),
@@ -23716,7 +24525,7 @@ const curatedSiteStyles = [
23716
24525
  "faq-base-accordion",
23717
24526
  "booking-brand-band"
23718
24527
  ],
23719
- recommendedFooterLookIds: ["footer-links-quiet"],
24528
+ recommendedFooterLookIds: ["footer-links-row"],
23720
24529
  buttonStyleChoices: [
23721
24530
  buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
23722
24531
  buttonChoice("flat-ink"),
@@ -23754,7 +24563,22 @@ const curatedSiteStyles = [
23754
24563
  accordions: boldBorderedAccordionSystem,
23755
24564
  testimonialQuote: accentGlyphQuote
23756
24565
  },
23757
- recommendedFooterLookIds: ["footer-links-emphasized"],
24566
+ footerLookRecipes: { "footer-links-row": {
24567
+ arrangement: "simple",
24568
+ ground: {
24569
+ kind: "token",
24570
+ token: "surface"
24571
+ },
24572
+ nav: {
24573
+ weight: "medium",
24574
+ colorToken: "text",
24575
+ hoverColorToken: "primary",
24576
+ typography: "body"
24577
+ },
24578
+ legal: { kind: "integrated" },
24579
+ brandAlign: "start"
24580
+ } },
24581
+ recommendedFooterLookIds: ["footer-links-row"],
23758
24582
  buttonStyleChoices: [
23759
24583
  buttonChoice("offset-block"),
23760
24584
  buttonChoice("ink-stamp"),
@@ -23793,8 +24617,29 @@ const curatedSiteStyles = [
23793
24617
  accordions: warmInsetAccordionSystem,
23794
24618
  testimonialQuote: serifDisplayQuote
23795
24619
  },
23796
- recommendedFooterLookIds: ["footer-links-quiet"],
24620
+ footerLookRecipes: { "footer-centred-name": {
24621
+ arrangement: "centred",
24622
+ ground: {
24623
+ kind: "style-surface",
24624
+ surface: "deep"
24625
+ },
24626
+ nav: {
24627
+ weight: "regular",
24628
+ colorToken: "text",
24629
+ hoverColorToken: "primary",
24630
+ typography: "heading"
24631
+ },
24632
+ legal: {
24633
+ kind: "separate",
24634
+ bar: null
24635
+ },
24636
+ brandAlign: "center"
24637
+ } },
24638
+ recommendedFooterLookIds: ["footer-centred-name", "footer-links-row"],
23797
24639
  buttonStyleChoices: [
24640
+ buttonChoice("gilt-slab"),
24641
+ buttonChoice("hairline-tab"),
24642
+ buttonChoice("marquee"),
23798
24643
  buttonChoice("ringed-pill"),
23799
24644
  buttonChoice("earth-pill"),
23800
24645
  buttonChoice("editorial-link")
@@ -23829,7 +24674,7 @@ const curatedSiteStyles = [
23829
24674
  accordions: editorialDividedAccordionSystem,
23830
24675
  testimonialQuote: serifDisplayQuote
23831
24676
  },
23832
- recommendedFooterLookIds: ["footer-links-quiet"],
24677
+ recommendedFooterLookIds: ["footer-links-row"],
23833
24678
  buttonStyleChoices: [
23834
24679
  buttonChoice("flat-ink", void 0, { corners: "square" }),
23835
24680
  buttonChoice("editorial-link"),
@@ -23857,6 +24702,7 @@ function curatedStyleTemplate(input) {
23857
24702
  }
23858
24703
  curatedSiteStyles.forEach((style) => {
23859
24704
  if (style.looks.kind === "offers") validateLookFallbacks(style.looks);
24705
+ (/* @__PURE__ */ new Set([...Object.values(style.footerLookRecipes ?? {}), ...style.recommendedFooterLookIds.map((id) => resolveFooterLookRecipe(style, id))])).forEach((recipe) => validateFooterRecipeSurfaces(style, recipe));
23860
24706
  });
23861
24707
  //#endregion
23862
24708
  //#region ../theme-core/src/site-styles/effectiveArrangement.ts
@@ -23954,29 +24800,6 @@ const blockDesignFallback = {
23954
24800
  };
23955
24801
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
23956
24802
  //#endregion
23957
- //#region ../theme-core/src/header/rootPaint.ts
23958
- /** The nav container takes precedence when a floating header also has one. */
23959
- function headerRootPaint(header) {
23960
- const navContainerType = header?.navContainer?.type ?? "none";
23961
- if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
23962
- return header?.variant === "floating" ? "overlay" : "own-surface";
23963
- }
23964
- //#endregion
23965
- //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
23966
- const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
23967
- const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
23968
- siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
23969
- function parseSiteChromeBackgroundColorToken(value) {
23970
- const token = parseBackgroundAppearanceColorToken(value);
23971
- return token ? token : null;
23972
- }
23973
- function toSiteChromeBackgroundColorTokens(tokenNames) {
23974
- return tokenNames.flatMap((name) => {
23975
- const token = parseSiteChromeBackgroundColorToken(name);
23976
- return token ? [token] : [];
23977
- });
23978
- }
23979
- //#endregion
23980
24803
  //#region ../theme-core/src/site-styles/siteChromeNavPreferences.ts
23981
24804
  const headerNavTypographyPreferenceValues = [
23982
24805
  "inherit",
@@ -24092,21 +24915,6 @@ z.object({
24092
24915
  }).strict();
24093
24916
  //#endregion
24094
24917
  //#region ../theme-core/src/site-styles/headerPreferencesPersistence.ts
24095
- const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
24096
- const token = parseSiteChromeBackgroundColorToken(value);
24097
- if (token === null) {
24098
- ctx.addIssue({
24099
- code: "custom",
24100
- message: "Unknown site chrome background colour token"
24101
- });
24102
- return z.NEVER;
24103
- }
24104
- return token;
24105
- });
24106
- const backgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
24107
- kind: z.literal("color"),
24108
- token: backgroundColorTokenSchema
24109
- }).strict()]);
24110
24918
  const logoTextIntentSchema = z.object({
24111
24919
  mobileMaxWidth: z.enum([
24112
24920
  "xs",
@@ -24132,7 +24940,7 @@ const headerPreferencesShape = {
24132
24940
  navFontRole: z.enum(headerNavTypographyPreferenceValues),
24133
24941
  navTextSize: z.enum(headerNavFontSizePreferenceValues),
24134
24942
  interactionPalette: z.union([z.literal("recommended"), z.enum(headerInteractionPaletteValues)]),
24135
- background: backgroundOverrideSchema,
24943
+ background: siteChromeBackgroundOverrideSchema,
24136
24944
  structure: structureSchema
24137
24945
  };
24138
24946
  z.object(headerPreferencesShape).strict();
@@ -24141,167 +24949,6 @@ z.object(headerPreferencesShape).omit({
24141
24949
  structure: true
24142
24950
  }).strict();
24143
24951
  //#endregion
24144
- //#region ../theme-core/src/navigation/presets.ts
24145
- /**
24146
- * Built-in nav link style presets
24147
- *
24148
- * Each preset uses composable effects to achieve its look.
24149
- */
24150
- const NAV_LINK_PRESETS = {
24151
- /**
24152
- * Minimal - subtle color change on hover
24153
- */
24154
- minimal: {
24155
- name: "Minimal",
24156
- typography: "body",
24157
- fontWeight: "medium",
24158
- textTransform: "none",
24159
- italic: false,
24160
- colorToken: "text",
24161
- hoverColorToken: "primary",
24162
- padding: "none",
24163
- borderRadius: "none",
24164
- effects: { hover: [{
24165
- effectId: "text-color-change",
24166
- options: { hoverColorToken: "primary" }
24167
- }] }
24168
- },
24169
- /**
24170
- * Underline - static underline appears on hover
24171
- */
24172
- underline: {
24173
- name: "Underline",
24174
- typography: "body",
24175
- fontWeight: "medium",
24176
- textTransform: "none",
24177
- italic: false,
24178
- colorToken: "text",
24179
- padding: "none",
24180
- borderRadius: "none",
24181
- effects: { hover: [{
24182
- effectId: "nav-underline",
24183
- options: { style: "static" }
24184
- }] }
24185
- },
24186
- /**
24187
- * Underline Grow - animated underline grows from center on hover
24188
- */
24189
- "underline-grow": {
24190
- name: "Underline Grow",
24191
- typography: "body",
24192
- fontWeight: "medium",
24193
- textTransform: "none",
24194
- italic: false,
24195
- colorToken: "text",
24196
- padding: "none",
24197
- borderRadius: "none",
24198
- effects: { hover: [{
24199
- effectId: "nav-underline",
24200
- options: { style: "grow" }
24201
- }] }
24202
- },
24203
- /**
24204
- * Capsule - pill-shaped background on hover
24205
- */
24206
- capsule: {
24207
- name: "Capsule",
24208
- typography: "body",
24209
- fontWeight: "medium",
24210
- textTransform: "none",
24211
- italic: false,
24212
- colorToken: "text",
24213
- padding: "compact",
24214
- borderRadius: "full",
24215
- effects: {
24216
- hover: [{
24217
- effectId: "background-on-hover-alpha",
24218
- options: {
24219
- colorToken: "primary",
24220
- opacity: 10
24221
- }
24222
- }],
24223
- active: [{
24224
- effectId: "background-on-hover-alpha",
24225
- options: {
24226
- colorToken: "primary",
24227
- opacity: 15
24228
- }
24229
- }]
24230
- }
24231
- },
24232
- /**
24233
- * Solid - solid background color on hover
24234
- */
24235
- solid: {
24236
- name: "Solid",
24237
- typography: "body",
24238
- fontWeight: "medium",
24239
- textTransform: "none",
24240
- italic: false,
24241
- colorToken: "text",
24242
- padding: "compact",
24243
- borderRadius: "none",
24244
- effects: {
24245
- hover: [{
24246
- effectId: "background-on-hover",
24247
- options: {
24248
- colorToken: "primary",
24249
- textColorToken: "primaryForeground"
24250
- }
24251
- }],
24252
- active: [{
24253
- effectId: "background-on-hover",
24254
- options: {
24255
- colorToken: "primary",
24256
- textColorToken: "primaryForeground"
24257
- }
24258
- }]
24259
- }
24260
- },
24261
- /**
24262
- * Scale - gentle scale-up on hover
24263
- */
24264
- scale: {
24265
- name: "Scale",
24266
- typography: "body",
24267
- fontWeight: "medium",
24268
- textTransform: "none",
24269
- italic: false,
24270
- colorToken: "text",
24271
- padding: "none",
24272
- borderRadius: "none",
24273
- effects: { hover: [{
24274
- effectId: "scale-up",
24275
- options: { scale: 1.05 }
24276
- }] }
24277
- },
24278
- /**
24279
- * Frosted - semi-transparent glass-like background
24280
- */
24281
- frosted: {
24282
- name: "Frosted",
24283
- typography: "body",
24284
- fontWeight: "medium",
24285
- textTransform: "none",
24286
- italic: false,
24287
- colorToken: "text",
24288
- padding: "compact",
24289
- borderRadius: "md",
24290
- effects: {
24291
- base: [{ effectId: "nav-frosted-base" }],
24292
- hover: [{ effectId: "nav-frosted-hover" }],
24293
- active: [{ effectId: "nav-frosted-active" }]
24294
- }
24295
- }
24296
- };
24297
- /**
24298
- * Get a nav link style preset by ID
24299
- */
24300
- function getNavLinkPreset(presetId) {
24301
- return NAV_LINK_PRESETS[presetId];
24302
- }
24303
- Object.keys(NAV_LINK_PRESETS);
24304
- //#endregion
24305
24952
  //#region ../theme-core/src/header/legacyNavLinkStyle.ts
24306
24953
  function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
24307
24954
  const navStyle = header.navStyle ?? "minimal";
@@ -24546,28 +25193,6 @@ z.object({
24546
25193
  motion: z.enum(themeTokenRecipeOptions.motion)
24547
25194
  });
24548
25195
  //#endregion
24549
- //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
24550
- function effectiveFooterNavLinkStyle(footer) {
24551
- if (!footer) return null;
24552
- if (footer.navLinkStyle) return footer.navLinkStyle;
24553
- const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
24554
- if (!basePreset) return null;
24555
- return {
24556
- ...basePreset,
24557
- fontWeight: footer.navWeight ?? basePreset.fontWeight,
24558
- colorToken: footer.navColor?.trim() || basePreset.colorToken
24559
- };
24560
- }
24561
- function footerForegroundCandidates(footer, proseHoverCandidate) {
24562
- if (!footer) return {};
24563
- const style = effectiveFooterNavLinkStyle(footer);
24564
- return {
24565
- text: footer.background?.textColor,
24566
- link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
24567
- linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
24568
- };
24569
- }
24570
- //#endregion
24571
25196
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
24572
25197
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
24573
25198
  //#endregion
@@ -29410,7 +30035,12 @@ function resolveRuntimeSectionSurface(value, context, options) {
29410
30035
  }
29411
30036
  function arrangementSurfaceInk(foreground, context) {
29412
30037
  if (context.data?._lookSlots === void 0) return {};
29413
- const decorations = surfaceDecorationColors(foreground, context.theme.palette);
30038
+ return surfaceInkStyles(foreground, context.theme.palette);
30039
+ }
30040
+ /** Decoration roles already resolved by the surface owner, shared with footer arrangements. */
30041
+ function surfaceInkStyles(foreground, palette) {
30042
+ if (foreground.kind === "unknown") return {};
30043
+ const decorations = surfaceDecorationColors(foreground, palette);
29414
30044
  return {
29415
30045
  "--rb-surface-muted-color": foreground.roles.muted ?? foreground.roles.text,
29416
30046
  ...decorations ? {
@@ -30017,48 +30647,50 @@ const boxStylesTransforms = [
30017
30647
  ];
30018
30648
  //#endregion
30019
30649
  //#region ../blocks/src/system/node/fragments/responsiveTwoColumn.ts
30020
- 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" }) {
30021
- const baseClass = !gapFrom ? `${containerClassName} ${gapClassName}`.trim() : containerClassName;
30022
- const props = { className: { $bind: {
30023
- from: imagePositionFrom,
30024
- transforms: [{
30025
- id: "ui.twoColumnContainerClass",
30026
- options: {
30027
- base: baseClass,
30028
- reverseClass: "rb-md-flex-row-reverse"
30029
- }
30030
- }],
30031
- fallback: baseClass
30032
- } } };
30033
- if (gapFrom) props.style = { gap: { $bind: {
30034
- from: gapFrom,
30035
- transforms: [{
30036
- id: "boxStyles.semanticGapValue",
30037
- options: { fallback: gapFallback }
30038
- }],
30039
- fallback: GAP_VALUE_MAP[gapFallback]
30040
- } } };
30041
- return el("div", props, [el("div", {
30042
- className: imageWrapperClassName,
30043
- style: { flexBasis: { $bind: {
30044
- from: ratioFrom,
30650
+ /** The shared two-column shell keeps Look hooks opt-in and absent for legacy content. */
30651
+ function responsiveTwoColumn(config) {
30652
+ return el("div", twoColumnProps(config), [twoColumnWrapper(config, "image", config.image), twoColumnWrapper(config, "text", config.text)]);
30653
+ }
30654
+ function twoColumnProps(config) {
30655
+ const base = `${config.containerClassName ?? "rb-flex rb-flex-col rb-md-flex-row"} ${config.gapFrom ? "" : config.gapClassName ?? "rb-gap-6"}`.trim();
30656
+ const fallback = config.gapFallback ?? "comfortable";
30657
+ return {
30658
+ ...config.lookSlots ? lookSlot("frame") : {},
30659
+ className: { $bind: {
30660
+ from: config.imagePositionFrom,
30045
30661
  transforms: [{
30046
- id: "ui.twoColumnFlexBasis",
30047
- options: { side: "image" }
30662
+ id: "ui.twoColumnContainerClass",
30663
+ options: {
30664
+ base,
30665
+ reverseClass: "rb-md-flex-row-reverse"
30666
+ }
30048
30667
  }],
30049
- fallback: "50%"
30050
- } } }
30051
- }, [image]), el("div", {
30052
- className: textWrapperClassName,
30668
+ fallback: base
30669
+ } },
30670
+ ...config.gapFrom ? { style: { gap: { $bind: {
30671
+ from: config.gapFrom,
30672
+ transforms: [{
30673
+ id: "boxStyles.semanticGapValue",
30674
+ options: { fallback }
30675
+ }],
30676
+ fallback: GAP_VALUE_MAP[fallback]
30677
+ } } } } : {}
30678
+ };
30679
+ }
30680
+ function twoColumnWrapper(config, side, child) {
30681
+ const className = side === "image" ? config.imageWrapperClassName ?? "rb-w-full rb-shrink-0" : config.textWrapperClassName ?? "rb-w-full rb-min-w-0 rb-flex-1";
30682
+ return el("div", {
30683
+ ...config.lookSlots ? lookSlot(side === "image" ? "media" : "copy") : {},
30684
+ className,
30053
30685
  style: { flexBasis: { $bind: {
30054
- from: ratioFrom,
30686
+ from: config.ratioFrom,
30055
30687
  transforms: [{
30056
30688
  id: "ui.twoColumnFlexBasis",
30057
- options: { side: "text" }
30689
+ options: { side }
30058
30690
  }],
30059
30691
  fallback: "50%"
30060
30692
  } } }
30061
- }, [text])]);
30693
+ }, [child]);
30062
30694
  }
30063
30695
  //#endregion
30064
30696
  //#region ../blocks/src/system/node/fragments/styledCard.ts
@@ -30245,6 +30877,47 @@ function sectionState(opts) {
30245
30877
  })]);
30246
30878
  }
30247
30879
  //#endregion
30880
+ //#region ../blocks/src/system/node/fragments/sectionHead.ts
30881
+ const recoverEmptyHeadingWhenActive = {
30882
+ kind: "recover-empty-when-active",
30883
+ placeholder: "Add heading"
30884
+ };
30885
+ const recoverEmptyDescriptionWhenActive = {
30886
+ kind: "recover-empty-when-active",
30887
+ placeholder: "Add description"
30888
+ };
30889
+ function sectionHeaderLayoutNodes(options = {}) {
30890
+ const headingNode = text({
30891
+ as: "h2",
30892
+ ...lookSlot("heading")
30893
+ }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
30894
+ const descriptionNode = richText({
30895
+ className: "rb-prose rb-max-w-none",
30896
+ ...lookSlot("intro")
30897
+ }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
30898
+ if (options.splitClassName) return [el("div", {
30899
+ className: options.splitClassName,
30900
+ ...lookSlot("head")
30901
+ }, [headingNode, descriptionNode])];
30902
+ return [headingNode, descriptionNode];
30903
+ }
30904
+ /** Shared optional section copy. Existing consumers keep their description ID. */
30905
+ const sectionHeaderFields = (defaultHeading, introLabel = "Description") => [{
30906
+ id: "heading",
30907
+ type: "text",
30908
+ label: "Heading",
30909
+ description: "Main heading for the section",
30910
+ required: false,
30911
+ multiline: false,
30912
+ ...defaultHeading === void 0 ? {} : { defaultValue: defaultHeading }
30913
+ }, {
30914
+ id: "description",
30915
+ type: "richText",
30916
+ label: introLabel,
30917
+ description: "Optional introductory text",
30918
+ required: false
30919
+ }];
30920
+ //#endregion
30248
30921
  //#region ../blocks/src/system/fragments/types.ts
30249
30922
  const FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
30250
30923
  const FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;
@@ -30577,6 +31250,7 @@ const bodyCopyFragment = defineFragment({
30577
31250
  ],
30578
31251
  layout: stack({
30579
31252
  gap: "md",
31253
+ ...lookSlot("copy"),
30580
31254
  className: "body-copy-container",
30581
31255
  align: { $bind: {
30582
31256
  from: "content.alignment",
@@ -30585,6 +31259,7 @@ const bodyCopyFragment = defineFragment({
30585
31259
  } }
30586
31260
  }, [text({
30587
31261
  as: "h2",
31262
+ ...lookSlot("heading"),
30588
31263
  className: { $bind: {
30589
31264
  from: "content.alignment",
30590
31265
  transforms: [{
@@ -30593,14 +31268,22 @@ const bodyCopyFragment = defineFragment({
30593
31268
  }],
30594
31269
  fallback: "body-copy-heading"
30595
31270
  } }
30596
- }, when("content.heading"), bind("content.heading")), richText({ className: { $bind: {
30597
- from: "content.alignment",
30598
- transforms: [{
30599
- id: "ui.bodyClassFromAlignment",
30600
- options: { base: "body-copy-body rb-prose rb-max-w-none" }
30601
- }],
30602
- fallback: "body-copy-body rb-prose rb-max-w-none"
30603
- } } }, bind("content.body"))])
31271
+ }, when("content.heading", { authoringPresence: {
31272
+ kind: "recover-empty-when-active",
31273
+ placeholder: "Add heading"
31274
+ } }), bind("content.heading")), richText({
31275
+ ...lookSlot("item-body"),
31276
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
31277
+ lookSlots: { $bind: { from: "content._lookSlots" } },
31278
+ className: { $bind: {
31279
+ from: "content.alignment",
31280
+ transforms: [{
31281
+ id: "ui.bodyClassFromAlignment",
31282
+ options: { base: "body-copy-body rb-prose rb-max-w-none" }
31283
+ }],
31284
+ fallback: "body-copy-body rb-prose rb-max-w-none"
31285
+ } }
31286
+ }, bind("content.body"))])
30604
31287
  });
30605
31288
  //#endregion
30606
31289
  //#region ../blocks/src/system/fragments/library/heroCopy.ts
@@ -31616,8 +32299,19 @@ const formCopyFragment = defineFragment({
31616
32299
  }],
31617
32300
  layout: [text({
31618
32301
  as: "h2",
32302
+ ...lookSlot("heading"),
31619
32303
  className: "form-copy-title"
31620
- }, when("content.title"), bind("content.title")), richText({ className: "form-copy-intro rb-prose rb-max-w-none" }, when("content.intro"), bind("content.intro"))]
32304
+ }, when("content.title", { authoringPresence: {
32305
+ kind: "recover-empty-when-active",
32306
+ placeholder: "Add heading"
32307
+ } }), bind("content.title")), richText({
32308
+ className: "form-copy-intro rb-prose rb-max-w-none",
32309
+ ...lookSlot("intro"),
32310
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } }
32311
+ }, when("content.intro", { authoringPresence: {
32312
+ kind: "recover-empty-when-active",
32313
+ placeholder: "Add introduction"
32314
+ } }), bind("content.intro"))]
31621
32315
  });
31622
32316
  //#endregion
31623
32317
  //#region ../blocks/src/system/helpers/api-bindings.ts
@@ -31666,6 +32360,7 @@ const formEmbedFragment = defineFragment({
31666
32360
  }
31667
32361
  ],
31668
32362
  layout: [form(withApiBindings({
32363
+ lookSlots: { $bind: { from: "content._lookSlots" } },
31669
32364
  spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
31670
32365
  submitLabel: { $bind: { from: "submitLabel" } },
31671
32366
  successMessage: { $bind: { from: "successMessage" } }
@@ -31919,8 +32614,18 @@ const newsletterCopyFragment = defineFragment({
31919
32614
  }],
31920
32615
  layout: [text({
31921
32616
  as: "h2",
31922
- className: "newsletter-copy-title"
31923
- }, when("content.title"), bind("content.title")), richText({ className: "newsletter-copy-subtitle rb-prose rb-max-w-none" }, when("content.subtitle"), bind("content.subtitle"))]
32617
+ className: "newsletter-copy-title",
32618
+ ...lookSlot("heading")
32619
+ }, when("content.title", { authoringPresence: {
32620
+ kind: "recover-empty-when-active",
32621
+ placeholder: "Add heading"
32622
+ } }), bind("content.title")), richText({
32623
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none",
32624
+ ...lookSlot("intro")
32625
+ }, when("content.subtitle", { authoringPresence: {
32626
+ kind: "recover-empty-when-active",
32627
+ placeholder: "Add introduction"
32628
+ } }), bind("content.subtitle"))]
31924
32629
  });
31925
32630
  //#endregion
31926
32631
  //#region ../blocks/src/system/fragments/library/newsletterForm.ts
@@ -31988,6 +32693,7 @@ const newsletterFormFragment = defineFragment({
31988
32693
  }
31989
32694
  ],
31990
32695
  layout: [el("newsletter-form", withApiBindings({
32696
+ lookSlots: { $bind: { from: "content._lookSlots" } },
31991
32697
  source: { $bind: {
31992
32698
  from: "mailingListSource",
31993
32699
  fallback: "block"
@@ -33480,18 +34186,11 @@ const introBlockDefinition = { manifest: createBlockManifest({
33480
34186
  //#endregion
33481
34187
  //#region ../blocks/src/system/blocks/body-text.ts
33482
34188
  const bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
33483
- const proseLayout = styledSection({
33484
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
33485
- spacing: "medium",
33486
- baseClass: ""
33487
- });
33488
- const introLayout = styledSection({
33489
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
33490
- spacing: "medium",
33491
- baseClass: ""
33492
- });
33493
- const narrowLayout = styledSection({
33494
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
34189
+ const bodyTextLayout = styledSection({
34190
+ children: stack({
34191
+ className: "rb-container",
34192
+ ...lookSlot("frame")
34193
+ }, bodyCopyComposition.layout),
33495
34194
  spacing: "medium",
33496
34195
  baseClass: ""
33497
34196
  });
@@ -33505,11 +34204,11 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
33505
34204
  fragment: bodyCopyFragment,
33506
34205
  fieldPriority: 0
33507
34206
  }],
33508
- layout: proseLayout,
34207
+ layout: bodyTextLayout,
33509
34208
  variants: {
33510
- prose: proseLayout,
33511
- intro: introLayout,
33512
- narrow: narrowLayout
34209
+ prose: bodyTextLayout,
34210
+ intro: bodyTextLayout,
34211
+ narrow: bodyTextLayout
33513
34212
  },
33514
34213
  variantMeaning: { kind: "arrangement" },
33515
34214
  defaultVariant: "prose",
@@ -33957,6 +34656,52 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
33957
34656
  styleTokens: { spacing: "md" }
33958
34657
  }) };
33959
34658
  //#endregion
34659
+ //#region ../blocks/src/system/runtime/lookSurfaces.ts
34660
+ const isPlainObject$2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
34661
+ const lookListPresentationSchemaShape = {
34662
+ sectionAction: z.object({
34663
+ label: z.string(),
34664
+ href: z.string()
34665
+ }).optional(),
34666
+ actionSize: z.enum([
34667
+ "sm",
34668
+ "md",
34669
+ "lg"
34670
+ ]).optional(),
34671
+ itemActionStyle: z.enum(["button", "link"]).optional(),
34672
+ itemRoles: z.object({
34673
+ container: z.enum([
34674
+ "card",
34675
+ "statement",
34676
+ "highlight"
34677
+ ]).optional(),
34678
+ items: z.enum([
34679
+ "card",
34680
+ "statement",
34681
+ "highlight"
34682
+ ]).optional(),
34683
+ at: z.partialRecord(z.enum([
34684
+ "first",
34685
+ "last",
34686
+ "middle",
34687
+ "odd",
34688
+ "even"
34689
+ ]), z.enum([
34690
+ "card",
34691
+ "statement",
34692
+ "highlight"
34693
+ ])).optional()
34694
+ }).optional(),
34695
+ roleSurfaces: z.record(z.enum([
34696
+ "card",
34697
+ "statement",
34698
+ "highlight"
34699
+ ]), z.custom((value) => isPlainObject$2(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
34700
+ panelHeading: z.string().optional(),
34701
+ lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
34702
+ itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject$2(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
34703
+ };
34704
+ //#endregion
33960
34705
  //#region ../blocks/src/contracts/runtime.ts
33961
34706
  function decodeSuccess(value) {
33962
34707
  return {
@@ -34063,6 +34808,7 @@ const formFieldGroupSchema = z.discriminatedUnion("type", [z.object({
34063
34808
  fields: z.tuple([formFieldSchema, formFieldSchema])
34064
34809
  })]);
34065
34810
  const formSourceSchema = z.object({
34811
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
34066
34812
  value: formRecordSchema.optional(),
34067
34813
  siteId: z.string().optional(),
34068
34814
  apiBaseUrl: z.string().optional(),
@@ -34072,6 +34818,7 @@ const formSourceSchema = z.object({
34072
34818
  spamProtectionEnabled: z.boolean().optional()
34073
34819
  });
34074
34820
  const formDisplaySchema = z.object({
34821
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
34075
34822
  kind: z.literal("form"),
34076
34823
  state: z.enum(["missing", "ready"]),
34077
34824
  className: z.string().nullable(),
@@ -34092,17 +34839,30 @@ z.object({
34092
34839
  });
34093
34840
  function buildFormDisplay(source) {
34094
34841
  const form = source.value ?? null;
34095
- const fields = form?.schemaJson?.fields;
34096
- const groups = Array.isArray(fields) ? groupFormFields(fields) : [];
34842
+ const fields = formDisplayFields(form);
34097
34843
  return {
34098
34844
  kind: "form",
34099
- state: form ? "ready" : "missing",
34845
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
34846
+ state: fields.state,
34100
34847
  className: source.className ?? null,
34101
- formId: form?.id ?? null,
34848
+ formId: fields.formId,
34102
34849
  submitLabel: source.submitLabel?.trim() || "Submit",
34103
34850
  successMessage: source.successMessage ?? null,
34104
34851
  form,
34105
- groups
34852
+ groups: fields.groups
34853
+ };
34854
+ }
34855
+ function formDisplayFields(form) {
34856
+ if (!form) return {
34857
+ state: "missing",
34858
+ formId: null,
34859
+ groups: []
34860
+ };
34861
+ const fields = form.schemaJson?.fields;
34862
+ return {
34863
+ state: "ready",
34864
+ formId: form.id,
34865
+ groups: Array.isArray(fields) ? groupFormFields(fields) : []
34106
34866
  };
34107
34867
  }
34108
34868
  const formBlockRuntime = defineProgressiveBlockRuntime({
@@ -34125,18 +34885,27 @@ function fragmentLayoutNode$1(layout) {
34125
34885
  function isNodeDefinitionArray$1(layout) {
34126
34886
  return Array.isArray(layout);
34127
34887
  }
34128
- const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
34888
+ const copyLayout = props(lookSlot("head"))(fragmentLayoutNode$1(formCopyFragment.layout));
34889
+ const embedLayout$1 = fragmentLayoutNode$1(formEmbedFragment.layout);
34129
34890
  const formSurface = styledContainer({
34891
+ rootProps: lookSlot("panel"),
34130
34892
  bindFrom: "_containerStyles",
34131
34893
  constrainWidth: false,
34132
34894
  baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
34133
- children: fragmentLayoutNode$1(formEmbedFragment.layout)
34895
+ children: embedLayout$1
34134
34896
  });
34135
34897
  function createFormLayout(variant) {
34136
34898
  if (variant === "two-column") return styledSection({
34137
- 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({
34899
+ children: el("div", {
34900
+ className: "rb-container",
34901
+ ...lookSlot("layout")
34902
+ }, [el("div", {
34903
+ className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start",
34904
+ ...lookSlot("frame")
34905
+ }, [stack({
34138
34906
  gap: "md",
34139
- className: "rb-form-copy-column"
34907
+ className: "rb-form-copy-column",
34908
+ ...lookSlot("copy")
34140
34909
  }, [copyLayout]), formSurface])]),
34141
34910
  baseClass: "",
34142
34911
  spacing: "medium",
@@ -34164,6 +34933,15 @@ const formManifest = createBlockManifest({
34164
34933
  description: "Renders a saved form definition with server-side submit.",
34165
34934
  includeContainerStyles: true,
34166
34935
  fragments: [{ fragment: formCopyFragment }, { fragment: formEmbedFragment }],
34936
+ additionalFields: [{
34937
+ id: "archFrame",
34938
+ type: "boolean",
34939
+ label: "Arch frame",
34940
+ ui: {
34941
+ intent: "display",
34942
+ hidden: true
34943
+ }
34944
+ }],
34167
34945
  layout: formLayout,
34168
34946
  variants: {
34169
34947
  default: formLayout,
@@ -34783,7 +35561,7 @@ const heroTitleLengthThresholds = {
34783
35561
  maxWords: 11
34784
35562
  }
34785
35563
  };
34786
- function isPlainObject$2(value) {
35564
+ function isPlainObject$1(value) {
34787
35565
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
34788
35566
  }
34789
35567
  function readString(obj, key) {
@@ -34792,7 +35570,7 @@ function readString(obj, key) {
34792
35570
  }
34793
35571
  function resolveGeneratedHeroLayoutStyles(content) {
34794
35572
  const raw = content._heroLayoutStyles;
34795
- return isPlainObject$2(raw) ? raw : null;
35573
+ return isPlainObject$1(raw) ? raw : null;
34796
35574
  }
34797
35575
  function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
34798
35576
  const explicitValue = readString(content, fallbackKey);
@@ -34850,7 +35628,7 @@ const heroContentWrapperClassTransform = {
34850
35628
  summary: "Resolve hero content wrapper className from alignment + max width controls",
34851
35629
  schema: z.object({ base: z.string().optional() }),
34852
35630
  run: (value, options, context) => {
34853
- const content = isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {};
35631
+ const content = isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {};
34854
35632
  const alignment = resolveHeroContentAlignment(content);
34855
35633
  const maxWidth = resolveHeroContentMaxWidth(content);
34856
35634
  const typographyScale = resolveHeroTypographyScale(content);
@@ -34872,7 +35650,7 @@ const heroCtaJustifyTransform = {
34872
35650
  kind: "string",
34873
35651
  summary: "Map hero contentAlignment to CTA row justify value",
34874
35652
  run: (value, _options, context) => {
34875
- const alignment = resolveHeroContentAlignment(isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {});
35653
+ const alignment = resolveHeroContentAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
34876
35654
  return alignment === "left" ? "start" : alignment === "right" ? "end" : "center";
34877
35655
  }
34878
35656
  };
@@ -34881,7 +35659,7 @@ const heroStackJustifyFromVerticalAlignmentTransform = {
34881
35659
  kind: "string",
34882
35660
  summary: "Map hero verticalAlignment to stack justify value",
34883
35661
  run: (value, _options, context) => {
34884
- const vertical = resolveHeroVerticalAlignment(isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {});
35662
+ const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
34885
35663
  return vertical === "top" ? "start" : vertical === "bottom" ? "end" : "center";
34886
35664
  }
34887
35665
  };
@@ -34891,7 +35669,7 @@ const heroGridClassFromVerticalAlignmentTransform = {
34891
35669
  summary: "Append align-items class for hero split layouts based on verticalAlignment",
34892
35670
  schema: z.object({ base: z.string() }),
34893
35671
  run: (value, options, context) => {
34894
- const vertical = resolveHeroVerticalAlignment(isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {});
35672
+ const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
34895
35673
  const itemsClass = vertical === "top" ? "rb-items-start" : vertical === "bottom" ? "rb-items-end" : "rb-items-center";
34896
35674
  return joinClasses$1([options.base, itemsClass]);
34897
35675
  }
@@ -35179,6 +35957,25 @@ function heroHeadlineText(content, policy) {
35179
35957
  return policy === "look" ? inlineTextToPlainText(coerceInlineTextWithFallback(content.headlineInline, plain)).trim() : plain?.trim() ?? "";
35180
35958
  }
35181
35959
  //#endregion
35960
+ //#region ../blocks/src/system/transforms/registry/footerArrangement.ts
35961
+ const footerBrandArrangementTransform = {
35962
+ id: "layout.footerBrandArrangement",
35963
+ kind: "string",
35964
+ run: (value) => {
35965
+ const module = asPartialObject(value);
35966
+ return module?.kind === "brand" ? module.slots ? "centred" : "row" : void 0;
35967
+ }
35968
+ };
35969
+ const footerModuleInkStyleTransform = {
35970
+ id: "layout.footerModuleInkStyle",
35971
+ kind: "formatter",
35972
+ run: (value, options) => value === "centred" ? void 0 : textColorStyle(asPartialObject(options)?.opacity === 70 ? "text/70" : "text/80")
35973
+ };
35974
+ /** A centred base without authored bar paint inherits its measured surface line. */
35975
+ function footerBottomBarBorderColorStyle(footer) {
35976
+ return footer?.variant === "centred" && !footer.bottomBar ? { borderColor: "var(--rb-surface-line-color)" } : borderColorStyle(footer?.bottomBar?.borderTop?.colorToken ?? "border");
35977
+ }
35978
+ //#endregion
35182
35979
  //#region ../blocks/src/system/runtime/header/runtimeContract.ts
35183
35980
  const headerScrollRuntimeSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("none") }), z.object({ kind: z.literal("threshold") })]);
35184
35981
  z.object({ scroll: headerScrollRuntimeSchema });
@@ -35410,6 +36207,7 @@ const footerRootStyleTransform = {
35410
36207
  }
35411
36208
  }
35412
36209
  styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
36210
+ if (footer?.variant === "centred") styleParts.push(surfaceInkStyles(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate), context.theme.palette));
35413
36211
  styleParts.push(borderColorStyle("border"));
35414
36212
  return mergeStyles(...styleParts);
35415
36213
  }
@@ -35471,7 +36269,7 @@ const footerBottomBarStyleTransform = {
35471
36269
  run: (value, _options, context) => {
35472
36270
  const footer = asPartialObject(value);
35473
36271
  const bottomBar = footer?.bottomBar;
35474
- 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));
36272
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : void 0, footerBottomBarBorderColorStyle(footer), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
35475
36273
  }
35476
36274
  };
35477
36275
  function footerBottomBarForegroundStyle(footer, palette) {
@@ -35493,62 +36291,15 @@ function measuredFooterBackdrop(footer, palette) {
35493
36291
  const foreground = resolveFooterRootForeground(footer, palette);
35494
36292
  return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
35495
36293
  }
35496
- const footerSplitMainClassTransform = {
35497
- id: "layout.footerSplitMainClass",
35498
- kind: "string",
35499
- summary: "Compose split-footer main row classes from footer logo placement",
35500
- schema: z.object({
35501
- base: z.string().optional(),
35502
- reverseClass: z.string().optional()
35503
- }),
35504
- run: (value, options) => {
35505
- const placement = asPartialObject(value)?.placement ?? "right";
35506
- const shouldPlaceLogoFirst = placement === "left" || placement === "above";
35507
- 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";
35508
- return joinClasses([options.base ?? baseClass, shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null]);
35509
- }
35510
- };
35511
36294
  const footerLogoClassTransform = {
35512
36295
  id: "layout.footerLogoClass",
35513
36296
  kind: "string",
35514
36297
  summary: "Compose split-footer logo wrapper classes from footer.logo controls",
35515
- schema: z.object({
35516
- base: z.string().optional(),
35517
- requireExplicitShow: z.boolean().optional()
35518
- }),
36298
+ schema: z.object({ base: z.string().optional() }),
35519
36299
  run: (value, options) => {
35520
- const logo = asPartialObject(value);
35521
- const align = logo?.align ?? "end";
35522
- const hiddenClass = options.requireExplicitShow ? logo?.showLogo === true ? null : "rb-hidden" : logo?.showLogo === false ? "rb-hidden" : null;
36300
+ const align = asPartialObject(value)?.align ?? "end";
35523
36301
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
35524
- return joinClasses([
35525
- 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",
35526
- selfAlignClass,
35527
- hiddenClass
35528
- ]);
35529
- }
35530
- };
35531
- const footerLogoMediaClassTransform = {
35532
- id: "layout.footerLogoMediaClass",
35533
- kind: "string",
35534
- summary: "Compose footer logo image classes from size controls",
35535
- schema: z.object({ base: z.string().optional() }),
35536
- run: (_value, options) => {
35537
- return joinClasses([options.base ?? "rb-w-auto"]);
35538
- }
35539
- };
35540
- function shouldShowFooterLogoText(footer) {
35541
- if (!footer) return false;
35542
- const explicit = footer.logo?.showLogoText;
35543
- const legacy = footer.showLogoText === true;
35544
- return explicit === true || explicit === void 0 && legacy;
35545
- }
35546
- const footerLogoTextVisibleTransform = {
35547
- id: "layout.footerLogoTextVisible",
35548
- kind: "formatter",
35549
- summary: "Return whether footer logo text should render",
35550
- run: (value) => {
35551
- return shouldShowFooterLogoText(asPartialObject(value));
36302
+ 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]);
35552
36303
  }
35553
36304
  };
35554
36305
  function extractBackgroundColorToken(background, fallback) {
@@ -35567,13 +36318,12 @@ const layoutTransforms = [
35567
36318
  headerRootStyleTransform,
35568
36319
  headerSectionBackgroundTransform,
35569
36320
  footerRootStyleTransform,
36321
+ footerModuleInkStyleTransform,
36322
+ footerBrandArrangementTransform,
35570
36323
  footerBottomBarClassTransform,
35571
36324
  footerBottomBarContainerClassTransform,
35572
36325
  footerBottomBarStyleTransform,
35573
- footerSplitMainClassTransform,
35574
- footerLogoClassTransform,
35575
- footerLogoMediaClassTransform,
35576
- footerLogoTextVisibleTransform
36326
+ footerLogoClassTransform
35577
36327
  ];
35578
36328
  //#endregion
35579
36329
  //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
@@ -36069,7 +36819,14 @@ const footerNavGroupsLayout = stack({
36069
36819
  }, [text({
36070
36820
  as: "h3",
36071
36821
  className: "rb-label",
36072
- style: textColorStyle("text/70")
36822
+ "data-slot": { $bind: { from: "content.footerRuntime.slots.group-label" } },
36823
+ style: { $bind: {
36824
+ from: "content.footerRuntime.arrangement",
36825
+ transforms: [{
36826
+ id: "layout.footerModuleInkStyle",
36827
+ options: { opacity: 70 }
36828
+ }]
36829
+ } }
36073
36830
  }, when("group.label"), bind("group.label")), stack({
36074
36831
  gap: "sm",
36075
36832
  align: "start",
@@ -36099,6 +36856,14 @@ const footerMailingListBindings = {
36099
36856
  targeting: { $bind: { from: "module.engagement.runtime.targeting" } }
36100
36857
  };
36101
36858
  const footerSpamProtectionBinding = { spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } } };
36859
+ const brandMedia = media({ className: "rb-h-10 rb-w-auto" }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
36860
+ id: "layout.chromeLogo",
36861
+ options: { surface: "footer-root" }
36862
+ }] }));
36863
+ const brandTitle = text({
36864
+ as: "strong",
36865
+ className: "footer-logo-text rb-nav-text"
36866
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }));
36102
36867
  const brandLogo = link({
36103
36868
  href: "/",
36104
36869
  className: { $bind: {
@@ -36109,20 +36874,39 @@ const brandLogo = link({
36109
36874
  }],
36110
36875
  fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
36111
36876
  } }
36112
- }, [media({ className: { $bind: {
36113
- from: "$root.theme.footer.logo",
36114
- transforms: [{
36115
- id: "layout.footerLogoMediaClass",
36116
- options: { base: "rb-h-10 rb-w-auto" }
36117
- }],
36118
- fallback: "rb-h-10 rb-w-auto"
36119
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
36120
- id: "layout.chromeLogo",
36121
- options: { surface: "footer-root" }
36122
- }] })), text({
36123
- as: "strong",
36124
- className: "footer-logo-text rb-nav-text"
36125
- }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
36877
+ }, [brandMedia, brandTitle], (node) => ({
36878
+ ...node,
36879
+ $when: {
36880
+ when: {
36881
+ from: "module",
36882
+ transforms: [{ id: "layout.footerBrandArrangement" }]
36883
+ },
36884
+ equals: "row"
36885
+ }
36886
+ }));
36887
+ const centredBrand = stack({
36888
+ gap: "md",
36889
+ align: "center"
36890
+ }, [link({
36891
+ href: "/",
36892
+ "data-slot": { $bind: { from: "module.slots.media" } },
36893
+ className: "footer-logo rb-inline-flex rb-items-center rb-no-underline"
36894
+ }, [brandMedia], when("module.slots.media")), {
36895
+ ...brandTitle,
36896
+ props: {
36897
+ ...brandTitle.props,
36898
+ "data-slot": { $bind: { from: "module.slots.heading" } }
36899
+ }
36900
+ }], (node) => ({
36901
+ ...node,
36902
+ $when: {
36903
+ when: {
36904
+ from: "module",
36905
+ transforms: [{ id: "layout.footerBrandArrangement" }]
36906
+ },
36907
+ equals: "centred"
36908
+ }
36909
+ }));
36126
36910
  const navigation = stack({
36127
36911
  gap: "md",
36128
36912
  className: "rb-w-full"
@@ -36147,14 +36931,18 @@ const address = text({
36147
36931
  }, when("module.kind", { equals: "business-address" }), bind("module.address"));
36148
36932
  const contact = stack({
36149
36933
  gap: "sm",
36150
- className: "rb-items-start"
36934
+ className: { $bind: {
36935
+ from: "module.contactClassName",
36936
+ fallback: "rb-items-start"
36937
+ } }
36151
36938
  }, [link({
36152
36939
  href: { $bind: { from: "contactLink.href" } },
36153
36940
  className: "rb-nav-text rb-break-words transition-theme-standard"
36154
36941
  }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
36155
36942
  const hours = stack({
36156
36943
  gap: "sm",
36157
- className: "rb-w-full"
36944
+ className: "rb-w-full",
36945
+ "data-slot": { $bind: { from: "module.slots.schedule" } }
36158
36946
  }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
36159
36947
  as: "span",
36160
36948
  className: "rb-label"
@@ -36165,7 +36953,10 @@ const hours = stack({
36165
36953
  as: "p",
36166
36954
  className: "rb-caption rb-opacity-70"
36167
36955
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
36168
- const socials = inline({ className: "rb-footer-socials" }, [link({
36956
+ const socials = inline({
36957
+ className: "rb-footer-socials",
36958
+ "data-slot": { $bind: { from: "module.slots.social" } }
36959
+ }, [link({
36169
36960
  href: { $bind: { from: "social.href" } },
36170
36961
  target: "_blank",
36171
36962
  rel: "noreferrer noopener",
@@ -36174,7 +36965,14 @@ const socials = inline({ className: "rb-footer-socials" }, [link({
36174
36965
  }, [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" }));
36175
36966
  const authoredCopy = richText({
36176
36967
  className: "rb-prose rb-prose-sm rb-max-w-none",
36177
- style: textColorStyle("text/80")
36968
+ "data-slot": { $bind: { from: "module.slots.copy" } },
36969
+ style: { $bind: {
36970
+ from: "content.footerRuntime.arrangement",
36971
+ transforms: [{
36972
+ id: "layout.footerModuleInkStyle",
36973
+ options: { opacity: 80 }
36974
+ }]
36975
+ } }
36178
36976
  }, when("module.content"), bind("module.content", { transforms: [{
36179
36977
  id: "content.interpolateRichTextTokens",
36180
36978
  options: { tokens: ["year", "site_name"] }
@@ -36212,27 +37010,44 @@ const platformAttribution = el("div", {
36212
37010
  ], when("module.kind", { equals: "attribution" }));
36213
37011
  const footerGroup = stack({
36214
37012
  gap: "md",
36215
- align: "stretch",
37013
+ align: { $bind: {
37014
+ from: "group.align",
37015
+ fallback: "stretch"
37016
+ } },
36216
37017
  className: { $bind: {
36217
37018
  from: "group.className",
36218
37019
  fallback: "rb-min-w-0"
36219
37020
  } },
37021
+ "data-slot": { $bind: { from: "group.slot" } },
36220
37022
  "data-footer-group": { $bind: { from: "group.kind" } }
36221
37023
  }, [stack({
36222
37024
  gap: "md",
36223
- align: "start",
37025
+ align: { $bind: {
37026
+ from: "module.align",
37027
+ fallback: "start"
37028
+ } },
37029
+ className: { $bind: { from: "module.className" } },
36224
37030
  "data-preview-footer-module-id": { $bind: { from: "module.id" } }
36225
37031
  }, [
36226
37032
  text({
36227
37033
  as: "h2",
36228
37034
  className: "rb-label",
36229
- style: textColorStyle("text/70")
37035
+ "data-slot": { $bind: { from: "module.slots.group-label" } },
37036
+ style: { $bind: {
37037
+ from: "content.footerRuntime.arrangement",
37038
+ transforms: [{
37039
+ id: "layout.footerModuleInkStyle",
37040
+ options: { opacity: 70 }
37041
+ }]
37042
+ } }
36230
37043
  }, bind("module.heading"), when("module.heading")),
36231
37044
  brandLogo,
37045
+ centredBrand,
36232
37046
  navigation,
36233
37047
  stack({
36234
37048
  gap: "sm",
36235
- className: "rb-w-full"
37049
+ className: "rb-w-full",
37050
+ "data-slot": { $bind: { from: "module.slots.navigation" } }
36236
37051
  }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
36237
37052
  address,
36238
37053
  contact,
@@ -36245,10 +37060,12 @@ const footerGroup = stack({
36245
37060
  ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
36246
37061
  const footerMainRegion = stack({
36247
37062
  className: { $bind: { from: "region.className" } },
37063
+ "data-slot": { $bind: { from: "region.slot" } },
36248
37064
  "data-footer-region": { $bind: { from: "region.kind" } }
36249
37065
  }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
36250
37066
  const footerEngagementRegion = stack({
36251
37067
  className: { $bind: { from: "region.className" } },
37068
+ "data-slot": { $bind: { from: "region.slot" } },
36252
37069
  "data-footer-region": "engagement-row"
36253
37070
  }, [footerGroup], when("region.kind", { equals: "engagement-row" }), repeat("content.footerRuntime.regions", "region"));
36254
37071
  const footerBottomRegion = stack({ className: { $bind: {
@@ -36265,6 +37082,7 @@ const footerBottomRegion = stack({ className: { $bind: {
36265
37082
  from: "$root.theme.footer",
36266
37083
  transforms: [{ id: "layout.footerBottomBarStyle" }]
36267
37084
  } },
37085
+ "data-slot": { $bind: { from: "region.slot" } },
36268
37086
  "data-footer-region": "bottom"
36269
37087
  }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
36270
37088
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
@@ -36286,6 +37104,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
36286
37104
  transforms: [{ id: "layout.footerRootStyle" }],
36287
37105
  fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
36288
37106
  } },
37107
+ "data-arrangement": { $bind: { from: "content.footerRuntime.arrangementHook" } },
36289
37108
  "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
36290
37109
  }, [
36291
37110
  footerEngagementRegion,
@@ -37887,17 +38706,30 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
37887
38706
  }],
37888
38707
  fallback: ""
37889
38708
  } };
37890
- const copyHeading = el("div", { className: titleClassNameFromAlignment }, [text({
38709
+ const copyHeading = el("div", {
38710
+ className: titleClassNameFromAlignment,
38711
+ ...lookSlot("head")
38712
+ }, [text({
37891
38713
  as: "p",
37892
- className: eyebrowClassName("rb-eyebrow heading-eyebrow")
37893
- }, when("content.eyebrow"), bind("content.eyebrow")), text({ as: "h2" }, bind("content.title"))], when("content.title"));
37894
- 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"))]);
37895
- 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" }, [
37896
- copyHeading,
37897
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
37898
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
37899
- ]);
38714
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
38715
+ ...lookSlot("eyebrow")
38716
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
38717
+ as: "h2",
38718
+ ...lookSlot("heading")
38719
+ }, bind("content.title"))], when("content.title"));
38720
+ const textContentNodes = (className) => {
38721
+ const props = {
38722
+ className,
38723
+ ...lookSlot("intro"),
38724
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
38725
+ lookSlots: { $bind: { from: "content._lookSlots" } }
38726
+ };
38727
+ return [styledCard([richText(props, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText(props, when("content.wrapTextInCard", { not: true }), bind("content.text"))];
38728
+ };
38729
+ const defaultTextColumn = el("div", {}, textContentNodes("rb-prose rb-max-w-none"));
38730
+ 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)]);
37900
38731
  const defaultImageCommonProps = {
38732
+ ...lookSlot("photo"),
37901
38733
  className: { $bind: {
37902
38734
  from: "content.imageShape",
37903
38735
  transforms: [{
@@ -37937,6 +38769,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
37937
38769
  slidesToShow: 1
37938
38770
  }, [media(defaultImageCommonProps, bind("item.image"), repeat("content.images", "item"))]);
37939
38771
  const defaultImagesLayout = el("div", {}, [responsiveTwoColumn({
38772
+ lookSlots: true,
37940
38773
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
37941
38774
  text: defaultTextColumn,
37942
38775
  ratioFrom: "content.ratio",
@@ -37948,6 +38781,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
37948
38781
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1"
37949
38782
  })], whenImagesLength(0, { not: true }));
37950
38783
  const bioImagesLayout = el("div", {}, [responsiveTwoColumn({
38784
+ lookSlots: true,
37951
38785
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
37952
38786
  text: bioTextColumn,
37953
38787
  ratioFrom: "content.ratio",
@@ -37958,15 +38792,15 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
37958
38792
  imageWrapperClassName: "rb-w-full rb-shrink-0",
37959
38793
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
37960
38794
  })], whenImagesLength(0, { not: true }));
37961
- 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));
37962
- const bioTextOnlyLayout = el("div", { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" }, [
37963
- text({
37964
- as: "h2",
37965
- className: titleClassNameFromAlignment
37966
- }, when("content.title"), bind("content.title")),
37967
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
37968
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
37969
- ], whenImagesLength(0));
38795
+ const defaultTextOnlyLayout = el("div", lookSlot("copy"), textContentNodes("rb-prose rb-max-w-none"), whenImagesLength(0));
38796
+ const bioTextOnlyLayout = el("div", {
38797
+ className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5",
38798
+ ...lookSlot("copy")
38799
+ }, [text({
38800
+ as: "h2",
38801
+ className: titleClassNameFromAlignment,
38802
+ ...lookSlot("heading")
38803
+ }, when("content.title"), bind("content.title")), ...textContentNodes(bodyClassNameFromAlignment)], whenImagesLength(0));
37970
38804
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
37971
38805
  const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
37972
38806
  const defaultLayout = styledSection({
@@ -37990,9 +38824,31 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
37990
38824
  }),
37991
38825
  baseClass: "",
37992
38826
  spacing: "medium"
38827
+ }),
38828
+ "circle-beside": styledSection({
38829
+ baseClass: "",
38830
+ spacing: "medium",
38831
+ children: styledContainer({ children: el("div", lookSlot("frame"), [el("div", lookSlot("media"), [
38832
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(1)),
38833
+ el("div", {}, [el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))], whenImagesLength(0, { not: true })),
38834
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(0))
38835
+ ]), el("div", lookSlot("copy"), [el("div", lookSlot("head"), [text({
38836
+ as: "p",
38837
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
38838
+ ...lookSlot("eyebrow")
38839
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
38840
+ as: "h2",
38841
+ ...lookSlot("heading")
38842
+ }, bind("content.title"), when("content.title", { authoringPresence: {
38843
+ kind: "recover-empty-when-active",
38844
+ placeholder: "Add heading"
38845
+ } }))]), defaultTextColumn])]) })
37993
38846
  })
37994
38847
  },
37995
- variantMeaning: { kind: "arrangement" },
38848
+ variantMeaning: {
38849
+ kind: "arrangement",
38850
+ lookOnlyKeys: ["circle-beside"]
38851
+ },
37996
38852
  defaultVariant: "default",
37997
38853
  variantOptions: {
37998
38854
  default: { label: "Default" },
@@ -38585,24 +39441,6 @@ const emptyStateField = {
38585
39441
  ui: { intent: "display" }
38586
39442
  };
38587
39443
  /**
38588
- * Section heading and description fields
38589
- */
38590
- const sectionHeaderFields = (defaultHeading) => [{
38591
- id: "heading",
38592
- type: "text",
38593
- label: "Heading",
38594
- description: "Main heading for the events section",
38595
- required: false,
38596
- multiline: false,
38597
- defaultValue: defaultHeading
38598
- }, {
38599
- id: "description",
38600
- type: "richText",
38601
- label: "Description",
38602
- description: "Optional introductory text",
38603
- required: false
38604
- }];
38605
- /**
38606
39444
  * Layout selection field with grid/stack options
38607
39445
  */
38608
39446
  const layoutField = {
@@ -38650,31 +39488,6 @@ const columnsField = (options = [
38650
39488
  }))
38651
39489
  });
38652
39490
  //#endregion
38653
- //#region ../blocks/src/system/blocks/events/shared/layout.ts
38654
- const recoverEmptyHeadingWhenActive = {
38655
- kind: "recover-empty-when-active",
38656
- placeholder: "Add heading"
38657
- };
38658
- const recoverEmptyDescriptionWhenActive = {
38659
- kind: "recover-empty-when-active",
38660
- placeholder: "Add description"
38661
- };
38662
- function eventSectionHeaderLayoutNodes(options = {}) {
38663
- const headingNode = text({
38664
- as: "h2",
38665
- ...lookSlot("heading")
38666
- }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
38667
- const descriptionNode = richText({
38668
- className: "rb-prose rb-max-w-none",
38669
- ...lookSlot("intro")
38670
- }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
38671
- if (options.splitClassName) return [el("div", {
38672
- className: options.splitClassName,
38673
- ...lookSlot("head")
38674
- }, [headingNode, descriptionNode])];
38675
- return [headingNode, descriptionNode];
38676
- }
38677
- //#endregion
38678
39491
  //#region ../blocks/src/system/blocks/shop.shared.ts
38679
39492
  /**
38680
39493
  * Public pass product for shop display
@@ -39015,19 +39828,14 @@ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind
39015
39828
  *
39016
39829
  * Sites don't store a locale, and every public word around a date is English,
39017
39830
  * so the only open question is which English conventions to follow: day or
39018
- * month first, and a 24 or 12-hour clock. The site's time zone is the one
39831
+ * month first. The site's time zone is the one
39019
39832
  * fact every site carries about where it is. It is the site's, never an
39020
39833
  * event's: a venue left at UTC must not turn a UK site's dates American.
39021
39834
  * Anywhere this can't place (UTC, the Americas, Asia) keeps US English, which
39022
39835
  * is what these helpers wrote before sites were placed at all.
39023
39836
  */
39024
39837
  function eventDateLocale(siteTimeZone) {
39025
- if (!siteTimeZone) return "en-US";
39026
- if (siteTimeZone === "Europe/Dublin") return "en-IE";
39027
- if (siteTimeZone.startsWith("Europe/")) return "en-GB";
39028
- if (siteTimeZone.startsWith("Australia/")) return "en-AU";
39029
- if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
39030
- return "en-US";
39838
+ return inferSiteDateLocale(siteTimeZone);
39031
39839
  }
39032
39840
  function formatEventCompactDateRail(isoTimestamp, options, letterCase = "capitals") {
39033
39841
  const locale = options?.locale ?? "en-US";
@@ -40637,7 +41445,7 @@ const eventSpotlightBlockDefinition = {
40637
41445
  ],
40638
41446
  icon: "Star",
40639
41447
  layout: [styledSection({
40640
- children: sectionContainer([...eventSectionHeaderLayoutNodes(), el("event-spotlight", {
41448
+ children: sectionContainer([...sectionHeaderLayoutNodes(), el("event-spotlight", {
40641
41449
  events: { $bind: { from: "data.events" } },
40642
41450
  layout: { $bind: {
40643
41451
  from: "content.layout",
@@ -40693,52 +41501,6 @@ const eventSpotlightBlockDefinition = {
40693
41501
  } }
40694
41502
  };
40695
41503
  //#endregion
40696
- //#region ../blocks/src/system/runtime/lookSurfaces.ts
40697
- const isPlainObject$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
40698
- const lookListPresentationSchemaShape = {
40699
- sectionAction: z.object({
40700
- label: z.string(),
40701
- href: z.string()
40702
- }).optional(),
40703
- actionSize: z.enum([
40704
- "sm",
40705
- "md",
40706
- "lg"
40707
- ]).optional(),
40708
- itemActionStyle: z.enum(["button", "link"]).optional(),
40709
- itemRoles: z.object({
40710
- container: z.enum([
40711
- "card",
40712
- "statement",
40713
- "highlight"
40714
- ]).optional(),
40715
- items: z.enum([
40716
- "card",
40717
- "statement",
40718
- "highlight"
40719
- ]).optional(),
40720
- at: z.partialRecord(z.enum([
40721
- "first",
40722
- "last",
40723
- "middle",
40724
- "odd",
40725
- "even"
40726
- ]), z.enum([
40727
- "card",
40728
- "statement",
40729
- "highlight"
40730
- ])).optional()
40731
- }).optional(),
40732
- roleSurfaces: z.record(z.enum([
40733
- "card",
40734
- "statement",
40735
- "highlight"
40736
- ]), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
40737
- panelHeading: z.string().optional(),
40738
- lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
40739
- itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
40740
- };
40741
- //#endregion
40742
41504
  //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
40743
41505
  /** Invalid saved selections fail closed rather than widening discovery. */
40744
41506
  function resolveEventSelection(mode, value) {
@@ -41422,7 +42184,7 @@ const eventListingBlockDefinition = {
41422
42184
  children: styledContainer({
41423
42185
  rootType: "stack",
41424
42186
  rootProps: { gap: "lg" },
41425
- children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
42187
+ children: [...sectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
41426
42188
  readAuthority: { $bind: { from: "$root.readAuthority" } },
41427
42189
  events: { $bind: { from: "data.events" } },
41428
42190
  stage: { $bind: {
@@ -41862,7 +42624,7 @@ const eventCalendarLayout = [styledSection({
41862
42624
  gap: "lg",
41863
42625
  ...lookSlot("layout")
41864
42626
  },
41865
- children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
42627
+ children: [...sectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
41866
42628
  readAuthority: { $bind: { from: "$root.readAuthority" } },
41867
42629
  events: { $bind: { from: "data.events" } },
41868
42630
  effectiveListArrangementKey: { $bind: { from: "$root.effectiveListArrangementKey" } },
@@ -44042,6 +44804,511 @@ const embedBlockDefinition = {
44042
44804
  } }
44043
44805
  };
44044
44806
  //#endregion
44807
+ //#region ../blocks/src/system/blocks/image-gallery/fields.ts
44808
+ const imageGalleryFields = parseFieldDefinitions([
44809
+ ...sectionHeaderFields(void 0, "Intro"),
44810
+ {
44811
+ id: "images",
44812
+ type: "repeater",
44813
+ label: "Images",
44814
+ itemLabel: "Image",
44815
+ minItems: 0,
44816
+ maxItems: 24,
44817
+ ui: {
44818
+ repeaterPreset: "thumbnailGrid",
44819
+ thumbnailField: "image",
44820
+ thumbnailAltField: "caption",
44821
+ thumbnailLabelField: "caption",
44822
+ thumbnailCardDensity: "compact"
44823
+ },
44824
+ schema: { fields: [{
44825
+ id: "image",
44826
+ type: "media",
44827
+ label: "Image",
44828
+ required: true,
44829
+ mediaKinds: ["image"]
44830
+ }, {
44831
+ id: "caption",
44832
+ type: "text",
44833
+ label: "Caption",
44834
+ description: "Optional caption displayed below the image and used as the editor card label",
44835
+ maxLength: 200
44836
+ }] }
44837
+ },
44838
+ {
44839
+ id: "fullBleed",
44840
+ type: "boolean",
44841
+ label: "Full bleed",
44842
+ description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
44843
+ defaultValue: false,
44844
+ ui: {
44845
+ intent: "display",
44846
+ visibleWhen: {
44847
+ field: "variant",
44848
+ notIn: ["marquee"]
44849
+ }
44850
+ }
44851
+ },
44852
+ {
44853
+ id: "aspectRatio",
44854
+ type: "select",
44855
+ label: "Aspect ratio",
44856
+ description: "Crop images to a consistent aspect ratio.",
44857
+ defaultValue: "1/1",
44858
+ options: [
44859
+ {
44860
+ value: "auto",
44861
+ label: "Original"
44862
+ },
44863
+ {
44864
+ value: "1/1",
44865
+ label: "1:1 (Square)"
44866
+ },
44867
+ {
44868
+ value: "4/3",
44869
+ label: "4:3 (Standard)"
44870
+ },
44871
+ {
44872
+ value: "16/9",
44873
+ label: "16:9 (Widescreen)"
44874
+ },
44875
+ {
44876
+ value: "3/2",
44877
+ label: "3:2 (Classic)"
44878
+ },
44879
+ {
44880
+ value: "3/4",
44881
+ label: "3:4 (Portrait)"
44882
+ }
44883
+ ],
44884
+ ui: {
44885
+ intent: "display",
44886
+ visibleWhen: {
44887
+ field: "variant",
44888
+ notIn: ["masonry", "marquee"]
44889
+ }
44890
+ }
44891
+ },
44892
+ {
44893
+ id: "slidesToShow",
44894
+ type: "select",
44895
+ label: "Images per view (mobile)",
44896
+ description: "Number of images visible at once on small screens.",
44897
+ defaultValue: "1",
44898
+ options: [
44899
+ {
44900
+ value: "1",
44901
+ label: "One at a time"
44902
+ },
44903
+ {
44904
+ value: "2",
44905
+ label: "Two at a time"
44906
+ },
44907
+ {
44908
+ value: "3",
44909
+ label: "Three at a time"
44910
+ }
44911
+ ],
44912
+ ui: {
44913
+ intent: "display",
44914
+ visibleWhen: {
44915
+ field: "variant",
44916
+ equals: "carousel"
44917
+ }
44918
+ }
44919
+ },
44920
+ {
44921
+ id: "slidesToShowTablet",
44922
+ type: "select",
44923
+ label: "Images per view (tablet)",
44924
+ description: "Number of images visible on medium screens.",
44925
+ options: [
44926
+ {
44927
+ value: "",
44928
+ label: "Same as mobile"
44929
+ },
44930
+ {
44931
+ value: "1",
44932
+ label: "One at a time"
44933
+ },
44934
+ {
44935
+ value: "2",
44936
+ label: "Two at a time"
44937
+ },
44938
+ {
44939
+ value: "3",
44940
+ label: "Three at a time"
44941
+ }
44942
+ ],
44943
+ ui: {
44944
+ intent: "display",
44945
+ visibleWhen: {
44946
+ field: "variant",
44947
+ equals: "carousel"
44948
+ }
44949
+ }
44950
+ },
44951
+ {
44952
+ id: "slidesToShowDesktop",
44953
+ type: "select",
44954
+ label: "Images per view (desktop)",
44955
+ description: "Number of images visible on large screens.",
44956
+ options: [
44957
+ {
44958
+ value: "",
44959
+ label: "Same as tablet"
44960
+ },
44961
+ {
44962
+ value: "1",
44963
+ label: "One at a time"
44964
+ },
44965
+ {
44966
+ value: "2",
44967
+ label: "Two at a time"
44968
+ },
44969
+ {
44970
+ value: "3",
44971
+ label: "Three at a time"
44972
+ }
44973
+ ],
44974
+ ui: {
44975
+ intent: "display",
44976
+ visibleWhen: {
44977
+ field: "variant",
44978
+ equals: "carousel"
44979
+ }
44980
+ }
44981
+ },
44982
+ {
44983
+ id: "transition",
44984
+ type: "select",
44985
+ label: "Transition",
44986
+ description: "Animation style between slides.",
44987
+ defaultValue: "slide",
44988
+ options: [{
44989
+ value: "slide",
44990
+ label: "Slide"
44991
+ }, {
44992
+ value: "fade",
44993
+ label: "Fade"
44994
+ }],
44995
+ ui: {
44996
+ intent: "display",
44997
+ visibleWhen: {
44998
+ field: "variant",
44999
+ equals: "carousel"
45000
+ }
45001
+ }
45002
+ },
45003
+ {
45004
+ id: "showControls",
45005
+ type: "boolean",
45006
+ label: "Show arrows",
45007
+ defaultValue: true,
45008
+ ui: {
45009
+ intent: "behavior",
45010
+ visibleWhen: {
45011
+ field: "variant",
45012
+ equals: "carousel"
45013
+ }
45014
+ }
45015
+ },
45016
+ {
45017
+ id: "showDots",
45018
+ type: "boolean",
45019
+ label: "Show dots",
45020
+ defaultValue: false,
45021
+ ui: {
45022
+ intent: "behavior",
45023
+ visibleWhen: {
45024
+ field: "variant",
45025
+ equals: "carousel"
45026
+ }
45027
+ }
45028
+ },
45029
+ {
45030
+ id: "autoplay",
45031
+ type: "boolean",
45032
+ label: "Autoplay",
45033
+ defaultValue: false,
45034
+ ui: {
45035
+ intent: "behavior",
45036
+ visibleWhen: {
45037
+ field: "variant",
45038
+ equals: "carousel"
45039
+ }
45040
+ }
45041
+ },
45042
+ {
45043
+ id: "autoplayDelay",
45044
+ type: "select",
45045
+ label: "Autoplay delay",
45046
+ defaultValue: "5000",
45047
+ options: [
45048
+ {
45049
+ value: "3000",
45050
+ label: "3 seconds"
45051
+ },
45052
+ {
45053
+ value: "5000",
45054
+ label: "5 seconds"
45055
+ },
45056
+ {
45057
+ value: "7000",
45058
+ label: "7 seconds"
45059
+ },
45060
+ {
45061
+ value: "10000",
45062
+ label: "10 seconds"
45063
+ }
45064
+ ],
45065
+ ui: {
45066
+ intent: "behavior",
45067
+ visibleWhen: {
45068
+ field: "variant",
45069
+ equals: "carousel"
45070
+ }
45071
+ }
45072
+ },
45073
+ {
45074
+ id: "arrowVisibility",
45075
+ type: "select",
45076
+ label: "Arrow visibility",
45077
+ defaultValue: "always",
45078
+ options: [{
45079
+ value: "always",
45080
+ label: "Always visible"
45081
+ }, {
45082
+ value: "hover",
45083
+ label: "Show on hover"
45084
+ }],
45085
+ ui: {
45086
+ intent: "behavior",
45087
+ visibleWhen: {
45088
+ field: "variant",
45089
+ equals: "carousel"
45090
+ }
45091
+ }
45092
+ },
45093
+ {
45094
+ id: "loop",
45095
+ type: "boolean",
45096
+ label: "Loop slides",
45097
+ defaultValue: true,
45098
+ ui: {
45099
+ intent: "behavior",
45100
+ visibleWhen: {
45101
+ field: "variant",
45102
+ equals: "carousel"
45103
+ }
45104
+ }
45105
+ },
45106
+ {
45107
+ id: "marqueeDirection",
45108
+ type: "select",
45109
+ label: "Scroll direction",
45110
+ options: [{
45111
+ value: "left",
45112
+ label: "Left"
45113
+ }, {
45114
+ value: "right",
45115
+ label: "Right"
45116
+ }],
45117
+ defaultValue: "left",
45118
+ ui: {
45119
+ intent: "display",
45120
+ visibleWhen: {
45121
+ field: "variant",
45122
+ equals: "marquee"
45123
+ }
45124
+ }
45125
+ },
45126
+ {
45127
+ id: "marqueeSpeed",
45128
+ type: "select",
45129
+ label: "Scroll speed",
45130
+ options: [
45131
+ {
45132
+ value: "slow",
45133
+ label: "Slow (60s)"
45134
+ },
45135
+ {
45136
+ value: "medium",
45137
+ label: "Medium (40s)"
45138
+ },
45139
+ {
45140
+ value: "fast",
45141
+ label: "Fast (20s)"
45142
+ }
45143
+ ],
45144
+ defaultValue: "medium",
45145
+ ui: {
45146
+ intent: "display",
45147
+ visibleWhen: {
45148
+ field: "variant",
45149
+ equals: "marquee"
45150
+ }
45151
+ }
45152
+ },
45153
+ {
45154
+ id: "marqueePauseOnHover",
45155
+ type: "boolean",
45156
+ label: "Pause on hover",
45157
+ defaultValue: true,
45158
+ ui: {
45159
+ intent: "behavior",
45160
+ visibleWhen: {
45161
+ field: "variant",
45162
+ equals: "marquee"
45163
+ }
45164
+ }
45165
+ },
45166
+ {
45167
+ id: "marqueeImageSize",
45168
+ type: "select",
45169
+ label: "Image size",
45170
+ options: [
45171
+ {
45172
+ value: "sm",
45173
+ label: "Small (200px)"
45174
+ },
45175
+ {
45176
+ value: "md",
45177
+ label: "Medium (256px)"
45178
+ },
45179
+ {
45180
+ value: "lg",
45181
+ label: "Large (320px)"
45182
+ },
45183
+ {
45184
+ value: "xl",
45185
+ label: "Extra large (400px)"
45186
+ }
45187
+ ],
45188
+ defaultValue: "md",
45189
+ ui: {
45190
+ intent: "display",
45191
+ visibleWhen: {
45192
+ field: "variant",
45193
+ equals: "marquee"
45194
+ }
45195
+ }
45196
+ },
45197
+ {
45198
+ id: "imageFilter",
45199
+ type: "select",
45200
+ label: "Image filter",
45201
+ options: [
45202
+ {
45203
+ value: "none",
45204
+ label: "None"
45205
+ },
45206
+ {
45207
+ value: "grayscale",
45208
+ label: "Grayscale"
45209
+ },
45210
+ {
45211
+ value: "grayscale-hover-reveal",
45212
+ label: "Grayscale (color on hover)"
45213
+ },
45214
+ {
45215
+ value: "sepia",
45216
+ label: "Sepia"
45217
+ }
45218
+ ],
45219
+ defaultValue: "grayscale-hover-reveal",
45220
+ ui: { intent: "style" }
45221
+ },
45222
+ {
45223
+ id: "imageBorder",
45224
+ type: "group",
45225
+ label: "Image border",
45226
+ schema: { fields: [
45227
+ {
45228
+ id: "enabled",
45229
+ type: "boolean",
45230
+ label: "Show border",
45231
+ defaultValue: true
45232
+ },
45233
+ {
45234
+ id: "colorToken",
45235
+ type: "text",
45236
+ label: "Border color",
45237
+ defaultValue: "accent",
45238
+ ui: { widget: "backgroundColor" }
45239
+ },
45240
+ {
45241
+ id: "opacity",
45242
+ type: "number",
45243
+ label: "Border opacity",
45244
+ defaultValue: 30,
45245
+ ui: {
45246
+ min: 0,
45247
+ max: 100
45248
+ }
45249
+ },
45250
+ {
45251
+ id: "width",
45252
+ type: "select",
45253
+ label: "Border width",
45254
+ options: [
45255
+ {
45256
+ value: "1",
45257
+ label: "Thin (1px)"
45258
+ },
45259
+ {
45260
+ value: "2",
45261
+ label: "Medium (2px)"
45262
+ },
45263
+ {
45264
+ value: "3",
45265
+ label: "Thick (3px)"
45266
+ }
45267
+ ],
45268
+ defaultValue: "2"
45269
+ }
45270
+ ] },
45271
+ ui: { intent: "style" }
45272
+ },
45273
+ {
45274
+ id: "imageCorners",
45275
+ type: "select",
45276
+ label: "Image corners",
45277
+ options: [
45278
+ {
45279
+ value: "none",
45280
+ label: "Square"
45281
+ },
45282
+ {
45283
+ value: "sm",
45284
+ label: "Slightly rounded"
45285
+ },
45286
+ {
45287
+ value: "md",
45288
+ label: "Rounded"
45289
+ },
45290
+ {
45291
+ value: "lg",
45292
+ label: "More rounded"
45293
+ },
45294
+ {
45295
+ value: "xl",
45296
+ label: "Very rounded"
45297
+ },
45298
+ {
45299
+ value: "2xl",
45300
+ label: "Extra rounded"
45301
+ },
45302
+ {
45303
+ value: "3xl",
45304
+ label: "Maximum rounded"
45305
+ }
45306
+ ],
45307
+ defaultValue: "3xl",
45308
+ ui: { intent: "style" }
45309
+ }
45310
+ ]);
45311
+ //#endregion
44045
45312
  //#region ../blocks/src/system/blocks/image-gallery.ts
44046
45313
  const grid$1 = (props, children, ...mods) => el("grid", props ?? void 0, children ?? void 0, ...mods);
44047
45314
  const galleryContainer = (children, opts) => {
@@ -44256,7 +45523,11 @@ const emptyState$1 = {
44256
45523
  }
44257
45524
  };
44258
45525
  const wrapVariant$1 = (layout, opts) => styledSection({
44259
- children: galleryContainer([layout, emptyState$1], {
45526
+ children: galleryContainer([
45527
+ ...sectionHeaderLayoutNodes(),
45528
+ layout,
45529
+ emptyState$1
45530
+ ], {
44260
45531
  gap: "md",
44261
45532
  fullWidth: opts?.fullWidth,
44262
45533
  className: opts?.className
@@ -44265,6 +45536,28 @@ const wrapVariant$1 = (layout, opts) => styledSection({
44265
45536
  spacing: "medium",
44266
45537
  background: "background"
44267
45538
  });
45539
+ 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({
45540
+ as: "figcaption",
45541
+ ...lookSlot("caption")
45542
+ }, bind(captionFrom), when(captionFrom))])], ...mods);
45543
+ const tilesLayout = styledSection({
45544
+ children: el("div", {
45545
+ className: "rb-container",
45546
+ ...lookSlot("layout")
45547
+ }, [...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) => ({
45548
+ ...node,
45549
+ $when: {
45550
+ when: {
45551
+ from: "content.images",
45552
+ transforms: [{ id: "array.length" }]
45553
+ },
45554
+ equals: 0
45555
+ }
45556
+ }))])]),
45557
+ baseClass: "",
45558
+ spacing: "medium",
45559
+ background: "background"
45560
+ });
44268
45561
  const imageGalleryBlockDefinition = { manifest: createBlockManifest({
44269
45562
  id: "block.image-gallery",
44270
45563
  title: "Image Gallery",
@@ -44277,510 +45570,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
44277
45570
  "marqueeSpeed",
44278
45571
  "marqueePauseOnHover"
44279
45572
  ] },
44280
- additionalFields: parseFieldDefinitions([
44281
- {
44282
- id: "images",
44283
- type: "repeater",
44284
- label: "Images",
44285
- itemLabel: "Image",
44286
- minItems: 0,
44287
- maxItems: 24,
44288
- ui: {
44289
- repeaterPreset: "thumbnailGrid",
44290
- thumbnailField: "image",
44291
- thumbnailAltField: "caption",
44292
- thumbnailLabelField: "caption",
44293
- thumbnailCardDensity: "compact"
44294
- },
44295
- schema: { fields: [{
44296
- id: "image",
44297
- type: "media",
44298
- label: "Image",
44299
- required: true,
44300
- mediaKinds: ["image"]
44301
- }, {
44302
- id: "caption",
44303
- type: "text",
44304
- label: "Caption",
44305
- description: "Optional caption displayed below the image and used as the editor card label",
44306
- maxLength: 200
44307
- }] }
44308
- },
44309
- {
44310
- id: "fullBleed",
44311
- type: "boolean",
44312
- label: "Full bleed",
44313
- description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
44314
- defaultValue: false,
44315
- ui: {
44316
- intent: "display",
44317
- visibleWhen: {
44318
- field: "variant",
44319
- notIn: ["marquee"]
44320
- }
44321
- }
44322
- },
44323
- {
44324
- id: "aspectRatio",
44325
- type: "select",
44326
- label: "Aspect ratio",
44327
- description: "Crop images to a consistent aspect ratio.",
44328
- defaultValue: "1/1",
44329
- options: [
44330
- {
44331
- value: "auto",
44332
- label: "Original"
44333
- },
44334
- {
44335
- value: "1/1",
44336
- label: "1:1 (Square)"
44337
- },
44338
- {
44339
- value: "4/3",
44340
- label: "4:3 (Standard)"
44341
- },
44342
- {
44343
- value: "16/9",
44344
- label: "16:9 (Widescreen)"
44345
- },
44346
- {
44347
- value: "3/2",
44348
- label: "3:2 (Classic)"
44349
- },
44350
- {
44351
- value: "3/4",
44352
- label: "3:4 (Portrait)"
44353
- }
44354
- ],
44355
- ui: {
44356
- intent: "display",
44357
- visibleWhen: {
44358
- field: "variant",
44359
- notIn: ["masonry", "marquee"]
44360
- }
44361
- }
44362
- },
44363
- {
44364
- id: "slidesToShow",
44365
- type: "select",
44366
- label: "Images per view (mobile)",
44367
- description: "Number of images visible at once on small screens.",
44368
- defaultValue: "1",
44369
- options: [
44370
- {
44371
- value: "1",
44372
- label: "One at a time"
44373
- },
44374
- {
44375
- value: "2",
44376
- label: "Two at a time"
44377
- },
44378
- {
44379
- value: "3",
44380
- label: "Three at a time"
44381
- }
44382
- ],
44383
- ui: {
44384
- intent: "display",
44385
- visibleWhen: {
44386
- field: "variant",
44387
- equals: "carousel"
44388
- }
44389
- }
44390
- },
44391
- {
44392
- id: "slidesToShowTablet",
44393
- type: "select",
44394
- label: "Images per view (tablet)",
44395
- description: "Number of images visible on medium screens.",
44396
- options: [
44397
- {
44398
- value: "",
44399
- label: "Same as mobile"
44400
- },
44401
- {
44402
- value: "1",
44403
- label: "One at a time"
44404
- },
44405
- {
44406
- value: "2",
44407
- label: "Two at a time"
44408
- },
44409
- {
44410
- value: "3",
44411
- label: "Three at a time"
44412
- }
44413
- ],
44414
- ui: {
44415
- intent: "display",
44416
- visibleWhen: {
44417
- field: "variant",
44418
- equals: "carousel"
44419
- }
44420
- }
44421
- },
44422
- {
44423
- id: "slidesToShowDesktop",
44424
- type: "select",
44425
- label: "Images per view (desktop)",
44426
- description: "Number of images visible on large screens.",
44427
- options: [
44428
- {
44429
- value: "",
44430
- label: "Same as tablet"
44431
- },
44432
- {
44433
- value: "1",
44434
- label: "One at a time"
44435
- },
44436
- {
44437
- value: "2",
44438
- label: "Two at a time"
44439
- },
44440
- {
44441
- value: "3",
44442
- label: "Three at a time"
44443
- }
44444
- ],
44445
- ui: {
44446
- intent: "display",
44447
- visibleWhen: {
44448
- field: "variant",
44449
- equals: "carousel"
44450
- }
44451
- }
44452
- },
44453
- {
44454
- id: "transition",
44455
- type: "select",
44456
- label: "Transition",
44457
- description: "Animation style between slides.",
44458
- defaultValue: "slide",
44459
- options: [{
44460
- value: "slide",
44461
- label: "Slide"
44462
- }, {
44463
- value: "fade",
44464
- label: "Fade"
44465
- }],
44466
- ui: {
44467
- intent: "display",
44468
- visibleWhen: {
44469
- field: "variant",
44470
- equals: "carousel"
44471
- }
44472
- }
44473
- },
44474
- {
44475
- id: "showControls",
44476
- type: "boolean",
44477
- label: "Show arrows",
44478
- defaultValue: true,
44479
- ui: {
44480
- intent: "behavior",
44481
- visibleWhen: {
44482
- field: "variant",
44483
- equals: "carousel"
44484
- }
44485
- }
44486
- },
44487
- {
44488
- id: "showDots",
44489
- type: "boolean",
44490
- label: "Show dots",
44491
- defaultValue: false,
44492
- ui: {
44493
- intent: "behavior",
44494
- visibleWhen: {
44495
- field: "variant",
44496
- equals: "carousel"
44497
- }
44498
- }
44499
- },
44500
- {
44501
- id: "autoplay",
44502
- type: "boolean",
44503
- label: "Autoplay",
44504
- defaultValue: false,
44505
- ui: {
44506
- intent: "behavior",
44507
- visibleWhen: {
44508
- field: "variant",
44509
- equals: "carousel"
44510
- }
44511
- }
44512
- },
44513
- {
44514
- id: "autoplayDelay",
44515
- type: "select",
44516
- label: "Autoplay delay",
44517
- defaultValue: "5000",
44518
- options: [
44519
- {
44520
- value: "3000",
44521
- label: "3 seconds"
44522
- },
44523
- {
44524
- value: "5000",
44525
- label: "5 seconds"
44526
- },
44527
- {
44528
- value: "7000",
44529
- label: "7 seconds"
44530
- },
44531
- {
44532
- value: "10000",
44533
- label: "10 seconds"
44534
- }
44535
- ],
44536
- ui: {
44537
- intent: "behavior",
44538
- visibleWhen: {
44539
- field: "variant",
44540
- equals: "carousel"
44541
- }
44542
- }
44543
- },
44544
- {
44545
- id: "arrowVisibility",
44546
- type: "select",
44547
- label: "Arrow visibility",
44548
- defaultValue: "always",
44549
- options: [{
44550
- value: "always",
44551
- label: "Always visible"
44552
- }, {
44553
- value: "hover",
44554
- label: "Show on hover"
44555
- }],
44556
- ui: {
44557
- intent: "behavior",
44558
- visibleWhen: {
44559
- field: "variant",
44560
- equals: "carousel"
44561
- }
44562
- }
44563
- },
44564
- {
44565
- id: "loop",
44566
- type: "boolean",
44567
- label: "Loop slides",
44568
- defaultValue: true,
44569
- ui: {
44570
- intent: "behavior",
44571
- visibleWhen: {
44572
- field: "variant",
44573
- equals: "carousel"
44574
- }
44575
- }
44576
- },
44577
- {
44578
- id: "marqueeDirection",
44579
- type: "select",
44580
- label: "Scroll direction",
44581
- options: [{
44582
- value: "left",
44583
- label: "Left"
44584
- }, {
44585
- value: "right",
44586
- label: "Right"
44587
- }],
44588
- defaultValue: "left",
44589
- ui: {
44590
- intent: "display",
44591
- visibleWhen: {
44592
- field: "variant",
44593
- equals: "marquee"
44594
- }
44595
- }
44596
- },
44597
- {
44598
- id: "marqueeSpeed",
44599
- type: "select",
44600
- label: "Scroll speed",
44601
- options: [
44602
- {
44603
- value: "slow",
44604
- label: "Slow (60s)"
44605
- },
44606
- {
44607
- value: "medium",
44608
- label: "Medium (40s)"
44609
- },
44610
- {
44611
- value: "fast",
44612
- label: "Fast (20s)"
44613
- }
44614
- ],
44615
- defaultValue: "medium",
44616
- ui: {
44617
- intent: "display",
44618
- visibleWhen: {
44619
- field: "variant",
44620
- equals: "marquee"
44621
- }
44622
- }
44623
- },
44624
- {
44625
- id: "marqueePauseOnHover",
44626
- type: "boolean",
44627
- label: "Pause on hover",
44628
- defaultValue: true,
44629
- ui: {
44630
- intent: "behavior",
44631
- visibleWhen: {
44632
- field: "variant",
44633
- equals: "marquee"
44634
- }
44635
- }
44636
- },
44637
- {
44638
- id: "marqueeImageSize",
44639
- type: "select",
44640
- label: "Image size",
44641
- options: [
44642
- {
44643
- value: "sm",
44644
- label: "Small (200px)"
44645
- },
44646
- {
44647
- value: "md",
44648
- label: "Medium (256px)"
44649
- },
44650
- {
44651
- value: "lg",
44652
- label: "Large (320px)"
44653
- },
44654
- {
44655
- value: "xl",
44656
- label: "Extra large (400px)"
44657
- }
44658
- ],
44659
- defaultValue: "md",
44660
- ui: {
44661
- intent: "display",
44662
- visibleWhen: {
44663
- field: "variant",
44664
- equals: "marquee"
44665
- }
44666
- }
44667
- },
44668
- {
44669
- id: "imageFilter",
44670
- type: "select",
44671
- label: "Image filter",
44672
- options: [
44673
- {
44674
- value: "none",
44675
- label: "None"
44676
- },
44677
- {
44678
- value: "grayscale",
44679
- label: "Grayscale"
44680
- },
44681
- {
44682
- value: "grayscale-hover-reveal",
44683
- label: "Grayscale (color on hover)"
44684
- },
44685
- {
44686
- value: "sepia",
44687
- label: "Sepia"
44688
- }
44689
- ],
44690
- defaultValue: "grayscale-hover-reveal",
44691
- ui: { intent: "style" }
44692
- },
44693
- {
44694
- id: "imageBorder",
44695
- type: "group",
44696
- label: "Image border",
44697
- schema: { fields: [
44698
- {
44699
- id: "enabled",
44700
- type: "boolean",
44701
- label: "Show border",
44702
- defaultValue: true
44703
- },
44704
- {
44705
- id: "colorToken",
44706
- type: "text",
44707
- label: "Border color",
44708
- defaultValue: "accent",
44709
- ui: { widget: "backgroundColor" }
44710
- },
44711
- {
44712
- id: "opacity",
44713
- type: "number",
44714
- label: "Border opacity",
44715
- defaultValue: 30,
44716
- ui: {
44717
- min: 0,
44718
- max: 100
44719
- }
44720
- },
44721
- {
44722
- id: "width",
44723
- type: "select",
44724
- label: "Border width",
44725
- options: [
44726
- {
44727
- value: "1",
44728
- label: "Thin (1px)"
44729
- },
44730
- {
44731
- value: "2",
44732
- label: "Medium (2px)"
44733
- },
44734
- {
44735
- value: "3",
44736
- label: "Thick (3px)"
44737
- }
44738
- ],
44739
- defaultValue: "2"
44740
- }
44741
- ] },
44742
- ui: { intent: "style" }
44743
- },
44744
- {
44745
- id: "imageCorners",
44746
- type: "select",
44747
- label: "Image corners",
44748
- options: [
44749
- {
44750
- value: "none",
44751
- label: "Square"
44752
- },
44753
- {
44754
- value: "sm",
44755
- label: "Slightly rounded"
44756
- },
44757
- {
44758
- value: "md",
44759
- label: "Rounded"
44760
- },
44761
- {
44762
- value: "lg",
44763
- label: "More rounded"
44764
- },
44765
- {
44766
- value: "xl",
44767
- label: "Very rounded"
44768
- },
44769
- {
44770
- value: "2xl",
44771
- label: "Extra rounded"
44772
- },
44773
- {
44774
- value: "3xl",
44775
- label: "Maximum rounded"
44776
- }
44777
- ],
44778
- defaultValue: "3xl",
44779
- ui: { intent: "style" }
44780
- }
44781
- ]),
45573
+ additionalFields: imageGalleryFields,
44782
45574
  layout: wrapVariant$1(gridLayout),
44783
45575
  variants: {
45576
+ tiles: tilesLayout,
44784
45577
  grid: wrapVariant$1(gridLayout),
44785
45578
  carousel: wrapVariant$1(carouselLayout),
44786
45579
  masonry: wrapVariant$1(masonryLayout),
@@ -44789,7 +45582,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
44789
45582
  className: "rb-image-gallery-marquee-container"
44790
45583
  })
44791
45584
  },
44792
- variantMeaning: { kind: "arrangement" },
45585
+ variantMeaning: {
45586
+ kind: "arrangement",
45587
+ lookOnlyKeys: ["tiles"]
45588
+ },
44793
45589
  defaultVariant: "grid",
44794
45590
  variantOptions: {
44795
45591
  grid: {
@@ -47001,76 +47797,74 @@ const giftingBlockDefinition = {
47001
47797
  /**
47002
47798
  * Get form fields based on preset configuration.
47003
47799
  */
47004
- function getGlobalFormFields(form) {
47005
- const includePhone = form.includeOptionalPhone;
47006
- switch (form.fields.preset) {
47007
- case "emailOnly": return withOptionalPhone([{
47008
- id: "email",
47009
- type: "email",
47010
- label: "Email",
47011
- required: true,
47012
- placeholder: "your@email.com"
47013
- }], includePhone);
47014
- case "emailName": return withOptionalPhone([{
47015
- id: "email",
47016
- type: "email",
47017
- label: "Email",
47018
- required: true,
47019
- placeholder: "your@email.com"
47020
- }, {
47800
+ function getGlobalFormFields(form, presentation = {}) {
47801
+ const fields = withOptionalPhone(newsletterPresetFields(form.fields), form.includeOptionalPhone);
47802
+ return presentation.lookSlots ? fields.map((field) => ({
47803
+ ...field,
47804
+ label: lookFieldLabel(field)
47805
+ })) : fields;
47806
+ }
47807
+ function lookFieldLabel(field) {
47808
+ switch (field.id) {
47809
+ case "firstName": return "First name";
47810
+ case "lastName": return "Last name";
47811
+ default: return field.label;
47812
+ }
47813
+ }
47814
+ const emailField = {
47815
+ id: "email",
47816
+ type: "email",
47817
+ label: "Email",
47818
+ required: true,
47819
+ placeholder: "your@email.com"
47820
+ };
47821
+ const firstNameField = (required) => ({
47822
+ id: "firstName",
47823
+ type: "text",
47824
+ label: "First Name",
47825
+ required,
47826
+ placeholder: "First name"
47827
+ });
47828
+ function newsletterPresetFields(fields) {
47829
+ switch (fields.preset) {
47830
+ case "emailOnly": return [emailField];
47831
+ case "emailName": return [emailField, {
47021
47832
  id: "name",
47022
47833
  type: "text",
47023
47834
  label: "Name",
47024
- required: form.fields.name === "required",
47835
+ required: fields.name === "required",
47025
47836
  placeholder: "Your name"
47026
- }], includePhone);
47027
- case "emailFirstLast": return withOptionalPhone([
47028
- {
47029
- id: "email",
47030
- type: "email",
47031
- label: "Email",
47032
- required: true,
47033
- placeholder: "your@email.com"
47034
- },
47035
- {
47036
- id: "firstName",
47037
- type: "text",
47038
- label: "First Name",
47039
- required: form.fields.firstName === "required",
47040
- placeholder: "First name"
47041
- },
47837
+ }];
47838
+ case "emailFirstName": return [emailField, firstNameField(fields.firstName === "required")];
47839
+ case "emailFirstLast": return [
47840
+ emailField,
47841
+ firstNameField(fields.firstName === "required"),
47042
47842
  {
47043
47843
  id: "lastName",
47044
47844
  type: "text",
47045
47845
  label: "Last Name",
47046
- required: form.fields.lastName === "required",
47846
+ required: fields.lastName === "required",
47047
47847
  placeholder: "Last name"
47048
47848
  }
47049
- ], includePhone);
47050
- case "emailNameCompany": return withOptionalPhone([
47051
- {
47052
- id: "email",
47053
- type: "email",
47054
- label: "Email",
47055
- required: true,
47056
- placeholder: "your@email.com"
47057
- },
47849
+ ];
47850
+ case "emailNameCompany": return [
47851
+ emailField,
47058
47852
  {
47059
47853
  id: "name",
47060
47854
  type: "text",
47061
47855
  label: "Name",
47062
- required: form.fields.name === "required",
47856
+ required: fields.name === "required",
47063
47857
  placeholder: "Your name"
47064
47858
  },
47065
47859
  {
47066
47860
  id: "company",
47067
47861
  type: "text",
47068
47862
  label: "Company",
47069
- required: form.fields.company === "required",
47863
+ required: fields.company === "required",
47070
47864
  placeholder: "Company name"
47071
47865
  }
47072
- ], includePhone);
47073
- default: throw new Error("Unknown newsletter preset");
47866
+ ];
47867
+ default: return assertNever$3(fields);
47074
47868
  }
47075
47869
  }
47076
47870
  function withOptionalPhone(fields, includePhone) {
@@ -47132,6 +47926,7 @@ const mailingListSignupBlockSourceRefSchema = z.object({
47132
47926
  });
47133
47927
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
47134
47928
  const newsletterSourceCommonSchema = z.object({
47929
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
47135
47930
  siteId: z.string().optional(),
47136
47931
  apiBaseUrl: z.string().optional(),
47137
47932
  mailingList: mailingListContextSchema.optional(),
@@ -47164,6 +47959,7 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
47164
47959
  newsletterSourceCommonSchema.extend({ source: z.literal("preview") })
47165
47960
  ]);
47166
47961
  const newsletterDisplaySchema = z.object({
47962
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
47167
47963
  kind: z.literal("newsletter-form"),
47168
47964
  availability: z.enum(["ready", "unavailable"]),
47169
47965
  className: z.string().nullable(),
@@ -47230,13 +48026,14 @@ function buildNewsletterDisplay(source) {
47230
48026
  const choices = resolveRuntimeChoices(assessment);
47231
48027
  return {
47232
48028
  kind: "newsletter-form",
48029
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
47233
48030
  availability: assessment.tag === "available" ? "ready" : "unavailable",
47234
48031
  className: source.className ?? null,
47235
48032
  buttonLabel: form.buttonLabel,
47236
48033
  successMessage: form.successMessage,
47237
48034
  buttonVariant: source.buttonVariant ?? "primary",
47238
48035
  privacyNote: form.privacyNote,
47239
- fields: getGlobalFormFields(form),
48036
+ fields: getGlobalFormFields(form, source),
47240
48037
  choices
47241
48038
  };
47242
48039
  }
@@ -47308,32 +48105,50 @@ function parseRequiredMailingListSignedSourceToken(value) {
47308
48105
  //#region ../blocks/src/system/blocks/newsletter-signup.ts
47309
48106
  const stackedComposition = composeFragments([{ fragment: newsletterCopyFragment }, { fragment: newsletterFormFragment }]);
47310
48107
  const stackedLayout = styledSection({
47311
- children: sectionContainer(stackedComposition.layout, {
48108
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
47312
48109
  gap: "md",
47313
48110
  className: "rb-text-center newsletter-stacked"
47314
- }),
48111
+ })),
47315
48112
  baseClass: "",
47316
48113
  spacing: "medium",
47317
48114
  background: "surface"
47318
48115
  });
47319
48116
  const inlineLayout = styledSection({
47320
- children: sectionContainer(stackedComposition.layout, {
48117
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
47321
48118
  gap: "md",
47322
48119
  className: "newsletter-inline"
47323
- }),
48120
+ })),
47324
48121
  baseClass: "",
47325
48122
  spacing: "medium",
47326
48123
  background: "surface"
47327
48124
  });
47328
48125
  const editorialSplitLayout = styledSection({
47329
- children: sectionContainer([el("div", { className: "newsletter-editorial-split-copy" }, newsletterCopyFragment.layout), el("div", { className: "newsletter-editorial-split-form" }, newsletterFormFragment.layout)], {
48126
+ children: props(lookSlot("layout"))(sectionContainer([el("div", {
48127
+ className: "newsletter-editorial-split-copy",
48128
+ ...lookSlot("head")
48129
+ }, newsletterCopyFragment.layout), el("div", {
48130
+ className: "newsletter-editorial-split-form",
48131
+ ...lookSlot("panel")
48132
+ }, newsletterFormFragment.layout)], {
47330
48133
  gap: "lg",
47331
48134
  className: "newsletter-editorial-split"
47332
- }),
48135
+ })),
47333
48136
  baseClass: "",
47334
48137
  spacing: "comfortable",
47335
48138
  background: "surface"
47336
48139
  });
48140
+ const archLayout = styledSection({
48141
+ children: el("div", {
48142
+ className: "rb-container",
48143
+ ...lookSlot("layout")
48144
+ }, [el("div", lookSlot("frame"), [el("div", {
48145
+ className: "rb-grid",
48146
+ ...lookSlot("head")
48147
+ }, newsletterCopyFragment.layout), ...newsletterFormFragment.layout])]),
48148
+ baseClass: "",
48149
+ spacing: "medium",
48150
+ background: "surface"
48151
+ });
47337
48152
  const newsletterSignupManifest = createBlockManifest({
47338
48153
  id: "block.newsletter-signup",
47339
48154
  title: "Newsletter Signup",
@@ -47348,13 +48163,26 @@ const newsletterSignupManifest = createBlockManifest({
47348
48163
  fragment: newsletterFormFragment,
47349
48164
  fieldPriority: 1
47350
48165
  }],
48166
+ additionalFields: [{
48167
+ id: "archFrame",
48168
+ type: "boolean",
48169
+ label: "Arch frame",
48170
+ ui: {
48171
+ intent: "display",
48172
+ hidden: true
48173
+ }
48174
+ }],
47351
48175
  layout: stackedLayout,
47352
48176
  variants: {
48177
+ arch: archLayout,
47353
48178
  stacked: stackedLayout,
47354
48179
  inline: inlineLayout,
47355
48180
  "editorial-split": editorialSplitLayout
47356
48181
  },
47357
- variantMeaning: { kind: "arrangement" },
48182
+ variantMeaning: {
48183
+ kind: "arrangement",
48184
+ lookOnlyKeys: ["arch"]
48185
+ },
47358
48186
  defaultVariant: "stacked",
47359
48187
  variantOptions: {
47360
48188
  stacked: {
@@ -48446,7 +49274,7 @@ const systemBlockDefinitions = [
48446
49274
  })
48447
49275
  ]
48448
49276
  })),
48449
- withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
49277
+ withDesignCapability("block.body-text", bodyTextBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
48450
49278
  flow: bodyFlow,
48451
49279
  layoutProfiles: [
48452
49280
  layoutProfile({
@@ -48821,7 +49649,7 @@ const systemBlockDefinitions = [
48821
49649
  weight: "quiet"
48822
49650
  })]
48823
49651
  })),
48824
- withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
49652
+ withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
48825
49653
  flow: mediaFlow,
48826
49654
  layoutProfiles: [
48827
49655
  layoutProfile({
@@ -48910,7 +49738,7 @@ const systemBlockDefinitions = [
48910
49738
  weight: "standard"
48911
49739
  })]
48912
49740
  })),
48913
- withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
49741
+ withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
48914
49742
  flow: conversionFlow,
48915
49743
  layoutProfiles: [
48916
49744
  layoutProfile({
@@ -49689,7 +50517,14 @@ const systemCustomizeFacetDefinitions = [
49689
50517
  }
49690
50518
  ], "3", true),
49691
50519
  fixedKnob("block.testimonials", "tilt", "Tilt the small cards", onOff, "true", false, true),
49692
- fixedKnob("block.testimonials", "archFrame", "Arch frame", onOff, "true", false, true),
50520
+ {
50521
+ ...fixedKnob("block.testimonials", "archFrame", "Arch frame", onOff, "true", false, true),
50522
+ blockKinds: [
50523
+ "block.testimonials",
50524
+ "block.newsletter-signup",
50525
+ "block.form"
50526
+ ]
50527
+ },
49693
50528
  fixedKnob("block.hero", "candleGlow", "Candle glow", onOff, "true", false, true),
49694
50529
  fixedKnob("block.hero", "columnGuides", "Column guides", onOff, "true", false, true),
49695
50530
  fixedKnob("block.hero", "titleSize", "Headline size", [
@@ -49713,6 +50548,15 @@ const systemCustomizeFacetDefinitions = [
49713
50548
  value: "right",
49714
50549
  label: "Right"
49715
50550
  }], "right"),
50551
+ fixedKnob("block.media-text", "imagePosition", "Photo side", [{
50552
+ value: "left",
50553
+ label: "Left"
50554
+ }, {
50555
+ value: "right",
50556
+ label: "Right"
50557
+ }], "left"),
50558
+ fixedKnob("block.media-text", "imageShape", "Media shape", standardImageShapeOptions, "default"),
50559
+ fixedKnob("block.media-text", "aspectRatio", "Media aspect ratio", standardAspectRatioOptions, "auto"),
49716
50560
  textKnob("stickerLine", "Sticker line", 32),
49717
50561
  textKnob("smallCaption", "Small caption", 24),
49718
50562
  {
@@ -49901,10 +50745,7 @@ function arrangementPhotoContent(content, knobs) {
49901
50745
  }) };
49902
50746
  }
49903
50747
  function arrangementContentFacts(content) {
49904
- const section = isObjectRecord$1(content._sectionStyles) ? content._sectionStyles : {};
49905
- const background = isObjectRecord$1(section.background) ? section.background : {};
49906
- const itemPhotos = Array.isArray(content.cards) ? content.cards.filter((card) => isObjectRecord$1(card) && isObjectRecord$1(card.media)).length : 0;
49907
- const photoCount = Array.isArray(content.cards) ? itemPhotos : isObjectRecord$1(background.image) ? 1 : 0;
50748
+ const photoCount = arrangementPhotoCount(content);
49908
50749
  return {
49909
50750
  photoCount,
49910
50751
  facts: {
@@ -49915,6 +50756,13 @@ function arrangementContentFacts(content) {
49915
50756
  }
49916
50757
  };
49917
50758
  }
50759
+ /** The content stage owns media presence for every arrangement consumer. */
50760
+ function arrangementPhotoCount(content) {
50761
+ if (Array.isArray(content.cards)) return content.cards.filter((card) => isObjectRecord$1(card) && isObjectRecord$1(card.media)).length;
50762
+ if (Array.isArray(content.images)) return content.images.filter((item) => isObjectRecord$1(item) && isObjectRecord$1(item.image)).length;
50763
+ const section = isObjectRecord$1(content._sectionStyles) ? content._sectionStyles : {};
50764
+ return isObjectRecord$1((isObjectRecord$1(section.background) ? section.background : {}).image) ? 1 : 0;
50765
+ }
49918
50766
  function effectiveContentKnobValue(blockKind, key, value) {
49919
50767
  const facet = systemCustomizeFacetDefinitionsForBlock(blockKind).find((entry) => entry.target.kind === "content-field" && entry.target.field === key);
49920
50768
  return facet?.target.kind === "content-field" && facet.target.boolean ? value === "true" : value;