@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
@@ -53,6 +53,19 @@ const footerModeSchema = z.enum([
53
53
  "default+blocks",
54
54
  "none"
55
55
  ]);
56
+ z.object({
57
+ variant: z.enum([
58
+ "simple",
59
+ "columns",
60
+ "split",
61
+ "centred"
62
+ ]),
63
+ showLogoText: z.boolean().optional(),
64
+ logo: z.object({
65
+ showLogo: z.boolean().optional(),
66
+ showLogoText: z.boolean().optional()
67
+ }).optional()
68
+ });
56
69
  //#endregion
57
70
  //#region ../api/src/defineEndpointDefinitions.ts
58
71
  /**
@@ -2126,6 +2139,25 @@ function validateBookingPaymentOptionKinds(kinds) {
2126
2139
  return ok(void 0);
2127
2140
  }
2128
2141
  //#endregion
2142
+ //#region ../core/src/date-time-formatter.ts
2143
+ /** Shared Intl engine, internal to core's date presentation owners. */
2144
+ const FORMATTER_CACHE_LIMIT = 100;
2145
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
2146
+ function getDateTimeFormatter(locale, timeZone, format) {
2147
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
2148
+ const cached = dateTimeFormatterCache.get(key);
2149
+ if (cached !== void 0) return cached;
2150
+ if (typeof locale !== "string" || Intl.DateTimeFormat.supportedLocalesOf([locale]).length === 0) throw new RangeError("An explicit supported locale is required");
2151
+ if (typeof timeZone !== "string" || timeZone.length === 0) throw new RangeError("An explicit time zone is required");
2152
+ const formatter = new Intl.DateTimeFormat(locale, {
2153
+ ...format,
2154
+ timeZone
2155
+ });
2156
+ if (dateTimeFormatterCache.size >= FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
2157
+ dateTimeFormatterCache.set(key, formatter);
2158
+ return formatter;
2159
+ }
2160
+ //#endregion
2129
2161
  //#region ../core/src/booking-time-zone.ts
2130
2162
  const TIME_ZONE_VALIDITY_CACHE_LIMIT = 100;
2131
2163
  const timeZoneValidityCache = /* @__PURE__ */ new Map();
@@ -2162,8 +2194,6 @@ const START_OF_DAY = {
2162
2194
  second: 0
2163
2195
  };
2164
2196
  const LOCAL_DATE_PATTERN = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
2165
- const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
2166
- const dateTimeFormatterCache = /* @__PURE__ */ new Map();
2167
2197
  function getSafeTimeZone(timeZone) {
2168
2198
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
2169
2199
  return normalized.length > 0 && isValidBookingTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
@@ -2180,19 +2210,7 @@ function formatParseError(error) {
2180
2210
  }
2181
2211
  }
2182
2212
  function formatToPartsLookup(date, locale, timeZone, format) {
2183
- return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
2184
- }
2185
- function getCachedDateTimeFormatter(locale, timeZone, format) {
2186
- const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
2187
- const cached = dateTimeFormatterCache.get(key);
2188
- if (cached !== void 0) return cached;
2189
- const formatter = new Intl.DateTimeFormat(locale, {
2190
- ...format,
2191
- timeZone
2192
- });
2193
- if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
2194
- dateTimeFormatterCache.set(key, formatter);
2195
- return formatter;
2213
+ return new Map(getDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
2196
2214
  }
2197
2215
  function getZonedDateTimeParts(date, timeZone) {
2198
2216
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -2280,7 +2298,7 @@ function toScheduledBookingDateTime(input) {
2280
2298
  function formatBookingInstant(isoString, options) {
2281
2299
  const date = new Date(isoString);
2282
2300
  if (Number.isNaN(date.getTime())) return isoString;
2283
- return getCachedDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
2301
+ return getDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
2284
2302
  }
2285
2303
  function formatBookingDate(input, format = {
2286
2304
  weekday: "long",
@@ -2405,6 +2423,17 @@ function localScheduleDateTimeToUtcDate(localDate, localTime, timeZone) {
2405
2423
  return new Date(guess);
2406
2424
  }
2407
2425
  //#endregion
2426
+ //#region ../core/src/date-display.ts
2427
+ /** Site-language policy, shared by customer emails and public event adapters. */
2428
+ function inferSiteDateLocale(siteTimeZone) {
2429
+ if (siteTimeZone === null || siteTimeZone === void 0 || siteTimeZone === "") return "en-US";
2430
+ if (siteTimeZone === "Europe/Dublin") return "en-IE";
2431
+ if (siteTimeZone.startsWith("Europe/")) return "en-GB";
2432
+ if (siteTimeZone.startsWith("Australia/")) return "en-AU";
2433
+ if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
2434
+ return "en-US";
2435
+ }
2436
+ //#endregion
2408
2437
  //#region ../core/src/location.ts
2409
2438
  function normalizeLocationAddressText(value) {
2410
2439
  if (typeof value !== "string") return null;
@@ -2554,6 +2583,10 @@ function parseGlobalFields(value) {
2554
2583
  preset: "emailName",
2555
2584
  name: value.name
2556
2585
  } : null;
2586
+ case "emailFirstName": return isRequirement(value.firstName) ? {
2587
+ preset: "emailFirstName",
2588
+ firstName: value.firstName
2589
+ } : null;
2557
2590
  case "emailFirstLast": return isRequirement(value.firstName) && isRequirement(value.lastName) ? {
2558
2591
  preset: "emailFirstLast",
2559
2592
  firstName: value.firstName,
@@ -4290,6 +4323,129 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
4290
4323
  tags: ["billing"],
4291
4324
  auth: "user",
4292
4325
  responseKind: "json"
4326
+ },
4327
+ stripeConnectSetupStart: {
4328
+ path: "/sites/{siteId}/billing/connect/setup",
4329
+ method: "POST",
4330
+ tags: ["site-{siteId}", "stripe-connect"],
4331
+ auth: "user",
4332
+ responseKind: "json",
4333
+ errors: [
4334
+ "validation:invalid_input",
4335
+ "auth:forbidden",
4336
+ "resource:conflict",
4337
+ "server:internal_error"
4338
+ ]
4339
+ },
4340
+ stripeConnectSetupDiscard: {
4341
+ path: "/sites/{siteId}/billing/connect/setup",
4342
+ method: "DELETE",
4343
+ tags: ["site-{siteId}", "stripe-connect"],
4344
+ auth: "user",
4345
+ responseKind: "json",
4346
+ errors: [
4347
+ "validation:invalid_input",
4348
+ "auth:forbidden",
4349
+ "resource:conflict",
4350
+ "server:internal_error"
4351
+ ]
4352
+ },
4353
+ stripeConnectSetupSave: {
4354
+ path: "/sites/{siteId}/billing/connect/setup/save",
4355
+ method: "POST",
4356
+ tags: ["site-{siteId}", "stripe-connect"],
4357
+ auth: "user",
4358
+ responseKind: "json",
4359
+ errors: [
4360
+ "validation:invalid_input",
4361
+ "auth:forbidden",
4362
+ "resource:conflict",
4363
+ "server:internal_error"
4364
+ ]
4365
+ },
4366
+ stripeConnectAccountSession: {
4367
+ path: "/sites/{siteId}/billing/connect/session",
4368
+ method: "POST",
4369
+ tags: ["site-{siteId}", "stripe-connect"],
4370
+ auth: "user",
4371
+ responseKind: "json",
4372
+ errors: [
4373
+ "validation:invalid_input",
4374
+ "auth:forbidden",
4375
+ "resource:conflict",
4376
+ "server:internal_error"
4377
+ ]
4378
+ },
4379
+ stripeConnectStart: {
4380
+ path: "/sites/{siteId}/billing/connect/start",
4381
+ method: "POST",
4382
+ tags: ["site-{siteId}", "stripe-connect"],
4383
+ auth: "user",
4384
+ responseKind: "json",
4385
+ errors: [
4386
+ "validation:invalid_input",
4387
+ "auth:forbidden",
4388
+ "resource:conflict",
4389
+ "server:internal_error"
4390
+ ]
4391
+ },
4392
+ stripeConnectStatus: {
4393
+ path: "/sites/{siteId}/billing/connect/status",
4394
+ method: "GET",
4395
+ tags: ["site-{siteId}", "stripe-connect"],
4396
+ auth: "user",
4397
+ responseKind: "json",
4398
+ errors: [
4399
+ "validation:invalid_input",
4400
+ "auth:forbidden",
4401
+ "resource:conflict",
4402
+ "server:internal_error"
4403
+ ]
4404
+ },
4405
+ stripeAutomaticTaxUpdate: {
4406
+ path: "/sites/{siteId}/billing/automatic-tax",
4407
+ method: "POST",
4408
+ tags: [
4409
+ "site-{siteId}",
4410
+ "billing",
4411
+ "stripe-tax"
4412
+ ],
4413
+ auth: "user",
4414
+ responseKind: "json",
4415
+ errors: [
4416
+ "validation:invalid_input",
4417
+ "auth:forbidden",
4418
+ "resource:not_found",
4419
+ "server:unavailable",
4420
+ "server:internal_error"
4421
+ ]
4422
+ },
4423
+ stripeConnectDisconnect: {
4424
+ path: "/sites/{siteId}/billing/connect/disconnect",
4425
+ method: "DELETE",
4426
+ tags: ["site-{siteId}", "stripe-connect"],
4427
+ auth: "user",
4428
+ responseKind: "json",
4429
+ errors: [
4430
+ "validation:invalid_input",
4431
+ "auth:forbidden",
4432
+ "resource:conflict",
4433
+ "server:internal_error"
4434
+ ]
4435
+ },
4436
+ billingConnectReturn: {
4437
+ path: "/billing/connect/return",
4438
+ method: "GET",
4439
+ auth: "user",
4440
+ responseKind: "void",
4441
+ errors: []
4442
+ },
4443
+ billingConnectRefresh: {
4444
+ path: "/billing/connect/refresh",
4445
+ method: "GET",
4446
+ auth: "user",
4447
+ responseKind: "void",
4448
+ errors: []
4293
4449
  }
4294
4450
  });
4295
4451
  //#endregion
@@ -4454,6 +4610,14 @@ const PAGE_SURFACE_EDITOR_ENDPOINT_DEFINITIONS = {
4454
4610
  * person when nothing is attached to them.
4455
4611
  */
4456
4612
  const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
4613
+ getBookingPerson: {
4614
+ path: "/sites/{siteId}/bookings/people/{personId}",
4615
+ method: "GET",
4616
+ tags: ["site-{siteId}", "customers-{siteId}"],
4617
+ auth: "user",
4618
+ responseKind: "json",
4619
+ errors: ["resource:not_found", "server:internal_error"]
4620
+ },
4457
4621
  listPeople: {
4458
4622
  path: "/sites/{siteId}/bookings/people",
4459
4623
  method: "GET",
@@ -8251,6 +8415,29 @@ const paletteSchema = z.object({
8251
8415
  };
8252
8416
  });
8253
8417
  //#endregion
8418
+ //#region ../theme-core/src/buttons/typography.ts
8419
+ const textTransformSchema = z.enum([
8420
+ "none",
8421
+ "uppercase",
8422
+ "lowercase",
8423
+ "capitalize"
8424
+ ]);
8425
+ const fontWeightSchema = z.union([
8426
+ z.literal(400),
8427
+ z.literal(500),
8428
+ z.literal(600),
8429
+ z.literal(700),
8430
+ z.literal(800)
8431
+ ]);
8432
+ const buttonTypographySchema = z.enum(["body", "heading"]);
8433
+ const letterSpacingSchema = z.enum([
8434
+ "tight",
8435
+ "normal",
8436
+ "slight",
8437
+ "loose",
8438
+ "wide"
8439
+ ]);
8440
+ //#endregion
8254
8441
  //#region ../theme-core/src/buttons/types.ts
8255
8442
  /**
8256
8443
  * Standard semantic variant roles a theme exposes.
@@ -8366,6 +8553,7 @@ const buttonEffectApplicationSchema = z.discriminatedUnion("effectId", [
8366
8553
  z.strictObject({
8367
8554
  effectId: z.literal("lift"),
8368
8555
  options: z.strictObject({ amount: z.enum([
8556
+ "0.125",
8369
8557
  "0.25",
8370
8558
  "0.5",
8371
8559
  "1"
@@ -8412,24 +8600,6 @@ const shadowSizeSchema = z.enum([
8412
8600
  "medium",
8413
8601
  "high"
8414
8602
  ]);
8415
- const textTransformSchema = z.enum([
8416
- "none",
8417
- "uppercase",
8418
- "lowercase",
8419
- "capitalize"
8420
- ]);
8421
- const fontWeightSchema = z.union([
8422
- z.literal(500),
8423
- z.literal(600),
8424
- z.literal(700),
8425
- z.literal(800)
8426
- ]);
8427
- const buttonTypographySchema = z.enum(["body", "heading"]);
8428
- const letterSpacingSchema = z.enum([
8429
- "tight",
8430
- "normal",
8431
- "loose"
8432
- ]);
8433
8603
  const hoverTransformSchema = z.enum([
8434
8604
  "none",
8435
8605
  "lift",
@@ -8501,7 +8671,8 @@ const paddingShorthandSchema = z.string().refine((value) => {
8501
8671
  }, { message: "Padding must be two space-separated CSS length tokens (e.g. \"0.5rem 1rem\"). Use `0` for zero." });
8502
8672
  const buttonSizeConfigSchema = z.object({
8503
8673
  padding: paddingShorthandSchema,
8504
- fontSize: z.string().optional()
8674
+ fontSize: z.string().optional(),
8675
+ borderRadius: z.string().optional()
8505
8676
  });
8506
8677
  /**
8507
8678
  * `xl` is optional on the wire so themes persisted before the `xl` size was
@@ -8624,12 +8795,20 @@ const buttonVisualAppearanceSchema = z.strictObject({
8624
8795
  textTransform: textTransformSchema
8625
8796
  }),
8626
8797
  effects: z.array(buttonEffectApplicationSchema),
8798
+ transform: z.literal("none").optional(),
8627
8799
  contextualHover: contextualButtonHoverSchema.optional()
8628
8800
  });
8629
8801
  const buttonVisualStatesSchema = z.strictObject({
8630
8802
  base: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
8631
8803
  hover: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
8632
- focus: buttonVisualAppearanceSchema.extend({ shadow: z.literal("focus-indicator") }),
8804
+ focus: buttonVisualAppearanceSchema.extend({
8805
+ shadow: z.literal("focus-indicator"),
8806
+ indicator: z.strictObject({
8807
+ kind: z.literal("surface-ink"),
8808
+ width: z.union([z.literal(2), z.literal(3)]),
8809
+ offset: z.union([z.literal(3), z.literal(4)])
8810
+ }).optional()
8811
+ }),
8633
8812
  active: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
8634
8813
  disabled: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema })
8635
8814
  });
@@ -9096,6 +9275,10 @@ function validateButtonTextContrast(input) {
9096
9275
  }
9097
9276
  };
9098
9277
  }
9278
+ /** A text-token slab inverts the palette's text/background pair, including text shades. */
9279
+ function solidForegroundToken(backgroundToken) {
9280
+ return /^text(?:-\d+)?$/.test(backgroundToken) ? "background" : onColorTokenName(backgroundToken);
9281
+ }
9099
9282
  //#endregion
9100
9283
  //#region ../theme-core/src/buttons/contextualHover.ts
9101
9284
  function resolveContextualHoverPreference(input) {
@@ -9193,7 +9376,7 @@ function candidate(family, shade, currentShade, direction, seedHex, palette) {
9193
9376
  }
9194
9377
  function hasSafeTextContrast(token, palette) {
9195
9378
  const background = palette[token];
9196
- const foreground = palette[onColorTokenName(token)];
9379
+ const foreground = palette[solidForegroundToken(token)];
9197
9380
  return typeof background === "string" && typeof foreground === "string" && contrastRatio(background, foreground) >= BUTTON_CONTRAST_POLICY.textMinimumRatio;
9198
9381
  }
9199
9382
  function isSafeCandidate(token, palette, surface) {
@@ -9288,6 +9471,13 @@ function compileDeclaredVisualStates(input, states) {
9288
9471
  const colours = collectStateColours(mapVisualStates((state) => compileDeclaredVisualState(input, states, state, state === "hover" ? hover.treatment : states[state].background)));
9289
9472
  return colours.ok ? {
9290
9473
  ...colours,
9474
+ focusIndicator: states.focus.indicator ? {
9475
+ kind: "surface-role",
9476
+ colorCss: input.surface?.foregroundCss ?? surfaceForegroundValue("text"),
9477
+ width: states.focus.indicator.width,
9478
+ offset: states.focus.indicator.offset,
9479
+ minimumSurfaceContrast: BUTTON_CONTRAST_POLICY.nonTextMinimumRatio
9480
+ } : colours.focusIndicator,
9291
9481
  contextualHoverRepair: hover.repair
9292
9482
  } : colours;
9293
9483
  }
@@ -9425,7 +9615,7 @@ function resolveFocusIndicator(colour) {
9425
9615
  function resolveSolid(input, backgroundToken, edge) {
9426
9616
  const backgroundHex = paletteHex(input, backgroundToken);
9427
9617
  if (!backgroundHex.ok) return backgroundHex;
9428
- const foregroundToken = unsafeAsOpaqueButtonColourToken(onColorTokenName(backgroundToken));
9618
+ const foregroundToken = unsafeAsOpaqueButtonColourToken(solidForegroundToken(backgroundToken));
9429
9619
  const foregroundHex = input.palette[foregroundToken];
9430
9620
  if (typeof foregroundHex !== "string") return {
9431
9621
  ok: false,
@@ -10599,6 +10789,287 @@ function normalizeAppearance(appearance) {
10599
10789
  };
10600
10790
  }
10601
10791
  //#endregion
10792
+ //#region ../theme-core/src/buttons/styles/recipes/lanternRecipes.ts
10793
+ const flatShadow = {
10794
+ elevation: "none",
10795
+ softness: null,
10796
+ position: "bottom"
10797
+ };
10798
+ const lift$1 = {
10799
+ effectId: "lift",
10800
+ options: { amount: "0.125" }
10801
+ };
10802
+ const tags = {
10803
+ tone: "classic",
10804
+ energy: "calm",
10805
+ motion: "subtle",
10806
+ era: "editorial"
10807
+ };
10808
+ /** Each role supplies complete states, including a flat surface-ink focus ring. */
10809
+ function states(base, hover, offset = 4, width = 2) {
10810
+ return {
10811
+ base,
10812
+ hover,
10813
+ focus: {
10814
+ ...base,
10815
+ shadow: "focus-indicator",
10816
+ indicator: {
10817
+ kind: "surface-ink",
10818
+ width,
10819
+ offset
10820
+ }
10821
+ },
10822
+ active: {
10823
+ ...base,
10824
+ transform: "none"
10825
+ },
10826
+ disabled: {
10827
+ ...base,
10828
+ effects: []
10829
+ }
10830
+ };
10831
+ }
10832
+ const gilt = {
10833
+ text: "treatment",
10834
+ border: "none",
10835
+ borderRadius: "rounded-10px",
10836
+ shadow: flatShadow,
10837
+ sizes: {
10838
+ sm: {
10839
+ padding: "10px 20px",
10840
+ fontSize: "text-base",
10841
+ borderRadius: "rounded-lg"
10842
+ },
10843
+ md: {
10844
+ padding: "18px 36px",
10845
+ fontSize: "text-19px"
10846
+ },
10847
+ lg: {
10848
+ padding: "18px 36px",
10849
+ fontSize: "text-19px"
10850
+ },
10851
+ xl: {
10852
+ padding: "18px 36px",
10853
+ fontSize: "text-19px"
10854
+ }
10855
+ },
10856
+ typography: {
10857
+ fontWeight: 400,
10858
+ typography: "heading",
10859
+ fontSize: "text-19px",
10860
+ letterSpacing: "slight",
10861
+ italic: false,
10862
+ textTransform: "none"
10863
+ },
10864
+ effects: []
10865
+ };
10866
+ const giltPrimary = {
10867
+ ...gilt,
10868
+ background: {
10869
+ type: "gradient",
10870
+ stops: ["accent", "primary"],
10871
+ direction: "to-br",
10872
+ foregroundToken: "onAccent"
10873
+ }
10874
+ };
10875
+ const giltPrimaryHover = {
10876
+ ...giltPrimary,
10877
+ background: {
10878
+ ...giltPrimary.background,
10879
+ stops: ["accent-400", "primary-400"],
10880
+ foregroundToken: "secondary-950"
10881
+ },
10882
+ effects: [lift$1]
10883
+ };
10884
+ const giltSecondary = {
10885
+ ...gilt,
10886
+ background: {
10887
+ type: "solid",
10888
+ colorToken: "text"
10889
+ }
10890
+ };
10891
+ const giltSecondaryHover = {
10892
+ ...giltSecondary,
10893
+ effects: [lift$1],
10894
+ contextualHover: {
10895
+ kind: "shade-shift",
10896
+ seedToken: unsafeAsOpaqueButtonColourToken("text"),
10897
+ fallbackDirection: "lighter"
10898
+ }
10899
+ };
10900
+ const giltPrimaryStates = states(giltPrimary, giltPrimaryHover);
10901
+ const giltSecondaryStates = states(giltSecondary, giltSecondaryHover);
10902
+ const giltSlabRecipe = defineStaticButtonStyleRecipe({
10903
+ id: "gilt-slab",
10904
+ accessibilityLabel: "Gilt slab",
10905
+ tags,
10906
+ system: { roles: {
10907
+ primary: { states: giltPrimaryStates },
10908
+ secondary: { states: giltSecondaryStates },
10909
+ outline: { states: giltSecondaryStates },
10910
+ ghost: { states: giltSecondaryStates },
10911
+ accent: { states: giltPrimaryStates }
10912
+ } }
10913
+ });
10914
+ const hairline = {
10915
+ text: "treatment",
10916
+ borderRadius: "rounded-3px",
10917
+ shadow: flatShadow,
10918
+ sizes: {
10919
+ sm: {
10920
+ padding: "9px 16px",
10921
+ fontSize: "text-xs"
10922
+ },
10923
+ md: {
10924
+ padding: "15px 28px",
10925
+ fontSize: "text-13px"
10926
+ },
10927
+ lg: {
10928
+ padding: "15px 28px",
10929
+ fontSize: "text-13px"
10930
+ },
10931
+ xl: {
10932
+ padding: "15px 28px",
10933
+ fontSize: "text-13px"
10934
+ }
10935
+ },
10936
+ typography: {
10937
+ fontWeight: 700,
10938
+ typography: "body",
10939
+ fontSize: "text-13px",
10940
+ letterSpacing: "wide",
10941
+ italic: false,
10942
+ textTransform: "uppercase"
10943
+ },
10944
+ effects: []
10945
+ };
10946
+ const hairlinePrimary = {
10947
+ ...hairline,
10948
+ background: {
10949
+ type: "solid",
10950
+ colorToken: "primary"
10951
+ },
10952
+ border: {
10953
+ widthClass: "border",
10954
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
10955
+ }
10956
+ };
10957
+ const hairlineOutline = {
10958
+ ...hairline,
10959
+ background: {
10960
+ type: "surface",
10961
+ role: "link"
10962
+ },
10963
+ border: {
10964
+ widthClass: "border",
10965
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
10966
+ }
10967
+ };
10968
+ const hairlineSecondary = {
10969
+ ...hairlineOutline,
10970
+ border: {
10971
+ widthClass: "border",
10972
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
10973
+ }
10974
+ };
10975
+ const hairlineFilled = {
10976
+ ...hairlineSecondary,
10977
+ background: {
10978
+ type: "solid",
10979
+ colorToken: "accent"
10980
+ }
10981
+ };
10982
+ const hairlinePrimaryStates = states(hairlinePrimary, hairlineOutline, 3);
10983
+ const hairlineSecondaryStates = states(hairlineSecondary, hairlineFilled, 3);
10984
+ const hairlineTabRecipe = defineStaticButtonStyleRecipe({
10985
+ id: "hairline-tab",
10986
+ accessibilityLabel: "Hairline tab",
10987
+ tags,
10988
+ system: { roles: {
10989
+ primary: { states: hairlinePrimaryStates },
10990
+ secondary: { states: hairlineSecondaryStates },
10991
+ outline: { states: hairlineSecondaryStates },
10992
+ ghost: { states: hairlineSecondaryStates },
10993
+ accent: { states: states(hairlineFilled, hairlineSecondary, 3) }
10994
+ } }
10995
+ });
10996
+ const marqueeAccent = {
10997
+ text: "treatment",
10998
+ borderRadius: "rounded-none",
10999
+ shadow: flatShadow,
11000
+ sizes: {
11001
+ sm: {
11002
+ padding: "8px 17px",
11003
+ fontSize: "text-15px"
11004
+ },
11005
+ md: {
11006
+ padding: "14px 25px",
11007
+ fontSize: "text-17px"
11008
+ },
11009
+ lg: {
11010
+ padding: "14px 25px",
11011
+ fontSize: "text-17px"
11012
+ },
11013
+ xl: {
11014
+ padding: "14px 25px",
11015
+ fontSize: "text-17px"
11016
+ }
11017
+ },
11018
+ typography: {
11019
+ fontWeight: 800,
11020
+ typography: "body",
11021
+ fontSize: "text-17px",
11022
+ letterSpacing: "loose",
11023
+ italic: false,
11024
+ textTransform: "uppercase"
11025
+ },
11026
+ effects: [],
11027
+ background: {
11028
+ type: "solid",
11029
+ colorToken: "accent"
11030
+ },
11031
+ border: {
11032
+ widthClass: "border-2",
11033
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
11034
+ }
11035
+ };
11036
+ const marqueePrimary = {
11037
+ ...marqueeAccent,
11038
+ background: {
11039
+ type: "solid",
11040
+ colorToken: "primary"
11041
+ },
11042
+ border: {
11043
+ widthClass: "border-2",
11044
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
11045
+ }
11046
+ };
11047
+ const marqueeSecondary = {
11048
+ ...marqueeAccent,
11049
+ background: {
11050
+ type: "solid",
11051
+ colorToken: "text"
11052
+ },
11053
+ border: {
11054
+ widthClass: "border-2",
11055
+ boundaryInk: unsafeAsOpaqueButtonColourToken("text")
11056
+ }
11057
+ };
11058
+ const marqueePrimaryStates = states(marqueeAccent, marqueePrimary, 4, 3);
11059
+ const marqueeSecondaryStates = states(marqueeSecondary, marqueeAccent, 4, 3);
11060
+ const marqueeRecipe = defineStaticButtonStyleRecipe({
11061
+ id: "marquee",
11062
+ accessibilityLabel: "Marquee",
11063
+ tags,
11064
+ system: { roles: {
11065
+ primary: { states: marqueePrimaryStates },
11066
+ secondary: { states: marqueeSecondaryStates },
11067
+ outline: { states: marqueeSecondaryStates },
11068
+ ghost: { states: marqueeSecondaryStates },
11069
+ accent: { states: marqueePrimaryStates }
11070
+ } }
11071
+ });
11072
+ //#endregion
10602
11073
  //#region ../theme-core/src/buttons/styles/recipes/fulcrumRecipe.ts
10603
11074
  const fulcrumSizes = {
10604
11075
  sm: {
@@ -11340,7 +11811,10 @@ const BUTTON_STYLE_IDS = [
11340
11811
  "offset-block",
11341
11812
  "ringed-pill",
11342
11813
  "square-outline",
11343
- "fulcrum"
11814
+ "fulcrum",
11815
+ "gilt-slab",
11816
+ "hairline-tab",
11817
+ "marquee"
11344
11818
  ];
11345
11819
  const quietArrowParametersSchema = z.object({ secondaryTreatment: z.enum(["outlined", "solid-accent"]) }).strict();
11346
11820
  const flatInkHoverTreatmentSchema = z.enum([
@@ -11377,7 +11851,10 @@ const buttonStyleSelectionSchema = z.discriminatedUnion("styleId", [
11377
11851
  selectionBranch("offset-block", emptyParametersSchema),
11378
11852
  selectionBranch("ringed-pill", emptyParametersSchema),
11379
11853
  selectionBranch("square-outline", emptyParametersSchema),
11380
- selectionBranch("fulcrum", emptyParametersSchema)
11854
+ selectionBranch("fulcrum", emptyParametersSchema),
11855
+ selectionBranch("gilt-slab", emptyParametersSchema),
11856
+ selectionBranch("hairline-tab", emptyParametersSchema),
11857
+ selectionBranch("marquee", emptyParametersSchema)
11381
11858
  ]);
11382
11859
  //#endregion
11383
11860
  //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
@@ -14893,7 +15370,10 @@ const buttonStyleRecipes = [
14893
15370
  offsetBlockRecipe,
14894
15371
  ringedPillRecipe,
14895
15372
  squareOutlineRecipe,
14896
- fulcrumRecipe
15373
+ fulcrumRecipe,
15374
+ giltSlabRecipe,
15375
+ hairlineTabRecipe,
15376
+ marqueeRecipe
14897
15377
  ];
14898
15378
  const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
14899
15379
  function findButtonStyleRecipe(id) {
@@ -14909,6 +15389,9 @@ function resolveButtonStyleSelection(selection) {
14909
15389
  case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
14910
15390
  case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
14911
15391
  case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
15392
+ case "gilt-slab": return resolveButtonStyleRecipe(giltSlabRecipe, selection.parameters);
15393
+ case "hairline-tab": return resolveButtonStyleRecipe(hairlineTabRecipe, selection.parameters);
15394
+ case "marquee": return resolveButtonStyleRecipe(marqueeRecipe, selection.parameters);
14912
15395
  case "fulcrum": return resolveButtonStyleRecipe(fulcrumRecipe, selection.parameters);
14913
15396
  case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
14914
15397
  case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
@@ -17140,20 +17623,15 @@ const headerSchema = z.object({
17140
17623
  const footerVariant = z.enum([
17141
17624
  "simple",
17142
17625
  "columns",
17143
- "split"
17144
- ]);
17626
+ "split",
17627
+ "centred"
17628
+ ]).transform((value) => value === "columns" ? "simple" : value);
17145
17629
  const footerMaxWidth = z.enum(["container", "full"]);
17146
17630
  const footerNavLayoutMode = z.enum([
17147
17631
  "stack",
17148
17632
  "inline",
17149
17633
  "inline-wrap"
17150
17634
  ]);
17151
- const footerNavLayoutAlign = z.enum([
17152
- "start",
17153
- "center",
17154
- "end",
17155
- "space-between"
17156
- ]);
17157
17635
  const footerSpacing = z.enum([
17158
17636
  "none",
17159
17637
  "tight",
@@ -17162,12 +17640,6 @@ const footerSpacing = z.enum([
17162
17640
  "relaxed",
17163
17641
  "spacious"
17164
17642
  ]);
17165
- const footerLogoPlacement = z.enum([
17166
- "left",
17167
- "right",
17168
- "above",
17169
- "below"
17170
- ]);
17171
17643
  const footerLogoSize = z.enum([
17172
17644
  "sm",
17173
17645
  "md",
@@ -17208,17 +17680,8 @@ const footerBottomBarSchema = z.object({
17208
17680
  ]).optional()
17209
17681
  }).optional()
17210
17682
  });
17211
- const footerNavLayoutSchema = z.object({
17212
- layout: footerNavLayoutMode.optional(),
17213
- align: footerNavLayoutAlign.optional(),
17214
- gapX: footerSpacing.optional(),
17215
- gapY: footerSpacing.optional(),
17216
- columns: z.number().int().min(1).max(6).optional()
17217
- });
17683
+ const footerNavLayoutSchema = z.object({ layout: footerNavLayoutMode.optional() });
17218
17684
  const footerLogoSchema = z.object({
17219
- showLogo: z.boolean().default(true),
17220
- showLogoText: z.boolean().optional(),
17221
- placement: footerLogoPlacement.optional(),
17222
17685
  size: footerLogoSize.optional(),
17223
17686
  maxHeight: footerLogoMaxHeight.optional(),
17224
17687
  align: z.enum([
@@ -17228,15 +17691,8 @@ const footerLogoSchema = z.object({
17228
17691
  ]).optional()
17229
17692
  });
17230
17693
  const footerSchema = z.object({
17231
- /**
17232
- * SDK-only footer rendering mode.
17233
- *
17234
- * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
17235
- */
17236
- mode: footerModeSchema.optional(),
17237
17694
  variant: footerVariant,
17238
17695
  maxWidth: footerMaxWidth,
17239
- showLogoText: z.boolean().optional(),
17240
17696
  background: headerBackgroundSchema.default({
17241
17697
  type: "color",
17242
17698
  color: "surface"
@@ -17419,7 +17875,9 @@ const cardListKnobBlocks = [...cardListFamilyBlocks, "block.event-calendar"];
17419
17875
  const lookKnobBlocks = {
17420
17876
  actionStyle: cardListKnobBlocks,
17421
17877
  titleSize: "block.hero",
17422
- imagePosition: "block.hero",
17878
+ imagePosition: ["block.hero", "block.media-text"],
17879
+ imageShape: "block.media-text",
17880
+ aspectRatio: "block.media-text",
17423
17881
  stickerLine: "block.hero",
17424
17882
  smallCaption: "block.hero",
17425
17883
  candleGlow: "block.hero",
@@ -17429,7 +17887,11 @@ const lookKnobBlocks = {
17429
17887
  dates: "block.offerings-preview",
17430
17888
  showCapacity: "block.event-calendar",
17431
17889
  quoteCount: "block.testimonials",
17432
- archFrame: "block.testimonials",
17890
+ archFrame: [
17891
+ "block.testimonials",
17892
+ "block.newsletter-signup",
17893
+ "block.form"
17894
+ ],
17433
17895
  tilt: "block.testimonials"
17434
17896
  };
17435
17897
  function isArrangementAppearancePreset(preset) {
@@ -17456,13 +17918,25 @@ function cardListKnobDefaults(block, arrangement, knobs, defaults) {
17456
17918
  }
17457
17919
  };
17458
17920
  }
17921
+ const arrangementLookTargets = {
17922
+ hero: "hero",
17923
+ "feature-cards": "feature-cards",
17924
+ "event-calendar": "events",
17925
+ testimonials: "testimonials",
17926
+ "event-details": "events",
17927
+ "media-text": "media-text",
17928
+ "image-gallery": "image-gallery",
17929
+ "newsletter-signup": "newsletter",
17930
+ form: "contact-form",
17931
+ "body-text": "body-text"
17932
+ };
17459
17933
  function defineArrangementLook(id, block, name, arrangement, knobs, input = {}) {
17460
17934
  const mode = block === "event-calendar" ? "list" : null;
17461
17935
  return {
17462
17936
  id: asAppearancePresetId(id),
17463
17937
  blockKinds: [`block.${block}`],
17464
17938
  label: name,
17465
- target: block === "event-calendar" || block === "event-details" ? "events" : block === "hero" ? "hero" : block === "testimonials" ? "testimonials" : "feature-cards",
17939
+ target: arrangementLookTargets[block],
17466
17940
  structure: {
17467
17941
  kind: "arrangement",
17468
17942
  byMode: { [mode ?? "default"]: arrangement },
@@ -18282,6 +18756,15 @@ const appearancePresets = [
18282
18756
  eyebrowTreatment: "accent"
18283
18757
  }
18284
18758
  }),
18759
+ defineArrangementLook("body-text-reading-column", "body-text", "Reading column", "prose", []),
18760
+ defineArrangementLook("form-beside-introduction-arched-panel", "form", "Introduction beside an arched form", "two-column", [], { slotRoles: { panel: "card" } }),
18761
+ defineArrangementLook("newsletter-signup-in-arch", "newsletter-signup", "Signup in an arch", "arch", []),
18762
+ defineArrangementLook("image-gallery-square-tiles", "image-gallery", "Square tiles", "tiles", []),
18763
+ defineArrangementLook("image-gallery-arched-captions", "image-gallery", "Arched photos with captions", "tiles", [], { styleFallback: [id$1("image-gallery-square-tiles")] }),
18764
+ defineArrangementLook("media-text-circle-beside-text", "media-text", "Circle beside the text", "circle-beside", ["imagePosition"], { forcedKnobs: {
18765
+ imageShape: "circle",
18766
+ aspectRatio: "1/1"
18767
+ } }),
18285
18768
  defineArrangementLook("hero-photo-beside-text", "hero", "Photo beside the text", "split", heroKnobs, { slotRoles: { sticker: "highlight" } }),
18286
18769
  defineArrangementLook("hero-headline-row", "hero", "Big headline, then text and photo", "headline-row", heroKnobs, {
18287
18770
  slotRoles: { sticker: "highlight" },
@@ -18867,6 +19350,49 @@ function requireThemeColorToken$1(value) {
18867
19350
  return token;
18868
19351
  }
18869
19352
  //#endregion
19353
+ //#region ../theme-core/src/header/rootPaint.ts
19354
+ /** The nav container takes precedence when a floating header also has one. */
19355
+ function headerRootPaint(header) {
19356
+ const navContainerType = header?.navContainer?.type ?? "none";
19357
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
19358
+ return header?.variant === "floating" ? "overlay" : "own-surface";
19359
+ }
19360
+ //#endregion
19361
+ //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
19362
+ const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
19363
+ const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
19364
+ siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
19365
+ function parseSiteChromeBackgroundColorToken(value) {
19366
+ const token = parseBackgroundAppearanceColorToken(value);
19367
+ return token ? token : null;
19368
+ }
19369
+ function toSiteChromeBackgroundColorTokens(tokenNames) {
19370
+ return tokenNames.flatMap((name) => {
19371
+ const token = parseSiteChromeBackgroundColorToken(name);
19372
+ return token ? [token] : [];
19373
+ });
19374
+ }
19375
+ const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
19376
+ const token = parseSiteChromeBackgroundColorToken(value);
19377
+ if (token === null) {
19378
+ ctx.addIssue({
19379
+ code: "custom",
19380
+ message: "Unknown site chrome background colour token"
19381
+ });
19382
+ return z.NEVER;
19383
+ }
19384
+ return token;
19385
+ });
19386
+ const siteChromeBackgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
19387
+ kind: z.literal("color"),
19388
+ token: backgroundColorTokenSchema
19389
+ }).strict()]);
19390
+ z.object({
19391
+ background: siteChromeBackgroundOverrideSchema,
19392
+ navigationLayout: z.enum(["inline-wrap", "stack"])
19393
+ }).strict();
19394
+ z.object({ background: siteChromeBackgroundOverrideSchema }).strict();
19395
+ //#endregion
18870
19396
  //#region ../theme-core/src/site-styles/compilationPlan.ts
18871
19397
  const defaultHeaderBrandPreferences = {
18872
19398
  brandDisplay: "auto",
@@ -19027,6 +19553,9 @@ function fallbackEndsAtOffer(entry, mode, style, catalogue, visited) {
19027
19553
  appearancePresets.filter(isArrangementAppearancePreset);
19028
19554
  /** Closed structural hooks shared by block arrangements and bounded skins. */
19029
19555
  const arrangementSlotNames = [
19556
+ "contact",
19557
+ "social",
19558
+ "base",
19030
19559
  "section",
19031
19560
  "stack",
19032
19561
  "inline",
@@ -19113,6 +19642,238 @@ function validateOfferKnobs(style, catalogue) {
19113
19642
  });
19114
19643
  }
19115
19644
  //#endregion
19645
+ //#region ../theme-core/src/site-styles/footerLookDefaults.ts
19646
+ const defaultFooterLookRecipes = {
19647
+ "footer-centred-name": {
19648
+ arrangement: "centred",
19649
+ ground: {
19650
+ kind: "token",
19651
+ token: "surface"
19652
+ },
19653
+ nav: {
19654
+ weight: "regular",
19655
+ colorToken: "text",
19656
+ hoverColorToken: "primary",
19657
+ typography: "body"
19658
+ },
19659
+ legal: {
19660
+ kind: "separate",
19661
+ bar: null
19662
+ },
19663
+ brandAlign: "center"
19664
+ },
19665
+ "footer-links-row": {
19666
+ arrangement: "simple",
19667
+ ground: {
19668
+ kind: "token",
19669
+ token: "surface"
19670
+ },
19671
+ nav: {
19672
+ weight: "regular",
19673
+ colorToken: "text",
19674
+ hoverColorToken: "primary",
19675
+ typography: "body"
19676
+ },
19677
+ legal: { kind: "integrated" },
19678
+ brandAlign: "start"
19679
+ }
19680
+ };
19681
+ /** A whole authored recipe replaces the default; facets are never deep-merged. */
19682
+ function resolveFooterLookRecipe(style, id) {
19683
+ return style?.footerLookRecipes?.[id] ?? defaultFooterLookRecipes[id];
19684
+ }
19685
+ //#endregion
19686
+ //#region ../theme-core/src/navigation/presets.ts
19687
+ /**
19688
+ * Built-in nav link style presets
19689
+ *
19690
+ * Each preset uses composable effects to achieve its look.
19691
+ */
19692
+ const NAV_LINK_PRESETS = {
19693
+ /**
19694
+ * Minimal - subtle color change on hover
19695
+ */
19696
+ minimal: {
19697
+ name: "Minimal",
19698
+ typography: "body",
19699
+ fontWeight: "medium",
19700
+ textTransform: "none",
19701
+ italic: false,
19702
+ colorToken: "text",
19703
+ hoverColorToken: "primary",
19704
+ padding: "none",
19705
+ borderRadius: "none",
19706
+ effects: { hover: [{
19707
+ effectId: "text-color-change",
19708
+ options: { hoverColorToken: "primary" }
19709
+ }] }
19710
+ },
19711
+ /**
19712
+ * Underline - static underline appears on hover
19713
+ */
19714
+ underline: {
19715
+ name: "Underline",
19716
+ typography: "body",
19717
+ fontWeight: "medium",
19718
+ textTransform: "none",
19719
+ italic: false,
19720
+ colorToken: "text",
19721
+ padding: "none",
19722
+ borderRadius: "none",
19723
+ effects: { hover: [{
19724
+ effectId: "nav-underline",
19725
+ options: { style: "static" }
19726
+ }] }
19727
+ },
19728
+ /**
19729
+ * Underline Grow - animated underline grows from center on hover
19730
+ */
19731
+ "underline-grow": {
19732
+ name: "Underline Grow",
19733
+ typography: "body",
19734
+ fontWeight: "medium",
19735
+ textTransform: "none",
19736
+ italic: false,
19737
+ colorToken: "text",
19738
+ padding: "none",
19739
+ borderRadius: "none",
19740
+ effects: { hover: [{
19741
+ effectId: "nav-underline",
19742
+ options: { style: "grow" }
19743
+ }] }
19744
+ },
19745
+ /**
19746
+ * Capsule - pill-shaped background on hover
19747
+ */
19748
+ capsule: {
19749
+ name: "Capsule",
19750
+ typography: "body",
19751
+ fontWeight: "medium",
19752
+ textTransform: "none",
19753
+ italic: false,
19754
+ colorToken: "text",
19755
+ padding: "compact",
19756
+ borderRadius: "full",
19757
+ effects: {
19758
+ hover: [{
19759
+ effectId: "background-on-hover-alpha",
19760
+ options: {
19761
+ colorToken: "primary",
19762
+ opacity: 10
19763
+ }
19764
+ }],
19765
+ active: [{
19766
+ effectId: "background-on-hover-alpha",
19767
+ options: {
19768
+ colorToken: "primary",
19769
+ opacity: 15
19770
+ }
19771
+ }]
19772
+ }
19773
+ },
19774
+ /**
19775
+ * Solid - solid background color on hover
19776
+ */
19777
+ solid: {
19778
+ name: "Solid",
19779
+ typography: "body",
19780
+ fontWeight: "medium",
19781
+ textTransform: "none",
19782
+ italic: false,
19783
+ colorToken: "text",
19784
+ padding: "compact",
19785
+ borderRadius: "none",
19786
+ effects: {
19787
+ hover: [{
19788
+ effectId: "background-on-hover",
19789
+ options: {
19790
+ colorToken: "primary",
19791
+ textColorToken: "primaryForeground"
19792
+ }
19793
+ }],
19794
+ active: [{
19795
+ effectId: "background-on-hover",
19796
+ options: {
19797
+ colorToken: "primary",
19798
+ textColorToken: "primaryForeground"
19799
+ }
19800
+ }]
19801
+ }
19802
+ },
19803
+ /**
19804
+ * Scale - gentle scale-up on hover
19805
+ */
19806
+ scale: {
19807
+ name: "Scale",
19808
+ typography: "body",
19809
+ fontWeight: "medium",
19810
+ textTransform: "none",
19811
+ italic: false,
19812
+ colorToken: "text",
19813
+ padding: "none",
19814
+ borderRadius: "none",
19815
+ effects: { hover: [{
19816
+ effectId: "scale-up",
19817
+ options: { scale: 1.05 }
19818
+ }] }
19819
+ },
19820
+ /**
19821
+ * Frosted - semi-transparent glass-like background
19822
+ */
19823
+ frosted: {
19824
+ name: "Frosted",
19825
+ typography: "body",
19826
+ fontWeight: "medium",
19827
+ textTransform: "none",
19828
+ italic: false,
19829
+ colorToken: "text",
19830
+ padding: "compact",
19831
+ borderRadius: "md",
19832
+ effects: {
19833
+ base: [{ effectId: "nav-frosted-base" }],
19834
+ hover: [{ effectId: "nav-frosted-hover" }],
19835
+ active: [{ effectId: "nav-frosted-active" }]
19836
+ }
19837
+ }
19838
+ };
19839
+ /**
19840
+ * Get a nav link style preset by ID
19841
+ */
19842
+ function getNavLinkPreset(presetId) {
19843
+ return NAV_LINK_PRESETS[presetId];
19844
+ }
19845
+ Object.keys(NAV_LINK_PRESETS);
19846
+ //#endregion
19847
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
19848
+ function effectiveFooterNavLinkStyle(footer) {
19849
+ if (!footer) return null;
19850
+ if (footer.navLinkStyle) return footer.navLinkStyle;
19851
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
19852
+ if (!basePreset) return null;
19853
+ return {
19854
+ ...basePreset,
19855
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
19856
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
19857
+ };
19858
+ }
19859
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
19860
+ if (!footer) return {};
19861
+ const style = effectiveFooterNavLinkStyle(footer);
19862
+ return {
19863
+ text: footer.background?.textColor ?? (footer.variant === "centred" ? "text" : void 0),
19864
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
19865
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
19866
+ };
19867
+ }
19868
+ //#endregion
19869
+ //#region ../theme-core/src/site-styles/footerLookRecipe.ts
19870
+ /** Reject undeclared references when the curated catalogue is loaded, before rendering. */
19871
+ function validateFooterRecipeSurfaces(style, recipe) {
19872
+ [recipe.ground, ...recipe.legal.kind === "separate" && recipe.legal.bar ? [recipe.legal.bar.background] : []].forEach((ground) => {
19873
+ if (ground.kind === "style-surface" && (style.looks.kind !== "offers" || !style.looks.surfaces[ground.surface])) throw new Error(`Undeclared footer surface: ${ground.surface}`);
19874
+ });
19875
+ }
19876
+ //#endregion
19116
19877
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
19117
19878
  /**
19118
19879
  * Reusable accordion "looks" for curated site styles.
@@ -19840,52 +20601,14 @@ defineLookOptionGroup({
19840
20601
  function asFooterLookId(value) {
19841
20602
  return value;
19842
20603
  }
19843
- function quietFooterLinks(theme) {
19844
- return {
19845
- ...theme.footer,
19846
- navStyle: "minimal",
19847
- navWeight: "regular",
19848
- navColor: "text",
19849
- navLinkStyle: {
19850
- typography: "body",
19851
- fontWeight: "regular",
19852
- textTransform: "none",
19853
- italic: false,
19854
- colorToken: "text",
19855
- hoverColorToken: "primary",
19856
- padding: "none",
19857
- borderRadius: "none"
19858
- }
19859
- };
19860
- }
19861
- function emphasizedFooterLinks(theme) {
19862
- return {
19863
- ...theme.footer,
19864
- navStyle: "minimal",
19865
- navWeight: "medium",
19866
- navColor: "text",
19867
- navLinkStyle: {
19868
- typography: "body",
19869
- fontWeight: "medium",
19870
- textTransform: "none",
19871
- italic: false,
19872
- colorToken: "text",
19873
- hoverColorToken: "primary",
19874
- padding: "none",
19875
- borderRadius: "none"
19876
- }
19877
- };
19878
- }
19879
20604
  const footerLookCatalog = defineExactCatalog()([{
19880
- id: asFooterLookId("footer-links-quiet"),
19881
- label: "Quiet links",
19882
- description: "Regular-weight footer navigation with a restrained hover.",
19883
- compile: quietFooterLinks
20605
+ id: asFooterLookId("footer-links-row"),
20606
+ label: "Links in a row",
20607
+ description: "Your links in a row, with the other footer sections in columns beside them."
19884
20608
  }, {
19885
- id: asFooterLookId("footer-links-emphasized"),
19886
- label: "Emphasized links",
19887
- description: "Medium-weight footer navigation with a clearer emphasis.",
19888
- compile: emphasizedFooterLinks
20609
+ id: asFooterLookId("footer-centred-name"),
20610
+ label: "Centred name, links beneath",
20611
+ description: "Your site name centred, with your links, contact details and social links beneath it."
19889
20612
  }]);
19890
20613
  new Map(footerLookCatalog.map((look) => [look.id, look]));
19891
20614
  //#endregion
@@ -21302,6 +22025,7 @@ function defineCuratedSiteStyle(input) {
21302
22025
  recommendedAppearancePresetIds
21303
22026
  },
21304
22027
  headerCuration: headerCurationBySiteStyle[input.id],
22028
+ footerLookRecipes: input.footerLookRecipes,
21305
22029
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
21306
22030
  buttonStyleChoices: input.buttonStyleChoices,
21307
22031
  paletteRecommendations: input.paletteRecommendations,
@@ -21787,7 +22511,11 @@ const lanternLooks = {
21787
22511
  margin: "40px"
21788
22512
  },
21789
22513
  fontLoading: {
21790
- extraBodyFontWeights: [500, 700],
22514
+ extraBodyFontWeights: [
22515
+ 500,
22516
+ 700,
22517
+ 800
22518
+ ],
21791
22519
  italicBodyFontWeights: [400]
21792
22520
  },
21793
22521
  surfaces: {
@@ -21837,6 +22565,38 @@ const lanternLooks = {
21837
22565
  ]
21838
22566
  },
21839
22567
  offers: [
22568
+ {
22569
+ id: id("body-text-reading-column"),
22570
+ treatment: "reading-column",
22571
+ roleMap: lanternRoles
22572
+ },
22573
+ {
22574
+ id: id("form-beside-introduction-arched-panel"),
22575
+ treatment: "arched-panel",
22576
+ addKnobs: ["archFrame"],
22577
+ roleMap: lanternRoles
22578
+ },
22579
+ {
22580
+ id: id("newsletter-signup-in-arch"),
22581
+ treatment: "signup-arch",
22582
+ addKnobs: ["archFrame"],
22583
+ roleMap: lanternRoles
22584
+ },
22585
+ {
22586
+ id: id("image-gallery-square-tiles"),
22587
+ treatment: "square-tiles",
22588
+ roleMap: lanternRoles
22589
+ },
22590
+ {
22591
+ id: id("image-gallery-arched-captions"),
22592
+ treatment: "arched-captions",
22593
+ roleMap: lanternRoles
22594
+ },
22595
+ {
22596
+ id: id("media-text-circle-beside-text"),
22597
+ treatment: "circle-beside",
22598
+ roleMap: lanternRoles
22599
+ },
21840
22600
  {
21841
22601
  id: id("event-details-panel"),
21842
22602
  treatment: "quiet",
@@ -22275,7 +23035,7 @@ const curatedSiteStyles = [
22275
23035
  "faq-contained-help",
22276
23036
  "contact-form-panel"
22277
23037
  ],
22278
- recommendedFooterLookIds: ["footer-links-quiet"],
23038
+ recommendedFooterLookIds: ["footer-links-row"],
22279
23039
  buttonStyleChoices: [
22280
23040
  buttonChoice("soft-pill"),
22281
23041
  buttonChoice("pebble"),
@@ -22394,7 +23154,7 @@ const curatedSiteStyles = [
22394
23154
  "testimonials-non-carded",
22395
23155
  "contact-form-panel"
22396
23156
  ],
22397
- recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
23157
+ recommendedFooterLookIds: ["footer-links-row"],
22398
23158
  buttonStyleChoices: [
22399
23159
  buttonChoice("earth-pill"),
22400
23160
  buttonChoice("soft-pill"),
@@ -22449,7 +23209,41 @@ const curatedSiteStyles = [
22449
23209
  "testimonials-brand-statement-cards",
22450
23210
  "contact-form-panel"
22451
23211
  ],
22452
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
23212
+ footerLookRecipes: { "footer-links-row": {
23213
+ arrangement: "split",
23214
+ ground: {
23215
+ kind: "token",
23216
+ token: "primary-800"
23217
+ },
23218
+ nav: {
23219
+ weight: "medium",
23220
+ colorToken: "primaryForeground",
23221
+ hoverColorToken: "secondary",
23222
+ typography: "body"
23223
+ },
23224
+ legal: {
23225
+ kind: "separate",
23226
+ bar: {
23227
+ fullBleed: true,
23228
+ background: {
23229
+ kind: "token",
23230
+ token: "primary-900"
23231
+ },
23232
+ textColor: "primaryForeground",
23233
+ textAlign: "center",
23234
+ paddingY: "compact",
23235
+ paddingX: "default",
23236
+ borderTop: { width: "none" }
23237
+ },
23238
+ linkStyle: {
23239
+ colorToken: "secondary",
23240
+ decorationColorToken: "secondary"
23241
+ }
23242
+ },
23243
+ brandAlign: "start",
23244
+ brandLogoSize: "sm"
23245
+ } },
23246
+ recommendedFooterLookIds: ["footer-links-row"],
22453
23247
  buttonStyleChoices: [
22454
23248
  buttonChoice("showtime-pill"),
22455
23249
  buttonChoice("confident-chip"),
@@ -22520,7 +23314,7 @@ const curatedSiteStyles = [
22520
23314
  "testimonials-statement-cards",
22521
23315
  "contact-form-panel"
22522
23316
  ],
22523
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
23317
+ recommendedFooterLookIds: ["footer-links-row"],
22524
23318
  buttonStyleChoices: [
22525
23319
  buttonChoice("ornate-ritual"),
22526
23320
  buttonChoice("joy-stamp"),
@@ -22567,7 +23361,22 @@ const curatedSiteStyles = [
22567
23361
  } }
22568
23362
  },
22569
23363
  recommendedAppearancePresetIds: ["feature-cards-bold-colors", "testimonials-statement-cards"],
22570
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
23364
+ footerLookRecipes: { "footer-links-row": {
23365
+ arrangement: "simple",
23366
+ ground: {
23367
+ kind: "token",
23368
+ token: "surface"
23369
+ },
23370
+ nav: {
23371
+ weight: "medium",
23372
+ colorToken: "text",
23373
+ hoverColorToken: "primary",
23374
+ typography: "body"
23375
+ },
23376
+ legal: { kind: "integrated" },
23377
+ brandAlign: "start"
23378
+ } },
23379
+ recommendedFooterLookIds: ["footer-links-row"],
22571
23380
  buttonStyleChoices: [
22572
23381
  buttonChoice("joy-stamp"),
22573
23382
  buttonChoice("ink-stamp"),
@@ -22619,7 +23428,7 @@ const curatedSiteStyles = [
22619
23428
  },
22620
23429
  testimonialQuote: serifDisplayQuote
22621
23430
  },
22622
- recommendedFooterLookIds: ["footer-links-quiet"],
23431
+ recommendedFooterLookIds: ["footer-links-row"],
22623
23432
  buttonStyleChoices: [
22624
23433
  buttonChoice("fulcrum"),
22625
23434
  buttonChoice("editorial-link"),
@@ -22696,7 +23505,7 @@ const curatedSiteStyles = [
22696
23505
  "faq-base-accordion",
22697
23506
  "booking-brand-band"
22698
23507
  ],
22699
- recommendedFooterLookIds: ["footer-links-quiet"],
23508
+ recommendedFooterLookIds: ["footer-links-row"],
22700
23509
  buttonStyleChoices: [
22701
23510
  buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
22702
23511
  buttonChoice("flat-ink"),
@@ -22734,7 +23543,22 @@ const curatedSiteStyles = [
22734
23543
  accordions: boldBorderedAccordionSystem,
22735
23544
  testimonialQuote: accentGlyphQuote
22736
23545
  },
22737
- recommendedFooterLookIds: ["footer-links-emphasized"],
23546
+ footerLookRecipes: { "footer-links-row": {
23547
+ arrangement: "simple",
23548
+ ground: {
23549
+ kind: "token",
23550
+ token: "surface"
23551
+ },
23552
+ nav: {
23553
+ weight: "medium",
23554
+ colorToken: "text",
23555
+ hoverColorToken: "primary",
23556
+ typography: "body"
23557
+ },
23558
+ legal: { kind: "integrated" },
23559
+ brandAlign: "start"
23560
+ } },
23561
+ recommendedFooterLookIds: ["footer-links-row"],
22738
23562
  buttonStyleChoices: [
22739
23563
  buttonChoice("offset-block"),
22740
23564
  buttonChoice("ink-stamp"),
@@ -22773,8 +23597,29 @@ const curatedSiteStyles = [
22773
23597
  accordions: warmInsetAccordionSystem,
22774
23598
  testimonialQuote: serifDisplayQuote
22775
23599
  },
22776
- recommendedFooterLookIds: ["footer-links-quiet"],
23600
+ footerLookRecipes: { "footer-centred-name": {
23601
+ arrangement: "centred",
23602
+ ground: {
23603
+ kind: "style-surface",
23604
+ surface: "deep"
23605
+ },
23606
+ nav: {
23607
+ weight: "regular",
23608
+ colorToken: "text",
23609
+ hoverColorToken: "primary",
23610
+ typography: "heading"
23611
+ },
23612
+ legal: {
23613
+ kind: "separate",
23614
+ bar: null
23615
+ },
23616
+ brandAlign: "center"
23617
+ } },
23618
+ recommendedFooterLookIds: ["footer-centred-name", "footer-links-row"],
22777
23619
  buttonStyleChoices: [
23620
+ buttonChoice("gilt-slab"),
23621
+ buttonChoice("hairline-tab"),
23622
+ buttonChoice("marquee"),
22778
23623
  buttonChoice("ringed-pill"),
22779
23624
  buttonChoice("earth-pill"),
22780
23625
  buttonChoice("editorial-link")
@@ -22809,7 +23654,7 @@ const curatedSiteStyles = [
22809
23654
  accordions: editorialDividedAccordionSystem,
22810
23655
  testimonialQuote: serifDisplayQuote
22811
23656
  },
22812
- recommendedFooterLookIds: ["footer-links-quiet"],
23657
+ recommendedFooterLookIds: ["footer-links-row"],
22813
23658
  buttonStyleChoices: [
22814
23659
  buttonChoice("flat-ink", void 0, { corners: "square" }),
22815
23660
  buttonChoice("editorial-link"),
@@ -22837,6 +23682,7 @@ function curatedStyleTemplate(input) {
22837
23682
  }
22838
23683
  curatedSiteStyles.forEach((style) => {
22839
23684
  if (style.looks.kind === "offers") validateLookFallbacks(style.looks);
23685
+ (/* @__PURE__ */ new Set([...Object.values(style.footerLookRecipes ?? {}), ...style.recommendedFooterLookIds.map((id) => resolveFooterLookRecipe(style, id))])).forEach((recipe) => validateFooterRecipeSurfaces(style, recipe));
22840
23686
  });
22841
23687
  //#endregion
22842
23688
  //#region ../theme-core/src/site-styles/effectiveArrangement.ts
@@ -22912,29 +23758,6 @@ const blockDesignFallback = {
22912
23758
  };
22913
23759
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
22914
23760
  //#endregion
22915
- //#region ../theme-core/src/header/rootPaint.ts
22916
- /** The nav container takes precedence when a floating header also has one. */
22917
- function headerRootPaint(header) {
22918
- const navContainerType = header?.navContainer?.type ?? "none";
22919
- if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
22920
- return header?.variant === "floating" ? "overlay" : "own-surface";
22921
- }
22922
- //#endregion
22923
- //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
22924
- const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
22925
- const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
22926
- siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
22927
- function parseSiteChromeBackgroundColorToken(value) {
22928
- const token = parseBackgroundAppearanceColorToken(value);
22929
- return token ? token : null;
22930
- }
22931
- function toSiteChromeBackgroundColorTokens(tokenNames) {
22932
- return tokenNames.flatMap((name) => {
22933
- const token = parseSiteChromeBackgroundColorToken(name);
22934
- return token ? [token] : [];
22935
- });
22936
- }
22937
- //#endregion
22938
23761
  //#region ../theme-core/src/site-styles/siteChromeNavPreferences.ts
22939
23762
  const headerNavTypographyPreferenceValues = [
22940
23763
  "inherit",
@@ -23050,21 +23873,6 @@ z.object({
23050
23873
  }).strict();
23051
23874
  //#endregion
23052
23875
  //#region ../theme-core/src/site-styles/headerPreferencesPersistence.ts
23053
- const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
23054
- const token = parseSiteChromeBackgroundColorToken(value);
23055
- if (token === null) {
23056
- ctx.addIssue({
23057
- code: "custom",
23058
- message: "Unknown site chrome background colour token"
23059
- });
23060
- return z.NEVER;
23061
- }
23062
- return token;
23063
- });
23064
- const backgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
23065
- kind: z.literal("color"),
23066
- token: backgroundColorTokenSchema
23067
- }).strict()]);
23068
23876
  const logoTextIntentSchema = z.object({
23069
23877
  mobileMaxWidth: z.enum([
23070
23878
  "xs",
@@ -23090,7 +23898,7 @@ const headerPreferencesShape = {
23090
23898
  navFontRole: z.enum(headerNavTypographyPreferenceValues),
23091
23899
  navTextSize: z.enum(headerNavFontSizePreferenceValues),
23092
23900
  interactionPalette: z.union([z.literal("recommended"), z.enum(headerInteractionPaletteValues)]),
23093
- background: backgroundOverrideSchema,
23901
+ background: siteChromeBackgroundOverrideSchema,
23094
23902
  structure: structureSchema
23095
23903
  };
23096
23904
  z.object(headerPreferencesShape).strict();
@@ -23099,167 +23907,6 @@ z.object(headerPreferencesShape).omit({
23099
23907
  structure: true
23100
23908
  }).strict();
23101
23909
  //#endregion
23102
- //#region ../theme-core/src/navigation/presets.ts
23103
- /**
23104
- * Built-in nav link style presets
23105
- *
23106
- * Each preset uses composable effects to achieve its look.
23107
- */
23108
- const NAV_LINK_PRESETS = {
23109
- /**
23110
- * Minimal - subtle color change on hover
23111
- */
23112
- minimal: {
23113
- name: "Minimal",
23114
- typography: "body",
23115
- fontWeight: "medium",
23116
- textTransform: "none",
23117
- italic: false,
23118
- colorToken: "text",
23119
- hoverColorToken: "primary",
23120
- padding: "none",
23121
- borderRadius: "none",
23122
- effects: { hover: [{
23123
- effectId: "text-color-change",
23124
- options: { hoverColorToken: "primary" }
23125
- }] }
23126
- },
23127
- /**
23128
- * Underline - static underline appears on hover
23129
- */
23130
- underline: {
23131
- name: "Underline",
23132
- typography: "body",
23133
- fontWeight: "medium",
23134
- textTransform: "none",
23135
- italic: false,
23136
- colorToken: "text",
23137
- padding: "none",
23138
- borderRadius: "none",
23139
- effects: { hover: [{
23140
- effectId: "nav-underline",
23141
- options: { style: "static" }
23142
- }] }
23143
- },
23144
- /**
23145
- * Underline Grow - animated underline grows from center on hover
23146
- */
23147
- "underline-grow": {
23148
- name: "Underline Grow",
23149
- typography: "body",
23150
- fontWeight: "medium",
23151
- textTransform: "none",
23152
- italic: false,
23153
- colorToken: "text",
23154
- padding: "none",
23155
- borderRadius: "none",
23156
- effects: { hover: [{
23157
- effectId: "nav-underline",
23158
- options: { style: "grow" }
23159
- }] }
23160
- },
23161
- /**
23162
- * Capsule - pill-shaped background on hover
23163
- */
23164
- capsule: {
23165
- name: "Capsule",
23166
- typography: "body",
23167
- fontWeight: "medium",
23168
- textTransform: "none",
23169
- italic: false,
23170
- colorToken: "text",
23171
- padding: "compact",
23172
- borderRadius: "full",
23173
- effects: {
23174
- hover: [{
23175
- effectId: "background-on-hover-alpha",
23176
- options: {
23177
- colorToken: "primary",
23178
- opacity: 10
23179
- }
23180
- }],
23181
- active: [{
23182
- effectId: "background-on-hover-alpha",
23183
- options: {
23184
- colorToken: "primary",
23185
- opacity: 15
23186
- }
23187
- }]
23188
- }
23189
- },
23190
- /**
23191
- * Solid - solid background color on hover
23192
- */
23193
- solid: {
23194
- name: "Solid",
23195
- typography: "body",
23196
- fontWeight: "medium",
23197
- textTransform: "none",
23198
- italic: false,
23199
- colorToken: "text",
23200
- padding: "compact",
23201
- borderRadius: "none",
23202
- effects: {
23203
- hover: [{
23204
- effectId: "background-on-hover",
23205
- options: {
23206
- colorToken: "primary",
23207
- textColorToken: "primaryForeground"
23208
- }
23209
- }],
23210
- active: [{
23211
- effectId: "background-on-hover",
23212
- options: {
23213
- colorToken: "primary",
23214
- textColorToken: "primaryForeground"
23215
- }
23216
- }]
23217
- }
23218
- },
23219
- /**
23220
- * Scale - gentle scale-up on hover
23221
- */
23222
- scale: {
23223
- name: "Scale",
23224
- typography: "body",
23225
- fontWeight: "medium",
23226
- textTransform: "none",
23227
- italic: false,
23228
- colorToken: "text",
23229
- padding: "none",
23230
- borderRadius: "none",
23231
- effects: { hover: [{
23232
- effectId: "scale-up",
23233
- options: { scale: 1.05 }
23234
- }] }
23235
- },
23236
- /**
23237
- * Frosted - semi-transparent glass-like background
23238
- */
23239
- frosted: {
23240
- name: "Frosted",
23241
- typography: "body",
23242
- fontWeight: "medium",
23243
- textTransform: "none",
23244
- italic: false,
23245
- colorToken: "text",
23246
- padding: "compact",
23247
- borderRadius: "md",
23248
- effects: {
23249
- base: [{ effectId: "nav-frosted-base" }],
23250
- hover: [{ effectId: "nav-frosted-hover" }],
23251
- active: [{ effectId: "nav-frosted-active" }]
23252
- }
23253
- }
23254
- };
23255
- /**
23256
- * Get a nav link style preset by ID
23257
- */
23258
- function getNavLinkPreset(presetId) {
23259
- return NAV_LINK_PRESETS[presetId];
23260
- }
23261
- Object.keys(NAV_LINK_PRESETS);
23262
- //#endregion
23263
23910
  //#region ../theme-core/src/header/legacyNavLinkStyle.ts
23264
23911
  function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
23265
23912
  const navStyle = header.navStyle ?? "minimal";
@@ -23504,28 +24151,6 @@ z.object({
23504
24151
  motion: z.enum(themeTokenRecipeOptions.motion)
23505
24152
  });
23506
24153
  //#endregion
23507
- //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
23508
- function effectiveFooterNavLinkStyle(footer) {
23509
- if (!footer) return null;
23510
- if (footer.navLinkStyle) return footer.navLinkStyle;
23511
- const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
23512
- if (!basePreset) return null;
23513
- return {
23514
- ...basePreset,
23515
- fontWeight: footer.navWeight ?? basePreset.fontWeight,
23516
- colorToken: footer.navColor?.trim() || basePreset.colorToken
23517
- };
23518
- }
23519
- function footerForegroundCandidates(footer, proseHoverCandidate) {
23520
- if (!footer) return {};
23521
- const style = effectiveFooterNavLinkStyle(footer);
23522
- return {
23523
- text: footer.background?.textColor,
23524
- link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
23525
- linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
23526
- };
23527
- }
23528
- //#endregion
23529
24154
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
23530
24155
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
23531
24156
  //#endregion
@@ -26621,7 +27246,12 @@ function resolveRuntimeSectionSurface(value, context, options) {
26621
27246
  }
26622
27247
  function arrangementSurfaceInk(foreground, context) {
26623
27248
  if (context.data?._lookSlots === void 0) return {};
26624
- const decorations = surfaceDecorationColors(foreground, context.theme.palette);
27249
+ return surfaceInkStyles(foreground, context.theme.palette);
27250
+ }
27251
+ /** Decoration roles already resolved by the surface owner, shared with footer arrangements. */
27252
+ function surfaceInkStyles(foreground, palette) {
27253
+ if (foreground.kind === "unknown") return {};
27254
+ const decorations = surfaceDecorationColors(foreground, palette);
26625
27255
  return {
26626
27256
  "--rb-surface-muted-color": foreground.roles.muted ?? foreground.roles.text,
26627
27257
  ...decorations ? {
@@ -27232,48 +27862,50 @@ const boxStylesTransforms = [
27232
27862
  ];
27233
27863
  //#endregion
27234
27864
  //#region ../blocks/src/system/node/fragments/responsiveTwoColumn.ts
27235
- 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" }) {
27236
- const baseClass = !gapFrom ? `${containerClassName} ${gapClassName}`.trim() : containerClassName;
27237
- const props = { className: { $bind: {
27238
- from: imagePositionFrom,
27239
- transforms: [{
27240
- id: "ui.twoColumnContainerClass",
27241
- options: {
27242
- base: baseClass,
27243
- reverseClass: "rb-md-flex-row-reverse"
27244
- }
27245
- }],
27246
- fallback: baseClass
27247
- } } };
27248
- if (gapFrom) props.style = { gap: { $bind: {
27249
- from: gapFrom,
27250
- transforms: [{
27251
- id: "boxStyles.semanticGapValue",
27252
- options: { fallback: gapFallback }
27253
- }],
27254
- fallback: GAP_VALUE_MAP[gapFallback]
27255
- } } };
27256
- return el("div", props, [el("div", {
27257
- className: imageWrapperClassName,
27258
- style: { flexBasis: { $bind: {
27259
- from: ratioFrom,
27865
+ /** The shared two-column shell keeps Look hooks opt-in and absent for legacy content. */
27866
+ function responsiveTwoColumn(config) {
27867
+ return el("div", twoColumnProps(config), [twoColumnWrapper(config, "image", config.image), twoColumnWrapper(config, "text", config.text)]);
27868
+ }
27869
+ function twoColumnProps(config) {
27870
+ const base = `${config.containerClassName ?? "rb-flex rb-flex-col rb-md-flex-row"} ${config.gapFrom ? "" : config.gapClassName ?? "rb-gap-6"}`.trim();
27871
+ const fallback = config.gapFallback ?? "comfortable";
27872
+ return {
27873
+ ...config.lookSlots ? lookSlot("frame") : {},
27874
+ className: { $bind: {
27875
+ from: config.imagePositionFrom,
27260
27876
  transforms: [{
27261
- id: "ui.twoColumnFlexBasis",
27262
- options: { side: "image" }
27877
+ id: "ui.twoColumnContainerClass",
27878
+ options: {
27879
+ base,
27880
+ reverseClass: "rb-md-flex-row-reverse"
27881
+ }
27263
27882
  }],
27264
- fallback: "50%"
27265
- } } }
27266
- }, [image]), el("div", {
27267
- className: textWrapperClassName,
27883
+ fallback: base
27884
+ } },
27885
+ ...config.gapFrom ? { style: { gap: { $bind: {
27886
+ from: config.gapFrom,
27887
+ transforms: [{
27888
+ id: "boxStyles.semanticGapValue",
27889
+ options: { fallback }
27890
+ }],
27891
+ fallback: GAP_VALUE_MAP[fallback]
27892
+ } } } } : {}
27893
+ };
27894
+ }
27895
+ function twoColumnWrapper(config, side, child) {
27896
+ const className = side === "image" ? config.imageWrapperClassName ?? "rb-w-full rb-shrink-0" : config.textWrapperClassName ?? "rb-w-full rb-min-w-0 rb-flex-1";
27897
+ return el("div", {
27898
+ ...config.lookSlots ? lookSlot(side === "image" ? "media" : "copy") : {},
27899
+ className,
27268
27900
  style: { flexBasis: { $bind: {
27269
- from: ratioFrom,
27901
+ from: config.ratioFrom,
27270
27902
  transforms: [{
27271
27903
  id: "ui.twoColumnFlexBasis",
27272
- options: { side: "text" }
27904
+ options: { side }
27273
27905
  }],
27274
27906
  fallback: "50%"
27275
27907
  } } }
27276
- }, [text])]);
27908
+ }, [child]);
27277
27909
  }
27278
27910
  //#endregion
27279
27911
  //#region ../blocks/src/system/node/fragments/styledCard.ts
@@ -27460,6 +28092,47 @@ function sectionState(opts) {
27460
28092
  })]);
27461
28093
  }
27462
28094
  //#endregion
28095
+ //#region ../blocks/src/system/node/fragments/sectionHead.ts
28096
+ const recoverEmptyHeadingWhenActive = {
28097
+ kind: "recover-empty-when-active",
28098
+ placeholder: "Add heading"
28099
+ };
28100
+ const recoverEmptyDescriptionWhenActive = {
28101
+ kind: "recover-empty-when-active",
28102
+ placeholder: "Add description"
28103
+ };
28104
+ function sectionHeaderLayoutNodes(options = {}) {
28105
+ const headingNode = text({
28106
+ as: "h2",
28107
+ ...lookSlot("heading")
28108
+ }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
28109
+ const descriptionNode = richText({
28110
+ className: "rb-prose rb-max-w-none",
28111
+ ...lookSlot("intro")
28112
+ }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
28113
+ if (options.splitClassName) return [el("div", {
28114
+ className: options.splitClassName,
28115
+ ...lookSlot("head")
28116
+ }, [headingNode, descriptionNode])];
28117
+ return [headingNode, descriptionNode];
28118
+ }
28119
+ /** Shared optional section copy. Existing consumers keep their description ID. */
28120
+ const sectionHeaderFields = (defaultHeading, introLabel = "Description") => [{
28121
+ id: "heading",
28122
+ type: "text",
28123
+ label: "Heading",
28124
+ description: "Main heading for the section",
28125
+ required: false,
28126
+ multiline: false,
28127
+ ...defaultHeading === void 0 ? {} : { defaultValue: defaultHeading }
28128
+ }, {
28129
+ id: "description",
28130
+ type: "richText",
28131
+ label: introLabel,
28132
+ description: "Optional introductory text",
28133
+ required: false
28134
+ }];
28135
+ //#endregion
27463
28136
  //#region ../blocks/src/system/fragments/types.ts
27464
28137
  const FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
27465
28138
  const FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;
@@ -27792,6 +28465,7 @@ const bodyCopyFragment = defineFragment({
27792
28465
  ],
27793
28466
  layout: stack({
27794
28467
  gap: "md",
28468
+ ...lookSlot("copy"),
27795
28469
  className: "body-copy-container",
27796
28470
  align: { $bind: {
27797
28471
  from: "content.alignment",
@@ -27800,6 +28474,7 @@ const bodyCopyFragment = defineFragment({
27800
28474
  } }
27801
28475
  }, [text({
27802
28476
  as: "h2",
28477
+ ...lookSlot("heading"),
27803
28478
  className: { $bind: {
27804
28479
  from: "content.alignment",
27805
28480
  transforms: [{
@@ -27808,14 +28483,22 @@ const bodyCopyFragment = defineFragment({
27808
28483
  }],
27809
28484
  fallback: "body-copy-heading"
27810
28485
  } }
27811
- }, when("content.heading"), bind("content.heading")), richText({ className: { $bind: {
27812
- from: "content.alignment",
27813
- transforms: [{
27814
- id: "ui.bodyClassFromAlignment",
27815
- options: { base: "body-copy-body rb-prose rb-max-w-none" }
27816
- }],
27817
- fallback: "body-copy-body rb-prose rb-max-w-none"
27818
- } } }, bind("content.body"))])
28486
+ }, when("content.heading", { authoringPresence: {
28487
+ kind: "recover-empty-when-active",
28488
+ placeholder: "Add heading"
28489
+ } }), bind("content.heading")), richText({
28490
+ ...lookSlot("item-body"),
28491
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
28492
+ lookSlots: { $bind: { from: "content._lookSlots" } },
28493
+ className: { $bind: {
28494
+ from: "content.alignment",
28495
+ transforms: [{
28496
+ id: "ui.bodyClassFromAlignment",
28497
+ options: { base: "body-copy-body rb-prose rb-max-w-none" }
28498
+ }],
28499
+ fallback: "body-copy-body rb-prose rb-max-w-none"
28500
+ } }
28501
+ }, bind("content.body"))])
27819
28502
  });
27820
28503
  //#endregion
27821
28504
  //#region ../blocks/src/system/fragments/library/heroCopy.ts
@@ -28831,8 +29514,19 @@ const formCopyFragment = defineFragment({
28831
29514
  }],
28832
29515
  layout: [text({
28833
29516
  as: "h2",
29517
+ ...lookSlot("heading"),
28834
29518
  className: "form-copy-title"
28835
- }, when("content.title"), bind("content.title")), richText({ className: "form-copy-intro rb-prose rb-max-w-none" }, when("content.intro"), bind("content.intro"))]
29519
+ }, when("content.title", { authoringPresence: {
29520
+ kind: "recover-empty-when-active",
29521
+ placeholder: "Add heading"
29522
+ } }), bind("content.title")), richText({
29523
+ className: "form-copy-intro rb-prose rb-max-w-none",
29524
+ ...lookSlot("intro"),
29525
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } }
29526
+ }, when("content.intro", { authoringPresence: {
29527
+ kind: "recover-empty-when-active",
29528
+ placeholder: "Add introduction"
29529
+ } }), bind("content.intro"))]
28836
29530
  });
28837
29531
  //#endregion
28838
29532
  //#region ../blocks/src/system/helpers/api-bindings.ts
@@ -28881,6 +29575,7 @@ const formEmbedFragment = defineFragment({
28881
29575
  }
28882
29576
  ],
28883
29577
  layout: [form(withApiBindings({
29578
+ lookSlots: { $bind: { from: "content._lookSlots" } },
28884
29579
  spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
28885
29580
  submitLabel: { $bind: { from: "submitLabel" } },
28886
29581
  successMessage: { $bind: { from: "successMessage" } }
@@ -29134,8 +29829,18 @@ const newsletterCopyFragment = defineFragment({
29134
29829
  }],
29135
29830
  layout: [text({
29136
29831
  as: "h2",
29137
- className: "newsletter-copy-title"
29138
- }, when("content.title"), bind("content.title")), richText({ className: "newsletter-copy-subtitle rb-prose rb-max-w-none" }, when("content.subtitle"), bind("content.subtitle"))]
29832
+ className: "newsletter-copy-title",
29833
+ ...lookSlot("heading")
29834
+ }, when("content.title", { authoringPresence: {
29835
+ kind: "recover-empty-when-active",
29836
+ placeholder: "Add heading"
29837
+ } }), bind("content.title")), richText({
29838
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none",
29839
+ ...lookSlot("intro")
29840
+ }, when("content.subtitle", { authoringPresence: {
29841
+ kind: "recover-empty-when-active",
29842
+ placeholder: "Add introduction"
29843
+ } }), bind("content.subtitle"))]
29139
29844
  });
29140
29845
  //#endregion
29141
29846
  //#region ../blocks/src/system/fragments/library/newsletterForm.ts
@@ -29203,6 +29908,7 @@ const newsletterFormFragment = defineFragment({
29203
29908
  }
29204
29909
  ],
29205
29910
  layout: [el("newsletter-form", withApiBindings({
29911
+ lookSlots: { $bind: { from: "content._lookSlots" } },
29206
29912
  source: { $bind: {
29207
29913
  from: "mailingListSource",
29208
29914
  fallback: "block"
@@ -30695,18 +31401,11 @@ const introBlockDefinition = { manifest: createBlockManifest({
30695
31401
  //#endregion
30696
31402
  //#region ../blocks/src/system/blocks/body-text.ts
30697
31403
  const bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
30698
- const proseLayout = styledSection({
30699
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
30700
- spacing: "medium",
30701
- baseClass: ""
30702
- });
30703
- const introLayout = styledSection({
30704
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
30705
- spacing: "medium",
30706
- baseClass: ""
30707
- });
30708
- const narrowLayout = styledSection({
30709
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
31404
+ const bodyTextLayout = styledSection({
31405
+ children: stack({
31406
+ className: "rb-container",
31407
+ ...lookSlot("frame")
31408
+ }, bodyCopyComposition.layout),
30710
31409
  spacing: "medium",
30711
31410
  baseClass: ""
30712
31411
  });
@@ -30720,11 +31419,11 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
30720
31419
  fragment: bodyCopyFragment,
30721
31420
  fieldPriority: 0
30722
31421
  }],
30723
- layout: proseLayout,
31422
+ layout: bodyTextLayout,
30724
31423
  variants: {
30725
- prose: proseLayout,
30726
- intro: introLayout,
30727
- narrow: narrowLayout
31424
+ prose: bodyTextLayout,
31425
+ intro: bodyTextLayout,
31426
+ narrow: bodyTextLayout
30728
31427
  },
30729
31428
  variantMeaning: { kind: "arrangement" },
30730
31429
  defaultVariant: "prose",
@@ -31172,6 +31871,52 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
31172
31871
  styleTokens: { spacing: "md" }
31173
31872
  }) };
31174
31873
  //#endregion
31874
+ //#region ../blocks/src/system/runtime/lookSurfaces.ts
31875
+ const isPlainObject$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
31876
+ const lookListPresentationSchemaShape = {
31877
+ sectionAction: z.object({
31878
+ label: z.string(),
31879
+ href: z.string()
31880
+ }).optional(),
31881
+ actionSize: z.enum([
31882
+ "sm",
31883
+ "md",
31884
+ "lg"
31885
+ ]).optional(),
31886
+ itemActionStyle: z.enum(["button", "link"]).optional(),
31887
+ itemRoles: z.object({
31888
+ container: z.enum([
31889
+ "card",
31890
+ "statement",
31891
+ "highlight"
31892
+ ]).optional(),
31893
+ items: z.enum([
31894
+ "card",
31895
+ "statement",
31896
+ "highlight"
31897
+ ]).optional(),
31898
+ at: z.partialRecord(z.enum([
31899
+ "first",
31900
+ "last",
31901
+ "middle",
31902
+ "odd",
31903
+ "even"
31904
+ ]), z.enum([
31905
+ "card",
31906
+ "statement",
31907
+ "highlight"
31908
+ ])).optional()
31909
+ }).optional(),
31910
+ roleSurfaces: z.record(z.enum([
31911
+ "card",
31912
+ "statement",
31913
+ "highlight"
31914
+ ]), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
31915
+ panelHeading: z.string().optional(),
31916
+ lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
31917
+ itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject$1(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
31918
+ };
31919
+ //#endregion
31175
31920
  //#region ../blocks/src/contracts/runtime.ts
31176
31921
  function decodeSuccess(value) {
31177
31922
  return {
@@ -31278,6 +32023,7 @@ const formFieldGroupSchema = z.discriminatedUnion("type", [z.object({
31278
32023
  fields: z.tuple([formFieldSchema, formFieldSchema])
31279
32024
  })]);
31280
32025
  const formSourceSchema = z.object({
32026
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
31281
32027
  value: formRecordSchema.optional(),
31282
32028
  siteId: z.string().optional(),
31283
32029
  apiBaseUrl: z.string().optional(),
@@ -31287,6 +32033,7 @@ const formSourceSchema = z.object({
31287
32033
  spamProtectionEnabled: z.boolean().optional()
31288
32034
  });
31289
32035
  const formDisplaySchema = z.object({
32036
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
31290
32037
  kind: z.literal("form"),
31291
32038
  state: z.enum(["missing", "ready"]),
31292
32039
  className: z.string().nullable(),
@@ -31307,17 +32054,30 @@ z.object({
31307
32054
  });
31308
32055
  function buildFormDisplay(source) {
31309
32056
  const form = source.value ?? null;
31310
- const fields = form?.schemaJson?.fields;
31311
- const groups = Array.isArray(fields) ? groupFormFields(fields) : [];
32057
+ const fields = formDisplayFields(form);
31312
32058
  return {
31313
32059
  kind: "form",
31314
- state: form ? "ready" : "missing",
32060
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
32061
+ state: fields.state,
31315
32062
  className: source.className ?? null,
31316
- formId: form?.id ?? null,
32063
+ formId: fields.formId,
31317
32064
  submitLabel: source.submitLabel?.trim() || "Submit",
31318
32065
  successMessage: source.successMessage ?? null,
31319
32066
  form,
31320
- groups
32067
+ groups: fields.groups
32068
+ };
32069
+ }
32070
+ function formDisplayFields(form) {
32071
+ if (!form) return {
32072
+ state: "missing",
32073
+ formId: null,
32074
+ groups: []
32075
+ };
32076
+ const fields = form.schemaJson?.fields;
32077
+ return {
32078
+ state: "ready",
32079
+ formId: form.id,
32080
+ groups: Array.isArray(fields) ? groupFormFields(fields) : []
31321
32081
  };
31322
32082
  }
31323
32083
  const formBlockRuntime = defineProgressiveBlockRuntime({
@@ -31340,18 +32100,27 @@ function fragmentLayoutNode$1(layout) {
31340
32100
  function isNodeDefinitionArray$1(layout) {
31341
32101
  return Array.isArray(layout);
31342
32102
  }
31343
- const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
32103
+ const copyLayout = props(lookSlot("head"))(fragmentLayoutNode$1(formCopyFragment.layout));
32104
+ const embedLayout$1 = fragmentLayoutNode$1(formEmbedFragment.layout);
31344
32105
  const formSurface = styledContainer({
32106
+ rootProps: lookSlot("panel"),
31345
32107
  bindFrom: "_containerStyles",
31346
32108
  constrainWidth: false,
31347
32109
  baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
31348
- children: fragmentLayoutNode$1(formEmbedFragment.layout)
32110
+ children: embedLayout$1
31349
32111
  });
31350
32112
  function createFormLayout(variant) {
31351
32113
  if (variant === "two-column") return styledSection({
31352
- 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({
32114
+ children: el("div", {
32115
+ className: "rb-container",
32116
+ ...lookSlot("layout")
32117
+ }, [el("div", {
32118
+ className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start",
32119
+ ...lookSlot("frame")
32120
+ }, [stack({
31353
32121
  gap: "md",
31354
- className: "rb-form-copy-column"
32122
+ className: "rb-form-copy-column",
32123
+ ...lookSlot("copy")
31355
32124
  }, [copyLayout]), formSurface])]),
31356
32125
  baseClass: "",
31357
32126
  spacing: "medium",
@@ -31379,6 +32148,15 @@ const formManifest = createBlockManifest({
31379
32148
  description: "Renders a saved form definition with server-side submit.",
31380
32149
  includeContainerStyles: true,
31381
32150
  fragments: [{ fragment: formCopyFragment }, { fragment: formEmbedFragment }],
32151
+ additionalFields: [{
32152
+ id: "archFrame",
32153
+ type: "boolean",
32154
+ label: "Arch frame",
32155
+ ui: {
32156
+ intent: "display",
32157
+ hidden: true
32158
+ }
32159
+ }],
31382
32160
  layout: formLayout,
31383
32161
  variants: {
31384
32162
  default: formLayout,
@@ -32134,7 +32912,7 @@ const heroTitleLengthThresholds = {
32134
32912
  maxWords: 11
32135
32913
  }
32136
32914
  };
32137
- function isPlainObject$1(value) {
32915
+ function isPlainObject(value) {
32138
32916
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
32139
32917
  }
32140
32918
  function readString(obj, key) {
@@ -32143,7 +32921,7 @@ function readString(obj, key) {
32143
32921
  }
32144
32922
  function resolveGeneratedHeroLayoutStyles(content) {
32145
32923
  const raw = content._heroLayoutStyles;
32146
- return isPlainObject$1(raw) ? raw : null;
32924
+ return isPlainObject(raw) ? raw : null;
32147
32925
  }
32148
32926
  function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
32149
32927
  const explicitValue = readString(content, fallbackKey);
@@ -32201,7 +32979,7 @@ const heroContentWrapperClassTransform = {
32201
32979
  summary: "Resolve hero content wrapper className from alignment + max width controls",
32202
32980
  schema: z.object({ base: z.string().optional() }),
32203
32981
  run: (value, options, context) => {
32204
- const content = isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {};
32982
+ const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
32205
32983
  const alignment = resolveHeroContentAlignment(content);
32206
32984
  const maxWidth = resolveHeroContentMaxWidth(content);
32207
32985
  const typographyScale = resolveHeroTypographyScale(content);
@@ -32223,7 +33001,7 @@ const heroCtaJustifyTransform = {
32223
33001
  kind: "string",
32224
33002
  summary: "Map hero contentAlignment to CTA row justify value",
32225
33003
  run: (value, _options, context) => {
32226
- const alignment = resolveHeroContentAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
33004
+ const alignment = resolveHeroContentAlignment(isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {});
32227
33005
  return alignment === "left" ? "start" : alignment === "right" ? "end" : "center";
32228
33006
  }
32229
33007
  };
@@ -32232,7 +33010,7 @@ const heroStackJustifyFromVerticalAlignmentTransform = {
32232
33010
  kind: "string",
32233
33011
  summary: "Map hero verticalAlignment to stack justify value",
32234
33012
  run: (value, _options, context) => {
32235
- const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
33013
+ const vertical = resolveHeroVerticalAlignment(isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {});
32236
33014
  return vertical === "top" ? "start" : vertical === "bottom" ? "end" : "center";
32237
33015
  }
32238
33016
  };
@@ -32242,7 +33020,7 @@ const heroGridClassFromVerticalAlignmentTransform = {
32242
33020
  summary: "Append align-items class for hero split layouts based on verticalAlignment",
32243
33021
  schema: z.object({ base: z.string() }),
32244
33022
  run: (value, options, context) => {
32245
- const vertical = resolveHeroVerticalAlignment(isPlainObject$1(value) ? value : isPlainObject$1(context.data) ? context.data : {});
33023
+ const vertical = resolveHeroVerticalAlignment(isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {});
32246
33024
  const itemsClass = vertical === "top" ? "rb-items-start" : vertical === "bottom" ? "rb-items-end" : "rb-items-center";
32247
33025
  return joinClasses$1([options.base, itemsClass]);
32248
33026
  }
@@ -32530,6 +33308,25 @@ function heroHeadlineText(content, policy) {
32530
33308
  return policy === "look" ? inlineTextToPlainText(coerceInlineTextWithFallback(content.headlineInline, plain)).trim() : plain?.trim() ?? "";
32531
33309
  }
32532
33310
  //#endregion
33311
+ //#region ../blocks/src/system/transforms/registry/footerArrangement.ts
33312
+ const footerBrandArrangementTransform = {
33313
+ id: "layout.footerBrandArrangement",
33314
+ kind: "string",
33315
+ run: (value) => {
33316
+ const module = asPartialObject(value);
33317
+ return module?.kind === "brand" ? module.slots ? "centred" : "row" : void 0;
33318
+ }
33319
+ };
33320
+ const footerModuleInkStyleTransform = {
33321
+ id: "layout.footerModuleInkStyle",
33322
+ kind: "formatter",
33323
+ run: (value, options) => value === "centred" ? void 0 : textColorStyle(asPartialObject(options)?.opacity === 70 ? "text/70" : "text/80")
33324
+ };
33325
+ /** A centred base without authored bar paint inherits its measured surface line. */
33326
+ function footerBottomBarBorderColorStyle(footer) {
33327
+ return footer?.variant === "centred" && !footer.bottomBar ? { borderColor: "var(--rb-surface-line-color)" } : borderColorStyle(footer?.bottomBar?.borderTop?.colorToken ?? "border");
33328
+ }
33329
+ //#endregion
32533
33330
  //#region ../blocks/src/system/runtime/header/runtimeContract.ts
32534
33331
  const headerScrollRuntimeSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("none") }), z.object({ kind: z.literal("threshold") })]);
32535
33332
  z.object({ scroll: headerScrollRuntimeSchema });
@@ -32761,6 +33558,7 @@ const footerRootStyleTransform = {
32761
33558
  }
32762
33559
  }
32763
33560
  styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
33561
+ if (footer?.variant === "centred") styleParts.push(surfaceInkStyles(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate), context.theme.palette));
32764
33562
  styleParts.push(borderColorStyle("border"));
32765
33563
  return mergeStyles(...styleParts);
32766
33564
  }
@@ -32822,7 +33620,7 @@ const footerBottomBarStyleTransform = {
32822
33620
  run: (value, _options, context) => {
32823
33621
  const footer = asPartialObject(value);
32824
33622
  const bottomBar = footer?.bottomBar;
32825
- 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));
33623
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : void 0, footerBottomBarBorderColorStyle(footer), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
32826
33624
  }
32827
33625
  };
32828
33626
  function footerBottomBarForegroundStyle(footer, palette) {
@@ -32844,62 +33642,15 @@ function measuredFooterBackdrop(footer, palette) {
32844
33642
  const foreground = resolveFooterRootForeground(footer, palette);
32845
33643
  return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
32846
33644
  }
32847
- const footerSplitMainClassTransform = {
32848
- id: "layout.footerSplitMainClass",
32849
- kind: "string",
32850
- summary: "Compose split-footer main row classes from footer logo placement",
32851
- schema: z.object({
32852
- base: z.string().optional(),
32853
- reverseClass: z.string().optional()
32854
- }),
32855
- run: (value, options) => {
32856
- const placement = asPartialObject(value)?.placement ?? "right";
32857
- const shouldPlaceLogoFirst = placement === "left" || placement === "above";
32858
- 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";
32859
- return joinClasses([options.base ?? baseClass, shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null]);
32860
- }
32861
- };
32862
33645
  const footerLogoClassTransform = {
32863
33646
  id: "layout.footerLogoClass",
32864
33647
  kind: "string",
32865
33648
  summary: "Compose split-footer logo wrapper classes from footer.logo controls",
32866
- schema: z.object({
32867
- base: z.string().optional(),
32868
- requireExplicitShow: z.boolean().optional()
32869
- }),
33649
+ schema: z.object({ base: z.string().optional() }),
32870
33650
  run: (value, options) => {
32871
- const logo = asPartialObject(value);
32872
- const align = logo?.align ?? "end";
32873
- const hiddenClass = options.requireExplicitShow ? logo?.showLogo === true ? null : "rb-hidden" : logo?.showLogo === false ? "rb-hidden" : null;
33651
+ const align = asPartialObject(value)?.align ?? "end";
32874
33652
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
32875
- return joinClasses([
32876
- 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",
32877
- selfAlignClass,
32878
- hiddenClass
32879
- ]);
32880
- }
32881
- };
32882
- const footerLogoMediaClassTransform = {
32883
- id: "layout.footerLogoMediaClass",
32884
- kind: "string",
32885
- summary: "Compose footer logo image classes from size controls",
32886
- schema: z.object({ base: z.string().optional() }),
32887
- run: (_value, options) => {
32888
- return joinClasses([options.base ?? "rb-w-auto"]);
32889
- }
32890
- };
32891
- function shouldShowFooterLogoText(footer) {
32892
- if (!footer) return false;
32893
- const explicit = footer.logo?.showLogoText;
32894
- const legacy = footer.showLogoText === true;
32895
- return explicit === true || explicit === void 0 && legacy;
32896
- }
32897
- const footerLogoTextVisibleTransform = {
32898
- id: "layout.footerLogoTextVisible",
32899
- kind: "formatter",
32900
- summary: "Return whether footer logo text should render",
32901
- run: (value) => {
32902
- return shouldShowFooterLogoText(asPartialObject(value));
33653
+ 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]);
32903
33654
  }
32904
33655
  };
32905
33656
  function extractBackgroundColorToken(background, fallback) {
@@ -32918,13 +33669,12 @@ const layoutTransforms = [
32918
33669
  headerRootStyleTransform,
32919
33670
  headerSectionBackgroundTransform,
32920
33671
  footerRootStyleTransform,
33672
+ footerModuleInkStyleTransform,
33673
+ footerBrandArrangementTransform,
32921
33674
  footerBottomBarClassTransform,
32922
33675
  footerBottomBarContainerClassTransform,
32923
33676
  footerBottomBarStyleTransform,
32924
- footerSplitMainClassTransform,
32925
- footerLogoClassTransform,
32926
- footerLogoMediaClassTransform,
32927
- footerLogoTextVisibleTransform
33677
+ footerLogoClassTransform
32928
33678
  ];
32929
33679
  //#endregion
32930
33680
  //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
@@ -33420,7 +34170,14 @@ const footerNavGroupsLayout = stack({
33420
34170
  }, [text({
33421
34171
  as: "h3",
33422
34172
  className: "rb-label",
33423
- style: textColorStyle("text/70")
34173
+ "data-slot": { $bind: { from: "content.footerRuntime.slots.group-label" } },
34174
+ style: { $bind: {
34175
+ from: "content.footerRuntime.arrangement",
34176
+ transforms: [{
34177
+ id: "layout.footerModuleInkStyle",
34178
+ options: { opacity: 70 }
34179
+ }]
34180
+ } }
33424
34181
  }, when("group.label"), bind("group.label")), stack({
33425
34182
  gap: "sm",
33426
34183
  align: "start",
@@ -33450,6 +34207,14 @@ const footerMailingListBindings = {
33450
34207
  targeting: { $bind: { from: "module.engagement.runtime.targeting" } }
33451
34208
  };
33452
34209
  const footerSpamProtectionBinding = { spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } } };
34210
+ const brandMedia = media({ className: "rb-h-10 rb-w-auto" }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
34211
+ id: "layout.chromeLogo",
34212
+ options: { surface: "footer-root" }
34213
+ }] }));
34214
+ const brandTitle = text({
34215
+ as: "strong",
34216
+ className: "footer-logo-text rb-nav-text"
34217
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }));
33453
34218
  const brandLogo = link({
33454
34219
  href: "/",
33455
34220
  className: { $bind: {
@@ -33460,20 +34225,39 @@ const brandLogo = link({
33460
34225
  }],
33461
34226
  fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
33462
34227
  } }
33463
- }, [media({ className: { $bind: {
33464
- from: "$root.theme.footer.logo",
33465
- transforms: [{
33466
- id: "layout.footerLogoMediaClass",
33467
- options: { base: "rb-h-10 rb-w-auto" }
33468
- }],
33469
- fallback: "rb-h-10 rb-w-auto"
33470
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
33471
- id: "layout.chromeLogo",
33472
- options: { surface: "footer-root" }
33473
- }] })), text({
33474
- as: "strong",
33475
- className: "footer-logo-text rb-nav-text"
33476
- }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
34228
+ }, [brandMedia, brandTitle], (node) => ({
34229
+ ...node,
34230
+ $when: {
34231
+ when: {
34232
+ from: "module",
34233
+ transforms: [{ id: "layout.footerBrandArrangement" }]
34234
+ },
34235
+ equals: "row"
34236
+ }
34237
+ }));
34238
+ const centredBrand = stack({
34239
+ gap: "md",
34240
+ align: "center"
34241
+ }, [link({
34242
+ href: "/",
34243
+ "data-slot": { $bind: { from: "module.slots.media" } },
34244
+ className: "footer-logo rb-inline-flex rb-items-center rb-no-underline"
34245
+ }, [brandMedia], when("module.slots.media")), {
34246
+ ...brandTitle,
34247
+ props: {
34248
+ ...brandTitle.props,
34249
+ "data-slot": { $bind: { from: "module.slots.heading" } }
34250
+ }
34251
+ }], (node) => ({
34252
+ ...node,
34253
+ $when: {
34254
+ when: {
34255
+ from: "module",
34256
+ transforms: [{ id: "layout.footerBrandArrangement" }]
34257
+ },
34258
+ equals: "centred"
34259
+ }
34260
+ }));
33477
34261
  const navigation = stack({
33478
34262
  gap: "md",
33479
34263
  className: "rb-w-full"
@@ -33498,14 +34282,18 @@ const address = text({
33498
34282
  }, when("module.kind", { equals: "business-address" }), bind("module.address"));
33499
34283
  const contact = stack({
33500
34284
  gap: "sm",
33501
- className: "rb-items-start"
34285
+ className: { $bind: {
34286
+ from: "module.contactClassName",
34287
+ fallback: "rb-items-start"
34288
+ } }
33502
34289
  }, [link({
33503
34290
  href: { $bind: { from: "contactLink.href" } },
33504
34291
  className: "rb-nav-text rb-break-words transition-theme-standard"
33505
34292
  }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
33506
34293
  const hours = stack({
33507
34294
  gap: "sm",
33508
- className: "rb-w-full"
34295
+ className: "rb-w-full",
34296
+ "data-slot": { $bind: { from: "module.slots.schedule" } }
33509
34297
  }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
33510
34298
  as: "span",
33511
34299
  className: "rb-label"
@@ -33516,7 +34304,10 @@ const hours = stack({
33516
34304
  as: "p",
33517
34305
  className: "rb-caption rb-opacity-70"
33518
34306
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
33519
- const socials = inline({ className: "rb-footer-socials" }, [link({
34307
+ const socials = inline({
34308
+ className: "rb-footer-socials",
34309
+ "data-slot": { $bind: { from: "module.slots.social" } }
34310
+ }, [link({
33520
34311
  href: { $bind: { from: "social.href" } },
33521
34312
  target: "_blank",
33522
34313
  rel: "noreferrer noopener",
@@ -33525,7 +34316,14 @@ const socials = inline({ className: "rb-footer-socials" }, [link({
33525
34316
  }, [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" }));
33526
34317
  const authoredCopy = richText({
33527
34318
  className: "rb-prose rb-prose-sm rb-max-w-none",
33528
- style: textColorStyle("text/80")
34319
+ "data-slot": { $bind: { from: "module.slots.copy" } },
34320
+ style: { $bind: {
34321
+ from: "content.footerRuntime.arrangement",
34322
+ transforms: [{
34323
+ id: "layout.footerModuleInkStyle",
34324
+ options: { opacity: 80 }
34325
+ }]
34326
+ } }
33529
34327
  }, when("module.content"), bind("module.content", { transforms: [{
33530
34328
  id: "content.interpolateRichTextTokens",
33531
34329
  options: { tokens: ["year", "site_name"] }
@@ -33563,27 +34361,44 @@ const platformAttribution = el("div", {
33563
34361
  ], when("module.kind", { equals: "attribution" }));
33564
34362
  const footerGroup = stack({
33565
34363
  gap: "md",
33566
- align: "stretch",
34364
+ align: { $bind: {
34365
+ from: "group.align",
34366
+ fallback: "stretch"
34367
+ } },
33567
34368
  className: { $bind: {
33568
34369
  from: "group.className",
33569
34370
  fallback: "rb-min-w-0"
33570
34371
  } },
34372
+ "data-slot": { $bind: { from: "group.slot" } },
33571
34373
  "data-footer-group": { $bind: { from: "group.kind" } }
33572
34374
  }, [stack({
33573
34375
  gap: "md",
33574
- align: "start",
34376
+ align: { $bind: {
34377
+ from: "module.align",
34378
+ fallback: "start"
34379
+ } },
34380
+ className: { $bind: { from: "module.className" } },
33575
34381
  "data-preview-footer-module-id": { $bind: { from: "module.id" } }
33576
34382
  }, [
33577
34383
  text({
33578
34384
  as: "h2",
33579
34385
  className: "rb-label",
33580
- style: textColorStyle("text/70")
34386
+ "data-slot": { $bind: { from: "module.slots.group-label" } },
34387
+ style: { $bind: {
34388
+ from: "content.footerRuntime.arrangement",
34389
+ transforms: [{
34390
+ id: "layout.footerModuleInkStyle",
34391
+ options: { opacity: 70 }
34392
+ }]
34393
+ } }
33581
34394
  }, bind("module.heading"), when("module.heading")),
33582
34395
  brandLogo,
34396
+ centredBrand,
33583
34397
  navigation,
33584
34398
  stack({
33585
34399
  gap: "sm",
33586
- className: "rb-w-full"
34400
+ className: "rb-w-full",
34401
+ "data-slot": { $bind: { from: "module.slots.navigation" } }
33587
34402
  }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
33588
34403
  address,
33589
34404
  contact,
@@ -33596,10 +34411,12 @@ const footerGroup = stack({
33596
34411
  ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
33597
34412
  const footerMainRegion = stack({
33598
34413
  className: { $bind: { from: "region.className" } },
34414
+ "data-slot": { $bind: { from: "region.slot" } },
33599
34415
  "data-footer-region": { $bind: { from: "region.kind" } }
33600
34416
  }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
33601
34417
  const footerEngagementRegion = stack({
33602
34418
  className: { $bind: { from: "region.className" } },
34419
+ "data-slot": { $bind: { from: "region.slot" } },
33603
34420
  "data-footer-region": "engagement-row"
33604
34421
  }, [footerGroup], when("region.kind", { equals: "engagement-row" }), repeat("content.footerRuntime.regions", "region"));
33605
34422
  const footerBottomRegion = stack({ className: { $bind: {
@@ -33616,6 +34433,7 @@ const footerBottomRegion = stack({ className: { $bind: {
33616
34433
  from: "$root.theme.footer",
33617
34434
  transforms: [{ id: "layout.footerBottomBarStyle" }]
33618
34435
  } },
34436
+ "data-slot": { $bind: { from: "region.slot" } },
33619
34437
  "data-footer-region": "bottom"
33620
34438
  }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
33621
34439
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
@@ -33637,6 +34455,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
33637
34455
  transforms: [{ id: "layout.footerRootStyle" }],
33638
34456
  fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
33639
34457
  } },
34458
+ "data-arrangement": { $bind: { from: "content.footerRuntime.arrangementHook" } },
33640
34459
  "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
33641
34460
  }, [
33642
34461
  footerEngagementRegion,
@@ -35238,17 +36057,30 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35238
36057
  }],
35239
36058
  fallback: ""
35240
36059
  } };
35241
- const copyHeading = el("div", { className: titleClassNameFromAlignment }, [text({
36060
+ const copyHeading = el("div", {
36061
+ className: titleClassNameFromAlignment,
36062
+ ...lookSlot("head")
36063
+ }, [text({
35242
36064
  as: "p",
35243
- className: eyebrowClassName("rb-eyebrow heading-eyebrow")
35244
- }, when("content.eyebrow"), bind("content.eyebrow")), text({ as: "h2" }, bind("content.title"))], when("content.title"));
35245
- 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"))]);
35246
- 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" }, [
35247
- copyHeading,
35248
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
35249
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
35250
- ]);
36065
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
36066
+ ...lookSlot("eyebrow")
36067
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
36068
+ as: "h2",
36069
+ ...lookSlot("heading")
36070
+ }, bind("content.title"))], when("content.title"));
36071
+ const textContentNodes = (className) => {
36072
+ const props = {
36073
+ className,
36074
+ ...lookSlot("intro"),
36075
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
36076
+ lookSlots: { $bind: { from: "content._lookSlots" } }
36077
+ };
36078
+ return [styledCard([richText(props, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText(props, when("content.wrapTextInCard", { not: true }), bind("content.text"))];
36079
+ };
36080
+ const defaultTextColumn = el("div", {}, textContentNodes("rb-prose rb-max-w-none"));
36081
+ 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)]);
35251
36082
  const defaultImageCommonProps = {
36083
+ ...lookSlot("photo"),
35252
36084
  className: { $bind: {
35253
36085
  from: "content.imageShape",
35254
36086
  transforms: [{
@@ -35288,6 +36120,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35288
36120
  slidesToShow: 1
35289
36121
  }, [media(defaultImageCommonProps, bind("item.image"), repeat("content.images", "item"))]);
35290
36122
  const defaultImagesLayout = el("div", {}, [responsiveTwoColumn({
36123
+ lookSlots: true,
35291
36124
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
35292
36125
  text: defaultTextColumn,
35293
36126
  ratioFrom: "content.ratio",
@@ -35299,6 +36132,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35299
36132
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1"
35300
36133
  })], whenImagesLength(0, { not: true }));
35301
36134
  const bioImagesLayout = el("div", {}, [responsiveTwoColumn({
36135
+ lookSlots: true,
35302
36136
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
35303
36137
  text: bioTextColumn,
35304
36138
  ratioFrom: "content.ratio",
@@ -35309,15 +36143,15 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35309
36143
  imageWrapperClassName: "rb-w-full rb-shrink-0",
35310
36144
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
35311
36145
  })], whenImagesLength(0, { not: true }));
35312
- 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));
35313
- const bioTextOnlyLayout = el("div", { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" }, [
35314
- text({
35315
- as: "h2",
35316
- className: titleClassNameFromAlignment
35317
- }, when("content.title"), bind("content.title")),
35318
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
35319
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
35320
- ], whenImagesLength(0));
36146
+ const defaultTextOnlyLayout = el("div", lookSlot("copy"), textContentNodes("rb-prose rb-max-w-none"), whenImagesLength(0));
36147
+ const bioTextOnlyLayout = el("div", {
36148
+ className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5",
36149
+ ...lookSlot("copy")
36150
+ }, [text({
36151
+ as: "h2",
36152
+ className: titleClassNameFromAlignment,
36153
+ ...lookSlot("heading")
36154
+ }, when("content.title"), bind("content.title")), ...textContentNodes(bodyClassNameFromAlignment)], whenImagesLength(0));
35321
36155
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
35322
36156
  const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
35323
36157
  const defaultLayout = styledSection({
@@ -35341,9 +36175,31 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
35341
36175
  }),
35342
36176
  baseClass: "",
35343
36177
  spacing: "medium"
36178
+ }),
36179
+ "circle-beside": styledSection({
36180
+ baseClass: "",
36181
+ spacing: "medium",
36182
+ children: styledContainer({ children: el("div", lookSlot("frame"), [el("div", lookSlot("media"), [
36183
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(1)),
36184
+ el("div", {}, [el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))], whenImagesLength(0, { not: true })),
36185
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(0))
36186
+ ]), el("div", lookSlot("copy"), [el("div", lookSlot("head"), [text({
36187
+ as: "p",
36188
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
36189
+ ...lookSlot("eyebrow")
36190
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
36191
+ as: "h2",
36192
+ ...lookSlot("heading")
36193
+ }, bind("content.title"), when("content.title", { authoringPresence: {
36194
+ kind: "recover-empty-when-active",
36195
+ placeholder: "Add heading"
36196
+ } }))]), defaultTextColumn])]) })
35344
36197
  })
35345
36198
  },
35346
- variantMeaning: { kind: "arrangement" },
36199
+ variantMeaning: {
36200
+ kind: "arrangement",
36201
+ lookOnlyKeys: ["circle-beside"]
36202
+ },
35347
36203
  defaultVariant: "default",
35348
36204
  variantOptions: {
35349
36205
  default: { label: "Default" },
@@ -36439,24 +37295,6 @@ const emptyStateField = {
36439
37295
  ui: { intent: "display" }
36440
37296
  };
36441
37297
  /**
36442
- * Section heading and description fields
36443
- */
36444
- const sectionHeaderFields = (defaultHeading) => [{
36445
- id: "heading",
36446
- type: "text",
36447
- label: "Heading",
36448
- description: "Main heading for the events section",
36449
- required: false,
36450
- multiline: false,
36451
- defaultValue: defaultHeading
36452
- }, {
36453
- id: "description",
36454
- type: "richText",
36455
- label: "Description",
36456
- description: "Optional introductory text",
36457
- required: false
36458
- }];
36459
- /**
36460
37298
  * Layout selection field with grid/stack options
36461
37299
  */
36462
37300
  const layoutField = {
@@ -36569,31 +37407,6 @@ function normalizeEventStaffMemberId(value) {
36569
37407
  return trimmed ? trimmed : null;
36570
37408
  }
36571
37409
  //#endregion
36572
- //#region ../blocks/src/system/blocks/events/shared/layout.ts
36573
- const recoverEmptyHeadingWhenActive = {
36574
- kind: "recover-empty-when-active",
36575
- placeholder: "Add heading"
36576
- };
36577
- const recoverEmptyDescriptionWhenActive = {
36578
- kind: "recover-empty-when-active",
36579
- placeholder: "Add description"
36580
- };
36581
- function eventSectionHeaderLayoutNodes(options = {}) {
36582
- const headingNode = text({
36583
- as: "h2",
36584
- ...lookSlot("heading")
36585
- }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
36586
- const descriptionNode = richText({
36587
- className: "rb-prose rb-max-w-none",
36588
- ...lookSlot("intro")
36589
- }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
36590
- if (options.splitClassName) return [el("div", {
36591
- className: options.splitClassName,
36592
- ...lookSlot("head")
36593
- }, [headingNode, descriptionNode])];
36594
- return [headingNode, descriptionNode];
36595
- }
36596
- //#endregion
36597
37410
  //#region ../blocks/src/system/blocks/shop.shared.ts
36598
37411
  /**
36599
37412
  * Public pass product for shop display
@@ -37018,19 +37831,14 @@ function buildCalendarViewport(input) {
37018
37831
  *
37019
37832
  * Sites don't store a locale, and every public word around a date is English,
37020
37833
  * so the only open question is which English conventions to follow: day or
37021
- * month first, and a 24 or 12-hour clock. The site's time zone is the one
37834
+ * month first. The site's time zone is the one
37022
37835
  * fact every site carries about where it is. It is the site's, never an
37023
37836
  * event's: a venue left at UTC must not turn a UK site's dates American.
37024
37837
  * Anywhere this can't place (UTC, the Americas, Asia) keeps US English, which
37025
37838
  * is what these helpers wrote before sites were placed at all.
37026
37839
  */
37027
37840
  function eventDateLocale(siteTimeZone) {
37028
- if (!siteTimeZone) return "en-US";
37029
- if (siteTimeZone === "Europe/Dublin") return "en-IE";
37030
- if (siteTimeZone.startsWith("Europe/")) return "en-GB";
37031
- if (siteTimeZone.startsWith("Australia/")) return "en-AU";
37032
- if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
37033
- return "en-US";
37841
+ return inferSiteDateLocale(siteTimeZone);
37034
37842
  }
37035
37843
  function formatEventCompactDateRail(isoTimestamp, options, letterCase = "capitals") {
37036
37844
  const locale = options?.locale ?? "en-US";
@@ -38738,7 +39546,7 @@ const eventSpotlightBlockDefinition = {
38738
39546
  ],
38739
39547
  icon: "Star",
38740
39548
  layout: [styledSection({
38741
- children: sectionContainer([...eventSectionHeaderLayoutNodes(), el("event-spotlight", {
39549
+ children: sectionContainer([...sectionHeaderLayoutNodes(), el("event-spotlight", {
38742
39550
  events: { $bind: { from: "data.events" } },
38743
39551
  layout: { $bind: {
38744
39552
  from: "content.layout",
@@ -38794,52 +39602,6 @@ const eventSpotlightBlockDefinition = {
38794
39602
  } }
38795
39603
  };
38796
39604
  //#endregion
38797
- //#region ../blocks/src/system/runtime/lookSurfaces.ts
38798
- const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
38799
- const lookListPresentationSchemaShape = {
38800
- sectionAction: z.object({
38801
- label: z.string(),
38802
- href: z.string()
38803
- }).optional(),
38804
- actionSize: z.enum([
38805
- "sm",
38806
- "md",
38807
- "lg"
38808
- ]).optional(),
38809
- itemActionStyle: z.enum(["button", "link"]).optional(),
38810
- itemRoles: z.object({
38811
- container: z.enum([
38812
- "card",
38813
- "statement",
38814
- "highlight"
38815
- ]).optional(),
38816
- items: z.enum([
38817
- "card",
38818
- "statement",
38819
- "highlight"
38820
- ]).optional(),
38821
- at: z.partialRecord(z.enum([
38822
- "first",
38823
- "last",
38824
- "middle",
38825
- "odd",
38826
- "even"
38827
- ]), z.enum([
38828
- "card",
38829
- "statement",
38830
- "highlight"
38831
- ])).optional()
38832
- }).optional(),
38833
- roleSurfaces: z.record(z.enum([
38834
- "card",
38835
- "statement",
38836
- "highlight"
38837
- ]), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
38838
- panelHeading: z.string().optional(),
38839
- lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
38840
- itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
38841
- };
38842
- //#endregion
38843
39605
  //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
38844
39606
  /** Invalid saved selections fail closed rather than widening discovery. */
38845
39607
  function resolveEventSelection(mode, value) {
@@ -39614,7 +40376,7 @@ const eventListingBlockDefinition = {
39614
40376
  children: styledContainer({
39615
40377
  rootType: "stack",
39616
40378
  rootProps: { gap: "lg" },
39617
- children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
40379
+ children: [...sectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
39618
40380
  readAuthority: { $bind: { from: "$root.readAuthority" } },
39619
40381
  events: { $bind: { from: "data.events" } },
39620
40382
  stage: { $bind: {
@@ -40054,7 +40816,7 @@ const eventCalendarLayout = [styledSection({
40054
40816
  gap: "lg",
40055
40817
  ...lookSlot("layout")
40056
40818
  },
40057
- children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
40819
+ children: [...sectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
40058
40820
  readAuthority: { $bind: { from: "$root.readAuthority" } },
40059
40821
  events: { $bind: { from: "data.events" } },
40060
40822
  effectiveListArrangementKey: { $bind: { from: "$root.effectiveListArrangementKey" } },
@@ -42010,6 +42772,511 @@ const embedBlockDefinition = {
42010
42772
  } }
42011
42773
  };
42012
42774
  //#endregion
42775
+ //#region ../blocks/src/system/blocks/image-gallery/fields.ts
42776
+ const imageGalleryFields = parseFieldDefinitions([
42777
+ ...sectionHeaderFields(void 0, "Intro"),
42778
+ {
42779
+ id: "images",
42780
+ type: "repeater",
42781
+ label: "Images",
42782
+ itemLabel: "Image",
42783
+ minItems: 0,
42784
+ maxItems: 24,
42785
+ ui: {
42786
+ repeaterPreset: "thumbnailGrid",
42787
+ thumbnailField: "image",
42788
+ thumbnailAltField: "caption",
42789
+ thumbnailLabelField: "caption",
42790
+ thumbnailCardDensity: "compact"
42791
+ },
42792
+ schema: { fields: [{
42793
+ id: "image",
42794
+ type: "media",
42795
+ label: "Image",
42796
+ required: true,
42797
+ mediaKinds: ["image"]
42798
+ }, {
42799
+ id: "caption",
42800
+ type: "text",
42801
+ label: "Caption",
42802
+ description: "Optional caption displayed below the image and used as the editor card label",
42803
+ maxLength: 200
42804
+ }] }
42805
+ },
42806
+ {
42807
+ id: "fullBleed",
42808
+ type: "boolean",
42809
+ label: "Full bleed",
42810
+ description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
42811
+ defaultValue: false,
42812
+ ui: {
42813
+ intent: "display",
42814
+ visibleWhen: {
42815
+ field: "variant",
42816
+ notIn: ["marquee"]
42817
+ }
42818
+ }
42819
+ },
42820
+ {
42821
+ id: "aspectRatio",
42822
+ type: "select",
42823
+ label: "Aspect ratio",
42824
+ description: "Crop images to a consistent aspect ratio.",
42825
+ defaultValue: "1/1",
42826
+ options: [
42827
+ {
42828
+ value: "auto",
42829
+ label: "Original"
42830
+ },
42831
+ {
42832
+ value: "1/1",
42833
+ label: "1:1 (Square)"
42834
+ },
42835
+ {
42836
+ value: "4/3",
42837
+ label: "4:3 (Standard)"
42838
+ },
42839
+ {
42840
+ value: "16/9",
42841
+ label: "16:9 (Widescreen)"
42842
+ },
42843
+ {
42844
+ value: "3/2",
42845
+ label: "3:2 (Classic)"
42846
+ },
42847
+ {
42848
+ value: "3/4",
42849
+ label: "3:4 (Portrait)"
42850
+ }
42851
+ ],
42852
+ ui: {
42853
+ intent: "display",
42854
+ visibleWhen: {
42855
+ field: "variant",
42856
+ notIn: ["masonry", "marquee"]
42857
+ }
42858
+ }
42859
+ },
42860
+ {
42861
+ id: "slidesToShow",
42862
+ type: "select",
42863
+ label: "Images per view (mobile)",
42864
+ description: "Number of images visible at once on small screens.",
42865
+ defaultValue: "1",
42866
+ options: [
42867
+ {
42868
+ value: "1",
42869
+ label: "One at a time"
42870
+ },
42871
+ {
42872
+ value: "2",
42873
+ label: "Two at a time"
42874
+ },
42875
+ {
42876
+ value: "3",
42877
+ label: "Three at a time"
42878
+ }
42879
+ ],
42880
+ ui: {
42881
+ intent: "display",
42882
+ visibleWhen: {
42883
+ field: "variant",
42884
+ equals: "carousel"
42885
+ }
42886
+ }
42887
+ },
42888
+ {
42889
+ id: "slidesToShowTablet",
42890
+ type: "select",
42891
+ label: "Images per view (tablet)",
42892
+ description: "Number of images visible on medium screens.",
42893
+ options: [
42894
+ {
42895
+ value: "",
42896
+ label: "Same as mobile"
42897
+ },
42898
+ {
42899
+ value: "1",
42900
+ label: "One at a time"
42901
+ },
42902
+ {
42903
+ value: "2",
42904
+ label: "Two at a time"
42905
+ },
42906
+ {
42907
+ value: "3",
42908
+ label: "Three at a time"
42909
+ }
42910
+ ],
42911
+ ui: {
42912
+ intent: "display",
42913
+ visibleWhen: {
42914
+ field: "variant",
42915
+ equals: "carousel"
42916
+ }
42917
+ }
42918
+ },
42919
+ {
42920
+ id: "slidesToShowDesktop",
42921
+ type: "select",
42922
+ label: "Images per view (desktop)",
42923
+ description: "Number of images visible on large screens.",
42924
+ options: [
42925
+ {
42926
+ value: "",
42927
+ label: "Same as tablet"
42928
+ },
42929
+ {
42930
+ value: "1",
42931
+ label: "One at a time"
42932
+ },
42933
+ {
42934
+ value: "2",
42935
+ label: "Two at a time"
42936
+ },
42937
+ {
42938
+ value: "3",
42939
+ label: "Three at a time"
42940
+ }
42941
+ ],
42942
+ ui: {
42943
+ intent: "display",
42944
+ visibleWhen: {
42945
+ field: "variant",
42946
+ equals: "carousel"
42947
+ }
42948
+ }
42949
+ },
42950
+ {
42951
+ id: "transition",
42952
+ type: "select",
42953
+ label: "Transition",
42954
+ description: "Animation style between slides.",
42955
+ defaultValue: "slide",
42956
+ options: [{
42957
+ value: "slide",
42958
+ label: "Slide"
42959
+ }, {
42960
+ value: "fade",
42961
+ label: "Fade"
42962
+ }],
42963
+ ui: {
42964
+ intent: "display",
42965
+ visibleWhen: {
42966
+ field: "variant",
42967
+ equals: "carousel"
42968
+ }
42969
+ }
42970
+ },
42971
+ {
42972
+ id: "showControls",
42973
+ type: "boolean",
42974
+ label: "Show arrows",
42975
+ defaultValue: true,
42976
+ ui: {
42977
+ intent: "behavior",
42978
+ visibleWhen: {
42979
+ field: "variant",
42980
+ equals: "carousel"
42981
+ }
42982
+ }
42983
+ },
42984
+ {
42985
+ id: "showDots",
42986
+ type: "boolean",
42987
+ label: "Show dots",
42988
+ defaultValue: false,
42989
+ ui: {
42990
+ intent: "behavior",
42991
+ visibleWhen: {
42992
+ field: "variant",
42993
+ equals: "carousel"
42994
+ }
42995
+ }
42996
+ },
42997
+ {
42998
+ id: "autoplay",
42999
+ type: "boolean",
43000
+ label: "Autoplay",
43001
+ defaultValue: false,
43002
+ ui: {
43003
+ intent: "behavior",
43004
+ visibleWhen: {
43005
+ field: "variant",
43006
+ equals: "carousel"
43007
+ }
43008
+ }
43009
+ },
43010
+ {
43011
+ id: "autoplayDelay",
43012
+ type: "select",
43013
+ label: "Autoplay delay",
43014
+ defaultValue: "5000",
43015
+ options: [
43016
+ {
43017
+ value: "3000",
43018
+ label: "3 seconds"
43019
+ },
43020
+ {
43021
+ value: "5000",
43022
+ label: "5 seconds"
43023
+ },
43024
+ {
43025
+ value: "7000",
43026
+ label: "7 seconds"
43027
+ },
43028
+ {
43029
+ value: "10000",
43030
+ label: "10 seconds"
43031
+ }
43032
+ ],
43033
+ ui: {
43034
+ intent: "behavior",
43035
+ visibleWhen: {
43036
+ field: "variant",
43037
+ equals: "carousel"
43038
+ }
43039
+ }
43040
+ },
43041
+ {
43042
+ id: "arrowVisibility",
43043
+ type: "select",
43044
+ label: "Arrow visibility",
43045
+ defaultValue: "always",
43046
+ options: [{
43047
+ value: "always",
43048
+ label: "Always visible"
43049
+ }, {
43050
+ value: "hover",
43051
+ label: "Show on hover"
43052
+ }],
43053
+ ui: {
43054
+ intent: "behavior",
43055
+ visibleWhen: {
43056
+ field: "variant",
43057
+ equals: "carousel"
43058
+ }
43059
+ }
43060
+ },
43061
+ {
43062
+ id: "loop",
43063
+ type: "boolean",
43064
+ label: "Loop slides",
43065
+ defaultValue: true,
43066
+ ui: {
43067
+ intent: "behavior",
43068
+ visibleWhen: {
43069
+ field: "variant",
43070
+ equals: "carousel"
43071
+ }
43072
+ }
43073
+ },
43074
+ {
43075
+ id: "marqueeDirection",
43076
+ type: "select",
43077
+ label: "Scroll direction",
43078
+ options: [{
43079
+ value: "left",
43080
+ label: "Left"
43081
+ }, {
43082
+ value: "right",
43083
+ label: "Right"
43084
+ }],
43085
+ defaultValue: "left",
43086
+ ui: {
43087
+ intent: "display",
43088
+ visibleWhen: {
43089
+ field: "variant",
43090
+ equals: "marquee"
43091
+ }
43092
+ }
43093
+ },
43094
+ {
43095
+ id: "marqueeSpeed",
43096
+ type: "select",
43097
+ label: "Scroll speed",
43098
+ options: [
43099
+ {
43100
+ value: "slow",
43101
+ label: "Slow (60s)"
43102
+ },
43103
+ {
43104
+ value: "medium",
43105
+ label: "Medium (40s)"
43106
+ },
43107
+ {
43108
+ value: "fast",
43109
+ label: "Fast (20s)"
43110
+ }
43111
+ ],
43112
+ defaultValue: "medium",
43113
+ ui: {
43114
+ intent: "display",
43115
+ visibleWhen: {
43116
+ field: "variant",
43117
+ equals: "marquee"
43118
+ }
43119
+ }
43120
+ },
43121
+ {
43122
+ id: "marqueePauseOnHover",
43123
+ type: "boolean",
43124
+ label: "Pause on hover",
43125
+ defaultValue: true,
43126
+ ui: {
43127
+ intent: "behavior",
43128
+ visibleWhen: {
43129
+ field: "variant",
43130
+ equals: "marquee"
43131
+ }
43132
+ }
43133
+ },
43134
+ {
43135
+ id: "marqueeImageSize",
43136
+ type: "select",
43137
+ label: "Image size",
43138
+ options: [
43139
+ {
43140
+ value: "sm",
43141
+ label: "Small (200px)"
43142
+ },
43143
+ {
43144
+ value: "md",
43145
+ label: "Medium (256px)"
43146
+ },
43147
+ {
43148
+ value: "lg",
43149
+ label: "Large (320px)"
43150
+ },
43151
+ {
43152
+ value: "xl",
43153
+ label: "Extra large (400px)"
43154
+ }
43155
+ ],
43156
+ defaultValue: "md",
43157
+ ui: {
43158
+ intent: "display",
43159
+ visibleWhen: {
43160
+ field: "variant",
43161
+ equals: "marquee"
43162
+ }
43163
+ }
43164
+ },
43165
+ {
43166
+ id: "imageFilter",
43167
+ type: "select",
43168
+ label: "Image filter",
43169
+ options: [
43170
+ {
43171
+ value: "none",
43172
+ label: "None"
43173
+ },
43174
+ {
43175
+ value: "grayscale",
43176
+ label: "Grayscale"
43177
+ },
43178
+ {
43179
+ value: "grayscale-hover-reveal",
43180
+ label: "Grayscale (color on hover)"
43181
+ },
43182
+ {
43183
+ value: "sepia",
43184
+ label: "Sepia"
43185
+ }
43186
+ ],
43187
+ defaultValue: "grayscale-hover-reveal",
43188
+ ui: { intent: "style" }
43189
+ },
43190
+ {
43191
+ id: "imageBorder",
43192
+ type: "group",
43193
+ label: "Image border",
43194
+ schema: { fields: [
43195
+ {
43196
+ id: "enabled",
43197
+ type: "boolean",
43198
+ label: "Show border",
43199
+ defaultValue: true
43200
+ },
43201
+ {
43202
+ id: "colorToken",
43203
+ type: "text",
43204
+ label: "Border color",
43205
+ defaultValue: "accent",
43206
+ ui: { widget: "backgroundColor" }
43207
+ },
43208
+ {
43209
+ id: "opacity",
43210
+ type: "number",
43211
+ label: "Border opacity",
43212
+ defaultValue: 30,
43213
+ ui: {
43214
+ min: 0,
43215
+ max: 100
43216
+ }
43217
+ },
43218
+ {
43219
+ id: "width",
43220
+ type: "select",
43221
+ label: "Border width",
43222
+ options: [
43223
+ {
43224
+ value: "1",
43225
+ label: "Thin (1px)"
43226
+ },
43227
+ {
43228
+ value: "2",
43229
+ label: "Medium (2px)"
43230
+ },
43231
+ {
43232
+ value: "3",
43233
+ label: "Thick (3px)"
43234
+ }
43235
+ ],
43236
+ defaultValue: "2"
43237
+ }
43238
+ ] },
43239
+ ui: { intent: "style" }
43240
+ },
43241
+ {
43242
+ id: "imageCorners",
43243
+ type: "select",
43244
+ label: "Image corners",
43245
+ options: [
43246
+ {
43247
+ value: "none",
43248
+ label: "Square"
43249
+ },
43250
+ {
43251
+ value: "sm",
43252
+ label: "Slightly rounded"
43253
+ },
43254
+ {
43255
+ value: "md",
43256
+ label: "Rounded"
43257
+ },
43258
+ {
43259
+ value: "lg",
43260
+ label: "More rounded"
43261
+ },
43262
+ {
43263
+ value: "xl",
43264
+ label: "Very rounded"
43265
+ },
43266
+ {
43267
+ value: "2xl",
43268
+ label: "Extra rounded"
43269
+ },
43270
+ {
43271
+ value: "3xl",
43272
+ label: "Maximum rounded"
43273
+ }
43274
+ ],
43275
+ defaultValue: "3xl",
43276
+ ui: { intent: "style" }
43277
+ }
43278
+ ]);
43279
+ //#endregion
42013
43280
  //#region ../blocks/src/system/blocks/image-gallery.ts
42014
43281
  const grid$1 = (props, children, ...mods) => el("grid", props ?? void 0, children ?? void 0, ...mods);
42015
43282
  const galleryContainer = (children, opts) => {
@@ -42224,7 +43491,11 @@ const emptyState$1 = {
42224
43491
  }
42225
43492
  };
42226
43493
  const wrapVariant$1 = (layout, opts) => styledSection({
42227
- children: galleryContainer([layout, emptyState$1], {
43494
+ children: galleryContainer([
43495
+ ...sectionHeaderLayoutNodes(),
43496
+ layout,
43497
+ emptyState$1
43498
+ ], {
42228
43499
  gap: "md",
42229
43500
  fullWidth: opts?.fullWidth,
42230
43501
  className: opts?.className
@@ -42233,6 +43504,28 @@ const wrapVariant$1 = (layout, opts) => styledSection({
42233
43504
  spacing: "medium",
42234
43505
  background: "background"
42235
43506
  });
43507
+ 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({
43508
+ as: "figcaption",
43509
+ ...lookSlot("caption")
43510
+ }, bind(captionFrom), when(captionFrom))])], ...mods);
43511
+ const tilesLayout = styledSection({
43512
+ children: el("div", {
43513
+ className: "rb-container",
43514
+ ...lookSlot("layout")
43515
+ }, [...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) => ({
43516
+ ...node,
43517
+ $when: {
43518
+ when: {
43519
+ from: "content.images",
43520
+ transforms: [{ id: "array.length" }]
43521
+ },
43522
+ equals: 0
43523
+ }
43524
+ }))])]),
43525
+ baseClass: "",
43526
+ spacing: "medium",
43527
+ background: "background"
43528
+ });
42236
43529
  const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42237
43530
  id: "block.image-gallery",
42238
43531
  title: "Image Gallery",
@@ -42245,510 +43538,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42245
43538
  "marqueeSpeed",
42246
43539
  "marqueePauseOnHover"
42247
43540
  ] },
42248
- additionalFields: parseFieldDefinitions([
42249
- {
42250
- id: "images",
42251
- type: "repeater",
42252
- label: "Images",
42253
- itemLabel: "Image",
42254
- minItems: 0,
42255
- maxItems: 24,
42256
- ui: {
42257
- repeaterPreset: "thumbnailGrid",
42258
- thumbnailField: "image",
42259
- thumbnailAltField: "caption",
42260
- thumbnailLabelField: "caption",
42261
- thumbnailCardDensity: "compact"
42262
- },
42263
- schema: { fields: [{
42264
- id: "image",
42265
- type: "media",
42266
- label: "Image",
42267
- required: true,
42268
- mediaKinds: ["image"]
42269
- }, {
42270
- id: "caption",
42271
- type: "text",
42272
- label: "Caption",
42273
- description: "Optional caption displayed below the image and used as the editor card label",
42274
- maxLength: 200
42275
- }] }
42276
- },
42277
- {
42278
- id: "fullBleed",
42279
- type: "boolean",
42280
- label: "Full bleed",
42281
- description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
42282
- defaultValue: false,
42283
- ui: {
42284
- intent: "display",
42285
- visibleWhen: {
42286
- field: "variant",
42287
- notIn: ["marquee"]
42288
- }
42289
- }
42290
- },
42291
- {
42292
- id: "aspectRatio",
42293
- type: "select",
42294
- label: "Aspect ratio",
42295
- description: "Crop images to a consistent aspect ratio.",
42296
- defaultValue: "1/1",
42297
- options: [
42298
- {
42299
- value: "auto",
42300
- label: "Original"
42301
- },
42302
- {
42303
- value: "1/1",
42304
- label: "1:1 (Square)"
42305
- },
42306
- {
42307
- value: "4/3",
42308
- label: "4:3 (Standard)"
42309
- },
42310
- {
42311
- value: "16/9",
42312
- label: "16:9 (Widescreen)"
42313
- },
42314
- {
42315
- value: "3/2",
42316
- label: "3:2 (Classic)"
42317
- },
42318
- {
42319
- value: "3/4",
42320
- label: "3:4 (Portrait)"
42321
- }
42322
- ],
42323
- ui: {
42324
- intent: "display",
42325
- visibleWhen: {
42326
- field: "variant",
42327
- notIn: ["masonry", "marquee"]
42328
- }
42329
- }
42330
- },
42331
- {
42332
- id: "slidesToShow",
42333
- type: "select",
42334
- label: "Images per view (mobile)",
42335
- description: "Number of images visible at once on small screens.",
42336
- defaultValue: "1",
42337
- options: [
42338
- {
42339
- value: "1",
42340
- label: "One at a time"
42341
- },
42342
- {
42343
- value: "2",
42344
- label: "Two at a time"
42345
- },
42346
- {
42347
- value: "3",
42348
- label: "Three at a time"
42349
- }
42350
- ],
42351
- ui: {
42352
- intent: "display",
42353
- visibleWhen: {
42354
- field: "variant",
42355
- equals: "carousel"
42356
- }
42357
- }
42358
- },
42359
- {
42360
- id: "slidesToShowTablet",
42361
- type: "select",
42362
- label: "Images per view (tablet)",
42363
- description: "Number of images visible on medium screens.",
42364
- options: [
42365
- {
42366
- value: "",
42367
- label: "Same as mobile"
42368
- },
42369
- {
42370
- value: "1",
42371
- label: "One at a time"
42372
- },
42373
- {
42374
- value: "2",
42375
- label: "Two at a time"
42376
- },
42377
- {
42378
- value: "3",
42379
- label: "Three at a time"
42380
- }
42381
- ],
42382
- ui: {
42383
- intent: "display",
42384
- visibleWhen: {
42385
- field: "variant",
42386
- equals: "carousel"
42387
- }
42388
- }
42389
- },
42390
- {
42391
- id: "slidesToShowDesktop",
42392
- type: "select",
42393
- label: "Images per view (desktop)",
42394
- description: "Number of images visible on large screens.",
42395
- options: [
42396
- {
42397
- value: "",
42398
- label: "Same as tablet"
42399
- },
42400
- {
42401
- value: "1",
42402
- label: "One at a time"
42403
- },
42404
- {
42405
- value: "2",
42406
- label: "Two at a time"
42407
- },
42408
- {
42409
- value: "3",
42410
- label: "Three at a time"
42411
- }
42412
- ],
42413
- ui: {
42414
- intent: "display",
42415
- visibleWhen: {
42416
- field: "variant",
42417
- equals: "carousel"
42418
- }
42419
- }
42420
- },
42421
- {
42422
- id: "transition",
42423
- type: "select",
42424
- label: "Transition",
42425
- description: "Animation style between slides.",
42426
- defaultValue: "slide",
42427
- options: [{
42428
- value: "slide",
42429
- label: "Slide"
42430
- }, {
42431
- value: "fade",
42432
- label: "Fade"
42433
- }],
42434
- ui: {
42435
- intent: "display",
42436
- visibleWhen: {
42437
- field: "variant",
42438
- equals: "carousel"
42439
- }
42440
- }
42441
- },
42442
- {
42443
- id: "showControls",
42444
- type: "boolean",
42445
- label: "Show arrows",
42446
- defaultValue: true,
42447
- ui: {
42448
- intent: "behavior",
42449
- visibleWhen: {
42450
- field: "variant",
42451
- equals: "carousel"
42452
- }
42453
- }
42454
- },
42455
- {
42456
- id: "showDots",
42457
- type: "boolean",
42458
- label: "Show dots",
42459
- defaultValue: false,
42460
- ui: {
42461
- intent: "behavior",
42462
- visibleWhen: {
42463
- field: "variant",
42464
- equals: "carousel"
42465
- }
42466
- }
42467
- },
42468
- {
42469
- id: "autoplay",
42470
- type: "boolean",
42471
- label: "Autoplay",
42472
- defaultValue: false,
42473
- ui: {
42474
- intent: "behavior",
42475
- visibleWhen: {
42476
- field: "variant",
42477
- equals: "carousel"
42478
- }
42479
- }
42480
- },
42481
- {
42482
- id: "autoplayDelay",
42483
- type: "select",
42484
- label: "Autoplay delay",
42485
- defaultValue: "5000",
42486
- options: [
42487
- {
42488
- value: "3000",
42489
- label: "3 seconds"
42490
- },
42491
- {
42492
- value: "5000",
42493
- label: "5 seconds"
42494
- },
42495
- {
42496
- value: "7000",
42497
- label: "7 seconds"
42498
- },
42499
- {
42500
- value: "10000",
42501
- label: "10 seconds"
42502
- }
42503
- ],
42504
- ui: {
42505
- intent: "behavior",
42506
- visibleWhen: {
42507
- field: "variant",
42508
- equals: "carousel"
42509
- }
42510
- }
42511
- },
42512
- {
42513
- id: "arrowVisibility",
42514
- type: "select",
42515
- label: "Arrow visibility",
42516
- defaultValue: "always",
42517
- options: [{
42518
- value: "always",
42519
- label: "Always visible"
42520
- }, {
42521
- value: "hover",
42522
- label: "Show on hover"
42523
- }],
42524
- ui: {
42525
- intent: "behavior",
42526
- visibleWhen: {
42527
- field: "variant",
42528
- equals: "carousel"
42529
- }
42530
- }
42531
- },
42532
- {
42533
- id: "loop",
42534
- type: "boolean",
42535
- label: "Loop slides",
42536
- defaultValue: true,
42537
- ui: {
42538
- intent: "behavior",
42539
- visibleWhen: {
42540
- field: "variant",
42541
- equals: "carousel"
42542
- }
42543
- }
42544
- },
42545
- {
42546
- id: "marqueeDirection",
42547
- type: "select",
42548
- label: "Scroll direction",
42549
- options: [{
42550
- value: "left",
42551
- label: "Left"
42552
- }, {
42553
- value: "right",
42554
- label: "Right"
42555
- }],
42556
- defaultValue: "left",
42557
- ui: {
42558
- intent: "display",
42559
- visibleWhen: {
42560
- field: "variant",
42561
- equals: "marquee"
42562
- }
42563
- }
42564
- },
42565
- {
42566
- id: "marqueeSpeed",
42567
- type: "select",
42568
- label: "Scroll speed",
42569
- options: [
42570
- {
42571
- value: "slow",
42572
- label: "Slow (60s)"
42573
- },
42574
- {
42575
- value: "medium",
42576
- label: "Medium (40s)"
42577
- },
42578
- {
42579
- value: "fast",
42580
- label: "Fast (20s)"
42581
- }
42582
- ],
42583
- defaultValue: "medium",
42584
- ui: {
42585
- intent: "display",
42586
- visibleWhen: {
42587
- field: "variant",
42588
- equals: "marquee"
42589
- }
42590
- }
42591
- },
42592
- {
42593
- id: "marqueePauseOnHover",
42594
- type: "boolean",
42595
- label: "Pause on hover",
42596
- defaultValue: true,
42597
- ui: {
42598
- intent: "behavior",
42599
- visibleWhen: {
42600
- field: "variant",
42601
- equals: "marquee"
42602
- }
42603
- }
42604
- },
42605
- {
42606
- id: "marqueeImageSize",
42607
- type: "select",
42608
- label: "Image size",
42609
- options: [
42610
- {
42611
- value: "sm",
42612
- label: "Small (200px)"
42613
- },
42614
- {
42615
- value: "md",
42616
- label: "Medium (256px)"
42617
- },
42618
- {
42619
- value: "lg",
42620
- label: "Large (320px)"
42621
- },
42622
- {
42623
- value: "xl",
42624
- label: "Extra large (400px)"
42625
- }
42626
- ],
42627
- defaultValue: "md",
42628
- ui: {
42629
- intent: "display",
42630
- visibleWhen: {
42631
- field: "variant",
42632
- equals: "marquee"
42633
- }
42634
- }
42635
- },
42636
- {
42637
- id: "imageFilter",
42638
- type: "select",
42639
- label: "Image filter",
42640
- options: [
42641
- {
42642
- value: "none",
42643
- label: "None"
42644
- },
42645
- {
42646
- value: "grayscale",
42647
- label: "Grayscale"
42648
- },
42649
- {
42650
- value: "grayscale-hover-reveal",
42651
- label: "Grayscale (color on hover)"
42652
- },
42653
- {
42654
- value: "sepia",
42655
- label: "Sepia"
42656
- }
42657
- ],
42658
- defaultValue: "grayscale-hover-reveal",
42659
- ui: { intent: "style" }
42660
- },
42661
- {
42662
- id: "imageBorder",
42663
- type: "group",
42664
- label: "Image border",
42665
- schema: { fields: [
42666
- {
42667
- id: "enabled",
42668
- type: "boolean",
42669
- label: "Show border",
42670
- defaultValue: true
42671
- },
42672
- {
42673
- id: "colorToken",
42674
- type: "text",
42675
- label: "Border color",
42676
- defaultValue: "accent",
42677
- ui: { widget: "backgroundColor" }
42678
- },
42679
- {
42680
- id: "opacity",
42681
- type: "number",
42682
- label: "Border opacity",
42683
- defaultValue: 30,
42684
- ui: {
42685
- min: 0,
42686
- max: 100
42687
- }
42688
- },
42689
- {
42690
- id: "width",
42691
- type: "select",
42692
- label: "Border width",
42693
- options: [
42694
- {
42695
- value: "1",
42696
- label: "Thin (1px)"
42697
- },
42698
- {
42699
- value: "2",
42700
- label: "Medium (2px)"
42701
- },
42702
- {
42703
- value: "3",
42704
- label: "Thick (3px)"
42705
- }
42706
- ],
42707
- defaultValue: "2"
42708
- }
42709
- ] },
42710
- ui: { intent: "style" }
42711
- },
42712
- {
42713
- id: "imageCorners",
42714
- type: "select",
42715
- label: "Image corners",
42716
- options: [
42717
- {
42718
- value: "none",
42719
- label: "Square"
42720
- },
42721
- {
42722
- value: "sm",
42723
- label: "Slightly rounded"
42724
- },
42725
- {
42726
- value: "md",
42727
- label: "Rounded"
42728
- },
42729
- {
42730
- value: "lg",
42731
- label: "More rounded"
42732
- },
42733
- {
42734
- value: "xl",
42735
- label: "Very rounded"
42736
- },
42737
- {
42738
- value: "2xl",
42739
- label: "Extra rounded"
42740
- },
42741
- {
42742
- value: "3xl",
42743
- label: "Maximum rounded"
42744
- }
42745
- ],
42746
- defaultValue: "3xl",
42747
- ui: { intent: "style" }
42748
- }
42749
- ]),
43541
+ additionalFields: imageGalleryFields,
42750
43542
  layout: wrapVariant$1(gridLayout),
42751
43543
  variants: {
43544
+ tiles: tilesLayout,
42752
43545
  grid: wrapVariant$1(gridLayout),
42753
43546
  carousel: wrapVariant$1(carouselLayout),
42754
43547
  masonry: wrapVariant$1(masonryLayout),
@@ -42757,7 +43550,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
42757
43550
  className: "rb-image-gallery-marquee-container"
42758
43551
  })
42759
43552
  },
42760
- variantMeaning: { kind: "arrangement" },
43553
+ variantMeaning: {
43554
+ kind: "arrangement",
43555
+ lookOnlyKeys: ["tiles"]
43556
+ },
42761
43557
  defaultVariant: "grid",
42762
43558
  variantOptions: {
42763
43559
  grid: {
@@ -44977,76 +45773,74 @@ const giftingBlockDefinition = {
44977
45773
  /**
44978
45774
  * Get form fields based on preset configuration.
44979
45775
  */
44980
- function getGlobalFormFields(form) {
44981
- const includePhone = form.includeOptionalPhone;
44982
- switch (form.fields.preset) {
44983
- case "emailOnly": return withOptionalPhone([{
44984
- id: "email",
44985
- type: "email",
44986
- label: "Email",
44987
- required: true,
44988
- placeholder: "your@email.com"
44989
- }], includePhone);
44990
- case "emailName": return withOptionalPhone([{
44991
- id: "email",
44992
- type: "email",
44993
- label: "Email",
44994
- required: true,
44995
- placeholder: "your@email.com"
44996
- }, {
45776
+ function getGlobalFormFields(form, presentation = {}) {
45777
+ const fields = withOptionalPhone(newsletterPresetFields(form.fields), form.includeOptionalPhone);
45778
+ return presentation.lookSlots ? fields.map((field) => ({
45779
+ ...field,
45780
+ label: lookFieldLabel(field)
45781
+ })) : fields;
45782
+ }
45783
+ function lookFieldLabel(field) {
45784
+ switch (field.id) {
45785
+ case "firstName": return "First name";
45786
+ case "lastName": return "Last name";
45787
+ default: return field.label;
45788
+ }
45789
+ }
45790
+ const emailField = {
45791
+ id: "email",
45792
+ type: "email",
45793
+ label: "Email",
45794
+ required: true,
45795
+ placeholder: "your@email.com"
45796
+ };
45797
+ const firstNameField = (required) => ({
45798
+ id: "firstName",
45799
+ type: "text",
45800
+ label: "First Name",
45801
+ required,
45802
+ placeholder: "First name"
45803
+ });
45804
+ function newsletterPresetFields(fields) {
45805
+ switch (fields.preset) {
45806
+ case "emailOnly": return [emailField];
45807
+ case "emailName": return [emailField, {
44997
45808
  id: "name",
44998
45809
  type: "text",
44999
45810
  label: "Name",
45000
- required: form.fields.name === "required",
45811
+ required: fields.name === "required",
45001
45812
  placeholder: "Your name"
45002
- }], includePhone);
45003
- case "emailFirstLast": return withOptionalPhone([
45004
- {
45005
- id: "email",
45006
- type: "email",
45007
- label: "Email",
45008
- required: true,
45009
- placeholder: "your@email.com"
45010
- },
45011
- {
45012
- id: "firstName",
45013
- type: "text",
45014
- label: "First Name",
45015
- required: form.fields.firstName === "required",
45016
- placeholder: "First name"
45017
- },
45813
+ }];
45814
+ case "emailFirstName": return [emailField, firstNameField(fields.firstName === "required")];
45815
+ case "emailFirstLast": return [
45816
+ emailField,
45817
+ firstNameField(fields.firstName === "required"),
45018
45818
  {
45019
45819
  id: "lastName",
45020
45820
  type: "text",
45021
45821
  label: "Last Name",
45022
- required: form.fields.lastName === "required",
45822
+ required: fields.lastName === "required",
45023
45823
  placeholder: "Last name"
45024
45824
  }
45025
- ], includePhone);
45026
- case "emailNameCompany": return withOptionalPhone([
45027
- {
45028
- id: "email",
45029
- type: "email",
45030
- label: "Email",
45031
- required: true,
45032
- placeholder: "your@email.com"
45033
- },
45825
+ ];
45826
+ case "emailNameCompany": return [
45827
+ emailField,
45034
45828
  {
45035
45829
  id: "name",
45036
45830
  type: "text",
45037
45831
  label: "Name",
45038
- required: form.fields.name === "required",
45832
+ required: fields.name === "required",
45039
45833
  placeholder: "Your name"
45040
45834
  },
45041
45835
  {
45042
45836
  id: "company",
45043
45837
  type: "text",
45044
45838
  label: "Company",
45045
- required: form.fields.company === "required",
45839
+ required: fields.company === "required",
45046
45840
  placeholder: "Company name"
45047
45841
  }
45048
- ], includePhone);
45049
- default: throw new Error("Unknown newsletter preset");
45842
+ ];
45843
+ default: return assertNever$2(fields);
45050
45844
  }
45051
45845
  }
45052
45846
  function withOptionalPhone(fields, includePhone) {
@@ -45108,6 +45902,7 @@ const mailingListSignupBlockSourceRefSchema = z.object({
45108
45902
  });
45109
45903
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
45110
45904
  const newsletterSourceCommonSchema = z.object({
45905
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
45111
45906
  siteId: z.string().optional(),
45112
45907
  apiBaseUrl: z.string().optional(),
45113
45908
  mailingList: mailingListContextSchema.optional(),
@@ -45140,6 +45935,7 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
45140
45935
  newsletterSourceCommonSchema.extend({ source: z.literal("preview") })
45141
45936
  ]);
45142
45937
  const newsletterDisplaySchema = z.object({
45938
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
45143
45939
  kind: z.literal("newsletter-form"),
45144
45940
  availability: z.enum(["ready", "unavailable"]),
45145
45941
  className: z.string().nullable(),
@@ -45206,13 +46002,14 @@ function buildNewsletterDisplay(source) {
45206
46002
  const choices = resolveRuntimeChoices(assessment);
45207
46003
  return {
45208
46004
  kind: "newsletter-form",
46005
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
45209
46006
  availability: assessment.tag === "available" ? "ready" : "unavailable",
45210
46007
  className: source.className ?? null,
45211
46008
  buttonLabel: form.buttonLabel,
45212
46009
  successMessage: form.successMessage,
45213
46010
  buttonVariant: source.buttonVariant ?? "primary",
45214
46011
  privacyNote: form.privacyNote,
45215
- fields: getGlobalFormFields(form),
46012
+ fields: getGlobalFormFields(form, source),
45216
46013
  choices
45217
46014
  };
45218
46015
  }
@@ -45284,32 +46081,50 @@ function parseRequiredMailingListSignedSourceToken(value) {
45284
46081
  //#region ../blocks/src/system/blocks/newsletter-signup.ts
45285
46082
  const stackedComposition = composeFragments([{ fragment: newsletterCopyFragment }, { fragment: newsletterFormFragment }]);
45286
46083
  const stackedLayout = styledSection({
45287
- children: sectionContainer(stackedComposition.layout, {
46084
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
45288
46085
  gap: "md",
45289
46086
  className: "rb-text-center newsletter-stacked"
45290
- }),
46087
+ })),
45291
46088
  baseClass: "",
45292
46089
  spacing: "medium",
45293
46090
  background: "surface"
45294
46091
  });
45295
46092
  const inlineLayout = styledSection({
45296
- children: sectionContainer(stackedComposition.layout, {
46093
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
45297
46094
  gap: "md",
45298
46095
  className: "newsletter-inline"
45299
- }),
46096
+ })),
45300
46097
  baseClass: "",
45301
46098
  spacing: "medium",
45302
46099
  background: "surface"
45303
46100
  });
45304
46101
  const editorialSplitLayout = styledSection({
45305
- children: sectionContainer([el("div", { className: "newsletter-editorial-split-copy" }, newsletterCopyFragment.layout), el("div", { className: "newsletter-editorial-split-form" }, newsletterFormFragment.layout)], {
46102
+ children: props(lookSlot("layout"))(sectionContainer([el("div", {
46103
+ className: "newsletter-editorial-split-copy",
46104
+ ...lookSlot("head")
46105
+ }, newsletterCopyFragment.layout), el("div", {
46106
+ className: "newsletter-editorial-split-form",
46107
+ ...lookSlot("panel")
46108
+ }, newsletterFormFragment.layout)], {
45306
46109
  gap: "lg",
45307
46110
  className: "newsletter-editorial-split"
45308
- }),
46111
+ })),
45309
46112
  baseClass: "",
45310
46113
  spacing: "comfortable",
45311
46114
  background: "surface"
45312
46115
  });
46116
+ const archLayout = styledSection({
46117
+ children: el("div", {
46118
+ className: "rb-container",
46119
+ ...lookSlot("layout")
46120
+ }, [el("div", lookSlot("frame"), [el("div", {
46121
+ className: "rb-grid",
46122
+ ...lookSlot("head")
46123
+ }, newsletterCopyFragment.layout), ...newsletterFormFragment.layout])]),
46124
+ baseClass: "",
46125
+ spacing: "medium",
46126
+ background: "surface"
46127
+ });
45313
46128
  const newsletterSignupManifest = createBlockManifest({
45314
46129
  id: "block.newsletter-signup",
45315
46130
  title: "Newsletter Signup",
@@ -45324,13 +46139,26 @@ const newsletterSignupManifest = createBlockManifest({
45324
46139
  fragment: newsletterFormFragment,
45325
46140
  fieldPriority: 1
45326
46141
  }],
46142
+ additionalFields: [{
46143
+ id: "archFrame",
46144
+ type: "boolean",
46145
+ label: "Arch frame",
46146
+ ui: {
46147
+ intent: "display",
46148
+ hidden: true
46149
+ }
46150
+ }],
45327
46151
  layout: stackedLayout,
45328
46152
  variants: {
46153
+ arch: archLayout,
45329
46154
  stacked: stackedLayout,
45330
46155
  inline: inlineLayout,
45331
46156
  "editorial-split": editorialSplitLayout
45332
46157
  },
45333
- variantMeaning: { kind: "arrangement" },
46158
+ variantMeaning: {
46159
+ kind: "arrangement",
46160
+ lookOnlyKeys: ["arch"]
46161
+ },
45334
46162
  defaultVariant: "stacked",
45335
46163
  variantOptions: {
45336
46164
  stacked: {
@@ -46417,7 +47245,7 @@ const systemBlockDefinitions = [
46417
47245
  })
46418
47246
  ]
46419
47247
  })),
46420
- withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47248
+ withDesignCapability("block.body-text", bodyTextBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
46421
47249
  flow: bodyFlow,
46422
47250
  layoutProfiles: [
46423
47251
  layoutProfile({
@@ -46792,7 +47620,7 @@ const systemBlockDefinitions = [
46792
47620
  weight: "quiet"
46793
47621
  })]
46794
47622
  })),
46795
- withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47623
+ withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
46796
47624
  flow: mediaFlow,
46797
47625
  layoutProfiles: [
46798
47626
  layoutProfile({
@@ -46881,7 +47709,7 @@ const systemBlockDefinitions = [
46881
47709
  weight: "standard"
46882
47710
  })]
46883
47711
  })),
46884
- withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
47712
+ withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
46885
47713
  flow: conversionFlow,
46886
47714
  layoutProfiles: [
46887
47715
  layoutProfile({