@riverbankcms/sdk 0.139.0 → 0.141.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 (232) hide show
  1. package/README.md +1 -1
  2. package/dist/{PreviewEditorSidebar-BDeenhi3.mjs → PreviewEditorSidebar-Q-fy9GYw.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-DSRhgjF5.mjs → PreviewEditorUI-LYGzgk85.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-D2K8GLUG.mjs → PreviewQueryProvider-CN0ewic5.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CL7wSnYu.mjs → SdkPreviewModeRuntime-CoPYI5Jq.mjs} +90 -50
  6. package/dist/{SiteChromeCustomizeContext-BhDn-5ir.mjs → SiteChromeCustomizeContext-D8LePX8x.mjs} +2731 -1303
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +165 -165
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +212 -212
  9. package/dist/_dts/api/src/accessAdmin.d.ts +74 -104
  10. package/dist/_dts/api/src/aiEndpoints.d.ts +5 -1
  11. package/dist/_dts/api/src/authSubmission.d.ts +46 -0
  12. package/dist/_dts/api/src/billing.d.ts +8 -4
  13. package/dist/_dts/api/src/billingEndpointDefinitions.d.ts +23 -0
  14. package/dist/_dts/api/src/billingEndpointTypes.d.ts +26 -0
  15. package/dist/_dts/api/src/blocks.d.ts +2 -0
  16. package/dist/_dts/api/src/bookingRecords.d.ts +1 -2
  17. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +8 -1
  18. package/dist/_dts/api/src/communications.d.ts +0 -1
  19. package/dist/_dts/api/src/contentRuntime.d.ts +17 -31
  20. package/dist/_dts/api/src/domainConnection.d.ts +4 -0
  21. package/dist/_dts/api/src/endpoints.d.ts +93 -64
  22. package/dist/_dts/api/src/event-destination-policy.d.ts +2 -1
  23. package/dist/_dts/api/src/footerCompositionContracts.d.ts +25 -0
  24. package/dist/_dts/api/src/footerSettings.d.ts +9 -6
  25. package/dist/_dts/api/src/index.d.ts +6 -7
  26. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  27. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  28. package/dist/_dts/api/src/launchReadiness.d.ts +1 -0
  29. package/dist/_dts/api/src/mailingListIntegration.d.ts +8 -2
  30. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  31. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +2 -1
  32. package/dist/_dts/api/src/navigation/types.d.ts +1 -1
  33. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +25 -0
  34. package/dist/_dts/api/src/onboarding/surfaceData.d.ts +32 -32
  35. package/dist/_dts/api/src/publicBookingAvailabilityEndpointDefinitions.d.ts +8 -0
  36. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +1 -0
  37. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +11 -3
  38. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +3 -29
  39. package/dist/_dts/api/src/publicOnboardingAttemptEndpointDefinitions.d.ts +65 -0
  40. package/dist/_dts/api/src/saveOutcome.d.ts +20 -0
  41. package/dist/_dts/api/src/sdkContracts.d.ts +3 -22
  42. package/dist/_dts/api/src/sdkPushContracts.d.ts +18 -0
  43. package/dist/_dts/api/src/sdkThemeWire.d.ts +44 -44
  44. package/dist/_dts/api/src/settings/permissions.d.ts +12 -0
  45. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +10 -29
  46. package/dist/_dts/api/src/siteOnboarding.d.ts +9 -9
  47. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +2 -4
  48. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -1
  49. package/dist/_dts/api/src/siteSettings.d.ts +20 -7
  50. package/dist/_dts/api/src/types.d.ts +77 -77
  51. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +2 -37
  52. package/dist/_dts/billing/src/membership/index.d.ts +3 -0
  53. package/dist/_dts/billing/src/plans/types.d.ts +3 -0
  54. package/dist/_dts/billing/src/site-arrangements.d.ts +23 -3
  55. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +20 -4
  56. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +2 -0
  57. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +7 -0
  58. package/dist/_dts/blocks/src/portal/types.d.ts +2 -4
  59. package/dist/_dts/blocks/src/portal/waitlist-types.d.ts +35 -0
  60. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +2 -0
  61. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -0
  62. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +122 -0
  63. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +2 -1
  64. package/dist/_dts/blocks/src/system/blocks/events/shared/eventSelection.d.ts +11 -0
  65. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  66. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  67. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  68. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  69. package/dist/_dts/blocks/src/system/data/index.d.ts +2 -2
  70. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +7 -1
  71. package/dist/_dts/blocks/src/system/data/types.d.ts +9 -0
  72. package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
  73. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +27 -1
  74. package/dist/_dts/blocks/src/system/registry.d.ts +1 -0
  75. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +0 -28
  76. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  77. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +7 -3
  78. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +1 -1
  79. package/dist/_dts/blocks/src/system/runtime/api/types/waitlist-claims.d.ts +7 -2
  80. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +42 -186
  81. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +21 -93
  82. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -1
  83. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +48 -1
  84. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +1 -2
  85. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +2 -0
  86. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/checkoutRecovery.d.ts +14 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +56 -0
  88. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +4 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.state.d.ts +5 -0
  90. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -8
  91. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useCheckoutRecovery.d.ts +8 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +3 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +10 -3
  94. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +9 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +8 -7
  96. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +14 -7
  97. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventSourceRecovery.d.ts +18 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.d.ts +37 -0
  99. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.client.d.ts +1 -1
  100. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +24 -6
  101. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +4 -2
  102. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +4 -3
  103. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  104. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +11 -101
  105. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +7 -2
  106. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +2 -0
  107. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -0
  108. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +1 -0
  109. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +1 -0
  110. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -6
  111. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  112. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +2 -0
  113. package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +12 -0
  114. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +4 -0
  115. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +4 -0
  116. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +27 -4
  117. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -1
  118. package/dist/_dts/content-editor/src/hooks/useBlockAutosave.d.ts +3 -1
  119. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +3 -0
  120. package/dist/_dts/core/src/branded.d.ts +0 -8
  121. package/dist/_dts/core/src/index.d.ts +1 -0
  122. package/dist/_dts/core/src/mailing-list-setup-parser.d.ts +1 -1
  123. package/dist/_dts/core/src/mailing-list-setup.d.ts +14 -1
  124. package/dist/_dts/core/src/mailing-list-submission.d.ts +7 -27
  125. package/dist/_dts/core/src/participants.d.ts +2 -29
  126. package/dist/_dts/core/src/public-experience.d.ts +4 -0
  127. package/dist/_dts/core/src/public-profile.d.ts +27 -1
  128. package/dist/_dts/core/src/site-route-target.d.ts +9 -2
  129. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +296 -606
  130. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListGlobalSettingsSummary.d.ts +10 -0
  131. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListTargetingField.d.ts +3 -2
  132. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/context.d.ts +3 -2
  133. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/loaders.d.ts +3 -2
  134. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/targetingState.d.ts +19 -0
  135. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +27 -1
  136. package/dist/_dts/sdk/src/public-api/contracts.d.ts +14 -20
  137. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  138. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -0
  139. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +7 -1
  140. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +1 -0
  141. package/dist/_dts/sdk/src/version.d.ts +1 -1
  142. package/dist/_dts/theme-core/src/ThemeFontLoader.d.ts +17 -1
  143. package/dist/_dts/theme-core/src/accordions/types.d.ts +3 -3
  144. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +17 -0
  145. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +1 -1
  146. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +16 -0
  147. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +0 -6
  148. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +4 -4
  149. package/dist/_dts/theme-core/src/cards/types.d.ts +21 -21
  150. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  151. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +8 -2
  152. package/dist/_dts/theme-core/src/header/legacyHeaderVariant.d.ts +2 -2
  153. package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +54 -12
  154. package/dist/_dts/theme-core/src/index.d.ts +1 -1
  155. package/dist/_dts/theme-core/src/inputs/types.d.ts +2 -2
  156. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +54 -54
  157. package/dist/_dts/theme-core/src/runtime/buildThemeRuntimeFromBridge.d.ts +1 -4
  158. package/dist/_dts/theme-core/src/schema.d.ts +84 -84
  159. package/dist/_dts/theme-core/src/shared/componentStyles.d.ts +1 -1
  160. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  161. package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +77 -0
  162. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  163. package/dist/_dts/theme-core/src/typography/generateTypographyCss.d.ts +2 -2
  164. package/dist/_dts/ui/src/lib/use-delayed-flag.d.ts +9 -0
  165. package/dist/_dts/ui/src/pending-button.d.ts +10 -0
  166. package/dist/client/{BookingConsentAgreement-CZvTDtsK.mjs → BookingConsentAgreement-xJeYNdnb.mjs} +4 -4
  167. package/dist/client/{DiscountCodeDisclosure-D-DsLCMU.mjs → DiscountCodeDisclosure-DdT6uzl9.mjs} +1 -1
  168. package/dist/client/{EventCombined.client-dWqgd5ZO.mjs → EventCombined.client-Cp28uYuM.mjs} +12 -16
  169. package/dist/client/{EventListing.client-BMRa9IYp.mjs → EventListing.client-CD6AJsMr.mjs} +4 -17
  170. package/dist/client/{LeafletStaticMap-D21W9kBZ.mjs → LeafletStaticMap-DBsAi9-e.mjs} +1 -1
  171. package/dist/client/{accordion-FxF_ta47.mjs → accordion-6dwbOKYR.mjs} +1 -1
  172. package/dist/client/{bookingForm-YnwW4TGw.mjs → bookingForm-CZE9_qPQ.mjs} +7 -7
  173. package/dist/client/bookings.mjs +500 -233
  174. package/dist/client/{carousel-vng7fFT5.mjs → carousel-7VHGQARz.mjs} +2 -2
  175. package/dist/client/{carousel.client-59G_WMr4.mjs → carousel.client-DQTjCVQT.mjs} +1 -1
  176. package/dist/client/{cart-DEPDsjNk.mjs → cart-Qg_mvQhh.mjs} +3 -3
  177. package/dist/client/{checkout-CZRWu9rW.mjs → checkout-D84rpgdr.mjs} +3 -3
  178. package/dist/client/{checkoutUrls-BuseL0dw.mjs → checkoutUrls-FL6lRkrt.mjs} +1 -1
  179. package/dist/client/client.mjs +2315 -1017
  180. package/dist/client/{colorStyles-CrxJrPjJ.mjs → colorStyles-3013aRAY.mjs} +3 -1
  181. package/dist/client/{context-DvU_WUmd.mjs → context-Ctp3T0Wr.mjs} +6 -19
  182. package/dist/client/{dates-wnPMiRl5.mjs → dates-DJKFcI_N.mjs} +2 -2
  183. package/dist/client/{eventCalendar-BA3Q5L15.mjs → eventCalendar-CK31z3vs.mjs} +12 -8
  184. package/dist/client/{eventCombined-51wgR-1R.mjs → eventCombined-DiXd-ewn.mjs} +3 -3
  185. package/dist/client/{eventDetails-modaetpm.mjs → eventDetails-CTRgt2DK.mjs} +4 -4
  186. package/dist/client/{eventListing-D8t2J3Kv.mjs → eventListing-Dy9vi_j_.mjs} +3 -3
  187. package/dist/client/{eventRegistration-CYqtkCE_.mjs → eventRegistration-CnalYMr2.mjs} +618 -177
  188. package/dist/client/{form-CBKXN5In.mjs → form-eUiMveTT.mjs} +3 -3
  189. package/dist/client/{headerSection-DylDqNrs.mjs → headerSection-Dy9kQpB1.mjs} +2 -2
  190. package/dist/client/hooks.mjs +692 -212
  191. package/dist/client/{locationMap-CvWrG0vZ.mjs → locationMap-DalCmWU0.mjs} +3 -3
  192. package/dist/client/{media-BOHuueS5.mjs → media-DHpfFwd3.mjs} +1 -1
  193. package/dist/client/{newsletterForm-Btwk70zw.mjs → newsletterForm-SDDPvhS0.mjs} +150 -94
  194. package/dist/client/{pricing-Uzw-GQ6Y.mjs → pricing-OcMz4SnX.mjs} +1 -1
  195. package/dist/client/{productDetail-JLcUYKnd.mjs → productDetail-BQrgHElM.mjs} +3 -3
  196. package/dist/client/{productList-FM0cbUzj.mjs → productList-OnPn_UJj.mjs} +3 -3
  197. package/dist/client/{propsDecoder-DYzafZb2.mjs → propsDecoder-zBdsnS-N.mjs} +168 -32
  198. package/dist/client/rendering/client.mjs +1355 -519
  199. package/dist/client/rendering/islands.mjs +19 -19
  200. package/dist/client/rendering.mjs +2294 -953
  201. package/dist/client/{scrollToBlock-CvXszexS.mjs → scrollToBlock-BNM4Ob2Y.mjs} +28 -11
  202. package/dist/client/{shop-BIcjvy5a.mjs → shop-Bv1fPTwQ.mjs} +6 -6
  203. package/dist/client/{shop-commerce-BZQsy7xw.mjs → shop-commerce-D4KNGaW8.mjs} +7 -7
  204. package/dist/client/{shop-commerce-store-D5V7XAb5.mjs → shop-commerce-store-2N5EV0Rc.mjs} +1 -1
  205. package/dist/client/{shopShared-DowkXevB.mjs → shopShared-DvJGdHTV.mjs} +4 -4
  206. package/dist/client/{useEventFilters-oMoTw_JE.mjs → useEventFilters-BBBvGDHQ.mjs} +19 -13
  207. package/dist/preview-next/before-render.mjs +119 -64
  208. package/dist/preview-next/client/runtime.mjs +4 -4
  209. package/dist/preview-next/editor-chrome.css +4 -8
  210. package/dist/preview-next/keepAlive.mjs +119 -64
  211. package/dist/preview-next/middleware.mjs +119 -64
  212. package/dist/{previewAuthStore-COUyAKaX.mjs → previewAuthStore-Gjb6r6vz.mjs} +119 -64
  213. package/dist/{sdk-runtime-D4k2LSGF.mjs → sdk-runtime-Defnbfzw.mjs} +2 -2
  214. package/dist/{separator-UGtpag4Z.mjs → separator-CZXO3Sb0.mjs} +1 -1
  215. package/dist/server/components.mjs +1170 -384
  216. package/dist/server/config-validation.mjs +560 -105
  217. package/dist/server/config.mjs +564 -109
  218. package/dist/server/data.mjs +688 -212
  219. package/dist/server/index.mjs +126 -66
  220. package/dist/server/next.mjs +1429 -662
  221. package/dist/server/page-converter.mjs +372 -99
  222. package/dist/server/prebuild.mjs +1 -1
  223. package/dist/server/rendering/server.mjs +1624 -817
  224. package/dist/server/rendering.mjs +1200 -391
  225. package/dist/server/routing.mjs +767 -247
  226. package/dist/server/server.mjs +715 -276
  227. package/dist/server/theme-bridge.mjs +475 -110
  228. package/dist/server/theme.mjs +9 -3
  229. package/dist/styles/index.css +265 -45
  230. package/package.json +1 -1
  231. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionCompactRow.d.ts +0 -29
  232. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionList.d.ts +0 -13
