@riverbankcms/sdk 0.129.1 → 0.130.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 (229) hide show
  1. package/README.md +32 -10
  2. package/dist/{PreviewEditorSidebar-DceRseRV.mjs → PreviewEditorSidebar-DiEpbOdw.mjs} +313 -239
  3. package/dist/{PreviewEditorUI-BNunq3kk.mjs → PreviewEditorUI-C6MvxnIa.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-B1kbhaJD.mjs → PreviewQueryProvider-C2rnoPz6.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-Bt87-62u.mjs → SdkPreviewModeRuntime-DRXA_m5L.mjs} +208 -211
  6. package/dist/{SiteChromeCustomizeContext-BLl-OlL4.mjs → SiteChromeCustomizeContext-BTHdv5_-.mjs} +6204 -6239
  7. package/dist/_dts/ai/src/contracts/proposalPrimitives.d.ts +52 -0
  8. package/dist/_dts/ai/src/contracts/proposals.d.ts +4950 -29100
  9. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +32572 -0
  10. package/dist/_dts/api/src/appointmentSetup.d.ts +21 -9
  11. package/dist/_dts/api/src/bookingConfig.d.ts +4 -46
  12. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +13 -11
  13. package/dist/_dts/api/src/bookingRecords.d.ts +1 -0
  14. package/dist/_dts/api/src/contentRuntime.d.ts +3 -5
  15. package/dist/_dts/api/src/endpoints.d.ts +14 -21
  16. package/dist/_dts/api/src/eventManagementContracts.d.ts +76 -0
  17. package/dist/_dts/api/src/index.d.ts +3 -2
  18. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +22 -47
  19. package/dist/_dts/api/src/sdk-event-schedule.d.ts +5 -0
  20. package/dist/_dts/api/src/sdk-event-upsert.d.ts +112 -20
  21. package/dist/_dts/api/src/sdkContracts.d.ts +38 -66
  22. package/dist/_dts/api/src/sdkManagedEventContracts.d.ts +35 -0
  23. package/dist/_dts/api/src/sdkThemeWire.d.ts +2423 -501
  24. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +5 -0
  25. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +23 -37
  26. package/dist/_dts/blocks/src/contracts/index.d.ts +2 -0
  27. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +6 -8
  28. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +36 -14
  29. package/dist/_dts/blocks/src/index.d.ts +5 -3
  30. package/dist/_dts/blocks/src/lib/media.d.ts +9 -539
  31. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +3 -2
  32. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +135 -90
  33. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +2 -2
  34. package/dist/_dts/blocks/src/system/blocks/shop.shared.d.ts +37 -4
  35. package/dist/_dts/blocks/src/system/blocks/site-footer-nav-groups-layout.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +3 -0
  37. package/dist/_dts/blocks/src/system/componentFactory.d.ts +5 -5
  38. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +8 -6
  39. package/dist/_dts/blocks/src/system/customize/serializeBackgroundOverride.d.ts +3 -0
  40. package/dist/_dts/blocks/src/system/fields/background.d.ts +2 -20
  41. package/dist/_dts/blocks/src/system/fields/backgroundContent.d.ts +17 -0
  42. package/dist/_dts/blocks/src/system/fields/backgroundContentAudit.d.ts +20 -0
  43. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +5 -33
  44. package/dist/_dts/blocks/src/system/fragments/builder.d.ts +1 -0
  45. package/dist/_dts/blocks/src/system/fragments/types.d.ts +1 -0
  46. package/dist/_dts/blocks/src/system/helpers/index.d.ts +1 -1
  47. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +10 -45
  48. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +7 -4
  49. package/dist/_dts/blocks/src/system/manifest/fieldValidation/writeCanonicalization.d.ts +4 -0
  50. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +123 -55
  51. package/dist/_dts/blocks/src/system/registry.d.ts +2 -0
  52. package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +2 -37
  53. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +61 -24
  54. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +30 -12
  55. package/dist/_dts/blocks/src/system/runtime/header/enhanceHeaderSection.d.ts +3 -5
  56. package/dist/_dts/blocks/src/system/runtime/header/headerScrollRuntime.d.ts +2 -0
  57. package/dist/_dts/blocks/src/system/runtime/header/runtimeContract.d.ts +22 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/commerce/shared/display.d.ts +9 -2
  59. package/dist/_dts/blocks/src/system/runtime/nodes/commerce/shared/view.d.ts +3 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.frame.d.ts +21 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +2 -0
  63. package/dist/_dts/blocks/src/system/runtime/nodes/shop.interactive.d.ts +41 -12
  64. package/dist/_dts/blocks/src/system/runtime/nodes/shop.pass-contract.d.ts +3 -0
  65. package/dist/_dts/blocks/src/system/runtime/nodes/shop.state.d.ts +3 -3
  66. package/dist/_dts/blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.d.ts +3 -1
  67. package/dist/_dts/blocks/src/system/transforms/registry/background.d.ts +1 -1
  68. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +3 -1
  69. package/dist/_dts/blocks/src/system/transforms/registry/core.d.ts +4 -1
  70. package/dist/_dts/blocks/src/system/transforms/registry/headerRuntime.d.ts +3 -0
  71. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +2 -1
  72. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +0 -3
  73. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +41 -43
  74. package/dist/_dts/content-editor/src/FooterComposerOverview.d.ts +4 -2
  75. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +2 -17
  76. package/dist/_dts/content-editor/src/FooterNavigationLayoutControl.d.ts +5 -0
  77. package/dist/_dts/content-editor/src/footerComposer.d.ts +2 -1
  78. package/dist/_dts/content-editor/src/footerComposerPanelTypes.d.ts +21 -0
  79. package/dist/_dts/content-editor/src/footerPreviewRuntime.d.ts +2 -1
  80. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +11 -1
  81. package/dist/_dts/content-editor/src/useFooterNavigationLayout.d.ts +26 -0
  82. package/dist/_dts/content-model/src/templates/defaults.d.ts +7 -0
  83. package/dist/_dts/core/src/booking-date-time.d.ts +2 -2
  84. package/dist/_dts/core/src/booking-time-zone.d.ts +6 -0
  85. package/dist/_dts/core/src/footer-composition-types.d.ts +4 -4
  86. package/dist/_dts/core/src/footer-navigation-layout.d.ts +4 -0
  87. package/dist/_dts/core/src/index.d.ts +1 -0
  88. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +38 -18
  89. package/dist/_dts/preview-next/src/client/preview/FooterSidebarDisclosure.d.ts +8 -0
  90. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +5 -5
  91. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +15 -17
  92. package/dist/_dts/preview-next/src/client/preview/PreviewFooterEditorPanel.d.ts +20 -0
  93. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +3 -5
  94. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +3 -5
  95. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -4
  96. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +3 -5
  97. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +6 -7
  98. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +7 -7
  99. package/dist/_dts/preview-next/src/client/preview/siteChromeCustomizeTypes.d.ts +4 -4
  100. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +2 -2
  101. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +12 -11
  102. package/dist/_dts/preview-next/src/client/preview/siteChromeSelectionRows.d.ts +53 -0
  103. package/dist/_dts/preview-next/src/client/preview/siteStyleAccess.d.ts +1 -6
  104. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +6 -15
  105. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +4 -6
  106. package/dist/_dts/sdk/src/config/types.d.ts +1 -0
  107. package/dist/_dts/sdk/src/config/validation.d.ts +2 -0
  108. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +4 -41
  109. package/dist/_dts/sdk/src/next/catch-all-theme-admission.d.ts +23 -0
  110. package/dist/_dts/sdk/src/next/index.d.ts +8 -6
  111. package/dist/_dts/sdk/src/next/resolveTheme.d.ts +1 -2
  112. package/dist/_dts/sdk/src/next/types.d.ts +10 -0
  113. package/dist/_dts/sdk/src/public-api/contracts.d.ts +2 -16
  114. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +3 -2
  115. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +5 -3
  116. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +1 -1
  117. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +4 -2
  118. package/dist/_dts/sdk/src/rendering/index.d.ts +2 -0
  119. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +6 -1
  120. package/dist/_dts/sdk/src/rendering/server.d.ts +2 -0
  121. package/dist/_dts/sdk/src/rendering/themeAdmission.d.ts +11 -0
  122. package/dist/_dts/sdk/src/version.d.ts +1 -1
  123. package/dist/_dts/theme-core/src/blockOverrides.d.ts +1 -1
  124. package/dist/_dts/theme-core/src/boxBackgroundSchema.d.ts +184 -0
  125. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +96 -0
  126. package/dist/_dts/theme-core/src/buttons/buttonSurfaceContext.d.ts +78 -0
  127. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  128. package/dist/_dts/theme-core/src/buttons/parseThemeForPersistence.d.ts +2 -2
  129. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +9 -57
  130. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +6 -3
  131. package/dist/_dts/theme-core/src/buttons/styles/domain.d.ts +8 -7
  132. package/dist/_dts/theme-core/src/buttons/styles/recipes/quietArrow.d.ts +1 -0
  133. package/dist/_dts/theme-core/src/buttons/styles/recipes/staticRecipes.d.ts +11 -0
  134. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +12 -0
  135. package/dist/_dts/theme-core/src/buttons/styles/selection.d.ts +5 -0
  136. package/dist/_dts/theme-core/src/buttons/types.d.ts +51 -4
  137. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  138. package/dist/_dts/theme-core/src/lib/media.d.ts +583 -10
  139. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +5117 -1433
  140. package/dist/_dts/theme-core/src/schema.d.ts +5079 -2005
  141. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +6 -14
  142. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +29 -102
  143. package/dist/_dts/theme-core/src/site-styles/customizableSurfaces.d.ts +3 -76
  144. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +4 -4
  145. package/dist/_dts/theme-core/src/site-styles/generatedDesignPipeline.d.ts +3 -7
  146. package/dist/_dts/theme-core/src/site-styles/generatedDesignPipelineHelpers.d.ts +17 -0
  147. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +2 -2
  148. package/dist/_dts/theme-core/src/site-styles/headerLayoutCatalog.d.ts +281 -0
  149. package/dist/_dts/theme-core/src/site-styles/headerLayoutResolution.d.ts +13 -0
  150. package/dist/_dts/theme-core/src/site-styles/headerLayoutStyles.d.ts +6 -0
  151. package/dist/_dts/theme-core/src/site-styles/{headerLookTypes.d.ts → headerLayoutTypes.d.ts} +16 -86
  152. package/dist/_dts/theme-core/src/site-styles/headerNavStyles.d.ts +6 -0
  153. package/dist/_dts/theme-core/src/site-styles/headerOpeningForeground.d.ts +7 -4
  154. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +2 -2
  155. package/dist/_dts/theme-core/src/site-styles/headerStyleCompiler.d.ts +2 -2
  156. package/dist/_dts/theme-core/src/site-styles/imageSurfaceBackground.d.ts +14 -0
  157. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -1
  158. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +14 -41
  159. package/dist/_dts/theme-core/src/site-styles/runtimeBackgroundResolution.d.ts +23 -0
  160. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +8 -6
  161. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +1 -1
  162. package/dist/client/{CourseRegistrationWizard-xRmA7REV.mjs → CourseRegistrationWizard-Bvtz9G9g.mjs} +5 -5
  163. package/dist/client/{DiscountCodeDisclosure-B9vriL5C.mjs → DiscountCodeDisclosure-Ur-Xx1U_.mjs} +1 -1
  164. package/dist/client/{EventCombined.client-BgVnVTlz.mjs → EventCombined.client-EhscD4U6.mjs} +2 -2
  165. package/dist/client/{EventListing.client-CqdsO7jO.mjs → EventListing.client-Bn26cFTY.mjs} +2 -2
  166. package/dist/client/{LeafletStaticMap-CKPxot9M.mjs → LeafletStaticMap-BUw9Ntzr.mjs} +1 -1
  167. package/dist/client/{StepIndicator-DGCYuBJ1.mjs → StepIndicator-BfbdiVQI.mjs} +2 -2
  168. package/dist/client/{accordion-BfN5Eqd-.mjs → accordion-CjIeof73.mjs} +1 -1
  169. package/dist/client/{bookingForm-DOvCpBFP.mjs → bookingForm-DwEeovf_.mjs} +5 -5
  170. package/dist/client/bookings.mjs +1028 -1038
  171. package/dist/client/{carousel-DPNmiH0f.mjs → carousel-BMrfgOba.mjs} +1 -1
  172. package/dist/client/{cart--egVXlrR.mjs → cart-rXEdxTdb.mjs} +3 -3
  173. package/dist/client/{checkout-DywWtMcq.mjs → checkout-D3JlSzh3.mjs} +3 -3
  174. package/dist/client/client.mjs +18345 -18311
  175. package/dist/client/{courseRegistration-Dk9qFVwt.mjs → courseRegistration-DO5XvMAA.mjs} +2 -2
  176. package/dist/client/{eventCalendar-Bkz2HjlS.mjs → eventCalendar-DO6rTqCn.mjs} +4 -4
  177. package/dist/client/{eventCombined-D4kipYWg.mjs → eventCombined-bJ3i_ovU.mjs} +2 -2
  178. package/dist/client/{eventDetails-Dz_5ix2Q.mjs → eventDetails-CCbrXE7o.mjs} +3 -3
  179. package/dist/client/{eventListing-D0vm-zST.mjs → eventListing-Bdlt9YTm.mjs} +2 -2
  180. package/dist/client/{eventRegistration-Cw1E4Q4p.mjs → eventRegistration-B02lt6iY.mjs} +6 -6
  181. package/dist/client/{form-C2Zf1n3K.mjs → form-DrUBAAox.mjs} +1 -1
  182. package/dist/client/{headerSection-CP05gzdc.mjs → headerSection-MzqvHL6T.mjs} +151 -104
  183. package/dist/client/hooks.mjs +4532 -4216
  184. package/dist/client/{locationMap-Cl3x9PYJ.mjs → locationMap-DG8BxTBm.mjs} +2 -2
  185. package/dist/client/{newsletterForm-DyEJoClm.mjs → newsletterForm-BzO-Td3p.mjs} +1 -1
  186. package/dist/client/{pricing-DGuNR1W4.mjs → pricing-NgK7ozkg.mjs} +1 -1
  187. package/dist/client/{productDetail-Cq-HrGew.mjs → productDetail-CfQ7rhVK.mjs} +3 -3
  188. package/dist/client/{productList-DbB3jwqd.mjs → productList-C23rOLUi.mjs} +3 -3
  189. package/dist/client/{propsDecoder-CiTuhUwY.mjs → propsDecoder-CAZdhwjs.mjs} +2166 -2157
  190. package/dist/client/rendering/client.mjs +3600 -4118
  191. package/dist/client/rendering/islands.mjs +18 -18
  192. package/dist/client/rendering.mjs +15950 -15890
  193. package/dist/client/{scrollToBlock-CShkRqab.mjs → scrollToBlock-DSSqVQr1.mjs} +1 -1
  194. package/dist/client/{shop-Cu4Ib-ZA.mjs → shop-BMToKLK7.mjs} +34 -23
  195. package/dist/client/{shop-commerce-BzpsOdh7.mjs → shop-commerce-DB4JRKmp.mjs} +4 -4
  196. package/dist/client/{shop-commerce-store-DaE7Fhj8.mjs → shop-commerce-store-BOqSIOuc.mjs} +1 -1
  197. package/dist/client/{shopShared-cF0c20vB.mjs → shopShared-B6SK9DZv.mjs} +9 -3
  198. package/dist/client/{useEventFilters-QZ3HMgaJ.mjs → useEventFilters-CULOa4nB.mjs} +2 -2
  199. package/dist/client/{usePolling-BKf0GcE-.mjs → usePolling-BGG_8-jl.mjs} +2 -2
  200. package/dist/preview-next/before-render.mjs +16 -27
  201. package/dist/preview-next/client/runtime.mjs +4 -4
  202. package/dist/preview-next/middleware.mjs +16 -27
  203. package/dist/{previewAuthStore-BesgU5Xu.mjs → previewAuthStore-_GXFRg2W.mjs} +16 -27
  204. package/dist/{sdk-runtime-C20CVWbb.mjs → sdk-runtime-hhSOMShR.mjs} +2 -2
  205. package/dist/{separator-BE3NCquy.mjs → separator-flRaFc14.mjs} +1 -1
  206. package/dist/server/components.mjs +17770 -17866
  207. package/dist/server/config-validation.mjs +4711 -4421
  208. package/dist/server/config.mjs +4715 -4425
  209. package/dist/server/data.mjs +4515 -4216
  210. package/dist/server/date-time.mjs +22 -13
  211. package/dist/server/index.mjs +17 -28
  212. package/dist/server/next.mjs +17586 -17650
  213. package/dist/server/page-converter.mjs +3759 -4390
  214. package/dist/server/prebuild.mjs +1 -1
  215. package/dist/server/rendering/server.mjs +18952 -19064
  216. package/dist/server/rendering.mjs +17824 -17901
  217. package/dist/server/routing.mjs +4748 -4365
  218. package/dist/server/server.mjs +4591 -4269
  219. package/dist/server/theme-bridge.mjs +1393 -1886
  220. package/dist/server/theme.mjs +736 -605
  221. package/dist/styles/index.css +22 -3
  222. package/package.json +1 -1
  223. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +0 -66
  224. package/dist/_dts/theme-core/src/site-styles/headerLayoutStyleCatalog.d.ts +0 -254
  225. package/dist/_dts/theme-core/src/site-styles/headerLegacyLooks.d.ts +0 -372
  226. package/dist/_dts/theme-core/src/site-styles/headerLookBranding.d.ts +0 -106
  227. package/dist/_dts/theme-core/src/site-styles/headerLookSelection.d.ts +0 -2
  228. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +0 -7
  229. package/dist/_dts/theme-core/src/site-styles/headerStyleCompilerPrimitives.d.ts +0 -23
