@riverbankcms/sdk 0.135.1 → 0.137.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 (220) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +4 -8
  3. package/dist/{PreviewEditorSidebar-D4p_5TdY.mjs → PreviewEditorSidebar-Bn6cONPa.mjs} +8 -8
  4. package/dist/{PreviewEditorUI-D0cRoTX1.mjs → PreviewEditorUI-LAwXZPSx.mjs} +3 -3
  5. package/dist/{PreviewQueryProvider-DcgaESkm.mjs → PreviewQueryProvider-ztQUdsNo.mjs} +1 -1
  6. package/dist/{SdkPreviewModeRuntime-BKLtM3Nz.mjs → SdkPreviewModeRuntime-BbbGsI_v.mjs} +621 -238
  7. package/dist/{SiteChromeCustomizeContext-61X2m7QV.mjs → SiteChromeCustomizeContext-BbkNSt5a.mjs} +5041 -2407
  8. package/dist/_dts/ai/src/contracts/proposals.d.ts +18 -850
  9. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +412 -2316
  10. package/dist/_dts/ai/src/designer/themePatch.d.ts +5 -10
  11. package/dist/_dts/api/src/accessAdmin.d.ts +1 -9
  12. package/dist/_dts/api/src/accountApi.d.ts +49 -2
  13. package/dist/_dts/api/src/contentRuntime.d.ts +7 -4
  14. package/dist/_dts/api/src/domainConnection.d.ts +41 -0
  15. package/dist/_dts/api/src/endpoints.d.ts +201 -181
  16. package/dist/_dts/api/src/index.d.ts +5 -3
  17. package/dist/_dts/api/src/media.d.ts +19 -2
  18. package/dist/_dts/api/src/publicEventEndpointDefinitions.d.ts +7 -0
  19. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +26 -0
  20. package/dist/_dts/api/src/sdkBlockContentAdmission.d.ts +5 -0
  21. package/dist/_dts/api/src/sdkContracts.d.ts +2 -15
  22. package/dist/_dts/api/src/sdkMediaContracts.d.ts +40 -0
  23. package/dist/_dts/api/src/sdkMediaEndpointDefinitions.d.ts +61 -0
  24. package/dist/_dts/api/src/sdkThemeWire.d.ts +21 -436
  25. package/dist/_dts/api/src/siteInfrastructure.d.ts +17 -23
  26. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +7 -21
  27. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +27 -3
  28. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +37 -17
  29. package/dist/_dts/api/src/types.d.ts +1 -1
  30. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +2 -3
  31. package/dist/_dts/block-form/src/utils/slug.d.ts +6 -0
  32. package/dist/_dts/blocks/src/PageRenderer.d.ts +13 -7
  33. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +48 -0
  34. package/dist/_dts/blocks/src/definitions.d.ts +14 -0
  35. package/dist/_dts/blocks/src/index.d.ts +4 -3
  36. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +49 -0
  37. package/dist/_dts/blocks/src/pageRendererBlockSupport.d.ts +75 -0
  38. package/dist/_dts/blocks/src/pageRendererBoundaries.d.ts +2 -0
  39. package/dist/_dts/blocks/src/server.d.ts +2 -2
  40. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +1 -1
  41. package/dist/_dts/blocks/src/system/data/index.d.ts +2 -0
  42. package/dist/_dts/blocks/src/system/data/publicLoaderCachePolicy.d.ts +78 -0
  43. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +2 -18
  44. package/dist/_dts/blocks/src/system/manifest/validation.d.ts +103 -16
  45. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  46. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +4 -2
  47. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
  48. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  49. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +19 -0
  50. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +52 -0
  51. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +24 -0
  52. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.d.ts +47 -21
  53. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +38 -9
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/ErrorStep.d.ts +3 -5
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/VerifyingTimeoutStep.d.ts +3 -1
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +2 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +1 -1
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +2 -0
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationErrorPresentation.d.ts +5 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationErrorRecovery.d.ts +25 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationWizardContext.d.ts +4 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.d.ts +8 -3
  63. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +2 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +5 -2
  65. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useWaitlistClaimRestoration.d.ts +2 -0
  66. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.client.d.ts +2 -2
  67. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +40 -0
  68. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +2 -0
  69. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +43 -0
  70. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/capacity.d.ts +164 -0
  71. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/cta.d.ts +29 -0
  72. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/dates.d.ts +47 -0
  73. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/index.d.ts +14 -0
  74. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/people.d.ts +6 -0
  75. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/pricing.d.ts +31 -0
  76. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/CalendarDayCell.d.ts +3 -1
  77. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/CalendarNavigationChevron.d.ts +4 -0
  78. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/DayEventsModal.d.ts +2 -1
  79. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModalContext.d.ts +3 -2
  80. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/OfferingTitle.d.ts +11 -0
  81. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekAgendaView.d.ts +4 -1
  82. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekBoardView.d.ts +31 -3
  83. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekTimetableView.d.ts +3 -1
  84. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +9 -1
  85. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/index.d.ts +3 -1
  86. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listingLayout.d.ts +23 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/timetableModel.d.ts +4 -3
  88. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +0 -1
  89. package/dist/_dts/calendar/src/grid.d.ts +24 -66
  90. package/dist/_dts/calendar/src/index.d.ts +2 -2
  91. package/dist/_dts/calendar/src/timetable.d.ts +5 -9
  92. package/dist/_dts/commerce/src/purchase/allocation.d.ts +11 -0
  93. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +57 -0
  94. package/dist/_dts/commerce/src/purchase/index.d.ts +3 -0
  95. package/dist/_dts/commerce/src/purchase/settlement.d.ts +33 -0
  96. package/dist/_dts/commerce/src/purchase/stripeCheckoutReturnUrl.d.ts +8 -0
  97. package/dist/_dts/content-model/src/templates/defaults.d.ts +6 -0
  98. package/dist/_dts/core/src/slug.d.ts +20 -5
  99. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +8 -40
  100. package/dist/_dts/db/src/index.d.ts +1 -0
  101. package/dist/_dts/db/src/utils/postgrestFilter.d.ts +2 -0
  102. package/dist/_dts/media-core/src/bulkDeletePlanning.d.ts +4 -0
  103. package/dist/_dts/media-core/src/fileDomain.d.ts +3 -0
  104. package/dist/_dts/preview-next/src/client/blocks/EditablePageRenderer.d.ts +1 -1
  105. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +1 -0
  106. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +1 -0
  107. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +3 -2
  108. package/dist/_dts/preview-next/src/client/preview/headerInteractionPaletteSurfaceState.d.ts +2 -1
  109. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +1 -1
  110. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +2 -0
  111. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlSaveRequest.d.ts +51 -0
  112. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +24 -2
  113. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +23 -1
  114. package/dist/_dts/preview-next/src/client/preview/usePersistedHeaderPreferences.d.ts +8 -0
  115. package/dist/_dts/sdk/src/client/publicLoaderCacheAccess.d.ts +6 -0
  116. package/dist/_dts/sdk/src/public-api/contracts.d.ts +7 -2
  117. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +10 -6
  118. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +0 -1
  119. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +4 -4
  120. package/dist/_dts/sdk/src/rendering/helpers/footerPageOutline.d.ts +3 -0
  121. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +3 -0
  122. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +1 -1
  123. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +17 -0
  124. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +9 -3
  125. package/dist/_dts/sdk/src/rendering/hooks/usePage.d.ts +1 -1
  126. package/dist/_dts/sdk/src/rendering/index.d.ts +2 -2
  127. package/dist/_dts/sdk/src/rendering/overrideResolution.d.ts +7 -4
  128. package/dist/_dts/sdk/src/version.d.ts +1 -1
  129. package/dist/_dts/theme-core/src/cards/types.d.ts +8 -8
  130. package/dist/_dts/theme-core/src/data.d.ts +12 -0
  131. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  132. package/dist/_dts/theme-core/src/gradients/types.d.ts +5 -0
  133. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +25 -2
  134. package/dist/_dts/theme-core/src/header/legacyHeaderVariant.d.ts +2 -6
  135. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +9 -810
  136. package/dist/_dts/theme-core/src/schema.d.ts +460 -1285
  137. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +43 -3
  138. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +223 -1
  139. package/dist/_dts/theme-core/src/site-styles/headerBrandPresentation.d.ts +63 -0
  140. package/dist/_dts/theme-core/src/site-styles/headerBytesComparison.d.ts +30 -0
  141. package/dist/_dts/theme-core/src/site-styles/headerInteractionPalette.d.ts +50 -1
  142. package/dist/_dts/theme-core/src/site-styles/headerLayoutCatalog.d.ts +48 -38
  143. package/dist/_dts/theme-core/src/site-styles/headerLayoutStyles.d.ts +10 -0
  144. package/dist/_dts/theme-core/src/site-styles/headerLayoutTypes.d.ts +8 -5
  145. package/dist/_dts/theme-core/src/site-styles/headerOpeningForeground.d.ts +4 -4
  146. package/dist/_dts/theme-core/src/site-styles/headerPreferences.d.ts +162 -0
  147. package/dist/_dts/theme-core/src/site-styles/headerPreferencesPersistence.d.ts +73 -0
  148. package/dist/_dts/theme-core/src/site-styles/headerRecompile.d.ts +118 -0
  149. package/dist/_dts/theme-core/src/site-styles/headerStyleCompiler.d.ts +25 -2
  150. package/dist/_dts/theme-core/src/site-styles/headerStyleDefaults.d.ts +465 -0
  151. package/dist/_dts/theme-core/src/site-styles/headerStyleRecipe.d.ts +168 -0
  152. package/dist/_dts/theme-core/src/site-styles/index.d.ts +5 -0
  153. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  154. package/dist/_dts/theme-core/src/site-styles/siteChromeBackgrounds.d.ts +20 -1
  155. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +43 -2
  156. package/dist/client/{BookingConsentAgreement-Bz9znbpn.mjs → BookingConsentAgreement--_fUCZe-.mjs} +2 -2
  157. package/dist/client/{DiscountCodeDisclosure-35Ru8yB9.mjs → DiscountCodeDisclosure-BMipSoDJ.mjs} +1 -1
  158. package/dist/client/{EventCombined.client-BKB0ZxRR.mjs → EventCombined.client-CwJOxn7A.mjs} +274 -278
  159. package/dist/client/{EventListing.client-Dx8I21ok.mjs → EventListing.client-eVwiylPW.mjs} +2 -2
  160. package/dist/client/{LeafletStaticMap-CEWx-Bhe.mjs → LeafletStaticMap-IKenna5u.mjs} +1 -1
  161. package/dist/client/{accordion-KIDsKTwS.mjs → accordion-MGAO3PuE.mjs} +1 -1
  162. package/dist/client/{bookingForm-D96Rmp-5.mjs → bookingForm-CudlQPUu.mjs} +5 -5
  163. package/dist/client/bookings.mjs +476 -98
  164. package/dist/client/capacity-BW00PO7s.mjs +271 -0
  165. package/dist/client/{carousel-YwUgyL66.mjs → carousel-BrbGJ2Jl.mjs} +1 -1
  166. package/dist/client/{cart-BbwuNrUT.mjs → cart-Bq5eU0xZ.mjs} +3 -3
  167. package/dist/client/{checkout-hp1ucmEY.mjs → checkout-BAFVRdrK.mjs} +3 -3
  168. package/dist/client/client.mjs +4641 -2721
  169. package/dist/client/{context-DljQn8L5.mjs → context-DCkiHVdD.mjs} +20 -5
  170. package/dist/client/dates-2RPXHQy4.mjs +264 -0
  171. package/dist/client/{eventCalendar-DU4iNLpo.mjs → eventCalendar-B0O-hPF7.mjs} +261 -126
  172. package/dist/client/{eventCombined-CZuupW8m.mjs → eventCombined-DCkDaoDI.mjs} +3 -3
  173. package/dist/client/{eventDetails-DPQWwCIi.mjs → eventDetails-D8GG2dnD.mjs} +7 -4
  174. package/dist/client/{eventListing-C7oMidwS.mjs → eventListing-3ssV_bxz.mjs} +3 -3
  175. package/dist/client/{eventRegistration-zEiunlUs.mjs → eventRegistration-bPQo3kVw.mjs} +610 -313
  176. package/dist/client/{form-D2KIyCVJ.mjs → form-qMv8RDkk.mjs} +2 -2
  177. package/dist/client/{headerSection-CK5uChUK.mjs → headerSection-CH0Sc5hX.mjs} +2 -2
  178. package/dist/client/hooks.mjs +2514 -308
  179. package/dist/client/{locationMap-DLQNH1ln.mjs → locationMap-0_xlBnNI.mjs} +2 -2
  180. package/dist/client/{newsletterForm-ZuhIG7fZ.mjs → newsletterForm-NUW7m9RI.mjs} +2 -2
  181. package/dist/client/{productDetail-7hIcGeae.mjs → productDetail-FBEOM7jW.mjs} +3 -3
  182. package/dist/client/{productList-T4Cii1ot.mjs → productList-R0OSGhnn.mjs} +3 -3
  183. package/dist/client/{propsDecoder-mB0aC_Fi.mjs → propsDecoder-pYvx_Srl.mjs} +179 -401
  184. package/dist/client/rendering/client.mjs +3496 -2223
  185. package/dist/client/rendering/islands.mjs +17 -17
  186. package/dist/client/rendering.mjs +4400 -2510
  187. package/dist/client/{scrollToBlock-Du5mHgvL.mjs → scrollToBlock-ByQv96M2.mjs} +1 -1
  188. package/dist/client/{shop-B5zAcKZn.mjs → shop-RUG9DmRE.mjs} +6 -6
  189. package/dist/client/{shop-commerce-BKBZB6l5.mjs → shop-commerce-B76Jz23B.mjs} +5 -5
  190. package/dist/client/{shop-commerce-store-Cq4qlNtQ.mjs → shop-commerce-store-QuQNdDsD.mjs} +1 -1
  191. package/dist/client/{shopShared-DYGzEs9D.mjs → shopShared-vXU1omwJ.mjs} +3 -3
  192. package/dist/client/{useEventFilters-Bphkda8m.mjs → useEventFilters-ByuU6HLA.mjs} +33 -18
  193. package/dist/preview-next/before-render.mjs +86 -51
  194. package/dist/preview-next/client/runtime.mjs +4 -4
  195. package/dist/preview-next/keepAlive.mjs +86 -51
  196. package/dist/preview-next/middleware.mjs +86 -51
  197. package/dist/{previewAuthStore-C7ksxt5b.mjs → previewAuthStore-L_cKW8Sb.mjs} +86 -51
  198. package/dist/{sdk-runtime-BbIC8G4J.mjs → sdk-runtime-sUMr5d70.mjs} +2 -2
  199. package/dist/{separator-CadhAtI7.mjs → separator-BIHkie5i.mjs} +1 -1
  200. package/dist/server/components.mjs +4397 -2960
  201. package/dist/server/config-validation.mjs +354 -145
  202. package/dist/server/config.mjs +354 -145
  203. package/dist/server/data.mjs +354 -144
  204. package/dist/server/index.mjs +201 -55
  205. package/dist/server/manifest.mjs +0 -1
  206. package/dist/server/next.mjs +4046 -2611
  207. package/dist/server/page-converter.mjs +225 -122
  208. package/dist/server/prebuild.mjs +1 -1
  209. package/dist/server/rendering/server.mjs +4105 -2636
  210. package/dist/server/rendering.mjs +4522 -3087
  211. package/dist/server/routing.mjs +3289 -1637
  212. package/dist/server/server.mjs +23175 -21079
  213. package/dist/server/theme-bridge.mjs +708 -272
  214. package/dist/server/theme.mjs +29 -25
  215. package/dist/styles/index.css +624 -181
  216. package/package.json +1 -1
  217. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCapacity.d.ts +0 -48
  218. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +0 -17
  219. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +0 -100
  220. /package/dist/_dts/blocks/src/system/runtime/nodes/events/{shared → domain}/destination.d.ts +0 -0
