@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
@@ -462,6 +462,25 @@ function validateBookingPaymentOptionKinds(kinds) {
462
462
  return ok(void 0);
463
463
  }
464
464
  //#endregion
465
+ //#region ../core/src/date-time-formatter.ts
466
+ /** Shared Intl engine, internal to core's date presentation owners. */
467
+ const FORMATTER_CACHE_LIMIT = 100;
468
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
469
+ function getDateTimeFormatter(locale, timeZone, format) {
470
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
471
+ const cached = dateTimeFormatterCache.get(key);
472
+ if (cached !== void 0) return cached;
473
+ if (typeof locale !== "string" || Intl.DateTimeFormat.supportedLocalesOf([locale]).length === 0) throw new RangeError("An explicit supported locale is required");
474
+ if (typeof timeZone !== "string" || timeZone.length === 0) throw new RangeError("An explicit time zone is required");
475
+ const formatter = new Intl.DateTimeFormat(locale, {
476
+ ...format,
477
+ timeZone
478
+ });
479
+ if (dateTimeFormatterCache.size >= FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
480
+ dateTimeFormatterCache.set(key, formatter);
481
+ return formatter;
482
+ }
483
+ //#endregion
465
484
  //#region ../core/src/booking-time-zone.ts
466
485
  const TIME_ZONE_VALIDITY_CACHE_LIMIT = 100;
467
486
  const timeZoneValidityCache = /* @__PURE__ */ new Map();
@@ -498,8 +517,6 @@ const START_OF_DAY = {
498
517
  second: 0
499
518
  };
500
519
  const LOCAL_DATE_PATTERN = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
501
- const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
502
- const dateTimeFormatterCache = /* @__PURE__ */ new Map();
503
520
  function getSafeTimeZone(timeZone) {
504
521
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
505
522
  return normalized.length > 0 && isValidBookingTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
@@ -516,19 +533,7 @@ function formatParseError(error) {
516
533
  }
517
534
  }
518
535
  function formatToPartsLookup(date, locale, timeZone, format) {
519
- return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
520
- }
521
- function getCachedDateTimeFormatter(locale, timeZone, format) {
522
- const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
523
- const cached = dateTimeFormatterCache.get(key);
524
- if (cached !== void 0) return cached;
525
- const formatter = new Intl.DateTimeFormat(locale, {
526
- ...format,
527
- timeZone
528
- });
529
- if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
530
- dateTimeFormatterCache.set(key, formatter);
531
- return formatter;
536
+ return new Map(getDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
532
537
  }
533
538
  function getZonedDateTimeParts(date, timeZone) {
534
539
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -616,7 +621,7 @@ function toScheduledBookingDateTime(input) {
616
621
  function formatBookingInstant(isoString, options) {
617
622
  const date = new Date(isoString);
618
623
  if (Number.isNaN(date.getTime())) return isoString;
619
- return getCachedDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
624
+ return getDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
620
625
  }
621
626
  function formatBookingDate(input, format = {
622
627
  weekday: "long",
@@ -741,6 +746,17 @@ function localScheduleDateTimeToUtcDate(localDate, localTime, timeZone) {
741
746
  return new Date(guess);
742
747
  }
743
748
  //#endregion
749
+ //#region ../core/src/date-display.ts
750
+ /** Site-language policy, shared by customer emails and public event adapters. */
751
+ function inferSiteDateLocale(siteTimeZone) {
752
+ if (siteTimeZone === null || siteTimeZone === void 0 || siteTimeZone === "") return "en-US";
753
+ if (siteTimeZone === "Europe/Dublin") return "en-IE";
754
+ if (siteTimeZone.startsWith("Europe/")) return "en-GB";
755
+ if (siteTimeZone.startsWith("Australia/")) return "en-AU";
756
+ if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
757
+ return "en-US";
758
+ }
759
+ //#endregion
744
760
  //#region ../core/src/location.ts
745
761
  function normalizeLocationAddressText(value) {
746
762
  if (typeof value !== "string") return null;
@@ -858,6 +874,10 @@ function parseGlobalFields(value) {
858
874
  preset: "emailName",
859
875
  name: value.name
860
876
  } : null;
877
+ case "emailFirstName": return isRequirement(value.firstName) ? {
878
+ preset: "emailFirstName",
879
+ firstName: value.firstName
880
+ } : null;
861
881
  case "emailFirstLast": return isRequirement(value.firstName) && isRequirement(value.lastName) ? {
862
882
  preset: "emailFirstLast",
863
883
  firstName: value.firstName,
@@ -5331,6 +5351,129 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
5331
5351
  tags: ["billing"],
5332
5352
  auth: "user",
5333
5353
  responseKind: "json"
5354
+ },
5355
+ stripeConnectSetupStart: {
5356
+ path: "/sites/{siteId}/billing/connect/setup",
5357
+ method: "POST",
5358
+ tags: ["site-{siteId}", "stripe-connect"],
5359
+ auth: "user",
5360
+ responseKind: "json",
5361
+ errors: [
5362
+ "validation:invalid_input",
5363
+ "auth:forbidden",
5364
+ "resource:conflict",
5365
+ "server:internal_error"
5366
+ ]
5367
+ },
5368
+ stripeConnectSetupDiscard: {
5369
+ path: "/sites/{siteId}/billing/connect/setup",
5370
+ method: "DELETE",
5371
+ tags: ["site-{siteId}", "stripe-connect"],
5372
+ auth: "user",
5373
+ responseKind: "json",
5374
+ errors: [
5375
+ "validation:invalid_input",
5376
+ "auth:forbidden",
5377
+ "resource:conflict",
5378
+ "server:internal_error"
5379
+ ]
5380
+ },
5381
+ stripeConnectSetupSave: {
5382
+ path: "/sites/{siteId}/billing/connect/setup/save",
5383
+ method: "POST",
5384
+ tags: ["site-{siteId}", "stripe-connect"],
5385
+ auth: "user",
5386
+ responseKind: "json",
5387
+ errors: [
5388
+ "validation:invalid_input",
5389
+ "auth:forbidden",
5390
+ "resource:conflict",
5391
+ "server:internal_error"
5392
+ ]
5393
+ },
5394
+ stripeConnectAccountSession: {
5395
+ path: "/sites/{siteId}/billing/connect/session",
5396
+ method: "POST",
5397
+ tags: ["site-{siteId}", "stripe-connect"],
5398
+ auth: "user",
5399
+ responseKind: "json",
5400
+ errors: [
5401
+ "validation:invalid_input",
5402
+ "auth:forbidden",
5403
+ "resource:conflict",
5404
+ "server:internal_error"
5405
+ ]
5406
+ },
5407
+ stripeConnectStart: {
5408
+ path: "/sites/{siteId}/billing/connect/start",
5409
+ method: "POST",
5410
+ tags: ["site-{siteId}", "stripe-connect"],
5411
+ auth: "user",
5412
+ responseKind: "json",
5413
+ errors: [
5414
+ "validation:invalid_input",
5415
+ "auth:forbidden",
5416
+ "resource:conflict",
5417
+ "server:internal_error"
5418
+ ]
5419
+ },
5420
+ stripeConnectStatus: {
5421
+ path: "/sites/{siteId}/billing/connect/status",
5422
+ method: "GET",
5423
+ tags: ["site-{siteId}", "stripe-connect"],
5424
+ auth: "user",
5425
+ responseKind: "json",
5426
+ errors: [
5427
+ "validation:invalid_input",
5428
+ "auth:forbidden",
5429
+ "resource:conflict",
5430
+ "server:internal_error"
5431
+ ]
5432
+ },
5433
+ stripeAutomaticTaxUpdate: {
5434
+ path: "/sites/{siteId}/billing/automatic-tax",
5435
+ method: "POST",
5436
+ tags: [
5437
+ "site-{siteId}",
5438
+ "billing",
5439
+ "stripe-tax"
5440
+ ],
5441
+ auth: "user",
5442
+ responseKind: "json",
5443
+ errors: [
5444
+ "validation:invalid_input",
5445
+ "auth:forbidden",
5446
+ "resource:not_found",
5447
+ "server:unavailable",
5448
+ "server:internal_error"
5449
+ ]
5450
+ },
5451
+ stripeConnectDisconnect: {
5452
+ path: "/sites/{siteId}/billing/connect/disconnect",
5453
+ method: "DELETE",
5454
+ tags: ["site-{siteId}", "stripe-connect"],
5455
+ auth: "user",
5456
+ responseKind: "json",
5457
+ errors: [
5458
+ "validation:invalid_input",
5459
+ "auth:forbidden",
5460
+ "resource:conflict",
5461
+ "server:internal_error"
5462
+ ]
5463
+ },
5464
+ billingConnectReturn: {
5465
+ path: "/billing/connect/return",
5466
+ method: "GET",
5467
+ auth: "user",
5468
+ responseKind: "void",
5469
+ errors: []
5470
+ },
5471
+ billingConnectRefresh: {
5472
+ path: "/billing/connect/refresh",
5473
+ method: "GET",
5474
+ auth: "user",
5475
+ responseKind: "void",
5476
+ errors: []
5334
5477
  }
5335
5478
  });
5336
5479
  //#endregion
@@ -5495,6 +5638,14 @@ const PAGE_SURFACE_EDITOR_ENDPOINT_DEFINITIONS = {
5495
5638
  * person when nothing is attached to them.
5496
5639
  */
5497
5640
  const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
5641
+ getBookingPerson: {
5642
+ path: "/sites/{siteId}/bookings/people/{personId}",
5643
+ method: "GET",
5644
+ tags: ["site-{siteId}", "customers-{siteId}"],
5645
+ auth: "user",
5646
+ responseKind: "json",
5647
+ errors: ["resource:not_found", "server:internal_error"]
5648
+ },
5498
5649
  listPeople: {
5499
5650
  path: "/sites/{siteId}/bookings/people",
5500
5651
  method: "GET",
@@ -5835,6 +5986,19 @@ const footerModeSchema = z.enum([
5835
5986
  "default+blocks",
5836
5987
  "none"
5837
5988
  ]);
5989
+ z.object({
5990
+ variant: z.enum([
5991
+ "simple",
5992
+ "columns",
5993
+ "split",
5994
+ "centred"
5995
+ ]),
5996
+ showLogoText: z.boolean().optional(),
5997
+ logo: z.object({
5998
+ showLogo: z.boolean().optional(),
5999
+ showLogoText: z.boolean().optional()
6000
+ }).optional()
6001
+ });
5838
6002
  //#endregion
5839
6003
  //#region ../theme-core/src/palette/utils/colorConversion.ts
5840
6004
  const clamp01 = (x) => Math.max(0, Math.min(1, x));
@@ -9034,6 +9198,29 @@ const paletteSchema = z.object({
9034
9198
  };
9035
9199
  });
9036
9200
  //#endregion
9201
+ //#region ../theme-core/src/buttons/typography.ts
9202
+ const textTransformSchema = z.enum([
9203
+ "none",
9204
+ "uppercase",
9205
+ "lowercase",
9206
+ "capitalize"
9207
+ ]);
9208
+ const fontWeightSchema = z.union([
9209
+ z.literal(400),
9210
+ z.literal(500),
9211
+ z.literal(600),
9212
+ z.literal(700),
9213
+ z.literal(800)
9214
+ ]);
9215
+ const buttonTypographySchema = z.enum(["body", "heading"]);
9216
+ const letterSpacingSchema = z.enum([
9217
+ "tight",
9218
+ "normal",
9219
+ "slight",
9220
+ "loose",
9221
+ "wide"
9222
+ ]);
9223
+ //#endregion
9037
9224
  //#region ../theme-core/src/buttons/types.ts
9038
9225
  /**
9039
9226
  * Standard semantic variant roles a theme exposes.
@@ -9149,6 +9336,7 @@ const buttonEffectApplicationSchema = z.discriminatedUnion("effectId", [
9149
9336
  z.strictObject({
9150
9337
  effectId: z.literal("lift"),
9151
9338
  options: z.strictObject({ amount: z.enum([
9339
+ "0.125",
9152
9340
  "0.25",
9153
9341
  "0.5",
9154
9342
  "1"
@@ -9195,24 +9383,6 @@ const shadowSizeSchema = z.enum([
9195
9383
  "medium",
9196
9384
  "high"
9197
9385
  ]);
9198
- const textTransformSchema = z.enum([
9199
- "none",
9200
- "uppercase",
9201
- "lowercase",
9202
- "capitalize"
9203
- ]);
9204
- const fontWeightSchema = z.union([
9205
- z.literal(500),
9206
- z.literal(600),
9207
- z.literal(700),
9208
- z.literal(800)
9209
- ]);
9210
- const buttonTypographySchema = z.enum(["body", "heading"]);
9211
- const letterSpacingSchema = z.enum([
9212
- "tight",
9213
- "normal",
9214
- "loose"
9215
- ]);
9216
9386
  const hoverTransformSchema = z.enum([
9217
9387
  "none",
9218
9388
  "lift",
@@ -9284,7 +9454,8 @@ const paddingShorthandSchema = z.string().refine((value) => {
9284
9454
  }, { message: "Padding must be two space-separated CSS length tokens (e.g. \"0.5rem 1rem\"). Use `0` for zero." });
9285
9455
  const buttonSizeConfigSchema = z.object({
9286
9456
  padding: paddingShorthandSchema,
9287
- fontSize: z.string().optional()
9457
+ fontSize: z.string().optional(),
9458
+ borderRadius: z.string().optional()
9288
9459
  });
9289
9460
  /**
9290
9461
  * `xl` is optional on the wire so themes persisted before the `xl` size was
@@ -9407,12 +9578,20 @@ const buttonVisualAppearanceSchema = z.strictObject({
9407
9578
  textTransform: textTransformSchema
9408
9579
  }),
9409
9580
  effects: z.array(buttonEffectApplicationSchema),
9581
+ transform: z.literal("none").optional(),
9410
9582
  contextualHover: contextualButtonHoverSchema.optional()
9411
9583
  });
9412
9584
  const buttonVisualStatesSchema = z.strictObject({
9413
9585
  base: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
9414
9586
  hover: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
9415
- focus: buttonVisualAppearanceSchema.extend({ shadow: z.literal("focus-indicator") }),
9587
+ focus: buttonVisualAppearanceSchema.extend({
9588
+ shadow: z.literal("focus-indicator"),
9589
+ indicator: z.strictObject({
9590
+ kind: z.literal("surface-ink"),
9591
+ width: z.union([z.literal(2), z.literal(3)]),
9592
+ offset: z.union([z.literal(3), z.literal(4)])
9593
+ }).optional()
9594
+ }),
9416
9595
  active: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
9417
9596
  disabled: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema })
9418
9597
  });
@@ -9879,6 +10058,10 @@ function validateButtonTextContrast(input) {
9879
10058
  }
9880
10059
  };
9881
10060
  }
10061
+ /** A text-token slab inverts the palette's text/background pair, including text shades. */
10062
+ function solidForegroundToken(backgroundToken) {
10063
+ return /^text(?:-\d+)?$/.test(backgroundToken) ? "background" : onColorTokenName(backgroundToken);
10064
+ }
9882
10065
  //#endregion
9883
10066
  //#region ../theme-core/src/buttons/contextualHover.ts
9884
10067
  function resolveContextualHoverPreference(input) {
@@ -9976,7 +10159,7 @@ function candidate(family, shade, currentShade, direction, seedHex, palette) {
9976
10159
  }
9977
10160
  function hasSafeTextContrast(token, palette) {
9978
10161
  const background = palette[token];
9979
- const foreground = palette[onColorTokenName(token)];
10162
+ const foreground = palette[solidForegroundToken(token)];
9980
10163
  return typeof background === "string" && typeof foreground === "string" && contrastRatio(background, foreground) >= BUTTON_CONTRAST_POLICY.textMinimumRatio;
9981
10164
  }
9982
10165
  function isSafeCandidate(token, palette, surface) {
@@ -10071,6 +10254,13 @@ function compileDeclaredVisualStates(input, states) {
10071
10254
  const colours = collectStateColours(mapVisualStates((state) => compileDeclaredVisualState(input, states, state, state === "hover" ? hover.treatment : states[state].background)));
10072
10255
  return colours.ok ? {
10073
10256
  ...colours,
10257
+ focusIndicator: states.focus.indicator ? {
10258
+ kind: "surface-role",
10259
+ colorCss: input.surface?.foregroundCss ?? surfaceForegroundValue("text"),
10260
+ width: states.focus.indicator.width,
10261
+ offset: states.focus.indicator.offset,
10262
+ minimumSurfaceContrast: BUTTON_CONTRAST_POLICY.nonTextMinimumRatio
10263
+ } : colours.focusIndicator,
10074
10264
  contextualHoverRepair: hover.repair
10075
10265
  } : colours;
10076
10266
  }
@@ -10208,7 +10398,7 @@ function resolveFocusIndicator(colour) {
10208
10398
  function resolveSolid(input, backgroundToken, edge) {
10209
10399
  const backgroundHex = paletteHex(input, backgroundToken);
10210
10400
  if (!backgroundHex.ok) return backgroundHex;
10211
- const foregroundToken = unsafeAsOpaqueButtonColourToken(onColorTokenName(backgroundToken));
10401
+ const foregroundToken = unsafeAsOpaqueButtonColourToken(solidForegroundToken(backgroundToken));
10212
10402
  const foregroundHex = input.palette[foregroundToken];
10213
10403
  if (typeof foregroundHex !== "string") return {
10214
10404
  ok: false,
@@ -11484,6 +11674,287 @@ function normalizeAppearance(appearance) {
11484
11674
  };
11485
11675
  }
11486
11676
  //#endregion
11677
+ //#region ../theme-core/src/buttons/styles/recipes/lanternRecipes.ts
11678
+ const flatShadow = {
11679
+ elevation: "none",
11680
+ softness: null,
11681
+ position: "bottom"
11682
+ };
11683
+ const lift$1 = {
11684
+ effectId: "lift",
11685
+ options: { amount: "0.125" }
11686
+ };
11687
+ const tags = {
11688
+ tone: "classic",
11689
+ energy: "calm",
11690
+ motion: "subtle",
11691
+ era: "editorial"
11692
+ };
11693
+ /** Each role supplies complete states, including a flat surface-ink focus ring. */
11694
+ function states(base, hover, offset = 4, width = 2) {
11695
+ return {
11696
+ base,
11697
+ hover,
11698
+ focus: {
11699
+ ...base,
11700
+ shadow: "focus-indicator",
11701
+ indicator: {
11702
+ kind: "surface-ink",
11703
+ width,
11704
+ offset
11705
+ }
11706
+ },
11707
+ active: {
11708
+ ...base,
11709
+ transform: "none"
11710
+ },
11711
+ disabled: {
11712
+ ...base,
11713
+ effects: []
11714
+ }
11715
+ };
11716
+ }
11717
+ const gilt = {
11718
+ text: "treatment",
11719
+ border: "none",
11720
+ borderRadius: "rounded-10px",
11721
+ shadow: flatShadow,
11722
+ sizes: {
11723
+ sm: {
11724
+ padding: "10px 20px",
11725
+ fontSize: "text-base",
11726
+ borderRadius: "rounded-lg"
11727
+ },
11728
+ md: {
11729
+ padding: "18px 36px",
11730
+ fontSize: "text-19px"
11731
+ },
11732
+ lg: {
11733
+ padding: "18px 36px",
11734
+ fontSize: "text-19px"
11735
+ },
11736
+ xl: {
11737
+ padding: "18px 36px",
11738
+ fontSize: "text-19px"
11739
+ }
11740
+ },
11741
+ typography: {
11742
+ fontWeight: 400,
11743
+ typography: "heading",
11744
+ fontSize: "text-19px",
11745
+ letterSpacing: "slight",
11746
+ italic: false,
11747
+ textTransform: "none"
11748
+ },
11749
+ effects: []
11750
+ };
11751
+ const giltPrimary = {
11752
+ ...gilt,
11753
+ background: {
11754
+ type: "gradient",
11755
+ stops: ["accent", "primary"],
11756
+ direction: "to-br",
11757
+ foregroundToken: "onAccent"
11758
+ }
11759
+ };
11760
+ const giltPrimaryHover = {
11761
+ ...giltPrimary,
11762
+ background: {
11763
+ ...giltPrimary.background,
11764
+ stops: ["accent-400", "primary-400"],
11765
+ foregroundToken: "secondary-950"
11766
+ },
11767
+ effects: [lift$1]
11768
+ };
11769
+ const giltSecondary = {
11770
+ ...gilt,
11771
+ background: {
11772
+ type: "solid",
11773
+ colorToken: "text"
11774
+ }
11775
+ };
11776
+ const giltSecondaryHover = {
11777
+ ...giltSecondary,
11778
+ effects: [lift$1],
11779
+ contextualHover: {
11780
+ kind: "shade-shift",
11781
+ seedToken: unsafeAsOpaqueButtonColourToken("text"),
11782
+ fallbackDirection: "lighter"
11783
+ }
11784
+ };
11785
+ const giltPrimaryStates = states(giltPrimary, giltPrimaryHover);
11786
+ const giltSecondaryStates = states(giltSecondary, giltSecondaryHover);
11787
+ const giltSlabRecipe = defineStaticButtonStyleRecipe({
11788
+ id: "gilt-slab",
11789
+ accessibilityLabel: "Gilt slab",
11790
+ tags,
11791
+ system: { roles: {
11792
+ primary: { states: giltPrimaryStates },
11793
+ secondary: { states: giltSecondaryStates },
11794
+ outline: { states: giltSecondaryStates },
11795
+ ghost: { states: giltSecondaryStates },
11796
+ accent: { states: giltPrimaryStates }
11797
+ } }
11798
+ });
11799
+ const hairline = {
11800
+ text: "treatment",
11801
+ borderRadius: "rounded-3px",
11802
+ shadow: flatShadow,
11803
+ sizes: {
11804
+ sm: {
11805
+ padding: "9px 16px",
11806
+ fontSize: "text-xs"
11807
+ },
11808
+ md: {
11809
+ padding: "15px 28px",
11810
+ fontSize: "text-13px"
11811
+ },
11812
+ lg: {
11813
+ padding: "15px 28px",
11814
+ fontSize: "text-13px"
11815
+ },
11816
+ xl: {
11817
+ padding: "15px 28px",
11818
+ fontSize: "text-13px"
11819
+ }
11820
+ },
11821
+ typography: {
11822
+ fontWeight: 700,
11823
+ typography: "body",
11824
+ fontSize: "text-13px",
11825
+ letterSpacing: "wide",
11826
+ italic: false,
11827
+ textTransform: "uppercase"
11828
+ },
11829
+ effects: []
11830
+ };
11831
+ const hairlinePrimary = {
11832
+ ...hairline,
11833
+ background: {
11834
+ type: "solid",
11835
+ colorToken: "primary"
11836
+ },
11837
+ border: {
11838
+ widthClass: "border",
11839
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
11840
+ }
11841
+ };
11842
+ const hairlineOutline = {
11843
+ ...hairline,
11844
+ background: {
11845
+ type: "surface",
11846
+ role: "link"
11847
+ },
11848
+ border: {
11849
+ widthClass: "border",
11850
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
11851
+ }
11852
+ };
11853
+ const hairlineSecondary = {
11854
+ ...hairlineOutline,
11855
+ border: {
11856
+ widthClass: "border",
11857
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
11858
+ }
11859
+ };
11860
+ const hairlineFilled = {
11861
+ ...hairlineSecondary,
11862
+ background: {
11863
+ type: "solid",
11864
+ colorToken: "accent"
11865
+ }
11866
+ };
11867
+ const hairlinePrimaryStates = states(hairlinePrimary, hairlineOutline, 3);
11868
+ const hairlineSecondaryStates = states(hairlineSecondary, hairlineFilled, 3);
11869
+ const hairlineTabRecipe = defineStaticButtonStyleRecipe({
11870
+ id: "hairline-tab",
11871
+ accessibilityLabel: "Hairline tab",
11872
+ tags,
11873
+ system: { roles: {
11874
+ primary: { states: hairlinePrimaryStates },
11875
+ secondary: { states: hairlineSecondaryStates },
11876
+ outline: { states: hairlineSecondaryStates },
11877
+ ghost: { states: hairlineSecondaryStates },
11878
+ accent: { states: states(hairlineFilled, hairlineSecondary, 3) }
11879
+ } }
11880
+ });
11881
+ const marqueeAccent = {
11882
+ text: "treatment",
11883
+ borderRadius: "rounded-none",
11884
+ shadow: flatShadow,
11885
+ sizes: {
11886
+ sm: {
11887
+ padding: "8px 17px",
11888
+ fontSize: "text-15px"
11889
+ },
11890
+ md: {
11891
+ padding: "14px 25px",
11892
+ fontSize: "text-17px"
11893
+ },
11894
+ lg: {
11895
+ padding: "14px 25px",
11896
+ fontSize: "text-17px"
11897
+ },
11898
+ xl: {
11899
+ padding: "14px 25px",
11900
+ fontSize: "text-17px"
11901
+ }
11902
+ },
11903
+ typography: {
11904
+ fontWeight: 800,
11905
+ typography: "body",
11906
+ fontSize: "text-17px",
11907
+ letterSpacing: "loose",
11908
+ italic: false,
11909
+ textTransform: "uppercase"
11910
+ },
11911
+ effects: [],
11912
+ background: {
11913
+ type: "solid",
11914
+ colorToken: "accent"
11915
+ },
11916
+ border: {
11917
+ widthClass: "border-2",
11918
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
11919
+ }
11920
+ };
11921
+ const marqueePrimary = {
11922
+ ...marqueeAccent,
11923
+ background: {
11924
+ type: "solid",
11925
+ colorToken: "primary"
11926
+ },
11927
+ border: {
11928
+ widthClass: "border-2",
11929
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
11930
+ }
11931
+ };
11932
+ const marqueeSecondary = {
11933
+ ...marqueeAccent,
11934
+ background: {
11935
+ type: "solid",
11936
+ colorToken: "text"
11937
+ },
11938
+ border: {
11939
+ widthClass: "border-2",
11940
+ boundaryInk: unsafeAsOpaqueButtonColourToken("text")
11941
+ }
11942
+ };
11943
+ const marqueePrimaryStates = states(marqueeAccent, marqueePrimary, 4, 3);
11944
+ const marqueeSecondaryStates = states(marqueeSecondary, marqueeAccent, 4, 3);
11945
+ const marqueeRecipe = defineStaticButtonStyleRecipe({
11946
+ id: "marquee",
11947
+ accessibilityLabel: "Marquee",
11948
+ tags,
11949
+ system: { roles: {
11950
+ primary: { states: marqueePrimaryStates },
11951
+ secondary: { states: marqueeSecondaryStates },
11952
+ outline: { states: marqueeSecondaryStates },
11953
+ ghost: { states: marqueeSecondaryStates },
11954
+ accent: { states: marqueePrimaryStates }
11955
+ } }
11956
+ });
11957
+ //#endregion
11487
11958
  //#region ../theme-core/src/buttons/styles/recipes/fulcrumRecipe.ts
11488
11959
  const fulcrumSizes = {
11489
11960
  sm: {
@@ -12225,7 +12696,10 @@ const BUTTON_STYLE_IDS = [
12225
12696
  "offset-block",
12226
12697
  "ringed-pill",
12227
12698
  "square-outline",
12228
- "fulcrum"
12699
+ "fulcrum",
12700
+ "gilt-slab",
12701
+ "hairline-tab",
12702
+ "marquee"
12229
12703
  ];
12230
12704
  const quietArrowParametersSchema = z.object({ secondaryTreatment: z.enum(["outlined", "solid-accent"]) }).strict();
12231
12705
  const flatInkHoverTreatmentSchema = z.enum([
@@ -12262,7 +12736,10 @@ const buttonStyleSelectionSchema = z.discriminatedUnion("styleId", [
12262
12736
  selectionBranch("offset-block", emptyParametersSchema),
12263
12737
  selectionBranch("ringed-pill", emptyParametersSchema),
12264
12738
  selectionBranch("square-outline", emptyParametersSchema),
12265
- selectionBranch("fulcrum", emptyParametersSchema)
12739
+ selectionBranch("fulcrum", emptyParametersSchema),
12740
+ selectionBranch("gilt-slab", emptyParametersSchema),
12741
+ selectionBranch("hairline-tab", emptyParametersSchema),
12742
+ selectionBranch("marquee", emptyParametersSchema)
12266
12743
  ]);
12267
12744
  //#endregion
12268
12745
  //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
@@ -15778,7 +16255,10 @@ const buttonStyleRecipes = [
15778
16255
  offsetBlockRecipe,
15779
16256
  ringedPillRecipe,
15780
16257
  squareOutlineRecipe,
15781
- fulcrumRecipe
16258
+ fulcrumRecipe,
16259
+ giltSlabRecipe,
16260
+ hairlineTabRecipe,
16261
+ marqueeRecipe
15782
16262
  ];
15783
16263
  const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
15784
16264
  function findButtonStyleRecipe(id) {
@@ -15794,6 +16274,9 @@ function resolveButtonStyleSelection(selection) {
15794
16274
  case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
15795
16275
  case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
15796
16276
  case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
16277
+ case "gilt-slab": return resolveButtonStyleRecipe(giltSlabRecipe, selection.parameters);
16278
+ case "hairline-tab": return resolveButtonStyleRecipe(hairlineTabRecipe, selection.parameters);
16279
+ case "marquee": return resolveButtonStyleRecipe(marqueeRecipe, selection.parameters);
15797
16280
  case "fulcrum": return resolveButtonStyleRecipe(fulcrumRecipe, selection.parameters);
15798
16281
  case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
15799
16282
  case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
@@ -18025,20 +18508,15 @@ const headerSchema = z.object({
18025
18508
  const footerVariant = z.enum([
18026
18509
  "simple",
18027
18510
  "columns",
18028
- "split"
18029
- ]);
18511
+ "split",
18512
+ "centred"
18513
+ ]).transform((value) => value === "columns" ? "simple" : value);
18030
18514
  const footerMaxWidth = z.enum(["container", "full"]);
18031
18515
  const footerNavLayoutMode = z.enum([
18032
18516
  "stack",
18033
18517
  "inline",
18034
18518
  "inline-wrap"
18035
18519
  ]);
18036
- const footerNavLayoutAlign = z.enum([
18037
- "start",
18038
- "center",
18039
- "end",
18040
- "space-between"
18041
- ]);
18042
18520
  const footerSpacing = z.enum([
18043
18521
  "none",
18044
18522
  "tight",
@@ -18047,12 +18525,6 @@ const footerSpacing = z.enum([
18047
18525
  "relaxed",
18048
18526
  "spacious"
18049
18527
  ]);
18050
- const footerLogoPlacement = z.enum([
18051
- "left",
18052
- "right",
18053
- "above",
18054
- "below"
18055
- ]);
18056
18528
  const footerLogoSize = z.enum([
18057
18529
  "sm",
18058
18530
  "md",
@@ -18093,17 +18565,8 @@ const footerBottomBarSchema = z.object({
18093
18565
  ]).optional()
18094
18566
  }).optional()
18095
18567
  });
18096
- const footerNavLayoutSchema = z.object({
18097
- layout: footerNavLayoutMode.optional(),
18098
- align: footerNavLayoutAlign.optional(),
18099
- gapX: footerSpacing.optional(),
18100
- gapY: footerSpacing.optional(),
18101
- columns: z.number().int().min(1).max(6).optional()
18102
- });
18568
+ const footerNavLayoutSchema = z.object({ layout: footerNavLayoutMode.optional() });
18103
18569
  const footerLogoSchema = z.object({
18104
- showLogo: z.boolean().default(true),
18105
- showLogoText: z.boolean().optional(),
18106
- placement: footerLogoPlacement.optional(),
18107
18570
  size: footerLogoSize.optional(),
18108
18571
  maxHeight: footerLogoMaxHeight.optional(),
18109
18572
  align: z.enum([
@@ -18113,15 +18576,8 @@ const footerLogoSchema = z.object({
18113
18576
  ]).optional()
18114
18577
  });
18115
18578
  const footerSchema = z.object({
18116
- /**
18117
- * SDK-only footer rendering mode.
18118
- *
18119
- * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
18120
- */
18121
- mode: footerModeSchema.optional(),
18122
18579
  variant: footerVariant,
18123
18580
  maxWidth: footerMaxWidth,
18124
- showLogoText: z.boolean().optional(),
18125
18581
  background: headerBackgroundSchema.default({
18126
18582
  type: "color",
18127
18583
  color: "surface"
@@ -18304,7 +18760,9 @@ const cardListKnobBlocks = [...cardListFamilyBlocks, "block.event-calendar"];
18304
18760
  const lookKnobBlocks = {
18305
18761
  actionStyle: cardListKnobBlocks,
18306
18762
  titleSize: "block.hero",
18307
- imagePosition: "block.hero",
18763
+ imagePosition: ["block.hero", "block.media-text"],
18764
+ imageShape: "block.media-text",
18765
+ aspectRatio: "block.media-text",
18308
18766
  stickerLine: "block.hero",
18309
18767
  smallCaption: "block.hero",
18310
18768
  candleGlow: "block.hero",
@@ -18314,7 +18772,11 @@ const lookKnobBlocks = {
18314
18772
  dates: "block.offerings-preview",
18315
18773
  showCapacity: "block.event-calendar",
18316
18774
  quoteCount: "block.testimonials",
18317
- archFrame: "block.testimonials",
18775
+ archFrame: [
18776
+ "block.testimonials",
18777
+ "block.newsletter-signup",
18778
+ "block.form"
18779
+ ],
18318
18780
  tilt: "block.testimonials"
18319
18781
  };
18320
18782
  function isArrangementAppearancePreset(preset) {
@@ -18341,13 +18803,25 @@ function cardListKnobDefaults(block, arrangement, knobs, defaults) {
18341
18803
  }
18342
18804
  };
18343
18805
  }
18806
+ const arrangementLookTargets = {
18807
+ hero: "hero",
18808
+ "feature-cards": "feature-cards",
18809
+ "event-calendar": "events",
18810
+ testimonials: "testimonials",
18811
+ "event-details": "events",
18812
+ "media-text": "media-text",
18813
+ "image-gallery": "image-gallery",
18814
+ "newsletter-signup": "newsletter",
18815
+ form: "contact-form",
18816
+ "body-text": "body-text"
18817
+ };
18344
18818
  function defineArrangementLook(id, block, name, arrangement, knobs, input = {}) {
18345
18819
  const mode = block === "event-calendar" ? "list" : null;
18346
18820
  return {
18347
18821
  id: asAppearancePresetId(id),
18348
18822
  blockKinds: [`block.${block}`],
18349
18823
  label: name,
18350
- target: block === "event-calendar" || block === "event-details" ? "events" : block === "hero" ? "hero" : block === "testimonials" ? "testimonials" : "feature-cards",
18824
+ target: arrangementLookTargets[block],
18351
18825
  structure: {
18352
18826
  kind: "arrangement",
18353
18827
  byMode: { [mode ?? "default"]: arrangement },
@@ -19236,6 +19710,15 @@ const appearancePresets = [
19236
19710
  eyebrowTreatment: "accent"
19237
19711
  }
19238
19712
  }),
19713
+ defineArrangementLook("body-text-reading-column", "body-text", "Reading column", "prose", []),
19714
+ defineArrangementLook("form-beside-introduction-arched-panel", "form", "Introduction beside an arched form", "two-column", [], { slotRoles: { panel: "card" } }),
19715
+ defineArrangementLook("newsletter-signup-in-arch", "newsletter-signup", "Signup in an arch", "arch", []),
19716
+ defineArrangementLook("image-gallery-square-tiles", "image-gallery", "Square tiles", "tiles", []),
19717
+ defineArrangementLook("image-gallery-arched-captions", "image-gallery", "Arched photos with captions", "tiles", [], { styleFallback: [id$1("image-gallery-square-tiles")] }),
19718
+ defineArrangementLook("media-text-circle-beside-text", "media-text", "Circle beside the text", "circle-beside", ["imagePosition"], { forcedKnobs: {
19719
+ imageShape: "circle",
19720
+ aspectRatio: "1/1"
19721
+ } }),
19239
19722
  defineArrangementLook("hero-photo-beside-text", "hero", "Photo beside the text", "split", heroKnobs, { slotRoles: { sticker: "highlight" } }),
19240
19723
  defineArrangementLook("hero-headline-row", "hero", "Big headline, then text and photo", "headline-row", heroKnobs, {
19241
19724
  slotRoles: { sticker: "highlight" },
@@ -19821,6 +20304,49 @@ function requireThemeColorToken$1(value) {
19821
20304
  return token;
19822
20305
  }
19823
20306
  //#endregion
20307
+ //#region ../theme-core/src/header/rootPaint.ts
20308
+ /** The nav container takes precedence when a floating header also has one. */
20309
+ function headerRootPaint(header) {
20310
+ const navContainerType = header?.navContainer?.type ?? "none";
20311
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
20312
+ return header?.variant === "floating" ? "overlay" : "own-surface";
20313
+ }
20314
+ //#endregion
20315
+ //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
20316
+ const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
20317
+ const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
20318
+ siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
20319
+ function parseSiteChromeBackgroundColorToken(value) {
20320
+ const token = parseBackgroundAppearanceColorToken(value);
20321
+ return token ? token : null;
20322
+ }
20323
+ function toSiteChromeBackgroundColorTokens(tokenNames) {
20324
+ return tokenNames.flatMap((name) => {
20325
+ const token = parseSiteChromeBackgroundColorToken(name);
20326
+ return token ? [token] : [];
20327
+ });
20328
+ }
20329
+ const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
20330
+ const token = parseSiteChromeBackgroundColorToken(value);
20331
+ if (token === null) {
20332
+ ctx.addIssue({
20333
+ code: "custom",
20334
+ message: "Unknown site chrome background colour token"
20335
+ });
20336
+ return z.NEVER;
20337
+ }
20338
+ return token;
20339
+ });
20340
+ const siteChromeBackgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
20341
+ kind: z.literal("color"),
20342
+ token: backgroundColorTokenSchema
20343
+ }).strict()]);
20344
+ z.object({
20345
+ background: siteChromeBackgroundOverrideSchema,
20346
+ navigationLayout: z.enum(["inline-wrap", "stack"])
20347
+ }).strict();
20348
+ z.object({ background: siteChromeBackgroundOverrideSchema }).strict();
20349
+ //#endregion
19824
20350
  //#region ../theme-core/src/site-styles/compilationPlan.ts
19825
20351
  const defaultHeaderBrandPreferences = {
19826
20352
  brandDisplay: "auto",
@@ -19981,6 +20507,9 @@ function fallbackEndsAtOffer(entry, mode, style, catalogue, visited) {
19981
20507
  appearancePresets.filter(isArrangementAppearancePreset);
19982
20508
  /** Closed structural hooks shared by block arrangements and bounded skins. */
19983
20509
  const arrangementSlotNames = [
20510
+ "contact",
20511
+ "social",
20512
+ "base",
19984
20513
  "section",
19985
20514
  "stack",
19986
20515
  "inline",
@@ -20067,6 +20596,238 @@ function validateOfferKnobs(style, catalogue) {
20067
20596
  });
20068
20597
  }
20069
20598
  //#endregion
20599
+ //#region ../theme-core/src/site-styles/footerLookDefaults.ts
20600
+ const defaultFooterLookRecipes = {
20601
+ "footer-centred-name": {
20602
+ arrangement: "centred",
20603
+ ground: {
20604
+ kind: "token",
20605
+ token: "surface"
20606
+ },
20607
+ nav: {
20608
+ weight: "regular",
20609
+ colorToken: "text",
20610
+ hoverColorToken: "primary",
20611
+ typography: "body"
20612
+ },
20613
+ legal: {
20614
+ kind: "separate",
20615
+ bar: null
20616
+ },
20617
+ brandAlign: "center"
20618
+ },
20619
+ "footer-links-row": {
20620
+ arrangement: "simple",
20621
+ ground: {
20622
+ kind: "token",
20623
+ token: "surface"
20624
+ },
20625
+ nav: {
20626
+ weight: "regular",
20627
+ colorToken: "text",
20628
+ hoverColorToken: "primary",
20629
+ typography: "body"
20630
+ },
20631
+ legal: { kind: "integrated" },
20632
+ brandAlign: "start"
20633
+ }
20634
+ };
20635
+ /** A whole authored recipe replaces the default; facets are never deep-merged. */
20636
+ function resolveFooterLookRecipe(style, id) {
20637
+ return style?.footerLookRecipes?.[id] ?? defaultFooterLookRecipes[id];
20638
+ }
20639
+ //#endregion
20640
+ //#region ../theme-core/src/navigation/presets.ts
20641
+ /**
20642
+ * Built-in nav link style presets
20643
+ *
20644
+ * Each preset uses composable effects to achieve its look.
20645
+ */
20646
+ const NAV_LINK_PRESETS = {
20647
+ /**
20648
+ * Minimal - subtle color change on hover
20649
+ */
20650
+ minimal: {
20651
+ name: "Minimal",
20652
+ typography: "body",
20653
+ fontWeight: "medium",
20654
+ textTransform: "none",
20655
+ italic: false,
20656
+ colorToken: "text",
20657
+ hoverColorToken: "primary",
20658
+ padding: "none",
20659
+ borderRadius: "none",
20660
+ effects: { hover: [{
20661
+ effectId: "text-color-change",
20662
+ options: { hoverColorToken: "primary" }
20663
+ }] }
20664
+ },
20665
+ /**
20666
+ * Underline - static underline appears on hover
20667
+ */
20668
+ underline: {
20669
+ name: "Underline",
20670
+ typography: "body",
20671
+ fontWeight: "medium",
20672
+ textTransform: "none",
20673
+ italic: false,
20674
+ colorToken: "text",
20675
+ padding: "none",
20676
+ borderRadius: "none",
20677
+ effects: { hover: [{
20678
+ effectId: "nav-underline",
20679
+ options: { style: "static" }
20680
+ }] }
20681
+ },
20682
+ /**
20683
+ * Underline Grow - animated underline grows from center on hover
20684
+ */
20685
+ "underline-grow": {
20686
+ name: "Underline Grow",
20687
+ typography: "body",
20688
+ fontWeight: "medium",
20689
+ textTransform: "none",
20690
+ italic: false,
20691
+ colorToken: "text",
20692
+ padding: "none",
20693
+ borderRadius: "none",
20694
+ effects: { hover: [{
20695
+ effectId: "nav-underline",
20696
+ options: { style: "grow" }
20697
+ }] }
20698
+ },
20699
+ /**
20700
+ * Capsule - pill-shaped background on hover
20701
+ */
20702
+ capsule: {
20703
+ name: "Capsule",
20704
+ typography: "body",
20705
+ fontWeight: "medium",
20706
+ textTransform: "none",
20707
+ italic: false,
20708
+ colorToken: "text",
20709
+ padding: "compact",
20710
+ borderRadius: "full",
20711
+ effects: {
20712
+ hover: [{
20713
+ effectId: "background-on-hover-alpha",
20714
+ options: {
20715
+ colorToken: "primary",
20716
+ opacity: 10
20717
+ }
20718
+ }],
20719
+ active: [{
20720
+ effectId: "background-on-hover-alpha",
20721
+ options: {
20722
+ colorToken: "primary",
20723
+ opacity: 15
20724
+ }
20725
+ }]
20726
+ }
20727
+ },
20728
+ /**
20729
+ * Solid - solid background color on hover
20730
+ */
20731
+ solid: {
20732
+ name: "Solid",
20733
+ typography: "body",
20734
+ fontWeight: "medium",
20735
+ textTransform: "none",
20736
+ italic: false,
20737
+ colorToken: "text",
20738
+ padding: "compact",
20739
+ borderRadius: "none",
20740
+ effects: {
20741
+ hover: [{
20742
+ effectId: "background-on-hover",
20743
+ options: {
20744
+ colorToken: "primary",
20745
+ textColorToken: "primaryForeground"
20746
+ }
20747
+ }],
20748
+ active: [{
20749
+ effectId: "background-on-hover",
20750
+ options: {
20751
+ colorToken: "primary",
20752
+ textColorToken: "primaryForeground"
20753
+ }
20754
+ }]
20755
+ }
20756
+ },
20757
+ /**
20758
+ * Scale - gentle scale-up on hover
20759
+ */
20760
+ scale: {
20761
+ name: "Scale",
20762
+ typography: "body",
20763
+ fontWeight: "medium",
20764
+ textTransform: "none",
20765
+ italic: false,
20766
+ colorToken: "text",
20767
+ padding: "none",
20768
+ borderRadius: "none",
20769
+ effects: { hover: [{
20770
+ effectId: "scale-up",
20771
+ options: { scale: 1.05 }
20772
+ }] }
20773
+ },
20774
+ /**
20775
+ * Frosted - semi-transparent glass-like background
20776
+ */
20777
+ frosted: {
20778
+ name: "Frosted",
20779
+ typography: "body",
20780
+ fontWeight: "medium",
20781
+ textTransform: "none",
20782
+ italic: false,
20783
+ colorToken: "text",
20784
+ padding: "compact",
20785
+ borderRadius: "md",
20786
+ effects: {
20787
+ base: [{ effectId: "nav-frosted-base" }],
20788
+ hover: [{ effectId: "nav-frosted-hover" }],
20789
+ active: [{ effectId: "nav-frosted-active" }]
20790
+ }
20791
+ }
20792
+ };
20793
+ /**
20794
+ * Get a nav link style preset by ID
20795
+ */
20796
+ function getNavLinkPreset(presetId) {
20797
+ return NAV_LINK_PRESETS[presetId];
20798
+ }
20799
+ Object.keys(NAV_LINK_PRESETS);
20800
+ //#endregion
20801
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
20802
+ function effectiveFooterNavLinkStyle(footer) {
20803
+ if (!footer) return null;
20804
+ if (footer.navLinkStyle) return footer.navLinkStyle;
20805
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
20806
+ if (!basePreset) return null;
20807
+ return {
20808
+ ...basePreset,
20809
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
20810
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
20811
+ };
20812
+ }
20813
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
20814
+ if (!footer) return {};
20815
+ const style = effectiveFooterNavLinkStyle(footer);
20816
+ return {
20817
+ text: footer.background?.textColor ?? (footer.variant === "centred" ? "text" : void 0),
20818
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
20819
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
20820
+ };
20821
+ }
20822
+ //#endregion
20823
+ //#region ../theme-core/src/site-styles/footerLookRecipe.ts
20824
+ /** Reject undeclared references when the curated catalogue is loaded, before rendering. */
20825
+ function validateFooterRecipeSurfaces(style, recipe) {
20826
+ [recipe.ground, ...recipe.legal.kind === "separate" && recipe.legal.bar ? [recipe.legal.bar.background] : []].forEach((ground) => {
20827
+ if (ground.kind === "style-surface" && (style.looks.kind !== "offers" || !style.looks.surfaces[ground.surface])) throw new Error(`Undeclared footer surface: ${ground.surface}`);
20828
+ });
20829
+ }
20830
+ //#endregion
20070
20831
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
20071
20832
  /**
20072
20833
  * Reusable accordion "looks" for curated site styles.
@@ -20794,52 +21555,14 @@ defineLookOptionGroup({
20794
21555
  function asFooterLookId(value) {
20795
21556
  return value;
20796
21557
  }
20797
- function quietFooterLinks(theme) {
20798
- return {
20799
- ...theme.footer,
20800
- navStyle: "minimal",
20801
- navWeight: "regular",
20802
- navColor: "text",
20803
- navLinkStyle: {
20804
- typography: "body",
20805
- fontWeight: "regular",
20806
- textTransform: "none",
20807
- italic: false,
20808
- colorToken: "text",
20809
- hoverColorToken: "primary",
20810
- padding: "none",
20811
- borderRadius: "none"
20812
- }
20813
- };
20814
- }
20815
- function emphasizedFooterLinks(theme) {
20816
- return {
20817
- ...theme.footer,
20818
- navStyle: "minimal",
20819
- navWeight: "medium",
20820
- navColor: "text",
20821
- navLinkStyle: {
20822
- typography: "body",
20823
- fontWeight: "medium",
20824
- textTransform: "none",
20825
- italic: false,
20826
- colorToken: "text",
20827
- hoverColorToken: "primary",
20828
- padding: "none",
20829
- borderRadius: "none"
20830
- }
20831
- };
20832
- }
20833
21558
  const footerLookCatalog = defineExactCatalog()([{
20834
- id: asFooterLookId("footer-links-quiet"),
20835
- label: "Quiet links",
20836
- description: "Regular-weight footer navigation with a restrained hover.",
20837
- compile: quietFooterLinks
21559
+ id: asFooterLookId("footer-links-row"),
21560
+ label: "Links in a row",
21561
+ description: "Your links in a row, with the other footer sections in columns beside them."
20838
21562
  }, {
20839
- id: asFooterLookId("footer-links-emphasized"),
20840
- label: "Emphasized links",
20841
- description: "Medium-weight footer navigation with a clearer emphasis.",
20842
- compile: emphasizedFooterLinks
21563
+ id: asFooterLookId("footer-centred-name"),
21564
+ label: "Centred name, links beneath",
21565
+ description: "Your site name centred, with your links, contact details and social links beneath it."
20843
21566
  }]);
20844
21567
  new Map(footerLookCatalog.map((look) => [look.id, look]));
20845
21568
  //#endregion
@@ -22256,6 +22979,7 @@ function defineCuratedSiteStyle(input) {
22256
22979
  recommendedAppearancePresetIds
22257
22980
  },
22258
22981
  headerCuration: headerCurationBySiteStyle[input.id],
22982
+ footerLookRecipes: input.footerLookRecipes,
22259
22983
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
22260
22984
  buttonStyleChoices: input.buttonStyleChoices,
22261
22985
  paletteRecommendations: input.paletteRecommendations,
@@ -22741,7 +23465,11 @@ const lanternLooks = {
22741
23465
  margin: "40px"
22742
23466
  },
22743
23467
  fontLoading: {
22744
- extraBodyFontWeights: [500, 700],
23468
+ extraBodyFontWeights: [
23469
+ 500,
23470
+ 700,
23471
+ 800
23472
+ ],
22745
23473
  italicBodyFontWeights: [400]
22746
23474
  },
22747
23475
  surfaces: {
@@ -22791,6 +23519,38 @@ const lanternLooks = {
22791
23519
  ]
22792
23520
  },
22793
23521
  offers: [
23522
+ {
23523
+ id: id("body-text-reading-column"),
23524
+ treatment: "reading-column",
23525
+ roleMap: lanternRoles
23526
+ },
23527
+ {
23528
+ id: id("form-beside-introduction-arched-panel"),
23529
+ treatment: "arched-panel",
23530
+ addKnobs: ["archFrame"],
23531
+ roleMap: lanternRoles
23532
+ },
23533
+ {
23534
+ id: id("newsletter-signup-in-arch"),
23535
+ treatment: "signup-arch",
23536
+ addKnobs: ["archFrame"],
23537
+ roleMap: lanternRoles
23538
+ },
23539
+ {
23540
+ id: id("image-gallery-square-tiles"),
23541
+ treatment: "square-tiles",
23542
+ roleMap: lanternRoles
23543
+ },
23544
+ {
23545
+ id: id("image-gallery-arched-captions"),
23546
+ treatment: "arched-captions",
23547
+ roleMap: lanternRoles
23548
+ },
23549
+ {
23550
+ id: id("media-text-circle-beside-text"),
23551
+ treatment: "circle-beside",
23552
+ roleMap: lanternRoles
23553
+ },
22794
23554
  {
22795
23555
  id: id("event-details-panel"),
22796
23556
  treatment: "quiet",
@@ -23229,7 +23989,7 @@ const curatedSiteStyles = [
23229
23989
  "faq-contained-help",
23230
23990
  "contact-form-panel"
23231
23991
  ],
23232
- recommendedFooterLookIds: ["footer-links-quiet"],
23992
+ recommendedFooterLookIds: ["footer-links-row"],
23233
23993
  buttonStyleChoices: [
23234
23994
  buttonChoice("soft-pill"),
23235
23995
  buttonChoice("pebble"),
@@ -23348,7 +24108,7 @@ const curatedSiteStyles = [
23348
24108
  "testimonials-non-carded",
23349
24109
  "contact-form-panel"
23350
24110
  ],
23351
- recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
24111
+ recommendedFooterLookIds: ["footer-links-row"],
23352
24112
  buttonStyleChoices: [
23353
24113
  buttonChoice("earth-pill"),
23354
24114
  buttonChoice("soft-pill"),
@@ -23403,7 +24163,41 @@ const curatedSiteStyles = [
23403
24163
  "testimonials-brand-statement-cards",
23404
24164
  "contact-form-panel"
23405
24165
  ],
23406
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
24166
+ footerLookRecipes: { "footer-links-row": {
24167
+ arrangement: "split",
24168
+ ground: {
24169
+ kind: "token",
24170
+ token: "primary-800"
24171
+ },
24172
+ nav: {
24173
+ weight: "medium",
24174
+ colorToken: "primaryForeground",
24175
+ hoverColorToken: "secondary",
24176
+ typography: "body"
24177
+ },
24178
+ legal: {
24179
+ kind: "separate",
24180
+ bar: {
24181
+ fullBleed: true,
24182
+ background: {
24183
+ kind: "token",
24184
+ token: "primary-900"
24185
+ },
24186
+ textColor: "primaryForeground",
24187
+ textAlign: "center",
24188
+ paddingY: "compact",
24189
+ paddingX: "default",
24190
+ borderTop: { width: "none" }
24191
+ },
24192
+ linkStyle: {
24193
+ colorToken: "secondary",
24194
+ decorationColorToken: "secondary"
24195
+ }
24196
+ },
24197
+ brandAlign: "start",
24198
+ brandLogoSize: "sm"
24199
+ } },
24200
+ recommendedFooterLookIds: ["footer-links-row"],
23407
24201
  buttonStyleChoices: [
23408
24202
  buttonChoice("showtime-pill"),
23409
24203
  buttonChoice("confident-chip"),
@@ -23474,7 +24268,7 @@ const curatedSiteStyles = [
23474
24268
  "testimonials-statement-cards",
23475
24269
  "contact-form-panel"
23476
24270
  ],
23477
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
24271
+ recommendedFooterLookIds: ["footer-links-row"],
23478
24272
  buttonStyleChoices: [
23479
24273
  buttonChoice("ornate-ritual"),
23480
24274
  buttonChoice("joy-stamp"),
@@ -23521,7 +24315,22 @@ const curatedSiteStyles = [
23521
24315
  } }
23522
24316
  },
23523
24317
  recommendedAppearancePresetIds: ["feature-cards-bold-colors", "testimonials-statement-cards"],
23524
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
24318
+ footerLookRecipes: { "footer-links-row": {
24319
+ arrangement: "simple",
24320
+ ground: {
24321
+ kind: "token",
24322
+ token: "surface"
24323
+ },
24324
+ nav: {
24325
+ weight: "medium",
24326
+ colorToken: "text",
24327
+ hoverColorToken: "primary",
24328
+ typography: "body"
24329
+ },
24330
+ legal: { kind: "integrated" },
24331
+ brandAlign: "start"
24332
+ } },
24333
+ recommendedFooterLookIds: ["footer-links-row"],
23525
24334
  buttonStyleChoices: [
23526
24335
  buttonChoice("joy-stamp"),
23527
24336
  buttonChoice("ink-stamp"),
@@ -23573,7 +24382,7 @@ const curatedSiteStyles = [
23573
24382
  },
23574
24383
  testimonialQuote: serifDisplayQuote
23575
24384
  },
23576
- recommendedFooterLookIds: ["footer-links-quiet"],
24385
+ recommendedFooterLookIds: ["footer-links-row"],
23577
24386
  buttonStyleChoices: [
23578
24387
  buttonChoice("fulcrum"),
23579
24388
  buttonChoice("editorial-link"),
@@ -23650,7 +24459,7 @@ const curatedSiteStyles = [
23650
24459
  "faq-base-accordion",
23651
24460
  "booking-brand-band"
23652
24461
  ],
23653
- recommendedFooterLookIds: ["footer-links-quiet"],
24462
+ recommendedFooterLookIds: ["footer-links-row"],
23654
24463
  buttonStyleChoices: [
23655
24464
  buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
23656
24465
  buttonChoice("flat-ink"),
@@ -23688,7 +24497,22 @@ const curatedSiteStyles = [
23688
24497
  accordions: boldBorderedAccordionSystem,
23689
24498
  testimonialQuote: accentGlyphQuote
23690
24499
  },
23691
- recommendedFooterLookIds: ["footer-links-emphasized"],
24500
+ footerLookRecipes: { "footer-links-row": {
24501
+ arrangement: "simple",
24502
+ ground: {
24503
+ kind: "token",
24504
+ token: "surface"
24505
+ },
24506
+ nav: {
24507
+ weight: "medium",
24508
+ colorToken: "text",
24509
+ hoverColorToken: "primary",
24510
+ typography: "body"
24511
+ },
24512
+ legal: { kind: "integrated" },
24513
+ brandAlign: "start"
24514
+ } },
24515
+ recommendedFooterLookIds: ["footer-links-row"],
23692
24516
  buttonStyleChoices: [
23693
24517
  buttonChoice("offset-block"),
23694
24518
  buttonChoice("ink-stamp"),
@@ -23727,8 +24551,29 @@ const curatedSiteStyles = [
23727
24551
  accordions: warmInsetAccordionSystem,
23728
24552
  testimonialQuote: serifDisplayQuote
23729
24553
  },
23730
- recommendedFooterLookIds: ["footer-links-quiet"],
24554
+ footerLookRecipes: { "footer-centred-name": {
24555
+ arrangement: "centred",
24556
+ ground: {
24557
+ kind: "style-surface",
24558
+ surface: "deep"
24559
+ },
24560
+ nav: {
24561
+ weight: "regular",
24562
+ colorToken: "text",
24563
+ hoverColorToken: "primary",
24564
+ typography: "heading"
24565
+ },
24566
+ legal: {
24567
+ kind: "separate",
24568
+ bar: null
24569
+ },
24570
+ brandAlign: "center"
24571
+ } },
24572
+ recommendedFooterLookIds: ["footer-centred-name", "footer-links-row"],
23731
24573
  buttonStyleChoices: [
24574
+ buttonChoice("gilt-slab"),
24575
+ buttonChoice("hairline-tab"),
24576
+ buttonChoice("marquee"),
23732
24577
  buttonChoice("ringed-pill"),
23733
24578
  buttonChoice("earth-pill"),
23734
24579
  buttonChoice("editorial-link")
@@ -23763,7 +24608,7 @@ const curatedSiteStyles = [
23763
24608
  accordions: editorialDividedAccordionSystem,
23764
24609
  testimonialQuote: serifDisplayQuote
23765
24610
  },
23766
- recommendedFooterLookIds: ["footer-links-quiet"],
24611
+ recommendedFooterLookIds: ["footer-links-row"],
23767
24612
  buttonStyleChoices: [
23768
24613
  buttonChoice("flat-ink", void 0, { corners: "square" }),
23769
24614
  buttonChoice("editorial-link"),
@@ -23791,6 +24636,7 @@ function curatedStyleTemplate(input) {
23791
24636
  }
23792
24637
  curatedSiteStyles.forEach((style) => {
23793
24638
  if (style.looks.kind === "offers") validateLookFallbacks(style.looks);
24639
+ (/* @__PURE__ */ new Set([...Object.values(style.footerLookRecipes ?? {}), ...style.recommendedFooterLookIds.map((id) => resolveFooterLookRecipe(style, id))])).forEach((recipe) => validateFooterRecipeSurfaces(style, recipe));
23794
24640
  });
23795
24641
  //#endregion
23796
24642
  //#region ../theme-core/src/site-styles/effectiveArrangement.ts
@@ -23888,29 +24734,6 @@ const blockDesignFallback = {
23888
24734
  };
23889
24735
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
23890
24736
  //#endregion
23891
- //#region ../theme-core/src/header/rootPaint.ts
23892
- /** The nav container takes precedence when a floating header also has one. */
23893
- function headerRootPaint(header) {
23894
- const navContainerType = header?.navContainer?.type ?? "none";
23895
- if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
23896
- return header?.variant === "floating" ? "overlay" : "own-surface";
23897
- }
23898
- //#endregion
23899
- //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
23900
- const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
23901
- const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
23902
- siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
23903
- function parseSiteChromeBackgroundColorToken(value) {
23904
- const token = parseBackgroundAppearanceColorToken(value);
23905
- return token ? token : null;
23906
- }
23907
- function toSiteChromeBackgroundColorTokens(tokenNames) {
23908
- return tokenNames.flatMap((name) => {
23909
- const token = parseSiteChromeBackgroundColorToken(name);
23910
- return token ? [token] : [];
23911
- });
23912
- }
23913
- //#endregion
23914
24737
  //#region ../theme-core/src/site-styles/siteChromeNavPreferences.ts
23915
24738
  const headerNavTypographyPreferenceValues = [
23916
24739
  "inherit",
@@ -24026,21 +24849,6 @@ z.object({
24026
24849
  }).strict();
24027
24850
  //#endregion
24028
24851
  //#region ../theme-core/src/site-styles/headerPreferencesPersistence.ts
24029
- const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
24030
- const token = parseSiteChromeBackgroundColorToken(value);
24031
- if (token === null) {
24032
- ctx.addIssue({
24033
- code: "custom",
24034
- message: "Unknown site chrome background colour token"
24035
- });
24036
- return z.NEVER;
24037
- }
24038
- return token;
24039
- });
24040
- const backgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
24041
- kind: z.literal("color"),
24042
- token: backgroundColorTokenSchema
24043
- }).strict()]);
24044
24852
  const logoTextIntentSchema = z.object({
24045
24853
  mobileMaxWidth: z.enum([
24046
24854
  "xs",
@@ -24066,7 +24874,7 @@ const headerPreferencesShape = {
24066
24874
  navFontRole: z.enum(headerNavTypographyPreferenceValues),
24067
24875
  navTextSize: z.enum(headerNavFontSizePreferenceValues),
24068
24876
  interactionPalette: z.union([z.literal("recommended"), z.enum(headerInteractionPaletteValues)]),
24069
- background: backgroundOverrideSchema,
24877
+ background: siteChromeBackgroundOverrideSchema,
24070
24878
  structure: structureSchema
24071
24879
  };
24072
24880
  z.object(headerPreferencesShape).strict();
@@ -24075,167 +24883,6 @@ z.object(headerPreferencesShape).omit({
24075
24883
  structure: true
24076
24884
  }).strict();
24077
24885
  //#endregion
24078
- //#region ../theme-core/src/navigation/presets.ts
24079
- /**
24080
- * Built-in nav link style presets
24081
- *
24082
- * Each preset uses composable effects to achieve its look.
24083
- */
24084
- const NAV_LINK_PRESETS = {
24085
- /**
24086
- * Minimal - subtle color change on hover
24087
- */
24088
- minimal: {
24089
- name: "Minimal",
24090
- typography: "body",
24091
- fontWeight: "medium",
24092
- textTransform: "none",
24093
- italic: false,
24094
- colorToken: "text",
24095
- hoverColorToken: "primary",
24096
- padding: "none",
24097
- borderRadius: "none",
24098
- effects: { hover: [{
24099
- effectId: "text-color-change",
24100
- options: { hoverColorToken: "primary" }
24101
- }] }
24102
- },
24103
- /**
24104
- * Underline - static underline appears on hover
24105
- */
24106
- underline: {
24107
- name: "Underline",
24108
- typography: "body",
24109
- fontWeight: "medium",
24110
- textTransform: "none",
24111
- italic: false,
24112
- colorToken: "text",
24113
- padding: "none",
24114
- borderRadius: "none",
24115
- effects: { hover: [{
24116
- effectId: "nav-underline",
24117
- options: { style: "static" }
24118
- }] }
24119
- },
24120
- /**
24121
- * Underline Grow - animated underline grows from center on hover
24122
- */
24123
- "underline-grow": {
24124
- name: "Underline Grow",
24125
- typography: "body",
24126
- fontWeight: "medium",
24127
- textTransform: "none",
24128
- italic: false,
24129
- colorToken: "text",
24130
- padding: "none",
24131
- borderRadius: "none",
24132
- effects: { hover: [{
24133
- effectId: "nav-underline",
24134
- options: { style: "grow" }
24135
- }] }
24136
- },
24137
- /**
24138
- * Capsule - pill-shaped background on hover
24139
- */
24140
- capsule: {
24141
- name: "Capsule",
24142
- typography: "body",
24143
- fontWeight: "medium",
24144
- textTransform: "none",
24145
- italic: false,
24146
- colorToken: "text",
24147
- padding: "compact",
24148
- borderRadius: "full",
24149
- effects: {
24150
- hover: [{
24151
- effectId: "background-on-hover-alpha",
24152
- options: {
24153
- colorToken: "primary",
24154
- opacity: 10
24155
- }
24156
- }],
24157
- active: [{
24158
- effectId: "background-on-hover-alpha",
24159
- options: {
24160
- colorToken: "primary",
24161
- opacity: 15
24162
- }
24163
- }]
24164
- }
24165
- },
24166
- /**
24167
- * Solid - solid background color on hover
24168
- */
24169
- solid: {
24170
- name: "Solid",
24171
- typography: "body",
24172
- fontWeight: "medium",
24173
- textTransform: "none",
24174
- italic: false,
24175
- colorToken: "text",
24176
- padding: "compact",
24177
- borderRadius: "none",
24178
- effects: {
24179
- hover: [{
24180
- effectId: "background-on-hover",
24181
- options: {
24182
- colorToken: "primary",
24183
- textColorToken: "primaryForeground"
24184
- }
24185
- }],
24186
- active: [{
24187
- effectId: "background-on-hover",
24188
- options: {
24189
- colorToken: "primary",
24190
- textColorToken: "primaryForeground"
24191
- }
24192
- }]
24193
- }
24194
- },
24195
- /**
24196
- * Scale - gentle scale-up on hover
24197
- */
24198
- scale: {
24199
- name: "Scale",
24200
- typography: "body",
24201
- fontWeight: "medium",
24202
- textTransform: "none",
24203
- italic: false,
24204
- colorToken: "text",
24205
- padding: "none",
24206
- borderRadius: "none",
24207
- effects: { hover: [{
24208
- effectId: "scale-up",
24209
- options: { scale: 1.05 }
24210
- }] }
24211
- },
24212
- /**
24213
- * Frosted - semi-transparent glass-like background
24214
- */
24215
- frosted: {
24216
- name: "Frosted",
24217
- typography: "body",
24218
- fontWeight: "medium",
24219
- textTransform: "none",
24220
- italic: false,
24221
- colorToken: "text",
24222
- padding: "compact",
24223
- borderRadius: "md",
24224
- effects: {
24225
- base: [{ effectId: "nav-frosted-base" }],
24226
- hover: [{ effectId: "nav-frosted-hover" }],
24227
- active: [{ effectId: "nav-frosted-active" }]
24228
- }
24229
- }
24230
- };
24231
- /**
24232
- * Get a nav link style preset by ID
24233
- */
24234
- function getNavLinkPreset(presetId) {
24235
- return NAV_LINK_PRESETS[presetId];
24236
- }
24237
- Object.keys(NAV_LINK_PRESETS);
24238
- //#endregion
24239
24886
  //#region ../theme-core/src/header/legacyNavLinkStyle.ts
24240
24887
  function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
24241
24888
  const navStyle = header.navStyle ?? "minimal";
@@ -24480,28 +25127,6 @@ z.object({
24480
25127
  motion: z.enum(themeTokenRecipeOptions.motion)
24481
25128
  });
24482
25129
  //#endregion
24483
- //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
24484
- function effectiveFooterNavLinkStyle(footer) {
24485
- if (!footer) return null;
24486
- if (footer.navLinkStyle) return footer.navLinkStyle;
24487
- const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
24488
- if (!basePreset) return null;
24489
- return {
24490
- ...basePreset,
24491
- fontWeight: footer.navWeight ?? basePreset.fontWeight,
24492
- colorToken: footer.navColor?.trim() || basePreset.colorToken
24493
- };
24494
- }
24495
- function footerForegroundCandidates(footer, proseHoverCandidate) {
24496
- if (!footer) return {};
24497
- const style = effectiveFooterNavLinkStyle(footer);
24498
- return {
24499
- text: footer.background?.textColor,
24500
- link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
24501
- linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
24502
- };
24503
- }
24504
- //#endregion
24505
25130
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
24506
25131
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
24507
25132
  //#endregion
@@ -27480,7 +28105,12 @@ function resolveRuntimeSectionSurface(value, context, options) {
27480
28105
  }
27481
28106
  function arrangementSurfaceInk(foreground, context) {
27482
28107
  if (context.data?._lookSlots === void 0) return {};
27483
- const decorations = surfaceDecorationColors(foreground, context.theme.palette);
28108
+ return surfaceInkStyles(foreground, context.theme.palette);
28109
+ }
28110
+ /** Decoration roles already resolved by the surface owner, shared with footer arrangements. */
28111
+ function surfaceInkStyles(foreground, palette) {
28112
+ if (foreground.kind === "unknown") return {};
28113
+ const decorations = surfaceDecorationColors(foreground, palette);
27484
28114
  return {
27485
28115
  "--rb-surface-muted-color": foreground.roles.muted ?? foreground.roles.text,
27486
28116
  ...decorations ? {
@@ -28091,48 +28721,50 @@ const boxStylesTransforms = [
28091
28721
  ];
28092
28722
  //#endregion
28093
28723
  //#region ../blocks/src/system/node/fragments/responsiveTwoColumn.ts
28094
- 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" }) {
28095
- const baseClass = !gapFrom ? `${containerClassName} ${gapClassName}`.trim() : containerClassName;
28096
- const props = { className: { $bind: {
28097
- from: imagePositionFrom,
28098
- transforms: [{
28099
- id: "ui.twoColumnContainerClass",
28100
- options: {
28101
- base: baseClass,
28102
- reverseClass: "rb-md-flex-row-reverse"
28103
- }
28104
- }],
28105
- fallback: baseClass
28106
- } } };
28107
- if (gapFrom) props.style = { gap: { $bind: {
28108
- from: gapFrom,
28109
- transforms: [{
28110
- id: "boxStyles.semanticGapValue",
28111
- options: { fallback: gapFallback }
28112
- }],
28113
- fallback: GAP_VALUE_MAP[gapFallback]
28114
- } } };
28115
- return el("div", props, [el("div", {
28116
- className: imageWrapperClassName,
28117
- style: { flexBasis: { $bind: {
28118
- from: ratioFrom,
28724
+ /** The shared two-column shell keeps Look hooks opt-in and absent for legacy content. */
28725
+ function responsiveTwoColumn(config) {
28726
+ return el("div", twoColumnProps(config), [twoColumnWrapper(config, "image", config.image), twoColumnWrapper(config, "text", config.text)]);
28727
+ }
28728
+ function twoColumnProps(config) {
28729
+ const base = `${config.containerClassName ?? "rb-flex rb-flex-col rb-md-flex-row"} ${config.gapFrom ? "" : config.gapClassName ?? "rb-gap-6"}`.trim();
28730
+ const fallback = config.gapFallback ?? "comfortable";
28731
+ return {
28732
+ ...config.lookSlots ? lookSlot("frame") : {},
28733
+ className: { $bind: {
28734
+ from: config.imagePositionFrom,
28119
28735
  transforms: [{
28120
- id: "ui.twoColumnFlexBasis",
28121
- options: { side: "image" }
28736
+ id: "ui.twoColumnContainerClass",
28737
+ options: {
28738
+ base,
28739
+ reverseClass: "rb-md-flex-row-reverse"
28740
+ }
28122
28741
  }],
28123
- fallback: "50%"
28124
- } } }
28125
- }, [image]), el("div", {
28126
- className: textWrapperClassName,
28742
+ fallback: base
28743
+ } },
28744
+ ...config.gapFrom ? { style: { gap: { $bind: {
28745
+ from: config.gapFrom,
28746
+ transforms: [{
28747
+ id: "boxStyles.semanticGapValue",
28748
+ options: { fallback }
28749
+ }],
28750
+ fallback: GAP_VALUE_MAP[fallback]
28751
+ } } } } : {}
28752
+ };
28753
+ }
28754
+ function twoColumnWrapper(config, side, child) {
28755
+ const className = side === "image" ? config.imageWrapperClassName ?? "rb-w-full rb-shrink-0" : config.textWrapperClassName ?? "rb-w-full rb-min-w-0 rb-flex-1";
28756
+ return el("div", {
28757
+ ...config.lookSlots ? lookSlot(side === "image" ? "media" : "copy") : {},
28758
+ className,
28127
28759
  style: { flexBasis: { $bind: {
28128
- from: ratioFrom,
28760
+ from: config.ratioFrom,
28129
28761
  transforms: [{
28130
28762
  id: "ui.twoColumnFlexBasis",
28131
- options: { side: "text" }
28763
+ options: { side }
28132
28764
  }],
28133
28765
  fallback: "50%"
28134
28766
  } } }
28135
- }, [text])]);
28767
+ }, [child]);
28136
28768
  }
28137
28769
  //#endregion
28138
28770
  //#region ../blocks/src/system/node/fragments/styledCard.ts
@@ -28319,6 +28951,47 @@ function sectionState(opts) {
28319
28951
  })]);
28320
28952
  }
28321
28953
  //#endregion
28954
+ //#region ../blocks/src/system/node/fragments/sectionHead.ts
28955
+ const recoverEmptyHeadingWhenActive = {
28956
+ kind: "recover-empty-when-active",
28957
+ placeholder: "Add heading"
28958
+ };
28959
+ const recoverEmptyDescriptionWhenActive = {
28960
+ kind: "recover-empty-when-active",
28961
+ placeholder: "Add description"
28962
+ };
28963
+ function sectionHeaderLayoutNodes(options = {}) {
28964
+ const headingNode = text({
28965
+ as: "h2",
28966
+ ...lookSlot("heading")
28967
+ }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
28968
+ const descriptionNode = richText({
28969
+ className: "rb-prose rb-max-w-none",
28970
+ ...lookSlot("intro")
28971
+ }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
28972
+ if (options.splitClassName) return [el("div", {
28973
+ className: options.splitClassName,
28974
+ ...lookSlot("head")
28975
+ }, [headingNode, descriptionNode])];
28976
+ return [headingNode, descriptionNode];
28977
+ }
28978
+ /** Shared optional section copy. Existing consumers keep their description ID. */
28979
+ const sectionHeaderFields = (defaultHeading, introLabel = "Description") => [{
28980
+ id: "heading",
28981
+ type: "text",
28982
+ label: "Heading",
28983
+ description: "Main heading for the section",
28984
+ required: false,
28985
+ multiline: false,
28986
+ ...defaultHeading === void 0 ? {} : { defaultValue: defaultHeading }
28987
+ }, {
28988
+ id: "description",
28989
+ type: "richText",
28990
+ label: introLabel,
28991
+ description: "Optional introductory text",
28992
+ required: false
28993
+ }];
28994
+ //#endregion
28322
28995
  //#region ../blocks/src/system/fragments/types.ts
28323
28996
  const FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
28324
28997
  const FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;
@@ -28651,6 +29324,7 @@ const bodyCopyFragment = defineFragment({
28651
29324
  ],
28652
29325
  layout: stack({
28653
29326
  gap: "md",
29327
+ ...lookSlot("copy"),
28654
29328
  className: "body-copy-container",
28655
29329
  align: { $bind: {
28656
29330
  from: "content.alignment",
@@ -28659,6 +29333,7 @@ const bodyCopyFragment = defineFragment({
28659
29333
  } }
28660
29334
  }, [text({
28661
29335
  as: "h2",
29336
+ ...lookSlot("heading"),
28662
29337
  className: { $bind: {
28663
29338
  from: "content.alignment",
28664
29339
  transforms: [{
@@ -28667,14 +29342,22 @@ const bodyCopyFragment = defineFragment({
28667
29342
  }],
28668
29343
  fallback: "body-copy-heading"
28669
29344
  } }
28670
- }, when("content.heading"), bind("content.heading")), richText({ className: { $bind: {
28671
- from: "content.alignment",
28672
- transforms: [{
28673
- id: "ui.bodyClassFromAlignment",
28674
- options: { base: "body-copy-body rb-prose rb-max-w-none" }
28675
- }],
28676
- fallback: "body-copy-body rb-prose rb-max-w-none"
28677
- } } }, bind("content.body"))])
29345
+ }, when("content.heading", { authoringPresence: {
29346
+ kind: "recover-empty-when-active",
29347
+ placeholder: "Add heading"
29348
+ } }), bind("content.heading")), richText({
29349
+ ...lookSlot("item-body"),
29350
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
29351
+ lookSlots: { $bind: { from: "content._lookSlots" } },
29352
+ className: { $bind: {
29353
+ from: "content.alignment",
29354
+ transforms: [{
29355
+ id: "ui.bodyClassFromAlignment",
29356
+ options: { base: "body-copy-body rb-prose rb-max-w-none" }
29357
+ }],
29358
+ fallback: "body-copy-body rb-prose rb-max-w-none"
29359
+ } }
29360
+ }, bind("content.body"))])
28678
29361
  });
28679
29362
  //#endregion
28680
29363
  //#region ../blocks/src/system/fragments/library/heroCopy.ts
@@ -29690,8 +30373,19 @@ const formCopyFragment = defineFragment({
29690
30373
  }],
29691
30374
  layout: [text({
29692
30375
  as: "h2",
30376
+ ...lookSlot("heading"),
29693
30377
  className: "form-copy-title"
29694
- }, when("content.title"), bind("content.title")), richText({ className: "form-copy-intro rb-prose rb-max-w-none" }, when("content.intro"), bind("content.intro"))]
30378
+ }, when("content.title", { authoringPresence: {
30379
+ kind: "recover-empty-when-active",
30380
+ placeholder: "Add heading"
30381
+ } }), bind("content.title")), richText({
30382
+ className: "form-copy-intro rb-prose rb-max-w-none",
30383
+ ...lookSlot("intro"),
30384
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } }
30385
+ }, when("content.intro", { authoringPresence: {
30386
+ kind: "recover-empty-when-active",
30387
+ placeholder: "Add introduction"
30388
+ } }), bind("content.intro"))]
29695
30389
  });
29696
30390
  //#endregion
29697
30391
  //#region ../blocks/src/system/helpers/api-bindings.ts
@@ -29740,6 +30434,7 @@ const formEmbedFragment = defineFragment({
29740
30434
  }
29741
30435
  ],
29742
30436
  layout: [form(withApiBindings({
30437
+ lookSlots: { $bind: { from: "content._lookSlots" } },
29743
30438
  spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
29744
30439
  submitLabel: { $bind: { from: "submitLabel" } },
29745
30440
  successMessage: { $bind: { from: "successMessage" } }
@@ -29993,8 +30688,18 @@ const newsletterCopyFragment = defineFragment({
29993
30688
  }],
29994
30689
  layout: [text({
29995
30690
  as: "h2",
29996
- className: "newsletter-copy-title"
29997
- }, when("content.title"), bind("content.title")), richText({ className: "newsletter-copy-subtitle rb-prose rb-max-w-none" }, when("content.subtitle"), bind("content.subtitle"))]
30691
+ className: "newsletter-copy-title",
30692
+ ...lookSlot("heading")
30693
+ }, when("content.title", { authoringPresence: {
30694
+ kind: "recover-empty-when-active",
30695
+ placeholder: "Add heading"
30696
+ } }), bind("content.title")), richText({
30697
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none",
30698
+ ...lookSlot("intro")
30699
+ }, when("content.subtitle", { authoringPresence: {
30700
+ kind: "recover-empty-when-active",
30701
+ placeholder: "Add introduction"
30702
+ } }), bind("content.subtitle"))]
29998
30703
  });
29999
30704
  //#endregion
30000
30705
  //#region ../blocks/src/system/fragments/library/newsletterForm.ts
@@ -30062,6 +30767,7 @@ const newsletterFormFragment = defineFragment({
30062
30767
  }
30063
30768
  ],
30064
30769
  layout: [el("newsletter-form", withApiBindings({
30770
+ lookSlots: { $bind: { from: "content._lookSlots" } },
30065
30771
  source: { $bind: {
30066
30772
  from: "mailingListSource",
30067
30773
  fallback: "block"
@@ -31554,18 +32260,11 @@ const introBlockDefinition = { manifest: createBlockManifest({
31554
32260
  //#endregion
31555
32261
  //#region ../blocks/src/system/blocks/body-text.ts
31556
32262
  const bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
31557
- const proseLayout = styledSection({
31558
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
31559
- spacing: "medium",
31560
- baseClass: ""
31561
- });
31562
- const introLayout = styledSection({
31563
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
31564
- spacing: "medium",
31565
- baseClass: ""
31566
- });
31567
- const narrowLayout = styledSection({
31568
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
32263
+ const bodyTextLayout = styledSection({
32264
+ children: stack({
32265
+ className: "rb-container",
32266
+ ...lookSlot("frame")
32267
+ }, bodyCopyComposition.layout),
31569
32268
  spacing: "medium",
31570
32269
  baseClass: ""
31571
32270
  });
@@ -31579,11 +32278,11 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
31579
32278
  fragment: bodyCopyFragment,
31580
32279
  fieldPriority: 0
31581
32280
  }],
31582
- layout: proseLayout,
32281
+ layout: bodyTextLayout,
31583
32282
  variants: {
31584
- prose: proseLayout,
31585
- intro: introLayout,
31586
- narrow: narrowLayout
32283
+ prose: bodyTextLayout,
32284
+ intro: bodyTextLayout,
32285
+ narrow: bodyTextLayout
31587
32286
  },
31588
32287
  variantMeaning: { kind: "arrangement" },
31589
32288
  defaultVariant: "prose",
@@ -32031,6 +32730,52 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
32031
32730
  styleTokens: { spacing: "md" }
32032
32731
  }) };
32033
32732
  //#endregion
32733
+ //#region ../blocks/src/system/runtime/lookSurfaces.ts
32734
+ const isPlainObject$2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
32735
+ const lookListPresentationSchemaShape = {
32736
+ sectionAction: z.object({
32737
+ label: z.string(),
32738
+ href: z.string()
32739
+ }).optional(),
32740
+ actionSize: z.enum([
32741
+ "sm",
32742
+ "md",
32743
+ "lg"
32744
+ ]).optional(),
32745
+ itemActionStyle: z.enum(["button", "link"]).optional(),
32746
+ itemRoles: z.object({
32747
+ container: z.enum([
32748
+ "card",
32749
+ "statement",
32750
+ "highlight"
32751
+ ]).optional(),
32752
+ items: z.enum([
32753
+ "card",
32754
+ "statement",
32755
+ "highlight"
32756
+ ]).optional(),
32757
+ at: z.partialRecord(z.enum([
32758
+ "first",
32759
+ "last",
32760
+ "middle",
32761
+ "odd",
32762
+ "even"
32763
+ ]), z.enum([
32764
+ "card",
32765
+ "statement",
32766
+ "highlight"
32767
+ ])).optional()
32768
+ }).optional(),
32769
+ roleSurfaces: z.record(z.enum([
32770
+ "card",
32771
+ "statement",
32772
+ "highlight"
32773
+ ]), z.custom((value) => isPlainObject$2(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
32774
+ panelHeading: z.string().optional(),
32775
+ lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
32776
+ itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject$2(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
32777
+ };
32778
+ //#endregion
32034
32779
  //#region ../blocks/src/contracts/runtime.ts
32035
32780
  function decodeSuccess(value) {
32036
32781
  return {
@@ -32137,6 +32882,7 @@ const formFieldGroupSchema = z.discriminatedUnion("type", [z.object({
32137
32882
  fields: z.tuple([formFieldSchema, formFieldSchema])
32138
32883
  })]);
32139
32884
  const formSourceSchema = z.object({
32885
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
32140
32886
  value: formRecordSchema.optional(),
32141
32887
  siteId: z.string().optional(),
32142
32888
  apiBaseUrl: z.string().optional(),
@@ -32146,6 +32892,7 @@ const formSourceSchema = z.object({
32146
32892
  spamProtectionEnabled: z.boolean().optional()
32147
32893
  });
32148
32894
  const formDisplaySchema = z.object({
32895
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
32149
32896
  kind: z.literal("form"),
32150
32897
  state: z.enum(["missing", "ready"]),
32151
32898
  className: z.string().nullable(),
@@ -32166,17 +32913,30 @@ z.object({
32166
32913
  });
32167
32914
  function buildFormDisplay(source) {
32168
32915
  const form = source.value ?? null;
32169
- const fields = form?.schemaJson?.fields;
32170
- const groups = Array.isArray(fields) ? groupFormFields(fields) : [];
32916
+ const fields = formDisplayFields(form);
32171
32917
  return {
32172
32918
  kind: "form",
32173
- state: form ? "ready" : "missing",
32919
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
32920
+ state: fields.state,
32174
32921
  className: source.className ?? null,
32175
- formId: form?.id ?? null,
32922
+ formId: fields.formId,
32176
32923
  submitLabel: source.submitLabel?.trim() || "Submit",
32177
32924
  successMessage: source.successMessage ?? null,
32178
32925
  form,
32179
- groups
32926
+ groups: fields.groups
32927
+ };
32928
+ }
32929
+ function formDisplayFields(form) {
32930
+ if (!form) return {
32931
+ state: "missing",
32932
+ formId: null,
32933
+ groups: []
32934
+ };
32935
+ const fields = form.schemaJson?.fields;
32936
+ return {
32937
+ state: "ready",
32938
+ formId: form.id,
32939
+ groups: Array.isArray(fields) ? groupFormFields(fields) : []
32180
32940
  };
32181
32941
  }
32182
32942
  const formBlockRuntime = defineProgressiveBlockRuntime({
@@ -32199,18 +32959,27 @@ function fragmentLayoutNode$1(layout) {
32199
32959
  function isNodeDefinitionArray$1(layout) {
32200
32960
  return Array.isArray(layout);
32201
32961
  }
32202
- const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
32962
+ const copyLayout = props(lookSlot("head"))(fragmentLayoutNode$1(formCopyFragment.layout));
32963
+ const embedLayout$1 = fragmentLayoutNode$1(formEmbedFragment.layout);
32203
32964
  const formSurface = styledContainer({
32965
+ rootProps: lookSlot("panel"),
32204
32966
  bindFrom: "_containerStyles",
32205
32967
  constrainWidth: false,
32206
32968
  baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
32207
- children: fragmentLayoutNode$1(formEmbedFragment.layout)
32969
+ children: embedLayout$1
32208
32970
  });
32209
32971
  function createFormLayout(variant) {
32210
32972
  if (variant === "two-column") return styledSection({
32211
- 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({
32973
+ children: el("div", {
32974
+ className: "rb-container",
32975
+ ...lookSlot("layout")
32976
+ }, [el("div", {
32977
+ className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start",
32978
+ ...lookSlot("frame")
32979
+ }, [stack({
32212
32980
  gap: "md",
32213
- className: "rb-form-copy-column"
32981
+ className: "rb-form-copy-column",
32982
+ ...lookSlot("copy")
32214
32983
  }, [copyLayout]), formSurface])]),
32215
32984
  baseClass: "",
32216
32985
  spacing: "medium",
@@ -32238,6 +33007,15 @@ const formManifest = createBlockManifest({
32238
33007
  description: "Renders a saved form definition with server-side submit.",
32239
33008
  includeContainerStyles: true,
32240
33009
  fragments: [{ fragment: formCopyFragment }, { fragment: formEmbedFragment }],
33010
+ additionalFields: [{
33011
+ id: "archFrame",
33012
+ type: "boolean",
33013
+ label: "Arch frame",
33014
+ ui: {
33015
+ intent: "display",
33016
+ hidden: true
33017
+ }
33018
+ }],
32241
33019
  layout: formLayout,
32242
33020
  variants: {
32243
33021
  default: formLayout,
@@ -32993,7 +33771,7 @@ const heroTitleLengthThresholds = {
32993
33771
  maxWords: 11
32994
33772
  }
32995
33773
  };
32996
- function isPlainObject$2(value) {
33774
+ function isPlainObject$1(value) {
32997
33775
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
32998
33776
  }
32999
33777
  function readString(obj, key) {
@@ -33002,7 +33780,7 @@ function readString(obj, key) {
33002
33780
  }
33003
33781
  function resolveGeneratedHeroLayoutStyles(content) {
33004
33782
  const raw = content._heroLayoutStyles;
33005
- return isPlainObject$2(raw) ? raw : null;
33783
+ return isPlainObject$1(raw) ? raw : null;
33006
33784
  }
33007
33785
  function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
33008
33786
  const explicitValue = readString(content, fallbackKey);
@@ -33060,7 +33838,7 @@ const heroContentWrapperClassTransform = {
33060
33838
  summary: "Resolve hero content wrapper className from alignment + max width controls",
33061
33839
  schema: z.object({ base: z.string().optional() }),
33062
33840
  run: (value, options, context) => {
33063
- const content = isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {};
33841
+ const content = isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {};
33064
33842
  const alignment = resolveHeroContentAlignment(content);
33065
33843
  const maxWidth = resolveHeroContentMaxWidth(content);
33066
33844
  const typographyScale = resolveHeroTypographyScale(content);
@@ -33082,7 +33860,7 @@ const heroCtaJustifyTransform = {
33082
33860
  kind: "string",
33083
33861
  summary: "Map hero contentAlignment to CTA row justify value",
33084
33862
  run: (value, _options, context) => {
33085
- const alignment = resolveHeroContentAlignment(isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {});
33863
+ const alignment = resolveHeroContentAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
33086
33864
  return alignment === "left" ? "start" : alignment === "right" ? "end" : "center";
33087
33865
  }
33088
33866
  };
@@ -33091,7 +33869,7 @@ const heroStackJustifyFromVerticalAlignmentTransform = {
33091
33869
  kind: "string",
33092
33870
  summary: "Map hero verticalAlignment to stack justify value",
33093
33871
  run: (value, _options, context) => {
33094
- const vertical = resolveHeroVerticalAlignment(isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {});
33872
+ const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
33095
33873
  return vertical === "top" ? "start" : vertical === "bottom" ? "end" : "center";
33096
33874
  }
33097
33875
  };
@@ -33101,7 +33879,7 @@ const heroGridClassFromVerticalAlignmentTransform = {
33101
33879
  summary: "Append align-items class for hero split layouts based on verticalAlignment",
33102
33880
  schema: z.object({ base: z.string() }),
33103
33881
  run: (value, options, context) => {
33104
- const vertical = resolveHeroVerticalAlignment(isPlainObject$2(value) ? value : isPlainObject$2(context.data) ? context.data : {});
33882
+ const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
33105
33883
  const itemsClass = vertical === "top" ? "rb-items-start" : vertical === "bottom" ? "rb-items-end" : "rb-items-center";
33106
33884
  return joinClasses$1([options.base, itemsClass]);
33107
33885
  }
@@ -33389,6 +34167,25 @@ function heroHeadlineText(content, policy) {
33389
34167
  return policy === "look" ? inlineTextToPlainText(coerceInlineTextWithFallback(content.headlineInline, plain)).trim() : plain?.trim() ?? "";
33390
34168
  }
33391
34169
  //#endregion
34170
+ //#region ../blocks/src/system/transforms/registry/footerArrangement.ts
34171
+ const footerBrandArrangementTransform = {
34172
+ id: "layout.footerBrandArrangement",
34173
+ kind: "string",
34174
+ run: (value) => {
34175
+ const module = asPartialObject(value);
34176
+ return module?.kind === "brand" ? module.slots ? "centred" : "row" : void 0;
34177
+ }
34178
+ };
34179
+ const footerModuleInkStyleTransform = {
34180
+ id: "layout.footerModuleInkStyle",
34181
+ kind: "formatter",
34182
+ run: (value, options) => value === "centred" ? void 0 : textColorStyle(asPartialObject(options)?.opacity === 70 ? "text/70" : "text/80")
34183
+ };
34184
+ /** A centred base without authored bar paint inherits its measured surface line. */
34185
+ function footerBottomBarBorderColorStyle(footer) {
34186
+ return footer?.variant === "centred" && !footer.bottomBar ? { borderColor: "var(--rb-surface-line-color)" } : borderColorStyle(footer?.bottomBar?.borderTop?.colorToken ?? "border");
34187
+ }
34188
+ //#endregion
33392
34189
  //#region ../blocks/src/system/runtime/header/runtimeContract.ts
33393
34190
  const headerScrollRuntimeSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("none") }), z.object({ kind: z.literal("threshold") })]);
33394
34191
  z.object({ scroll: headerScrollRuntimeSchema });
@@ -33620,6 +34417,7 @@ const footerRootStyleTransform = {
33620
34417
  }
33621
34418
  }
33622
34419
  styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
34420
+ if (footer?.variant === "centred") styleParts.push(surfaceInkStyles(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate), context.theme.palette));
33623
34421
  styleParts.push(borderColorStyle("border"));
33624
34422
  return mergeStyles(...styleParts);
33625
34423
  }
@@ -33681,7 +34479,7 @@ const footerBottomBarStyleTransform = {
33681
34479
  run: (value, _options, context) => {
33682
34480
  const footer = asPartialObject(value);
33683
34481
  const bottomBar = footer?.bottomBar;
33684
- 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));
34482
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : void 0, footerBottomBarBorderColorStyle(footer), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
33685
34483
  }
33686
34484
  };
33687
34485
  function footerBottomBarForegroundStyle(footer, palette) {
@@ -33703,62 +34501,15 @@ function measuredFooterBackdrop(footer, palette) {
33703
34501
  const foreground = resolveFooterRootForeground(footer, palette);
33704
34502
  return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
33705
34503
  }
33706
- const footerSplitMainClassTransform = {
33707
- id: "layout.footerSplitMainClass",
33708
- kind: "string",
33709
- summary: "Compose split-footer main row classes from footer logo placement",
33710
- schema: z.object({
33711
- base: z.string().optional(),
33712
- reverseClass: z.string().optional()
33713
- }),
33714
- run: (value, options) => {
33715
- const placement = asPartialObject(value)?.placement ?? "right";
33716
- const shouldPlaceLogoFirst = placement === "left" || placement === "above";
33717
- 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";
33718
- return joinClasses([options.base ?? baseClass, shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null]);
33719
- }
33720
- };
33721
34504
  const footerLogoClassTransform = {
33722
34505
  id: "layout.footerLogoClass",
33723
34506
  kind: "string",
33724
34507
  summary: "Compose split-footer logo wrapper classes from footer.logo controls",
33725
- schema: z.object({
33726
- base: z.string().optional(),
33727
- requireExplicitShow: z.boolean().optional()
33728
- }),
34508
+ schema: z.object({ base: z.string().optional() }),
33729
34509
  run: (value, options) => {
33730
- const logo = asPartialObject(value);
33731
- const align = logo?.align ?? "end";
33732
- const hiddenClass = options.requireExplicitShow ? logo?.showLogo === true ? null : "rb-hidden" : logo?.showLogo === false ? "rb-hidden" : null;
34510
+ const align = asPartialObject(value)?.align ?? "end";
33733
34511
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
33734
- return joinClasses([
33735
- 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",
33736
- selfAlignClass,
33737
- hiddenClass
33738
- ]);
33739
- }
33740
- };
33741
- const footerLogoMediaClassTransform = {
33742
- id: "layout.footerLogoMediaClass",
33743
- kind: "string",
33744
- summary: "Compose footer logo image classes from size controls",
33745
- schema: z.object({ base: z.string().optional() }),
33746
- run: (_value, options) => {
33747
- return joinClasses([options.base ?? "rb-w-auto"]);
33748
- }
33749
- };
33750
- function shouldShowFooterLogoText(footer) {
33751
- if (!footer) return false;
33752
- const explicit = footer.logo?.showLogoText;
33753
- const legacy = footer.showLogoText === true;
33754
- return explicit === true || explicit === void 0 && legacy;
33755
- }
33756
- const footerLogoTextVisibleTransform = {
33757
- id: "layout.footerLogoTextVisible",
33758
- kind: "formatter",
33759
- summary: "Return whether footer logo text should render",
33760
- run: (value) => {
33761
- return shouldShowFooterLogoText(asPartialObject(value));
34512
+ 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]);
33762
34513
  }
33763
34514
  };
33764
34515
  function extractBackgroundColorToken(background, fallback) {
@@ -33777,13 +34528,12 @@ const layoutTransforms = [
33777
34528
  headerRootStyleTransform,
33778
34529
  headerSectionBackgroundTransform,
33779
34530
  footerRootStyleTransform,
34531
+ footerModuleInkStyleTransform,
34532
+ footerBrandArrangementTransform,
33780
34533
  footerBottomBarClassTransform,
33781
34534
  footerBottomBarContainerClassTransform,
33782
34535
  footerBottomBarStyleTransform,
33783
- footerSplitMainClassTransform,
33784
- footerLogoClassTransform,
33785
- footerLogoMediaClassTransform,
33786
- footerLogoTextVisibleTransform
34536
+ footerLogoClassTransform
33787
34537
  ];
33788
34538
  //#endregion
33789
34539
  //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
@@ -34279,7 +35029,14 @@ const footerNavGroupsLayout = stack({
34279
35029
  }, [text({
34280
35030
  as: "h3",
34281
35031
  className: "rb-label",
34282
- style: textColorStyle("text/70")
35032
+ "data-slot": { $bind: { from: "content.footerRuntime.slots.group-label" } },
35033
+ style: { $bind: {
35034
+ from: "content.footerRuntime.arrangement",
35035
+ transforms: [{
35036
+ id: "layout.footerModuleInkStyle",
35037
+ options: { opacity: 70 }
35038
+ }]
35039
+ } }
34283
35040
  }, when("group.label"), bind("group.label")), stack({
34284
35041
  gap: "sm",
34285
35042
  align: "start",
@@ -34309,6 +35066,14 @@ const footerMailingListBindings = {
34309
35066
  targeting: { $bind: { from: "module.engagement.runtime.targeting" } }
34310
35067
  };
34311
35068
  const footerSpamProtectionBinding = { spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } } };
35069
+ const brandMedia = media({ className: "rb-h-10 rb-w-auto" }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
35070
+ id: "layout.chromeLogo",
35071
+ options: { surface: "footer-root" }
35072
+ }] }));
35073
+ const brandTitle = text({
35074
+ as: "strong",
35075
+ className: "footer-logo-text rb-nav-text"
35076
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }));
34312
35077
  const brandLogo = link({
34313
35078
  href: "/",
34314
35079
  className: { $bind: {
@@ -34319,20 +35084,39 @@ const brandLogo = link({
34319
35084
  }],
34320
35085
  fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
34321
35086
  } }
34322
- }, [media({ className: { $bind: {
34323
- from: "$root.theme.footer.logo",
34324
- transforms: [{
34325
- id: "layout.footerLogoMediaClass",
34326
- options: { base: "rb-h-10 rb-w-auto" }
34327
- }],
34328
- fallback: "rb-h-10 rb-w-auto"
34329
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
34330
- id: "layout.chromeLogo",
34331
- options: { surface: "footer-root" }
34332
- }] })), text({
34333
- as: "strong",
34334
- className: "footer-logo-text rb-nav-text"
34335
- }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
35087
+ }, [brandMedia, brandTitle], (node) => ({
35088
+ ...node,
35089
+ $when: {
35090
+ when: {
35091
+ from: "module",
35092
+ transforms: [{ id: "layout.footerBrandArrangement" }]
35093
+ },
35094
+ equals: "row"
35095
+ }
35096
+ }));
35097
+ const centredBrand = stack({
35098
+ gap: "md",
35099
+ align: "center"
35100
+ }, [link({
35101
+ href: "/",
35102
+ "data-slot": { $bind: { from: "module.slots.media" } },
35103
+ className: "footer-logo rb-inline-flex rb-items-center rb-no-underline"
35104
+ }, [brandMedia], when("module.slots.media")), {
35105
+ ...brandTitle,
35106
+ props: {
35107
+ ...brandTitle.props,
35108
+ "data-slot": { $bind: { from: "module.slots.heading" } }
35109
+ }
35110
+ }], (node) => ({
35111
+ ...node,
35112
+ $when: {
35113
+ when: {
35114
+ from: "module",
35115
+ transforms: [{ id: "layout.footerBrandArrangement" }]
35116
+ },
35117
+ equals: "centred"
35118
+ }
35119
+ }));
34336
35120
  const navigation = stack({
34337
35121
  gap: "md",
34338
35122
  className: "rb-w-full"
@@ -34357,14 +35141,18 @@ const address = text({
34357
35141
  }, when("module.kind", { equals: "business-address" }), bind("module.address"));
34358
35142
  const contact = stack({
34359
35143
  gap: "sm",
34360
- className: "rb-items-start"
35144
+ className: { $bind: {
35145
+ from: "module.contactClassName",
35146
+ fallback: "rb-items-start"
35147
+ } }
34361
35148
  }, [link({
34362
35149
  href: { $bind: { from: "contactLink.href" } },
34363
35150
  className: "rb-nav-text rb-break-words transition-theme-standard"
34364
35151
  }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
34365
35152
  const hours = stack({
34366
35153
  gap: "sm",
34367
- className: "rb-w-full"
35154
+ className: "rb-w-full",
35155
+ "data-slot": { $bind: { from: "module.slots.schedule" } }
34368
35156
  }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
34369
35157
  as: "span",
34370
35158
  className: "rb-label"
@@ -34375,7 +35163,10 @@ const hours = stack({
34375
35163
  as: "p",
34376
35164
  className: "rb-caption rb-opacity-70"
34377
35165
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
34378
- const socials = inline({ className: "rb-footer-socials" }, [link({
35166
+ const socials = inline({
35167
+ className: "rb-footer-socials",
35168
+ "data-slot": { $bind: { from: "module.slots.social" } }
35169
+ }, [link({
34379
35170
  href: { $bind: { from: "social.href" } },
34380
35171
  target: "_blank",
34381
35172
  rel: "noreferrer noopener",
@@ -34384,7 +35175,14 @@ const socials = inline({ className: "rb-footer-socials" }, [link({
34384
35175
  }, [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" }));
34385
35176
  const authoredCopy = richText({
34386
35177
  className: "rb-prose rb-prose-sm rb-max-w-none",
34387
- style: textColorStyle("text/80")
35178
+ "data-slot": { $bind: { from: "module.slots.copy" } },
35179
+ style: { $bind: {
35180
+ from: "content.footerRuntime.arrangement",
35181
+ transforms: [{
35182
+ id: "layout.footerModuleInkStyle",
35183
+ options: { opacity: 80 }
35184
+ }]
35185
+ } }
34388
35186
  }, when("module.content"), bind("module.content", { transforms: [{
34389
35187
  id: "content.interpolateRichTextTokens",
34390
35188
  options: { tokens: ["year", "site_name"] }
@@ -34422,27 +35220,44 @@ const platformAttribution = el("div", {
34422
35220
  ], when("module.kind", { equals: "attribution" }));
34423
35221
  const footerGroup = stack({
34424
35222
  gap: "md",
34425
- align: "stretch",
35223
+ align: { $bind: {
35224
+ from: "group.align",
35225
+ fallback: "stretch"
35226
+ } },
34426
35227
  className: { $bind: {
34427
35228
  from: "group.className",
34428
35229
  fallback: "rb-min-w-0"
34429
35230
  } },
35231
+ "data-slot": { $bind: { from: "group.slot" } },
34430
35232
  "data-footer-group": { $bind: { from: "group.kind" } }
34431
35233
  }, [stack({
34432
35234
  gap: "md",
34433
- align: "start",
35235
+ align: { $bind: {
35236
+ from: "module.align",
35237
+ fallback: "start"
35238
+ } },
35239
+ className: { $bind: { from: "module.className" } },
34434
35240
  "data-preview-footer-module-id": { $bind: { from: "module.id" } }
34435
35241
  }, [
34436
35242
  text({
34437
35243
  as: "h2",
34438
35244
  className: "rb-label",
34439
- style: textColorStyle("text/70")
35245
+ "data-slot": { $bind: { from: "module.slots.group-label" } },
35246
+ style: { $bind: {
35247
+ from: "content.footerRuntime.arrangement",
35248
+ transforms: [{
35249
+ id: "layout.footerModuleInkStyle",
35250
+ options: { opacity: 70 }
35251
+ }]
35252
+ } }
34440
35253
  }, bind("module.heading"), when("module.heading")),
34441
35254
  brandLogo,
35255
+ centredBrand,
34442
35256
  navigation,
34443
35257
  stack({
34444
35258
  gap: "sm",
34445
- className: "rb-w-full"
35259
+ className: "rb-w-full",
35260
+ "data-slot": { $bind: { from: "module.slots.navigation" } }
34446
35261
  }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
34447
35262
  address,
34448
35263
  contact,
@@ -34455,10 +35270,12 @@ const footerGroup = stack({
34455
35270
  ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
34456
35271
  const footerMainRegion = stack({
34457
35272
  className: { $bind: { from: "region.className" } },
35273
+ "data-slot": { $bind: { from: "region.slot" } },
34458
35274
  "data-footer-region": { $bind: { from: "region.kind" } }
34459
35275
  }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
34460
35276
  const footerEngagementRegion = stack({
34461
35277
  className: { $bind: { from: "region.className" } },
35278
+ "data-slot": { $bind: { from: "region.slot" } },
34462
35279
  "data-footer-region": "engagement-row"
34463
35280
  }, [footerGroup], when("region.kind", { equals: "engagement-row" }), repeat("content.footerRuntime.regions", "region"));
34464
35281
  const footerBottomRegion = stack({ className: { $bind: {
@@ -34475,6 +35292,7 @@ const footerBottomRegion = stack({ className: { $bind: {
34475
35292
  from: "$root.theme.footer",
34476
35293
  transforms: [{ id: "layout.footerBottomBarStyle" }]
34477
35294
  } },
35295
+ "data-slot": { $bind: { from: "region.slot" } },
34478
35296
  "data-footer-region": "bottom"
34479
35297
  }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
34480
35298
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
@@ -34496,6 +35314,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
34496
35314
  transforms: [{ id: "layout.footerRootStyle" }],
34497
35315
  fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
34498
35316
  } },
35317
+ "data-arrangement": { $bind: { from: "content.footerRuntime.arrangementHook" } },
34499
35318
  "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
34500
35319
  }, [
34501
35320
  footerEngagementRegion,
@@ -36097,17 +36916,30 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
36097
36916
  }],
36098
36917
  fallback: ""
36099
36918
  } };
36100
- const copyHeading = el("div", { className: titleClassNameFromAlignment }, [text({
36919
+ const copyHeading = el("div", {
36920
+ className: titleClassNameFromAlignment,
36921
+ ...lookSlot("head")
36922
+ }, [text({
36101
36923
  as: "p",
36102
- className: eyebrowClassName("rb-eyebrow heading-eyebrow")
36103
- }, when("content.eyebrow"), bind("content.eyebrow")), text({ as: "h2" }, bind("content.title"))], when("content.title"));
36104
- 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"))]);
36105
- 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" }, [
36106
- copyHeading,
36107
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
36108
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
36109
- ]);
36924
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
36925
+ ...lookSlot("eyebrow")
36926
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
36927
+ as: "h2",
36928
+ ...lookSlot("heading")
36929
+ }, bind("content.title"))], when("content.title"));
36930
+ const textContentNodes = (className) => {
36931
+ const props = {
36932
+ className,
36933
+ ...lookSlot("intro"),
36934
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
36935
+ lookSlots: { $bind: { from: "content._lookSlots" } }
36936
+ };
36937
+ return [styledCard([richText(props, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText(props, when("content.wrapTextInCard", { not: true }), bind("content.text"))];
36938
+ };
36939
+ const defaultTextColumn = el("div", {}, textContentNodes("rb-prose rb-max-w-none"));
36940
+ 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)]);
36110
36941
  const defaultImageCommonProps = {
36942
+ ...lookSlot("photo"),
36111
36943
  className: { $bind: {
36112
36944
  from: "content.imageShape",
36113
36945
  transforms: [{
@@ -36147,6 +36979,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
36147
36979
  slidesToShow: 1
36148
36980
  }, [media(defaultImageCommonProps, bind("item.image"), repeat("content.images", "item"))]);
36149
36981
  const defaultImagesLayout = el("div", {}, [responsiveTwoColumn({
36982
+ lookSlots: true,
36150
36983
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
36151
36984
  text: defaultTextColumn,
36152
36985
  ratioFrom: "content.ratio",
@@ -36158,6 +36991,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
36158
36991
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1"
36159
36992
  })], whenImagesLength(0, { not: true }));
36160
36993
  const bioImagesLayout = el("div", {}, [responsiveTwoColumn({
36994
+ lookSlots: true,
36161
36995
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
36162
36996
  text: bioTextColumn,
36163
36997
  ratioFrom: "content.ratio",
@@ -36168,15 +37002,15 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
36168
37002
  imageWrapperClassName: "rb-w-full rb-shrink-0",
36169
37003
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
36170
37004
  })], whenImagesLength(0, { not: true }));
36171
- 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));
36172
- const bioTextOnlyLayout = el("div", { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" }, [
36173
- text({
36174
- as: "h2",
36175
- className: titleClassNameFromAlignment
36176
- }, when("content.title"), bind("content.title")),
36177
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
36178
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
36179
- ], whenImagesLength(0));
37005
+ const defaultTextOnlyLayout = el("div", lookSlot("copy"), textContentNodes("rb-prose rb-max-w-none"), whenImagesLength(0));
37006
+ const bioTextOnlyLayout = el("div", {
37007
+ className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5",
37008
+ ...lookSlot("copy")
37009
+ }, [text({
37010
+ as: "h2",
37011
+ className: titleClassNameFromAlignment,
37012
+ ...lookSlot("heading")
37013
+ }, when("content.title"), bind("content.title")), ...textContentNodes(bodyClassNameFromAlignment)], whenImagesLength(0));
36180
37014
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
36181
37015
  const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
36182
37016
  const defaultLayout = styledSection({
@@ -36200,9 +37034,31 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
36200
37034
  }),
36201
37035
  baseClass: "",
36202
37036
  spacing: "medium"
37037
+ }),
37038
+ "circle-beside": styledSection({
37039
+ baseClass: "",
37040
+ spacing: "medium",
37041
+ children: styledContainer({ children: el("div", lookSlot("frame"), [el("div", lookSlot("media"), [
37042
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(1)),
37043
+ el("div", {}, [el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))], whenImagesLength(0, { not: true })),
37044
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(0))
37045
+ ]), el("div", lookSlot("copy"), [el("div", lookSlot("head"), [text({
37046
+ as: "p",
37047
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
37048
+ ...lookSlot("eyebrow")
37049
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
37050
+ as: "h2",
37051
+ ...lookSlot("heading")
37052
+ }, bind("content.title"), when("content.title", { authoringPresence: {
37053
+ kind: "recover-empty-when-active",
37054
+ placeholder: "Add heading"
37055
+ } }))]), defaultTextColumn])]) })
36203
37056
  })
36204
37057
  },
36205
- variantMeaning: { kind: "arrangement" },
37058
+ variantMeaning: {
37059
+ kind: "arrangement",
37060
+ lookOnlyKeys: ["circle-beside"]
37061
+ },
36206
37062
  defaultVariant: "default",
36207
37063
  variantOptions: {
36208
37064
  default: { label: "Default" },
@@ -36795,24 +37651,6 @@ const emptyStateField = {
36795
37651
  ui: { intent: "display" }
36796
37652
  };
36797
37653
  /**
36798
- * Section heading and description fields
36799
- */
36800
- const sectionHeaderFields = (defaultHeading) => [{
36801
- id: "heading",
36802
- type: "text",
36803
- label: "Heading",
36804
- description: "Main heading for the events section",
36805
- required: false,
36806
- multiline: false,
36807
- defaultValue: defaultHeading
36808
- }, {
36809
- id: "description",
36810
- type: "richText",
36811
- label: "Description",
36812
- description: "Optional introductory text",
36813
- required: false
36814
- }];
36815
- /**
36816
37654
  * Layout selection field with grid/stack options
36817
37655
  */
36818
37656
  const layoutField = {
@@ -36860,31 +37698,6 @@ const columnsField = (options = [
36860
37698
  }))
36861
37699
  });
36862
37700
  //#endregion
36863
- //#region ../blocks/src/system/blocks/events/shared/layout.ts
36864
- const recoverEmptyHeadingWhenActive = {
36865
- kind: "recover-empty-when-active",
36866
- placeholder: "Add heading"
36867
- };
36868
- const recoverEmptyDescriptionWhenActive = {
36869
- kind: "recover-empty-when-active",
36870
- placeholder: "Add description"
36871
- };
36872
- function eventSectionHeaderLayoutNodes(options = {}) {
36873
- const headingNode = text({
36874
- as: "h2",
36875
- ...lookSlot("heading")
36876
- }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
36877
- const descriptionNode = richText({
36878
- className: "rb-prose rb-max-w-none",
36879
- ...lookSlot("intro")
36880
- }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
36881
- if (options.splitClassName) return [el("div", {
36882
- className: options.splitClassName,
36883
- ...lookSlot("head")
36884
- }, [headingNode, descriptionNode])];
36885
- return [headingNode, descriptionNode];
36886
- }
36887
- //#endregion
36888
37701
  //#region ../blocks/src/system/blocks/shop.shared.ts
36889
37702
  /**
36890
37703
  * Public pass product for shop display
@@ -37225,19 +38038,14 @@ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind
37225
38038
  *
37226
38039
  * Sites don't store a locale, and every public word around a date is English,
37227
38040
  * so the only open question is which English conventions to follow: day or
37228
- * month first, and a 24 or 12-hour clock. The site's time zone is the one
38041
+ * month first. The site's time zone is the one
37229
38042
  * fact every site carries about where it is. It is the site's, never an
37230
38043
  * event's: a venue left at UTC must not turn a UK site's dates American.
37231
38044
  * Anywhere this can't place (UTC, the Americas, Asia) keeps US English, which
37232
38045
  * is what these helpers wrote before sites were placed at all.
37233
38046
  */
37234
38047
  function eventDateLocale(siteTimeZone) {
37235
- if (!siteTimeZone) return "en-US";
37236
- if (siteTimeZone === "Europe/Dublin") return "en-IE";
37237
- if (siteTimeZone.startsWith("Europe/")) return "en-GB";
37238
- if (siteTimeZone.startsWith("Australia/")) return "en-AU";
37239
- if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
37240
- return "en-US";
38048
+ return inferSiteDateLocale(siteTimeZone);
37241
38049
  }
37242
38050
  function formatEventCompactDateRail(isoTimestamp, options, letterCase = "capitals") {
37243
38051
  const locale = options?.locale ?? "en-US";
@@ -38847,7 +39655,7 @@ const eventSpotlightBlockDefinition = {
38847
39655
  ],
38848
39656
  icon: "Star",
38849
39657
  layout: [styledSection({
38850
- children: sectionContainer([...eventSectionHeaderLayoutNodes(), el("event-spotlight", {
39658
+ children: sectionContainer([...sectionHeaderLayoutNodes(), el("event-spotlight", {
38851
39659
  events: { $bind: { from: "data.events" } },
38852
39660
  layout: { $bind: {
38853
39661
  from: "content.layout",
@@ -38903,52 +39711,6 @@ const eventSpotlightBlockDefinition = {
38903
39711
  } }
38904
39712
  };
38905
39713
  //#endregion
38906
- //#region ../blocks/src/system/runtime/lookSurfaces.ts
38907
- const isPlainObject$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
38908
- const lookListPresentationSchemaShape = {
38909
- sectionAction: z.object({
38910
- label: z.string(),
38911
- href: z.string()
38912
- }).optional(),
38913
- actionSize: z.enum([
38914
- "sm",
38915
- "md",
38916
- "lg"
38917
- ]).optional(),
38918
- itemActionStyle: z.enum(["button", "link"]).optional(),
38919
- itemRoles: z.object({
38920
- container: z.enum([
38921
- "card",
38922
- "statement",
38923
- "highlight"
38924
- ]).optional(),
38925
- items: z.enum([
38926
- "card",
38927
- "statement",
38928
- "highlight"
38929
- ]).optional(),
38930
- at: z.partialRecord(z.enum([
38931
- "first",
38932
- "last",
38933
- "middle",
38934
- "odd",
38935
- "even"
38936
- ]), z.enum([
38937
- "card",
38938
- "statement",
38939
- "highlight"
38940
- ])).optional()
38941
- }).optional(),
38942
- roleSurfaces: z.record(z.enum([
38943
- "card",
38944
- "statement",
38945
- "highlight"
38946
- ]), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
38947
- panelHeading: z.string().optional(),
38948
- lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
38949
- itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
38950
- };
38951
- //#endregion
38952
39714
  //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
38953
39715
  /** Invalid saved selections fail closed rather than widening discovery. */
38954
39716
  function resolveEventSelection(mode, value) {
@@ -39632,7 +40394,7 @@ const eventListingBlockDefinition = {
39632
40394
  children: styledContainer({
39633
40395
  rootType: "stack",
39634
40396
  rootProps: { gap: "lg" },
39635
- children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
40397
+ children: [...sectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
39636
40398
  readAuthority: { $bind: { from: "$root.readAuthority" } },
39637
40399
  events: { $bind: { from: "data.events" } },
39638
40400
  stage: { $bind: {
@@ -40072,7 +40834,7 @@ const eventCalendarLayout = [styledSection({
40072
40834
  gap: "lg",
40073
40835
  ...lookSlot("layout")
40074
40836
  },
40075
- children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
40837
+ children: [...sectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
40076
40838
  readAuthority: { $bind: { from: "$root.readAuthority" } },
40077
40839
  events: { $bind: { from: "data.events" } },
40078
40840
  effectiveListArrangementKey: { $bind: { from: "$root.effectiveListArrangementKey" } },
@@ -42252,6 +43014,511 @@ const embedBlockDefinition = {
42252
43014
  } }
42253
43015
  };
42254
43016
  //#endregion
43017
+ //#region ../blocks/src/system/blocks/image-gallery/fields.ts
43018
+ const imageGalleryFields = parseFieldDefinitions([
43019
+ ...sectionHeaderFields(void 0, "Intro"),
43020
+ {
43021
+ id: "images",
43022
+ type: "repeater",
43023
+ label: "Images",
43024
+ itemLabel: "Image",
43025
+ minItems: 0,
43026
+ maxItems: 24,
43027
+ ui: {
43028
+ repeaterPreset: "thumbnailGrid",
43029
+ thumbnailField: "image",
43030
+ thumbnailAltField: "caption",
43031
+ thumbnailLabelField: "caption",
43032
+ thumbnailCardDensity: "compact"
43033
+ },
43034
+ schema: { fields: [{
43035
+ id: "image",
43036
+ type: "media",
43037
+ label: "Image",
43038
+ required: true,
43039
+ mediaKinds: ["image"]
43040
+ }, {
43041
+ id: "caption",
43042
+ type: "text",
43043
+ label: "Caption",
43044
+ description: "Optional caption displayed below the image and used as the editor card label",
43045
+ maxLength: 200
43046
+ }] }
43047
+ },
43048
+ {
43049
+ id: "fullBleed",
43050
+ type: "boolean",
43051
+ label: "Full bleed",
43052
+ description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
43053
+ defaultValue: false,
43054
+ ui: {
43055
+ intent: "display",
43056
+ visibleWhen: {
43057
+ field: "variant",
43058
+ notIn: ["marquee"]
43059
+ }
43060
+ }
43061
+ },
43062
+ {
43063
+ id: "aspectRatio",
43064
+ type: "select",
43065
+ label: "Aspect ratio",
43066
+ description: "Crop images to a consistent aspect ratio.",
43067
+ defaultValue: "1/1",
43068
+ options: [
43069
+ {
43070
+ value: "auto",
43071
+ label: "Original"
43072
+ },
43073
+ {
43074
+ value: "1/1",
43075
+ label: "1:1 (Square)"
43076
+ },
43077
+ {
43078
+ value: "4/3",
43079
+ label: "4:3 (Standard)"
43080
+ },
43081
+ {
43082
+ value: "16/9",
43083
+ label: "16:9 (Widescreen)"
43084
+ },
43085
+ {
43086
+ value: "3/2",
43087
+ label: "3:2 (Classic)"
43088
+ },
43089
+ {
43090
+ value: "3/4",
43091
+ label: "3:4 (Portrait)"
43092
+ }
43093
+ ],
43094
+ ui: {
43095
+ intent: "display",
43096
+ visibleWhen: {
43097
+ field: "variant",
43098
+ notIn: ["masonry", "marquee"]
43099
+ }
43100
+ }
43101
+ },
43102
+ {
43103
+ id: "slidesToShow",
43104
+ type: "select",
43105
+ label: "Images per view (mobile)",
43106
+ description: "Number of images visible at once on small screens.",
43107
+ defaultValue: "1",
43108
+ options: [
43109
+ {
43110
+ value: "1",
43111
+ label: "One at a time"
43112
+ },
43113
+ {
43114
+ value: "2",
43115
+ label: "Two at a time"
43116
+ },
43117
+ {
43118
+ value: "3",
43119
+ label: "Three at a time"
43120
+ }
43121
+ ],
43122
+ ui: {
43123
+ intent: "display",
43124
+ visibleWhen: {
43125
+ field: "variant",
43126
+ equals: "carousel"
43127
+ }
43128
+ }
43129
+ },
43130
+ {
43131
+ id: "slidesToShowTablet",
43132
+ type: "select",
43133
+ label: "Images per view (tablet)",
43134
+ description: "Number of images visible on medium screens.",
43135
+ options: [
43136
+ {
43137
+ value: "",
43138
+ label: "Same as mobile"
43139
+ },
43140
+ {
43141
+ value: "1",
43142
+ label: "One at a time"
43143
+ },
43144
+ {
43145
+ value: "2",
43146
+ label: "Two at a time"
43147
+ },
43148
+ {
43149
+ value: "3",
43150
+ label: "Three at a time"
43151
+ }
43152
+ ],
43153
+ ui: {
43154
+ intent: "display",
43155
+ visibleWhen: {
43156
+ field: "variant",
43157
+ equals: "carousel"
43158
+ }
43159
+ }
43160
+ },
43161
+ {
43162
+ id: "slidesToShowDesktop",
43163
+ type: "select",
43164
+ label: "Images per view (desktop)",
43165
+ description: "Number of images visible on large screens.",
43166
+ options: [
43167
+ {
43168
+ value: "",
43169
+ label: "Same as tablet"
43170
+ },
43171
+ {
43172
+ value: "1",
43173
+ label: "One at a time"
43174
+ },
43175
+ {
43176
+ value: "2",
43177
+ label: "Two at a time"
43178
+ },
43179
+ {
43180
+ value: "3",
43181
+ label: "Three at a time"
43182
+ }
43183
+ ],
43184
+ ui: {
43185
+ intent: "display",
43186
+ visibleWhen: {
43187
+ field: "variant",
43188
+ equals: "carousel"
43189
+ }
43190
+ }
43191
+ },
43192
+ {
43193
+ id: "transition",
43194
+ type: "select",
43195
+ label: "Transition",
43196
+ description: "Animation style between slides.",
43197
+ defaultValue: "slide",
43198
+ options: [{
43199
+ value: "slide",
43200
+ label: "Slide"
43201
+ }, {
43202
+ value: "fade",
43203
+ label: "Fade"
43204
+ }],
43205
+ ui: {
43206
+ intent: "display",
43207
+ visibleWhen: {
43208
+ field: "variant",
43209
+ equals: "carousel"
43210
+ }
43211
+ }
43212
+ },
43213
+ {
43214
+ id: "showControls",
43215
+ type: "boolean",
43216
+ label: "Show arrows",
43217
+ defaultValue: true,
43218
+ ui: {
43219
+ intent: "behavior",
43220
+ visibleWhen: {
43221
+ field: "variant",
43222
+ equals: "carousel"
43223
+ }
43224
+ }
43225
+ },
43226
+ {
43227
+ id: "showDots",
43228
+ type: "boolean",
43229
+ label: "Show dots",
43230
+ defaultValue: false,
43231
+ ui: {
43232
+ intent: "behavior",
43233
+ visibleWhen: {
43234
+ field: "variant",
43235
+ equals: "carousel"
43236
+ }
43237
+ }
43238
+ },
43239
+ {
43240
+ id: "autoplay",
43241
+ type: "boolean",
43242
+ label: "Autoplay",
43243
+ defaultValue: false,
43244
+ ui: {
43245
+ intent: "behavior",
43246
+ visibleWhen: {
43247
+ field: "variant",
43248
+ equals: "carousel"
43249
+ }
43250
+ }
43251
+ },
43252
+ {
43253
+ id: "autoplayDelay",
43254
+ type: "select",
43255
+ label: "Autoplay delay",
43256
+ defaultValue: "5000",
43257
+ options: [
43258
+ {
43259
+ value: "3000",
43260
+ label: "3 seconds"
43261
+ },
43262
+ {
43263
+ value: "5000",
43264
+ label: "5 seconds"
43265
+ },
43266
+ {
43267
+ value: "7000",
43268
+ label: "7 seconds"
43269
+ },
43270
+ {
43271
+ value: "10000",
43272
+ label: "10 seconds"
43273
+ }
43274
+ ],
43275
+ ui: {
43276
+ intent: "behavior",
43277
+ visibleWhen: {
43278
+ field: "variant",
43279
+ equals: "carousel"
43280
+ }
43281
+ }
43282
+ },
43283
+ {
43284
+ id: "arrowVisibility",
43285
+ type: "select",
43286
+ label: "Arrow visibility",
43287
+ defaultValue: "always",
43288
+ options: [{
43289
+ value: "always",
43290
+ label: "Always visible"
43291
+ }, {
43292
+ value: "hover",
43293
+ label: "Show on hover"
43294
+ }],
43295
+ ui: {
43296
+ intent: "behavior",
43297
+ visibleWhen: {
43298
+ field: "variant",
43299
+ equals: "carousel"
43300
+ }
43301
+ }
43302
+ },
43303
+ {
43304
+ id: "loop",
43305
+ type: "boolean",
43306
+ label: "Loop slides",
43307
+ defaultValue: true,
43308
+ ui: {
43309
+ intent: "behavior",
43310
+ visibleWhen: {
43311
+ field: "variant",
43312
+ equals: "carousel"
43313
+ }
43314
+ }
43315
+ },
43316
+ {
43317
+ id: "marqueeDirection",
43318
+ type: "select",
43319
+ label: "Scroll direction",
43320
+ options: [{
43321
+ value: "left",
43322
+ label: "Left"
43323
+ }, {
43324
+ value: "right",
43325
+ label: "Right"
43326
+ }],
43327
+ defaultValue: "left",
43328
+ ui: {
43329
+ intent: "display",
43330
+ visibleWhen: {
43331
+ field: "variant",
43332
+ equals: "marquee"
43333
+ }
43334
+ }
43335
+ },
43336
+ {
43337
+ id: "marqueeSpeed",
43338
+ type: "select",
43339
+ label: "Scroll speed",
43340
+ options: [
43341
+ {
43342
+ value: "slow",
43343
+ label: "Slow (60s)"
43344
+ },
43345
+ {
43346
+ value: "medium",
43347
+ label: "Medium (40s)"
43348
+ },
43349
+ {
43350
+ value: "fast",
43351
+ label: "Fast (20s)"
43352
+ }
43353
+ ],
43354
+ defaultValue: "medium",
43355
+ ui: {
43356
+ intent: "display",
43357
+ visibleWhen: {
43358
+ field: "variant",
43359
+ equals: "marquee"
43360
+ }
43361
+ }
43362
+ },
43363
+ {
43364
+ id: "marqueePauseOnHover",
43365
+ type: "boolean",
43366
+ label: "Pause on hover",
43367
+ defaultValue: true,
43368
+ ui: {
43369
+ intent: "behavior",
43370
+ visibleWhen: {
43371
+ field: "variant",
43372
+ equals: "marquee"
43373
+ }
43374
+ }
43375
+ },
43376
+ {
43377
+ id: "marqueeImageSize",
43378
+ type: "select",
43379
+ label: "Image size",
43380
+ options: [
43381
+ {
43382
+ value: "sm",
43383
+ label: "Small (200px)"
43384
+ },
43385
+ {
43386
+ value: "md",
43387
+ label: "Medium (256px)"
43388
+ },
43389
+ {
43390
+ value: "lg",
43391
+ label: "Large (320px)"
43392
+ },
43393
+ {
43394
+ value: "xl",
43395
+ label: "Extra large (400px)"
43396
+ }
43397
+ ],
43398
+ defaultValue: "md",
43399
+ ui: {
43400
+ intent: "display",
43401
+ visibleWhen: {
43402
+ field: "variant",
43403
+ equals: "marquee"
43404
+ }
43405
+ }
43406
+ },
43407
+ {
43408
+ id: "imageFilter",
43409
+ type: "select",
43410
+ label: "Image filter",
43411
+ options: [
43412
+ {
43413
+ value: "none",
43414
+ label: "None"
43415
+ },
43416
+ {
43417
+ value: "grayscale",
43418
+ label: "Grayscale"
43419
+ },
43420
+ {
43421
+ value: "grayscale-hover-reveal",
43422
+ label: "Grayscale (color on hover)"
43423
+ },
43424
+ {
43425
+ value: "sepia",
43426
+ label: "Sepia"
43427
+ }
43428
+ ],
43429
+ defaultValue: "grayscale-hover-reveal",
43430
+ ui: { intent: "style" }
43431
+ },
43432
+ {
43433
+ id: "imageBorder",
43434
+ type: "group",
43435
+ label: "Image border",
43436
+ schema: { fields: [
43437
+ {
43438
+ id: "enabled",
43439
+ type: "boolean",
43440
+ label: "Show border",
43441
+ defaultValue: true
43442
+ },
43443
+ {
43444
+ id: "colorToken",
43445
+ type: "text",
43446
+ label: "Border color",
43447
+ defaultValue: "accent",
43448
+ ui: { widget: "backgroundColor" }
43449
+ },
43450
+ {
43451
+ id: "opacity",
43452
+ type: "number",
43453
+ label: "Border opacity",
43454
+ defaultValue: 30,
43455
+ ui: {
43456
+ min: 0,
43457
+ max: 100
43458
+ }
43459
+ },
43460
+ {
43461
+ id: "width",
43462
+ type: "select",
43463
+ label: "Border width",
43464
+ options: [
43465
+ {
43466
+ value: "1",
43467
+ label: "Thin (1px)"
43468
+ },
43469
+ {
43470
+ value: "2",
43471
+ label: "Medium (2px)"
43472
+ },
43473
+ {
43474
+ value: "3",
43475
+ label: "Thick (3px)"
43476
+ }
43477
+ ],
43478
+ defaultValue: "2"
43479
+ }
43480
+ ] },
43481
+ ui: { intent: "style" }
43482
+ },
43483
+ {
43484
+ id: "imageCorners",
43485
+ type: "select",
43486
+ label: "Image corners",
43487
+ options: [
43488
+ {
43489
+ value: "none",
43490
+ label: "Square"
43491
+ },
43492
+ {
43493
+ value: "sm",
43494
+ label: "Slightly rounded"
43495
+ },
43496
+ {
43497
+ value: "md",
43498
+ label: "Rounded"
43499
+ },
43500
+ {
43501
+ value: "lg",
43502
+ label: "More rounded"
43503
+ },
43504
+ {
43505
+ value: "xl",
43506
+ label: "Very rounded"
43507
+ },
43508
+ {
43509
+ value: "2xl",
43510
+ label: "Extra rounded"
43511
+ },
43512
+ {
43513
+ value: "3xl",
43514
+ label: "Maximum rounded"
43515
+ }
43516
+ ],
43517
+ defaultValue: "3xl",
43518
+ ui: { intent: "style" }
43519
+ }
43520
+ ]);
43521
+ //#endregion
42255
43522
  //#region ../blocks/src/system/blocks/image-gallery.ts
42256
43523
  const grid$1 = (props, children, ...mods) => el("grid", props ?? void 0, children ?? void 0, ...mods);
42257
43524
  const galleryContainer = (children, opts) => {
@@ -42466,7 +43733,11 @@ const emptyState$1 = {
42466
43733
  }
42467
43734
  };
42468
43735
  const wrapVariant$1 = (layout, opts) => styledSection({
42469
- children: galleryContainer([layout, emptyState$1], {
43736
+ children: galleryContainer([
43737
+ ...sectionHeaderLayoutNodes(),
43738
+ layout,
43739
+ emptyState$1
43740
+ ], {
42470
43741
  gap: "md",
42471
43742
  fullWidth: opts?.fullWidth,
42472
43743
  className: opts?.className
@@ -42475,6 +43746,28 @@ const wrapVariant$1 = (layout, opts) => styledSection({
42475
43746
  spacing: "medium",
42476
43747
  background: "background"
42477
43748
  });
43749
+ 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({
43750
+ as: "figcaption",
43751
+ ...lookSlot("caption")
43752
+ }, bind(captionFrom), when(captionFrom))])], ...mods);
43753
+ const tilesLayout = styledSection({
43754
+ children: el("div", {
43755
+ className: "rb-container",
43756
+ ...lookSlot("layout")
43757
+ }, [...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) => ({
43758
+ ...node,
43759
+ $when: {
43760
+ when: {
43761
+ from: "content.images",
43762
+ transforms: [{ id: "array.length" }]
43763
+ },
43764
+ equals: 0
43765
+ }
43766
+ }))])]),
43767
+ baseClass: "",
43768
+ spacing: "medium",
43769
+ background: "background"
43770
+ });
42478
43771
  const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42479
43772
  id: "block.image-gallery",
42480
43773
  title: "Image Gallery",
@@ -42487,510 +43780,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42487
43780
  "marqueeSpeed",
42488
43781
  "marqueePauseOnHover"
42489
43782
  ] },
42490
- additionalFields: parseFieldDefinitions([
42491
- {
42492
- id: "images",
42493
- type: "repeater",
42494
- label: "Images",
42495
- itemLabel: "Image",
42496
- minItems: 0,
42497
- maxItems: 24,
42498
- ui: {
42499
- repeaterPreset: "thumbnailGrid",
42500
- thumbnailField: "image",
42501
- thumbnailAltField: "caption",
42502
- thumbnailLabelField: "caption",
42503
- thumbnailCardDensity: "compact"
42504
- },
42505
- schema: { fields: [{
42506
- id: "image",
42507
- type: "media",
42508
- label: "Image",
42509
- required: true,
42510
- mediaKinds: ["image"]
42511
- }, {
42512
- id: "caption",
42513
- type: "text",
42514
- label: "Caption",
42515
- description: "Optional caption displayed below the image and used as the editor card label",
42516
- maxLength: 200
42517
- }] }
42518
- },
42519
- {
42520
- id: "fullBleed",
42521
- type: "boolean",
42522
- label: "Full bleed",
42523
- description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
42524
- defaultValue: false,
42525
- ui: {
42526
- intent: "display",
42527
- visibleWhen: {
42528
- field: "variant",
42529
- notIn: ["marquee"]
42530
- }
42531
- }
42532
- },
42533
- {
42534
- id: "aspectRatio",
42535
- type: "select",
42536
- label: "Aspect ratio",
42537
- description: "Crop images to a consistent aspect ratio.",
42538
- defaultValue: "1/1",
42539
- options: [
42540
- {
42541
- value: "auto",
42542
- label: "Original"
42543
- },
42544
- {
42545
- value: "1/1",
42546
- label: "1:1 (Square)"
42547
- },
42548
- {
42549
- value: "4/3",
42550
- label: "4:3 (Standard)"
42551
- },
42552
- {
42553
- value: "16/9",
42554
- label: "16:9 (Widescreen)"
42555
- },
42556
- {
42557
- value: "3/2",
42558
- label: "3:2 (Classic)"
42559
- },
42560
- {
42561
- value: "3/4",
42562
- label: "3:4 (Portrait)"
42563
- }
42564
- ],
42565
- ui: {
42566
- intent: "display",
42567
- visibleWhen: {
42568
- field: "variant",
42569
- notIn: ["masonry", "marquee"]
42570
- }
42571
- }
42572
- },
42573
- {
42574
- id: "slidesToShow",
42575
- type: "select",
42576
- label: "Images per view (mobile)",
42577
- description: "Number of images visible at once on small screens.",
42578
- defaultValue: "1",
42579
- options: [
42580
- {
42581
- value: "1",
42582
- label: "One at a time"
42583
- },
42584
- {
42585
- value: "2",
42586
- label: "Two at a time"
42587
- },
42588
- {
42589
- value: "3",
42590
- label: "Three at a time"
42591
- }
42592
- ],
42593
- ui: {
42594
- intent: "display",
42595
- visibleWhen: {
42596
- field: "variant",
42597
- equals: "carousel"
42598
- }
42599
- }
42600
- },
42601
- {
42602
- id: "slidesToShowTablet",
42603
- type: "select",
42604
- label: "Images per view (tablet)",
42605
- description: "Number of images visible on medium screens.",
42606
- options: [
42607
- {
42608
- value: "",
42609
- label: "Same as mobile"
42610
- },
42611
- {
42612
- value: "1",
42613
- label: "One at a time"
42614
- },
42615
- {
42616
- value: "2",
42617
- label: "Two at a time"
42618
- },
42619
- {
42620
- value: "3",
42621
- label: "Three at a time"
42622
- }
42623
- ],
42624
- ui: {
42625
- intent: "display",
42626
- visibleWhen: {
42627
- field: "variant",
42628
- equals: "carousel"
42629
- }
42630
- }
42631
- },
42632
- {
42633
- id: "slidesToShowDesktop",
42634
- type: "select",
42635
- label: "Images per view (desktop)",
42636
- description: "Number of images visible on large screens.",
42637
- options: [
42638
- {
42639
- value: "",
42640
- label: "Same as tablet"
42641
- },
42642
- {
42643
- value: "1",
42644
- label: "One at a time"
42645
- },
42646
- {
42647
- value: "2",
42648
- label: "Two at a time"
42649
- },
42650
- {
42651
- value: "3",
42652
- label: "Three at a time"
42653
- }
42654
- ],
42655
- ui: {
42656
- intent: "display",
42657
- visibleWhen: {
42658
- field: "variant",
42659
- equals: "carousel"
42660
- }
42661
- }
42662
- },
42663
- {
42664
- id: "transition",
42665
- type: "select",
42666
- label: "Transition",
42667
- description: "Animation style between slides.",
42668
- defaultValue: "slide",
42669
- options: [{
42670
- value: "slide",
42671
- label: "Slide"
42672
- }, {
42673
- value: "fade",
42674
- label: "Fade"
42675
- }],
42676
- ui: {
42677
- intent: "display",
42678
- visibleWhen: {
42679
- field: "variant",
42680
- equals: "carousel"
42681
- }
42682
- }
42683
- },
42684
- {
42685
- id: "showControls",
42686
- type: "boolean",
42687
- label: "Show arrows",
42688
- defaultValue: true,
42689
- ui: {
42690
- intent: "behavior",
42691
- visibleWhen: {
42692
- field: "variant",
42693
- equals: "carousel"
42694
- }
42695
- }
42696
- },
42697
- {
42698
- id: "showDots",
42699
- type: "boolean",
42700
- label: "Show dots",
42701
- defaultValue: false,
42702
- ui: {
42703
- intent: "behavior",
42704
- visibleWhen: {
42705
- field: "variant",
42706
- equals: "carousel"
42707
- }
42708
- }
42709
- },
42710
- {
42711
- id: "autoplay",
42712
- type: "boolean",
42713
- label: "Autoplay",
42714
- defaultValue: false,
42715
- ui: {
42716
- intent: "behavior",
42717
- visibleWhen: {
42718
- field: "variant",
42719
- equals: "carousel"
42720
- }
42721
- }
42722
- },
42723
- {
42724
- id: "autoplayDelay",
42725
- type: "select",
42726
- label: "Autoplay delay",
42727
- defaultValue: "5000",
42728
- options: [
42729
- {
42730
- value: "3000",
42731
- label: "3 seconds"
42732
- },
42733
- {
42734
- value: "5000",
42735
- label: "5 seconds"
42736
- },
42737
- {
42738
- value: "7000",
42739
- label: "7 seconds"
42740
- },
42741
- {
42742
- value: "10000",
42743
- label: "10 seconds"
42744
- }
42745
- ],
42746
- ui: {
42747
- intent: "behavior",
42748
- visibleWhen: {
42749
- field: "variant",
42750
- equals: "carousel"
42751
- }
42752
- }
42753
- },
42754
- {
42755
- id: "arrowVisibility",
42756
- type: "select",
42757
- label: "Arrow visibility",
42758
- defaultValue: "always",
42759
- options: [{
42760
- value: "always",
42761
- label: "Always visible"
42762
- }, {
42763
- value: "hover",
42764
- label: "Show on hover"
42765
- }],
42766
- ui: {
42767
- intent: "behavior",
42768
- visibleWhen: {
42769
- field: "variant",
42770
- equals: "carousel"
42771
- }
42772
- }
42773
- },
42774
- {
42775
- id: "loop",
42776
- type: "boolean",
42777
- label: "Loop slides",
42778
- defaultValue: true,
42779
- ui: {
42780
- intent: "behavior",
42781
- visibleWhen: {
42782
- field: "variant",
42783
- equals: "carousel"
42784
- }
42785
- }
42786
- },
42787
- {
42788
- id: "marqueeDirection",
42789
- type: "select",
42790
- label: "Scroll direction",
42791
- options: [{
42792
- value: "left",
42793
- label: "Left"
42794
- }, {
42795
- value: "right",
42796
- label: "Right"
42797
- }],
42798
- defaultValue: "left",
42799
- ui: {
42800
- intent: "display",
42801
- visibleWhen: {
42802
- field: "variant",
42803
- equals: "marquee"
42804
- }
42805
- }
42806
- },
42807
- {
42808
- id: "marqueeSpeed",
42809
- type: "select",
42810
- label: "Scroll speed",
42811
- options: [
42812
- {
42813
- value: "slow",
42814
- label: "Slow (60s)"
42815
- },
42816
- {
42817
- value: "medium",
42818
- label: "Medium (40s)"
42819
- },
42820
- {
42821
- value: "fast",
42822
- label: "Fast (20s)"
42823
- }
42824
- ],
42825
- defaultValue: "medium",
42826
- ui: {
42827
- intent: "display",
42828
- visibleWhen: {
42829
- field: "variant",
42830
- equals: "marquee"
42831
- }
42832
- }
42833
- },
42834
- {
42835
- id: "marqueePauseOnHover",
42836
- type: "boolean",
42837
- label: "Pause on hover",
42838
- defaultValue: true,
42839
- ui: {
42840
- intent: "behavior",
42841
- visibleWhen: {
42842
- field: "variant",
42843
- equals: "marquee"
42844
- }
42845
- }
42846
- },
42847
- {
42848
- id: "marqueeImageSize",
42849
- type: "select",
42850
- label: "Image size",
42851
- options: [
42852
- {
42853
- value: "sm",
42854
- label: "Small (200px)"
42855
- },
42856
- {
42857
- value: "md",
42858
- label: "Medium (256px)"
42859
- },
42860
- {
42861
- value: "lg",
42862
- label: "Large (320px)"
42863
- },
42864
- {
42865
- value: "xl",
42866
- label: "Extra large (400px)"
42867
- }
42868
- ],
42869
- defaultValue: "md",
42870
- ui: {
42871
- intent: "display",
42872
- visibleWhen: {
42873
- field: "variant",
42874
- equals: "marquee"
42875
- }
42876
- }
42877
- },
42878
- {
42879
- id: "imageFilter",
42880
- type: "select",
42881
- label: "Image filter",
42882
- options: [
42883
- {
42884
- value: "none",
42885
- label: "None"
42886
- },
42887
- {
42888
- value: "grayscale",
42889
- label: "Grayscale"
42890
- },
42891
- {
42892
- value: "grayscale-hover-reveal",
42893
- label: "Grayscale (color on hover)"
42894
- },
42895
- {
42896
- value: "sepia",
42897
- label: "Sepia"
42898
- }
42899
- ],
42900
- defaultValue: "grayscale-hover-reveal",
42901
- ui: { intent: "style" }
42902
- },
42903
- {
42904
- id: "imageBorder",
42905
- type: "group",
42906
- label: "Image border",
42907
- schema: { fields: [
42908
- {
42909
- id: "enabled",
42910
- type: "boolean",
42911
- label: "Show border",
42912
- defaultValue: true
42913
- },
42914
- {
42915
- id: "colorToken",
42916
- type: "text",
42917
- label: "Border color",
42918
- defaultValue: "accent",
42919
- ui: { widget: "backgroundColor" }
42920
- },
42921
- {
42922
- id: "opacity",
42923
- type: "number",
42924
- label: "Border opacity",
42925
- defaultValue: 30,
42926
- ui: {
42927
- min: 0,
42928
- max: 100
42929
- }
42930
- },
42931
- {
42932
- id: "width",
42933
- type: "select",
42934
- label: "Border width",
42935
- options: [
42936
- {
42937
- value: "1",
42938
- label: "Thin (1px)"
42939
- },
42940
- {
42941
- value: "2",
42942
- label: "Medium (2px)"
42943
- },
42944
- {
42945
- value: "3",
42946
- label: "Thick (3px)"
42947
- }
42948
- ],
42949
- defaultValue: "2"
42950
- }
42951
- ] },
42952
- ui: { intent: "style" }
42953
- },
42954
- {
42955
- id: "imageCorners",
42956
- type: "select",
42957
- label: "Image corners",
42958
- options: [
42959
- {
42960
- value: "none",
42961
- label: "Square"
42962
- },
42963
- {
42964
- value: "sm",
42965
- label: "Slightly rounded"
42966
- },
42967
- {
42968
- value: "md",
42969
- label: "Rounded"
42970
- },
42971
- {
42972
- value: "lg",
42973
- label: "More rounded"
42974
- },
42975
- {
42976
- value: "xl",
42977
- label: "Very rounded"
42978
- },
42979
- {
42980
- value: "2xl",
42981
- label: "Extra rounded"
42982
- },
42983
- {
42984
- value: "3xl",
42985
- label: "Maximum rounded"
42986
- }
42987
- ],
42988
- defaultValue: "3xl",
42989
- ui: { intent: "style" }
42990
- }
42991
- ]),
43783
+ additionalFields: imageGalleryFields,
42992
43784
  layout: wrapVariant$1(gridLayout),
42993
43785
  variants: {
43786
+ tiles: tilesLayout,
42994
43787
  grid: wrapVariant$1(gridLayout),
42995
43788
  carousel: wrapVariant$1(carouselLayout),
42996
43789
  masonry: wrapVariant$1(masonryLayout),
@@ -42999,7 +43792,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42999
43792
  className: "rb-image-gallery-marquee-container"
43000
43793
  })
43001
43794
  },
43002
- variantMeaning: { kind: "arrangement" },
43795
+ variantMeaning: {
43796
+ kind: "arrangement",
43797
+ lookOnlyKeys: ["tiles"]
43798
+ },
43003
43799
  defaultVariant: "grid",
43004
43800
  variantOptions: {
43005
43801
  grid: {
@@ -45219,76 +46015,74 @@ const giftingBlockDefinition = {
45219
46015
  /**
45220
46016
  * Get form fields based on preset configuration.
45221
46017
  */
45222
- function getGlobalFormFields(form) {
45223
- const includePhone = form.includeOptionalPhone;
45224
- switch (form.fields.preset) {
45225
- case "emailOnly": return withOptionalPhone([{
45226
- id: "email",
45227
- type: "email",
45228
- label: "Email",
45229
- required: true,
45230
- placeholder: "your@email.com"
45231
- }], includePhone);
45232
- case "emailName": return withOptionalPhone([{
45233
- id: "email",
45234
- type: "email",
45235
- label: "Email",
45236
- required: true,
45237
- placeholder: "your@email.com"
45238
- }, {
46018
+ function getGlobalFormFields(form, presentation = {}) {
46019
+ const fields = withOptionalPhone(newsletterPresetFields(form.fields), form.includeOptionalPhone);
46020
+ return presentation.lookSlots ? fields.map((field) => ({
46021
+ ...field,
46022
+ label: lookFieldLabel(field)
46023
+ })) : fields;
46024
+ }
46025
+ function lookFieldLabel(field) {
46026
+ switch (field.id) {
46027
+ case "firstName": return "First name";
46028
+ case "lastName": return "Last name";
46029
+ default: return field.label;
46030
+ }
46031
+ }
46032
+ const emailField = {
46033
+ id: "email",
46034
+ type: "email",
46035
+ label: "Email",
46036
+ required: true,
46037
+ placeholder: "your@email.com"
46038
+ };
46039
+ const firstNameField = (required) => ({
46040
+ id: "firstName",
46041
+ type: "text",
46042
+ label: "First Name",
46043
+ required,
46044
+ placeholder: "First name"
46045
+ });
46046
+ function newsletterPresetFields(fields) {
46047
+ switch (fields.preset) {
46048
+ case "emailOnly": return [emailField];
46049
+ case "emailName": return [emailField, {
45239
46050
  id: "name",
45240
46051
  type: "text",
45241
46052
  label: "Name",
45242
- required: form.fields.name === "required",
46053
+ required: fields.name === "required",
45243
46054
  placeholder: "Your name"
45244
- }], includePhone);
45245
- case "emailFirstLast": return withOptionalPhone([
45246
- {
45247
- id: "email",
45248
- type: "email",
45249
- label: "Email",
45250
- required: true,
45251
- placeholder: "your@email.com"
45252
- },
45253
- {
45254
- id: "firstName",
45255
- type: "text",
45256
- label: "First Name",
45257
- required: form.fields.firstName === "required",
45258
- placeholder: "First name"
45259
- },
46055
+ }];
46056
+ case "emailFirstName": return [emailField, firstNameField(fields.firstName === "required")];
46057
+ case "emailFirstLast": return [
46058
+ emailField,
46059
+ firstNameField(fields.firstName === "required"),
45260
46060
  {
45261
46061
  id: "lastName",
45262
46062
  type: "text",
45263
46063
  label: "Last Name",
45264
- required: form.fields.lastName === "required",
46064
+ required: fields.lastName === "required",
45265
46065
  placeholder: "Last name"
45266
46066
  }
45267
- ], includePhone);
45268
- case "emailNameCompany": return withOptionalPhone([
45269
- {
45270
- id: "email",
45271
- type: "email",
45272
- label: "Email",
45273
- required: true,
45274
- placeholder: "your@email.com"
45275
- },
46067
+ ];
46068
+ case "emailNameCompany": return [
46069
+ emailField,
45276
46070
  {
45277
46071
  id: "name",
45278
46072
  type: "text",
45279
46073
  label: "Name",
45280
- required: form.fields.name === "required",
46074
+ required: fields.name === "required",
45281
46075
  placeholder: "Your name"
45282
46076
  },
45283
46077
  {
45284
46078
  id: "company",
45285
46079
  type: "text",
45286
46080
  label: "Company",
45287
- required: form.fields.company === "required",
46081
+ required: fields.company === "required",
45288
46082
  placeholder: "Company name"
45289
46083
  }
45290
- ], includePhone);
45291
- default: throw new Error("Unknown newsletter preset");
46084
+ ];
46085
+ default: return assertNever$3(fields);
45292
46086
  }
45293
46087
  }
45294
46088
  function withOptionalPhone(fields, includePhone) {
@@ -45350,6 +46144,7 @@ const mailingListSignupBlockSourceRefSchema = z.object({
45350
46144
  });
45351
46145
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
45352
46146
  const newsletterSourceCommonSchema = z.object({
46147
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
45353
46148
  siteId: z.string().optional(),
45354
46149
  apiBaseUrl: z.string().optional(),
45355
46150
  mailingList: mailingListContextSchema.optional(),
@@ -45382,6 +46177,7 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
45382
46177
  newsletterSourceCommonSchema.extend({ source: z.literal("preview") })
45383
46178
  ]);
45384
46179
  const newsletterDisplaySchema = z.object({
46180
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
45385
46181
  kind: z.literal("newsletter-form"),
45386
46182
  availability: z.enum(["ready", "unavailable"]),
45387
46183
  className: z.string().nullable(),
@@ -45448,13 +46244,14 @@ function buildNewsletterDisplay(source) {
45448
46244
  const choices = resolveRuntimeChoices(assessment);
45449
46245
  return {
45450
46246
  kind: "newsletter-form",
46247
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
45451
46248
  availability: assessment.tag === "available" ? "ready" : "unavailable",
45452
46249
  className: source.className ?? null,
45453
46250
  buttonLabel: form.buttonLabel,
45454
46251
  successMessage: form.successMessage,
45455
46252
  buttonVariant: source.buttonVariant ?? "primary",
45456
46253
  privacyNote: form.privacyNote,
45457
- fields: getGlobalFormFields(form),
46254
+ fields: getGlobalFormFields(form, source),
45458
46255
  choices
45459
46256
  };
45460
46257
  }
@@ -45526,32 +46323,50 @@ function parseRequiredMailingListSignedSourceToken(value) {
45526
46323
  //#region ../blocks/src/system/blocks/newsletter-signup.ts
45527
46324
  const stackedComposition = composeFragments([{ fragment: newsletterCopyFragment }, { fragment: newsletterFormFragment }]);
45528
46325
  const stackedLayout = styledSection({
45529
- children: sectionContainer(stackedComposition.layout, {
46326
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
45530
46327
  gap: "md",
45531
46328
  className: "rb-text-center newsletter-stacked"
45532
- }),
46329
+ })),
45533
46330
  baseClass: "",
45534
46331
  spacing: "medium",
45535
46332
  background: "surface"
45536
46333
  });
45537
46334
  const inlineLayout = styledSection({
45538
- children: sectionContainer(stackedComposition.layout, {
46335
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
45539
46336
  gap: "md",
45540
46337
  className: "newsletter-inline"
45541
- }),
46338
+ })),
45542
46339
  baseClass: "",
45543
46340
  spacing: "medium",
45544
46341
  background: "surface"
45545
46342
  });
45546
46343
  const editorialSplitLayout = styledSection({
45547
- children: sectionContainer([el("div", { className: "newsletter-editorial-split-copy" }, newsletterCopyFragment.layout), el("div", { className: "newsletter-editorial-split-form" }, newsletterFormFragment.layout)], {
46344
+ children: props(lookSlot("layout"))(sectionContainer([el("div", {
46345
+ className: "newsletter-editorial-split-copy",
46346
+ ...lookSlot("head")
46347
+ }, newsletterCopyFragment.layout), el("div", {
46348
+ className: "newsletter-editorial-split-form",
46349
+ ...lookSlot("panel")
46350
+ }, newsletterFormFragment.layout)], {
45548
46351
  gap: "lg",
45549
46352
  className: "newsletter-editorial-split"
45550
- }),
46353
+ })),
45551
46354
  baseClass: "",
45552
46355
  spacing: "comfortable",
45553
46356
  background: "surface"
45554
46357
  });
46358
+ const archLayout = styledSection({
46359
+ children: el("div", {
46360
+ className: "rb-container",
46361
+ ...lookSlot("layout")
46362
+ }, [el("div", lookSlot("frame"), [el("div", {
46363
+ className: "rb-grid",
46364
+ ...lookSlot("head")
46365
+ }, newsletterCopyFragment.layout), ...newsletterFormFragment.layout])]),
46366
+ baseClass: "",
46367
+ spacing: "medium",
46368
+ background: "surface"
46369
+ });
45555
46370
  const newsletterSignupManifest = createBlockManifest({
45556
46371
  id: "block.newsletter-signup",
45557
46372
  title: "Newsletter Signup",
@@ -45566,13 +46381,26 @@ const newsletterSignupManifest = createBlockManifest({
45566
46381
  fragment: newsletterFormFragment,
45567
46382
  fieldPriority: 1
45568
46383
  }],
46384
+ additionalFields: [{
46385
+ id: "archFrame",
46386
+ type: "boolean",
46387
+ label: "Arch frame",
46388
+ ui: {
46389
+ intent: "display",
46390
+ hidden: true
46391
+ }
46392
+ }],
45569
46393
  layout: stackedLayout,
45570
46394
  variants: {
46395
+ arch: archLayout,
45571
46396
  stacked: stackedLayout,
45572
46397
  inline: inlineLayout,
45573
46398
  "editorial-split": editorialSplitLayout
45574
46399
  },
45575
- variantMeaning: { kind: "arrangement" },
46400
+ variantMeaning: {
46401
+ kind: "arrangement",
46402
+ lookOnlyKeys: ["arch"]
46403
+ },
45576
46404
  defaultVariant: "stacked",
45577
46405
  variantOptions: {
45578
46406
  stacked: {
@@ -46659,7 +47487,7 @@ const systemBlockDefinitions = [
46659
47487
  })
46660
47488
  ]
46661
47489
  })),
46662
- withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47490
+ withDesignCapability("block.body-text", bodyTextBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
46663
47491
  flow: bodyFlow,
46664
47492
  layoutProfiles: [
46665
47493
  layoutProfile({
@@ -47034,7 +47862,7 @@ const systemBlockDefinitions = [
47034
47862
  weight: "quiet"
47035
47863
  })]
47036
47864
  })),
47037
- withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47865
+ withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
47038
47866
  flow: mediaFlow,
47039
47867
  layoutProfiles: [
47040
47868
  layoutProfile({
@@ -47123,7 +47951,7 @@ const systemBlockDefinitions = [
47123
47951
  weight: "standard"
47124
47952
  })]
47125
47953
  })),
47126
- withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47954
+ withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
47127
47955
  flow: conversionFlow,
47128
47956
  layoutProfiles: [
47129
47957
  layoutProfile({
@@ -47902,7 +48730,14 @@ const systemCustomizeFacetDefinitions = [
47902
48730
  }
47903
48731
  ], "3", true),
47904
48732
  fixedKnob("block.testimonials", "tilt", "Tilt the small cards", onOff, "true", false, true),
47905
- fixedKnob("block.testimonials", "archFrame", "Arch frame", onOff, "true", false, true),
48733
+ {
48734
+ ...fixedKnob("block.testimonials", "archFrame", "Arch frame", onOff, "true", false, true),
48735
+ blockKinds: [
48736
+ "block.testimonials",
48737
+ "block.newsletter-signup",
48738
+ "block.form"
48739
+ ]
48740
+ },
47906
48741
  fixedKnob("block.hero", "candleGlow", "Candle glow", onOff, "true", false, true),
47907
48742
  fixedKnob("block.hero", "columnGuides", "Column guides", onOff, "true", false, true),
47908
48743
  fixedKnob("block.hero", "titleSize", "Headline size", [
@@ -47926,6 +48761,15 @@ const systemCustomizeFacetDefinitions = [
47926
48761
  value: "right",
47927
48762
  label: "Right"
47928
48763
  }], "right"),
48764
+ fixedKnob("block.media-text", "imagePosition", "Photo side", [{
48765
+ value: "left",
48766
+ label: "Left"
48767
+ }, {
48768
+ value: "right",
48769
+ label: "Right"
48770
+ }], "left"),
48771
+ fixedKnob("block.media-text", "imageShape", "Media shape", standardImageShapeOptions, "default"),
48772
+ fixedKnob("block.media-text", "aspectRatio", "Media aspect ratio", standardAspectRatioOptions, "auto"),
47929
48773
  textKnob("stickerLine", "Sticker line", 32),
47930
48774
  textKnob("smallCaption", "Small caption", 24),
47931
48775
  {
@@ -48114,10 +48958,7 @@ function arrangementPhotoContent(content, knobs) {
48114
48958
  }) };
48115
48959
  }
48116
48960
  function arrangementContentFacts(content) {
48117
- const section = isObjectRecord$1(content._sectionStyles) ? content._sectionStyles : {};
48118
- const background = isObjectRecord$1(section.background) ? section.background : {};
48119
- const itemPhotos = Array.isArray(content.cards) ? content.cards.filter((card) => isObjectRecord$1(card) && isObjectRecord$1(card.media)).length : 0;
48120
- const photoCount = Array.isArray(content.cards) ? itemPhotos : isObjectRecord$1(background.image) ? 1 : 0;
48961
+ const photoCount = arrangementPhotoCount(content);
48121
48962
  return {
48122
48963
  photoCount,
48123
48964
  facts: {
@@ -48128,6 +48969,13 @@ function arrangementContentFacts(content) {
48128
48969
  }
48129
48970
  };
48130
48971
  }
48972
+ /** The content stage owns media presence for every arrangement consumer. */
48973
+ function arrangementPhotoCount(content) {
48974
+ if (Array.isArray(content.cards)) return content.cards.filter((card) => isObjectRecord$1(card) && isObjectRecord$1(card.media)).length;
48975
+ if (Array.isArray(content.images)) return content.images.filter((item) => isObjectRecord$1(item) && isObjectRecord$1(item.image)).length;
48976
+ const section = isObjectRecord$1(content._sectionStyles) ? content._sectionStyles : {};
48977
+ return isObjectRecord$1((isObjectRecord$1(section.background) ? section.background : {}).image) ? 1 : 0;
48978
+ }
48131
48979
  function effectiveContentKnobValue(blockKind, key, value) {
48132
48980
  const facet = systemCustomizeFacetDefinitionsForBlock(blockKind).find((entry) => entry.target.kind === "content-field" && entry.target.field === key);
48133
48981
  return facet?.target.kind === "content-field" && facet.target.boolean ? value === "true" : value;