@@ -1096,7 +1096,7 @@ const BUTTON_CONTRAST_POLICY = {
1096
1096
  nonTextMinimumRatio: 3,
1097
1097
  gradientSamplesPerSegment: 20,
1098
1098
  alphaBackgrounds: "reject-without-known-surface",
1099
- disabled: "retain-full-colour-contract"
1099
+ disabled: "validated-colour-pair-with-muted-control-opacity"
1100
1100
  };
1101
1101
  function formatButtonColourContractError(error) {
1102
1102
  switch (error.tag) {
@@ -1634,6 +1634,55 @@ function interpolateHex(startHex, endHex, position) {
1634
1634
  const channel = (from, to) => Math.round(from + (to - from) * position).toString(16).padStart(2, "0");
1635
1635
  return `#${channel(start.r, end.r)}${channel(start.g, end.g)}${channel(start.b, end.b)}`;
1636
1636
  }
1637
+ //#endregion
1638
+ //#region ../theme-core/src/utils/colorStyles.ts
1639
+ const COLOR_VAR_PREFIX = "--tb-";
1640
+ function parseToken(source) {
1641
+ const parts = parseColorTokenParts(source);
1642
+ if (parts.kind === "raw") return {
1643
+ token: source,
1644
+ raw: parts.value
1645
+ };
1646
+ if (parts.kind === "invalid") return { token: source };
1647
+ return {
1648
+ token: parts.token,
1649
+ opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
1650
+ };
1651
+ }
1652
+ /**
1653
+ * Converts a theme color token to a CSS rgb value.
1654
+ * This is the primary function for applying theme colors to CSS properties.
1655
+ *
1656
+ * @param token - Theme color token (semantic, with opacity, or raw)
1657
+ * @returns CSS color value (rgb with optional alpha, or raw CSS value)
1658
+ *
1659
+ * @example
1660
+ * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'
1661
+ * rgbColorValue('surface/95') // => 'rgb(var(--tb-surface) / 0.95)'
1662
+ * rgbColorValue('raw:transparent') // => 'transparent'
1663
+ */
1664
+ function rgbColorValue(token) {
1665
+ const { token: baseToken, opacityPercent, raw } = parseToken(token);
1666
+ if (raw) return raw;
1667
+ const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
1668
+ if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
1669
+ return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
1670
+ }
1671
+ /**
1672
+ * Converts a theme color token to a CSS variable reference.
1673
+ * Note: This returns the base variable without rgb() wrapper, ignoring opacity.
1674
+ *
1675
+ * @param token - Theme color token
1676
+ * @returns CSS variable reference
1677
+ *
1678
+ * @example
1679
+ * cssVarValue('primary') // => 'var(--tb-primary)'
1680
+ * cssVarValue('surface/95') // => 'var(--tb-surface)' (opacity ignored)
1681
+ */
1682
+ function cssVarValue(token) {
1683
+ const { token: baseToken } = parseToken(token);
1684
+ return `var(${COLOR_VAR_PREFIX}${baseToken})`;
1685
+ }
1637
1686
  shadeBackgroundEffect({
1638
1687
  id: "darken-background",
1639
1688
  name: "Darken on Hover",
@@ -1688,55 +1737,6 @@ function shadeBackgroundEffect(config) {
1688
1737
  };
1689
1738
  }
1690
1739
  //#endregion
1691
- //#region ../theme-core/src/utils/colorStyles.ts
1692
- const COLOR_VAR_PREFIX = "--tb-";
1693
- function parseToken(source) {
1694
- const parts = parseColorTokenParts(source);
1695
- if (parts.kind === "raw") return {
1696
- token: source,
1697
- raw: parts.value
1698
- };
1699
- if (parts.kind === "invalid") return { token: source };
1700
- return {
1701
- token: parts.token,
1702
- opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
1703
- };
1704
- }
1705
- /**
1706
- * Converts a theme color token to a CSS rgb value.
1707
- * This is the primary function for applying theme colors to CSS properties.
1708
- *
1709
- * @param token - Theme color token (semantic, with opacity, or raw)
1710
- * @returns CSS color value (rgb with optional alpha, or raw CSS value)
1711
- *
1712
- * @example
1713
- * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'
1714
- * rgbColorValue('surface/95') // => 'rgb(var(--tb-surface) / 0.95)'
1715
- * rgbColorValue('raw:transparent') // => 'transparent'
1716
- */
1717
- function rgbColorValue(token) {
1718
- const { token: baseToken, opacityPercent, raw } = parseToken(token);
1719
- if (raw) return raw;
1720
- const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
1721
- if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
1722
- return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
1723
- }
1724
- /**
1725
- * Converts a theme color token to a CSS variable reference.
1726
- * Note: This returns the base variable without rgb() wrapper, ignoring opacity.
1727
- *
1728
- * @param token - Theme color token
1729
- * @returns CSS variable reference
1730
- *
1731
- * @example
1732
- * cssVarValue('primary') // => 'var(--tb-primary)'
1733
- * cssVarValue('surface/95') // => 'var(--tb-surface)' (opacity ignored)
1734
- */
1735
- function cssVarValue(token) {
1736
- const { token: baseToken } = parseToken(token);
1737
- return `var(${COLOR_VAR_PREFIX}${baseToken})`;
1738
- }
1739
- //#endregion
1740
1740
  //#region ../theme-core/src/utils/tokenOrColor.ts
1741
1741
  /**
1742
1742
  * Runtime color-reference fields intentionally accept any string, including
@@ -1789,17 +1789,16 @@ function resolvedButtonFocusDeclarations(indicator, role) {
1789
1789
  ] : [["outline", value("outline", `3px solid ${indicator.colorCss}`)], ["outline-offset", value("outline-offset", "3px")]];
1790
1790
  }
1791
1791
  /**
1792
- * Disabled buttons retain their validated colour pair and add a non-layout
1793
- * visual affordance. `currentColor` keeps the cue inside the same contrast
1794
- * relationship, while retaining pointer events lets the not-allowed cursor
1795
- * remain observable.
1792
+ * Disabled buttons are deliberately muted as unavailable controls. Native
1793
+ * disabled controls are exempt from active-control contrast requirements;
1794
+ * opacity distinguishes the state without introducing a focus-like outline.
1795
+ * Retaining pointer events lets the not-allowed cursor remain observable.
1796
1796
  */
1797
1797
  const RESOLVED_BUTTON_DISABLED_DECLARATIONS = [
1798
1798
  ["cursor", "not-allowed"],
1799
1799
  ["transform", "none"],
1800
1800
  ["box-shadow", "none"],
1801
- ["outline", "2px dashed currentColor"],
1802
- ["outline-offset", "-4px"]
1801
+ ["opacity", "0.55"]
1803
1802
  ];
1804
1803
  buttonSizeNameSchema.options;
1805
1804
  //#endregion
@@ -5076,8 +5075,14 @@ const headerInteractionPillPaletteValues = [
5076
5075
  "accent"
5077
5076
  ];
5078
5077
  /**
5079
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
5080
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
5078
+ * "No pill": a colour change on hover rather than a filled background.
5079
+ *
5080
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
5081
+ * foreground-adaptive style that is not the end of the story: the hover colour
5082
+ * is derived from the resolved opening foreground at render time, paired with
5083
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
5084
+ * whatever brand token the recipe happened to name. See
5085
+ * `applyOpeningForeground`.
5081
5086
  *
5082
5087
  * It exists because "a colour change on hover, no filled background" was not
5083
5088
  * expressible in the vocabulary, and it is what
@@ -10921,6 +10926,132 @@ ${root} .step-connector {
10921
10926
  return cssBlocks.join("\n\n");
10922
10927
  }
10923
10928
  //#endregion
10929
+ //#region ../theme-core/src/typography/generateTypographyCss.ts
10930
+ function globalHeadingColorFallback(level) {
10931
+ return `var(--hc-h${level}, var(--hc-heading, ${DEFAULT_SURFACE_TEXT_COLOR}))`;
10932
+ }
10933
+ /**
10934
+ * Generate typography CSS for heading elements.
10935
+ *
10936
+ * Creates scoped CSS that:
10937
+ * - Applies font-size, font-weight, letter-spacing, line-height to h1-h6
10938
+ * - Uses clamp() for fluid responsive sizing
10939
+ * - Provides variant classes (.heading-display, .heading-compact)
10940
+ *
10941
+ * Selectors use :where() for zero specificity, allowing site styles to override easily.
10942
+ */
10943
+ function generateTypographyCss({ themeId }) {
10944
+ const root = `:where([data-theme-scope="${themeId}"])`;
10945
+ const cssBlocks = [];
10946
+ cssBlocks.push(`/* Base heading styles */
10947
+ ${root} :where(h1, h2, h3, h4, h5, h6) {
10948
+ font-family: var(--font-heading);
10949
+ font-style: var(--fi-heading, normal);
10950
+ text-transform: var(--tt-heading, none);
10951
+ font-variant: var(--fv-heading, normal);
10952
+ margin: 0;
10953
+ }`);
10954
+ cssBlocks.push(`/* Heading level styles with fluid typography */
10955
+ ${root} :where(h1) {
10956
+ font-size: var(--fs-h1-fluid, var(--fs-h1));
10957
+ font-weight: var(--fw-h1, var(--font-weight-heading));
10958
+ font-style: var(--fi-h1, var(--fi-heading, normal));
10959
+ letter-spacing: var(--ls-h1, var(--ls-heading));
10960
+ line-height: var(--lh-h1, var(--lh-heading));
10961
+ color: ${surfaceForegroundValue("heading", globalHeadingColorFallback(1))};
10962
+ }
10963
+
10964
+ ${root} :where(h2) {
10965
+ font-size: var(--fs-h2-fluid, var(--fs-h2));
10966
+ font-weight: var(--fw-h2, var(--font-weight-heading));
10967
+ font-style: var(--fi-h2, var(--fi-heading, normal));
10968
+ letter-spacing: var(--ls-h2, var(--ls-heading));
10969
+ line-height: var(--lh-h2, var(--lh-heading));
10970
+ color: ${surfaceForegroundValue("heading", globalHeadingColorFallback(2))};
10971
+ }
10972
+
10973
+ ${root} :where(h3) {
10974
+ font-size: var(--fs-h3-fluid, var(--fs-h3));
10975
+ font-weight: var(--fw-h3, var(--font-weight-heading));
10976
+ font-style: var(--fi-h3, var(--fi-heading, normal));
10977
+ letter-spacing: var(--ls-h3, var(--ls-heading));
10978
+ line-height: var(--lh-h3, var(--lh-heading));
10979
+ color: ${surfaceForegroundValue("heading", globalHeadingColorFallback(3))};
10980
+ }
10981
+
10982
+ ${root} :where(h4) {
10983
+ font-size: var(--fs-h4-fluid, var(--fs-h4, var(--fs-h3)));
10984
+ font-weight: var(--fw-h4, var(--font-weight-heading));
10985
+ font-style: var(--fi-h4, var(--fi-heading, normal));
10986
+ letter-spacing: var(--ls-h4, var(--ls-heading));
10987
+ line-height: var(--lh-h4, var(--lh-heading));
10988
+ color: ${surfaceForegroundValue("heading", globalHeadingColorFallback(4))};
10989
+ }
10990
+
10991
+ ${root} :where(h5) {
10992
+ font-size: var(--fs-h5-fluid, var(--fs-h5, var(--fs-body)));
10993
+ font-weight: var(--fw-h5, var(--font-weight-heading));
10994
+ font-style: var(--fi-h5, var(--fi-heading, normal));
10995
+ letter-spacing: var(--ls-h5, var(--ls-heading));
10996
+ line-height: var(--lh-h5, var(--lh-heading));
10997
+ color: ${surfaceForegroundValue("heading", globalHeadingColorFallback(5))};
10998
+ }
10999
+
11000
+ ${root} :where(h6) {
11001
+ font-size: var(--fs-h6-fluid, var(--fs-h6, var(--fs-body)));
11002
+ font-weight: var(--fw-h6, var(--font-weight-heading));
11003
+ font-style: var(--fi-h6, var(--fi-heading, normal));
11004
+ letter-spacing: var(--ls-h6, var(--ls-heading));
11005
+ line-height: var(--lh-h6, var(--lh-heading));
11006
+ color: ${surfaceForegroundValue("heading", globalHeadingColorFallback(6))};
11007
+ }`);
11008
+ cssBlocks.push(`/* Display variant for hero/splash headings */
11009
+ ${root} :where(.heading-display) {
11010
+ font-size: var(--fs-display-fluid, var(--fs-display));
11011
+ }
11012
+
11013
+ ${root} :where(h1.heading-display) {
11014
+ font-size: var(--fs-h1-display-fluid, var(--fs-h1-display, calc(var(--fs-h1) * 1.5)));
11015
+ }
11016
+
11017
+ ${root} :where(h2.heading-display) {
11018
+ font-size: var(--fs-h2-display-fluid, var(--fs-h2-display, calc(var(--fs-h2) * 1.35)));
11019
+ }`);
11020
+ cssBlocks.push(`/* Compact variant for cards/sidebars */
11021
+ ${root} :where(.heading-compact) {
11022
+ font-size: var(--fs-compact);
11023
+ }
11024
+
11025
+ ${root} :where(h1.heading-compact) {
11026
+ font-size: calc(var(--fs-h1) * 0.75);
11027
+ }
11028
+
11029
+ ${root} :where(h2.heading-compact) {
11030
+ font-size: calc(var(--fs-h2) * 0.8);
11031
+ }
11032
+
11033
+ ${root} :where(h3.heading-compact) {
11034
+ font-size: calc(var(--fs-h3) * 0.85);
11035
+ }`);
11036
+ cssBlocks.push(`/* Body text base styles */
11037
+ ${root} {
11038
+ font-family: var(--font-body);
11039
+ font-weight: var(--font-weight-body);
11040
+ font-size: var(--fs-body);
11041
+ letter-spacing: var(--ls-body);
11042
+ line-height: var(--lh-body);
11043
+ }
11044
+
11045
+ ${root} :where(p, li, td, th, label, span) {
11046
+ font-family: var(--font-body);
11047
+ font-weight: var(--font-weight-body);
11048
+ letter-spacing: var(--ls-body);
11049
+ font-size: inherit;
11050
+ line-height: inherit;
11051
+ }`);
11052
+ return `@layer rb-theme {\n${cssBlocks.join("\n\n")}\n}`;
11053
+ }
11054
+ //#endregion
10924
11055
  //#region ../theme-core/src/blocks/vars/event-registration.ts
10925
11056
  /**
10926
11057
  * Generate CSS variables for the event-registration block.
@@ -12377,10 +12508,19 @@ const containerResponsiveThemeCss = `/*
12377
12508
  padding-top: 2.5rem;
12378
12509
  padding-bottom: 2.5rem;
12379
12510
  }
12511
+ /* Clearance for a surface that is not an authored block page.
12512
+ An authored page gets this through its opening block's container (see the
12513
+ overlay-clearance rule in styles.css). A reserved surface or a system
12514
+ destination page has no such block, so it consumes the same variable here.
12515
+ Marked with one class rather than per-surface selectors, because the last
12516
+ two additions to this family were both missed and shipped overlapping. */
12380
12517
  :where(.theme-scope)
12381
12518
  [data-site-document-layout-mode="header-overlay"]
12382
- [data-rb-reserved-surface].rb-reserved-surface-main {
12383
- padding-top: calc(var(--rb-reserved-surface-header-offset, 5.5rem) + 2.5rem);
12519
+ .rb-overlay-clearance-surface {
12520
+ padding-top: calc(
12521
+ var(--site-overlay-header-clearance, 5.5rem) +
12522
+ var(--site-overlay-opening-content-extra-pad, clamp(1rem, 2vw, 1.75rem))
12523
+ );
12384
12524
  }
12385
12525
  .rb-preview-editor-offset {
12386
12526
  padding-bottom: calc(
@@ -21382,7 +21522,9 @@ const containerResponsiveThemeCss = `/*
21382
21522
  text-align: left;
21383
21523
  }
21384
21524
 
21385
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__subtitle {
21525
+ :where(.theme-scope)
21526
+ :where([data-block="customer-portal"])
21527
+ .cp-login__subtitle {
21386
21528
  color: var(--cp-muted);
21387
21529
  font-size: 0.9375rem;
21388
21530
  text-align: left;
@@ -21409,7 +21551,9 @@ const containerResponsiveThemeCss = `/*
21409
21551
  text-align: left;
21410
21552
  }
21411
21553
 
21412
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link {
21554
+ :where(.theme-scope)
21555
+ :where([data-block="customer-portal"])
21556
+ .cp-login__reset-link {
21413
21557
  appearance: none;
21414
21558
  background: none;
21415
21559
  border: 0;
@@ -21423,11 +21567,15 @@ const containerResponsiveThemeCss = `/*
21423
21567
  text-underline-offset: 0.15em;
21424
21568
  }
21425
21569
 
21426
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:hover {
21570
+ :where(.theme-scope)
21571
+ :where([data-block="customer-portal"])
21572
+ .cp-login__reset-link:hover {
21427
21573
  color: var(--cp-text);
21428
21574
  }
21429
21575
 
21430
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:focus-visible {
21576
+ :where(.theme-scope)
21577
+ :where([data-block="customer-portal"])
21578
+ .cp-login__reset-link:focus-visible {
21431
21579
  outline: 2px solid currentColor;
21432
21580
  outline-offset: 3px;
21433
21581
  }
@@ -21472,7 +21620,9 @@ const containerResponsiveThemeCss = `/*
21472
21620
  border-bottom: none;
21473
21621
  }
21474
21622
 
21475
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-header__welcome {
21623
+ :where(.theme-scope)
21624
+ :where([data-block="customer-portal"])
21625
+ .cp-header__welcome {
21476
21626
  font-size: 1.125rem;
21477
21627
  font-weight: 500;
21478
21628
  }
@@ -21488,8 +21638,14 @@ const containerResponsiveThemeCss = `/*
21488
21638
  }
21489
21639
 
21490
21640
  @keyframes cp-fade-in {
21491
- from { opacity: 0; transform: translateY(4px); }
21492
- to { opacity: 1; transform: translateY(0); }
21641
+ from {
21642
+ opacity: 0;
21643
+ transform: translateY(4px);
21644
+ }
21645
+ to {
21646
+ opacity: 1;
21647
+ transform: translateY(0);
21648
+ }
21493
21649
  }
21494
21650
 
21495
21651
  /* Empty state */
@@ -21578,6 +21734,77 @@ const containerResponsiveThemeCss = `/*
21578
21734
  margin-top: 1rem;
21579
21735
  }
21580
21736
 
21737
+ /* Event waitlists */
21738
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-list {
21739
+ display: grid;
21740
+ gap: 1rem;
21741
+ }
21742
+
21743
+ :where(.theme-scope)
21744
+ :where([data-block="customer-portal"])
21745
+ .cp-waitlists
21746
+ > .cp-alert {
21747
+ margin-bottom: 1rem;
21748
+ }
21749
+
21750
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-card {
21751
+ transition:
21752
+ border-color 180ms ease,
21753
+ box-shadow 180ms ease;
21754
+ }
21755
+
21756
+ :where(.theme-scope)
21757
+ :where([data-block="customer-portal"])
21758
+ .cp-waitlist-card--focused {
21759
+ border-color: var(--cp-primary);
21760
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--cp-primary) 22%, transparent);
21761
+ }
21762
+
21763
+ :where(.theme-scope)
21764
+ :where([data-block="customer-portal"])
21765
+ .cp-waitlist-card__summary,
21766
+ :where(.theme-scope)
21767
+ :where([data-block="customer-portal"])
21768
+ .cp-waitlist-card__position {
21769
+ font-weight: 600;
21770
+ }
21771
+
21772
+ :where(.theme-scope)
21773
+ :where([data-block="customer-portal"])
21774
+ .cp-waitlist-card
21775
+ .cp-card-body
21776
+ p {
21777
+ margin: 0.4rem 0;
21778
+ }
21779
+
21780
+ @container rb-site (max-width: 640px) {
21781
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
21782
+ :where(.theme-scope)
21783
+ :where([data-block="customer-portal"])
21784
+ .cp-waitlist-card
21785
+ .cp-card-header {
21786
+ flex-direction: column-reverse;
21787
+ }
21788
+
21789
+ :where(.theme-scope)
21790
+ :where([data-block="customer-portal"])
21791
+ .cp-waitlist-card
21792
+ .cp-card-actions {
21793
+ align-items: stretch;
21794
+ flex-direction: column;
21795
+ }
21796
+
21797
+ :where(.theme-scope)
21798
+ :where([data-block="customer-portal"])
21799
+ .cp-waitlist-card
21800
+ .cp-card-actions
21801
+ > * {
21802
+ justify-content: center;
21803
+ text-align: center;
21804
+ }
21805
+ }
21806
+ }
21807
+
21581
21808
  /* Badge */
21582
21809
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-badge {
21583
21810
  display: inline-flex;
@@ -21714,11 +21941,18 @@ const containerResponsiveThemeCss = `/*
21714
21941
  background: rgba(var(--tb-border), 0.2);
21715
21942
  }
21716
21943
 
21717
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table tbody tr:last-child td {
21944
+ :where(.theme-scope)
21945
+ :where([data-block="customer-portal"])
21946
+ .cp-table
21947
+ tbody
21948
+ tr:last-child
21949
+ td {
21718
21950
  border-bottom: none;
21719
21951
  }
21720
21952
 
21721
- :where(.theme-scope) :where([data-block="customer-portal"]) :is(.cp-row--past, .cp-row--muted) {
21953
+ :where(.theme-scope)
21954
+ :where([data-block="customer-portal"])
21955
+ :is(.cp-row--past, .cp-row--muted) {
21722
21956
  opacity: 0.65;
21723
21957
  }
21724
21958
 
@@ -21731,7 +21965,9 @@ const containerResponsiveThemeCss = `/*
21731
21965
  line-height: 1.2;
21732
21966
  }
21733
21967
 
21734
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__badges {
21968
+ :where(.theme-scope)
21969
+ :where([data-block="customer-portal"])
21970
+ .cp-row-title__badges {
21735
21971
  margin-left: auto;
21736
21972
  display: flex;
21737
21973
  flex-wrap: wrap;
@@ -21739,7 +21975,9 @@ const containerResponsiveThemeCss = `/*
21739
21975
  gap: 0.375rem;
21740
21976
  }
21741
21977
 
21742
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__text {
21978
+ :where(.theme-scope)
21979
+ :where([data-block="customer-portal"])
21980
+ .cp-row-title__text {
21743
21981
  min-width: 0;
21744
21982
  }
21745
21983
 
@@ -21759,12 +21997,16 @@ const containerResponsiveThemeCss = `/*
21759
21997
  line-height: 1.35;
21760
21998
  }
21761
21999
 
21762
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--success {
22000
+ :where(.theme-scope)
22001
+ :where([data-block="customer-portal"])
22002
+ .cp-row-note--success {
21763
22003
  border-left-color: rgb(var(--tb-success));
21764
22004
  color: rgb(var(--tb-success));
21765
22005
  }
21766
22006
 
21767
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--error {
22007
+ :where(.theme-scope)
22008
+ :where([data-block="customer-portal"])
22009
+ .cp-row-note--error {
21768
22010
  border-left-color: rgb(var(--tb-destructive));
21769
22011
  color: rgb(var(--tb-destructive));
21770
22012
  }
@@ -21783,16 +22025,23 @@ const containerResponsiveThemeCss = `/*
21783
22025
  white-space: nowrap;
21784
22026
  }
21785
22027
 
21786
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-col-actions .btn-sm {
22028
+ :where(.theme-scope)
22029
+ :where([data-block="customer-portal"])
22030
+ .cp-col-actions
22031
+ .btn-sm {
21787
22032
  white-space: nowrap;
21788
22033
  }
21789
22034
 
21790
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link {
22035
+ :where(.theme-scope)
22036
+ :where([data-block="customer-portal"])
22037
+ .cp-row-title__link {
21791
22038
  color: inherit;
21792
22039
  text-decoration: none;
21793
22040
  }
21794
22041
 
21795
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link:hover {
22042
+ :where(.theme-scope)
22043
+ :where([data-block="customer-portal"])
22044
+ .cp-row-title__link:hover {
21796
22045
  text-decoration: underline;
21797
22046
  text-decoration-thickness: 2px;
21798
22047
  text-underline-offset: 2px;
@@ -21814,7 +22063,9 @@ const containerResponsiveThemeCss = `/*
21814
22063
  }
21815
22064
 
21816
22065
  /* Profile actions */
21817
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__actions {
22066
+ :where(.theme-scope)
22067
+ :where([data-block="customer-portal"])
22068
+ .cp-profile__actions {
21818
22069
  display: flex;
21819
22070
  gap: 0.75rem;
21820
22071
  margin-top: 1rem;
@@ -21881,28 +22132,39 @@ const containerResponsiveThemeCss = `/*
21881
22132
  gap: 0.375rem;
21882
22133
  }
21883
22134
 
21884
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__index {
22135
+ :where(.theme-scope)
22136
+ :where([data-block="customer-portal"])
22137
+ .cp-guest-edit-row__index {
21885
22138
  font-size: 0.75rem;
21886
22139
  font-weight: 500;
21887
22140
  color: var(--cp-muted);
21888
22141
  }
21889
22142
 
21890
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields {
22143
+ :where(.theme-scope)
22144
+ :where([data-block="customer-portal"])
22145
+ .cp-guest-edit-row__fields {
21891
22146
  display: flex;
21892
22147
  gap: 0.5rem;
21893
22148
  }
21894
22149
 
21895
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields input {
22150
+ :where(.theme-scope)
22151
+ :where([data-block="customer-portal"])
22152
+ .cp-guest-edit-row__fields
22153
+ input {
21896
22154
  flex: 1;
21897
22155
  min-width: 0;
21898
22156
  }
21899
22157
 
21900
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__error {
22158
+ :where(.theme-scope)
22159
+ :where([data-block="customer-portal"])
22160
+ .cp-guest-edit-row__error {
21901
22161
  font-size: 0.75rem;
21902
22162
  color: var(--cp-error);
21903
22163
  }
21904
22164
 
21905
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guests__actions {
22165
+ :where(.theme-scope)
22166
+ :where([data-block="customer-portal"])
22167
+ .cp-guests__actions {
21906
22168
  display: flex;
21907
22169
  gap: 0.5rem;
21908
22170
  margin-top: 0.5rem;
@@ -21916,13 +22178,18 @@ const containerResponsiveThemeCss = `/*
21916
22178
  }
21917
22179
 
21918
22180
  /* In the actions modal, tiles sit on a surface modal, so use "background" for contrast. */
21919
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-list :where(.rb-tile) {
22181
+ :where(.theme-scope)
22182
+ :where([data-block="customer-portal"])
22183
+ .cp-actions-list
22184
+ :where(.rb-tile) {
21920
22185
  --rb-event-tile-bg: rgb(var(--tb-background));
21921
22186
  --rb-event-tile-border: rgb(var(--tb-border));
21922
22187
  }
21923
22188
 
21924
22189
  /* Actions trigger: icon-only kebab button */
21925
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-trigger.btn-sm {
22190
+ :where(.theme-scope)
22191
+ :where([data-block="customer-portal"])
22192
+ .cp-actions-trigger.btn-sm {
21926
22193
  padding: 0.35rem !important;
21927
22194
  line-height: 1 !important;
21928
22195
  min-width: 32px;
@@ -21946,17 +22213,24 @@ const containerResponsiveThemeCss = `/*
21946
22213
  gap: 0.25rem;
21947
22214
  }
21948
22215
 
21949
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__title {
22216
+ :where(.theme-scope)
22217
+ :where([data-block="customer-portal"])
22218
+ .cp-action-tile__title {
21950
22219
  font-weight: 600;
21951
22220
  font-size: 0.9375rem;
21952
22221
  }
21953
22222
 
21954
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__desc {
22223
+ :where(.theme-scope)
22224
+ :where([data-block="customer-portal"])
22225
+ .cp-action-tile__desc {
21955
22226
  font-size: 0.875rem;
21956
22227
  line-height: 1.35;
21957
22228
  }
21958
22229
 
21959
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile--danger .cp-action-tile__title {
22230
+ :where(.theme-scope)
22231
+ :where([data-block="customer-portal"])
22232
+ .cp-action-tile--danger
22233
+ .cp-action-tile__title {
21960
22234
  color: rgb(var(--tb-destructive));
21961
22235
  }
21962
22236
 
@@ -21978,7 +22252,9 @@ const containerResponsiveThemeCss = `/*
21978
22252
  text-decoration: underline;
21979
22253
  }
21980
22254
 
21981
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-btn--link:hover {
22255
+ :where(.theme-scope)
22256
+ :where([data-block="customer-portal"])
22257
+ .cp-btn--link:hover {
21982
22258
  color: var(--cp-primary-hover);
21983
22259
  }
21984
22260
 
@@ -22017,34 +22293,48 @@ const containerResponsiveThemeCss = `/*
22017
22293
  margin-top: 0.75rem;
22018
22294
  }
22019
22295
 
22020
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__title {
22296
+ :where(.theme-scope)
22297
+ :where([data-block="customer-portal"])
22298
+ .cp-cancel-confirm__title {
22021
22299
  font-weight: 600;
22022
22300
  margin-bottom: 0.5rem;
22023
22301
  }
22024
22302
 
22025
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__message {
22303
+ :where(.theme-scope)
22304
+ :where([data-block="customer-portal"])
22305
+ .cp-cancel-confirm__message {
22026
22306
  margin-bottom: 0.25rem;
22027
22307
  }
22028
22308
 
22029
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__warning {
22309
+ :where(.theme-scope)
22310
+ :where([data-block="customer-portal"])
22311
+ .cp-cancel-confirm__warning {
22030
22312
  margin-bottom: 0.75rem;
22031
22313
  }
22032
22314
 
22033
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__actions {
22315
+ :where(.theme-scope)
22316
+ :where([data-block="customer-portal"])
22317
+ .cp-cancel-confirm__actions {
22034
22318
  display: flex;
22035
22319
  gap: 0.75rem;
22036
22320
  }
22037
22321
 
22038
22322
  /* Membership actions */
22039
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-membership-actions {
22323
+ :where(.theme-scope)
22324
+ :where([data-block="customer-portal"])
22325
+ .cp-membership-actions {
22040
22326
  margin-top: 0.75rem;
22041
22327
  }
22042
22328
 
22043
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-section-actions {
22329
+ :where(.theme-scope)
22330
+ :where([data-block="customer-portal"])
22331
+ .cp-section-actions {
22044
22332
  margin-top: 1rem;
22045
22333
  }
22046
22334
 
22047
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-card-subtitle--spaced {
22335
+ :where(.theme-scope)
22336
+ :where([data-block="customer-portal"])
22337
+ .cp-card-subtitle--spaced {
22048
22338
  margin-top: 0.75rem;
22049
22339
  }
22050
22340
 
@@ -22068,9 +22358,18 @@ const containerResponsiveThemeCss = `/*
22068
22358
  display: none;
22069
22359
  }
22070
22360
 
22071
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-guests,
22072
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-tickets,
22073
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-actions {
22361
+ :where(.theme-scope)
22362
+ :where([data-block="customer-portal"])
22363
+ .cp-table
22364
+ :is(th, td).cp-col-guests,
22365
+ :where(.theme-scope)
22366
+ :where([data-block="customer-portal"])
22367
+ .cp-table
22368
+ :is(th, td).cp-col-tickets,
22369
+ :where(.theme-scope)
22370
+ :where([data-block="customer-portal"])
22371
+ .cp-table
22372
+ :is(th, td).cp-col-actions {
22074
22373
  display: none;
22075
22374
  }
22076
22375
 
@@ -22079,24 +22378,34 @@ const containerResponsiveThemeCss = `/*
22079
22378
  }
22080
22379
 
22081
22380
  /* Make the cell a positioning context for the kebab */
22082
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row > td:first-child {
22381
+ :where(.theme-scope)
22382
+ :where([data-block="customer-portal"])
22383
+ .cp-row
22384
+ > td:first-child {
22083
22385
  position: relative;
22084
22386
  padding-right: 2.5rem;
22085
22387
  }
22086
22388
 
22087
22389
  /* Position kebab in top-right of the cell */
22088
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions {
22390
+ :where(.theme-scope)
22391
+ :where([data-block="customer-portal"])
22392
+ .cp-row-mobile-actions {
22089
22393
  position: absolute;
22090
22394
  top: 0.5rem;
22091
22395
  right: 0.5rem;
22092
22396
  margin-top: 0;
22093
22397
  }
22094
22398
 
22095
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions .btn-sm {
22399
+ :where(.theme-scope)
22400
+ :where([data-block="customer-portal"])
22401
+ .cp-row-mobile-actions
22402
+ .btn-sm {
22096
22403
  width: auto;
22097
22404
  }
22098
22405
 
22099
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__edit {
22406
+ :where(.theme-scope)
22407
+ :where([data-block="customer-portal"])
22408
+ .cp-profile__edit {
22100
22409
  align-self: stretch;
22101
22410
  }
22102
22411
  }
@@ -22544,6 +22853,47 @@ const containerResponsiveThemeCss = `/*
22544
22853
  gap: 0.25rem;
22545
22854
  }
22546
22855
 
22856
+ /* Topic choices (visitor picks what to hear about). Same treatment as the
22857
+ form block's .fb-fieldset / .fb-inline, defined here because the newsletter
22858
+ form also renders inside contact-newsletter and the site footer. */
22859
+ :where(.theme-scope) .newsletter-topics {
22860
+ display: flex;
22861
+ flex-direction: column;
22862
+ gap: 0.5rem;
22863
+ border: none;
22864
+ padding: 0;
22865
+ margin: 0;
22866
+ min-width: 0;
22867
+ }
22868
+
22869
+ :where(.theme-scope) .newsletter-topics > legend {
22870
+ padding: 0;
22871
+ margin-bottom: 0.25rem;
22872
+ }
22873
+
22874
+ :where(.theme-scope) .newsletter-topic-choice {
22875
+ display: flex;
22876
+ align-items: center;
22877
+ gap: 0.5rem;
22878
+ }
22879
+
22880
+ /* Error panel and field notes. The form block scopes these to its own
22881
+ data-block, so the newsletter form (which also renders in the footer)
22882
+ needs its own copy of the treatment. */
22883
+ :where(.theme-scope) .newsletter-form .fb-error:not([data-field-validation-message]) {
22884
+ background-color: var(--fb-error-bg);
22885
+ color: var(--fb-error-text);
22886
+ border: 1px solid var(--fb-error-border);
22887
+ border-radius: var(--rb-block-radius);
22888
+ padding: 1rem;
22889
+ font-size: 0.875rem;
22890
+ }
22891
+
22892
+ :where(.theme-scope) .newsletter-form [data-field-validation-message] {
22893
+ font-size: 0.875rem;
22894
+ color: var(--fb-error-text);
22895
+ }
22896
+
22547
22897
  /* Required indicator */
22548
22898
  :where(.theme-scope) .newsletter-required {
22549
22899
  color: rgb(var(--tb-primary));
@@ -22593,6 +22943,10 @@ const containerResponsiveThemeCss = `/*
22593
22943
  flex-shrink: 0;
22594
22944
  }
22595
22945
 
22946
+ :where(.theme-scope) .newsletter-inline .newsletter-topics {
22947
+ flex-basis: 100%;
22948
+ }
22949
+
22596
22950
  /* Mobile fallback for inline variant */
22597
22951
  @container rb-site (max-width: 640px) {
22598
22952
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
@@ -25200,18 +25554,17 @@ function normalizeTokenValue(value) {
25200
25554
  return trimmedValue;
25201
25555
  }
25202
25556
  function buildThemeBridgeRuntime(config) {
25203
- validateThemeBridgeConfig(config);
25557
+ const validatedConfig = validateThemeBridgeConfig(config);
25558
+ const cssVars = buildBridgeCssVars(validatedConfig);
25204
25559
  const themeId = "sdk";
25205
- const corners = config.corners ?? "rounded";
25206
- const shadows = config.shadows ?? "medium";
25207
- const cssVars = buildBridgeCssVars(config);
25560
+ const corners = validatedConfig.corners ?? "rounded";
25208
25561
  const generatorTheme = buildBridgeGeneratorTheme(corners);
25209
25562
  return {
25210
25563
  themeId,
25211
25564
  cssVars,
25212
- buttonCss: shouldGenerateComponent(config.components?.buttons) ? generateButtonsCss(config, corners, shadows) : void 0,
25213
- cardCss: generateCardsCss(config, corners, shadows),
25214
- inputCss: shouldGenerateComponent(config.components?.inputs) ? generateInputsCss(corners, shadows) : void 0,
25565
+ buttonCss: shouldGenerateComponent(config.components?.buttons) ? generateButtonsCss(config, corners, config.shadows ?? "medium") : void 0,
25566
+ cardCss: generateCardsCss(config, corners, config.shadows ?? "medium"),
25567
+ inputCss: shouldGenerateComponent(config.components?.inputs) ? generateInputsCss(corners, config.shadows ?? "medium") : void 0,
25215
25568
  statusCss: generateStatusCss({
25216
25569
  themeId,
25217
25570
  theme: generatorTheme
@@ -25220,6 +25573,7 @@ function buildThemeBridgeRuntime(config) {
25220
25573
  themeId,
25221
25574
  theme: generatorTheme
25222
25575
  }),
25576
+ typographyCss: generateTypographyCss({ themeId }),
25223
25577
  blockVarsCss: generateAllBlockVarsCss({
25224
25578
  themeId,
25225
25579
  theme: generatorTheme
@@ -25362,6 +25716,7 @@ function validateThemeBridgeConfig(config) {
25362
25716
  }
25363
25717
  validateBridgeTokens(config.tokens);
25364
25718
  if (config.overrides !== void 0) parseBridgeOverrideRules(config.overrides);
25719
+ return config;
25365
25720
  }
25366
25721
  function resolveBridgeTokens(tokens) {
25367
25722
  const resolved = {};
@@ -25478,7 +25833,7 @@ function shouldGenerateComponent(value) {
25478
25833
  function generateButtonsCss(config, corners, shadows) {
25479
25834
  let variants = getDefaultButtonVariants();
25480
25835
  const buttonConfig = config.components?.buttons;
25481
- if (buttonConfig !== void 0 && buttonConfig !== true && buttonConfig !== false && buttonConfig.variants) {
25836
+ if (typeof buttonConfig === "object" && buttonConfig.variants) {
25482
25837
  const requestedIds = new Set(buttonConfig.variants);
25483
25838
  variants = variants.filter((variant) => requestedIds.has(variant.id));
25484
25839
  }
@@ -25540,6 +25895,15 @@ function buildBridgeGeneratorTheme(corners) {
25540
25895
  }
25541
25896
  };
25542
25897
  }
25898
+ z.object({
25899
+ palette: paletteColorsSchema,
25900
+ paletteMode: paletteModeSchema,
25901
+ typography: z.object({
25902
+ headingFamily: z.string().trim().min(1),
25903
+ bodyFamily: z.string().trim().min(1)
25904
+ }).strict(),
25905
+ corners
25906
+ }).strict();
25543
25907
  //#endregion
25544
25908
  //#region src/theme-bridge/generateCssVars.ts
25545
25909
  /**
@@ -25666,6 +26030,7 @@ function ThemeBridgeProvider({ config, children, className = "" }) {
25666
26030
  inputCss: runtime.inputCss,
25667
26031
  statusCss: runtime.statusCss,
25668
26032
  progressCss: runtime.progressCss,
26033
+ typographyCss: runtime.typographyCss,
25669
26034
  blockVarsCss: runtime.blockVarsCss,
25670
26035
  customCss: runtime.customCss,
25671
26036
  children