@@ -0,0 +1,465 @@
1
+ import type { HeaderStyleIdValue } from './headerLayoutTypes';
2
+ import type { HeaderStyleRecipe } from './headerStyleRecipe';
3
+ /**
4
+ * A site style's optional take-over of specific header recipes.
5
+ *
6
+ * Structural rather than importing `CuratedSiteStyle`, which would close an
7
+ * import cycle: the curated table already imports the header vocabulary.
8
+ */
9
+ export type HeaderStyleRecipeOverrides = Partial<Record<HeaderStyleIdValue, HeaderStyleRecipe>>;
10
+ export type HeaderStyleRecipeOwner = Readonly<{
11
+ headerStyleRecipes?: HeaderStyleRecipeOverrides;
12
+ }>;
13
+ /**
14
+ * A style either takes the default recipe or authors a complete one. This is
15
+ * deliberately not a deep merge: the same "declare the variant or fall back"
16
+ * rule cards use, so a half-authored recipe cannot exist.
17
+ */
18
+ export declare function resolveHeaderStyleRecipe(siteStyle: HeaderStyleRecipeOwner | null, styleId: HeaderStyleIdValue): HeaderStyleRecipe;
19
+ /**
20
+ * The default header appearance for every catalogue style id (#1318).
21
+ *
22
+ * This is the only id-keyed structure in the header appearance pipeline, and it
23
+ * is data rather than dispatch — the same shape `cards/siteStyleDefaults.ts`
24
+ * uses. A site style that wants a different header takes over an entry here
25
+ * with its own recipe; it does not add a branch anywhere.
26
+ *
27
+ * `navWeight` (the bar) and `navLinkWeight` (the link text) are separate fields
28
+ * and they disagree on five styles. That disagreement is real and pre-existing;
29
+ * it is spelled out here rather than left implicit in a helper default. See the
30
+ * note on `HeaderStyleRecipeCore.navLinkWeight`.
31
+ */
32
+ export declare const defaultHeaderStyleRecipes: {
33
+ readonly minimal: {
34
+ readonly tone: "neutral";
35
+ readonly background: {
36
+ readonly kind: "token";
37
+ readonly token: "surface";
38
+ };
39
+ readonly nav: {
40
+ readonly kind: "minimal";
41
+ readonly hoverColorToken: "primary";
42
+ };
43
+ readonly navWeight: "medium";
44
+ readonly navLinkWeight: "medium";
45
+ readonly navTypography: "plain";
46
+ readonly border: "none";
47
+ readonly shadow: {
48
+ readonly kind: "absent";
49
+ };
50
+ readonly frame: {
51
+ readonly kind: "none";
52
+ };
53
+ readonly cta: {
54
+ readonly treatment: "default";
55
+ };
56
+ };
57
+ readonly 'fine-line': {
58
+ readonly tone: "neutral";
59
+ readonly background: {
60
+ readonly kind: "token";
61
+ readonly token: "surface";
62
+ };
63
+ readonly nav: {
64
+ readonly kind: "underline";
65
+ readonly hover: "underline";
66
+ };
67
+ readonly navWeight: "medium";
68
+ readonly navLinkWeight: "medium";
69
+ readonly navTypography: "plain";
70
+ readonly border: "none";
71
+ readonly shadow: {
72
+ readonly kind: "absent";
73
+ };
74
+ readonly frame: {
75
+ readonly kind: "none";
76
+ };
77
+ readonly cta: {
78
+ readonly treatment: "outline";
79
+ };
80
+ };
81
+ readonly 'soft-bar': {
82
+ readonly tone: "neutral";
83
+ readonly background: {
84
+ readonly kind: "token";
85
+ readonly token: "surfaceAlt";
86
+ };
87
+ readonly nav: {
88
+ readonly kind: "pill";
89
+ readonly backing: "capsule";
90
+ readonly hoverColorToken: "primary";
91
+ readonly hoverAlpha: 8;
92
+ };
93
+ readonly navWeight: "medium";
94
+ readonly navLinkWeight: "medium";
95
+ readonly navTypography: "plain";
96
+ readonly border: "bottom";
97
+ readonly shadow: {
98
+ readonly kind: "absent";
99
+ };
100
+ readonly frame: {
101
+ readonly kind: "none";
102
+ };
103
+ readonly cta: {
104
+ readonly treatment: "default";
105
+ };
106
+ };
107
+ readonly 'pill-nav': {
108
+ readonly tone: "neutral";
109
+ readonly background: {
110
+ readonly kind: "token";
111
+ readonly token: "surface";
112
+ };
113
+ readonly nav: {
114
+ readonly kind: "pill";
115
+ readonly backing: "capsule";
116
+ readonly hoverColorToken: "primary";
117
+ readonly hoverAlpha: 10;
118
+ };
119
+ readonly navWeight: "medium";
120
+ readonly navLinkWeight: "medium";
121
+ readonly navTypography: "plain";
122
+ readonly border: "none";
123
+ readonly shadow: {
124
+ readonly kind: "absent";
125
+ };
126
+ readonly frame: {
127
+ readonly kind: "nav-container";
128
+ readonly type: "pill";
129
+ readonly tint: "surfaceAlt";
130
+ readonly opacity: 0.7;
131
+ };
132
+ readonly cta: {
133
+ readonly treatment: "default";
134
+ };
135
+ };
136
+ readonly 'brand-bar': {
137
+ readonly tone: "brand";
138
+ readonly background: {
139
+ readonly kind: "token";
140
+ readonly token: "primary";
141
+ };
142
+ readonly nav: {
143
+ readonly kind: "minimal";
144
+ readonly hoverColorToken: "secondary";
145
+ };
146
+ readonly navWeight: "semibold";
147
+ readonly navLinkWeight: "medium";
148
+ readonly navTypography: "brand-caps";
149
+ readonly border: "none";
150
+ readonly shadow: {
151
+ readonly kind: "absent";
152
+ };
153
+ readonly frame: {
154
+ readonly kind: "none";
155
+ };
156
+ readonly cta: {
157
+ readonly treatment: "inverted";
158
+ };
159
+ };
160
+ /**
161
+ * Ledger D13 + D14. The catalogue look changes here, deliberately and once:
162
+ * bold links (the recipe used to set a bold bar over medium links), a hover
163
+ * that changes colour *and* underlines, and a compact CTA gap. No production
164
+ * site has `brand-underline` selected, so this changes zero live sites — and
165
+ * it is what lets `south-west-twerk-school` reach its current appearance
166
+ * through shared vocabulary instead of a site-style override.
167
+ */
168
+ readonly 'brand-underline': {
169
+ readonly tone: "brand";
170
+ readonly background: {
171
+ readonly kind: "token";
172
+ readonly token: "primary";
173
+ };
174
+ readonly nav: {
175
+ readonly kind: "underline";
176
+ readonly hover: "both";
177
+ readonly hoverColorToken: "secondary";
178
+ readonly underlineColorToken: "secondary";
179
+ };
180
+ readonly navWeight: "bold";
181
+ readonly navLinkWeight: "bold";
182
+ readonly navTypography: "brand-caps";
183
+ readonly border: "none";
184
+ readonly shadow: {
185
+ readonly kind: "absent";
186
+ };
187
+ readonly frame: {
188
+ readonly kind: "none";
189
+ };
190
+ readonly cta: {
191
+ readonly treatment: "inverted";
192
+ readonly gap: "compact";
193
+ };
194
+ };
195
+ readonly 'brand-pill': {
196
+ readonly tone: "brand";
197
+ readonly background: {
198
+ readonly kind: "token";
199
+ readonly token: "primary";
200
+ };
201
+ readonly nav: {
202
+ readonly kind: "pill";
203
+ readonly backing: "capsule";
204
+ readonly hoverColorToken: "primaryForeground";
205
+ readonly hoverAlpha: 14;
206
+ };
207
+ readonly navWeight: "semibold";
208
+ readonly navLinkWeight: "medium";
209
+ readonly navTypography: "brand-caps";
210
+ readonly border: "none";
211
+ readonly shadow: {
212
+ readonly kind: "absent";
213
+ };
214
+ readonly frame: {
215
+ readonly kind: "none";
216
+ };
217
+ readonly cta: {
218
+ readonly treatment: "inverted";
219
+ };
220
+ readonly onFloating: {
221
+ readonly background: {
222
+ readonly kind: "transparent";
223
+ };
224
+ readonly frame: {
225
+ readonly kind: "container";
226
+ readonly rounded: "2xl";
227
+ readonly padding: "sm";
228
+ readonly tint: "primary";
229
+ readonly opacity: 0.95;
230
+ };
231
+ };
232
+ };
233
+ readonly 'brand-capsule': {
234
+ readonly tone: "brand";
235
+ readonly background: {
236
+ readonly kind: "token";
237
+ readonly token: "primary";
238
+ };
239
+ readonly nav: {
240
+ readonly kind: "pill";
241
+ readonly backing: "capsule";
242
+ readonly hoverColorToken: "primaryForeground";
243
+ readonly hoverAlpha: 16;
244
+ };
245
+ readonly navWeight: "semibold";
246
+ readonly navLinkWeight: "medium";
247
+ readonly navTypography: "quiet-caps";
248
+ readonly border: "none";
249
+ readonly shadow: {
250
+ readonly kind: "fixed";
251
+ readonly elevation: "md";
252
+ };
253
+ readonly frame: {
254
+ readonly kind: "none";
255
+ };
256
+ readonly cta: {
257
+ readonly treatment: "inverted";
258
+ };
259
+ };
260
+ readonly 'serif-line': {
261
+ readonly tone: "neutral";
262
+ readonly background: {
263
+ readonly kind: "token";
264
+ readonly token: "background";
265
+ };
266
+ readonly nav: {
267
+ readonly kind: "underline";
268
+ readonly hover: "underline";
269
+ };
270
+ readonly navWeight: "medium";
271
+ readonly navLinkWeight: "medium";
272
+ readonly navTypography: "heading";
273
+ readonly border: "none";
274
+ readonly shadow: {
275
+ readonly kind: "explicit-none";
276
+ };
277
+ readonly frame: {
278
+ readonly kind: "none";
279
+ };
280
+ readonly cta: {
281
+ readonly treatment: "outline";
282
+ readonly gap: "relaxed";
283
+ };
284
+ readonly logo: {
285
+ readonly fontFamily: "heading";
286
+ readonly letterSpacing: "wide";
287
+ readonly gradient: false;
288
+ };
289
+ };
290
+ readonly 'flat-tabs': {
291
+ readonly tone: "neutral";
292
+ readonly background: {
293
+ readonly kind: "token";
294
+ readonly token: "surface";
295
+ };
296
+ readonly nav: {
297
+ readonly kind: "flat-tab";
298
+ };
299
+ readonly navWeight: "semibold";
300
+ readonly navLinkWeight: "semibold";
301
+ readonly navTypography: "quiet-caps";
302
+ readonly border: "bottom";
303
+ readonly shadow: {
304
+ readonly kind: "themed";
305
+ };
306
+ readonly frame: {
307
+ readonly kind: "none";
308
+ };
309
+ readonly cta: {
310
+ readonly treatment: "primary";
311
+ readonly gap: "compact";
312
+ };
313
+ };
314
+ readonly glass: {
315
+ readonly tone: "neutral";
316
+ readonly background: {
317
+ readonly kind: "transparent";
318
+ };
319
+ readonly nav: {
320
+ readonly kind: "pill";
321
+ readonly backing: "frosted";
322
+ readonly hoverColorToken: "primary";
323
+ readonly hoverAlpha: 8;
324
+ };
325
+ readonly navWeight: "semibold";
326
+ readonly navLinkWeight: "medium";
327
+ readonly navTypography: "plain";
328
+ readonly border: "none";
329
+ readonly shadow: {
330
+ readonly kind: "absent";
331
+ };
332
+ readonly frame: {
333
+ readonly kind: "container";
334
+ readonly rounded: "2xl";
335
+ readonly padding: "sm";
336
+ readonly tint: "surface";
337
+ readonly opacity: 0.4;
338
+ };
339
+ readonly cta: {
340
+ readonly treatment: "default";
341
+ };
342
+ };
343
+ readonly 'minimal-surface': {
344
+ readonly tone: "neutral";
345
+ readonly background: {
346
+ readonly kind: "transparent";
347
+ };
348
+ readonly nav: {
349
+ readonly kind: "minimal";
350
+ readonly hoverColorToken: "primary";
351
+ };
352
+ readonly navWeight: "medium";
353
+ readonly navLinkWeight: "medium";
354
+ readonly navTypography: "plain";
355
+ readonly border: "none";
356
+ readonly shadow: {
357
+ readonly kind: "absent";
358
+ };
359
+ readonly frame: {
360
+ readonly kind: "none";
361
+ };
362
+ readonly cta: {
363
+ readonly treatment: "default";
364
+ };
365
+ readonly navLinkExtras: {
366
+ readonly textSize: "lg";
367
+ readonly contrastTreatment: "soft-glow";
368
+ };
369
+ readonly openingForeground: "all";
370
+ readonly scrollTreatment: "contrast-glass";
371
+ readonly interactionPalette: Readonly<{
372
+ id: "interaction-palette";
373
+ label: string;
374
+ options: readonly [import("../../../blocks/src/index").HeaderInteractionPaletteOption, ...import("../../../blocks/src/index").HeaderInteractionPaletteOption[]];
375
+ defaultOptionId: "accent" | "primary" | "secondary" | "quiet";
376
+ }>;
377
+ };
378
+ readonly 'soft-shell': {
379
+ readonly tone: "neutral";
380
+ readonly background: {
381
+ readonly kind: "transparent";
382
+ };
383
+ readonly nav: {
384
+ readonly kind: "pill";
385
+ readonly backing: "capsule";
386
+ readonly hoverColorToken: "primary";
387
+ readonly hoverAlpha: 8;
388
+ };
389
+ readonly navWeight: "medium";
390
+ readonly navLinkWeight: "medium";
391
+ readonly navTypography: "plain";
392
+ readonly border: "none";
393
+ readonly shadow: {
394
+ readonly kind: "absent";
395
+ };
396
+ readonly frame: {
397
+ readonly kind: "container";
398
+ readonly rounded: "2xl";
399
+ readonly padding: "md";
400
+ readonly tint: "surfaceAlt";
401
+ readonly opacity: 0.95;
402
+ };
403
+ readonly cta: {
404
+ readonly treatment: "default";
405
+ };
406
+ };
407
+ readonly 'split-glass': {
408
+ readonly tone: "neutral";
409
+ readonly background: {
410
+ readonly kind: "transparent";
411
+ };
412
+ readonly nav: {
413
+ readonly kind: "pill";
414
+ readonly backing: "frosted";
415
+ readonly hoverColorToken: "primary";
416
+ readonly hoverAlpha: 8;
417
+ };
418
+ readonly navWeight: "semibold";
419
+ readonly navLinkWeight: "medium";
420
+ readonly navTypography: "quiet-caps";
421
+ readonly border: "none";
422
+ readonly shadow: {
423
+ readonly kind: "absent";
424
+ };
425
+ readonly frame: {
426
+ readonly kind: "nav-container";
427
+ readonly type: "glass";
428
+ readonly tint: "surface";
429
+ readonly opacity: 0.4;
430
+ };
431
+ readonly cta: {
432
+ readonly treatment: "default";
433
+ };
434
+ readonly openingForeground: "brand-only";
435
+ };
436
+ readonly 'split-pill': {
437
+ readonly tone: "neutral";
438
+ readonly background: {
439
+ readonly kind: "transparent";
440
+ };
441
+ readonly nav: {
442
+ readonly kind: "pill";
443
+ readonly backing: "capsule";
444
+ readonly hoverColorToken: "primary";
445
+ readonly hoverAlpha: 10;
446
+ };
447
+ readonly navWeight: "medium";
448
+ readonly navLinkWeight: "medium";
449
+ readonly navTypography: "heading";
450
+ readonly border: "none";
451
+ readonly shadow: {
452
+ readonly kind: "absent";
453
+ };
454
+ readonly frame: {
455
+ readonly kind: "nav-container";
456
+ readonly type: "pill";
457
+ readonly tint: "surface";
458
+ readonly opacity: 0.94;
459
+ };
460
+ readonly cta: {
461
+ readonly treatment: "default";
462
+ };
463
+ readonly openingForeground: "brand-only";
464
+ };
465
+ };
@@ -0,0 +1,168 @@
1
+ import type { NavLinkStyle } from '../navigation/types';
2
+ import type { HeaderCtaGap, LogoStyle, NavFontWeight, Theme, ThemeHeader } from '../schema';
3
+ import type { PaletteTokenName } from '../tokens/themeColorTokens';
4
+ import { type HeaderCtaTreatment } from './headerCtaVariants';
5
+ import type { HeaderInteractionPaletteOptionGroup } from './headerInteractionPalette';
6
+ import { type HeaderLayoutDefinition, type HeaderStyleNavTypography } from './headerLayoutTypes';
7
+ /**
8
+ * The closed vocabulary a header appearance is authored in (#1318).
9
+ *
10
+ * Everything here is data: no closures, no `Theme` argument, no header style id.
11
+ * `compileHeaderRecipe` is the single interpreter, and every switch in it is
12
+ * over a facet kind ending in `assertNever` — never over a style id. That is
13
+ * what lets a site style own header appearance the way it already owns cards:
14
+ * it hands over a different recipe, not a different branch.
15
+ *
16
+ * Tokens are typed as `PaletteTokenName` rather than `ThemeColorToken`. The
17
+ * latter is a branded `string` that a literal cannot satisfy without a cast, so
18
+ * it would push every recipe through a parse; the palette role names are the
19
+ * closed 13-role vocabulary these recipes actually draw from.
20
+ */
21
+ type HeaderShadowElevation = NonNullable<ThemeHeader['shadow']>['elevation'];
22
+ type HeaderContainerFrame = NonNullable<ThemeHeader['container']>;
23
+ type HeaderNavContainerFrame = NonNullable<ThemeHeader['navContainer']>;
24
+ type HeaderNavLinkTextSize = NavLinkStyle['textSize'];
25
+ type HeaderNavLinkContrastTreatment = NavLinkStyle['contrastTreatment'];
26
+ /** Drives textColor, navColor, dropdownStyle and the nav link's own colour. Nothing else. */
27
+ export type HeaderToneRecipe = 'neutral' | 'brand';
28
+ /** Drives background only. Deliberately a separate axis from tone: floating
29
+ * `brand-pill` is brand content tone on a transparent background, which a
30
+ * single coupled union cannot express in either direction. */
31
+ export type HeaderBackgroundRecipe = Readonly<{
32
+ kind: 'token';
33
+ token: 'surface' | 'surfaceAlt' | 'background' | 'primary';
34
+ }> | Readonly<{
35
+ kind: 'transparent';
36
+ }>;
37
+ /**
38
+ * Nav treatment, split by hover affordance so no invalid state is representable.
39
+ *
40
+ * - `minimal` — colour change on hover, plus a top-level `hoverColorToken`.
41
+ * - `underline` with `hover: 'underline'` — one `nav-underline` effect and *no*
42
+ * top-level `hoverColorToken`.
43
+ * - `underline` with `hover: 'colour' | 'both'` — requires the token, because a
44
+ * colour change without one is a state the interpreter could only answer with
45
+ * a throw or a silent fallback.
46
+ * - `pill` — background-alpha hover, with the active state at `hoverAlpha + 5`.
47
+ * `backing` is explicit because it is not derivable: `glass` and `split-glass`
48
+ * use the same pill nav link over `navStyle: 'frosted'`, everything else over
49
+ * `'capsule'`.
50
+ * - `flat-tab` — the Swiss block treatment; its tokens are fixed by the helper.
51
+ */
52
+ export type HeaderNavRecipe = Readonly<{
53
+ kind: 'minimal';
54
+ hoverColorToken: PaletteTokenName;
55
+ }> | Readonly<{
56
+ kind: 'underline';
57
+ hover: 'underline';
58
+ underlineColorToken?: PaletteTokenName;
59
+ }> | Readonly<{
60
+ kind: 'underline';
61
+ hover: 'colour' | 'both';
62
+ hoverColorToken: PaletteTokenName;
63
+ underlineColorToken?: PaletteTokenName;
64
+ }> | Readonly<{
65
+ kind: 'pill';
66
+ backing: 'capsule' | 'frosted';
67
+ hoverColorToken: PaletteTokenName;
68
+ hoverAlpha: 8 | 10 | 14 | 16;
69
+ }> | Readonly<{
70
+ kind: 'flat-tab';
71
+ }>;
72
+ /**
73
+ * `absent` and `explicit-none` are distinct because they are distinct bytes:
74
+ * `serif-line` persists `{elevation: 'none'}` as a present key, every other
75
+ * neutral style omits `shadow` entirely, and `themed` resolves against the
76
+ * theme's own elevation and can itself come back absent.
77
+ */
78
+ export type HeaderShadowRecipe = Readonly<{
79
+ kind: 'absent';
80
+ }> | Readonly<{
81
+ kind: 'explicit-none';
82
+ }> | Readonly<{
83
+ kind: 'fixed';
84
+ elevation: HeaderShadowElevation;
85
+ }> | Readonly<{
86
+ kind: 'themed';
87
+ }>;
88
+ export type HeaderFrameRecipe = Readonly<{
89
+ kind: 'none';
90
+ }> | (Readonly<{
91
+ kind: 'container';
92
+ }> & Pick<HeaderContainerFrame, 'rounded' | 'padding' | 'tint' | 'opacity'>) | (Readonly<{
93
+ kind: 'nav-container';
94
+ }> & Readonly<{
95
+ type: Exclude<HeaderNavContainerFrame['type'], 'none'>;
96
+ }> & Pick<HeaderNavContainerFrame, 'tint' | 'opacity'>);
97
+ export type HeaderStyleRecipeCore = Readonly<{
98
+ tone: HeaderToneRecipe;
99
+ background: HeaderBackgroundRecipe;
100
+ nav: HeaderNavRecipe;
101
+ /** `header.navWeight` — the weight of the nav bar as a whole. */
102
+ navWeight: NavFontWeight;
103
+ /**
104
+ * `navLinkStyle.fontWeight` — the weight of the link text itself.
105
+ *
106
+ * The plan for #1318 proposed one field driving both, on the grounds that
107
+ * `brand-underline` sets `navWeight: 'bold'` over a link left at `'medium'`.
108
+ * That is true, but it is not unique: `brand-bar`, `brand-pill`,
109
+ * `brand-capsule`, `glass` and `split-glass` all pair a `'semibold'` bar with
110
+ * `'medium'` links today, so collapsing the two would change bytes for five
111
+ * styles that no ledger row covers. Two required fields keep every recipe
112
+ * byte-identical *and* put the disagreement in the table where a reviewer can
113
+ * see it, rather than splitting it across two files.
114
+ */
115
+ navLinkWeight: NavFontWeight;
116
+ navTypography: HeaderStyleNavTypography;
117
+ border: 'none' | 'bottom';
118
+ shadow: HeaderShadowRecipe;
119
+ frame: HeaderFrameRecipe;
120
+ cta: Readonly<{
121
+ treatment: HeaderCtaTreatment;
122
+ gap?: HeaderCtaGap;
123
+ }>;
124
+ logo?: LogoStyle;
125
+ /**
126
+ * Which parts of the header adopt the opening section's foreground, for
127
+ * styles that float over it. `'brand-only'` recolours the wordmark;
128
+ * `'all'` recolours nav and border too and enables `scrollTreatment`.
129
+ * Absent means the header does not read its opening section at all, which is
130
+ * also what makes the style available without a known opening foreground.
131
+ */
132
+ openingForeground?: 'brand-only' | 'all';
133
+ /** Contrast treatment once the page scrolls under a floating header. */
134
+ scrollTreatment?: 'contrast-glass';
135
+ /**
136
+ * The hover-colour choice this style offers the user. Data, not a closure —
137
+ * a `LookOptionGroup` of ids and labels.
138
+ */
139
+ interactionPalette?: HeaderInteractionPaletteOptionGroup;
140
+ navLinkExtras?: Readonly<{
141
+ textSize?: HeaderNavLinkTextSize;
142
+ contrastTreatment?: HeaderNavLinkContrastTreatment;
143
+ }>;
144
+ }>;
145
+ export type HeaderStyleRecipe = HeaderStyleRecipeCore & Readonly<{
146
+ /**
147
+ * The one layout-conditional adjustment in the catalogue: floating
148
+ * `brand-pill` swaps to a transparent background inside a tinted container.
149
+ * Narrowed to the two facets it actually adjusts, so a layout cannot reach
150
+ * tone or nav and no "used at most once" test is needed to police it.
151
+ * Keyed on the floating layout because layout id and `header.variant` are
152
+ * 1:1 (asserted in `headerCompilationParity.test.ts`).
153
+ */
154
+ onFloating?: Pick<HeaderStyleRecipeCore, 'background' | 'frame'>;
155
+ }>;
156
+ /**
157
+ * The single header interpreter. Pure and total: same `(theme, layout, recipe)`
158
+ * in, same object out, no throws of its own.
159
+ *
160
+ * It **constructs** a `ThemeHeader` rather than starting from one (#1318 Phase
161
+ * 4e). `theme` is read for the palette-dependent facets only — the themed
162
+ * shadow and the CTA variant — never for `theme.header`, so no value can
163
+ * survive a recompile by accident. Every required field of `headerSchema` is
164
+ * produced by a named branch here or in `headerForLayout`; the type is the
165
+ * check.
166
+ */
167
+ export declare function compileHeaderRecipe(theme: Theme, layout: HeaderLayoutDefinition, recipe: HeaderStyleRecipe): ThemeHeader;
168
+ export {};
@@ -16,6 +16,11 @@ export * from './generatedSchemas';
16
16
  export * from './generatedDesignPipeline';