@@ -0,0 +1,96 @@
1
+ import type { ButtonUnsupportedEffectReason } from './effectClassification';
2
+ import type { ButtonColourTreatment, OpaqueButtonColourToken } from './types';
3
+ export declare const BUTTON_VISUAL_STATES: readonly ["base", "hover", "focus", "active", "disabled"];
4
+ export type ButtonVisualState = (typeof BUTTON_VISUAL_STATES)[number];
5
+ /** A surface whose rendered colour and foreground contract are both known. */
6
+ export type KnownButtonSurface = Readonly<{
7
+ kind: 'solid';
8
+ backgroundHex: string;
9
+ backgroundCss: string;
10
+ foregroundHex: string;
11
+ foregroundCss: string;
12
+ }>;
13
+ export type ButtonColourPalette = Readonly<Record<string, string>>;
14
+ export declare const BUTTON_CONTRAST_POLICY: {
15
+ readonly textMinimumRatio: 4.5;
16
+ readonly nonTextMinimumRatio: 3;
17
+ readonly gradientSamplesPerSegment: 20;
18
+ readonly alphaBackgrounds: "reject-without-known-surface";
19
+ readonly disabled: "retain-full-colour-contract";
20
+ };
21
+ export type ButtonColourContractError = Readonly<{
22
+ tag: 'unknown_palette_token';
23
+ variantId: string;
24
+ state: ButtonVisualState;
25
+ token: OpaqueButtonColourToken;
26
+ }> | Readonly<{
27
+ tag: 'missing_on_colour';
28
+ variantId: string;
29
+ state: ButtonVisualState;
30
+ backgroundToken: OpaqueButtonColourToken;
31
+ foregroundToken: OpaqueButtonColourToken;
32
+ }> | Readonly<{
33
+ tag: 'insufficient_contrast';
34
+ variantId: string;
35
+ state: ButtonVisualState;
36
+ background: string;
37
+ foreground: string;
38
+ ratio: number;
39
+ requiredRatio: number;
40
+ }> | Readonly<{
41
+ tag: 'insufficient_surface_contrast';
42
+ variantId: string;
43
+ state: ButtonVisualState;
44
+ buttonPaint: string;
45
+ surface: string;
46
+ ratio: number;
47
+ requiredRatio: number;
48
+ }> | Readonly<{
49
+ tag: 'unsupported_colour_effect';
50
+ variantId: string;
51
+ state: ButtonVisualState;
52
+ effectId: string;
53
+ reason: ButtonUnsupportedEffectReason;
54
+ }> | Readonly<{
55
+ tag: 'invalid_colour_effect_options';
56
+ variantId: string;
57
+ state: ButtonVisualState;
58
+ effectId: string;
59
+ option: string;
60
+ }> | Readonly<{
61
+ tag: 'inapplicable_colour_effect';
62
+ variantId: string;
63
+ state: ButtonVisualState;
64
+ effectId: string;
65
+ treatment: ButtonColourTreatment['type'];
66
+ }> | Readonly<{
67
+ tag: 'unknown_button_effect';
68
+ variantId: string;
69
+ state: ButtonVisualState;
70
+ effectId: string;
71
+ }>;
72
+ export declare function formatButtonColourContractError(error: ButtonColourContractError): string;
73
+ export declare function validateButtonSurfaceContrast(input: Readonly<{
74
+ variantId: string;
75
+ state: ButtonVisualState;
76
+ buttonPaint: string;
77
+ surfaceHex: string;
78
+ }>): Readonly<{
79
+ ok: true;
80
+ }> | Readonly<{
81
+ ok: false;
82
+ error: ButtonColourContractError;
83
+ }>;
84
+ export declare function validateButtonTextContrast(input: Readonly<{
85
+ variantId: string;
86
+ state: ButtonVisualState;
87
+ background: string;
88
+ backgroundHex: string;
89
+ foreground: string;
90
+ foregroundHex: string;
91
+ }>): Readonly<{
92
+ ok: true;
93
+ }> | Readonly<{
94
+ ok: false;
95
+ error: ButtonColourContractError;
96
+ }>;
@@ -0,0 +1,78 @@
1
+ import { type ButtonColourContractError, type ButtonColourPalette, type ButtonVisualState, type KnownButtonSurface, type ResolvedButtonColourStates, type ResolvedButtonFocusIndicator } from './resolveButtonColourStates';
2
+ import type { ButtonSystem, VariantRole } from './types';
3
+ export type ButtonSurfaceContext = Readonly<{
4
+ kind: 'known-solid';
5
+ source: 'palette-token' | 'literal-css' | 'fallback-token';
6
+ surface: KnownButtonSurface;
7
+ }> | Readonly<{
8
+ kind: 'unknown';
9
+ reason: 'missing-background' | 'image-background' | 'gradient-background' | 'composited-background' | 'unresolvable-colour';
10
+ }>;
11
+ /**
12
+ * Narrow rendering-boundary contract for the surface beneath a button.
13
+ * Blocks own their authored background schema and translate it into this
14
+ * vocabulary; theme-core does not inspect or guess at that external shape.
15
+ */
16
+ export type ButtonSurfaceInput = Readonly<{
17
+ kind: 'inherit';
18
+ foreground?: string | null;
19
+ }> | Readonly<{
20
+ kind: 'solid';
21
+ color?: string | null;
22
+ foreground?: string | null;
23
+ composited: boolean;
24
+ }> | Readonly<{
25
+ kind: 'image';
26
+ }> | Readonly<{
27
+ kind: 'gradient';
28
+ }> | Readonly<{
29
+ kind: 'unknown';
30
+ }>;
31
+ export type RejectedButtonSurfaceCandidate = Readonly<{
32
+ candidate: 'preferred' | 'surface-outline' | VariantRole;
33
+ error: ButtonColourContractError;
34
+ }>;
35
+ export type ContextualButtonResolution = Readonly<{
36
+ kind: 'preferred';
37
+ requestedRole: VariantRole;
38
+ states: ResolvedButtonColourStates;
39
+ focusIndicator: ResolvedButtonFocusIndicator;
40
+ boundary: Readonly<{
41
+ width: string;
42
+ color: string;
43
+ }> | null;
44
+ }> | Readonly<{
45
+ kind: 'repaired';
46
+ requestedRole: VariantRole;
47
+ candidate: 'surface-outline' | VariantRole;
48
+ states: ResolvedButtonColourStates;
49
+ focusIndicator: ResolvedButtonFocusIndicator;
50
+ boundary: Readonly<{
51
+ width: string;
52
+ color: string;
53
+ }> | null;
54
+ rejectedCandidates: readonly RejectedButtonSurfaceCandidate[];
55
+ }> | Readonly<{
56
+ kind: 'unresolved';
57
+ requestedRole: VariantRole;
58
+ rejectedCandidates: readonly RejectedButtonSurfaceCandidate[];
59
+ }>;
60
+ /**
61
+ * Derive only what the rendered section can honestly prove about its backing.
62
+ * Images, gradients, alpha/composite layers and arbitrary CSS remain unknown.
63
+ */
64
+ export declare function deriveButtonSurfaceContext(input: ButtonSurfaceInput, palette: Readonly<Record<string, string>>, fallbackToken?: string): ButtonSurfaceContext;
65
+ export declare function resolveContextualButtonRole(input: Readonly<{
66
+ role: VariantRole;
67
+ buttonSystem: ButtonSystem;
68
+ palette: ButtonColourPalette;
69
+ surface: KnownButtonSurface;
70
+ }>): ContextualButtonResolution;
71
+ export declare function contextualButtonSurfaceStyles(resolution: ContextualButtonResolution): Readonly<Record<string, string>>;
72
+ /**
73
+ * Break an inherited surface contract when a nested element establishes a
74
+ * backing whose colours cannot be proven (for example an image or gradient).
75
+ */
76
+ export declare function contextualButtonSurfaceResetStyles(): Readonly<Record<string, string>>;
77
+ export declare function actionVariableName(role: string, state: ButtonVisualState, property: string): string;
78
+ export declare function actionVariableFallback(role: string, state: ButtonVisualState, property: string, fallback: string): string;
@@ -8,6 +8,7 @@ export * from './parseThemeForPersistence';
8
8
  export * from './classNames';
