@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
@@ -2896,14 +2896,6 @@ const themeLookMetadataSchema = z.object({
2896
2896
  skinMarks: skinMarksSchema.optional()
2897
2897
  });
2898
2898
  //#endregion
2899
- //#region ../theme-core/src/footer/mode.ts
2900
- const footerModeSchema = z.enum([
2901
- "default",
2902
- "blocks",
2903
- "default+blocks",
2904
- "none"
2905
- ]);
2906
- //#endregion
2907
2899
  //#region ../core/src/result.ts
2908
2900
  function ok(value) {
2909
2901
  return {
@@ -3275,6 +3267,25 @@ function validateBookingPaymentOptionKinds(kinds) {
3275
3267
  return ok(void 0);
3276
3268
  }
3277
3269
  //#endregion
3270
+ //#region ../core/src/date-time-formatter.ts
3271
+ /** Shared Intl engine, internal to core's date presentation owners. */
3272
+ const FORMATTER_CACHE_LIMIT = 100;
3273
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
3274
+ function getDateTimeFormatter(locale, timeZone, format) {
3275
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
3276
+ const cached = dateTimeFormatterCache.get(key);
3277
+ if (cached !== void 0) return cached;
3278
+ if (typeof locale !== "string" || Intl.DateTimeFormat.supportedLocalesOf([locale]).length === 0) throw new RangeError("An explicit supported locale is required");
3279
+ if (typeof timeZone !== "string" || timeZone.length === 0) throw new RangeError("An explicit time zone is required");
3280
+ const formatter = new Intl.DateTimeFormat(locale, {
3281
+ ...format,
3282
+ timeZone
3283
+ });
3284
+ if (dateTimeFormatterCache.size >= FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
3285
+ dateTimeFormatterCache.set(key, formatter);
3286
+ return formatter;
3287
+ }
3288
+ //#endregion
3278
3289
  //#region ../core/src/booking-time-zone.ts
3279
3290
  const TIME_ZONE_VALIDITY_CACHE_LIMIT = 100;
3280
3291
  const timeZoneValidityCache = /* @__PURE__ */ new Map();
@@ -3311,8 +3322,6 @@ const START_OF_DAY = {
3311
3322
  second: 0
3312
3323
  };
3313
3324
  const LOCAL_DATE_PATTERN = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
3314
- const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
3315
- const dateTimeFormatterCache = /* @__PURE__ */ new Map();
3316
3325
  function getSafeTimeZone(timeZone) {
3317
3326
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
3318
3327
  return normalized.length > 0 && isValidBookingTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
@@ -3329,19 +3338,7 @@ function formatParseError(error) {
3329
3338
  }
3330
3339
  }
3331
3340
  function formatToPartsLookup(date, locale, timeZone, format) {
3332
- return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
3333
- }
3334
- function getCachedDateTimeFormatter(locale, timeZone, format) {
3335
- const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
3336
- const cached = dateTimeFormatterCache.get(key);
3337
- if (cached !== void 0) return cached;
3338
- const formatter = new Intl.DateTimeFormat(locale, {
3339
- ...format,
3340
- timeZone
3341
- });
3342
- if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
3343
- dateTimeFormatterCache.set(key, formatter);
3344
- return formatter;
3341
+ return new Map(getDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
3345
3342
  }
3346
3343
  function getZonedDateTimeParts(date, timeZone) {
3347
3344
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -3429,7 +3426,7 @@ function toScheduledBookingDateTime(input) {
3429
3426
  function formatBookingInstant(isoString, options) {
3430
3427
  const date = new Date(isoString);
3431
3428
  if (Number.isNaN(date.getTime())) return isoString;
3432
- return getCachedDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
3429
+ return getDateTimeFormatter(options.locale ?? DEFAULT_LOCALE, getSafeTimeZone(options.timeZone), options.format).format(date);
3433
3430
  }
3434
3431
  function formatBookingDate(input, format = {
3435
3432
  weekday: "long",
@@ -3554,6 +3551,17 @@ function localScheduleDateTimeToUtcDate(localDate, localTime, timeZone) {
3554
3551
  return new Date(guess);
3555
3552
  }
3556
3553
  //#endregion
3554
+ //#region ../core/src/date-display.ts
3555
+ /** Site-language policy, shared by customer emails and public event adapters. */
3556
+ function inferSiteDateLocale(siteTimeZone) {
3557
+ if (siteTimeZone === null || siteTimeZone === void 0 || siteTimeZone === "") return "en-US";
3558
+ if (siteTimeZone === "Europe/Dublin") return "en-IE";
3559
+ if (siteTimeZone.startsWith("Europe/")) return "en-GB";
3560
+ if (siteTimeZone.startsWith("Australia/")) return "en-AU";
3561
+ if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
3562
+ return "en-US";
3563
+ }
3564
+ //#endregion
3557
3565
  //#region ../core/src/location.ts
3558
3566
  function normalizeLocationAddressText(value) {
3559
3567
  if (typeof value !== "string") return null;
@@ -3643,6 +3651,10 @@ function parseGlobalFields(value) {
3643
3651
  preset: "emailName",
3644
3652
  name: value.name
3645
3653
  } : null;
3654
+ case "emailFirstName": return isRequirement(value.firstName) ? {
3655
+ preset: "emailFirstName",
3656
+ firstName: value.firstName
3657
+ } : null;
3646
3658
  case "emailFirstLast": return isRequirement(value.firstName) && isRequirement(value.lastName) ? {
3647
3659
  preset: "emailFirstLast",
3648
3660
  firstName: value.firstName,
@@ -4349,6 +4361,29 @@ const paletteSchema = z.object({
4349
4361
  };
4350
4362
  });
4351
4363
  //#endregion
4364
+ //#region ../theme-core/src/buttons/typography.ts
4365
+ const textTransformSchema = z.enum([
4366
+ "none",
4367
+ "uppercase",
4368
+ "lowercase",
4369
+ "capitalize"
4370
+ ]);
4371
+ const fontWeightSchema = z.union([
4372
+ z.literal(400),
4373
+ z.literal(500),
4374
+ z.literal(600),
4375
+ z.literal(700),
4376
+ z.literal(800)
4377
+ ]);
4378
+ const buttonTypographySchema = z.enum(["body", "heading"]);
4379
+ const letterSpacingSchema = z.enum([
4380
+ "tight",
4381
+ "normal",
4382
+ "slight",
4383
+ "loose",
4384
+ "wide"
4385
+ ]);
4386
+ //#endregion
4352
4387
  //#region ../theme-core/src/buttons/types.ts
4353
4388
  /**
4354
4389
  * Standard semantic variant roles a theme exposes.
@@ -4464,6 +4499,7 @@ const buttonEffectApplicationSchema = z.discriminatedUnion("effectId", [
4464
4499
  z.strictObject({
4465
4500
  effectId: z.literal("lift"),
4466
4501
  options: z.strictObject({ amount: z.enum([
4502
+ "0.125",
4467
4503
  "0.25",
4468
4504
  "0.5",
4469
4505
  "1"
@@ -4510,24 +4546,6 @@ const shadowSizeSchema = z.enum([
4510
4546
  "medium",
4511
4547
  "high"
4512
4548
  ]);
4513
- const textTransformSchema = z.enum([
4514
- "none",
4515
- "uppercase",
4516
- "lowercase",
4517
- "capitalize"
4518
- ]);
4519
- const fontWeightSchema = z.union([
4520
- z.literal(500),
4521
- z.literal(600),
4522
- z.literal(700),
4523
- z.literal(800)
4524
- ]);
4525
- const buttonTypographySchema = z.enum(["body", "heading"]);
4526
- const letterSpacingSchema = z.enum([
4527
- "tight",
4528
- "normal",
4529
- "loose"
4530
- ]);
4531
4549
  const hoverTransformSchema = z.enum([
4532
4550
  "none",
4533
4551
  "lift",
@@ -4599,7 +4617,8 @@ const paddingShorthandSchema = z.string().refine((value) => {
4599
4617
  }, { message: "Padding must be two space-separated CSS length tokens (e.g. \"0.5rem 1rem\"). Use `0` for zero." });
4600
4618
  const buttonSizeConfigSchema = z.object({
4601
4619
  padding: paddingShorthandSchema,
4602
- fontSize: z.string().optional()
4620
+ fontSize: z.string().optional(),
4621
+ borderRadius: z.string().optional()
4603
4622
  });
4604
4623
  /**
4605
4624
  * `xl` is optional on the wire so themes persisted before the `xl` size was
@@ -4722,12 +4741,20 @@ const buttonVisualAppearanceSchema = z.strictObject({
4722
4741
  textTransform: textTransformSchema
4723
4742
  }),
4724
4743
  effects: z.array(buttonEffectApplicationSchema),
4744
+ transform: z.literal("none").optional(),
4725
4745
  contextualHover: contextualButtonHoverSchema.optional()
4726
4746
  });
4727
4747
  const buttonVisualStatesSchema = z.strictObject({
4728
4748
  base: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
4729
4749
  hover: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
4730
- focus: buttonVisualAppearanceSchema.extend({ shadow: z.literal("focus-indicator") }),
4750
+ focus: buttonVisualAppearanceSchema.extend({
4751
+ shadow: z.literal("focus-indicator"),
4752
+ indicator: z.strictObject({
4753
+ kind: z.literal("surface-ink"),
4754
+ width: z.union([z.literal(2), z.literal(3)]),
4755
+ offset: z.union([z.literal(3), z.literal(4)])
4756
+ }).optional()
4757
+ }),
4731
4758
  active: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema }),
4732
4759
  disabled: buttonVisualAppearanceSchema.extend({ shadow: variantShadowSchema })
4733
4760
  });
@@ -5175,6 +5202,287 @@ function normalizeAppearance(appearance) {
5175
5202
  };
5176
5203
  }
5177
5204
  //#endregion
5205
+ //#region ../theme-core/src/buttons/styles/recipes/lanternRecipes.ts
5206
+ const flatShadow = {
5207
+ elevation: "none",
5208
+ softness: null,
5209
+ position: "bottom"
5210
+ };
5211
+ const lift$1 = {
5212
+ effectId: "lift",
5213
+ options: { amount: "0.125" }
5214
+ };
5215
+ const tags = {
5216
+ tone: "classic",
5217
+ energy: "calm",
5218
+ motion: "subtle",
5219
+ era: "editorial"
5220
+ };
5221
+ /** Each role supplies complete states, including a flat surface-ink focus ring. */
5222
+ function states(base, hover, offset = 4, width = 2) {
5223
+ return {
5224
+ base,
5225
+ hover,
5226
+ focus: {
5227
+ ...base,
5228
+ shadow: "focus-indicator",
5229
+ indicator: {
5230
+ kind: "surface-ink",
5231
+ width,
5232
+ offset
5233
+ }
5234
+ },
5235
+ active: {
5236
+ ...base,
5237
+ transform: "none"
5238
+ },
5239
+ disabled: {
5240
+ ...base,
5241
+ effects: []
5242
+ }
5243
+ };
5244
+ }
5245
+ const gilt = {
5246
+ text: "treatment",
5247
+ border: "none",
5248
+ borderRadius: "rounded-10px",
5249
+ shadow: flatShadow,
5250
+ sizes: {
5251
+ sm: {
5252
+ padding: "10px 20px",
5253
+ fontSize: "text-base",
5254
+ borderRadius: "rounded-lg"
5255
+ },
5256
+ md: {
5257
+ padding: "18px 36px",
5258
+ fontSize: "text-19px"
5259
+ },
5260
+ lg: {
5261
+ padding: "18px 36px",
5262
+ fontSize: "text-19px"
5263
+ },
5264
+ xl: {
5265
+ padding: "18px 36px",
5266
+ fontSize: "text-19px"
5267
+ }
5268
+ },
5269
+ typography: {
5270
+ fontWeight: 400,
5271
+ typography: "heading",
5272
+ fontSize: "text-19px",
5273
+ letterSpacing: "slight",
5274
+ italic: false,
5275
+ textTransform: "none"
5276
+ },
5277
+ effects: []
5278
+ };
5279
+ const giltPrimary = {
5280
+ ...gilt,
5281
+ background: {
5282
+ type: "gradient",
5283
+ stops: ["accent", "primary"],
5284
+ direction: "to-br",
5285
+ foregroundToken: "onAccent"
5286
+ }
5287
+ };
5288
+ const giltPrimaryHover = {
5289
+ ...giltPrimary,
5290
+ background: {
5291
+ ...giltPrimary.background,
5292
+ stops: ["accent-400", "primary-400"],
5293
+ foregroundToken: "secondary-950"
5294
+ },
5295
+ effects: [lift$1]
5296
+ };
5297
+ const giltSecondary = {
5298
+ ...gilt,
5299
+ background: {
5300
+ type: "solid",
5301
+ colorToken: "text"
5302
+ }
5303
+ };
5304
+ const giltSecondaryHover = {
5305
+ ...giltSecondary,
5306
+ effects: [lift$1],
5307
+ contextualHover: {
5308
+ kind: "shade-shift",
5309
+ seedToken: unsafeAsOpaqueButtonColourToken("text"),
5310
+ fallbackDirection: "lighter"
5311
+ }
5312
+ };
5313
+ const giltPrimaryStates = states(giltPrimary, giltPrimaryHover);
5314
+ const giltSecondaryStates = states(giltSecondary, giltSecondaryHover);
5315
+ const giltSlabRecipe = defineStaticButtonStyleRecipe({
5316
+ id: "gilt-slab",
5317
+ accessibilityLabel: "Gilt slab",
5318
+ tags,
5319
+ system: { roles: {
5320
+ primary: { states: giltPrimaryStates },
5321
+ secondary: { states: giltSecondaryStates },
5322
+ outline: { states: giltSecondaryStates },
5323
+ ghost: { states: giltSecondaryStates },
5324
+ accent: { states: giltPrimaryStates }
5325
+ } }
5326
+ });
5327
+ const hairline = {
5328
+ text: "treatment",
5329
+ borderRadius: "rounded-3px",
5330
+ shadow: flatShadow,
5331
+ sizes: {
5332
+ sm: {
5333
+ padding: "9px 16px",
5334
+ fontSize: "text-xs"
5335
+ },
5336
+ md: {
5337
+ padding: "15px 28px",
5338
+ fontSize: "text-13px"
5339
+ },
5340
+ lg: {
5341
+ padding: "15px 28px",
5342
+ fontSize: "text-13px"
5343
+ },
5344
+ xl: {
5345
+ padding: "15px 28px",
5346
+ fontSize: "text-13px"
5347
+ }
5348
+ },
5349
+ typography: {
5350
+ fontWeight: 700,
5351
+ typography: "body",
5352
+ fontSize: "text-13px",
5353
+ letterSpacing: "wide",
5354
+ italic: false,
5355
+ textTransform: "uppercase"
5356
+ },
5357
+ effects: []
5358
+ };
5359
+ const hairlinePrimary = {
5360
+ ...hairline,
5361
+ background: {
5362
+ type: "solid",
5363
+ colorToken: "primary"
5364
+ },
5365
+ border: {
5366
+ widthClass: "border",
5367
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
5368
+ }
5369
+ };
5370
+ const hairlineOutline = {
5371
+ ...hairline,
5372
+ background: {
5373
+ type: "surface",
5374
+ role: "link"
5375
+ },
5376
+ border: {
5377
+ widthClass: "border",
5378
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
5379
+ }
5380
+ };
5381
+ const hairlineSecondary = {
5382
+ ...hairlineOutline,
5383
+ border: {
5384
+ widthClass: "border",
5385
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
5386
+ }
5387
+ };
5388
+ const hairlineFilled = {
5389
+ ...hairlineSecondary,
5390
+ background: {
5391
+ type: "solid",
5392
+ colorToken: "accent"
5393
+ }
5394
+ };
5395
+ const hairlinePrimaryStates = states(hairlinePrimary, hairlineOutline, 3);
5396
+ const hairlineSecondaryStates = states(hairlineSecondary, hairlineFilled, 3);
5397
+ const hairlineTabRecipe = defineStaticButtonStyleRecipe({
5398
+ id: "hairline-tab",
5399
+ accessibilityLabel: "Hairline tab",
5400
+ tags,
5401
+ system: { roles: {
5402
+ primary: { states: hairlinePrimaryStates },
5403
+ secondary: { states: hairlineSecondaryStates },
5404
+ outline: { states: hairlineSecondaryStates },
5405
+ ghost: { states: hairlineSecondaryStates },
5406
+ accent: { states: states(hairlineFilled, hairlineSecondary, 3) }
5407
+ } }
5408
+ });
5409
+ const marqueeAccent = {
5410
+ text: "treatment",
5411
+ borderRadius: "rounded-none",
5412
+ shadow: flatShadow,
5413
+ sizes: {
5414
+ sm: {
5415
+ padding: "8px 17px",
5416
+ fontSize: "text-15px"
5417
+ },
5418
+ md: {
5419
+ padding: "14px 25px",
5420
+ fontSize: "text-17px"
5421
+ },
5422
+ lg: {
5423
+ padding: "14px 25px",
5424
+ fontSize: "text-17px"
5425
+ },
5426
+ xl: {
5427
+ padding: "14px 25px",
5428
+ fontSize: "text-17px"
5429
+ }
5430
+ },
5431
+ typography: {
5432
+ fontWeight: 800,
5433
+ typography: "body",
5434
+ fontSize: "text-17px",
5435
+ letterSpacing: "loose",
5436
+ italic: false,
5437
+ textTransform: "uppercase"
5438
+ },
5439
+ effects: [],
5440
+ background: {
5441
+ type: "solid",
5442
+ colorToken: "accent"
5443
+ },
5444
+ border: {
5445
+ widthClass: "border-2",
5446
+ boundaryInk: unsafeAsOpaqueButtonColourToken("accent")
5447
+ }
5448
+ };
5449
+ const marqueePrimary = {
5450
+ ...marqueeAccent,
5451
+ background: {
5452
+ type: "solid",
5453
+ colorToken: "primary"
5454
+ },
5455
+ border: {
5456
+ widthClass: "border-2",
5457
+ boundaryInk: unsafeAsOpaqueButtonColourToken("primary")
5458
+ }
5459
+ };
5460
+ const marqueeSecondary = {
5461
+ ...marqueeAccent,
5462
+ background: {
5463
+ type: "solid",
5464
+ colorToken: "text"
5465
+ },
5466
+ border: {
5467
+ widthClass: "border-2",
5468
+ boundaryInk: unsafeAsOpaqueButtonColourToken("text")
5469
+ }
5470
+ };
5471
+ const marqueePrimaryStates = states(marqueeAccent, marqueePrimary, 4, 3);
5472
+ const marqueeSecondaryStates = states(marqueeSecondary, marqueeAccent, 4, 3);
5473
+ const marqueeRecipe = defineStaticButtonStyleRecipe({
5474
+ id: "marquee",
5475
+ accessibilityLabel: "Marquee",
5476
+ tags,
5477
+ system: { roles: {
5478
+ primary: { states: marqueePrimaryStates },
5479
+ secondary: { states: marqueeSecondaryStates },
5480
+ outline: { states: marqueeSecondaryStates },
5481
+ ghost: { states: marqueeSecondaryStates },
5482
+ accent: { states: marqueePrimaryStates }
5483
+ } }
5484
+ });
5485
+ //#endregion
5178
5486
  //#region ../theme-core/src/buttons/styles/recipes/fulcrumRecipe.ts
5179
5487
  const fulcrumSizes = {
5180
5488
  sm: {
@@ -5916,7 +6224,10 @@ const BUTTON_STYLE_IDS = [
5916
6224
  "offset-block",
5917
6225
  "ringed-pill",
5918
6226
  "square-outline",
5919
- "fulcrum"
6227
+ "fulcrum",
6228
+ "gilt-slab",
6229
+ "hairline-tab",
6230
+ "marquee"
5920
6231
  ];
5921
6232
  const quietArrowParametersSchema = z.object({ secondaryTreatment: z.enum(["outlined", "solid-accent"]) }).strict();
5922
6233
  const flatInkHoverTreatmentSchema = z.enum([
@@ -5953,7 +6264,10 @@ const buttonStyleSelectionSchema = z.discriminatedUnion("styleId", [
5953
6264
  selectionBranch("offset-block", emptyParametersSchema),
5954
6265
  selectionBranch("ringed-pill", emptyParametersSchema),
5955
6266
  selectionBranch("square-outline", emptyParametersSchema),
5956
- selectionBranch("fulcrum", emptyParametersSchema)
6267
+ selectionBranch("fulcrum", emptyParametersSchema),
6268
+ selectionBranch("gilt-slab", emptyParametersSchema),
6269
+ selectionBranch("hairline-tab", emptyParametersSchema),
6270
+ selectionBranch("marquee", emptyParametersSchema)
5957
6271
  ]);
5958
6272
  //#endregion
5959
6273
  //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
@@ -9469,7 +9783,10 @@ const buttonStyleRecipes = [
9469
9783
  offsetBlockRecipe,
9470
9784
  ringedPillRecipe,
9471
9785
  squareOutlineRecipe,
9472
- fulcrumRecipe
9786
+ fulcrumRecipe,
9787
+ giltSlabRecipe,
9788
+ hairlineTabRecipe,
9789
+ marqueeRecipe
9473
9790
  ];
9474
9791
  const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
9475
9792
  function findButtonStyleRecipe(id) {
@@ -9485,6 +9802,9 @@ function resolveButtonStyleSelection(selection) {
9485
9802
  case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
9486
9803
  case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
9487
9804
  case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
9805
+ case "gilt-slab": return resolveButtonStyleRecipe(giltSlabRecipe, selection.parameters);
9806
+ case "hairline-tab": return resolveButtonStyleRecipe(hairlineTabRecipe, selection.parameters);
9807
+ case "marquee": return resolveButtonStyleRecipe(marqueeRecipe, selection.parameters);
9488
9808
  case "fulcrum": return resolveButtonStyleRecipe(fulcrumRecipe, selection.parameters);
9489
9809
  case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
9490
9810
  case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
@@ -11136,20 +11456,15 @@ const headerSchema = z.object({
11136
11456
  const footerVariant = z.enum([
11137
11457
  "simple",
11138
11458
  "columns",
11139
- "split"
11140
- ]);
11459
+ "split",
11460
+ "centred"
11461
+ ]).transform((value) => value === "columns" ? "simple" : value);
11141
11462
  const footerMaxWidth = z.enum(["container", "full"]);
11142
11463
  const footerNavLayoutMode = z.enum([
11143
11464
  "stack",
11144
11465
  "inline",
11145
11466
  "inline-wrap"
11146
11467
  ]);
11147
- const footerNavLayoutAlign = z.enum([
11148
- "start",
11149
- "center",
11150
- "end",
11151
- "space-between"
11152
- ]);
11153
11468
  const footerSpacing = z.enum([
11154
11469
  "none",
11155
11470
  "tight",
@@ -11158,12 +11473,6 @@ const footerSpacing = z.enum([
11158
11473
  "relaxed",
11159
11474
  "spacious"
11160
11475
  ]);
11161
- const footerLogoPlacement = z.enum([
11162
- "left",
11163
- "right",
11164
- "above",
11165
- "below"
11166
- ]);
11167
11476
  const footerLogoSize = z.enum([
11168
11477
  "sm",
11169
11478
  "md",
@@ -11204,17 +11513,8 @@ const footerBottomBarSchema = z.object({
11204
11513
  ]).optional()
11205
11514
  }).optional()
11206
11515
  });
11207
- const footerNavLayoutSchema = z.object({
11208
- layout: footerNavLayoutMode.optional(),
11209
- align: footerNavLayoutAlign.optional(),
11210
- gapX: footerSpacing.optional(),
11211
- gapY: footerSpacing.optional(),
11212
- columns: z.number().int().min(1).max(6).optional()
11213
- });
11516
+ const footerNavLayoutSchema = z.object({ layout: footerNavLayoutMode.optional() });
11214
11517
  const footerLogoSchema = z.object({
11215
- showLogo: z.boolean().default(true),
11216
- showLogoText: z.boolean().optional(),
11217
- placement: footerLogoPlacement.optional(),
11218
11518
  size: footerLogoSize.optional(),
11219
11519
  maxHeight: footerLogoMaxHeight.optional(),
11220
11520
  align: z.enum([
@@ -11224,15 +11524,8 @@ const footerLogoSchema = z.object({
11224
11524
  ]).optional()
11225
11525
  });
11226
11526
  const footerSchema = z.object({
11227
- /**
11228
- * SDK-only footer rendering mode.
11229
- *
11230
- * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
11231
- */
11232
- mode: footerModeSchema.optional(),
11233
11527
  variant: footerVariant,
11234
11528
  maxWidth: footerMaxWidth,
11235
- showLogoText: z.boolean().optional(),
11236
11529
  background: headerBackgroundSchema.default({
11237
11530
  type: "color",
11238
11531
  color: "surface"
@@ -11415,7 +11708,9 @@ const cardListKnobBlocks = [...cardListFamilyBlocks, "block.event-calendar"];
11415
11708
  const lookKnobBlocks = {
11416
11709
  actionStyle: cardListKnobBlocks,
11417
11710
  titleSize: "block.hero",
11418
- imagePosition: "block.hero",
11711
+ imagePosition: ["block.hero", "block.media-text"],
11712
+ imageShape: "block.media-text",
11713
+ aspectRatio: "block.media-text",
11419
11714
  stickerLine: "block.hero",
11420
11715
  smallCaption: "block.hero",
11421
11716
  candleGlow: "block.hero",
@@ -11425,7 +11720,11 @@ const lookKnobBlocks = {
11425
11720
  dates: "block.offerings-preview",
11426
11721
  showCapacity: "block.event-calendar",
11427
11722
  quoteCount: "block.testimonials",
11428
- archFrame: "block.testimonials",
11723
+ archFrame: [
11724
+ "block.testimonials",
11725
+ "block.newsletter-signup",
11726
+ "block.form"
11727
+ ],
11429
11728
  tilt: "block.testimonials"
11430
11729
  };
11431
11730
  function isArrangementAppearancePreset(preset) {
@@ -11452,13 +11751,25 @@ function cardListKnobDefaults(block, arrangement, knobs, defaults) {
11452
11751
  }
11453
11752
  };
11454
11753
  }
11754
+ const arrangementLookTargets = {
11755
+ hero: "hero",
11756
+ "feature-cards": "feature-cards",
11757
+ "event-calendar": "events",
11758
+ testimonials: "testimonials",
11759
+ "event-details": "events",
11760
+ "media-text": "media-text",
11761
+ "image-gallery": "image-gallery",
11762
+ "newsletter-signup": "newsletter",
11763
+ form: "contact-form",
11764
+ "body-text": "body-text"
11765
+ };
11455
11766
  function defineArrangementLook(id, block, name, arrangement, knobs, input = {}) {
11456
11767
  const mode = block === "event-calendar" ? "list" : null;
11457
11768
  return {
11458
11769
  id: asAppearancePresetId(id),
11459
11770
  blockKinds: [`block.${block}`],
11460
11771
  label: name,
11461
- target: block === "event-calendar" || block === "event-details" ? "events" : block === "hero" ? "hero" : block === "testimonials" ? "testimonials" : "feature-cards",
11772
+ target: arrangementLookTargets[block],
11462
11773
  structure: {
11463
11774
  kind: "arrangement",
11464
11775
  byMode: { [mode ?? "default"]: arrangement },
@@ -12278,6 +12589,15 @@ const appearancePresets = [
12278
12589
  eyebrowTreatment: "accent"
12279
12590
  }
12280
12591
  }),
12592
+ defineArrangementLook("body-text-reading-column", "body-text", "Reading column", "prose", []),
12593
+ defineArrangementLook("form-beside-introduction-arched-panel", "form", "Introduction beside an arched form", "two-column", [], { slotRoles: { panel: "card" } }),
12594
+ defineArrangementLook("newsletter-signup-in-arch", "newsletter-signup", "Signup in an arch", "arch", []),
12595
+ defineArrangementLook("image-gallery-square-tiles", "image-gallery", "Square tiles", "tiles", []),
12596
+ defineArrangementLook("image-gallery-arched-captions", "image-gallery", "Arched photos with captions", "tiles", [], { styleFallback: [id$1("image-gallery-square-tiles")] }),
12597
+ defineArrangementLook("media-text-circle-beside-text", "media-text", "Circle beside the text", "circle-beside", ["imagePosition"], { forcedKnobs: {
12598
+ imageShape: "circle",
12599
+ aspectRatio: "1/1"
12600
+ } }),
12281
12601
  defineArrangementLook("hero-photo-beside-text", "hero", "Photo beside the text", "split", heroKnobs, { slotRoles: { sticker: "highlight" } }),
12282
12602
  defineArrangementLook("hero-headline-row", "hero", "Big headline, then text and photo", "headline-row", heroKnobs, {
12283
12603
  slotRoles: { sticker: "highlight" },
@@ -12863,6 +13183,41 @@ function requireThemeColorToken$1(value) {
12863
13183
  return token;
12864
13184
  }
12865
13185
  //#endregion
13186
+ //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
13187
+ const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
13188
+ const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
13189
+ siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
13190
+ function parseSiteChromeBackgroundColorToken(value) {
13191
+ const token = parseBackgroundAppearanceColorToken(value);
13192
+ return token ? token : null;
13193
+ }
13194
+ function toSiteChromeBackgroundColorTokens(tokenNames) {
13195
+ return tokenNames.flatMap((name) => {
13196
+ const token = parseSiteChromeBackgroundColorToken(name);
13197
+ return token ? [token] : [];
13198
+ });
13199
+ }
13200
+ const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
13201
+ const token = parseSiteChromeBackgroundColorToken(value);
13202
+ if (token === null) {
13203
+ ctx.addIssue({
13204
+ code: "custom",
13205
+ message: "Unknown site chrome background colour token"
13206
+ });
13207
+ return z.NEVER;
13208
+ }
13209
+ return token;
13210
+ });
13211
+ const siteChromeBackgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
13212
+ kind: z.literal("color"),
13213
+ token: backgroundColorTokenSchema
13214
+ }).strict()]);
13215
+ z.object({
13216
+ background: siteChromeBackgroundOverrideSchema,
13217
+ navigationLayout: z.enum(["inline-wrap", "stack"])
13218
+ }).strict();
13219
+ z.object({ background: siteChromeBackgroundOverrideSchema }).strict();
13220
+ //#endregion
12866
13221
  //#region ../theme-core/src/site-styles/compilationPlan.ts
12867
13222
  const defaultHeaderBrandPreferences = {
12868
13223
  brandDisplay: "auto",
@@ -13023,6 +13378,9 @@ function fallbackEndsAtOffer(entry, mode, style, catalogue, visited) {
13023
13378
  appearancePresets.filter(isArrangementAppearancePreset);
13024
13379
  /** Closed structural hooks shared by block arrangements and bounded skins. */
13025
13380
  const arrangementSlotNames = [
13381
+ "contact",
13382
+ "social",
13383
+ "base",
13026
13384
  "section",
13027
13385
  "stack",
13028
13386
  "inline",
@@ -13109,6 +13467,55 @@ function validateOfferKnobs(style, catalogue) {
13109
13467
  });
13110
13468
  }
13111
13469
  //#endregion
13470
+ //#region ../theme-core/src/site-styles/footerLookDefaults.ts
13471
+ const defaultFooterLookRecipes = {
13472
+ "footer-centred-name": {
13473
+ arrangement: "centred",
13474
+ ground: {
13475
+ kind: "token",
13476
+ token: "surface"
13477
+ },
13478
+ nav: {
13479
+ weight: "regular",
13480
+ colorToken: "text",
13481
+ hoverColorToken: "primary",
13482
+ typography: "body"
13483
+ },
13484
+ legal: {
13485
+ kind: "separate",
13486
+ bar: null
13487
+ },
13488
+ brandAlign: "center"
13489
+ },
13490
+ "footer-links-row": {
13491
+ arrangement: "simple",
13492
+ ground: {
13493
+ kind: "token",
13494
+ token: "surface"
13495
+ },
13496
+ nav: {
13497
+ weight: "regular",
13498
+ colorToken: "text",
13499
+ hoverColorToken: "primary",
13500
+ typography: "body"
13501
+ },
13502
+ legal: { kind: "integrated" },
13503
+ brandAlign: "start"
13504
+ }
13505
+ };
13506
+ /** A whole authored recipe replaces the default; facets are never deep-merged. */
13507
+ function resolveFooterLookRecipe(style, id) {
13508
+ return style?.footerLookRecipes?.[id] ?? defaultFooterLookRecipes[id];
13509
+ }
13510
+ //#endregion
13511
+ //#region ../theme-core/src/site-styles/footerLookRecipe.ts
13512
+ /** Reject undeclared references when the curated catalogue is loaded, before rendering. */
13513
+ function validateFooterRecipeSurfaces(style, recipe) {
13514
+ [recipe.ground, ...recipe.legal.kind === "separate" && recipe.legal.bar ? [recipe.legal.bar.background] : []].forEach((ground) => {
13515
+ if (ground.kind === "style-surface" && (style.looks.kind !== "offers" || !style.looks.surfaces[ground.surface])) throw new Error(`Undeclared footer surface: ${ground.surface}`);
13516
+ });
13517
+ }
13518
+ //#endregion
13112
13519
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
13113
13520
  /**
13114
13521
  * Reusable accordion "looks" for curated site styles.
@@ -13836,52 +14243,14 @@ defineLookOptionGroup({
13836
14243
  function asFooterLookId(value) {
13837
14244
  return value;
13838
14245
  }
13839
- function quietFooterLinks(theme) {
13840
- return {
13841
- ...theme.footer,
13842
- navStyle: "minimal",
13843
- navWeight: "regular",
13844
- navColor: "text",
13845
- navLinkStyle: {
13846
- typography: "body",
13847
- fontWeight: "regular",
13848
- textTransform: "none",
13849
- italic: false,
13850
- colorToken: "text",
13851
- hoverColorToken: "primary",
13852
- padding: "none",
13853
- borderRadius: "none"
13854
- }
13855
- };
13856
- }
13857
- function emphasizedFooterLinks(theme) {
13858
- return {
13859
- ...theme.footer,
13860
- navStyle: "minimal",
13861
- navWeight: "medium",
13862
- navColor: "text",
13863
- navLinkStyle: {
13864
- typography: "body",
13865
- fontWeight: "medium",
13866
- textTransform: "none",
13867
- italic: false,
13868
- colorToken: "text",
13869
- hoverColorToken: "primary",
13870
- padding: "none",
13871
- borderRadius: "none"
13872
- }
13873
- };
13874
- }
13875
14246
  const footerLookCatalog = defineExactCatalog()([{
13876
- id: asFooterLookId("footer-links-quiet"),
13877
- label: "Quiet links",
13878
- description: "Regular-weight footer navigation with a restrained hover.",
13879
- compile: quietFooterLinks
14247
+ id: asFooterLookId("footer-links-row"),
14248
+ label: "Links in a row",
14249
+ description: "Your links in a row, with the other footer sections in columns beside them."
13880
14250
  }, {
13881
- id: asFooterLookId("footer-links-emphasized"),
13882
- label: "Emphasized links",
13883
- description: "Medium-weight footer navigation with a clearer emphasis.",
13884
- compile: emphasizedFooterLinks
14251
+ id: asFooterLookId("footer-centred-name"),
14252
+ label: "Centred name, links beneath",
14253
+ description: "Your site name centred, with your links, contact details and social links beneath it."
13885
14254
  }]);
13886
14255
  new Map(footerLookCatalog.map((look) => [look.id, look]));
13887
14256
  //#endregion
@@ -15265,6 +15634,7 @@ function defineCuratedSiteStyle(input) {
15265
15634
  recommendedAppearancePresetIds
15266
15635
  },
15267
15636
  headerCuration: headerCurationBySiteStyle[input.id],
15637
+ footerLookRecipes: input.footerLookRecipes,
15268
15638
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
15269
15639
  buttonStyleChoices: input.buttonStyleChoices,
15270
15640
  paletteRecommendations: input.paletteRecommendations,
@@ -15750,7 +16120,11 @@ const lanternLooks = {
15750
16120
  margin: "40px"
15751
16121
  },
15752
16122
  fontLoading: {
15753
- extraBodyFontWeights: [500, 700],
16123
+ extraBodyFontWeights: [
16124
+ 500,
16125
+ 700,
16126
+ 800
16127
+ ],
15754
16128
  italicBodyFontWeights: [400]
15755
16129
  },
15756
16130
  surfaces: {
@@ -15800,6 +16174,38 @@ const lanternLooks = {
15800
16174
  ]
15801
16175
  },
15802
16176
  offers: [
16177
+ {
16178
+ id: id("body-text-reading-column"),
16179
+ treatment: "reading-column",
16180
+ roleMap: lanternRoles
16181
+ },
16182
+ {
16183
+ id: id("form-beside-introduction-arched-panel"),
16184
+ treatment: "arched-panel",
16185
+ addKnobs: ["archFrame"],
16186
+ roleMap: lanternRoles
16187
+ },
16188
+ {
16189
+ id: id("newsletter-signup-in-arch"),
16190
+ treatment: "signup-arch",
16191
+ addKnobs: ["archFrame"],
16192
+ roleMap: lanternRoles
16193
+ },
16194
+ {
16195
+ id: id("image-gallery-square-tiles"),
16196
+ treatment: "square-tiles",
16197
+ roleMap: lanternRoles
16198
+ },
16199
+ {
16200
+ id: id("image-gallery-arched-captions"),
16201
+ treatment: "arched-captions",
16202
+ roleMap: lanternRoles
16203
+ },
16204
+ {
16205
+ id: id("media-text-circle-beside-text"),
16206
+ treatment: "circle-beside",
16207
+ roleMap: lanternRoles
16208
+ },
15803
16209
  {
15804
16210
  id: id("event-details-panel"),
15805
16211
  treatment: "quiet",
@@ -16238,7 +16644,7 @@ const curatedSiteStyles = [
16238
16644
  "faq-contained-help",
16239
16645
  "contact-form-panel"
16240
16646
  ],
16241
- recommendedFooterLookIds: ["footer-links-quiet"],
16647
+ recommendedFooterLookIds: ["footer-links-row"],
16242
16648
  buttonStyleChoices: [
16243
16649
  buttonChoice("soft-pill"),
16244
16650
  buttonChoice("pebble"),
@@ -16357,7 +16763,7 @@ const curatedSiteStyles = [
16357
16763
  "testimonials-non-carded",
16358
16764
  "contact-form-panel"
16359
16765
  ],
16360
- recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
16766
+ recommendedFooterLookIds: ["footer-links-row"],
16361
16767
  buttonStyleChoices: [
16362
16768
  buttonChoice("earth-pill"),
16363
16769
  buttonChoice("soft-pill"),
@@ -16412,7 +16818,41 @@ const curatedSiteStyles = [
16412
16818
  "testimonials-brand-statement-cards",
16413
16819
  "contact-form-panel"
16414
16820
  ],
16415
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
16821
+ footerLookRecipes: { "footer-links-row": {
16822
+ arrangement: "split",
16823
+ ground: {
16824
+ kind: "token",
16825
+ token: "primary-800"
16826
+ },
16827
+ nav: {
16828
+ weight: "medium",
16829
+ colorToken: "primaryForeground",
16830
+ hoverColorToken: "secondary",
16831
+ typography: "body"
16832
+ },
16833
+ legal: {
16834
+ kind: "separate",
16835
+ bar: {
16836
+ fullBleed: true,
16837
+ background: {
16838
+ kind: "token",
16839
+ token: "primary-900"
16840
+ },
16841
+ textColor: "primaryForeground",
16842
+ textAlign: "center",
16843
+ paddingY: "compact",
16844
+ paddingX: "default",
16845
+ borderTop: { width: "none" }
16846
+ },
16847
+ linkStyle: {
16848
+ colorToken: "secondary",
16849
+ decorationColorToken: "secondary"
16850
+ }
16851
+ },
16852
+ brandAlign: "start",
16853
+ brandLogoSize: "sm"
16854
+ } },
16855
+ recommendedFooterLookIds: ["footer-links-row"],
16416
16856
  buttonStyleChoices: [
16417
16857
  buttonChoice("showtime-pill"),
16418
16858
  buttonChoice("confident-chip"),
@@ -16483,7 +16923,7 @@ const curatedSiteStyles = [
16483
16923
  "testimonials-statement-cards",
16484
16924
  "contact-form-panel"
16485
16925
  ],
16486
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
16926
+ recommendedFooterLookIds: ["footer-links-row"],
16487
16927
  buttonStyleChoices: [
16488
16928
  buttonChoice("ornate-ritual"),
16489
16929
  buttonChoice("joy-stamp"),
@@ -16530,7 +16970,22 @@ const curatedSiteStyles = [
16530
16970
  } }
16531
16971
  },
16532
16972
  recommendedAppearancePresetIds: ["feature-cards-bold-colors", "testimonials-statement-cards"],
16533
- recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
16973
+ footerLookRecipes: { "footer-links-row": {
16974
+ arrangement: "simple",
16975
+ ground: {
16976
+ kind: "token",
16977
+ token: "surface"
16978
+ },
16979
+ nav: {
16980
+ weight: "medium",
16981
+ colorToken: "text",
16982
+ hoverColorToken: "primary",
16983
+ typography: "body"
16984
+ },
16985
+ legal: { kind: "integrated" },
16986
+ brandAlign: "start"
16987
+ } },
16988
+ recommendedFooterLookIds: ["footer-links-row"],
16534
16989
  buttonStyleChoices: [
16535
16990
  buttonChoice("joy-stamp"),
16536
16991
  buttonChoice("ink-stamp"),
@@ -16582,7 +17037,7 @@ const curatedSiteStyles = [
16582
17037
  },
16583
17038
  testimonialQuote: serifDisplayQuote
16584
17039
  },
16585
- recommendedFooterLookIds: ["footer-links-quiet"],
17040
+ recommendedFooterLookIds: ["footer-links-row"],
16586
17041
  buttonStyleChoices: [
16587
17042
  buttonChoice("fulcrum"),
16588
17043
  buttonChoice("editorial-link"),
@@ -16659,7 +17114,7 @@ const curatedSiteStyles = [
16659
17114
  "faq-base-accordion",
16660
17115
  "booking-brand-band"
16661
17116
  ],
16662
- recommendedFooterLookIds: ["footer-links-quiet"],
17117
+ recommendedFooterLookIds: ["footer-links-row"],
16663
17118
  buttonStyleChoices: [
16664
17119
  buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
16665
17120
  buttonChoice("flat-ink"),
@@ -16697,7 +17152,22 @@ const curatedSiteStyles = [
16697
17152
  accordions: boldBorderedAccordionSystem,
16698
17153
  testimonialQuote: accentGlyphQuote
16699
17154
  },
16700
- recommendedFooterLookIds: ["footer-links-emphasized"],
17155
+ footerLookRecipes: { "footer-links-row": {
17156
+ arrangement: "simple",
17157
+ ground: {
17158
+ kind: "token",
17159
+ token: "surface"
17160
+ },
17161
+ nav: {
17162
+ weight: "medium",
17163
+ colorToken: "text",
17164
+ hoverColorToken: "primary",
17165
+ typography: "body"
17166
+ },
17167
+ legal: { kind: "integrated" },
17168
+ brandAlign: "start"
17169
+ } },
17170
+ recommendedFooterLookIds: ["footer-links-row"],
16701
17171
  buttonStyleChoices: [
16702
17172
  buttonChoice("offset-block"),
16703
17173
  buttonChoice("ink-stamp"),
@@ -16736,8 +17206,29 @@ const curatedSiteStyles = [
16736
17206
  accordions: warmInsetAccordionSystem,
16737
17207
  testimonialQuote: serifDisplayQuote
16738
17208
  },
16739
- recommendedFooterLookIds: ["footer-links-quiet"],
17209
+ footerLookRecipes: { "footer-centred-name": {
17210
+ arrangement: "centred",
17211
+ ground: {
17212
+ kind: "style-surface",
17213
+ surface: "deep"
17214
+ },
17215
+ nav: {
17216
+ weight: "regular",
17217
+ colorToken: "text",
17218
+ hoverColorToken: "primary",
17219
+ typography: "heading"
17220
+ },
17221
+ legal: {
17222
+ kind: "separate",
17223
+ bar: null
17224
+ },
17225
+ brandAlign: "center"
17226
+ } },
17227
+ recommendedFooterLookIds: ["footer-centred-name", "footer-links-row"],
16740
17228
  buttonStyleChoices: [
17229
+ buttonChoice("gilt-slab"),
17230
+ buttonChoice("hairline-tab"),
17231
+ buttonChoice("marquee"),
16741
17232
  buttonChoice("ringed-pill"),
16742
17233
  buttonChoice("earth-pill"),
16743
17234
  buttonChoice("editorial-link")
@@ -16772,7 +17263,7 @@ const curatedSiteStyles = [
16772
17263
  accordions: editorialDividedAccordionSystem,
16773
17264
  testimonialQuote: serifDisplayQuote
16774
17265
  },
16775
- recommendedFooterLookIds: ["footer-links-quiet"],
17266
+ recommendedFooterLookIds: ["footer-links-row"],
16776
17267
  buttonStyleChoices: [
16777
17268
  buttonChoice("flat-ink", void 0, { corners: "square" }),
16778
17269
  buttonChoice("editorial-link"),
@@ -16800,6 +17291,7 @@ function curatedStyleTemplate(input) {
16800
17291
  }
16801
17292
  curatedSiteStyles.forEach((style) => {
16802
17293
  if (style.looks.kind === "offers") validateLookFallbacks(style.looks);
17294
+ (/* @__PURE__ */ new Set([...Object.values(style.footerLookRecipes ?? {}), ...style.recommendedFooterLookIds.map((id) => resolveFooterLookRecipe(style, id))])).forEach((recipe) => validateFooterRecipeSurfaces(style, recipe));
16803
17295
  });
16804
17296
  //#endregion
16805
17297
  //#region ../theme-core/src/site-styles/effectiveArrangement.ts
@@ -16875,21 +17367,6 @@ const blockDesignFallback = {
16875
17367
  };
16876
17368
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16877
17369
  //#endregion
16878
- //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16879
- const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
16880
- const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
16881
- siteChromeBackgroundColorTokens.filter((token) => !quickSiteChromeBackgroundColorTokens.includes(token));
16882
- function parseSiteChromeBackgroundColorToken(value) {
16883
- const token = parseBackgroundAppearanceColorToken(value);
16884
- return token ? token : null;
16885
- }
16886
- function toSiteChromeBackgroundColorTokens(tokenNames) {
16887
- return tokenNames.flatMap((name) => {
16888
- const token = parseSiteChromeBackgroundColorToken(name);
16889
- return token ? [token] : [];
16890
- });
16891
- }
16892
- //#endregion
16893
17370
  //#region ../theme-core/src/site-styles/siteChromeNavPreferences.ts
16894
17371
  const headerNavTypographyPreferenceValues = [
16895
17372
  "inherit",
@@ -17005,21 +17482,6 @@ z.object({
17005
17482
  }).strict();
17006
17483
  //#endregion
17007
17484
  //#region ../theme-core/src/site-styles/headerPreferencesPersistence.ts
17008
- const backgroundColorTokenSchema = z.unknown().transform((value, ctx) => {
17009
- const token = parseSiteChromeBackgroundColorToken(value);
17010
- if (token === null) {
17011
- ctx.addIssue({
17012
- code: "custom",
17013
- message: "Unknown site chrome background colour token"
17014
- });
17015
- return z.NEVER;
17016
- }
17017
- return token;
17018
- });
17019
- const backgroundOverrideSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("default") }).strict(), z.object({
17020
- kind: z.literal("color"),
17021
- token: backgroundColorTokenSchema
17022
- }).strict()]);
17023
17485
  const logoTextIntentSchema = z.object({
17024
17486
  mobileMaxWidth: z.enum([
17025
17487
  "xs",
@@ -17045,7 +17507,7 @@ const headerPreferencesShape = {
17045
17507
  navFontRole: z.enum(headerNavTypographyPreferenceValues),
17046
17508
  navTextSize: z.enum(headerNavFontSizePreferenceValues),
17047
17509
  interactionPalette: z.union([z.literal("recommended"), z.enum(headerInteractionPaletteValues)]),
17048
- background: backgroundOverrideSchema,
17510
+ background: siteChromeBackgroundOverrideSchema,
17049
17511
  structure: structureSchema
17050
17512
  };
17051
17513
  z.object(headerPreferencesShape).strict();
@@ -20304,48 +20766,50 @@ const GAP_VALUE_MAP = {
20304
20766
  };
20305
20767
  //#endregion
20306
20768
  //#region ../blocks/src/system/node/fragments/responsiveTwoColumn.ts
20307
- 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" }) {
20308
- const baseClass = !gapFrom ? `${containerClassName} ${gapClassName}`.trim() : containerClassName;
20309
- const props = { className: { $bind: {
20310
- from: imagePositionFrom,
20311
- transforms: [{
20312
- id: "ui.twoColumnContainerClass",
20313
- options: {
20314
- base: baseClass,
20315
- reverseClass: "rb-md-flex-row-reverse"
20316
- }
20317
- }],
20318
- fallback: baseClass
20319
- } } };
20320
- if (gapFrom) props.style = { gap: { $bind: {
20321
- from: gapFrom,
20322
- transforms: [{
20323
- id: "boxStyles.semanticGapValue",
20324
- options: { fallback: gapFallback }
20325
- }],
20326
- fallback: GAP_VALUE_MAP[gapFallback]
20327
- } } };
20328
- return el("div", props, [el("div", {
20329
- className: imageWrapperClassName,
20330
- style: { flexBasis: { $bind: {
20331
- from: ratioFrom,
20769
+ /** The shared two-column shell keeps Look hooks opt-in and absent for legacy content. */
20770
+ function responsiveTwoColumn(config) {
20771
+ return el("div", twoColumnProps(config), [twoColumnWrapper(config, "image", config.image), twoColumnWrapper(config, "text", config.text)]);
20772
+ }
20773
+ function twoColumnProps(config) {
20774
+ const base = `${config.containerClassName ?? "rb-flex rb-flex-col rb-md-flex-row"} ${config.gapFrom ? "" : config.gapClassName ?? "rb-gap-6"}`.trim();
20775
+ const fallback = config.gapFallback ?? "comfortable";
20776
+ return {
20777
+ ...config.lookSlots ? lookSlot("frame") : {},
20778
+ className: { $bind: {
20779
+ from: config.imagePositionFrom,
20332
20780
  transforms: [{
20333
- id: "ui.twoColumnFlexBasis",
20334
- options: { side: "image" }
20781
+ id: "ui.twoColumnContainerClass",
20782
+ options: {
20783
+ base,
20784
+ reverseClass: "rb-md-flex-row-reverse"
20785
+ }
20335
20786
  }],
20336
- fallback: "50%"
20337
- } } }
20338
- }, [image]), el("div", {
20339
- className: textWrapperClassName,
20787
+ fallback: base
20788
+ } },
20789
+ ...config.gapFrom ? { style: { gap: { $bind: {
20790
+ from: config.gapFrom,
20791
+ transforms: [{
20792
+ id: "boxStyles.semanticGapValue",
20793
+ options: { fallback }
20794
+ }],
20795
+ fallback: GAP_VALUE_MAP[fallback]
20796
+ } } } } : {}
20797
+ };
20798
+ }
20799
+ function twoColumnWrapper(config, side, child) {
20800
+ const className = side === "image" ? config.imageWrapperClassName ?? "rb-w-full rb-shrink-0" : config.textWrapperClassName ?? "rb-w-full rb-min-w-0 rb-flex-1";
20801
+ return el("div", {
20802
+ ...config.lookSlots ? lookSlot(side === "image" ? "media" : "copy") : {},
20803
+ className,
20340
20804
  style: { flexBasis: { $bind: {
20341
- from: ratioFrom,
20805
+ from: config.ratioFrom,
20342
20806
  transforms: [{
20343
20807
  id: "ui.twoColumnFlexBasis",
20344
- options: { side: "text" }
20808
+ options: { side }
20345
20809
  }],
20346
20810
  fallback: "50%"
20347
20811
  } } }
20348
- }, [text])]);
20812
+ }, [child]);
20349
20813
  }
20350
20814
  //#endregion
20351
20815
  //#region ../blocks/src/system/node/fragments/styledCard.ts
@@ -20526,6 +20990,47 @@ function sectionState(opts) {
20526
20990
  })]);
20527
20991
  }
20528
20992
  //#endregion
20993
+ //#region ../blocks/src/system/node/fragments/sectionHead.ts
20994
+ const recoverEmptyHeadingWhenActive = {
20995
+ kind: "recover-empty-when-active",
20996
+ placeholder: "Add heading"
20997
+ };
20998
+ const recoverEmptyDescriptionWhenActive = {
20999
+ kind: "recover-empty-when-active",
21000
+ placeholder: "Add description"
21001
+ };
21002
+ function sectionHeaderLayoutNodes(options = {}) {
21003
+ const headingNode = text({
21004
+ as: "h2",
21005
+ ...lookSlot("heading")
21006
+ }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
21007
+ const descriptionNode = richText({
21008
+ className: "rb-prose rb-max-w-none",
21009
+ ...lookSlot("intro")
21010
+ }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
21011
+ if (options.splitClassName) return [el("div", {
21012
+ className: options.splitClassName,
21013
+ ...lookSlot("head")
21014
+ }, [headingNode, descriptionNode])];
21015
+ return [headingNode, descriptionNode];
21016
+ }
21017
+ /** Shared optional section copy. Existing consumers keep their description ID. */
21018
+ const sectionHeaderFields = (defaultHeading, introLabel = "Description") => [{
21019
+ id: "heading",
21020
+ type: "text",
21021
+ label: "Heading",
21022
+ description: "Main heading for the section",
21023
+ required: false,
21024
+ multiline: false,
21025
+ ...defaultHeading === void 0 ? {} : { defaultValue: defaultHeading }
21026
+ }, {
21027
+ id: "description",
21028
+ type: "richText",
21029
+ label: introLabel,
21030
+ description: "Optional introductory text",
21031
+ required: false
21032
+ }];
21033
+ //#endregion
20529
21034
  //#region ../blocks/src/system/fragments/types.ts
20530
21035
  const FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
20531
21036
  const FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;
@@ -20858,6 +21363,7 @@ const bodyCopyFragment = defineFragment({
20858
21363
  ],
20859
21364
  layout: stack({
20860
21365
  gap: "md",
21366
+ ...lookSlot("copy"),
20861
21367
  className: "body-copy-container",
20862
21368
  align: { $bind: {
20863
21369
  from: "content.alignment",
@@ -20866,6 +21372,7 @@ const bodyCopyFragment = defineFragment({
20866
21372
  } }
20867
21373
  }, [text({
20868
21374
  as: "h2",
21375
+ ...lookSlot("heading"),
20869
21376
  className: { $bind: {
20870
21377
  from: "content.alignment",
20871
21378
  transforms: [{
@@ -20874,14 +21381,22 @@ const bodyCopyFragment = defineFragment({
20874
21381
  }],
20875
21382
  fallback: "body-copy-heading"
20876
21383
  } }
20877
- }, when("content.heading"), bind("content.heading")), richText({ className: { $bind: {
20878
- from: "content.alignment",
20879
- transforms: [{
20880
- id: "ui.bodyClassFromAlignment",
20881
- options: { base: "body-copy-body rb-prose rb-max-w-none" }
20882
- }],
20883
- fallback: "body-copy-body rb-prose rb-max-w-none"
20884
- } } }, bind("content.body"))])
21384
+ }, when("content.heading", { authoringPresence: {
21385
+ kind: "recover-empty-when-active",
21386
+ placeholder: "Add heading"
21387
+ } }), bind("content.heading")), richText({
21388
+ ...lookSlot("item-body"),
21389
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
21390
+ lookSlots: { $bind: { from: "content._lookSlots" } },
21391
+ className: { $bind: {
21392
+ from: "content.alignment",
21393
+ transforms: [{
21394
+ id: "ui.bodyClassFromAlignment",
21395
+ options: { base: "body-copy-body rb-prose rb-max-w-none" }
21396
+ }],
21397
+ fallback: "body-copy-body rb-prose rb-max-w-none"
21398
+ } }
21399
+ }, bind("content.body"))])
20885
21400
  });
20886
21401
  //#endregion
20887
21402
  //#region ../blocks/src/system/fragments/library/heroCopy.ts
@@ -21897,8 +22412,19 @@ const formCopyFragment = defineFragment({
21897
22412
  }],
21898
22413
  layout: [text({
21899
22414
  as: "h2",
22415
+ ...lookSlot("heading"),
21900
22416
  className: "form-copy-title"
21901
- }, when("content.title"), bind("content.title")), richText({ className: "form-copy-intro rb-prose rb-max-w-none" }, when("content.intro"), bind("content.intro"))]
22417
+ }, when("content.title", { authoringPresence: {
22418
+ kind: "recover-empty-when-active",
22419
+ placeholder: "Add heading"
22420
+ } }), bind("content.title")), richText({
22421
+ className: "form-copy-intro rb-prose rb-max-w-none",
22422
+ ...lookSlot("intro"),
22423
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } }
22424
+ }, when("content.intro", { authoringPresence: {
22425
+ kind: "recover-empty-when-active",
22426
+ placeholder: "Add introduction"
22427
+ } }), bind("content.intro"))]
21902
22428
  });
21903
22429
  //#endregion
21904
22430
  //#region ../blocks/src/system/helpers/api-bindings.ts
@@ -21947,6 +22473,7 @@ const formEmbedFragment = defineFragment({
21947
22473
  }
21948
22474
  ],
21949
22475
  layout: [form(withApiBindings({
22476
+ lookSlots: { $bind: { from: "content._lookSlots" } },
21950
22477
  spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
21951
22478
  submitLabel: { $bind: { from: "submitLabel" } },
21952
22479
  successMessage: { $bind: { from: "successMessage" } }
@@ -22200,8 +22727,18 @@ const newsletterCopyFragment = defineFragment({
22200
22727
  }],
22201
22728
  layout: [text({
22202
22729
  as: "h2",
22203
- className: "newsletter-copy-title"
22204
- }, when("content.title"), bind("content.title")), richText({ className: "newsletter-copy-subtitle rb-prose rb-max-w-none" }, when("content.subtitle"), bind("content.subtitle"))]
22730
+ className: "newsletter-copy-title",
22731
+ ...lookSlot("heading")
22732
+ }, when("content.title", { authoringPresence: {
22733
+ kind: "recover-empty-when-active",
22734
+ placeholder: "Add heading"
22735
+ } }), bind("content.title")), richText({
22736
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none",
22737
+ ...lookSlot("intro")
22738
+ }, when("content.subtitle", { authoringPresence: {
22739
+ kind: "recover-empty-when-active",
22740
+ placeholder: "Add introduction"
22741
+ } }), bind("content.subtitle"))]
22205
22742
  });
22206
22743
  //#endregion
22207
22744
  //#region ../blocks/src/system/fragments/library/newsletterForm.ts
@@ -22269,6 +22806,7 @@ const newsletterFormFragment = defineFragment({
22269
22806
  }
22270
22807
  ],
22271
22808
  layout: [el("newsletter-form", withApiBindings({
22809
+ lookSlots: { $bind: { from: "content._lookSlots" } },
22272
22810
  source: { $bind: {
22273
22811
  from: "mailingListSource",
22274
22812
  fallback: "block"
@@ -23761,18 +24299,11 @@ const introBlockDefinition = { manifest: createBlockManifest({
23761
24299
  //#endregion
23762
24300
  //#region ../blocks/src/system/blocks/body-text.ts
23763
24301
  const bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
23764
- const proseLayout = styledSection({
23765
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
23766
- spacing: "medium",
23767
- baseClass: ""
23768
- });
23769
- const introLayout = styledSection({
23770
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
23771
- spacing: "medium",
23772
- baseClass: ""
23773
- });
23774
- const narrowLayout = styledSection({
23775
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
24302
+ const bodyTextLayout = styledSection({
24303
+ children: stack({
24304
+ className: "rb-container",
24305
+ ...lookSlot("frame")
24306
+ }, bodyCopyComposition.layout),
23776
24307
  spacing: "medium",
23777
24308
  baseClass: ""
23778
24309
  });
@@ -23786,11 +24317,11 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
23786
24317
  fragment: bodyCopyFragment,
23787
24318
  fieldPriority: 0
23788
24319
  }],
23789
- layout: proseLayout,
24320
+ layout: bodyTextLayout,
23790
24321
  variants: {
23791
- prose: proseLayout,
23792
- intro: introLayout,
23793
- narrow: narrowLayout
24322
+ prose: bodyTextLayout,
24323
+ intro: bodyTextLayout,
24324
+ narrow: bodyTextLayout
23794
24325
  },
23795
24326
  variantMeaning: { kind: "arrangement" },
23796
24327
  defaultVariant: "prose",
@@ -24238,6 +24769,52 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
24238
24769
  styleTokens: { spacing: "md" }
24239
24770
  }) };
24240
24771
  //#endregion
24772
+ //#region ../blocks/src/system/runtime/lookSurfaces.ts
24773
+ const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
24774
+ const lookListPresentationSchemaShape = {
24775
+ sectionAction: z.object({
24776
+ label: z.string(),
24777
+ href: z.string()
24778
+ }).optional(),
24779
+ actionSize: z.enum([
24780
+ "sm",
24781
+ "md",
24782
+ "lg"
24783
+ ]).optional(),
24784
+ itemActionStyle: z.enum(["button", "link"]).optional(),
24785
+ itemRoles: z.object({
24786
+ container: z.enum([
24787
+ "card",
24788
+ "statement",
24789
+ "highlight"
24790
+ ]).optional(),
24791
+ items: z.enum([
24792
+ "card",
24793
+ "statement",
24794
+ "highlight"
24795
+ ]).optional(),
24796
+ at: z.partialRecord(z.enum([
24797
+ "first",
24798
+ "last",
24799
+ "middle",
24800
+ "odd",
24801
+ "even"
24802
+ ]), z.enum([
24803
+ "card",
24804
+ "statement",
24805
+ "highlight"
24806
+ ])).optional()
24807
+ }).optional(),
24808
+ roleSurfaces: z.record(z.enum([
24809
+ "card",
24810
+ "statement",
24811
+ "highlight"
24812
+ ]), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
24813
+ panelHeading: z.string().optional(),
24814
+ lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
24815
+ itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
24816
+ };
24817
+ //#endregion
24241
24818
  //#region ../blocks/src/contracts/runtime.ts
24242
24819
  function decodeSuccess(value) {
24243
24820
  return {
@@ -24344,6 +24921,7 @@ const formFieldGroupSchema = z.discriminatedUnion("type", [z.object({
24344
24921
  fields: z.tuple([formFieldSchema, formFieldSchema])
24345
24922
  })]);
24346
24923
  const formSourceSchema = z.object({
24924
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
24347
24925
  value: formRecordSchema.optional(),
24348
24926
  siteId: z.string().optional(),
24349
24927
  apiBaseUrl: z.string().optional(),
@@ -24353,6 +24931,7 @@ const formSourceSchema = z.object({
24353
24931
  spamProtectionEnabled: z.boolean().optional()
24354
24932
  });
24355
24933
  const formDisplaySchema = z.object({
24934
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
24356
24935
  kind: z.literal("form"),
24357
24936
  state: z.enum(["missing", "ready"]),
24358
24937
  className: z.string().nullable(),
@@ -24373,17 +24952,30 @@ z.object({
24373
24952
  });
24374
24953
  function buildFormDisplay(source) {
24375
24954
  const form = source.value ?? null;
24376
- const fields = form?.schemaJson?.fields;
24377
- const groups = Array.isArray(fields) ? groupFormFields(fields) : [];
24955
+ const fields = formDisplayFields(form);
24378
24956
  return {
24379
24957
  kind: "form",
24380
- state: form ? "ready" : "missing",
24958
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
24959
+ state: fields.state,
24381
24960
  className: source.className ?? null,
24382
- formId: form?.id ?? null,
24961
+ formId: fields.formId,
24383
24962
  submitLabel: source.submitLabel?.trim() || "Submit",
24384
24963
  successMessage: source.successMessage ?? null,
24385
24964
  form,
24386
- groups
24965
+ groups: fields.groups
24966
+ };
24967
+ }
24968
+ function formDisplayFields(form) {
24969
+ if (!form) return {
24970
+ state: "missing",
24971
+ formId: null,
24972
+ groups: []
24973
+ };
24974
+ const fields = form.schemaJson?.fields;
24975
+ return {
24976
+ state: "ready",
24977
+ formId: form.id,
24978
+ groups: Array.isArray(fields) ? groupFormFields(fields) : []
24387
24979
  };
24388
24980
  }
24389
24981
  const formBlockRuntime = defineProgressiveBlockRuntime({
@@ -24406,18 +24998,27 @@ function fragmentLayoutNode$1(layout) {
24406
24998
  function isNodeDefinitionArray$1(layout) {
24407
24999
  return Array.isArray(layout);
24408
25000
  }
24409
- const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
25001
+ const copyLayout = props(lookSlot("head"))(fragmentLayoutNode$1(formCopyFragment.layout));
25002
+ const embedLayout$1 = fragmentLayoutNode$1(formEmbedFragment.layout);
24410
25003
  const formSurface = styledContainer({
25004
+ rootProps: lookSlot("panel"),
24411
25005
  bindFrom: "_containerStyles",
24412
25006
  constrainWidth: false,
24413
25007
  baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
24414
- children: fragmentLayoutNode$1(formEmbedFragment.layout)
25008
+ children: embedLayout$1
24415
25009
  });
24416
25010
  function createFormLayout(variant) {
24417
25011
  if (variant === "two-column") return styledSection({
24418
- 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({
25012
+ children: el("div", {
25013
+ className: "rb-container",
25014
+ ...lookSlot("layout")
25015
+ }, [el("div", {
25016
+ className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start",
25017
+ ...lookSlot("frame")
25018
+ }, [stack({
24419
25019
  gap: "md",
24420
- className: "rb-form-copy-column"
25020
+ className: "rb-form-copy-column",
25021
+ ...lookSlot("copy")
24421
25022
  }, [copyLayout]), formSurface])]),
24422
25023
  baseClass: "",
24423
25024
  spacing: "medium",
@@ -24445,6 +25046,15 @@ const formManifest = createBlockManifest({
24445
25046
  description: "Renders a saved form definition with server-side submit.",
24446
25047
  includeContainerStyles: true,
24447
25048
  fragments: [{ fragment: formCopyFragment }, { fragment: formEmbedFragment }],
25049
+ additionalFields: [{
25050
+ id: "archFrame",
25051
+ type: "boolean",
25052
+ label: "Arch frame",
25053
+ ui: {
25054
+ intent: "display",
25055
+ hidden: true
25056
+ }
25057
+ }],
24448
25058
  layout: formLayout,
24449
25059
  variants: {
24450
25060
  default: formLayout,
@@ -25107,7 +25717,14 @@ const footerNavGroupsLayout = stack({
25107
25717
  }, [text({
25108
25718
  as: "h3",
25109
25719
  className: "rb-label",
25110
- style: textColorStyle("text/70")
25720
+ "data-slot": { $bind: { from: "content.footerRuntime.slots.group-label" } },
25721
+ style: { $bind: {
25722
+ from: "content.footerRuntime.arrangement",
25723
+ transforms: [{
25724
+ id: "layout.footerModuleInkStyle",
25725
+ options: { opacity: 70 }
25726
+ }]
25727
+ } }
25111
25728
  }, when("group.label"), bind("group.label")), stack({
25112
25729
  gap: "sm",
25113
25730
  align: "start",
@@ -25137,6 +25754,14 @@ const footerMailingListBindings = {
25137
25754
  targeting: { $bind: { from: "module.engagement.runtime.targeting" } }
25138
25755
  };
25139
25756
  const footerSpamProtectionBinding = { spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } } };
25757
+ const brandMedia = media({ className: "rb-h-10 rb-w-auto" }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
25758
+ id: "layout.chromeLogo",
25759
+ options: { surface: "footer-root" }
25760
+ }] }));
25761
+ const brandTitle = text({
25762
+ as: "strong",
25763
+ className: "footer-logo-text rb-nav-text"
25764
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }));
25140
25765
  const brandLogo = link({
25141
25766
  href: "/",
25142
25767
  className: { $bind: {
@@ -25147,20 +25772,39 @@ const brandLogo = link({
25147
25772
  }],
25148
25773
  fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
25149
25774
  } }
25150
- }, [media({ className: { $bind: {
25151
- from: "$root.theme.footer.logo",
25152
- transforms: [{
25153
- id: "layout.footerLogoMediaClass",
25154
- options: { base: "rb-h-10 rb-w-auto" }
25155
- }],
25156
- fallback: "rb-h-10 rb-w-auto"
25157
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
25158
- id: "layout.chromeLogo",
25159
- options: { surface: "footer-root" }
25160
- }] })), text({
25161
- as: "strong",
25162
- className: "footer-logo-text rb-nav-text"
25163
- }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
25775
+ }, [brandMedia, brandTitle], (node) => ({
25776
+ ...node,
25777
+ $when: {
25778
+ when: {
25779
+ from: "module",
25780
+ transforms: [{ id: "layout.footerBrandArrangement" }]
25781
+ },
25782
+ equals: "row"
25783
+ }
25784
+ }));
25785
+ const centredBrand = stack({
25786
+ gap: "md",
25787
+ align: "center"
25788
+ }, [link({
25789
+ href: "/",
25790
+ "data-slot": { $bind: { from: "module.slots.media" } },
25791
+ className: "footer-logo rb-inline-flex rb-items-center rb-no-underline"
25792
+ }, [brandMedia], when("module.slots.media")), {
25793
+ ...brandTitle,
25794
+ props: {
25795
+ ...brandTitle.props,
25796
+ "data-slot": { $bind: { from: "module.slots.heading" } }
25797
+ }
25798
+ }], (node) => ({
25799
+ ...node,
25800
+ $when: {
25801
+ when: {
25802
+ from: "module",
25803
+ transforms: [{ id: "layout.footerBrandArrangement" }]
25804
+ },
25805
+ equals: "centred"
25806
+ }
25807
+ }));
25164
25808
  const navigation = stack({
25165
25809
  gap: "md",
25166
25810
  className: "rb-w-full"
@@ -25185,14 +25829,18 @@ const address = text({
25185
25829
  }, when("module.kind", { equals: "business-address" }), bind("module.address"));
25186
25830
  const contact = stack({
25187
25831
  gap: "sm",
25188
- className: "rb-items-start"
25832
+ className: { $bind: {
25833
+ from: "module.contactClassName",
25834
+ fallback: "rb-items-start"
25835
+ } }
25189
25836
  }, [link({
25190
25837
  href: { $bind: { from: "contactLink.href" } },
25191
25838
  className: "rb-nav-text rb-break-words transition-theme-standard"
25192
25839
  }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
25193
25840
  const hours = stack({
25194
25841
  gap: "sm",
25195
- className: "rb-w-full"
25842
+ className: "rb-w-full",
25843
+ "data-slot": { $bind: { from: "module.slots.schedule" } }
25196
25844
  }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
25197
25845
  as: "span",
25198
25846
  className: "rb-label"
@@ -25203,7 +25851,10 @@ const hours = stack({
25203
25851
  as: "p",
25204
25852
  className: "rb-caption rb-opacity-70"
25205
25853
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
25206
- const socials = inline({ className: "rb-footer-socials" }, [link({
25854
+ const socials = inline({
25855
+ className: "rb-footer-socials",
25856
+ "data-slot": { $bind: { from: "module.slots.social" } }
25857
+ }, [link({
25207
25858
  href: { $bind: { from: "social.href" } },
25208
25859
  target: "_blank",
25209
25860
  rel: "noreferrer noopener",
@@ -25212,7 +25863,14 @@ const socials = inline({ className: "rb-footer-socials" }, [link({
25212
25863
  }, [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" }));
25213
25864
  const authoredCopy = richText({
25214
25865
  className: "rb-prose rb-prose-sm rb-max-w-none",
25215
- style: textColorStyle("text/80")
25866
+ "data-slot": { $bind: { from: "module.slots.copy" } },
25867
+ style: { $bind: {
25868
+ from: "content.footerRuntime.arrangement",
25869
+ transforms: [{
25870
+ id: "layout.footerModuleInkStyle",
25871
+ options: { opacity: 80 }
25872
+ }]
25873
+ } }
25216
25874
  }, when("module.content"), bind("module.content", { transforms: [{
25217
25875
  id: "content.interpolateRichTextTokens",
25218
25876
  options: { tokens: ["year", "site_name"] }
@@ -25250,27 +25908,44 @@ const platformAttribution = el("div", {
25250
25908
  ], when("module.kind", { equals: "attribution" }));
25251
25909
  const footerGroup = stack({
25252
25910
  gap: "md",
25253
- align: "stretch",
25911
+ align: { $bind: {
25912
+ from: "group.align",
25913
+ fallback: "stretch"
25914
+ } },
25254
25915
  className: { $bind: {
25255
25916
  from: "group.className",
25256
25917
  fallback: "rb-min-w-0"
25257
25918
  } },
25919
+ "data-slot": { $bind: { from: "group.slot" } },
25258
25920
  "data-footer-group": { $bind: { from: "group.kind" } }
25259
25921
  }, [stack({
25260
25922
  gap: "md",
25261
- align: "start",
25923
+ align: { $bind: {
25924
+ from: "module.align",
25925
+ fallback: "start"
25926
+ } },
25927
+ className: { $bind: { from: "module.className" } },
25262
25928
  "data-preview-footer-module-id": { $bind: { from: "module.id" } }
25263
25929
  }, [
25264
25930
  text({
25265
25931
  as: "h2",
25266
25932
  className: "rb-label",
25267
- style: textColorStyle("text/70")
25933
+ "data-slot": { $bind: { from: "module.slots.group-label" } },
25934
+ style: { $bind: {
25935
+ from: "content.footerRuntime.arrangement",
25936
+ transforms: [{
25937
+ id: "layout.footerModuleInkStyle",
25938
+ options: { opacity: 70 }
25939
+ }]
25940
+ } }
25268
25941
  }, bind("module.heading"), when("module.heading")),
25269
25942
  brandLogo,
25943
+ centredBrand,
25270
25944
  navigation,
25271
25945
  stack({
25272
25946
  gap: "sm",
25273
- className: "rb-w-full"
25947
+ className: "rb-w-full",
25948
+ "data-slot": { $bind: { from: "module.slots.navigation" } }
25274
25949
  }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
25275
25950
  address,
25276
25951
  contact,
@@ -25283,10 +25958,12 @@ const footerGroup = stack({
25283
25958
  ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
25284
25959
  const footerMainRegion = stack({
25285
25960
  className: { $bind: { from: "region.className" } },
25961
+ "data-slot": { $bind: { from: "region.slot" } },
25286
25962
  "data-footer-region": { $bind: { from: "region.kind" } }
25287
25963
  }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
25288
25964
  const footerEngagementRegion = stack({
25289
25965
  className: { $bind: { from: "region.className" } },
25966
+ "data-slot": { $bind: { from: "region.slot" } },
25290
25967
  "data-footer-region": "engagement-row"
25291
25968
  }, [footerGroup], when("region.kind", { equals: "engagement-row" }), repeat("content.footerRuntime.regions", "region"));
25292
25969
  const footerBottomRegion = stack({ className: { $bind: {
@@ -25303,6 +25980,7 @@ const footerBottomRegion = stack({ className: { $bind: {
25303
25980
  from: "$root.theme.footer",
25304
25981
  transforms: [{ id: "layout.footerBottomBarStyle" }]
25305
25982
  } },
25983
+ "data-slot": { $bind: { from: "region.slot" } },
25306
25984
  "data-footer-region": "bottom"
25307
25985
  }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
25308
25986
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
@@ -25324,6 +26002,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
25324
26002
  transforms: [{ id: "layout.footerRootStyle" }],
25325
26003
  fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
25326
26004
  } },
26005
+ "data-arrangement": { $bind: { from: "content.footerRuntime.arrangementHook" } },
25327
26006
  "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
25328
26007
  }, [
25329
26008
  footerEngagementRegion,
@@ -26987,17 +27666,30 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
26987
27666
  }],
26988
27667
  fallback: ""
26989
27668
  } };
26990
- const copyHeading = el("div", { className: titleClassNameFromAlignment }, [text({
27669
+ const copyHeading = el("div", {
27670
+ className: titleClassNameFromAlignment,
27671
+ ...lookSlot("head")
27672
+ }, [text({
26991
27673
  as: "p",
26992
- className: eyebrowClassName("rb-eyebrow heading-eyebrow")
26993
- }, when("content.eyebrow"), bind("content.eyebrow")), text({ as: "h2" }, bind("content.title"))], when("content.title"));
26994
- 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"))]);
26995
- 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" }, [
26996
- copyHeading,
26997
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
26998
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
26999
- ]);
27674
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
27675
+ ...lookSlot("eyebrow")
27676
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
27677
+ as: "h2",
27678
+ ...lookSlot("heading")
27679
+ }, bind("content.title"))], when("content.title"));
27680
+ const textContentNodes = (className) => {
27681
+ const props = {
27682
+ className,
27683
+ ...lookSlot("intro"),
27684
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
27685
+ lookSlots: { $bind: { from: "content._lookSlots" } }
27686
+ };
27687
+ return [styledCard([richText(props, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText(props, when("content.wrapTextInCard", { not: true }), bind("content.text"))];
27688
+ };
27689
+ const defaultTextColumn = el("div", {}, textContentNodes("rb-prose rb-max-w-none"));
27690
+ 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)]);
27000
27691
  const defaultImageCommonProps = {
27692
+ ...lookSlot("photo"),
27001
27693
  className: { $bind: {
27002
27694
  from: "content.imageShape",
27003
27695
  transforms: [{
@@ -27037,6 +27729,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
27037
27729
  slidesToShow: 1
27038
27730
  }, [media(defaultImageCommonProps, bind("item.image"), repeat("content.images", "item"))]);
27039
27731
  const defaultImagesLayout = el("div", {}, [responsiveTwoColumn({
27732
+ lookSlots: true,
27040
27733
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
27041
27734
  text: defaultTextColumn,
27042
27735
  ratioFrom: "content.ratio",
@@ -27048,6 +27741,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
27048
27741
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1"
27049
27742
  })], whenImagesLength(0, { not: true }));
27050
27743
  const bioImagesLayout = el("div", {}, [responsiveTwoColumn({
27744
+ lookSlots: true,
27051
27745
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
27052
27746
  text: bioTextColumn,
27053
27747
  ratioFrom: "content.ratio",
@@ -27058,15 +27752,15 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
27058
27752
  imageWrapperClassName: "rb-w-full rb-shrink-0",
27059
27753
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
27060
27754
  })], whenImagesLength(0, { not: true }));
27061
- 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));
27062
- const bioTextOnlyLayout = el("div", { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" }, [
27063
- text({
27064
- as: "h2",
27065
- className: titleClassNameFromAlignment
27066
- }, when("content.title"), bind("content.title")),
27067
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
27068
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
27069
- ], whenImagesLength(0));
27755
+ const defaultTextOnlyLayout = el("div", lookSlot("copy"), textContentNodes("rb-prose rb-max-w-none"), whenImagesLength(0));
27756
+ const bioTextOnlyLayout = el("div", {
27757
+ className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5",
27758
+ ...lookSlot("copy")
27759
+ }, [text({
27760
+ as: "h2",
27761
+ className: titleClassNameFromAlignment,
27762
+ ...lookSlot("heading")
27763
+ }, when("content.title"), bind("content.title")), ...textContentNodes(bodyClassNameFromAlignment)], whenImagesLength(0));
27070
27764
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
27071
27765
  const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
27072
27766
  const defaultLayout = styledSection({
@@ -27090,9 +27784,31 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
27090
27784
  }),
27091
27785
  baseClass: "",
27092
27786
  spacing: "medium"
27787
+ }),
27788
+ "circle-beside": styledSection({
27789
+ baseClass: "",
27790
+ spacing: "medium",
27791
+ children: styledContainer({ children: el("div", lookSlot("frame"), [el("div", lookSlot("media"), [
27792
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(1)),
27793
+ el("div", {}, [el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))], whenImagesLength(0, { not: true })),
27794
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(0))
27795
+ ]), el("div", lookSlot("copy"), [el("div", lookSlot("head"), [text({
27796
+ as: "p",
27797
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
27798
+ ...lookSlot("eyebrow")
27799
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
27800
+ as: "h2",
27801
+ ...lookSlot("heading")
27802
+ }, bind("content.title"), when("content.title", { authoringPresence: {
27803
+ kind: "recover-empty-when-active",
27804
+ placeholder: "Add heading"
27805
+ } }))]), defaultTextColumn])]) })
27093
27806
  })
27094
27807
  },
27095
- variantMeaning: { kind: "arrangement" },
27808
+ variantMeaning: {
27809
+ kind: "arrangement",
27810
+ lookOnlyKeys: ["circle-beside"]
27811
+ },
27096
27812
  defaultVariant: "default",
27097
27813
  variantOptions: {
27098
27814
  default: { label: "Default" },
@@ -28258,24 +28974,6 @@ const emptyStateField = {
28258
28974
  ui: { intent: "display" }
28259
28975
  };
28260
28976
  /**
28261
- * Section heading and description fields
28262
- */
28263
- const sectionHeaderFields = (defaultHeading) => [{
28264
- id: "heading",
28265
- type: "text",
28266
- label: "Heading",
28267
- description: "Main heading for the events section",
28268
- required: false,
28269
- multiline: false,
28270
- defaultValue: defaultHeading
28271
- }, {
28272
- id: "description",
28273
- type: "richText",
28274
- label: "Description",
28275
- description: "Optional introductory text",
28276
- required: false
28277
- }];
28278
- /**
28279
28977
  * Layout selection field with grid/stack options
28280
28978
  */
28281
28979
  const layoutField = {
@@ -28388,31 +29086,6 @@ function normalizeEventStaffMemberId(value) {
28388
29086
  return trimmed ? trimmed : null;
28389
29087
  }
28390
29088
  //#endregion
28391
- //#region ../blocks/src/system/blocks/events/shared/layout.ts
28392
- const recoverEmptyHeadingWhenActive = {
28393
- kind: "recover-empty-when-active",
28394
- placeholder: "Add heading"
28395
- };
28396
- const recoverEmptyDescriptionWhenActive = {
28397
- kind: "recover-empty-when-active",
28398
- placeholder: "Add description"
28399
- };
28400
- function eventSectionHeaderLayoutNodes(options = {}) {
28401
- const headingNode = text({
28402
- as: "h2",
28403
- ...lookSlot("heading")
28404
- }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
28405
- const descriptionNode = richText({
28406
- className: "rb-prose rb-max-w-none",
28407
- ...lookSlot("intro")
28408
- }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
28409
- if (options.splitClassName) return [el("div", {
28410
- className: options.splitClassName,
28411
- ...lookSlot("head")
28412
- }, [headingNode, descriptionNode])];
28413
- return [headingNode, descriptionNode];
28414
- }
28415
- //#endregion
28416
29089
  //#region ../blocks/src/system/blocks/shop.shared.ts
28417
29090
  /**
28418
29091
  * Public pass product for shop display
@@ -28837,19 +29510,14 @@ function buildCalendarViewport(input) {
28837
29510
  *
28838
29511
  * Sites don't store a locale, and every public word around a date is English,
28839
29512
  * so the only open question is which English conventions to follow: day or
28840
- * month first, and a 24 or 12-hour clock. The site's time zone is the one
29513
+ * month first. The site's time zone is the one
28841
29514
  * fact every site carries about where it is. It is the site's, never an
28842
29515
  * event's: a venue left at UTC must not turn a UK site's dates American.
28843
29516
  * Anywhere this can't place (UTC, the Americas, Asia) keeps US English, which
28844
29517
  * is what these helpers wrote before sites were placed at all.
28845
29518
  */
28846
29519
  function eventDateLocale(siteTimeZone) {
28847
- if (!siteTimeZone) return "en-US";
28848
- if (siteTimeZone === "Europe/Dublin") return "en-IE";
28849
- if (siteTimeZone.startsWith("Europe/")) return "en-GB";
28850
- if (siteTimeZone.startsWith("Australia/")) return "en-AU";
28851
- if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") return "en-NZ";
28852
- return "en-US";
29520
+ return inferSiteDateLocale(siteTimeZone);
28853
29521
  }
28854
29522
  function formatEventCompactDateRail(isoTimestamp, options, letterCase = "capitals") {
28855
29523
  const locale = options?.locale ?? "en-US";
@@ -30557,7 +31225,7 @@ const eventSpotlightBlockDefinition = {
30557
31225
  ],
30558
31226
  icon: "Star",
30559
31227
  layout: [styledSection({
30560
- children: sectionContainer([...eventSectionHeaderLayoutNodes(), el("event-spotlight", {
31228
+ children: sectionContainer([...sectionHeaderLayoutNodes(), el("event-spotlight", {
30561
31229
  events: { $bind: { from: "data.events" } },
30562
31230
  layout: { $bind: {
30563
31231
  from: "content.layout",
@@ -30613,52 +31281,6 @@ const eventSpotlightBlockDefinition = {
30613
31281
  } }
30614
31282
  };
30615
31283
  //#endregion
30616
- //#region ../blocks/src/system/runtime/lookSurfaces.ts
30617
- const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
30618
- const lookListPresentationSchemaShape = {
30619
- sectionAction: z.object({
30620
- label: z.string(),
30621
- href: z.string()
30622
- }).optional(),
30623
- actionSize: z.enum([
30624
- "sm",
30625
- "md",
30626
- "lg"
30627
- ]).optional(),
30628
- itemActionStyle: z.enum(["button", "link"]).optional(),
30629
- itemRoles: z.object({
30630
- container: z.enum([
30631
- "card",
30632
- "statement",
30633
- "highlight"
30634
- ]).optional(),
30635
- items: z.enum([
30636
- "card",
30637
- "statement",
30638
- "highlight"
30639
- ]).optional(),
30640
- at: z.partialRecord(z.enum([
30641
- "first",
30642
- "last",
30643
- "middle",
30644
- "odd",
30645
- "even"
30646
- ]), z.enum([
30647
- "card",
30648
- "statement",
30649
- "highlight"
30650
- ])).optional()
30651
- }).optional(),
30652
- roleSurfaces: z.record(z.enum([
30653
- "card",
30654
- "statement",
30655
- "highlight"
30656
- ]), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional(),
30657
- panelHeading: z.string().optional(),
30658
- lookSlots: z.partialRecord(z.enum(arrangementSlotNames), z.enum(arrangementSlotNames)).optional(),
30659
- itemSurfaces: z.record(z.string(), z.custom((value) => isPlainObject(value) && (value.kind === "inherit" || value.kind === "owned"))).optional()
30660
- };
30661
- //#endregion
30662
31284
  //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
30663
31285
  /** Undefined means discovery; an empty string is an explicitly empty selection. */
30664
31286
  function eventSeriesScopeCsv(value) {
@@ -31408,7 +32030,7 @@ const eventListingBlockDefinition = {
31408
32030
  children: styledContainer({
31409
32031
  rootType: "stack",
31410
32032
  rootProps: { gap: "lg" },
31411
- children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
32033
+ children: [...sectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
31412
32034
  readAuthority: { $bind: { from: "$root.readAuthority" } },
31413
32035
  events: { $bind: { from: "data.events" } },
31414
32036
  stage: { $bind: {
@@ -31848,7 +32470,7 @@ const eventCalendarLayout = [styledSection({
31848
32470
  gap: "lg",
31849
32471
  ...lookSlot("layout")
31850
32472
  },
31851
- children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
32473
+ children: [...sectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
31852
32474
  readAuthority: { $bind: { from: "$root.readAuthority" } },
31853
32475
  events: { $bind: { from: "data.events" } },
31854
32476
  effectiveListArrangementKey: { $bind: { from: "$root.effectiveListArrangementKey" } },
@@ -33804,6 +34426,511 @@ const embedBlockDefinition = {
33804
34426
  } }
33805
34427
  };
33806
34428
  //#endregion
34429
+ //#region ../blocks/src/system/blocks/image-gallery/fields.ts
34430
+ const imageGalleryFields = parseFieldDefinitions([
34431
+ ...sectionHeaderFields(void 0, "Intro"),
34432
+ {
34433
+ id: "images",
34434
+ type: "repeater",
34435
+ label: "Images",
34436
+ itemLabel: "Image",
34437
+ minItems: 0,
34438
+ maxItems: 24,
34439
+ ui: {
34440
+ repeaterPreset: "thumbnailGrid",
34441
+ thumbnailField: "image",
34442
+ thumbnailAltField: "caption",
34443
+ thumbnailLabelField: "caption",
34444
+ thumbnailCardDensity: "compact"
34445
+ },
34446
+ schema: { fields: [{
34447
+ id: "image",
34448
+ type: "media",
34449
+ label: "Image",
34450
+ required: true,
34451
+ mediaKinds: ["image"]
34452
+ }, {
34453
+ id: "caption",
34454
+ type: "text",
34455
+ label: "Caption",
34456
+ description: "Optional caption displayed below the image and used as the editor card label",
34457
+ maxLength: 200
34458
+ }] }
34459
+ },
34460
+ {
34461
+ id: "fullBleed",
34462
+ type: "boolean",
34463
+ label: "Full bleed",
34464
+ description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
34465
+ defaultValue: false,
34466
+ ui: {
34467
+ intent: "display",
34468
+ visibleWhen: {
34469
+ field: "variant",
34470
+ notIn: ["marquee"]
34471
+ }
34472
+ }
34473
+ },
34474
+ {
34475
+ id: "aspectRatio",
34476
+ type: "select",
34477
+ label: "Aspect ratio",
34478
+ description: "Crop images to a consistent aspect ratio.",
34479
+ defaultValue: "1/1",
34480
+ options: [
34481
+ {
34482
+ value: "auto",
34483
+ label: "Original"
34484
+ },
34485
+ {
34486
+ value: "1/1",
34487
+ label: "1:1 (Square)"
34488
+ },
34489
+ {
34490
+ value: "4/3",
34491
+ label: "4:3 (Standard)"
34492
+ },
34493
+ {
34494
+ value: "16/9",
34495
+ label: "16:9 (Widescreen)"
34496
+ },
34497
+ {
34498
+ value: "3/2",
34499
+ label: "3:2 (Classic)"
34500
+ },
34501
+ {
34502
+ value: "3/4",
34503
+ label: "3:4 (Portrait)"
34504
+ }
34505
+ ],
34506
+ ui: {
34507
+ intent: "display",
34508
+ visibleWhen: {
34509
+ field: "variant",
34510
+ notIn: ["masonry", "marquee"]
34511
+ }
34512
+ }
34513
+ },
34514
+ {
34515
+ id: "slidesToShow",
34516
+ type: "select",
34517
+ label: "Images per view (mobile)",
34518
+ description: "Number of images visible at once on small screens.",
34519
+ defaultValue: "1",
34520
+ options: [
34521
+ {
34522
+ value: "1",
34523
+ label: "One at a time"
34524
+ },
34525
+ {
34526
+ value: "2",
34527
+ label: "Two at a time"
34528
+ },
34529
+ {
34530
+ value: "3",
34531
+ label: "Three at a time"
34532
+ }
34533
+ ],
34534
+ ui: {
34535
+ intent: "display",
34536
+ visibleWhen: {
34537
+ field: "variant",
34538
+ equals: "carousel"
34539
+ }
34540
+ }
34541
+ },
34542
+ {
34543
+ id: "slidesToShowTablet",
34544
+ type: "select",
34545
+ label: "Images per view (tablet)",
34546
+ description: "Number of images visible on medium screens.",
34547
+ options: [
34548
+ {
34549
+ value: "",
34550
+ label: "Same as mobile"
34551
+ },
34552
+ {
34553
+ value: "1",
34554
+ label: "One at a time"
34555
+ },
34556
+ {
34557
+ value: "2",
34558
+ label: "Two at a time"
34559
+ },
34560
+ {
34561
+ value: "3",
34562
+ label: "Three at a time"
34563
+ }
34564
+ ],
34565
+ ui: {
34566
+ intent: "display",
34567
+ visibleWhen: {
34568
+ field: "variant",
34569
+ equals: "carousel"
34570
+ }
34571
+ }
34572
+ },
34573
+ {
34574
+ id: "slidesToShowDesktop",
34575
+ type: "select",
34576
+ label: "Images per view (desktop)",
34577
+ description: "Number of images visible on large screens.",
34578
+ options: [
34579
+ {
34580
+ value: "",
34581
+ label: "Same as tablet"
34582
+ },
34583
+ {
34584
+ value: "1",
34585
+ label: "One at a time"
34586
+ },
34587
+ {
34588
+ value: "2",
34589
+ label: "Two at a time"
34590
+ },
34591
+ {
34592
+ value: "3",
34593
+ label: "Three at a time"
34594
+ }
34595
+ ],
34596
+ ui: {
34597
+ intent: "display",
34598
+ visibleWhen: {
34599
+ field: "variant",
34600
+ equals: "carousel"
34601
+ }
34602
+ }
34603
+ },
34604
+ {
34605
+ id: "transition",
34606
+ type: "select",
34607
+ label: "Transition",
34608
+ description: "Animation style between slides.",
34609
+ defaultValue: "slide",
34610
+ options: [{
34611
+ value: "slide",
34612
+ label: "Slide"
34613
+ }, {
34614
+ value: "fade",
34615
+ label: "Fade"
34616
+ }],
34617
+ ui: {
34618
+ intent: "display",
34619
+ visibleWhen: {
34620
+ field: "variant",
34621
+ equals: "carousel"
34622
+ }
34623
+ }
34624
+ },
34625
+ {
34626
+ id: "showControls",
34627
+ type: "boolean",
34628
+ label: "Show arrows",
34629
+ defaultValue: true,
34630
+ ui: {
34631
+ intent: "behavior",
34632
+ visibleWhen: {
34633
+ field: "variant",
34634
+ equals: "carousel"
34635
+ }
34636
+ }
34637
+ },
34638
+ {
34639
+ id: "showDots",
34640
+ type: "boolean",
34641
+ label: "Show dots",
34642
+ defaultValue: false,
34643
+ ui: {
34644
+ intent: "behavior",
34645
+ visibleWhen: {
34646
+ field: "variant",
34647
+ equals: "carousel"
34648
+ }
34649
+ }
34650
+ },
34651
+ {
34652
+ id: "autoplay",
34653
+ type: "boolean",
34654
+ label: "Autoplay",
34655
+ defaultValue: false,
34656
+ ui: {
34657
+ intent: "behavior",
34658
+ visibleWhen: {
34659
+ field: "variant",
34660
+ equals: "carousel"
34661
+ }
34662
+ }
34663
+ },
34664
+ {
34665
+ id: "autoplayDelay",
34666
+ type: "select",
34667
+ label: "Autoplay delay",
34668
+ defaultValue: "5000",
34669
+ options: [
34670
+ {
34671
+ value: "3000",
34672
+ label: "3 seconds"
34673
+ },
34674
+ {
34675
+ value: "5000",
34676
+ label: "5 seconds"
34677
+ },
34678
+ {
34679
+ value: "7000",
34680
+ label: "7 seconds"
34681
+ },
34682
+ {
34683
+ value: "10000",
34684
+ label: "10 seconds"
34685
+ }
34686
+ ],
34687
+ ui: {
34688
+ intent: "behavior",
34689
+ visibleWhen: {
34690
+ field: "variant",
34691
+ equals: "carousel"
34692
+ }
34693
+ }
34694
+ },
34695
+ {
34696
+ id: "arrowVisibility",
34697
+ type: "select",
34698
+ label: "Arrow visibility",
34699
+ defaultValue: "always",
34700
+ options: [{
34701
+ value: "always",
34702
+ label: "Always visible"
34703
+ }, {
34704
+ value: "hover",
34705
+ label: "Show on hover"
34706
+ }],
34707
+ ui: {
34708
+ intent: "behavior",
34709
+ visibleWhen: {
34710
+ field: "variant",
34711
+ equals: "carousel"
34712
+ }
34713
+ }
34714
+ },
34715
+ {
34716
+ id: "loop",
34717
+ type: "boolean",
34718
+ label: "Loop slides",
34719
+ defaultValue: true,
34720
+ ui: {
34721
+ intent: "behavior",
34722
+ visibleWhen: {
34723
+ field: "variant",
34724
+ equals: "carousel"
34725
+ }
34726
+ }
34727
+ },
34728
+ {
34729
+ id: "marqueeDirection",
34730
+ type: "select",
34731
+ label: "Scroll direction",
34732
+ options: [{
34733
+ value: "left",
34734
+ label: "Left"
34735
+ }, {
34736
+ value: "right",
34737
+ label: "Right"
34738
+ }],
34739
+ defaultValue: "left",
34740
+ ui: {
34741
+ intent: "display",
34742
+ visibleWhen: {
34743
+ field: "variant",
34744
+ equals: "marquee"
34745
+ }
34746
+ }
34747
+ },
34748
+ {
34749
+ id: "marqueeSpeed",
34750
+ type: "select",
34751
+ label: "Scroll speed",
34752
+ options: [
34753
+ {
34754
+ value: "slow",
34755
+ label: "Slow (60s)"
34756
+ },
34757
+ {
34758
+ value: "medium",
34759
+ label: "Medium (40s)"
34760
+ },
34761
+ {
34762
+ value: "fast",
34763
+ label: "Fast (20s)"
34764
+ }
34765
+ ],
34766
+ defaultValue: "medium",
34767
+ ui: {
34768
+ intent: "display",
34769
+ visibleWhen: {
34770
+ field: "variant",
34771
+ equals: "marquee"
34772
+ }
34773
+ }
34774
+ },
34775
+ {
34776
+ id: "marqueePauseOnHover",
34777
+ type: "boolean",
34778
+ label: "Pause on hover",
34779
+ defaultValue: true,
34780
+ ui: {
34781
+ intent: "behavior",
34782
+ visibleWhen: {
34783
+ field: "variant",
34784
+ equals: "marquee"
34785
+ }
34786
+ }
34787
+ },
34788
+ {
34789
+ id: "marqueeImageSize",
34790
+ type: "select",
34791
+ label: "Image size",
34792
+ options: [
34793
+ {
34794
+ value: "sm",
34795
+ label: "Small (200px)"
34796
+ },
34797
+ {
34798
+ value: "md",
34799
+ label: "Medium (256px)"
34800
+ },
34801
+ {
34802
+ value: "lg",
34803
+ label: "Large (320px)"
34804
+ },
34805
+ {
34806
+ value: "xl",
34807
+ label: "Extra large (400px)"
34808
+ }
34809
+ ],
34810
+ defaultValue: "md",
34811
+ ui: {
34812
+ intent: "display",
34813
+ visibleWhen: {
34814
+ field: "variant",
34815
+ equals: "marquee"
34816
+ }
34817
+ }
34818
+ },
34819
+ {
34820
+ id: "imageFilter",
34821
+ type: "select",
34822
+ label: "Image filter",
34823
+ options: [
34824
+ {
34825
+ value: "none",
34826
+ label: "None"
34827
+ },
34828
+ {
34829
+ value: "grayscale",
34830
+ label: "Grayscale"
34831
+ },
34832
+ {
34833
+ value: "grayscale-hover-reveal",
34834
+ label: "Grayscale (color on hover)"
34835
+ },
34836
+ {
34837
+ value: "sepia",
34838
+ label: "Sepia"
34839
+ }
34840
+ ],
34841
+ defaultValue: "grayscale-hover-reveal",
34842
+ ui: { intent: "style" }
34843
+ },
34844
+ {
34845
+ id: "imageBorder",
34846
+ type: "group",
34847
+ label: "Image border",
34848
+ schema: { fields: [
34849
+ {
34850
+ id: "enabled",
34851
+ type: "boolean",
34852
+ label: "Show border",
34853
+ defaultValue: true
34854
+ },
34855
+ {
34856
+ id: "colorToken",
34857
+ type: "text",
34858
+ label: "Border color",
34859
+ defaultValue: "accent",
34860
+ ui: { widget: "backgroundColor" }
34861
+ },
34862
+ {
34863
+ id: "opacity",
34864
+ type: "number",
34865
+ label: "Border opacity",
34866
+ defaultValue: 30,
34867
+ ui: {
34868
+ min: 0,
34869
+ max: 100
34870
+ }
34871
+ },
34872
+ {
34873
+ id: "width",
34874
+ type: "select",
34875
+ label: "Border width",
34876
+ options: [
34877
+ {
34878
+ value: "1",
34879
+ label: "Thin (1px)"
34880
+ },
34881
+ {
34882
+ value: "2",
34883
+ label: "Medium (2px)"
34884
+ },
34885
+ {
34886
+ value: "3",
34887
+ label: "Thick (3px)"
34888
+ }
34889
+ ],
34890
+ defaultValue: "2"
34891
+ }
34892
+ ] },
34893
+ ui: { intent: "style" }
34894
+ },
34895
+ {
34896
+ id: "imageCorners",
34897
+ type: "select",
34898
+ label: "Image corners",
34899
+ options: [
34900
+ {
34901
+ value: "none",
34902
+ label: "Square"
34903
+ },
34904
+ {
34905
+ value: "sm",
34906
+ label: "Slightly rounded"
34907
+ },
34908
+ {
34909
+ value: "md",
34910
+ label: "Rounded"
34911
+ },
34912
+ {
34913
+ value: "lg",
34914
+ label: "More rounded"
34915
+ },
34916
+ {
34917
+ value: "xl",
34918
+ label: "Very rounded"
34919
+ },
34920
+ {
34921
+ value: "2xl",
34922
+ label: "Extra rounded"
34923
+ },
34924
+ {
34925
+ value: "3xl",
34926
+ label: "Maximum rounded"
34927
+ }
34928
+ ],
34929
+ defaultValue: "3xl",
34930
+ ui: { intent: "style" }
34931
+ }
34932
+ ]);
34933
+ //#endregion
33807
34934
  //#region ../blocks/src/system/blocks/image-gallery.ts
33808
34935
  const grid$1 = (props, children, ...mods) => el("grid", props ?? void 0, children ?? void 0, ...mods);
33809
34936
  const galleryContainer = (children, opts) => {
@@ -34018,7 +35145,11 @@ const emptyState$1 = {
34018
35145
  }
34019
35146
  };
34020
35147
  const wrapVariant$1 = (layout, opts) => styledSection({
34021
- children: galleryContainer([layout, emptyState$1], {
35148
+ children: galleryContainer([
35149
+ ...sectionHeaderLayoutNodes(),
35150
+ layout,
35151
+ emptyState$1
35152
+ ], {
34022
35153
  gap: "md",
34023
35154
  fullWidth: opts?.fullWidth,
34024
35155
  className: opts?.className
@@ -34027,6 +35158,28 @@ const wrapVariant$1 = (layout, opts) => styledSection({
34027
35158
  spacing: "medium",
34028
35159
  background: "background"
34029
35160
  });
35161
+ 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({
35162
+ as: "figcaption",
35163
+ ...lookSlot("caption")
35164
+ }, bind(captionFrom), when(captionFrom))])], ...mods);
35165
+ const tilesLayout = styledSection({
35166
+ children: el("div", {
35167
+ className: "rb-container",
35168
+ ...lookSlot("layout")
35169
+ }, [...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) => ({
35170
+ ...node,
35171
+ $when: {
35172
+ when: {
35173
+ from: "content.images",
35174
+ transforms: [{ id: "array.length" }]
35175
+ },
35176
+ equals: 0
35177
+ }
35178
+ }))])]),
35179
+ baseClass: "",
35180
+ spacing: "medium",
35181
+ background: "background"
35182
+ });
34030
35183
  const imageGalleryBlockDefinition = { manifest: createBlockManifest({
34031
35184
  id: "block.image-gallery",
34032
35185
  title: "Image Gallery",
@@ -34039,510 +35192,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
34039
35192
  "marqueeSpeed",
34040
35193
  "marqueePauseOnHover"
34041
35194
  ] },
34042
- additionalFields: parseFieldDefinitions([
34043
- {
34044
- id: "images",
34045
- type: "repeater",
34046
- label: "Images",
34047
- itemLabel: "Image",
34048
- minItems: 0,
34049
- maxItems: 24,
34050
- ui: {
34051
- repeaterPreset: "thumbnailGrid",
34052
- thumbnailField: "image",
34053
- thumbnailAltField: "caption",
34054
- thumbnailLabelField: "caption",
34055
- thumbnailCardDensity: "compact"
34056
- },
34057
- schema: { fields: [{
34058
- id: "image",
34059
- type: "media",
34060
- label: "Image",
34061
- required: true,
34062
- mediaKinds: ["image"]
34063
- }, {
34064
- id: "caption",
34065
- type: "text",
34066
- label: "Caption",
34067
- description: "Optional caption displayed below the image and used as the editor card label",
34068
- maxLength: 200
34069
- }] }
34070
- },
34071
- {
34072
- id: "fullBleed",
34073
- type: "boolean",
34074
- label: "Full bleed",
34075
- description: "Extend the gallery edge-to-edge by removing section side padding and container max-width.",
34076
- defaultValue: false,
34077
- ui: {
34078
- intent: "display",
34079
- visibleWhen: {
34080
- field: "variant",
34081
- notIn: ["marquee"]
34082
- }
34083
- }
34084
- },
34085
- {
34086
- id: "aspectRatio",
34087
- type: "select",
34088
- label: "Aspect ratio",
34089
- description: "Crop images to a consistent aspect ratio.",
34090
- defaultValue: "1/1",
34091
- options: [
34092
- {
34093
- value: "auto",
34094
- label: "Original"
34095
- },
34096
- {
34097
- value: "1/1",
34098
- label: "1:1 (Square)"
34099
- },
34100
- {
34101
- value: "4/3",
34102
- label: "4:3 (Standard)"
34103
- },
34104
- {
34105
- value: "16/9",
34106
- label: "16:9 (Widescreen)"
34107
- },
34108
- {
34109
- value: "3/2",
34110
- label: "3:2 (Classic)"
34111
- },
34112
- {
34113
- value: "3/4",
34114
- label: "3:4 (Portrait)"
34115
- }
34116
- ],
34117
- ui: {
34118
- intent: "display",
34119
- visibleWhen: {
34120
- field: "variant",
34121
- notIn: ["masonry", "marquee"]
34122
- }
34123
- }
34124
- },
34125
- {
34126
- id: "slidesToShow",
34127
- type: "select",
34128
- label: "Images per view (mobile)",
34129
- description: "Number of images visible at once on small screens.",
34130
- defaultValue: "1",
34131
- options: [
34132
- {
34133
- value: "1",
34134
- label: "One at a time"
34135
- },
34136
- {
34137
- value: "2",
34138
- label: "Two at a time"
34139
- },
34140
- {
34141
- value: "3",
34142
- label: "Three at a time"
34143
- }
34144
- ],
34145
- ui: {
34146
- intent: "display",
34147
- visibleWhen: {
34148
- field: "variant",
34149
- equals: "carousel"
34150
- }
34151
- }
34152
- },
34153
- {
34154
- id: "slidesToShowTablet",
34155
- type: "select",
34156
- label: "Images per view (tablet)",
34157
- description: "Number of images visible on medium screens.",
34158
- options: [
34159
- {
34160
- value: "",
34161
- label: "Same as mobile"
34162
- },
34163
- {
34164
- value: "1",
34165
- label: "One at a time"
34166
- },
34167
- {
34168
- value: "2",
34169
- label: "Two at a time"
34170
- },
34171
- {
34172
- value: "3",
34173
- label: "Three at a time"
34174
- }
34175
- ],
34176
- ui: {
34177
- intent: "display",
34178
- visibleWhen: {
34179
- field: "variant",
34180
- equals: "carousel"
34181
- }
34182
- }
34183
- },
34184
- {
34185
- id: "slidesToShowDesktop",
34186
- type: "select",
34187
- label: "Images per view (desktop)",
34188
- description: "Number of images visible on large screens.",
34189
- options: [
34190
- {
34191
- value: "",
34192
- label: "Same as tablet"
34193
- },
34194
- {
34195
- value: "1",
34196
- label: "One at a time"
34197
- },
34198
- {
34199
- value: "2",
34200
- label: "Two at a time"
34201
- },
34202
- {
34203
- value: "3",
34204
- label: "Three at a time"
34205
- }
34206
- ],
34207
- ui: {
34208
- intent: "display",
34209
- visibleWhen: {
34210
- field: "variant",
34211
- equals: "carousel"
34212
- }
34213
- }
34214
- },
34215
- {
34216
- id: "transition",
34217
- type: "select",
34218
- label: "Transition",
34219
- description: "Animation style between slides.",
34220
- defaultValue: "slide",
34221
- options: [{
34222
- value: "slide",
34223
- label: "Slide"
34224
- }, {
34225
- value: "fade",
34226
- label: "Fade"
34227
- }],
34228
- ui: {
34229
- intent: "display",
34230
- visibleWhen: {
34231
- field: "variant",
34232
- equals: "carousel"
34233
- }
34234
- }
34235
- },
34236
- {
34237
- id: "showControls",
34238
- type: "boolean",
34239
- label: "Show arrows",
34240
- defaultValue: true,
34241
- ui: {
34242
- intent: "behavior",
34243
- visibleWhen: {
34244
- field: "variant",
34245
- equals: "carousel"
34246
- }
34247
- }
34248
- },
34249
- {
34250
- id: "showDots",
34251
- type: "boolean",
34252
- label: "Show dots",
34253
- defaultValue: false,
34254
- ui: {
34255
- intent: "behavior",
34256
- visibleWhen: {
34257
- field: "variant",
34258
- equals: "carousel"
34259
- }
34260
- }
34261
- },
34262
- {
34263
- id: "autoplay",
34264
- type: "boolean",
34265
- label: "Autoplay",
34266
- defaultValue: false,
34267
- ui: {
34268
- intent: "behavior",
34269
- visibleWhen: {
34270
- field: "variant",
34271
- equals: "carousel"
34272
- }
34273
- }
34274
- },
34275
- {
34276
- id: "autoplayDelay",
34277
- type: "select",
34278
- label: "Autoplay delay",
34279
- defaultValue: "5000",
34280
- options: [
34281
- {
34282
- value: "3000",
34283
- label: "3 seconds"
34284
- },
34285
- {
34286
- value: "5000",
34287
- label: "5 seconds"
34288
- },
34289
- {
34290
- value: "7000",
34291
- label: "7 seconds"
34292
- },
34293
- {
34294
- value: "10000",
34295
- label: "10 seconds"
34296
- }
34297
- ],
34298
- ui: {
34299
- intent: "behavior",
34300
- visibleWhen: {
34301
- field: "variant",
34302
- equals: "carousel"
34303
- }
34304
- }
34305
- },
34306
- {
34307
- id: "arrowVisibility",
34308
- type: "select",
34309
- label: "Arrow visibility",
34310
- defaultValue: "always",
34311
- options: [{
34312
- value: "always",
34313
- label: "Always visible"
34314
- }, {
34315
- value: "hover",
34316
- label: "Show on hover"
34317
- }],
34318
- ui: {
34319
- intent: "behavior",
34320
- visibleWhen: {
34321
- field: "variant",
34322
- equals: "carousel"
34323
- }
34324
- }
34325
- },
34326
- {
34327
- id: "loop",
34328
- type: "boolean",
34329
- label: "Loop slides",
34330
- defaultValue: true,
34331
- ui: {
34332
- intent: "behavior",
34333
- visibleWhen: {
34334
- field: "variant",
34335
- equals: "carousel"
34336
- }
34337
- }
34338
- },
34339
- {
34340
- id: "marqueeDirection",
34341
- type: "select",
34342
- label: "Scroll direction",
34343
- options: [{
34344
- value: "left",
34345
- label: "Left"
34346
- }, {
34347
- value: "right",
34348
- label: "Right"
34349
- }],
34350
- defaultValue: "left",
34351
- ui: {
34352
- intent: "display",
34353
- visibleWhen: {
34354
- field: "variant",
34355
- equals: "marquee"
34356
- }
34357
- }
34358
- },
34359
- {
34360
- id: "marqueeSpeed",
34361
- type: "select",
34362
- label: "Scroll speed",
34363
- options: [
34364
- {
34365
- value: "slow",
34366
- label: "Slow (60s)"
34367
- },
34368
- {
34369
- value: "medium",
34370
- label: "Medium (40s)"
34371
- },
34372
- {
34373
- value: "fast",
34374
- label: "Fast (20s)"
34375
- }
34376
- ],
34377
- defaultValue: "medium",
34378
- ui: {
34379
- intent: "display",
34380
- visibleWhen: {
34381
- field: "variant",
34382
- equals: "marquee"
34383
- }
34384
- }
34385
- },
34386
- {
34387
- id: "marqueePauseOnHover",
34388
- type: "boolean",
34389
- label: "Pause on hover",
34390
- defaultValue: true,
34391
- ui: {
34392
- intent: "behavior",
34393
- visibleWhen: {
34394
- field: "variant",
34395
- equals: "marquee"
34396
- }
34397
- }
34398
- },
34399
- {
34400
- id: "marqueeImageSize",
34401
- type: "select",
34402
- label: "Image size",
34403
- options: [
34404
- {
34405
- value: "sm",
34406
- label: "Small (200px)"
34407
- },
34408
- {
34409
- value: "md",
34410
- label: "Medium (256px)"
34411
- },
34412
- {
34413
- value: "lg",
34414
- label: "Large (320px)"
34415
- },
34416
- {
34417
- value: "xl",
34418
- label: "Extra large (400px)"
34419
- }
34420
- ],
34421
- defaultValue: "md",
34422
- ui: {
34423
- intent: "display",
34424
- visibleWhen: {
34425
- field: "variant",
34426
- equals: "marquee"
34427
- }
34428
- }
34429
- },
34430
- {
34431
- id: "imageFilter",
34432
- type: "select",
34433
- label: "Image filter",
34434
- options: [
34435
- {
34436
- value: "none",
34437
- label: "None"
34438
- },
34439
- {
34440
- value: "grayscale",
34441
- label: "Grayscale"
34442
- },
34443
- {
34444
- value: "grayscale-hover-reveal",
34445
- label: "Grayscale (color on hover)"
34446
- },
34447
- {
34448
- value: "sepia",
34449
- label: "Sepia"
34450
- }
34451
- ],
34452
- defaultValue: "grayscale-hover-reveal",
34453
- ui: { intent: "style" }
34454
- },
34455
- {
34456
- id: "imageBorder",
34457
- type: "group",
34458
- label: "Image border",
34459
- schema: { fields: [
34460
- {
34461
- id: "enabled",
34462
- type: "boolean",
34463
- label: "Show border",
34464
- defaultValue: true
34465
- },
34466
- {
34467
- id: "colorToken",
34468
- type: "text",
34469
- label: "Border color",
34470
- defaultValue: "accent",
34471
- ui: { widget: "backgroundColor" }
34472
- },
34473
- {
34474
- id: "opacity",
34475
- type: "number",
34476
- label: "Border opacity",
34477
- defaultValue: 30,
34478
- ui: {
34479
- min: 0,
34480
- max: 100
34481
- }
34482
- },
34483
- {
34484
- id: "width",
34485
- type: "select",
34486
- label: "Border width",
34487
- options: [
34488
- {
34489
- value: "1",
34490
- label: "Thin (1px)"
34491
- },
34492
- {
34493
- value: "2",
34494
- label: "Medium (2px)"
34495
- },
34496
- {
34497
- value: "3",
34498
- label: "Thick (3px)"
34499
- }
34500
- ],
34501
- defaultValue: "2"
34502
- }
34503
- ] },
34504
- ui: { intent: "style" }
34505
- },
34506
- {
34507
- id: "imageCorners",
34508
- type: "select",
34509
- label: "Image corners",
34510
- options: [
34511
- {
34512
- value: "none",
34513
- label: "Square"
34514
- },
34515
- {
34516
- value: "sm",
34517
- label: "Slightly rounded"
34518
- },
34519
- {
34520
- value: "md",
34521
- label: "Rounded"
34522
- },
34523
- {
34524
- value: "lg",
34525
- label: "More rounded"
34526
- },
34527
- {
34528
- value: "xl",
34529
- label: "Very rounded"
34530
- },
34531
- {
34532
- value: "2xl",
34533
- label: "Extra rounded"
34534
- },
34535
- {
34536
- value: "3xl",
34537
- label: "Maximum rounded"
34538
- }
34539
- ],
34540
- defaultValue: "3xl",
34541
- ui: { intent: "style" }
34542
- }
34543
- ]),
35195
+ additionalFields: imageGalleryFields,
34544
35196
  layout: wrapVariant$1(gridLayout),
34545
35197
  variants: {
35198
+ tiles: tilesLayout,
34546
35199
  grid: wrapVariant$1(gridLayout),
34547
35200
  carousel: wrapVariant$1(carouselLayout),
34548
35201
  masonry: wrapVariant$1(masonryLayout),
@@ -34551,7 +35204,10 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
34551
35204
  className: "rb-image-gallery-marquee-container"
34552
35205
  })
34553
35206
  },
34554
- variantMeaning: { kind: "arrangement" },
35207
+ variantMeaning: {
35208
+ kind: "arrangement",
35209
+ lookOnlyKeys: ["tiles"]
35210
+ },
34555
35211
  defaultVariant: "grid",
34556
35212
  variantOptions: {
34557
35213
  grid: {
@@ -36771,76 +37427,74 @@ const giftingBlockDefinition = {
36771
37427
  /**
36772
37428
  * Get form fields based on preset configuration.
36773
37429
  */
36774
- function getGlobalFormFields(form) {
36775
- const includePhone = form.includeOptionalPhone;
36776
- switch (form.fields.preset) {
36777
- case "emailOnly": return withOptionalPhone([{
36778
- id: "email",
36779
- type: "email",
36780
- label: "Email",
36781
- required: true,
36782
- placeholder: "your@email.com"
36783
- }], includePhone);
36784
- case "emailName": return withOptionalPhone([{
36785
- id: "email",
36786
- type: "email",
36787
- label: "Email",
36788
- required: true,
36789
- placeholder: "your@email.com"
36790
- }, {
37430
+ function getGlobalFormFields(form, presentation = {}) {
37431
+ const fields = withOptionalPhone(newsletterPresetFields(form.fields), form.includeOptionalPhone);
37432
+ return presentation.lookSlots ? fields.map((field) => ({
37433
+ ...field,
37434
+ label: lookFieldLabel(field)
37435
+ })) : fields;
37436
+ }
37437
+ function lookFieldLabel(field) {
37438
+ switch (field.id) {
37439
+ case "firstName": return "First name";
37440
+ case "lastName": return "Last name";
37441
+ default: return field.label;
37442
+ }
37443
+ }
37444
+ const emailField = {
37445
+ id: "email",
37446
+ type: "email",
37447
+ label: "Email",
37448
+ required: true,
37449
+ placeholder: "your@email.com"
37450
+ };
37451
+ const firstNameField = (required) => ({
37452
+ id: "firstName",
37453
+ type: "text",
37454
+ label: "First Name",
37455
+ required,
37456
+ placeholder: "First name"
37457
+ });
37458
+ function newsletterPresetFields(fields) {
37459
+ switch (fields.preset) {
37460
+ case "emailOnly": return [emailField];
37461
+ case "emailName": return [emailField, {
36791
37462
  id: "name",
36792
37463
  type: "text",
36793
37464
  label: "Name",
36794
- required: form.fields.name === "required",
37465
+ required: fields.name === "required",
36795
37466
  placeholder: "Your name"
36796
- }], includePhone);
36797
- case "emailFirstLast": return withOptionalPhone([
36798
- {
36799
- id: "email",
36800
- type: "email",
36801
- label: "Email",
36802
- required: true,
36803
- placeholder: "your@email.com"
36804
- },
36805
- {
36806
- id: "firstName",
36807
- type: "text",
36808
- label: "First Name",
36809
- required: form.fields.firstName === "required",
36810
- placeholder: "First name"
36811
- },
37467
+ }];
37468
+ case "emailFirstName": return [emailField, firstNameField(fields.firstName === "required")];
37469
+ case "emailFirstLast": return [
37470
+ emailField,
37471
+ firstNameField(fields.firstName === "required"),
36812
37472
  {
36813
37473
  id: "lastName",
36814
37474
  type: "text",
36815
37475
  label: "Last Name",
36816
- required: form.fields.lastName === "required",
37476
+ required: fields.lastName === "required",
36817
37477
  placeholder: "Last name"
36818
37478
  }
36819
- ], includePhone);
36820
- case "emailNameCompany": return withOptionalPhone([
36821
- {
36822
- id: "email",
36823
- type: "email",
36824
- label: "Email",
36825
- required: true,
36826
- placeholder: "your@email.com"
36827
- },
37479
+ ];
37480
+ case "emailNameCompany": return [
37481
+ emailField,
36828
37482
  {
36829
37483
  id: "name",
36830
37484
  type: "text",
36831
37485
  label: "Name",
36832
- required: form.fields.name === "required",
37486
+ required: fields.name === "required",
36833
37487
  placeholder: "Your name"
36834
37488
  },
36835
37489
  {
36836
37490
  id: "company",
36837
37491
  type: "text",
36838
37492
  label: "Company",
36839
- required: form.fields.company === "required",
37493
+ required: fields.company === "required",
36840
37494
  placeholder: "Company name"
36841
37495
  }
36842
- ], includePhone);
36843
- default: throw new Error("Unknown newsletter preset");
37496
+ ];
37497
+ default: return assertNever$1(fields);
36844
37498
  }
36845
37499
  }
36846
37500
  function withOptionalPhone(fields, includePhone) {
@@ -36902,6 +37556,7 @@ const mailingListSignupBlockSourceRefSchema = z.object({
36902
37556
  });
36903
37557
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
36904
37558
  const newsletterSourceCommonSchema = z.object({
37559
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
36905
37560
  siteId: z.string().optional(),
36906
37561
  apiBaseUrl: z.string().optional(),
36907
37562
  mailingList: mailingListContextSchema.optional(),
@@ -36934,6 +37589,7 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
36934
37589
  newsletterSourceCommonSchema.extend({ source: z.literal("preview") })
36935
37590
  ]);
36936
37591
  const newsletterDisplaySchema = z.object({
37592
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
36937
37593
  kind: z.literal("newsletter-form"),
36938
37594
  availability: z.enum(["ready", "unavailable"]),
36939
37595
  className: z.string().nullable(),
@@ -37000,13 +37656,14 @@ function buildNewsletterDisplay(source) {
37000
37656
  const choices = resolveRuntimeChoices(assessment);
37001
37657
  return {
37002
37658
  kind: "newsletter-form",
37659
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
37003
37660
  availability: assessment.tag === "available" ? "ready" : "unavailable",
37004
37661
  className: source.className ?? null,
37005
37662
  buttonLabel: form.buttonLabel,
37006
37663
  successMessage: form.successMessage,
37007
37664
  buttonVariant: source.buttonVariant ?? "primary",
37008
37665
  privacyNote: form.privacyNote,
37009
- fields: getGlobalFormFields(form),
37666
+ fields: getGlobalFormFields(form, source),
37010
37667
  choices
37011
37668
  };
37012
37669
  }
@@ -37078,32 +37735,50 @@ function parseRequiredMailingListSignedSourceToken(value) {
37078
37735
  //#region ../blocks/src/system/blocks/newsletter-signup.ts
37079
37736
  const stackedComposition = composeFragments([{ fragment: newsletterCopyFragment }, { fragment: newsletterFormFragment }]);
37080
37737
  const stackedLayout = styledSection({
37081
- children: sectionContainer(stackedComposition.layout, {
37738
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
37082
37739
  gap: "md",
37083
37740
  className: "rb-text-center newsletter-stacked"
37084
- }),
37741
+ })),
37085
37742
  baseClass: "",
37086
37743
  spacing: "medium",
37087
37744
  background: "surface"
37088
37745
  });
37089
37746
  const inlineLayout = styledSection({
37090
- children: sectionContainer(stackedComposition.layout, {
37747
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
37091
37748
  gap: "md",
37092
37749
  className: "newsletter-inline"
37093
- }),
37750
+ })),
37094
37751
  baseClass: "",
37095
37752
  spacing: "medium",
37096
37753
  background: "surface"
37097
37754
  });
37098
37755
  const editorialSplitLayout = styledSection({
37099
- children: sectionContainer([el("div", { className: "newsletter-editorial-split-copy" }, newsletterCopyFragment.layout), el("div", { className: "newsletter-editorial-split-form" }, newsletterFormFragment.layout)], {
37756
+ children: props(lookSlot("layout"))(sectionContainer([el("div", {
37757
+ className: "newsletter-editorial-split-copy",
37758
+ ...lookSlot("head")
37759
+ }, newsletterCopyFragment.layout), el("div", {
37760
+ className: "newsletter-editorial-split-form",
37761
+ ...lookSlot("panel")
37762
+ }, newsletterFormFragment.layout)], {
37100
37763
  gap: "lg",
37101
37764
  className: "newsletter-editorial-split"
37102
- }),
37765
+ })),
37103
37766
  baseClass: "",
37104
37767
  spacing: "comfortable",
37105
37768
  background: "surface"
37106
37769
  });
37770
+ const archLayout = styledSection({
37771
+ children: el("div", {
37772
+ className: "rb-container",
37773
+ ...lookSlot("layout")
37774
+ }, [el("div", lookSlot("frame"), [el("div", {
37775
+ className: "rb-grid",
37776
+ ...lookSlot("head")
37777
+ }, newsletterCopyFragment.layout), ...newsletterFormFragment.layout])]),
37778
+ baseClass: "",
37779
+ spacing: "medium",
37780
+ background: "surface"
37781
+ });
37107
37782
  const newsletterSignupManifest = createBlockManifest({
37108
37783
  id: "block.newsletter-signup",
37109
37784
  title: "Newsletter Signup",
@@ -37118,13 +37793,26 @@ const newsletterSignupManifest = createBlockManifest({
37118
37793
  fragment: newsletterFormFragment,
37119
37794
  fieldPriority: 1
37120
37795
  }],
37796
+ additionalFields: [{
37797
+ id: "archFrame",
37798
+ type: "boolean",
37799
+ label: "Arch frame",
37800
+ ui: {
37801
+ intent: "display",
37802
+ hidden: true
37803
+ }
37804
+ }],
37121
37805
  layout: stackedLayout,
37122
37806
  variants: {
37807
+ arch: archLayout,
37123
37808
  stacked: stackedLayout,
37124
37809
  inline: inlineLayout,
37125
37810
  "editorial-split": editorialSplitLayout
37126
37811
  },
37127
- variantMeaning: { kind: "arrangement" },
37812
+ variantMeaning: {
37813
+ kind: "arrangement",
37814
+ lookOnlyKeys: ["arch"]
37815
+ },
37128
37816
  defaultVariant: "stacked",
37129
37817
  variantOptions: {
37130
37818
  stacked: {
@@ -38211,7 +38899,7 @@ const systemBlockDefinitions = [
38211
38899
  })
38212
38900
  ]
38213
38901
  })),
38214
- withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
38902
+ withDesignCapability("block.body-text", bodyTextBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
38215
38903
  flow: bodyFlow,
38216
38904
  layoutProfiles: [
38217
38905
  layoutProfile({
@@ -38586,7 +39274,7 @@ const systemBlockDefinitions = [
38586
39274
  weight: "quiet"
38587
39275
  })]
38588
39276
  })),
38589
- withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
39277
+ withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
38590
39278
  flow: mediaFlow,
38591
39279
  layoutProfiles: [
38592
39280
  layoutProfile({
@@ -38675,7 +39363,7 @@ const systemBlockDefinitions = [
38675
39363
  weight: "standard"
38676
39364
  })]
38677
39365
  })),
38678
- withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
39366
+ withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
38679
39367
  flow: conversionFlow,
38680
39368
  layoutProfiles: [
38681
39369
  layoutProfile({