17
17
  export * from './headerLayoutStyles';
18
18
  export * from './headerInteractionPalette';
19
+ export * from './headerBrandPresentation';
20
+ export { applyHeaderPreferences, defaultHeaderPreferences, defaultHeaderStructurePreferences, type HeaderLogoTextIntent, type HeaderPreferences, type HeaderQuickControlPreferences, type HeaderStructurePreferences, } from './headerPreferences';
21
+ export { headerPreferencesSchema, headerPreferencesWireSchema, parsePersistedHeaderPreferences, type PersistedHeaderPreferences, } from './headerPreferencesPersistence';
22
+ export { compareCompiledHeaders, type CompiledHeaderComparison, type HeaderFieldDiff, } from './headerBytesComparison';
23
+ export { compileHeaderForCuratedSelection, recompileSiteChromeHeader, recompileSiteChromeHeaderFromPersistedIntent, type CuratedHeaderSelectionRepair, type CompiledCuratedHeader, type HeaderInteractionPaletteRequest, type RecompileSiteChromeHeaderInput, type RecompiledSiteChromeHeader, } from './headerRecompile';
19
24
  export * from './headerOpeningForeground';
20
25
  export * from './headerOpeningSection';
21
26
  export * from './lookResolution';
@@ -4,7 +4,7 @@ import { type ButtonStyleSelection } from '../buttons/styles';
4
4
  import { type CuratedSiteStyle } from './curatedSiteStyles';