9
9
  export * from './generateButtonCss';
10
10
  export * from './resolveButtonColourStates';
11
+ export * from './buttonSurfaceContext';
11
12
  export * from './affordanceIcons';
12
13
  export * from './generateDefaultButtonSystem';
13
14
  export * from './constants';
@@ -14,8 +14,8 @@ declare const validatedThemeForPersistenceBrand: unique symbol;
14
14
  /**
15
15
  * A schema-parsed Theme whose button variants all compile against its palette.
16
16
  *
17
- * The brand is intentionally phantom: validation does not mutate themes or add
18
- * persistence-only data to the JSON document.
17
+ * The brand is intentionally phantom. The parser also canonicalizes legacy
18
+ * button systems by adding the standard surface policy before the next save.
19
19
  */
20
20
  export type ValidatedThemeForPersistence = Theme & {
21
21
  readonly [validatedThemeForPersistenceBrand]: true;
@@ -1,65 +1,17 @@
1
- import type { ExpandedPalette } from '../palette/expandPalette';
2
- import type { ButtonColourTreatment, ButtonGlobalSettings, ButtonVariant, OpaqueButtonColourToken, VariantEffects } from './types';
3
- import { type ButtonUnsupportedEffectReason } from './effectClassification';
1
+ import type { ButtonGlobalSettings, ButtonVariant, OpaqueButtonColourToken, VariantEffects } from './types';
2
+ import { type ButtonColourContractError, type ButtonColourPalette, type ButtonVisualState, type KnownButtonSurface } from './buttonColourContract';
3
+ export { BUTTON_CONTRAST_POLICY, BUTTON_VISUAL_STATES, formatButtonColourContractError, type ButtonColourContractError, type ButtonColourPalette, type ButtonVisualState, type KnownButtonSurface, } from './buttonColourContract';
4
4
  export { classifyButtonEffectId, type ButtonEffectClassification, } from './effectClassification';
5
- export declare const BUTTON_VISUAL_STATES: readonly ["base", "hover", "focus", "active", "disabled"];
6
- export type ButtonVisualState = (typeof BUTTON_VISUAL_STATES)[number];
7
- export declare const BUTTON_CONTRAST_POLICY: {
8
- readonly textMinimumRatio: 4.5;
9
- readonly nonTextMinimumRatio: 3;
10
- readonly gradientSamplesPerSegment: 20;
11
- readonly alphaBackgrounds: "reject-without-known-surface";
12
- readonly disabled: "retain-full-colour-contract";
13
- };
14
- export type ButtonColourContractError = Readonly<{
15
- tag: 'unknown_palette_token';
16
- variantId: string;
17
- state: ButtonVisualState;
18
- token: OpaqueButtonColourToken;
19
- }> | Readonly<{
20
- tag: 'missing_on_colour';
21
- variantId: string;
22
- state: ButtonVisualState;
23
- backgroundToken: OpaqueButtonColourToken;
24
- foregroundToken: OpaqueButtonColourToken;
25
- }> | Readonly<{
26
- tag: 'insufficient_contrast';
27
- variantId: string;
28
- state: ButtonVisualState;
29
- background: string;
30
- foreground: string;
31
- ratio: number;
32
- requiredRatio: number;
33
- }> | Readonly<{
34
- tag: 'unsupported_colour_effect';
35
- variantId: string;
36
- state: ButtonVisualState;
37
- effectId: string;
38
- reason: ButtonUnsupportedEffectReason;
39
- }> | Readonly<{
40
- tag: 'invalid_colour_effect_options';
41
- variantId: string;
42
- state: ButtonVisualState;
43
- effectId: string;
44
- option: string;
45
- }> | Readonly<{
46
- tag: 'inapplicable_colour_effect';
47
- variantId: string;
48
- state: ButtonVisualState;
49
- effectId: string;
50
- treatment: ButtonColourTreatment['type'];
51
- }> | Readonly<{
52
- tag: 'unknown_button_effect';
53
- variantId: string;
54
- state: ButtonVisualState;
55
- effectId: string;
56
- }>;
57
5
  export type ResolvedButtonColour = Readonly<{
58
6
  kind: 'solid';
59
7
  backgroundToken: OpaqueButtonColourToken;
60
8
  foregroundToken: OpaqueButtonColourToken;
61
9
  backgroundCss: string;
62
10
  foregroundCss: string;
11
+ }> | Readonly<{
12
+ kind: 'known-solid';
13
+ backgroundCss: string;
14
+ foregroundCss: string;
63
15
  }> | Readonly<{
64
16
  kind: 'gradient';
65
17
  backgroundTokens: readonly [OpaqueButtonColourToken, OpaqueButtonColourToken, ...OpaqueButtonColourToken[]];
@@ -95,6 +47,6 @@ export type ButtonColourContractResult = Readonly<{
95
47
  export declare function compileButtonColourStates(input: Readonly<{
96
48
  variant: ButtonVariant;
97
49
  global: ButtonGlobalSettings;
98
- palette: ExpandedPalette;
50
+ palette: ButtonColourPalette;
51
+ surface?: KnownButtonSurface;
99
52
  }>): ButtonColourContractResult;
100
- export declare function formatButtonColourContractError(error: ButtonColourContractError): string;
@@ -1,12 +1,15 @@
1
- import type { ResolvedButtonColour, ResolvedButtonFocusIndicator } from './resolveButtonColourStates';
1
+ import type { ButtonVisualState, ResolvedButtonColour, ResolvedButtonFocusIndicator } from './resolveButtonColourStates';
2
2
  export type ButtonCssDeclaration = readonly [property: string, value: string];
3
3
  /**
4
4
  * Canonical colour declaration mapping shared by full themes and ThemeBridge.
5
5
  * Both background properties are always emitted so transitions cannot retain
6
6
  * a stale gradient or solid layer.
7
7
  */
8
- export declare function resolvedButtonColourDeclarations(colour: ResolvedButtonColour): readonly ButtonCssDeclaration[];
9
- export declare function resolvedButtonFocusDeclarations(indicator: ResolvedButtonFocusIndicator): readonly ButtonCssDeclaration[];
8
+ export declare function resolvedButtonColourDeclarations(colour: ResolvedButtonColour, action?: Readonly<{
9
+ role: string;
10
+ state: ButtonVisualState;
11
+ }>): readonly ButtonCssDeclaration[];
12
+ export declare function resolvedButtonFocusDeclarations(indicator: ResolvedButtonFocusIndicator, role?: string): readonly ButtonCssDeclaration[];
10
13
  /**
11
14
  * Disabled buttons retain their validated colour pair and add a non-layout
12
15
  * visual affordance. `currentColor` keeps the cue inside the same contrast
@@ -1,6 +1,6 @@
1
1
  import type { z } from 'zod';
2
2
  import type { StyleTags } from '../../site-styles/styleTags';
3
- import type { ButtonGlobalSettings, ButtonSizes, ButtonSystem, ButtonVariant } from '../types';
3
+ import type { ButtonGlobalSettings, ButtonSizes, ButtonSurfacePolicy, ButtonSystem, ButtonVariant } from '../types';
4
4
  export declare const PUBLIC_BUTTON_ROLES: readonly ["primary", "secondary", "outline", "ghost", "accent"];
5
5
  export type PublicButtonRole = (typeof PUBLIC_BUTTON_ROLES)[number];
6
6
  export type CompleteButtonRole = 'primary' | 'secondary';
@@ -13,7 +13,7 @@ export type PublicButtonVariant<TRole extends PublicButtonRole = PublicButtonRol
13
13
  export type CompleteButtonRoles = Readonly<{
14
14
  [TRole in PublicButtonRole]: PublicButtonVariant<TRole>;
15
15
  }>;
16
- type CompleteRoleDefinition<TRole extends PublicButtonRole> = Readonly<{
16
+ type CompleteRoleDefinition = Readonly<{
17
17
  kind: 'complete';
18
18
  appearance: ButtonVariantAppearance;
19
19
  }>;
@@ -23,16 +23,17 @@ type DerivedRoleDefinition = Readonly<{
23
23
  overrides?: Partial<ButtonVariantAppearance>;
24
24
  }>;
25
25
  export type ButtonRoleDefinitions = Readonly<{
26
- primary: CompleteRoleDefinition<'primary'>;
27
- secondary: CompleteRoleDefinition<'secondary'>;
28
- outline: CompleteRoleDefinition<'outline'> | DerivedRoleDefinition;
29
- ghost: CompleteRoleDefinition<'ghost'> | DerivedRoleDefinition;
30
- accent: CompleteRoleDefinition<'accent'> | DerivedRoleDefinition;
26
+ primary: CompleteRoleDefinition;
27
+ secondary: CompleteRoleDefinition;
28
+ outline: CompleteRoleDefinition | DerivedRoleDefinition;
29
+ ghost: CompleteRoleDefinition | DerivedRoleDefinition;
30
+ accent: CompleteRoleDefinition | DerivedRoleDefinition;
31
31
  }>;
32
32
  export type ButtonStyleSystemDefinition = Readonly<{
33
33
  global: ButtonGlobalSettings;
34
34
  sizes?: ButtonSizes;
35
35
  roles: ButtonRoleDefinitions;
36
+ surfacePolicy?: ButtonSurfacePolicy;
36
37
  }>;
37
38
  type StringParameterKey<TParameters> = Extract<keyof TParameters, string>;
38
39
  export type ButtonStyleControl<TParameters> = {
@@ -63,5 +63,6 @@ export declare const quietArrowRecipe: Readonly<{
63
63
  overrides?: Partial<import("..").ButtonVariantAppearance>;
64
64
  }>;
65
65
  }>;
66
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
66
67
  }>;
67
68
  }>;
@@ -55,6 +55,7 @@ export declare const softPillRecipe: Readonly<{
55
55
  overrides?: Partial<import("..").ButtonVariantAppearance>;
56
56
  }>;
57
57
  }>;
58
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
58
59
  }>;
59
60
  }>;
60
61
  export declare const earthPillRecipe: Readonly<{
@@ -114,6 +115,7 @@ export declare const earthPillRecipe: Readonly<{
114
115
  overrides?: Partial<import("..").ButtonVariantAppearance>;
115
116
  }>;
116
117
  }>;
118
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
117
119
  }>;
118
120
  }>;
119
121
  export declare const confidentChipRecipe: Readonly<{
@@ -173,6 +175,7 @@ export declare const confidentChipRecipe: Readonly<{
173
175
  overrides?: Partial<import("..").ButtonVariantAppearance>;
174
176
  }>;
175
177
  }>;
178
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
176
179
  }>;
177
180
  }>;
178
181
  export declare const editorialLinkRecipe: Readonly<{
@@ -232,6 +235,7 @@ export declare const editorialLinkRecipe: Readonly<{
232
235
  overrides?: Partial<import("..").ButtonVariantAppearance>;
233
236
  }>;
234
237
  }>;
238
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
235
239
  }>;
236
240
  }>;
237
241
  export declare const pebbleRecipe: Readonly<{
@@ -291,6 +295,7 @@ export declare const pebbleRecipe: Readonly<{
291
295
  overrides?: Partial<import("..").ButtonVariantAppearance>;
292
296
  }>;
293
297
  }>;
298
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
294
299
  }>;
295
300
  }>;
296
301
  export declare const brushedWashRecipe: Readonly<{
@@ -350,6 +355,7 @@ export declare const brushedWashRecipe: Readonly<{
350
355
  overrides?: Partial<import("..").ButtonVariantAppearance>;
351
356
  }>;
352
357
  }>;
358
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
353
359
  }>;
354
360
  }>;
355
361
  export declare const inkStampRecipe: Readonly<{
@@ -409,6 +415,7 @@ export declare const inkStampRecipe: Readonly<{
409
415
  overrides?: Partial<import("..").ButtonVariantAppearance>;
410
416
  }>;
411
417
  }>;
418
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
412
419
  }>;
413
420
  }>;
414
421
  export declare const flatInkRecipe: Readonly<{
@@ -468,6 +475,7 @@ export declare const flatInkRecipe: Readonly<{
468
475
  overrides?: Partial<import("..").ButtonVariantAppearance>;
469
476
  }>;
470
477
  }>;
478
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
471
479
  }>;
472
480
  }>;
473
481
  export declare const showtimePillRecipe: Readonly<{
@@ -527,6 +535,7 @@ export declare const showtimePillRecipe: Readonly<{
527
535
  overrides?: Partial<import("..").ButtonVariantAppearance>;
528
536
  }>;
529
537
  }>;
538
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
530
539
  }>;
531
540
  }>;
532
541
  export declare const joyStampRecipe: Readonly<{
@@ -586,6 +595,7 @@ export declare const joyStampRecipe: Readonly<{
586
595
  overrides?: Partial<import("..").ButtonVariantAppearance>;
587
596
  }>;
588
597
  }>;
598
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
589
599
  }>;
590
600
  }>;
591
601
  export declare const ornateRitualRecipe: Readonly<{
@@ -645,5 +655,6 @@ export declare const ornateRitualRecipe: Readonly<{
645
655
  overrides?: Partial<import("..").ButtonVariantAppearance>;
646
656
  }>;
647
657
  }>;
658
+ surfacePolicy?: import("../..").ButtonSurfacePolicy;
648
659
  }>;
649
660
  }>;
@@ -58,6 +58,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
58
58
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
59
59
  }>;
60
60
  }>;
61
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
61
62
  }>;
62
63
  }>, Readonly<{
63
64
  id: "earth-pill";
@@ -116,6 +117,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
116
117
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
117
118
  }>;
118
119
  }>;
120
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
119
121
  }>;
120
122
  }>, Readonly<{
121
123
  id: "confident-chip";
@@ -174,6 +176,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
174
176
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
175
177
  }>;
176
178
  }>;
179
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
177
180
  }>;
178
181
  }>, Readonly<{
179
182
  id: "editorial-link";
@@ -232,6 +235,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
232
235
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
233
236
  }>;
234
237
  }>;
238
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
235
239
  }>;
236
240
  }>, Readonly<{
237
241
  id: "pebble";
@@ -290,6 +294,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
290
294
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
291
295
  }>;
292
296
  }>;
297
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
293
298
  }>;
294
299
  }>, Readonly<{
295
300
  id: "ink-stamp";
@@ -348,6 +353,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
348
353
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
349
354
  }>;
350
355
  }>;
356
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
351
357
  }>;
352
358
  }>, Readonly<{
353
359
  id: "flat-ink";
@@ -406,6 +412,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
406
412
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
407
413
  }>;
408
414
  }>;
415
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
409
416
  }>;
410
417
  }>, Readonly<{
411
418
  id: "brushed-wash";
@@ -464,6 +471,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
464
471
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
465
472
  }>;
466
473
  }>;
474
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
467
475
  }>;
468
476
  }>, Readonly<{
469
477
  id: "showtime-pill";
@@ -522,6 +530,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
522
530
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
523
531
  }>;
524
532
  }>;
533
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
525
534
  }>;
526
535
  }>, Readonly<{
527
536
  id: "joy-stamp";
@@ -580,6 +589,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
580
589
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
581
590
  }>;
582
591
  }>;
592
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
583
593
  }>;
584
594
  }>, Readonly<{
585
595
  id: "ornate-ritual";
@@ -638,6 +648,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
638
648
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
639
649
  }>;
640
650
  }>;
651
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
641
652
  }>;
642
653
  }>, Readonly<{
643
654
  id: "quiet-arrow";
@@ -704,6 +715,7 @@ export declare const buttonStyleRecipes: readonly [Readonly<{
704
715
  overrides?: Partial<import("./domain").ButtonVariantAppearance>;
705
716
  }>;
706
717
  }>;
718
+ surfacePolicy?: import("..").ButtonSurfacePolicy;
707
719
  }>;
708
720
  }>];
709
721
  export type RegisteredButtonStyleRecipe = (typeof buttonStyleRecipes)[number];
@@ -60,6 +60,11 @@ export declare const DEFAULT_BUTTON_STYLE_SELECTION: {
60
60
  };
61
61
  export declare function createDefaultButtonStyleSelection(styleId: ButtonStyleId): ButtonStyleSelection;
62
62
  export declare function isButtonStyleId(value: string): value is ButtonStyleId;
63
+ export type PersistedButtonStyleSelectionResult = Readonly<{
64
+ selection: ButtonStyleSelection;
65
+ warning: 'invalid-persisted-button-style-selection' | null;
66
+ }>;
67
+ export declare function parsePersistedButtonStyleSelection(value: unknown, fallback?: ButtonStyleSelection): PersistedButtonStyleSelectionResult;
63
68
  /**
64
69
  * Stable identity for a validated style selection. Parsing first canonicalises
65
70
  * parameter key order, so future recipe parameters do not require editor-core
@@ -6,9 +6,9 @@ import { type ThemeColorToken } from '../tokens/themeColorTokens';
6
6
  * Defines the type-safe configuration for site button styles.
7
7
  */
8
8
  export type Shadow = {
9
- elevation: "none" | "low" | "medium" | "high";
10
- softness: "crisp" | "soft" | "hard" | null;
11
- position: "bottom" | "bottom-right";
9
+ elevation: 'none' | 'low' | 'medium' | 'high';
10
+ softness: 'crisp' | 'soft' | 'hard' | null;
11
+ position: 'bottom' | 'bottom-right';
12
12
  /**
13
13
  * Optional palette token for the shadow colour. When omitted the shadow
14
14
  * falls back to the historical neutral black (`rgb(0 0 0 / …)`), so existing
@@ -105,7 +105,11 @@ export type ButtonColourTreatment = {
105
105
  colorToken: OpaqueButtonColourToken;
106
106
  } | {
107
107
  type: 'gradient';
108
- stops: [OpaqueButtonColourToken, OpaqueButtonColourToken, ...OpaqueButtonColourToken[]];
108
+ stops: [
109
+ OpaqueButtonColourToken,
110
+ OpaqueButtonColourToken,
111
+ ...OpaqueButtonColourToken[]
112
+ ];
109
113
  direction: GradientDirection;
110
114
  foregroundToken: OpaqueButtonColourToken;
111
115
  } | {
@@ -313,6 +317,35 @@ export declare const variantRoleSchema: z.ZodEnum<{
313
317
  secondary: "secondary";
314
318
  ghost: "ghost";
315
319
  }>;
320
+ export declare const buttonSurfaceFallbackSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
321
+ kind: z.ZodLiteral<"surface-outline">;
322
+ }, z.core.$strict>, z.ZodObject<{
323
+ kind: z.ZodLiteral<"variant">;
324
+ role: z.ZodEnum<{
325
+ outline: "outline";
326
+ accent: "accent";
327
+ primary: "primary";
328
+ secondary: "secondary";
329
+ ghost: "ghost";
330
+ }>;
331
+ }, z.core.$strict>], "kind">;
332
+ export type ButtonSurfaceFallback = z.infer<typeof buttonSurfaceFallbackSchema>;
333
+ export type ButtonSurfacePolicy = Record<VariantRole, ButtonSurfaceFallback[]>;
334
+ type ReadonlyButtonSurfacePolicy = Readonly<Record<VariantRole, readonly ButtonSurfaceFallback[]>>;
335
+ export declare const STANDARD_BUTTON_SURFACE_POLICY: ReadonlyButtonSurfacePolicy;
336
+ export declare function createStandardButtonSurfacePolicy(): ButtonSurfacePolicy;
337
+ export declare const buttonSurfacePolicySchema: z.ZodObject<Record<"outline" | "accent" | "primary" | "secondary" | "ghost", z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
338
+ kind: z.ZodLiteral<"surface-outline">;
339
+ }, z.core.$strict>, z.ZodObject<{
340
+ kind: z.ZodLiteral<"variant">;
341
+ role: z.ZodEnum<{
342
+ outline: "outline";
343
+ accent: "accent";
344
+ primary: "primary";
345
+ secondary: "secondary";
346
+ ghost: "ghost";
347
+ }>;
348
+ }, z.core.$strict>], "kind">>>, z.core.$strict>;
316
349
  export declare const buttonSizeNameSchema: z.ZodEnum<{
317
350
  sm: "sm";
318
351
  md: "md";
@@ -2240,6 +2273,18 @@ export declare const buttonSystemSchema: z.ZodObject<{
2240
2273
  fontSize?: string | undefined;
2241
2274
  } | undefined;
2242
2275
  }>>>;
2276
+ surfacePolicy: z.ZodOptional<z.ZodObject<Record<"outline" | "accent" | "primary" | "secondary" | "ghost", z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
2277
+ kind: z.ZodLiteral<"surface-outline">;
2278
+ }, z.core.$strict>, z.ZodObject<{
2279
+ kind: z.ZodLiteral<"variant">;
2280
+ role: z.ZodEnum<{
2281
+ outline: "outline";
2282
+ accent: "accent";
2283
+ primary: "primary";
2284
+ secondary: "secondary";
2285
+ ghost: "ghost";
2286
+ }>;
2287
+ }, z.core.$strict>], "kind">>>, z.core.$strict>>;
2243
2288
  }, z.core.$strict>;
2244
2289
  export type Priority = 1 | 2 | 3;
2245
2290
  interface ButtonGlobalSettingsBase {
@@ -2315,5 +2360,7 @@ export interface ButtonSystem {
2315
2360
  global: ButtonGlobalSettings;
2316
2361
  variants: ButtonVariant[];
2317
2362
  sizes?: ButtonSizes;
2363
+ /** Optional only for pre-policy in-memory fixtures; persistence canonicalizes it. */
2364
+ surfacePolicy?: ButtonSurfacePolicy;
2318
2365
  }
2319
2366
  export {};