@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
@@ -4,7 +4,7 @@ import type { ContentFrameIntent, EyebrowTreatment, EventListTreatment, HeroComp
4
4
  import type { ItemRole } from '../cards/types';
5
5
  import type { AppearancePresetId } from './types';
6
6
  import type { LookOption, LookOptionGroup } from './lookOptionGroups';
7
- export type AppearancePresetTarget = 'hero' | 'intro' | 'body-text' | 'offerings' | 'feature-cards' | 'events' | 'media-text' | 'testimonials' | 'faq' | 'contact-form' | 'newsletter' | 'cta';
7
+ export type AppearancePresetTarget = 'hero' | 'intro' | 'body-text' | 'offerings' | 'feature-cards' | 'events' | 'media-text' | 'image-gallery' | 'testimonials' | 'faq' | 'contact-form' | 'newsletter' | 'cta';
8
8
  export type BlockAppearanceDesign = Readonly<{
9
9
  sectionSurface: SiteStyleSurfaceIntent;
10
10
  contentFrame: ContentFrameIntent;
@@ -55,7 +55,9 @@ export declare const cardListKnobs: readonly ["actionStyle", "showPhotos", "card
55
55
  export declare const lookKnobBlocks: {
56
56
  readonly actionStyle: readonly [...("block.feature-cards" | "block.appointment-services" | "block.offerings-preview")[], "block.event-calendar"];
57
57
  readonly titleSize: "block.hero";
58
- readonly imagePosition: "block.hero";
58
+ readonly imagePosition: readonly ["block.hero", "block.media-text"];
59
+ readonly imageShape: "block.media-text";
60
+ readonly aspectRatio: "block.media-text";
59
61
  readonly stickerLine: "block.hero";
60
62
  readonly smallCaption: "block.hero";
61
63
  readonly candleGlow: "block.hero";
@@ -65,7 +67,7 @@ export declare const lookKnobBlocks: {
65
67
  readonly dates: "block.offerings-preview";
66
68
  readonly showCapacity: "block.event-calendar";
67
69
  readonly quoteCount: "block.testimonials";
68
- readonly archFrame: "block.testimonials";
70
+ readonly archFrame: readonly ["block.testimonials", "block.newsletter-signup", "block.form"];
69
71
  readonly tilt: "block.testimonials";
70
72
  };
71
73
  export type LookKnobId = keyof typeof lookKnobBlocks;
@@ -104,7 +106,7 @@ type AppearancePresetIdentity = Readonly<{
104
106
  id: string;
105
107
  target: AppearancePresetTarget;
106
108
  label: string;
107
- blockKinds: readonly ('block.hero' | 'block.intro' | 'block.offerings-preview' | 'block.feature-cards' | 'block.event-calendar' | 'block.event-listing' | 'block.event-details' | 'block.media-text' | 'block.testimonials' | 'block.faq' | 'block.form' | 'block.appointment-booking' | 'block.appointment-services' | 'block.cta-full')[];
109
+ blockKinds: readonly ('block.hero' | 'block.intro' | 'block.body-text' | 'block.offerings-preview' | 'block.feature-cards' | 'block.event-calendar' | 'block.event-listing' | 'block.event-details' | 'block.media-text' | 'block.image-gallery' | 'block.newsletter-signup' | 'block.testimonials' | 'block.faq' | 'block.form' | 'block.appointment-booking' | 'block.appointment-services' | 'block.cta-full')[];
108
110
  }>;
109
111
  export type LegacyBlockAppearancePreset = AppearancePresetIdentity & Readonly<{
110
112
  /**
@@ -135,12 +137,12 @@ export declare function isArrangementAppearancePreset(preset: BlockAppearancePre
135
137
  export declare function lookModes(look: ArrangementBlockAppearancePreset): readonly (string | null)[];
136
138
  export type AppearancePreset = BlockAppearancePreset;
137
139
  export type BlockAppearancePresetTarget = BlockAppearancePreset['target'];
138
- export declare const appearancePresetTargets: readonly ["hero", "intro", "body-text", "offerings", "feature-cards", "events", "media-text", "testimonials", "faq", "contact-form", "newsletter", "cta"];
140
+ export declare const appearancePresetTargets: readonly ["hero", "intro", "body-text", "offerings", "feature-cards", "events", "media-text", "image-gallery", "testimonials", "faq", "contact-form", "newsletter", "cta"];
139
141
  export declare function cardListKnobDefaults(block: string, arrangement: string, knobs: readonly LookKnobId[], defaults: ArrangementBlockAppearancePreset['structure']['knobDefaults']): {
140
142
  knobs?: undefined;
141
143
  knobDefaults?: undefined;
142
144
  } | {
143
- knobs: ("dates" | "actionStyle" | "showPhotos" | "cardMarker" | "titleSize" | "imagePosition" | "stickerLine" | "smallCaption" | "candleGlow" | "columnGuides" | "showCapacity" | "quoteCount" | "archFrame" | "tilt")[];
145
+ knobs: ("dates" | "actionStyle" | "showPhotos" | "cardMarker" | "titleSize" | "imagePosition" | "imageShape" | "aspectRatio" | "stickerLine" | "smallCaption" | "candleGlow" | "columnGuides" | "showCapacity" | "quoteCount" | "archFrame" | "tilt")[];
144
146
  knobDefaults: {
145
147
  dates?: string | undefined;
146
148
  actionStyle: string;
@@ -148,6 +150,8 @@ export declare function cardListKnobDefaults(block: string, arrangement: string,
148
150
  cardMarker?: string | undefined;
149
151
  titleSize?: string | undefined;
150
152
  imagePosition?: string | undefined;
153
+ imageShape?: string | undefined;
154
+ aspectRatio?: string | undefined;
151
155
  stickerLine?: string | undefined;
152
156
  smallCaption?: string | undefined;
153
157
  candleGlow?: string | undefined;
@@ -158,6 +162,18 @@ export declare function cardListKnobDefaults(block: string, arrangement: string,
158
162
  tilt?: string | undefined;
159
163
  };
160
164
  };
161
- export declare function defineArrangementLook(id: string, block: 'hero' | 'feature-cards' | 'event-calendar' | 'testimonials' | 'event-details', name: string, arrangement: string, knobs: readonly LookKnobId[], input?: Partial<Pick<ArrangementBlockAppearancePreset['structure'], 'itemRoles' | 'slotRoles' | 'actionSize' | 'whenMissing' | 'styleFallback' | 'forcedKnobs' | 'knobValues' | 'knobDefaults' | 'knobDescriptions'>>): ArrangementBlockAppearancePreset;
165
+ declare const arrangementLookTargets: {
166
+ readonly hero: "hero";
167
+ readonly 'feature-cards': "feature-cards";
168
+ readonly 'event-calendar': "events";
169
+ readonly testimonials: "testimonials";
170
+ readonly 'event-details': "events";
171
+ readonly 'media-text': "media-text";
172
+ readonly 'image-gallery': "image-gallery";
173
+ readonly 'newsletter-signup': "newsletter";
174
+ readonly form: "contact-form";
175
+ readonly 'body-text': "body-text";
176
+ };
177
+ export declare function defineArrangementLook(id: string, block: keyof typeof arrangementLookTargets, name: string, arrangement: string, knobs: readonly LookKnobId[], input?: Partial<Pick<ArrangementBlockAppearancePreset['structure'], 'itemRoles' | 'slotRoles' | 'actionSize' | 'whenMissing' | 'styleFallback' | 'forcedKnobs' | 'knobValues' | 'knobDefaults' | 'knobDescriptions'>>): ArrangementBlockAppearancePreset;
162
178
  export declare function defineCardListLook(id: string, name: string, arrangement: string, requires: readonly CardListItemPart[], knobs: readonly LookKnobId[], input?: NonNullable<Parameters<typeof defineArrangementLook>[5]>): ArrangementBlockAppearancePreset;
163
179
  export {};
@@ -2,6 +2,6 @@ import { type ThemeColorToken } from '../tokens';
2
2
  export declare const backgroundAppearanceQuickColorTokenNames: readonly ["background", "surface", "muted", "primary", "secondary", "accent"];
3
3
  export declare const backgroundAppearanceBaseColorTokenNames: readonly ["background", "surface", "surfaceAlt", "muted", "primary", "secondary", "accent", "neutral"];
4
4
  export declare const backgroundAppearanceShadeableColorTokenNames: readonly ["primary", "secondary", "accent", "neutral"];
5
- export declare const backgroundAppearanceColorTokenNames: readonly ("surface" | "background" | "primary" | "secondary" | "accent" | "surfaceAlt" | "muted" | "neutral" | "neutral-50" | "neutral-900" | "primary-50" | "primary-500" | "primary-900" | "secondary-50" | "secondary-500" | "secondary-900" | "accent-50" | "accent-500" | "accent-900" | "neutral-100" | "neutral-600" | "primary-400" | "neutral-300" | "neutral-950" | "neutral-800" | "neutral-700" | "primary-300" | "primary-600" | "secondary-600" | "accent-600" | "accent-400" | "neutral-200" | "secondary-400" | "neutral-400" | "primary-100" | "neutral-500" | "primary-800" | "primary-700" | "primary-200" | "primary-950" | "secondary-100" | "secondary-200" | "secondary-300" | "secondary-700" | "secondary-800" | "secondary-950" | "accent-100" | "accent-200" | "accent-300" | "accent-700" | "accent-800" | "accent-950")[];
6
- export declare const backgroundAppearanceAdvancedColorTokenNames: ("surface" | "background" | "primary" | "secondary" | "accent" | "surfaceAlt" | "muted" | "neutral" | "neutral-50" | "neutral-900" | "primary-50" | "primary-500" | "primary-900" | "secondary-50" | "secondary-500" | "secondary-900" | "accent-50" | "accent-500" | "accent-900" | "neutral-100" | "neutral-600" | "primary-400" | "neutral-300" | "neutral-950" | "neutral-800" | "neutral-700" | "primary-300" | "primary-600" | "secondary-600" | "accent-600" | "accent-400" | "neutral-200" | "secondary-400" | "neutral-400" | "primary-100" | "neutral-500" | "primary-800" | "primary-700" | "primary-200" | "primary-950" | "secondary-100" | "secondary-200" | "secondary-300" | "secondary-700" | "secondary-800" | "secondary-950" | "accent-100" | "accent-200" | "accent-300" | "accent-700" | "accent-800" | "accent-950")[];
5
+ export declare const backgroundAppearanceColorTokenNames: readonly ("surface" | "background" | "primary" | "secondary" | "accent" | "surfaceAlt" | "muted" | "neutral" | "neutral-50" | "neutral-900" | "primary-50" | "primary-500" | "primary-900" | "secondary-50" | "secondary-500" | "secondary-900" | "accent-50" | "accent-500" | "accent-900" | "neutral-100" | "neutral-600" | "primary-400" | "neutral-300" | "neutral-950" | "neutral-800" | "neutral-700" | "primary-300" | "primary-600" | "secondary-600" | "accent-600" | "accent-400" | "neutral-200" | "secondary-400" | "neutral-400" | "secondary-950" | "primary-100" | "neutral-500" | "primary-800" | "primary-700" | "primary-200" | "primary-950" | "secondary-100" | "secondary-200" | "secondary-300" | "secondary-700" | "secondary-800" | "accent-100" | "accent-200" | "accent-300" | "accent-700" | "accent-800" | "accent-950")[];
6
+ export declare const backgroundAppearanceAdvancedColorTokenNames: ("surface" | "background" | "primary" | "secondary" | "accent" | "surfaceAlt" | "muted" | "neutral" | "neutral-50" | "neutral-900" | "primary-50" | "primary-500" | "primary-900" | "secondary-50" | "secondary-500" | "secondary-900" | "accent-50" | "accent-500" | "accent-900" | "neutral-100" | "neutral-600" | "primary-400" | "neutral-300" | "neutral-950" | "neutral-800" | "neutral-700" | "primary-300" | "primary-600" | "secondary-600" | "accent-600" | "accent-400" | "neutral-200" | "secondary-400" | "neutral-400" | "secondary-950" | "primary-100" | "neutral-500" | "primary-800" | "primary-700" | "primary-200" | "primary-950" | "secondary-100" | "secondary-200" | "secondary-300" | "secondary-700" | "secondary-800" | "accent-100" | "accent-200" | "accent-300" | "accent-700" | "accent-800" | "accent-950")[];
7
7
  export declare function parseBackgroundAppearanceColorToken(value: unknown): ThemeColorToken | null;
@@ -1,3 +1,4 @@
1
+ import { type FooterPreferences } from './footerPreferences';
1
2
  import type { Theme } from '../schema';
2
3
  import type { ButtonSystem } from '../buttons/types';
3
4
  import type { ButtonStyleSelection } from '../buttons/styles/selection';
@@ -53,12 +54,7 @@ export type HeaderPreserveDirective = Readonly<{
53
54
  }>;
54
55
  export type HeaderCompilationDirective = HeaderPreserveDirective | HeaderRecompileDirective;
55
56
  export type FooterCompilationDirective = Readonly<{
56
- kind: 'preserve';
57
- footer: Theme['footer'];
58
- footerLookId: FooterLookId | null;
59
- }> | Readonly<{
60
- kind: 'apply-look';
61
- footer: Theme['footer'];
57
+ preferences: FooterPreferences;
62
58
  footerLookId: FooterLookId | null;
63
59
  }>;
64
60
  export type ButtonUpdateRecompileReason = 'selection-change' | 'missing-applied-buttons';
@@ -88,6 +84,7 @@ export type SiteThemeCompilationPlan = Readonly<{
88
84
  buttons: ReplacementButtonRecompileDirective;
89
85
  header: HeaderRecompileDirective;
90
86
  footerLookId: FooterLookId | null;
87
+ footerPreferences: FooterPreferences;
91
88
  }> | Readonly<{
92
89
  kind: 'update-selection';
93
90
  buttons: ButtonCompilationDirective;
@@ -98,6 +95,7 @@ export declare function replaceSiteStyleCompilationPlan(input: Readonly<{
98
95
  headerSelection: HeaderLayoutStyleSelection;
99
96
  buttonStyleSelection?: ButtonStyleSelection | null;
100
97
  footerLookId?: FooterLookId | null;
98
+ footerPreferences?: FooterPreferences;
101
99
  headerLogo?: HeaderLogoContext;
102
100
  }>): Extract<SiteThemeCompilationPlan, {
103
101
  kind: 'replace-site-style';
@@ -0,0 +1,121 @@
1
+ import type { Theme } from '../schema';
2
+ import type { CuratedSiteStyle } from './curatedSiteStyles';
3
+ import { type FooterPreferences } from './footerPreferences';
4
+ import { type FooterLookId } from './footerLooks';
5
+ /** The one footer composition: offered selection → recipe → whole intent record. */
6
+ export declare function compileFooterAgainstRow<TTheme extends Theme>(input: Readonly<{
7
+ theme: TTheme;
8
+ siteStyle: CuratedSiteStyle | null;
9
+ lookId: FooterLookId | null;
10
+ preferences: FooterPreferences;
11
+ }>): {
12
+ theme: TTheme & {
13
+ footer: {
14
+ variant: "split" | "simple" | "centred";
15
+ maxWidth: "full" | "container";
16
+ background: {
17
+ type: "image" | "color" | "gradient";
18
+ contentOwner?: "site-chrome-editor" | undefined;
19
+ color?: string | null | undefined;
20
+ gradient?: {
21
+ type: "linear" | "radial" | "conic";
22
+ stops: {
23
+ color: string;
24
+ position: number;
25
+ }[];
26
+ angle?: number | undefined;
27
+ shape?: "circle" | "ellipse" | undefined;
28
+ position?: string | undefined;
29
+ } | null | undefined;
30
+ image?: import("../../../media-core/src/index").Media | null | undefined;
31
+ textColor?: string | null | undefined;
32
+ };
33
+ navStyle: "scale" | "solid" | "underline" | "minimal" | "underline-grow" | "capsule" | "frosted";
34
+ navWeight: "bold" | "medium" | "regular" | "semibold";
35
+ navColor?: string | null | undefined;
36
+ navLinkStyle?: {
37
+ colorToken: string;
38
+ padding: "none" | "compact" | "default";
39
+ borderRadius: "none" | "full" | "md" | "sm";
40
+ typography: "heading" | "body";
41
+ fontWeight: "bold" | "medium" | "regular" | "semibold";
42
+ textTransform: "none" | "uppercase" | "capitalize";
43
+ italic: boolean;
44
+ textSize?: "base" | "lg" | "xl" | "xs" | "sm" | undefined;
45
+ letterSpacing?: "normal" | "wide" | "wider" | "widest" | undefined;
46
+ contrastTreatment?: "none" | "soft-glow" | undefined;
47
+ hoverColorToken?: string | null | undefined;
48
+ paddingX?: "none" | "compact" | "default" | "tight" | "relaxed" | "spacious" | undefined;
49
+ effects?: {
50
+ base?: {
51
+ effectId: string;
52
+ options?: Record<string, any> | undefined;
53
+ }[] | undefined;
54
+ hover?: {
55
+ effectId: string;
56
+ options?: Record<string, any> | undefined;
57
+ }[] | undefined;
58
+ active?: {
59
+ effectId: string;
60
+ options?: Record<string, any> | undefined;
61
+ }[] | undefined;
62
+ focus?: {
63
+ effectId: string;
64
+ options?: Record<string, any> | undefined;
65
+ }[] | undefined;
66
+ } | undefined;
67
+ name?: string | undefined;
68
+ } | undefined;
69
+ bottomTextLinkStyle?: {
70
+ colorToken?: string | undefined;
71
+ hoverColorToken?: string | null | undefined;
72
+ decorationColorToken?: string | null | undefined;
73
+ underline?: boolean | undefined;
74
+ } | undefined;
75
+ navLayout?: {
76
+ layout?: "stack" | "inline-wrap" | "inline" | undefined;
77
+ } | undefined;
78
+ logo?: {
79
+ size?: "md" | "lg" | "xl" | "sm" | undefined;
80
+ maxHeight?: "md" | "lg" | "xl" | "sm" | undefined;
81
+ align?: "start" | "end" | "center" | undefined;
82
+ } | undefined;
83
+ bottomBar?: {
84
+ enabled?: boolean | undefined;
85
+ fullBleed?: boolean | undefined;
86
+ background?: {
87
+ type: "image" | "color" | "gradient";
88
+ contentOwner?: "site-chrome-editor" | undefined;
89
+ color?: string | null | undefined;
90
+ gradient?: {
91
+ type: "linear" | "radial" | "conic";
92
+ stops: {
93
+ color: string;
94
+ position: number;
95
+ }[];
96
+ angle?: number | undefined;
97
+ shape?: "circle" | "ellipse" | undefined;
98
+ position?: string | undefined;
99
+ } | null | undefined;
100
+ image?: import("../../../media-core/src/index").Media | null | undefined;
101
+ textColor?: string | null | undefined;
102
+ } | undefined;
103
+ textColor?: string | null | undefined;
104
+ textAlign?: "left" | "right" | "center" | undefined;
105
+ paddingY?: "none" | "compact" | "default" | "tight" | "relaxed" | "spacious" | undefined;
106
+ paddingX?: "none" | "compact" | "default" | "tight" | "relaxed" | "spacious" | undefined;
107
+ borderTop?: {
108
+ colorToken?: string | null | undefined;
109
+ width?: "none" | "medium" | "thin" | "thick" | undefined;
110
+ } | undefined;
111
+ } | undefined;
112
+ };
113
+ };
114
+ lookId: FooterLookId;
115
+ preferences: Readonly<{
116
+ background: import("../../../blocks/src/index").SiteChromeBackgroundOverride;
117
+ navigationLayout: "inline-wrap" | "stack";
118
+ }>;
119
+ };
120
+ /** Style switches retain an offered choice; otherwise use the style's first choice. */
121
+ export declare function resolveFooterLookIdForStyle(siteStyle: Pick<CuratedSiteStyle, 'recommendedFooterLookIds'> | null, current: FooterLookId | null): FooterLookId;
@@ -1,3 +1,4 @@
1
+ import { type FooterLookRecipeOverrides } from './footerLookDefaults';
1
2
  import type { SiteStyleLooks } from './lookResolution';
2
3
  import { type ButtonStyleSelection } from '../buttons/styles';
3
4
  import { type CuratedPalette, type KnownCuratedPaletteValueKey } from '../palette/curated';
@@ -168,6 +169,8 @@ export type CuratedSiteStyle = Readonly<{
168
169
  * docs/guides/site-styles.md.
169
170
  */
170
171
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
172
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
173
+ footerLookRecipes?: FooterLookRecipeOverrides;
171
174
  recommendedFooterLookIds: readonly FooterLookId[];
172
175
  /** Authored picker choices. First item is the default/fallback. */
173
176
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -233,6 +236,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
233
236
  * docs/guides/site-styles.md.
234
237
  */
235
238
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
239
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
240
+ footerLookRecipes?: FooterLookRecipeOverrides;
236
241
  recommendedFooterLookIds: readonly FooterLookId[];
237
242
  /** Authored picker choices. First item is the default/fallback. */
238
243
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -282,6 +287,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
282
287
  * docs/guides/site-styles.md.
283
288
  */
284
289
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
290
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
291
+ footerLookRecipes?: FooterLookRecipeOverrides;
285
292
  recommendedFooterLookIds: readonly FooterLookId[];
286
293
  /** Authored picker choices. First item is the default/fallback. */
287
294
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -331,6 +338,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
331
338
  * docs/guides/site-styles.md.
332
339
  */
333
340
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
341
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
342
+ footerLookRecipes?: FooterLookRecipeOverrides;
334
343
  recommendedFooterLookIds: readonly FooterLookId[];
335
344
  /** Authored picker choices. First item is the default/fallback. */
336
345
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -380,6 +389,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
380
389
  * docs/guides/site-styles.md.
381
390
  */
382
391
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
392
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
393
+ footerLookRecipes?: FooterLookRecipeOverrides;
383
394
  recommendedFooterLookIds: readonly FooterLookId[];
384
395
  /** Authored picker choices. First item is the default/fallback. */
385
396
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -429,6 +440,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
429
440
  * docs/guides/site-styles.md.
430
441
  */
431
442
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
443
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
444
+ footerLookRecipes?: FooterLookRecipeOverrides;
432
445
  recommendedFooterLookIds: readonly FooterLookId[];
433
446
  /** Authored picker choices. First item is the default/fallback. */
434
447
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -478,6 +491,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
478
491
  * docs/guides/site-styles.md.
479
492
  */
480
493
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
494
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
495
+ footerLookRecipes?: FooterLookRecipeOverrides;
481
496
  recommendedFooterLookIds: readonly FooterLookId[];
482
497
  /** Authored picker choices. First item is the default/fallback. */
483
498
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -527,6 +542,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
527
542
  * docs/guides/site-styles.md.
528
543
  */
529
544
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
545
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
546
+ footerLookRecipes?: FooterLookRecipeOverrides;
530
547
  recommendedFooterLookIds: readonly FooterLookId[];
531
548
  /** Authored picker choices. First item is the default/fallback. */
532
549
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -576,6 +593,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
576
593
  * docs/guides/site-styles.md.
577
594
  */
578
595
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
596
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
597
+ footerLookRecipes?: FooterLookRecipeOverrides;
579
598
  recommendedFooterLookIds: readonly FooterLookId[];
580
599
  /** Authored picker choices. First item is the default/fallback. */
581
600
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -625,6 +644,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
625
644
  * docs/guides/site-styles.md.
626
645
  */
627
646
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
647
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
648
+ footerLookRecipes?: FooterLookRecipeOverrides;
628
649
  recommendedFooterLookIds: readonly FooterLookId[];
629
650
  /** Authored picker choices. First item is the default/fallback. */
630
651
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -674,6 +695,8 @@ export declare const curatedSiteStyles: readonly [Readonly<{
674
695
  * docs/guides/site-styles.md.
675
696
  */
676
697
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
698
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
699
+ footerLookRecipes?: FooterLookRecipeOverrides;
677
700
  recommendedFooterLookIds: readonly FooterLookId[];
678
701
  /** Authored picker choices. First item is the default/fallback. */
679
702
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -724,6 +747,8 @@ export declare const curatedSiteStylesById: Map<SiteStyleId, Readonly<{
724
747
  * docs/guides/site-styles.md.
725
748
  */
726
749
  headerStyleRecipes?: HeaderStyleRecipeOverrides;
750
+ /** Whole footer recipes owned by this style; omitted entries use the catalogue default. */
751
+ footerLookRecipes?: FooterLookRecipeOverrides;
727
752
  recommendedFooterLookIds: readonly FooterLookId[];
728
753
  /** Authored picker choices. First item is the default/fallback. */
729
754
  buttonStyleChoices: NonEmptyReadonlyArray<ButtonStyleChoice>;
@@ -0,0 +1,45 @@
1
+ import type { FooterLookIdValue } from './footerLooks';
2
+ import type { FooterLookRecipe } from './footerLookRecipe';
3
+ export type FooterLookRecipeOverrides = Partial<Record<FooterLookIdValue, FooterLookRecipe>>;
4
+ export type FooterLookRecipeOwner = Readonly<{
5
+ footerLookRecipes?: FooterLookRecipeOverrides;
6
+ }>;
7
+ export declare const defaultFooterLookRecipes: {
8
+ readonly 'footer-centred-name': {
9
+ readonly arrangement: "centred";
10
+ readonly ground: {
11
+ readonly kind: "token";
12
+ readonly token: "surface";
13
+ };
14
+ readonly nav: {
15
+ readonly weight: "regular";
16
+ readonly colorToken: "text";
17
+ readonly hoverColorToken: "primary";
18
+ readonly typography: "body";
19
+ };
20
+ readonly legal: {
21
+ readonly kind: "separate";
22
+ readonly bar: null;
23
+ };
24
+ readonly brandAlign: "center";
25
+ };
26
+ readonly 'footer-links-row': {
27
+ readonly arrangement: "simple";
28
+ readonly ground: {
29
+ readonly kind: "token";
30
+ readonly token: "surface";
31
+ };
32
+ readonly nav: {
33
+ readonly weight: "regular";
34
+ readonly colorToken: "text";
35
+ readonly hoverColorToken: "primary";
36
+ readonly typography: "body";
37
+ };
38
+ readonly legal: {
39
+ readonly kind: "integrated";
40
+ };
41
+ readonly brandAlign: "start";
42
+ };
43
+ };
44
+ /** A whole authored recipe replaces the default; facets are never deep-merged. */
45
+ export declare function resolveFooterLookRecipe(style: FooterLookRecipeOwner | null, id: FooterLookIdValue): FooterLookRecipe;
@@ -0,0 +1,50 @@
1
+ import type { Theme } from '../schema';
2
+ import type { PaletteTokenName, themeColorShadeSteps } from '../tokens';
3
+ import type { SiteStyleLooks } from './lookResolution';
4
+ export type FooterRecipeColorToken = PaletteTokenName | `${PaletteTokenName}-${(typeof themeColorShadeSteps)[number]}`;
5
+ export type FooterGround = Readonly<{
6
+ kind: 'token';
7
+ token: FooterRecipeColorToken;
8
+ }> | Readonly<{
9
+ kind: 'style-surface';
10
+ surface: string;
11
+ }>;
12
+ export type FooterBarPaint = Readonly<{
13
+ fullBleed: boolean;
14
+ background: FooterGround;
15
+ textColor: FooterRecipeColorToken;
16
+ textAlign: 'left' | 'center' | 'right';
17
+ paddingY: 'none' | 'tight' | 'compact' | 'default' | 'relaxed' | 'spacious';
18
+ paddingX: 'none' | 'tight' | 'compact' | 'default' | 'relaxed' | 'spacious';
19
+ borderTop: Readonly<{
20
+ width: 'none' | 'thin' | 'medium' | 'thick';
21
+ colorToken?: FooterRecipeColorToken;
22
+ }>;
23
+ }>;
24
+ export type FooterLookRecipe = Readonly<{
25
+ arrangement: 'simple' | 'split' | 'centred';
26
+ ground: FooterGround;
27
+ nav: Readonly<{
28
+ weight: 'regular' | 'medium' | 'semibold' | 'bold';
29
+ colorToken: FooterRecipeColorToken;
30
+ hoverColorToken: FooterRecipeColorToken;
31
+ typography: 'body' | 'heading';
32
+ }>;
33
+ legal: Readonly<{
34
+ kind: 'integrated';
35
+ }> | Readonly<{
36
+ kind: 'separate';
37
+ bar: FooterBarPaint | null;
38
+ linkStyle?: Theme['footer']['bottomTextLinkStyle'];
39
+ }>;
40
+ brandAlign: 'start' | 'center' | 'end';
41
+ /** A style's fixed brand height; otherwise derived from the header. */
42
+ brandLogoSize?: 'sm' | 'md' | 'lg' | 'xl';
43
+ }>;
44
+ export type FooterRecipeSurfaceOwner = Readonly<{
45
+ looks: SiteStyleLooks;
46
+ }>;
47
+ /** Construct appearance from its owners; persisted footer bytes are never inputs. */
48
+ export declare function compileFooterRecipe(recipe: FooterLookRecipe, theme: Theme, style: FooterRecipeSurfaceOwner): Theme['footer'];
49
+ /** Reject undeclared references when the curated catalogue is loaded, before rendering. */
50
+ export declare function validateFooterRecipeSurfaces(style: FooterRecipeSurfaceOwner, recipe: FooterLookRecipe): void;
@@ -1,6 +1,5 @@
1
- import type { Theme } from '../schema';
2
1
  import { type Brand } from './types';
3
- export declare const footerLookIdValues: readonly ["footer-links-quiet", "footer-links-emphasized"];
2
+ export declare const footerLookIdValues: readonly ["footer-links-row", "footer-centred-name"];
4
3
  export type FooterLookIdValue = (typeof footerLookIdValues)[number];
5
4
  export type FooterLookId = Brand<FooterLookIdValue, 'FooterLookId'>;
6
5
  export declare function asFooterLookId(value: FooterLookIdValue): FooterLookId;
@@ -17,46 +16,21 @@ export declare function parsePersistedFooterLookId(value: string): Exclude<Persi
17
16
  kind: 'empty';
18
17
  }>;
19
18
  export declare function parsePersistedFooterLookId(value: string | null | undefined): PersistedFooterLookIdParseResult;
20
- export type FooterArrangementBlockAppearancePreset = Readonly<{
19
+ export type FooterLookDefinition = Readonly<{
21
20
  id: FooterLookId;
22
21
  label: string;
23
22
  description: string;
24
- compile: (theme: Theme) => Theme['footer'];
25
- }>;
26
- export type FooterSelectionResult = Readonly<{
27
- selectedLookId: FooterLookId;
28
- selectedLook: FooterArrangementBlockAppearancePreset;
29
- footer: Theme['footer'];
30
- rejected: readonly [];
31
- }>;
32
- export type FooterLookDiagnostics = Readonly<{
33
- surface: Readonly<{
34
- kind: 'site-footer';
35
- }>;
36
- selectedLookId: FooterLookId;
37
- rejected: readonly [];
38
- }>;
39
- export type FooterLookResolutionInput = Readonly<{
40
- theme: Theme;
41
- recommendedLookIds: readonly FooterLookId[];
42
23
  }>;
43
24
  export declare const guaranteedFallbackFooterLookId: FooterLookId;
44
- declare function quietFooterLinks(theme: Theme): Theme['footer'];
45
- declare function emphasizedFooterLinks(theme: Theme): Theme['footer'];
46
25
  export declare const footerLookCatalog: readonly [{
47
26
  readonly id: FooterLookId;
48
- readonly label: "Quiet links";
49
- readonly description: "Regular-weight footer navigation with a restrained hover.";
50
- readonly compile: typeof quietFooterLinks;
27
+ readonly label: "Links in a row";
28
+ readonly description: "Your links in a row, with the other footer sections in columns beside them.";
51
29
  }, {
52
30
  readonly id: FooterLookId;
53
- readonly label: "Emphasized links";
54
- readonly description: "Medium-weight footer navigation with a clearer emphasis.";
55
- readonly compile: typeof emphasizedFooterLinks;
31
+ readonly label: "Centred name, links beneath";
32
+ readonly description: "Your site name centred, with your links, contact details and social links beneath it.";
56
33
  }];
57
- export declare function getFooterLook(id: FooterLookId): FooterArrangementBlockAppearancePreset | null;
58
- export declare function findFooterLook(id: FooterLookId): FooterArrangementBlockAppearancePreset | undefined;
59
- export declare function getFooterLookOrThrow(id: FooterLookId): FooterArrangementBlockAppearancePreset;
60
- export declare function resolveFooterLook(input: FooterLookResolutionInput): FooterSelectionResult;
61
- export declare function footerLookDiagnosticsFromSelectionResult(result: FooterSelectionResult): FooterLookDiagnostics;
62
- export {};
34
+ export declare function getFooterLook(id: FooterLookId): FooterLookDefinition | null;
35
+ export declare function findFooterLook(id: FooterLookId): FooterLookDefinition | undefined;
36
+ export declare function getFooterLookOrThrow(id: FooterLookId): FooterLookDefinition;
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { Theme, ThemeFooter } from '../schema';
3
+ import { type SiteChromeBackgroundOverride } from './siteChromeBackgrounds';
4
+ export type FooterPreferences = Readonly<{
5
+ background: SiteChromeBackgroundOverride;
6
+ navigationLayout: 'inline-wrap' | 'stack';
7
+ }>;
8
+ export declare const defaultFooterPreferences: FooterPreferences;
9
+ export declare const footerPreferencesSchema: z.ZodType<FooterPreferences>;
10
+ /** Quick controls express background only; the composer owns navigation intent. */
11
+ export declare const footerPreferencesWireSchema: z.ZodObject<{
12
+ background: z.ZodDiscriminatedUnion<[z.ZodObject<{
13
+ kind: z.ZodLiteral<"default">;
14
+ }, z.core.$strict>, z.ZodObject<{
15
+ kind: z.ZodLiteral<"color">;
16
+ token: z.ZodType<import("../../../blocks/src/index").SiteChromeBackgroundColorToken, unknown, z.core.$ZodTypeInternals<import("../../../blocks/src/index").SiteChromeBackgroundColorToken, unknown>>;
17
+ }, z.core.$strict>], "kind">;
18
+ }, z.core.$strict>;
19
+ export type PersistedFooterPreferences = Readonly<{
20
+ kind: 'present';
21
+ preferences: FooterPreferences;
22
+ }> | Readonly<{
23
+ kind: 'invalid';
24
+ issues: readonly string[];
25
+ }>;
26
+ export declare function parsePersistedFooterPreferences(value: unknown): PersistedFooterPreferences;
27
+ /** One-time backfill rule, also exercised against the migration SQL. Not a runtime fallback. */
28
+ export declare function readFooterPreferences(theme: unknown): FooterPreferences;
29
+ export declare function applyFooterPreferences(theme: Theme, footer: ThemeFooter, preferences: FooterPreferences): ThemeFooter;
@@ -1,5 +1,4 @@
1
1
  import { z } from 'zod';
2
- import { type SiteChromeBackgroundColorToken } from './siteChromeBackgrounds';
3
2
  import type { HeaderPreferences } from './headerPreferences';
4
3
  /**
5
4
  * The persisted shape of `HeaderPreferences`, closed at every field.
@@ -17,7 +16,7 @@ export declare const headerPreferencesWireSchema: z.ZodObject<{
17
16
  kind: z.ZodLiteral<"default">;
18
17
  }, z.core.$strict>, z.ZodObject<{
19
18
  kind: z.ZodLiteral<"color">;
20
- token: z.ZodType<SiteChromeBackgroundColorToken, unknown, z.core.$ZodTypeInternals<SiteChromeBackgroundColorToken, unknown>>;
19
+ token: z.ZodType<import("../../../blocks/src/index").SiteChromeBackgroundColorToken, unknown, z.core.$ZodTypeInternals<import("../../../blocks/src/index").SiteChromeBackgroundColorToken, unknown>>;
21
20
  }, z.core.$strict>], "kind">;
22
21
  navTextSize: z.ZodEnum<{
23
22
  base: "base";
@@ -46,8 +45,8 @@ export declare const headerPreferencesWireSchema: z.ZodObject<{
46
45
  logoSize: z.ZodEnum<{
47
46
  display: "display";
48
47
  auto: "auto";
49
- standard: "standard";
50
48
  compact: "compact";
49
+ standard: "standard";
51
50
  generous: "generous";
52
51
  }>;
53
52
  }, z.core.$strict>;
@@ -12,6 +12,8 @@ export * from './curatedSiteStyles';
12
12
  export * from './customizableSurfaces';
13
13
  export * from './designState';
14
14
  export * from './footerLooks';
15
+ export * from './footerLookRecipe';
16
+ export * from './footerLookDefaults';
15
17
  export * from './generatedSchemas';
16
18
  export * from './generatedDesignPipeline';
17
19
  export * from './headerLayoutStyles';
@@ -59,3 +61,5 @@ export * from './effectiveArrangement';
59
61
  export * from './lookResolution';
60
62
  export { cardListItemParts, cardListBlockParts, cardListFamilyBlocks } from './appearancePresetTypes';
61
63
  export type { CardListItemPart } from './appearancePresetTypes';
64
+ export * from './footerPreferences';
65
+ export * from './compileFooterAgainstRow';
@@ -134,7 +134,7 @@ export type ArrangementStyleLooks = Readonly<{
134
134
  export declare function lookDefinitionForId(lookId: AppearancePresetId, catalogue?: readonly ArrangementBlockAppearancePreset[]): ArrangementBlockAppearancePreset | null;
135
135
  /** Validates destination data independently of manifest rollout availability. */
136
136
  export declare function validateLookFallbacks(style: ArrangementStyleLooks, catalogue?: readonly ArrangementBlockAppearancePreset[]): void;
137
- export declare const arrangementLookHooks: readonly ["data-fact", "data-card-list", "data-card-list-item", "data-availability", "data-event-places", "data-today", "data-other-month", "data-current", "data-skin", "data-look", "data-arrangement", "data-treat", "data-surface", "data-length", "data-knob-*", "data-mode", "data-has-*", "data-photo-count", "data-slot", "data-placeholder-field"];
137
+ export declare const arrangementLookHooks: readonly ["data-fact", "data-card-list", "data-card-list-item", "data-availability", "data-event-places", "data-today", "data-other-month", "data-current", "data-skin", "data-look", "data-arrangement", "data-treat", "data-surface", "data-length", "data-knob-*", "data-mode", "data-has-*", "data-photo-count", "data-slot", "data-control", "data-placeholder-field"];
138
138
  export type CompiledArrangementLook = Readonly<{
139
139
  look: ArrangementBlockAppearancePreset;
140
140
  treatment: string;
@@ -160,7 +160,7 @@ export { cardListKnobs, cardListKnobBlocks, lookKnobBlocks, type LookKnobBlock,
160
160
  export declare const arrangementAppearancePresets: ArrangementBlockAppearancePreset[];
161
161
  export declare function arrangementStyleAvailability(style: SiteStyleLooks, preset: ArrangementBlockAppearancePreset, capabilities: ArrangementLookCapabilities | undefined): LookAvailability;
162
162
  /** Closed structural hooks shared by block arrangements and bounded skins. */
163
- export declare const arrangementSlotNames: readonly ["section", "stack", "inline", "grid", "head", "eyebrow", "heading", "intro", "frame", "copy", "caption", "headline", "lede", "actions", "media", "photo", "gallery", "sticker", "facts", "fact-label", "fact-value", "chips", "chip", "figure", "figure-value", "figure-label", "schedule", "dates", "date-places", "availability", "layout", "items", "item", "lead", "item-media", "item-body", "icon", "numeral", "item-title", "item-text", "item-actions", "list", "row", "row-continued", "group", "group-label", "group-day", "group-date", "date", "weekday", "day", "month", "date-label", "time", "price", "mark", "navigation", "time-start", "time-length", "what", "item-meta", "places", "places-low", "places-full", "action", "panel", "panel-heading", "more", "quote", "attribution", "outcome", "controls", "control", "counter"];
163
+ export declare const arrangementSlotNames: readonly ["contact", "social", "base", "section", "stack", "inline", "grid", "head", "eyebrow", "heading", "intro", "frame", "copy", "caption", "headline", "lede", "actions", "media", "photo", "gallery", "sticker", "facts", "fact-label", "fact-value", "chips", "chip", "figure", "figure-value", "figure-label", "schedule", "dates", "date-places", "availability", "layout", "items", "item", "lead", "item-media", "item-body", "icon", "numeral", "item-title", "item-text", "item-actions", "list", "row", "row-continued", "group", "group-label", "group-day", "group-date", "date", "weekday", "day", "month", "date-label", "time", "price", "mark", "navigation", "time-start", "time-length", "what", "item-meta", "places", "places-low", "places-full", "action", "panel", "panel-heading", "more", "quote", "attribution", "outcome", "controls", "control", "counter"];
164
164
  export type ArrangementSlotName = typeof arrangementSlotNames[number];
165
165
  /** One role resolver, including section inheritance and ground-specific overrides. */
166
166
  export declare function resolveItemSurface(role: import('../cards').ItemRole, ground: Ground, style: Readonly<{
@@ -58,7 +58,7 @@ export type UpdateSiteThemeSelectionsInput = SiteThemeSelectionsCommonInput & Re
58
58
  type ResolvedSiteThemeSelections = Readonly<{
59
59
  buttonStyleSelection: ButtonStyleSelection;
60
60
  headerSelection: HeaderLayoutStyleSelection;
61
- footerLookId: FooterLookId | null;
61
+ footerLookId: FooterLookId;
62
62
  }>;
63
63
  type ReplacementResolvedSiteThemeSelections = ResolvedSiteThemeSelections & Readonly<{
64
64
  footerLookId: FooterLookId;