5
5
  import { type FooterLookId } from './footerLooks';
6
6
  import type { SiteThemeCompilationPlan } from './compilationPlan';
7
- import { type HeaderLayoutStyleSelection } from './headerLayoutStyles';
7
+ import type { HeaderLayoutStyleSelection } from './headerLayoutStyles';
8
8
  import { type CompiledBlockRuntimeFields, type CompiledBoundaryRuntime, type CompiledPageRuntime, type ComponentRuntimeRules, type DesignRuntimeRules, type SemanticSpacing, type SurfaceResolutionContext } from './runtimeCompiler';
9
9
  import { type AppearancePresetId, type DesignBlockId, type SiteStyleId } from './types';
10
10
  import { type CuratedSiteStyleTheme } from './siteStyleThemeCompiler';
@@ -1,4 +1,4 @@
1
- import type { Theme } from '../schema';
1
+ import type { Theme, ThemeFooter, ThemeHeader } from '../schema';
2
2
  import type { ThemeColorToken } from '../tokens';
3
3
  export type SiteChromeSurface = 'header' | 'footer';
4
4
  export type SiteChromeBackgroundColorToken = ThemeColorToken & {
@@ -28,3 +28,22 @@ export declare function siteChromeBackgroundOverrideLabel(override: SiteChromeBa
28
28
  export declare function formatSiteChromeBackgroundTokenLabel(token: SiteChromeBackgroundColorToken): string;
29
29
  export declare function siteChromeBackgroundOverrideEquals(left: SiteChromeBackgroundOverride, right: SiteChromeBackgroundOverride): boolean;
30
30
  export declare function cycleSiteChromeBackgroundOverride(current: SiteChromeBackgroundOverride, direction: SiteChromeBackgroundCycleDirection): SiteChromeBackgroundOverride;
31
+ /**
32
+ * Reads the header background override back out of persisted bytes. Exported
33
+ * for `readHeaderPreferences`, which needs the header half on its own.
34
+ */
35
+ export declare function siteChromeBackgroundOverrideFromHeader(header: ThemeHeader): SiteChromeBackgroundOverride;
36
+ /**
37
+ * Header-only background applier. Exported so the header preference pipeline
38
+ * can apply the header override without going through
39
+ * `applySiteChromeBackgroundPreferences`, which also writes the footer and
40
+ * would clobber footer intent (#1318 Correction 20).
41
+ */
42
+ export declare function applyHeaderBackgroundOverride(theme: Theme, header: ThemeHeader, override: SiteChromeBackgroundOverride): ThemeHeader;
43
+ /**
44
+ * Footer-only background applier, the counterpart of
45
+ * `applyHeaderBackgroundOverride`. Exported so a caller that owns one surface
46
+ * can write that surface rather than passing a no-op override for the other
47
+ * (#1318 Correction 20).
48
+ */
49
+ export declare function applyFooterBackgroundOverride(theme: Theme, footer: ThemeFooter, override: SiteChromeBackgroundOverride): ThemeFooter;