@riverbankcms/sdk 0.149.0 → 0.150.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 (165) hide show
  1. package/dist/EventEmbeddedCheckoutStep-D00Kc8Zj.mjs +285 -0
  2. package/dist/{PreviewEditorSidebar-DBKln68M.mjs → PreviewEditorSidebar-7ZhmmnBB.mjs} +3 -3
  3. package/dist/{PreviewEditorUI-DpRX4Mum.mjs → PreviewEditorUI-BIJucTRd.mjs} +2 -2
  4. package/dist/{SdkPreviewModeRuntime-DJPmPY-r.mjs → SdkPreviewModeRuntime-tj45gmCX.mjs} +4 -3
  5. package/dist/{SiteChromeCustomizeContext-JYA0cJ_Z.mjs → SiteChromeCustomizeContext-BFOt0ss-.mjs} +4454 -4059
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +660 -0
  7. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +510 -0
  8. package/dist/_dts/api/src/billing.d.ts +2 -2
  9. package/dist/_dts/api/src/contentRuntime.d.ts +5 -1
  10. package/dist/_dts/api/src/footerCompositionContracts.d.ts +9 -0
  11. package/dist/_dts/api/src/footerSettings.d.ts +3 -3
  12. package/dist/_dts/api/src/index.d.ts +1 -1
  13. package/dist/_dts/api/src/navigation/bookingPortalLink.d.ts +13 -0
  14. package/dist/_dts/api/src/navigation.d.ts +1 -0
  15. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +9 -173
  16. package/dist/_dts/api/src/sdkThemeWire.d.ts +12 -0
  17. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -3
  18. package/dist/_dts/api/src/siteSettings.d.ts +2 -0
  19. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -1
  20. package/dist/_dts/blocks/src/client.d.ts +2 -1
  21. package/dist/_dts/blocks/src/rendering/server.d.ts +1 -1
  22. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +30 -3
  23. package/dist/_dts/blocks/src/system/designCapabilities.d.ts +10 -1
  24. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  25. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +38 -18
  26. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +1 -1
  27. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.server.d.ts +6 -0
  28. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventEmbeddedCheckoutStep.d.ts +13 -0
  29. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationPayment.d.ts +15 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +0 -1
  31. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/FullyBookedStep.d.ts +6 -0
  32. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentBlockingPanel.d.ts +3 -0
  33. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentSelectionStep.d.ts +2 -0
  34. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +15 -5
  35. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +4 -2
  36. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/paymentLocation.d.ts +3 -0
  37. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/paymentResponse.d.ts +72 -0
  38. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationCompletion.d.ts +66 -5
  39. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationErrorRecovery.d.ts +1 -4
  40. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationStateMachine.d.ts +13 -5
  41. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/sessionStorage.d.ts +11 -52
  42. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +19 -2
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.d.ts +7 -42
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +7 -8
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +90 -24
  46. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useGuestRegistrationRecovery.d.ts +30 -0
  47. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/usePaymentStatusRecovery.d.ts +24 -12
  48. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useRegistrationAdmission.d.ts +18 -0
  49. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/wizardSteps.d.ts +6 -1
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +1 -1
  51. package/dist/_dts/blocks/src/system/runtime/shared/stripe/browserStripe.d.ts +8 -0
  52. package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +8 -0
  53. package/dist/_dts/commerce/src/purchase/checkoutCopy.d.ts +10 -0
  54. package/dist/_dts/commerce/src/purchase/checkoutPresentation.d.ts +49 -0
  55. package/dist/_dts/commerce/src/purchase/checkoutSessionMetadata.d.ts +4 -4
  56. package/dist/_dts/commerce/src/purchase/checkoutStripeFinalizationPlanning.d.ts +5 -1
  57. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +9 -0
  58. package/dist/_dts/commerce/src/purchase/index.d.ts +2 -0
  59. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +1 -0
  60. package/dist/_dts/commerce/src/purchase/stripeCheckoutReturnUrl.d.ts +9 -2
  61. package/dist/_dts/commerce/src/purchase/types.d.ts +5 -6
  62. package/dist/_dts/content-editor/src/FooterComposerOverview.d.ts +3 -2
  63. package/dist/_dts/content-editor/src/footerPreviewRuntime.d.ts +6 -1
  64. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +7 -0
  65. package/dist/_dts/core/src/index.d.ts +1 -0
  66. package/dist/_dts/core/src/patch/index.d.ts +30 -0
  67. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +30 -1
  68. package/dist/_dts/sdk/src/bookings/index.d.ts +2 -1
  69. package/dist/_dts/sdk/src/bookings/types.d.ts +1 -1
  70. package/dist/_dts/sdk/src/version.d.ts +1 -1
  71. package/dist/_dts/theme-core/src/blocks/index.d.ts +1 -0
  72. package/dist/_dts/theme-core/src/blocks/opaquePanels.d.ts +147 -0
  73. package/dist/_dts/theme-core/src/boxBackgroundSchema.d.ts +22 -0
  74. package/dist/_dts/theme-core/src/buttons/buttonSurfaceContext.d.ts +22 -0
  75. package/dist/_dts/theme-core/src/cards/roles.d.ts +12 -0
  76. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  77. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +198 -0
  78. package/dist/_dts/theme-core/src/palette/utils/index.d.ts +2 -0
  79. package/dist/_dts/theme-core/src/palette/utils/scrimContrast.d.ts +22 -0
  80. package/dist/_dts/theme-core/src/runtime/bridgeColourTokens.d.ts +10 -0
  81. package/dist/_dts/theme-core/src/schema.d.ts +330 -0
  82. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +0 -51
  83. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +0 -51
  84. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +11 -0
  85. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorCapabilities.d.ts +7 -1
  86. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +7 -1
  87. package/dist/_dts/theme-core/src/site-styles/previewRuntimeCapabilities.d.ts +12 -6
  88. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +7 -4
  89. package/dist/_dts/theme-core/src/site-styles/sectionSurfaceBackgrounds.d.ts +65 -0
  90. package/dist/_dts/theme-core/src/site-styles/types.d.ts +17 -0
  91. package/dist/_dts/theme-core/src/surfaces/opaqueSurface.d.ts +43 -0
  92. package/dist/client/{BookingMailingListNote-Cr3EeTP5.mjs → BookingMailingListNote-CYHOufsI.mjs} +10 -440
  93. package/dist/client/{CheckboxChoice-B33MqoUo.mjs → CheckboxChoice-M-3HycLw.mjs} +1 -1
  94. package/dist/client/{DemoBookingPortalAccess-BFGB1Fay.mjs → DemoBookingPortalAccess-Cvr9O_ca.mjs} +2 -2
  95. package/dist/client/{EventCombined.client-DKYV0_ft.mjs → EventCombined.client-m5UZIobP.mjs} +7 -7
  96. package/dist/client/EventEmbeddedCheckoutStep-DL6zFAkA.mjs +289 -0
  97. package/dist/client/{EventListing.client-B9UIcEYc.mjs → EventListing.client-DeMfCM04.mjs} +2 -2
  98. package/dist/client/{LeafletStaticMap-CFLPkP0K.mjs → LeafletStaticMap-CvZ3gOdD.mjs} +1 -1
  99. package/dist/client/{checkoutUrls-CXhko2Rv.mjs → RichText-BtfNvQV6.mjs} +2 -29
  100. package/dist/client/{TerminalPanel-JjmgxEsR.mjs → TerminalPanel-CUCNEwlH.mjs} +2 -18
  101. package/dist/client/{ThemedButton-CKV1Jh2m.mjs → ThemedButton-C7WhXuRl.mjs} +2 -2
  102. package/dist/client/{accordion-DXWIfT3T.mjs → accordion-cQm5mjqs.mjs} +1 -1
  103. package/dist/client/{bookingForm-CjZgHNvv.mjs → bookingForm-BVPJE5RQ.mjs} +11 -10
  104. package/dist/client/bookings.mjs +2668 -1134
  105. package/dist/client/{carousel-DSLikmvZ.mjs → carousel-3vgnY7LC.mjs} +2 -2
  106. package/dist/client/{carousel.client-A2lG-9od.mjs → carousel.client-CISsdZvg.mjs} +1 -1
  107. package/dist/client/{cart-HDjWReFt.mjs → cart-BGK4oOjm.mjs} +3 -3
  108. package/dist/client/{checkout-CUvRZA3W.mjs → checkout-GsBLUNJD.mjs} +3 -3
  109. package/dist/client/checkoutUrls-ChxwaNtO.mjs +28 -0
  110. package/dist/client/client.mjs +3042 -1868
  111. package/dist/client/{colorStyles-j5U9v5JA.mjs → colorStyles-D-32xHZh.mjs} +2 -30
  112. package/dist/client/{context-DFmaZa-Q.mjs → context-D_8s12Fp.mjs} +1 -1
  113. package/dist/client/{dates-BBep1JnF.mjs → dates-DeJQbQ9T.mjs} +2 -2
  114. package/dist/client/{eventCalendar-zEobhxo4.mjs → eventCalendar-cmucD4NR.mjs} +10 -10
  115. package/dist/client/{eventCombined-Dp7bz5k-.mjs → eventCombined-ku3E9FTl.mjs} +4 -4
  116. package/dist/client/{eventDetails-FE-zqTt7.mjs → eventDetails-CyKZ61sF.mjs} +5 -5
  117. package/dist/client/{eventListing-BMt5snal.mjs → eventListing-B7yxGIhX.mjs} +4 -4
  118. package/dist/client/{eventRegistration-O6ZxHfOb.mjs → eventRegistration-BoXfSFgZ.mjs} +1403 -857
  119. package/dist/client/{form-DFa1D8vt.mjs → form-CNQOWhJo.mjs} +5 -5
  120. package/dist/client/{headerSection-CmjHLR-N.mjs → headerSection-DahaBJGQ.mjs} +3 -3
  121. package/dist/client/hooks.mjs +123 -64
  122. package/dist/client/{locationMap-BXKP_lGh.mjs → locationMap-BoDjqYlW.mjs} +4 -4
  123. package/dist/client/{media-Cl38iOMI.mjs → media-BFY0y2rb.mjs} +2 -1
  124. package/dist/client/{newsletterForm-CU-HmxGx.mjs → newsletterForm-DtzXDklw.mjs} +4 -4
  125. package/dist/client/{pricing-KEAEsibq.mjs → pricing-DXEh2Lhh.mjs} +1 -1
  126. package/dist/client/{productDetail-Ckp7MGnt.mjs → productDetail-D7cPa-00.mjs} +3 -3
  127. package/dist/client/{productList-D91V0sYa.mjs → productList-D1XMap66.mjs} +3 -3
  128. package/dist/client/{propsDecoder-DZd6RJeA.mjs → propsDecoder-DiIeBopB.mjs} +758 -245
  129. package/dist/client/rendering/client.mjs +4381 -2892
  130. package/dist/client/rendering/islands.mjs +19 -19
  131. package/dist/client/rendering.mjs +3026 -1852
  132. package/dist/client/result-DRW7JWXz.mjs +30 -0
  133. package/dist/client/{routeIslandApiConfig-E1EkhhYY.mjs → routeIslandApiConfig-wzR4lKAY.mjs} +1 -1
  134. package/dist/client/scrollToBlock-C86BYkyV.mjs +17 -0
  135. package/dist/client/{shop-4F2jLQPI.mjs → shop-CYT5P-S5.mjs} +8 -8
  136. package/dist/client/{shop-commerce-store-vicweP2K.mjs → shop-commerce-store-wKhsJQxI.mjs} +1 -1
  137. package/dist/client/{shop-commerce-BbfCJjB3.mjs → shop-commerce-ypBu_dx4.mjs} +9 -9
  138. package/dist/client/{shopShared-DlONJt0T.mjs → shopShared-DFGhYrf2.mjs} +52 -6
  139. package/dist/client/{useEventFilters-COYyL3m7.mjs → useEventFilters-blSbN5o7.mjs} +8 -8
  140. package/dist/preview-next/client/runtime.mjs +3 -3
  141. package/dist/{sdk-runtime-CwvFFjB-.mjs → sdk-runtime-2p8uQk1V.mjs} +1 -1
  142. package/dist/{separator-ByL72zUT.mjs → separator-Cvvzk0Oo.mjs} +1 -1
  143. package/dist/server/components.mjs +4066 -3765
  144. package/dist/server/config-validation.mjs +185 -126
  145. package/dist/server/config.mjs +185 -126
  146. package/dist/server/data.mjs +123 -64
  147. package/dist/server/index.mjs +1 -1
  148. package/dist/server/next.mjs +615 -314
  149. package/dist/server/page-converter.mjs +100 -56
  150. package/dist/server/prebuild.mjs +1 -1
  151. package/dist/server/rendering/server.mjs +4041 -3751
  152. package/dist/server/rendering.mjs +4069 -3768
  153. package/dist/server/routing.mjs +149 -72
  154. package/dist/server/server.mjs +124 -65
  155. package/dist/server/theme-bridge.mjs +1122 -310
  156. package/dist/server/theme.mjs +126 -116
  157. package/dist/spinner-CDo6AkDz.mjs +658 -0
  158. package/dist/styles/index.css +75 -212
  159. package/package.json +1 -1
  160. package/dist/_dts/billing/src/checkout/platform.d.ts +0 -77
  161. package/dist/_dts/billing/src/config/env.d.ts +0 -29
  162. package/dist/_dts/billing/src/stripe/client.d.ts +0 -29
  163. package/dist/_dts/blocks/src/system/runtime/hooks/usePaymentVerification.d.ts +0 -63
  164. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +0 -9
  165. package/dist/client/urlParams-D71VXFGx.mjs +0 -47
@@ -1136,6 +1136,13 @@ const parseEventSeriesId = (value) => parseUuidBrand$1(value, unsafeAsEventSerie
1136
1136
  function assertNever$20(value, message = "Unexpected variant") {
1137
1137
  throw new Error(`${message}: ${String(value)}`);
1138
1138
  }
1139
+ //#endregion
1140
+ //#region ../core/src/currency-format.ts
1141
+ const CURRENCY_CODE_INPUT_PATTERN = /^[A-Za-z]{3}$/;
1142
+ /** Parse + normalize a currency code, or return null if it isn't a 3-letter code. */
1143
+ function parseCurrencyCode(value) {
1144
+ return CURRENCY_CODE_INPUT_PATTERN.test(value) ? value.toUpperCase() : null;
1145
+ }
1139
1146
  const CURRENCY_LOCALE_BY_CODE = {
1140
1147
  USD: "en-US",
1141
1148
  GBP: "en-GB",
@@ -1196,6 +1203,16 @@ function formatCurrencyMajorUnits(amount, currency, options) {
1196
1203
  return `${amount.toFixed(2)} ${currencyCode}`;
1197
1204
  }
1198
1205
  }
1206
+ function unsafeAsNonNegativeCents(value) {
1207
+ return value;
1208
+ }
1209
+ /**
1210
+ * Normalizes a derived amount to non-negative whole cents. This intentionally
1211
+ * clamps negatives to zero; use parseNonNegativeCents for validation.
1212
+ */
1213
+ function toNonNegativeCents(value) {
1214
+ return unsafeAsNonNegativeCents(Math.max(0, Math.trunc(value)));
1215
+ }
1199
1216
  /** Default clock for production callers that do not inject time explicitly. */
1200
1217
  const systemPlanningClock = { now: () => Date.now() };
1201
1218
  /** Resolve current time as a Date from an explicit Date, injected clock, or system clock. */
@@ -5737,10 +5754,10 @@ function resolveOpaqueSurfaceHex(reference, palette, underlayReference) {
5737
5754
  const parts = parseColorTokenParts(reference);
5738
5755
  if (parts.kind === "token" && parts.opacityPercent !== null) {
5739
5756
  const foregroundHex = normalizePaletteHex(palette[parts.token] ?? "");
5740
- return foregroundHex ? compositeHex$1(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
5757
+ return foregroundHex ? compositeHex$2(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
5741
5758
  }
5742
5759
  const rgba = parseRgba(parts.kind === "raw" ? parts.value : reference);
5743
- return rgba ? compositeHex$1(rgbToHex$1(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
5760
+ return rgba ? compositeHex$2(rgbToHex$1(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
5744
5761
  }
5745
5762
  /** Resolve a colour reference only when it is already fully opaque. */
5746
5763
  function resolveConcreteColorHex(reference, palette) {
@@ -5756,7 +5773,7 @@ function resolveConcreteColorHex(reference, palette) {
5756
5773
  if (literal.toLowerCase() === "white") return "#ffffff";
5757
5774
  return normalizePaletteHex(literal);
5758
5775
  }
5759
- function compositeHex$1(foregroundHex, underlayHex, alpha) {
5776
+ function compositeHex$2(foregroundHex, underlayHex, alpha) {
5760
5777
  const foreground = hexToRgb$1(foregroundHex);
5761
5778
  const underlay = hexToRgb$1(underlayHex);
5762
5779
  const channel = (foregroundValue, underlayValue) => Math.round(foregroundValue * alpha + underlayValue * (1 - alpha));
@@ -7839,6 +7856,35 @@ function fallbackBackground(fallbackToken, palette) {
7839
7856
  reason: "unresolvable-colour"
7840
7857
  };
7841
7858
  }
7859
+ /**
7860
+ * The complete button context a surface publishes: `--rb-action-*` variables
7861
+ * for every role, resolved against the surface when its colour is provable,
7862
+ * and an explicit reset when it is not (image, gradient, composited), so a
7863
+ * nested surface never inherits a context resolved for an outer band.
7864
+ * A surface with no background of its own publishes nothing and inherits.
7865
+ *
7866
+ * Sections (through the blocks background transforms), card roles and opaque
7867
+ * block panels all publish through this one function.
7868
+ */
7869
+ function surfaceButtonContextStyles(input) {
7870
+ if (!input.buttonSystem) return {};
7871
+ const context = deriveButtonSurfaceContext(input.surface, input.palette, input.fallbackToken);
7872
+ if (context.kind !== "known-solid") return context.reason === "missing-background" ? {} : contextualButtonSurfaceResetStyles();
7873
+ return knownSurfaceButtonContextStyles({
7874
+ surface: context.surface,
7875
+ palette: input.palette,
7876
+ buttonSystem: input.buttonSystem
7877
+ });
7878
+ }
7879
+ /** Every role's contextual styles against one proven solid surface. */
7880
+ function knownSurfaceButtonContextStyles(input) {
7881
+ return Object.fromEntries(VARIANT_ROLES.flatMap((role) => Object.entries(contextualButtonSurfaceStyles(resolveContextualButtonRole({
7882
+ role,
7883
+ buttonSystem: input.buttonSystem,
7884
+ palette: input.palette,
7885
+ surface: input.surface
7886
+ })))));
7887
+ }
7842
7888
  function resolveContextualButtonRole(input) {
7843
7889
  const requested = findVariant(input.buttonSystem, input.role);
7844
7890
  if (!requested) return {
@@ -10816,6 +10862,57 @@ function resolveCardRole(theme, cardSystem, role) {
10816
10862
  }
10817
10863
  }
10818
10864
  //#endregion
10865
+ //#region ../theme-core/src/surfaces/opaqueSurface.ts
10866
+ function opaqueSurfaceContextFromTheme(theme) {
10867
+ return {
10868
+ palette: expandPalette(theme.palette),
10869
+ buttonSystem: theme.buttons,
10870
+ linkHoverToken: theme.typography.proseLinkStyle?.hoverColorToken
10871
+ };
10872
+ }
10873
+ /**
10874
+ * The declarations that make an element own its surface: `color`, every
10875
+ * `--rb-surface-*` role and every `--rb-action-*` variable. Card roles and
10876
+ * opaque block panels both publish through this, so a nested surface can never
10877
+ * inherit a band's light text or its band-resolved buttons.
10878
+ */
10879
+ function opaqueSurfaceDeclarations(paint, context) {
10880
+ if (paint.kind === "transparent") return inheritedSurfaceDeclarations();
10881
+ const textToken = paint.foregroundToken ?? "text";
10882
+ const foreground = resolveSurfaceForeground(paint.kind === "solid" ? {
10883
+ type: "color",
10884
+ color: paint.token,
10885
+ textColor: textToken
10886
+ } : {
10887
+ type: "gradient",
10888
+ textColor: textToken
10889
+ }, context.palette, { linkHover: context.linkHoverToken });
10890
+ const buttonContext = context.buttonSystem ? surfaceButtonContextStyles({
10891
+ surface: paint.kind === "solid" ? {
10892
+ kind: "solid",
10893
+ color: paint.token,
10894
+ foreground: foreground.kind === "known" ? foreground.roles.link : void 0,
10895
+ composited: false
10896
+ } : { kind: "gradient" },
10897
+ palette: context.palette,
10898
+ buttonSystem: context.buttonSystem
10899
+ }) : contextualButtonSurfaceResetStyles();
10900
+ return [...surfaceForegroundDeclarations(foreground.kind === "known" ? surfaceForegroundInputFromResolved(foreground, rgbColorValue) : { text: colorValue(textToken) }), ...Object.entries(buttonContext).map(([property, value]) => `${property}: ${value};`)];
10901
+ }
10902
+ function colorValue(token) {
10903
+ const parsed = parseThemeColorToken(token);
10904
+ return parsed ? rgbColorValue(parsed) : token;
10905
+ }
10906
+ /** Every property a surface publishes, set to `inherit`. */
10907
+ function inheritedSurfaceDeclarations() {
10908
+ return [
10909
+ "color",
10910
+ ...Object.values(SURFACE_FOREGROUND_CSS_VARS),
10911
+ "--rb-surface-link-hover-decoration",
10912
+ ...Object.keys(contextualButtonSurfaceResetStyles())
10913
+ ].map((property) => `${property}: inherit;`);
10914
+ }
10915
+ //#endregion
10819
10916
  //#region ../theme-core/src/utils/cssDeclarations.ts
10820
10917
  /** Render CSS declarations whether callers provide terminators or fragments. */
10821
10918
  function renderCssDeclarations(declarations) {
@@ -10950,15 +11047,18 @@ function generateVariantCSS(variant, themeId, cardClasses, tokens, theme, palett
10950
11047
  }
10951
11048
  function cardSurfaceRules(variant, tokens, theme, palette) {
10952
11049
  if (variant.background.type === "transparent") return ["background: transparent"];
10953
- const foreground = resolveSurfaceForeground(variant.background.type === "solid" ? {
10954
- type: "color",
10955
- color: variant.background.colorToken,
10956
- textColor: variant.foregroundToken ?? "text"
11050
+ return [cardBackgroundRule(variant.background, tokens), ...opaqueSurfaceDeclarations(variant.background.type === "solid" ? {
11051
+ kind: "solid",
11052
+ token: variant.background.colorToken,
11053
+ foregroundToken: variant.foregroundToken
10957
11054
  } : {
10958
- type: "gradient",
10959
- textColor: variant.foregroundToken ?? "text"
10960
- }, palette, { linkHover: theme.typography.proseLinkStyle?.hoverColorToken });
10961
- return [cardBackgroundRule(variant.background, tokens), ...surfaceForegroundDeclarations(foreground.kind === "known" ? surfaceForegroundInputFromResolved(foreground, (token) => tokens.getColor(token)) : { text: tokens.getColor(variant.foregroundToken ?? "text") })];
11055
+ kind: "gradient",
11056
+ foregroundToken: variant.foregroundToken
11057
+ }, {
11058
+ palette,
11059
+ buttonSystem: theme.buttons,
11060
+ linkHoverToken: theme.typography.proseLinkStyle?.hoverColorToken
11061
+ })];
10962
11062
  }
10963
11063
  function cardBackgroundRule(background, tokens) {
10964
11064
  if (background.type === "solid") return `background: ${tokens.getColor(background.colorToken)}`;
@@ -11957,6 +12057,18 @@ function brandNonEmptyString(value, label) {
11957
12057
  if (value.length === 0) throw new Error(`${label} must be a non-empty string.`);
11958
12058
  return value;
11959
12059
  }
12060
+ /**
12061
+ * What a block's own section background field admits, read from its manifest.
12062
+ * A site style's surface rule may paint a gradient or a photo; a block whose
12063
+ * `_sectionStyles.background` refuses that paint would be dropped at render
12064
+ * admission, so the runtime compiler paints the surface's colour equivalent
12065
+ * instead (see `compileSectionBackground`).
12066
+ */
12067
+ const sectionBackgroundPaintValues = [
12068
+ "color",
12069
+ "gradient",
12070
+ "image"
12071
+ ];
11960
12072
  const plainFrame = { kind: "plain" };
11961
12073
  function panelFrame(treatment) {
11962
12074
  return {
@@ -12043,6 +12155,7 @@ function defineBlockDesignCapability(capability) {
12043
12155
  ...capability,
12044
12156
  kind: "designed",
12045
12157
  looks: capability.looks ?? "not-applicable",
12158
+ sectionBackgroundPaints: admittedSectionBackgroundPaints(capability.sectionBackgroundPaints),
12046
12159
  sectionHeights: capability.sectionHeights ?? ["default"],
12047
12160
  imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
12048
12161
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
@@ -12055,6 +12168,10 @@ function defineBlockDesignCapability(capability) {
12055
12168
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
12056
12169
  };
12057
12170
  }
12171
+ /** Absent means the block admits every section background paint. */
12172
+ function admittedSectionBackgroundPaints(paints) {
12173
+ return paints ?? sectionBackgroundPaintValues;
12174
+ }
12058
12175
  //#endregion
12059
12176
  //#region ../theme-core/src/site-styles/logoBranding.ts
12060
12177
  const logoTextConfidenceValues = [
@@ -12480,12 +12597,22 @@ const mediaPresentationSchema = commonSchema.extend({
12480
12597
  const boxBackgroundSchema = z$1.discriminatedUnion("type", [
12481
12598
  commonSchema.extend({
12482
12599
  type: z$1.literal("color"),
12483
- color: tokenOrCssColorValueSchema.nullable().optional()
12600
+ color: tokenOrCssColorValueSchema.nullable().optional(),
12601
+ /**
12602
+ * Compiler-owned. The scrim a site-style colour surface lays over media
12603
+ * that replaces it (a Look's band meeting an authored photo), sized so the
12604
+ * surface's foreground stays legible over any pixel. A colour background
12605
+ * never draws it itself; `resolveSectionBackground` moves it onto the
12606
+ * merged media background as its overlay.
12607
+ */
12608
+ mediaScrim: boxBackgroundOverlaySchema.nullable().optional()
12484
12609
  }),
12485
12610
  commonSchema.extend({
12486
12611
  type: z$1.literal("gradient"),
12487
12612
  gradient: z$1.string().nullable().optional(),
12488
- gradientPresetId: z$1.string().min(1).nullable().optional()
12613
+ gradientPresetId: z$1.string().min(1).nullable().optional(),
12614
+ /** Compiler-owned; see the colour branch. */
12615
+ mediaScrim: boxBackgroundOverlaySchema.nullable().optional()
12489
12616
  }),
12490
12617
  mediaPresentationSchema.extend({
12491
12618
  type: z$1.literal("image"),
@@ -13260,7 +13387,7 @@ function isRecord$27(value) {
13260
13387
  * callsites even though arrays pass at runtime. Follow-up cleanup should replace
13261
13388
  * this API with a more precise predicate type and migrate consumers.
13262
13389
  */
13263
- function isObjectRecord$1(value) {
13390
+ function isObjectRecord$3(value) {
13264
13391
  return typeof value === "object" && value !== null;
13265
13392
  }
13266
13393
  //#endregion
@@ -15275,6 +15402,17 @@ function defineBlockAppearancePreset(preset) {
15275
15402
  * (`defineBlockAppearancePreset` defaults it to `none`) — the block's own
15276
15403
  * composition still governs how its items look. The per-Look rationale for the card-bearing ones lives
15277
15404
  * in `.project/plans/1297-card-role-contract-site-styles-own-card-surfaces/mapping-table.md`.
15405
+ *
15406
+ * A Look asking for the `alternative` or `open` role is offered only where the
15407
+ * site style defines that role (`siteStyleSupportsLookDesign`), so two Looks
15408
+ * that differ only in role are distinct wherever both are offered.
15409
+ *
15410
+ * Retiring a Look is removing its entry. A stored pin to a retired id reads as
15411
+ * an unsupported pin in the page design editor model and renders the block's
15412
+ * auto Look, the same path an unavailable Look takes. Duplicates retired in
15413
+ * the 2026-09 Look audit: `feature-cards-soft-panels`,
15414
+ * `feature-cards-photo-tiles`, `feature-cards-editorial-pathways`,
15415
+ * `testimonials-default-cards`.
15278
15416
  */
15279
15417
  const brandScrimOptionGroups = [{
15280
15418
  id: "image-surface-treatment",
@@ -15659,16 +15797,6 @@ defineBlockAppearancePreset({
15659
15797
  treatment: "framed-programme"
15660
15798
  }
15661
15799
  }
15662
- }), defineBlockAppearancePreset({
15663
- id: "feature-cards-soft-panels",
15664
- target: "feature-cards",
15665
- label: "Soft tinted panels",
15666
- blockKinds: ["block.feature-cards"],
15667
- design: {
15668
- sectionSurface: "base",
15669
- contentFrame: plainFrame,
15670
- cardRole: "alternative"
15671
- }
15672
15800
  }), defineBlockAppearancePreset({
15673
15801
  id: "feature-cards-editorial-diptych",
15674
15802
  target: "feature-cards",
@@ -15680,27 +15808,6 @@ defineBlockAppearancePreset({
15680
15808
  contentFrame: plainFrame,
15681
15809
  cardRole: "default"
15682
15810
  }
15683
- }), defineBlockAppearancePreset({
15684
- id: "feature-cards-editorial-pathways",
15685
- target: "feature-cards",
15686
- label: "Editorial pathways",
15687
- blockKinds: ["block.feature-cards"],
15688
- constraints: { layoutVariantKeys: ["editorial-pathways"] },
15689
- design: {
15690
- sectionSurface: "base",
15691
- contentFrame: plainFrame,
15692
- cardRole: "default"
15693
- }
15694
- }), defineBlockAppearancePreset({
15695
- id: "feature-cards-photo-tiles",
15696
- target: "feature-cards",
15697
- label: "Photo tiles",
15698
- blockKinds: ["block.feature-cards"],
15699
- design: {
15700
- sectionSurface: "base",
15701
- contentFrame: plainFrame,
15702
- cardRole: "default"
15703
- }
15704
15811
  }), defineBlockAppearancePreset({
15705
15812
  id: "events-lined-panel",
15706
15813
  target: "events",
@@ -15789,16 +15896,6 @@ defineBlockAppearancePreset({
15789
15896
  contentFrame: panelFrame("raised"),
15790
15897
  cardRole: "default"
15791
15898
  }
15792
- }), defineBlockAppearancePreset({
15793
- id: "testimonials-default-cards",
15794
- target: "testimonials",
15795
- label: "Default cards",
15796
- blockKinds: ["block.testimonials"],
15797
- design: {
15798
- sectionSurface: "base",
15799
- contentFrame: plainFrame,
15800
- cardRole: "default"
15801
- }
15802
15899
  }), defineBlockAppearancePreset({
15803
15900
  id: "testimonials-statement-cards",
15804
15901
  target: "testimonials",
@@ -19685,6 +19782,17 @@ asLayoutVariantKey("classic");
19685
19782
  asLayoutVariantKey("micro");
19686
19783
  asBoundaryOptionId("break:wave");
19687
19784
  //#endregion
19785
+ //#region ../theme-core/src/palette/utils/scrimContrast.ts
19786
+ const WHITE = "#ffffff";
19787
+ const BLACK = "#000000";
19788
+ /** `top` at `alpha` over opaque `bottom`, blended as CSS paints an overlay. */
19789
+ function compositeHex(topHex, alpha, bottomHex) {
19790
+ const top = hexToRgb$1(topHex);
19791
+ const bottom = hexToRgb$1(bottomHex);
19792
+ const mix = (a, b) => Math.round(alpha * a + (1 - alpha) * b);
19793
+ return rgbToHex$1(mix(top.r, bottom.r), mix(top.g, bottom.g), mix(top.b, bottom.b));
19794
+ }
19795
+ //#endregion
19688
19796
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
19689
19797
  function defineSectionForegroundRuntimeTokens(input) {
19690
19798
  return {
@@ -20808,9 +20916,7 @@ const curatedSiteStyles = [
20808
20916
  recommendedAppearancePresetIds: [
20809
20917
  "hero-split-editorial",
20810
20918
  "intro-portrait-bio",
20811
- "feature-cards-soft-panels",
20812
- "feature-cards-editorial-columns",
20813
- "feature-cards-photo-tiles",
20919
+ "feature-cards-bold-colors",
20814
20920
  "testimonials-non-carded",
20815
20921
  "faq-contained-help",
20816
20922
  "contact-form-panel"
@@ -21454,8 +21560,7 @@ const curatedSiteStyles = [
21454
21560
  "intro-portrait-bio",
21455
21561
  "feature-cards-editorial-columns",
21456
21562
  "feature-cards-editorial-diptych",
21457
- "feature-cards-editorial-pathways",
21458
- "feature-cards-soft-panels",
21563
+ "feature-cards-bold-colors",
21459
21564
  "events-lined-panel",
21460
21565
  "testimonials-non-carded",
21461
21566
  "faq-base-accordion",
@@ -22515,7 +22620,7 @@ function generateHeaderCss(options) {
22515
22620
  }));
22516
22621
  cssChunks.push(generateLogoTextBehaviorStyles(header.logoText, themeId));
22517
22622
  cssChunks.push(generateHeaderNavLinkStyles(header, themeId, tokens, theme, headerContrastTreatment, headerNavTextSize));
22518
- cssChunks.push(generateDropdownContainerStyles(header, themeId, tokens));
22623
+ cssChunks.push(generateDropdownContainerStyles(header, themeId, tokens, theme));
22519
22624
  cssChunks.push(generateDropdownLinkStyles(header, themeId, tokens, theme));
22520
22625
  cssChunks.push(generateDropdownCaretStyles(themeId));
22521
22626
  cssChunks.push(generateDropdownTriggerOverrides(header, themeId));
@@ -22602,15 +22707,14 @@ function generateLogoTextBehaviorStyles(logoText, themeId) {
22602
22707
  /**
22603
22708
  * Generate dropdown menu container styles
22604
22709
  */
22605
- function generateDropdownContainerStyles(header, themeId, tokens) {
22710
+ function generateDropdownContainerStyles(header, themeId, tokens, theme) {
22606
22711
  const selector = `:where([data-theme-scope="${themeId}"]) .nav-dropdown-menu`;
22607
22712
  const rules = [];
22608
22713
  const dropdownStyle = header.dropdownStyle;
22609
22714
  rules.push(...NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES);
22610
- const bgToken = dropdownStyle?.background ?? "surface";
22611
- rules.push(`background-color: ${tokens.getColor(bgToken)};`);
22612
- const textToken = dropdownStyle?.textColor ?? "text";
22613
- rules.push(`color: ${tokens.getColor(textToken)};`);
22715
+ const surface = resolveDropdownSurface(header, theme);
22716
+ rules.push(`background-color: ${tokens.getColor(surface.backgroundToken)};`);
22717
+ rules.push(...surface.declarations(tokens));
22614
22718
  const borderToken = dropdownStyle?.borderColor;
22615
22719
  if (borderToken === null) rules.push(`border: none;`);
22616
22720
  else rules.push(`border: 1px solid ${tokens.getColor(borderToken ?? "border")};`);
@@ -22628,7 +22732,7 @@ function generateDropdownContainerStyles(header, themeId, tokens) {
22628
22732
  }
22629
22733
  function generateDropdownLinkStyles(header, themeId, tokens, theme) {
22630
22734
  const configuredDropdownStyle = header.dropdownStyle;
22631
- const textColorToken = configuredDropdownStyle?.textColor ?? ((header.navColor ?? header.textColor)?.trim() || "text");
22735
+ const textColorToken = resolveDropdownSurface(header, theme).textToken;
22632
22736
  const hoverBgToken = configuredDropdownStyle?.hoverBackground ?? textColorToken;
22633
22737
  const hoverEffects = {
22634
22738
  hover: hoverBgToken === null ? [] : [{
@@ -22717,21 +22821,35 @@ ${`:where([data-theme-scope="${themeId}"]) .nav-dropdown-trigger.header-nav-link
22717
22821
  `.trim();
22718
22822
  }
22719
22823
  /**
22824
+ * The dropdown menu and mobile panel share one surface: `dropdownStyle`'s
22825
+ * background, with the text candidate (the dropdown's own colour, then the
22826
+ * header's nav colour) validated against it through the surface contract. The
22827
+ * nav colour is chosen for the header bar, which can be dark or transparent,
22828
+ * so it only carries over when it is legible on the menu too.
22829
+ */
22830
+ function resolveDropdownSurface(header, theme) {
22831
+ const backgroundToken = header.dropdownStyle?.background ?? "surface";
22832
+ const candidate = header.dropdownStyle?.textColor ?? ((header.navColor ?? header.textColor)?.trim() || "text");
22833
+ const foreground = resolveSurfaceForeground({
22834
+ type: "color",
22835
+ color: backgroundToken,
22836
+ textColor: candidate
22837
+ }, expandPalette(theme.palette));
22838
+ return {
22839
+ backgroundToken,
22840
+ textToken: foreground.kind === "known" ? foreground.roles.text : candidate,
22841
+ declarations: (tokens) => foreground.kind === "known" ? surfaceForegroundDeclarations(surfaceForegroundInputFromResolved(foreground, (token) => tokens.getColor(token))) : [`color: ${tokens.getColor(candidate)};`]
22842
+ };
22843
+ }
22844
+ /**
22720
22845
  * Generate mobile navigation panel styles
22721
22846
  * Uses the same dropdownStyle settings as the desktop dropdown menus
22722
22847
  */
22723
22848
  function generateMobilePanelStyles(header, themeId, tokens, theme) {
22724
22849
  const selector = `:where([data-theme-scope="${themeId}"]) .nav-mobile-panel`;
22725
22850
  const selfSelector = `:where(.nav-mobile-panel[data-theme-scope="${themeId}"])`;
22726
- const dropdownStyle = header.dropdownStyle;
22727
- const bgToken = dropdownStyle?.background ?? "surface";
22728
- const textToken = dropdownStyle?.textColor ?? "text";
22729
- const foreground = resolveSurfaceForeground({
22730
- type: "color",
22731
- color: bgToken,
22732
- textColor: textToken
22733
- }, expandPalette(theme.palette));
22734
- const body = renderCssDeclarations([`background-color: ${tokens.getColor(bgToken)};`, ...foreground.kind === "known" ? surfaceForegroundDeclarations(surfaceForegroundInputFromResolved(foreground, (token) => tokens.getColor(token))) : [`color: ${tokens.getColor(textToken)};`]]);
22851
+ const surface = resolveDropdownSurface(header, theme);
22852
+ const body = renderCssDeclarations([`background-color: ${tokens.getColor(surface.backgroundToken)};`, ...surface.declarations(tokens)]);
22735
22853
  return `\n${selector} {\n ${body}\n}\n\n${selfSelector} {\n ${body}\n}\n`;
22736
22854
  }
22737
22855
  /**
@@ -23044,15 +23162,11 @@ function resolveContextualButtonStyles(background, foreground, context, options)
23044
23162
  if (!paletteCache.has(palette)) paletteCache.set(palette, surfaceCache);
23045
23163
  const cached = surfaceCache.get(cacheKey);
23046
23164
  if (cached) return cached;
23047
- const styles = Object.fromEntries(VARIANT_ROLES.flatMap((role) => {
23048
- const resolution = resolveContextualButtonRole({
23049
- role,
23050
- buttonSystem,
23051
- palette,
23052
- surface: surface.surface
23053
- });
23054
- return Object.entries(contextualButtonSurfaceStyles(resolution));
23055
- }));
23165
+ const styles = knownSurfaceButtonContextStyles({
23166
+ surface: surface.surface,
23167
+ palette,
23168
+ buttonSystem
23169
+ });
23056
23170
  surfaceCache.set(cacheKey, styles);
23057
23171
  return styles;
23058
23172
  }
@@ -29137,6 +29251,94 @@ function deepEqualJsonValue(left, right) {
29137
29251
  return false;
29138
29252
  }
29139
29253
  //#endregion
29254
+ //#region ../commerce/src/purchase/checkoutSessionMetadata.ts
29255
+ const datedOfferingSharedEngineMetadataShape = {
29256
+ datedOfferingEngineContractVersion: z$1.literal("shared_v1"),
29257
+ datedOfferingEngineRouteKind: z$1.literal("shared_whole_series_registration"),
29258
+ datedOfferingCapacityHoldId: z$1.string().uuid(),
29259
+ datedOfferingCapacityHoldAuditRef: z$1.string().uuid(),
29260
+ customerId: z$1.string().uuid(),
29261
+ eventSeriesId: z$1.string().uuid()
29262
+ };
29263
+ z$1.object(datedOfferingSharedEngineMetadataShape);
29264
+ const orderCheckoutSessionMetadataBaseShape = {
29265
+ type: z$1.literal("order"),
29266
+ site_id: z$1.string().uuid(),
29267
+ order_id: z$1.string().uuid().optional(),
29268
+ customer_email: z$1.string().email().optional(),
29269
+ customer_name: z$1.string().optional(),
29270
+ product_id: z$1.string().uuid().optional(),
29271
+ attendee_id: z$1.string().uuid().optional(),
29272
+ occurrence_id: z$1.string().uuid().optional(),
29273
+ tickets_count: z$1.string().optional(),
29274
+ notes: z$1.string().optional(),
29275
+ discount_redemption_id: z$1.string().uuid().optional(),
29276
+ discount_code_id: z$1.string().uuid().optional(),
29277
+ discount_code: z$1.string().optional(),
29278
+ discount_public_label: z$1.string().optional(),
29279
+ credit_reservation_id: z$1.string().uuid().optional(),
29280
+ credit_reserved_cents: z$1.string().optional(),
29281
+ discount_code_amount_cents: z$1.string().optional(),
29282
+ order_payment_reason: z$1.enum([
29283
+ "instalment_payoff",
29284
+ "flexible_balance_initial",
29285
+ "flexible_balance_paydown"
29286
+ ]).optional(),
29287
+ order_payment_plan_id: z$1.string().uuid().optional(),
29288
+ order_flexible_balance_contract_id: z$1.string().uuid().optional()
29289
+ };
29290
+ const absentDatedOfferingSharedEngineMetadataShape = {
29291
+ datedOfferingEngineContractVersion: z$1.never().optional(),
29292
+ datedOfferingEngineRouteKind: z$1.never().optional(),
29293
+ datedOfferingCapacityHoldId: z$1.never().optional(),
29294
+ datedOfferingCapacityHoldAuditRef: z$1.never().optional(),
29295
+ customerId: z$1.never().optional(),
29296
+ eventSeriesId: z$1.never().optional()
29297
+ };
29298
+ const LegacyOrderCheckoutSessionMetadataSchema = z$1.object({
29299
+ ...orderCheckoutSessionMetadataBaseShape,
29300
+ ...absentDatedOfferingSharedEngineMetadataShape
29301
+ });
29302
+ const SharedDatedOfferingOrderCheckoutSessionMetadataSchema = z$1.object({
29303
+ ...orderCheckoutSessionMetadataBaseShape,
29304
+ ...datedOfferingSharedEngineMetadataShape
29305
+ });
29306
+ z$1.union([SharedDatedOfferingOrderCheckoutSessionMetadataSchema, LegacyOrderCheckoutSessionMetadataSchema]);
29307
+ //#endregion
29308
+ //#region ../commerce/src/purchase/stripeCommissionMetadata.ts
29309
+ /** Reasons are payment evidence, not an independent pricing policy. */
29310
+ const STRIPE_COMMISSION_FREE_REASONS = [
29311
+ "managed_billing",
29312
+ "no_commission_plan",
29313
+ "billing_evidence_invalid",
29314
+ "fee_rounds_to_zero",
29315
+ "payment_not_stripe"
29316
+ ];
29317
+ const historicalContext = {
29318
+ currency: z$1.string().refine((value) => parseCurrencyCode(value) !== null).optional(),
29319
+ sourcePlanId: z$1.string().trim().min(1).optional()
29320
+ };
29321
+ const percentSchema = z$1.number().finite().min(0).max(100);
29322
+ z$1.discriminatedUnion("kind", [
29323
+ z$1.object({
29324
+ kind: z$1.literal("commission_free"),
29325
+ reason: z$1.enum(STRIPE_COMMISSION_FREE_REASONS),
29326
+ ...historicalContext
29327
+ }),
29328
+ z$1.object({
29329
+ kind: z$1.literal("application_fee_amount"),
29330
+ amountCents: z$1.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER),
29331
+ percent: percentSchema,
29332
+ ...historicalContext
29333
+ }),
29334
+ z$1.object({
29335
+ kind: z$1.literal("application_fee_percent"),
29336
+ percent: percentSchema,
29337
+ ...historicalContext
29338
+ })
29339
+ ]);
29340
+ toNonNegativeCents(0);
29341
+ //#endregion
29140
29342
  //#region ../blocks/src/system/runtime/nodes/booking-form.state.ts
29141
29343
  function toTrimmedString(value) {
29142
29344
  const trimmed = value?.trim();
@@ -34095,14 +34297,18 @@ function buildEventCombinedInteractiveIslandProps(props) {
34095
34297
  * @param needsPaymentStep - Whether user must complete payment method selection
34096
34298
  * @returns Array of wizard steps to display
34097
34299
  */
34098
- function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
34300
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep, paymentActive = false) {
34099
34301
  const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : [
34100
34302
  "select-event",
34101
34303
  "select-tickets",
34102
34304
  "enter-details"
34103
34305
  ];
34104
34306
  if (!needsPaymentStep) return baseSteps;
34105
- return [...baseSteps, "select-payment"];
34307
+ return paymentActive ? [
34308
+ ...baseSteps,
34309
+ "select-payment",
34310
+ "payment"
34311
+ ] : [...baseSteps, "select-payment"];
34106
34312
  }
34107
34313
  function eventMatchesOccurrenceId(event, occurrenceId) {
34108
34314
  return event.registrationSubject.kind === "occurrence" && (event.registrationSubject.occurrenceId === occurrenceId || event.selectionId === occurrenceId);
@@ -34219,6 +34425,7 @@ const EVENT_REGISTRATION_SHELL_STEP_LABELS = [
34219
34425
  "Date",
34220
34426
  "Tickets",
34221
34427
  "Details",
34428
+ "Payment options",
34222
34429
  "Payment"
34223
34430
  ];
34224
34431
  const eventRegistrationPublicEventSchema = z$1.preprocess(normalizeEventRegistrationEventInput, publicEventSchema);
@@ -34361,12 +34568,13 @@ function shellLabelForRegistrationStep(step, events) {
34361
34568
  switch (step) {
34362
34569
  case "select-event": return isDateSelection(events) ? "Date" : "Event";
34363
34570
  case "select-tickets": return "Tickets";
34571
+ case "fully-booked":
34364
34572
  case "enter-details": return "Details";
34365
- case "select-payment": return "Payment";
34573
+ case "select-payment": return "Payment options";
34574
+ case "payment": return "Payment";
34366
34575
  case "error":
34367
34576
  case "success":
34368
34577
  case "submitting":
34369
- case "redirecting":
34370
34578
  case "verifying-payment":
34371
34579
  case "verifying-timeout":
34372
34580
  case "payment-status":
@@ -34378,7 +34586,7 @@ function isDateSelection(events) {
34378
34586
  return Boolean(events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId));
34379
34587
  }
34380
34588
  function buildEventRegistrationShellBodyText(stepLabels) {
34381
- if (stepLabels.includes("Payment")) return "Preparing tickets, details, and payment options.";
34589
+ if (stepLabels.includes("Payment options")) return "Preparing tickets, details, and payment options.";
34382
34590
  if (stepLabels[0] === "Tickets") return "Preparing tickets and booking details.";
34383
34591
  return "Preparing dates, tickets, and booking details.";
34384
34592
  }
@@ -46355,6 +46563,16 @@ const defaultTransforms = createTransformRegistry([
46355
46563
  return resolveCalendarReadProfile(asPartialObject(value) ?? {});
46356
46564
  }
46357
46565
  },
46566
+ {
46567
+ id: "events.calendarBanded",
46568
+ kind: "formatter",
46569
+ summary: "Paint the week-board band only on a section with no background of its own",
46570
+ run(value) {
46571
+ const content = asPartialObject(value) ?? {};
46572
+ const sectionStyles = asPartialObject(content._sectionStyles);
46573
+ return content.banded === true && parseBackgroundContent(sectionStyles?.background) === null;
46574
+ }
46575
+ },
46358
46576
  ...formattingTransforms,
46359
46577
  ...layoutTransforms,
46360
46578
  ...chromeLogoTransforms,
@@ -48142,11 +48360,18 @@ function AppointmentServicesNode({ sectionHeading, categoryId, services, pathnam
48142
48360
  * card drawn exactly once after hydration, because the client wizard renders its
48143
48361
  * own `.rb-reg-surface`, and leaves no stale loading state on the mounted form.
48144
48362
  * `event-registration.server.tsx` follows the same shape.
48363
+ *
48364
+ * The root also carries `data-block="appointment-booking"`, because the
48365
+ * appointment-booking and registration-surface styles and the block's Tier 3
48366
+ * vars are all scoped under that attribute. On a page the block wrapper
48367
+ * already provides it, but the system service destination and /book render
48368
+ * this form on its own, so without it those routes lose every booking style.
48145
48369
  */
48146
48370
  function BookingFormSSR({ blockId, children, ...sourceProps }) {
48147
48371
  const islandProps = buildBookingFormInteractiveIslandProps(sourceProps);
48148
48372
  const display = islandProps.render.display;
48149
48373
  return /* @__PURE__ */ jsxs("div", {
48374
+ "data-block": "appointment-booking",
48150
48375
  ...getIslandRootProps("booking-form", blockId),
48151
48376
  children: [
48152
48377
  /* @__PURE__ */ jsx(IslandPropsScript, { value: islandProps }),
@@ -51329,7 +51554,8 @@ const eventCalendarLayout = [styledSection({
51329
51554
  fallback: false
51330
51555
  } },
51331
51556
  banded: { $bind: {
51332
- from: "content.banded",
51557
+ from: "content",
51558
+ transforms: [{ id: "events.calendarBanded" }],
51333
51559
  fallback: false
51334
51560
  } }
51335
51561
  }))]
@@ -56641,6 +56867,172 @@ function generateShadowCssVars(theme) {
56641
56867
  };
56642
56868
  }
56643
56869
  //#endregion
56870
+ //#region ../theme-core/src/blocks/opaquePanels.ts
56871
+ /**
56872
+ * Every element in `blocks-static/` CSS that paints its own background behind
56873
+ * text or buttons, with the palette token it paints.
56874
+ *
56875
+ * The CSS owns layout and the paint itself; this registry owns what the paint
56876
+ * implies. `generateOpaquePanelCss` publishes each panel's foreground contract
56877
+ * and button context from the theme, exactly as card roles and section
56878
+ * backgrounds do, so a white panel inside a dark band never inherits the band's
56879
+ * light text or its band-resolved buttons. `opaquePanels.test.ts` scans the
56880
+ * static CSS and fails when a rule paints a surface token without an entry
56881
+ * here, or when a registered rule declares the contract by hand.
56882
+ *
56883
+ * Selectors are written without the theme-scope prefix; the generator adds it.
56884
+ * A `transparent` entry is a treatment that turns a surface-owning class into
56885
+ * a boxless row, so it hands the surrounding surface's contract back.
56886
+ */
56887
+ const opaquePanels = [
56888
+ {
56889
+ selector: ":where([data-block=\"event-registration\"], [data-block=\"appointment-booking\"]) .rb-reg-surface",
56890
+ paint: {
56891
+ kind: "solid",
56892
+ token: "surface"
56893
+ }
56894
+ },
56895
+ {
56896
+ selector: ":where([data-block='event-registration']) .er-booking-teaser",
56897
+ paint: {
56898
+ kind: "solid",
56899
+ token: "surface"
56900
+ }
56901
+ },
56902
+ {
56903
+ selector: ":where([data-block='event-registration']) .er-booking-bar",
56904
+ paint: {
56905
+ kind: "solid",
56906
+ token: "background"
56907
+ }
56908
+ },
56909
+ {
56910
+ selector: ":where([data-block='event-registration']) .er-modal",
56911
+ paint: {
56912
+ kind: "solid",
56913
+ token: "background"
56914
+ }
56915
+ },
56916
+ {
56917
+ selector: ":where([data-block='event-registration']) .er-booking-overlay__panel",
56918
+ paint: {
56919
+ kind: "solid",
56920
+ token: "background"
56921
+ }
56922
+ },
56923
+ {
56924
+ selector: ":where([data-block='event-calendar']) .event-agenda-card",
56925
+ paint: {
56926
+ kind: "solid",
56927
+ token: "surface"
56928
+ }
56929
+ },
56930
+ {
56931
+ selector: ":where([data-block='event-calendar']) .event-timetable-event",
56932
+ paint: {
56933
+ kind: "solid",
56934
+ token: "surface"
56935
+ }
56936
+ },
56937
+ {
56938
+ selector: ":where([data-block='event-calendar']) .event-week-board",
56939
+ paint: {
56940
+ kind: "solid",
56941
+ token: "surface"
56942
+ }
56943
+ },
56944
+ {
56945
+ selector: ":where([data-block='event-calendar']) .event-week-board-top",
56946
+ paint: {
56947
+ kind: "solid",
56948
+ token: "surfaceAlt"
56949
+ }
56950
+ },
56951
+ {
56952
+ selector: ":where([data-block='event-calendar']) .event-week-board-foot",
56953
+ paint: {
56954
+ kind: "solid",
56955
+ token: "surfaceAlt"
56956
+ }
56957
+ },
56958
+ {
56959
+ selector: ":where([data-block='event-calendar']) .ec-modal",
56960
+ paint: {
56961
+ kind: "solid",
56962
+ token: "surface"
56963
+ }
56964
+ },
56965
+ {
56966
+ selector: ".event-listing-compact-container",
56967
+ paint: {
56968
+ kind: "solid",
56969
+ token: "surface"
56970
+ }
56971
+ },
56972
+ {
56973
+ selector: ".shop__card",
56974
+ paint: {
56975
+ kind: "solid",
56976
+ token: "surface"
56977
+ }
56978
+ },
56979
+ {
56980
+ selector: ".shop--register .shop__card",
56981
+ paint: { kind: "transparent" }
56982
+ },
56983
+ {
56984
+ selector: ":where([data-block=\"shop\"]) .shop__return",
56985
+ paint: {
56986
+ kind: "solid",
56987
+ token: "surface"
56988
+ }
56989
+ },
56990
+ {
56991
+ selector: "[data-block=\"feature-cards\"][data-block-composition=\"asymmetric-emphasis\"] .rb-feature-card:nth-child(even)",
56992
+ paint: {
56993
+ kind: "solid",
56994
+ token: "secondary"
56995
+ }
56996
+ },
56997
+ {
56998
+ selector: ".rb-feature-cards-grid--editorial-diptych .rb-feature-card[data-surface-role=\"panel\"]",
56999
+ paint: {
57000
+ kind: "solid",
57001
+ token: "primary"
57002
+ }
57003
+ },
57004
+ {
57005
+ selector: ":is(.rb-event-list-treatment-ruled-register, .rb-event-list-treatment-editorial-register, .rb-event-list-treatment-dense-index) .event-card.event-card",
57006
+ paint: { kind: "transparent" }
57007
+ },
57008
+ {
57009
+ selector: ".feedback-callout",
57010
+ paint: {
57011
+ kind: "solid",
57012
+ token: "surface"
57013
+ }
57014
+ },
57015
+ {
57016
+ selector: "[data-block=\"gifting\"] .gifting-feedback",
57017
+ paint: {
57018
+ kind: "solid",
57019
+ token: "surface"
57020
+ }
57021
+ }
57022
+ ];
57023
+ /**
57024
+ * Publishes every registered panel's surface contract. Emitted after the card
57025
+ * CSS in both the theme runtime and the SDK theme bridge, so a composition
57026
+ * that recolours a card role (the feature-card diptych panel) or a treatment
57027
+ * that empties one (the event registers) wins over the role's own contract.
57028
+ */
57029
+ function generateOpaquePanelCss(input) {
57030
+ return opaquePanels.map((panel) => {
57031
+ const declarations = opaqueSurfaceDeclarations(panel.paint, input.surface);
57032
+ return `:where([data-theme-scope="${input.themeId}"]) ${panel.selector} {\n ${renderCssDeclarations(declarations)}\n}`;
57033
+ }).join("\n\n");
57034
+ }
57035
+ //#endregion
56644
57036
  //#region ../theme-core/src/styles/border.ts
56645
57037
  /**
56646
57038
  * Border width mapping from Tailwind class names to px values
@@ -58024,7 +58416,7 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="event-registratio
58024
58416
  --er-step-inactive: rgb(var(--tb-mutedText));
58025
58417
  --er-step-completed: rgb(var(--tb-success));
58026
58418
  --er-step-text: rgb(255 255 255);
58027
- --er-step-text-active: rgb(var(--tb-primaryText, 255 255 255));
58419
+ --er-step-text-active: rgb(var(--tb-onPrimary, 255 255 255));
58028
58420
  --er-step-connector: rgba(var(--tb-border), 0.5);
58029
58421
 
58030
58422
  /* Step title */
@@ -58068,7 +58460,7 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="event-registratio
58068
58460
 
58069
58461
  /* Checkmark indicator */
58070
58462
  --er-check-bg: rgb(var(--tb-primary));
58071
- --er-check-text: rgb(var(--tb-primaryText, 255 255 255));
58463
+ --er-check-text: rgb(var(--tb-onPrimary, 255 255 255));
58072
58464
 
58073
58465
  /* Order summary */
58074
58466
  --er-summary-bg: rgba(var(--tb-primary), 0.1);
@@ -58280,7 +58672,7 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="appointment-booki
58280
58672
  --rb-reg-step-completed: rgb(var(--tb-success));
58281
58673
  --rb-reg-step-inactive: rgb(var(--tb-mutedText));
58282
58674
  --rb-reg-step-text: rgb(255 255 255);
58283
- --rb-reg-step-text-active: rgb(var(--tb-primaryText, 255 255 255));
58675
+ --rb-reg-step-text-active: rgb(var(--tb-onPrimary, 255 255 255));
58284
58676
  --rb-reg-step-connector: rgba(var(--tb-border), 0.5);
58285
58677
  --rb-reg-summary-bg: var(--ab-muted-bg);
58286
58678
  --rb-reg-summary-border: var(--ab-card-border);
@@ -59032,11 +59424,14 @@ function buildThemeRuntime$1(theme, options) {
59032
59424
  themeId,
59033
59425
  theme
59034
59426
  });
59035
- const cardCss = generateCardCss({
59427
+ const cardCss = [generateCardCss({
59036
59428
  themeId,
59037
59429
  theme,
59038
59430
  cardSystem: theme.cards
59039
- });
59431
+ }), generateOpaquePanelCss({
59432
+ themeId,
59433
+ surface: opaqueSurfaceContextFromTheme(theme)
59434
+ })].join("\n\n");
59040
59435
  const accordionCss = generateAccordionCss({
59041
59436
  themeId,
59042
59437
  theme,
@@ -61019,6 +61414,34 @@ function withLookCapability(declaration) {
61019
61414
  }
61020
61415
  };
61021
61416
  }
61417
+ /**
61418
+ * The section background paints a block's own `_sectionStyles.background`
61419
+ * field admits, read from its manifest so the design capability cannot drift
61420
+ * from what render admission accepts. A block without the field admits none.
61421
+ */
61422
+ function sectionBackgroundPaintsOfFields(fields) {
61423
+ const sectionStyles = fields.find((field) => field.id === "_sectionStyles");
61424
+ if (!sectionStyles || sectionStyles.type !== "modal") return [];
61425
+ const background = sectionStyles.schema.fields.find((field) => field.id === "background");
61426
+ if (!background || background.type !== "tabGroup") return [];
61427
+ const tabIds = new Set(background.tabs.map((tab) => tab.id));
61428
+ return [
61429
+ "color",
61430
+ "gradient",
61431
+ "image"
61432
+ ].filter((paint) => tabIds.has(paint));
61433
+ }
61434
+ /** Pins a designed capability's section background paints to the block's manifest. */
61435
+ function withManifestSectionBackgroundPaints(declaration, fields) {
61436
+ if (declaration.kind !== "capability") return declaration;
61437
+ return {
61438
+ kind: "capability",
61439
+ capability: {
61440
+ ...declaration.capability,
61441
+ sectionBackgroundPaints: sectionBackgroundPaintsOfFields(fields)
61442
+ }
61443
+ };
61444
+ }
61022
61445
  function declareNoBlockDesignCapability(reason) {
61023
61446
  return {
61024
61447
  kind: "none",
@@ -62803,6 +63226,20 @@ const footerEngagement = stack({
62803
63226
  ...footerSpamProtectionBinding
62804
63227
  }), [], when("module.engagement.kind", { equals: "mailing-list" }))
62805
63228
  ], when("module.kind", { equals: "engagement" }));
63229
+ const platformAttribution = el("div", {
63230
+ className: "rb-caption",
63231
+ "data-site-attribution": "macadamia"
63232
+ }, [
63233
+ text({ as: "span" }, bind("module.lead")),
63234
+ text({
63235
+ as: "span",
63236
+ value: " "
63237
+ }),
63238
+ link({
63239
+ href: { $bind: { from: "module.link.href" } },
63240
+ className: "footer-nav-link rb-caption transition-theme-standard"
63241
+ }, [text({ as: "span" }, bind("module.link.label"))])
63242
+ ], when("module.kind", { equals: "attribution" }));
62806
63243
  const footerGroup = stack({
62807
63244
  gap: "md",
62808
63245
  align: "stretch",
@@ -62832,6 +63269,7 @@ const footerGroup = stack({
62832
63269
  hours,
62833
63270
  socials,
62834
63271
  footerEngagement,
63272
+ platformAttribution,
62835
63273
  stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
62836
63274
  stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
62837
63275
  ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
@@ -68076,7 +68514,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
68076
68514
  if (definition.manifest.name !== blockKind) throw new Error(`System block kind mismatch: expected ${blockKind}, received ${definition.manifest.name}.`);
68077
68515
  return {
68078
68516
  ...definition,
68079
- designCapability,
68517
+ designCapability: withManifestSectionBackgroundPaints(designCapability, definition.manifest.fields),
68080
68518
  designMetadata,
68081
68519
  manifest: {
68082
68520
  ...definition.manifest,
@@ -69236,7 +69674,7 @@ function getBlockOverride(blockKind, overrides) {
69236
69674
  */
69237
69675
  function getRenderableContent(block, previewStage = "published") {
69238
69676
  const source = previewStage === "preview" && block.draftContent ? block.draftContent : block.content ?? {};
69239
- return isObjectRecord$1(source) ? stripStaleTransitionStyleGroup(source) : {};
69677
+ return isObjectRecord$3(source) ? stripStaleTransitionStyleGroup(source) : {};
69240
69678
  }
69241
69679
  //#endregion
69242
69680
  //#region ../blocks/src/system/manifest/hydrateLinks.ts
@@ -74599,140 +75037,17 @@ const containerResponsiveThemeCss = `/*
74599
75037
  border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
74600
75038
  padding: clamp(1rem, 2vw, 1.5rem);
74601
75039
  background: var(--rb-reg-surface-bg, rgb(var(--tb-surface, 248 250 252)));
74602
- color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
74603
- --rb-surface-text-color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
74604
- --rb-surface-heading-color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
74605
- --rb-surface-link-color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
74606
- --rb-surface-link-hover-color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
74607
- --rb-surface-link-hover-decoration: underline;
74608
- --rb-surface-supporting-color: var(--rb-reg-on-surface-muted, var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)))));
75040
+ /* The panel paints its own surface, so it owns its foreground and its
75041
+ * button context. Both are published from the theme by the opaque-panel
75042
+ * registry (theme-core/src/blocks/opaquePanels.ts): an enclosing brand band
75043
+ * would otherwise hand its light text and band-resolved buttons (on Anna's
75044
+ * therapy page, a white-on-white Continue) to this light panel. */
74609
75045
  transition: border-color var(--rb-block-transition, 150ms) ease;
74610
75046
  width: 100%;
74611
75047
  max-width: 800px;
74612
75048
  margin-inline: 0;
74613
75049
  }
74614
75050
 
74615
- /* The panel paints its own opaque surface, so it also has to break the button
74616
- * colour contract it inherits. An enclosing section that sits on a brand band
74617
- * publishes \`--rb-action-*\` variables resolved against *that* band — on Anna's
74618
- * therapy page a ghost primary: transparent background, white label. Those
74619
- * variables inherit, so without this reset a Continue button inside the light
74620
- * form panel renders white-on-white and only appears on hover.
74621
- *
74622
- * Resetting to \`initial\` sends each button back to the generated fallback in
74623
- * its own rule (\`var(--rb-action-…, rgb(var(--tb-primary)))\`), which is the
74624
- * theme's standard button resolved against a normal surface — correct here,
74625
- * because this panel *is* a normal surface.
74626
- *
74627
- * Mirrors \`contextualButtonSurfaceResetStyles()\` in theme-core/buttons; the
74628
- * pairing is pinned by registration-surface-action-reset.test.ts. */
74629
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
74630
- --rb-action-primary-base-background-color: initial;
74631
- --rb-action-primary-base-background-image: initial;
74632
- --rb-action-primary-base-color: initial;
74633
- --rb-action-primary-hover-background-color: initial;
74634
- --rb-action-primary-hover-background-image: initial;
74635
- --rb-action-primary-hover-color: initial;
74636
- --rb-action-primary-focus-background-color: initial;
74637
- --rb-action-primary-focus-background-image: initial;
74638
- --rb-action-primary-focus-color: initial;
74639
- --rb-action-primary-active-background-color: initial;
74640
- --rb-action-primary-active-background-image: initial;
74641
- --rb-action-primary-active-color: initial;
74642
- --rb-action-primary-disabled-background-color: initial;
74643
- --rb-action-primary-disabled-background-image: initial;
74644
- --rb-action-primary-disabled-color: initial;
74645
- --rb-action-primary-base-outline: initial;
74646
- --rb-action-primary-base-outline-offset: initial;
74647
- --rb-action-primary-focus-outline: initial;
74648
- --rb-action-primary-focus-outline-offset: initial;
74649
- --rb-action-primary-focus-box-shadow: initial;
74650
-
74651
- --rb-action-secondary-base-background-color: initial;
74652
- --rb-action-secondary-base-background-image: initial;
74653
- --rb-action-secondary-base-color: initial;
74654
- --rb-action-secondary-hover-background-color: initial;
74655
- --rb-action-secondary-hover-background-image: initial;
74656
- --rb-action-secondary-hover-color: initial;
74657
- --rb-action-secondary-focus-background-color: initial;
74658
- --rb-action-secondary-focus-background-image: initial;
74659
- --rb-action-secondary-focus-color: initial;
74660
- --rb-action-secondary-active-background-color: initial;
74661
- --rb-action-secondary-active-background-image: initial;
74662
- --rb-action-secondary-active-color: initial;
74663
- --rb-action-secondary-disabled-background-color: initial;
74664
- --rb-action-secondary-disabled-background-image: initial;
74665
- --rb-action-secondary-disabled-color: initial;
74666
- --rb-action-secondary-base-outline: initial;
74667
- --rb-action-secondary-base-outline-offset: initial;
74668
- --rb-action-secondary-focus-outline: initial;
74669
- --rb-action-secondary-focus-outline-offset: initial;
74670
- --rb-action-secondary-focus-box-shadow: initial;
74671
-
74672
- --rb-action-outline-base-background-color: initial;
74673
- --rb-action-outline-base-background-image: initial;
74674
- --rb-action-outline-base-color: initial;
74675
- --rb-action-outline-hover-background-color: initial;
74676
- --rb-action-outline-hover-background-image: initial;
74677
- --rb-action-outline-hover-color: initial;
74678
- --rb-action-outline-focus-background-color: initial;
74679
- --rb-action-outline-focus-background-image: initial;
74680
- --rb-action-outline-focus-color: initial;
74681
- --rb-action-outline-active-background-color: initial;
74682
- --rb-action-outline-active-background-image: initial;
74683
- --rb-action-outline-active-color: initial;
74684
- --rb-action-outline-disabled-background-color: initial;
74685
- --rb-action-outline-disabled-background-image: initial;
74686
- --rb-action-outline-disabled-color: initial;
74687
- --rb-action-outline-base-outline: initial;
74688
- --rb-action-outline-base-outline-offset: initial;
74689
- --rb-action-outline-focus-outline: initial;
74690
- --rb-action-outline-focus-outline-offset: initial;
74691
- --rb-action-outline-focus-box-shadow: initial;
74692
-
74693
- --rb-action-ghost-base-background-color: initial;
74694
- --rb-action-ghost-base-background-image: initial;
74695
- --rb-action-ghost-base-color: initial;
74696
- --rb-action-ghost-hover-background-color: initial;
74697
- --rb-action-ghost-hover-background-image: initial;
74698
- --rb-action-ghost-hover-color: initial;
74699
- --rb-action-ghost-focus-background-color: initial;
74700
- --rb-action-ghost-focus-background-image: initial;
74701
- --rb-action-ghost-focus-color: initial;
74702
- --rb-action-ghost-active-background-color: initial;
74703
- --rb-action-ghost-active-background-image: initial;
74704
- --rb-action-ghost-active-color: initial;
74705
- --rb-action-ghost-disabled-background-color: initial;
74706
- --rb-action-ghost-disabled-background-image: initial;
74707
- --rb-action-ghost-disabled-color: initial;
74708
- --rb-action-ghost-base-outline: initial;
74709
- --rb-action-ghost-base-outline-offset: initial;
74710
- --rb-action-ghost-focus-outline: initial;
74711
- --rb-action-ghost-focus-outline-offset: initial;
74712
- --rb-action-ghost-focus-box-shadow: initial;
74713
-
74714
- --rb-action-accent-base-background-color: initial;
74715
- --rb-action-accent-base-background-image: initial;
74716
- --rb-action-accent-base-color: initial;
74717
- --rb-action-accent-hover-background-color: initial;
74718
- --rb-action-accent-hover-background-image: initial;
74719
- --rb-action-accent-hover-color: initial;
74720
- --rb-action-accent-focus-background-color: initial;
74721
- --rb-action-accent-focus-background-image: initial;
74722
- --rb-action-accent-focus-color: initial;
74723
- --rb-action-accent-active-background-color: initial;
74724
- --rb-action-accent-active-background-image: initial;
74725
- --rb-action-accent-active-color: initial;
74726
- --rb-action-accent-disabled-background-color: initial;
74727
- --rb-action-accent-disabled-background-image: initial;
74728
- --rb-action-accent-disabled-color: initial;
74729
- --rb-action-accent-base-outline: initial;
74730
- --rb-action-accent-base-outline-offset: initial;
74731
- --rb-action-accent-focus-outline: initial;
74732
- --rb-action-accent-focus-outline-offset: initial;
74733
- --rb-action-accent-focus-box-shadow: initial;
74734
- }
74735
-
74736
75051
  /* Selectable option card */
74737
75052
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card {
74738
75053
  position: relative;
@@ -74792,7 +75107,7 @@ const containerResponsiveThemeCss = `/*
74792
75107
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
74793
75108
  width: 0.75rem;
74794
75109
  height: 0.75rem;
74795
- color: var(--rb-reg-check-text, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
75110
+ color: var(--rb-reg-check-text, rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255))));
74796
75111
  }
74797
75112
 
74798
75113
  /* Step indicator */
@@ -74832,12 +75147,12 @@ const containerResponsiveThemeCss = `/*
74832
75147
 
74833
75148
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
74834
75149
  background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
74835
- color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
75150
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255))));
74836
75151
  }
74837
75152
 
74838
75153
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
74839
75154
  background: var(--rb-reg-step-completed, rgb(var(--tb-success, 22 163 74)));
74840
- color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
75155
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255))));
74841
75156
  }
74842
75157
 
74843
75158
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-check {
@@ -75096,7 +75411,7 @@ const containerResponsiveThemeCss = `/*
75096
75411
  justify-content: center;
75097
75412
  border-radius: calc(var(--rb-block-radius) * 0.6);
75098
75413
  background: rgb(var(--tb-primary));
75099
- color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
75414
+ color: rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255)));
75100
75415
  padding: 0.625rem 1rem;
75101
75416
  font-size: 0.875rem;
75102
75417
  font-weight: 600;
@@ -77071,7 +77386,7 @@ const containerResponsiveThemeCss = `/*
77071
77386
  :where(.theme-scope) :where([data-block='event-registration']) .er-modal-btn {
77072
77387
  padding: 0.75rem 1.5rem;
77073
77388
  background: rgb(var(--tb-primary));
77074
- color: rgb(var(--tb-primary-foreground, 255 255 255));
77389
+ color: rgb(var(--tb-onPrimary, 255 255 255));
77075
77390
  border: none;
77076
77391
  border-radius: var(--rb-block-radius);
77077
77392
  font-weight: 500;
@@ -77119,7 +77434,7 @@ const containerResponsiveThemeCss = `/*
77119
77434
  border: 1px solid var(--er-border);
77120
77435
  border-radius: var(--rb-block-radius);
77121
77436
  background: var(--er-event-card-bg);
77122
- color: var(--er-on-surface);
77437
+ /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
77123
77438
  }
77124
77439
 
77125
77440
  :where(.theme-scope)
@@ -77270,7 +77585,7 @@ const containerResponsiveThemeCss = `/*
77270
77585
  min-height: 0;
77271
77586
  overflow: hidden;
77272
77587
  background: rgb(var(--tb-background));
77273
- color: var(--er-on-surface);
77588
+ /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
77274
77589
  }
77275
77590
 
77276
77591
  :where(.theme-scope)
@@ -78037,7 +78352,7 @@ const containerResponsiveThemeCss = `/*
78037
78352
  .event-category-btn--active {
78038
78353
  background-color: rgb(var(--tb-primary));
78039
78354
  border-color: rgb(var(--tb-primary));
78040
- color: var(--ec-event-solid-text);
78355
+ color: rgb(var(--tb-onPrimary));
78041
78356
  }
78042
78357
 
78043
78358
  :where(.theme-scope)
@@ -78104,7 +78419,7 @@ const containerResponsiveThemeCss = `/*
78104
78419
  opacity: 1;
78105
78420
  background-color: rgb(var(--tb-primary));
78106
78421
  border-color: rgb(var(--tb-primary));
78107
- color: rgb(var(--tb-primaryText, 255 255 255));
78422
+ color: rgb(var(--tb-onPrimary, 255 255 255));
78108
78423
  }
78109
78424
 
78110
78425
  /* -----------------------------------------------------------------------------
@@ -78162,7 +78477,7 @@ const containerResponsiveThemeCss = `/*
78162
78477
  text-transform: uppercase;
78163
78478
  letter-spacing: 0.05em;
78164
78479
  background-color: rgb(var(--tb-primary));
78165
- color: rgb(var(--tb-primaryText, 255 255 255));
78480
+ color: rgb(var(--tb-onPrimary, 255 255 255));
78166
78481
  border-radius: var(--rb-button-radius);
78167
78482
  }
78168
78483
 
@@ -78204,7 +78519,8 @@ const containerResponsiveThemeCss = `/*
78204
78519
  border: 1px solid var(--ec-border-subtle);
78205
78520
  border-radius: var(--rb-block-radius);
78206
78521
  text-decoration: none;
78207
- color: inherit;
78522
+ /* Paints its own surface: its foreground and button context come from the
78523
+ * opaque-panel registry (theme-core/src/blocks/opaquePanels.ts). */
78208
78524
  transition: all var(--rb-block-transition) ease;
78209
78525
  }
78210
78526
 
@@ -78538,7 +78854,7 @@ const containerResponsiveThemeCss = `/*
78538
78854
  .event-timetable-day-tab--active {
78539
78855
  background-color: rgb(var(--tb-primary));
78540
78856
  border-color: rgb(var(--tb-primary));
78541
- color: rgb(var(--tb-primaryText, 255 255 255));
78857
+ color: rgb(var(--tb-onPrimary, 255 255 255));
78542
78858
  }
78543
78859
 
78544
78860
  :where(.theme-scope)
@@ -78604,7 +78920,7 @@ const containerResponsiveThemeCss = `/*
78604
78920
  padding: 0.125rem 0.375rem;
78605
78921
  border-radius: var(--rb-button-radius);
78606
78922
  background-color: rgb(var(--tb-primary));
78607
- color: rgb(var(--tb-primaryText, 255 255 255));
78923
+ color: rgb(var(--tb-onPrimary, 255 255 255));
78608
78924
  font-size: 0.625rem;
78609
78925
  font-weight: 700;
78610
78926
  text-transform: uppercase;
@@ -78660,7 +78976,6 @@ const containerResponsiveThemeCss = `/*
78660
78976
  border-left-width: 4px;
78661
78977
  border-radius: calc(var(--rb-block-radius) / 1.5);
78662
78978
  background-color: var(--ec-surface);
78663
- color: var(--ec-text);
78664
78979
  box-shadow: 0 1px 2px rgba(var(--tb-text), 0.08);
78665
78980
  cursor: pointer;
78666
78981
  font: inherit;
@@ -78833,7 +79148,6 @@ const containerResponsiveThemeCss = `/*
78833
79148
  border: 1px solid var(--ec-border);
78834
79149
  border-radius: var(--rb-block-radius);
78835
79150
  background-color: var(--ec-surface);
78836
- color: var(--ec-text);
78837
79151
  overflow: hidden;
78838
79152
  }
78839
79153
 
@@ -79783,7 +80097,7 @@ const containerResponsiveThemeCss = `/*
79783
80097
  justify-content: center;
79784
80098
  border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.6);
79785
80099
  background: rgb(var(--tb-primary, 17 24 39));
79786
- color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
80100
+ color: rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255)));
79787
80101
  padding: 0.625rem 1rem;
79788
80102
  font-size: 0.875rem;
79789
80103
  font-weight: 600;
@@ -80221,7 +80535,7 @@ const containerResponsiveThemeCss = `/*
80221
80535
 
80222
80536
  :where(.theme-scope) .event-reset-filters-btn:hover {
80223
80537
  background-color: rgb(var(--tb-primary));
80224
- color: rgb(var(--tb-primaryText, 255 255 255));
80538
+ color: rgb(var(--tb-onPrimary, 255 255 255));
80225
80539
  }
80226
80540
 
80227
80541
  :where(.theme-scope) .event-reset-filters-btn:focus-visible {
@@ -80579,14 +80893,8 @@ const containerResponsiveThemeCss = `/*
80579
80893
  border: 0;
80580
80894
  border-bottom: 1px solid color-mix(in oklab, currentColor, transparent 78%);
80581
80895
  border-radius: 0;
80896
+ /* Boxless row: the opaque-panel registry hands the band's contract back. */
80582
80897
  background: transparent;
80583
- color: inherit;
80584
- --rb-surface-text-color: inherit;
80585
- --rb-surface-heading-color: inherit;
80586
- --rb-surface-link-color: inherit;
80587
- --rb-surface-link-hover-color: inherit;
80588
- --rb-surface-link-hover-decoration: inherit;
80589
- --rb-surface-supporting-color: inherit;
80590
80898
  }
80591
80899
 
80592
80900
  :where(.theme-scope) .shop--register .shop__card-header {
@@ -80678,14 +80986,8 @@ const containerResponsiveThemeCss = `/*
80678
80986
 
80679
80987
  /* Product card */
80680
80988
  :where(.theme-scope) .shop__card {
80989
+ /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
80681
80990
  background: rgb(var(--tb-surface));
80682
- color: rgb(var(--tb-text, 17 24 39));
80683
- --rb-surface-text-color: rgb(var(--tb-text, 17 24 39));
80684
- --rb-surface-heading-color: rgb(var(--tb-text, 17 24 39));
80685
- --rb-surface-link-color: rgb(var(--tb-primary, var(--tb-text, 17 24 39)));
80686
- --rb-surface-link-hover-color: var(--rb-prose-link-hover-color, rgb(var(--tb-primary, var(--tb-text, 17 24 39))));
80687
- --rb-surface-link-hover-decoration: initial;
80688
- --rb-surface-supporting-color: rgb(var(--tb-mutedText, 100 116 139));
80689
80991
  border: 1px solid rgb(var(--tb-border));
80690
80992
  border-radius: var(--shop-card-radius);
80691
80993
  padding: 1.5rem;
@@ -80846,14 +81148,8 @@ const containerResponsiveThemeCss = `/*
80846
81148
  margin-bottom: 1.25rem;
80847
81149
  border: 1px solid rgb(var(--tb-border));
80848
81150
  border-radius: var(--shop-card-radius);
81151
+ /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
80849
81152
  background: rgb(var(--tb-surface));
80850
- color: rgb(var(--tb-text, 17 24 39));
80851
- --rb-surface-text-color: rgb(var(--tb-text, 17 24 39));
80852
- --rb-surface-heading-color: rgb(var(--tb-text, 17 24 39));
80853
- --rb-surface-link-color: rgb(var(--tb-primary, var(--tb-text, 17 24 39)));
80854
- --rb-surface-link-hover-color: var(--rb-prose-link-hover-color, rgb(var(--tb-primary, var(--tb-text, 17 24 39))));
80855
- --rb-surface-link-hover-decoration: initial;
80856
- --rb-surface-supporting-color: rgb(var(--tb-mutedText, 100 116 139));
80857
81153
  }
80858
81154
 
80859
81155
  :where(.theme-scope) :where([data-block="shop"]) .rb-state-icon--success {
@@ -82796,8 +83092,11 @@ const containerResponsiveThemeCss = `/*
82796
83092
  border-radius: 9999px;
82797
83093
  }
82798
83094
 
83095
+ /* The callout is its own opaque surface: tones tint over the theme surface,
83096
+ * not over whatever band the callout sits on, so its foreground and button
83097
+ * context (theme-core/src/blocks/opaquePanels.ts) hold on any section. */
82799
83098
  :where(.theme-scope) .feedback-callout {
82800
- background: rgba(var(--tb-surface, 248 250 252), 0.92);
83099
+ background: rgb(var(--tb-surface, 248 250 252));
82801
83100
  border-color: rgba(var(--tb-border, 226 232 240), 0.72);
82802
83101
  --rb-feedback-callout-bg-opacity: 0.1;
82803
83102
  --rb-feedback-callout-border-opacity: 0.24;
@@ -82805,25 +83104,33 @@ const containerResponsiveThemeCss = `/*
82805
83104
 
82806
83105
  :where(.theme-scope) .feedback-callout[data-feedback-tone="info"] {
82807
83106
  --rb-feedback-callout-bg-opacity: 0.08;
82808
- background: rgba(var(--tb-primary, 37 99 235), var(--rb-feedback-callout-bg-opacity));
83107
+ background:
83108
+ linear-gradient(rgba(var(--tb-primary, 37 99 235), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-primary, 37 99 235), var(--rb-feedback-callout-bg-opacity))),
83109
+ rgb(var(--tb-surface, 248 250 252));
82809
83110
  border-color: rgba(var(--tb-primary, 37 99 235), var(--rb-feedback-callout-border-opacity));
82810
83111
  }
82811
83112
 
82812
83113
  :where(.theme-scope) .feedback-callout[data-feedback-tone="success"] {
82813
- background: rgba(var(--tb-success, 34 197 94), var(--rb-feedback-callout-bg-opacity));
83114
+ background:
83115
+ linear-gradient(rgba(var(--tb-success, 34 197 94), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-success, 34 197 94), var(--rb-feedback-callout-bg-opacity))),
83116
+ rgb(var(--tb-surface, 248 250 252));
82814
83117
  border-color: rgba(var(--tb-success, 34 197 94), var(--rb-feedback-callout-border-opacity));
82815
83118
  }
82816
83119
 
82817
83120
  :where(.theme-scope) .feedback-callout[data-feedback-tone="warning"] {
82818
83121
  --rb-feedback-callout-bg-opacity: 0.12;
82819
83122
  --rb-feedback-callout-border-opacity: 0.28;
82820
- background: rgba(var(--tb-warning, 245 158 11), var(--rb-feedback-callout-bg-opacity));
83123
+ background:
83124
+ linear-gradient(rgba(var(--tb-warning, 245 158 11), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-warning, 245 158 11), var(--rb-feedback-callout-bg-opacity))),
83125
+ rgb(var(--tb-surface, 248 250 252));
82821
83126
  border-color: rgba(var(--tb-warning, 245 158 11), var(--rb-feedback-callout-border-opacity));
82822
83127
  }
82823
83128
 
82824
83129
  :where(.theme-scope) .feedback-callout[data-feedback-tone="error"] {
82825
83130
  --rb-feedback-callout-border-opacity: 0.26;
82826
- background: rgba(var(--tb-destructive, 239 68 68), var(--rb-feedback-callout-bg-opacity));
83131
+ background:
83132
+ linear-gradient(rgba(var(--tb-destructive, 239 68 68), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-destructive, 239 68 68), var(--rb-feedback-callout-bg-opacity))),
83133
+ rgb(var(--tb-surface, 248 250 252));
82827
83134
  border-color: rgba(var(--tb-destructive, 239 68 68), var(--rb-feedback-callout-border-opacity));
82828
83135
  }
82829
83136
 
@@ -83297,26 +83604,30 @@ const containerResponsiveThemeCss = `/*
83297
83604
  border: 1px solid rgb(var(--tb-text, 17 24 39) / 0.12);
83298
83605
  border-radius: 1rem;
83299
83606
  padding: 0.875rem 1rem;
83300
- background: rgb(var(--tb-surface, 255 255 255) / 0.92);
83301
- color: rgb(var(--tb-text, 17 24 39));
83607
+ /* Opaque surface; foreground and button context come from the opaque-panel
83608
+ * registry (theme-core/src/blocks/opaquePanels.ts). Tones tint over it. */
83609
+ background: rgb(var(--tb-surface, 255 255 255));
83302
83610
  }
83303
83611
 
83304
83612
  :where(.theme-scope) [data-block="gifting"] .gifting-feedback[data-feedback-tone="success"] {
83305
83613
  border-color: rgba(var(--tb-success, 34 197 94), 0.3);
83306
- background: rgba(var(--tb-success, 34 197 94), 0.1);
83307
- color: rgb(var(--tb-success, 34 197 94));
83614
+ background:
83615
+ linear-gradient(rgba(var(--tb-success, 34 197 94), 0.1), rgba(var(--tb-success, 34 197 94), 0.1)),
83616
+ rgb(var(--tb-surface, 255 255 255));
83308
83617
  }
83309
83618
 
83310
83619
  :where(.theme-scope) [data-block="gifting"] .gifting-feedback[data-feedback-tone="warning"] {
83311
83620
  border-color: rgba(var(--tb-warning, 245 158 11), 0.35);
83312
- background: rgba(var(--tb-warning, 245 158 11), 0.12);
83313
- color: rgb(var(--tb-warning, 245 158 11));
83621
+ background:
83622
+ linear-gradient(rgba(var(--tb-warning, 245 158 11), 0.12), rgba(var(--tb-warning, 245 158 11), 0.12)),
83623
+ rgb(var(--tb-surface, 255 255 255));
83314
83624
  }
83315
83625
 
83316
83626
  :where(.theme-scope) [data-block="gifting"] .gifting-feedback[data-feedback-tone="error"] {
83317
83627
  border-color: rgba(var(--tb-destructive, 239 68 68), 0.3);
83318
- background: rgba(var(--tb-destructive, 239 68 68), 0.1);
83319
- color: rgb(var(--tb-destructive, 239 68 68));
83628
+ background:
83629
+ linear-gradient(rgba(var(--tb-destructive, 239 68 68), 0.1), rgba(var(--tb-destructive, 239 68 68), 0.1)),
83630
+ rgb(var(--tb-surface, 255 255 255));
83320
83631
  }
83321
83632
 
83322
83633
  /* =============================================================================
@@ -83696,10 +84007,14 @@ const containerResponsiveThemeCss = `/*
83696
84007
  * These treatments retain the event list's content and structural layout.
83697
84008
  * Their contrast relationships come exclusively from the active semantic
83698
84009
  * section surface and named palette tokens.
84010
+ *
84011
+ * The treatment list is \`:is()\`, not \`:where()\`, so each rule outranks the card
84012
+ * role (\`.card-role-x.card-role-x\`) the event card also carries: the rows must
84013
+ * stay boxless whichever stylesheet the page loads last.
83699
84014
  * ============================================================================= */
83700
84015
 
83701
84016
  :where(.theme-scope)
83702
- :where(
84017
+ :is(
83703
84018
  .rb-event-list-treatment-ruled-register,
83704
84019
  .rb-event-list-treatment-editorial-register,
83705
84020
  .rb-event-list-treatment-dense-index
@@ -83711,12 +84026,12 @@ const containerResponsiveThemeCss = `/*
83711
84026
  border-radius: 0;
83712
84027
  background: transparent;
83713
84028
  box-shadow: none;
83714
- color: inherit;
84029
+ /* Boxless row: the opaque-panel registry hands the band's contract back. */
83715
84030
  }
83716
84031
 
83717
84032
  /* Register treatments intentionally prioritise schedule data over imagery. */
83718
84033
  :where(.theme-scope)
83719
- :where(
84034
+ :is(
83720
84035
  .rb-event-list-treatment-ruled-register,
83721
84036
  .rb-event-list-treatment-editorial-register,
83722
84037
  .rb-event-list-treatment-dense-index
@@ -83727,7 +84042,7 @@ const containerResponsiveThemeCss = `/*
83727
84042
  }
83728
84043
 
83729
84044
  :where(.theme-scope)
83730
- :where(
84045
+ :is(
83731
84046
  .rb-event-list-treatment-ruled-register,
83732
84047
  .rb-event-list-treatment-editorial-register,
83733
84048
  .rb-event-list-treatment-dense-index
@@ -83739,7 +84054,7 @@ const containerResponsiveThemeCss = `/*
83739
84054
  }
83740
84055
 
83741
84056
  :where(.theme-scope)
83742
- :where(
84057
+ :is(
83743
84058
  .rb-event-list-treatment-ruled-register,
83744
84059
  .rb-event-list-treatment-editorial-register,
83745
84060
  .rb-event-list-treatment-dense-index
@@ -83751,7 +84066,7 @@ const containerResponsiveThemeCss = `/*
83751
84066
  }
83752
84067
 
83753
84068
  :where(.theme-scope)
83754
- :where(
84069
+ :is(
83755
84070
  .rb-event-list-treatment-ruled-register,
83756
84071
  .rb-event-list-treatment-editorial-register,
83757
84072
  .rb-event-list-treatment-dense-index
@@ -83763,7 +84078,7 @@ const containerResponsiveThemeCss = `/*
83763
84078
  }
83764
84079
 
83765
84080
  :where(.theme-scope)
83766
- :where(
84081
+ :is(
83767
84082
  .rb-event-list-treatment-ruled-register,
83768
84083
  .rb-event-list-treatment-editorial-register,
83769
84084
  .rb-event-list-treatment-dense-index
@@ -83861,7 +84176,7 @@ const containerResponsiveThemeCss = `/*
83861
84176
  @container rb-site (min-width: 768px) {
83862
84177
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
83863
84178
  :where(.theme-scope)
83864
- :where(
84179
+ :is(
83865
84180
  .rb-event-list-treatment-ruled-register,
83866
84181
  .rb-event-list-treatment-editorial-register,
83867
84182
  .rb-event-list-treatment-dense-index
@@ -83871,7 +84186,7 @@ const containerResponsiveThemeCss = `/*
83871
84186
  }
83872
84187
 
83873
84188
  :where(.theme-scope)
83874
- :where(
84189
+ :is(
83875
84190
  .rb-event-list-treatment-ruled-register,
83876
84191
  .rb-event-list-treatment-editorial-register,
83877
84192
  .rb-event-list-treatment-dense-index
@@ -83886,7 +84201,7 @@ const containerResponsiveThemeCss = `/*
83886
84201
  }
83887
84202
 
83888
84203
  :where(.theme-scope)
83889
- :where(
84204
+ :is(
83890
84205
  .rb-event-list-treatment-ruled-register,
83891
84206
  .rb-event-list-treatment-editorial-register,
83892
84207
  .rb-event-list-treatment-dense-index
@@ -83897,7 +84212,7 @@ const containerResponsiveThemeCss = `/*
83897
84212
  }
83898
84213
 
83899
84214
  :where(.theme-scope)
83900
- :where(
84215
+ :is(
83901
84216
  .rb-event-list-treatment-ruled-register,
83902
84217
  .rb-event-list-treatment-editorial-register,
83903
84218
  .rb-event-list-treatment-dense-index
@@ -83910,7 +84225,7 @@ const containerResponsiveThemeCss = `/*
83910
84225
  }
83911
84226
 
83912
84227
  :where(.theme-scope)
83913
- :where(
84228
+ :is(
83914
84229
  .rb-event-list-treatment-ruled-register,
83915
84230
  .rb-event-list-treatment-editorial-register,
83916
84231
  .rb-event-list-treatment-dense-index
@@ -83922,7 +84237,7 @@ const containerResponsiveThemeCss = `/*
83922
84237
  }
83923
84238
 
83924
84239
  :where(.theme-scope)
83925
- :where(
84240
+ :is(
83926
84241
  .rb-event-list-treatment-ruled-register,
83927
84242
  .rb-event-list-treatment-editorial-register,
83928
84243
  .rb-event-list-treatment-dense-index
@@ -83933,7 +84248,7 @@ const containerResponsiveThemeCss = `/*
83933
84248
  }
83934
84249
 
83935
84250
  :where(.theme-scope)
83936
- :where(
84251
+ :is(
83937
84252
  .rb-event-list-treatment-ruled-register,
83938
84253
  .rb-event-list-treatment-editorial-register,
83939
84254
  .rb-event-list-treatment-dense-index
@@ -83941,7 +84256,7 @@ const containerResponsiveThemeCss = `/*
83941
84256
  .event-card.event-card.event-card--horizontal
83942
84257
  .card-content > .card-body,
83943
84258
  :where(.theme-scope)
83944
- :where(
84259
+ :is(
83945
84260
  .rb-event-list-treatment-ruled-register,
83946
84261
  .rb-event-list-treatment-editorial-register,
83947
84262
  .rb-event-list-treatment-dense-index
@@ -83952,7 +84267,7 @@ const containerResponsiveThemeCss = `/*
83952
84267
  }
83953
84268
 
83954
84269
  :where(.theme-scope)
83955
- :where(
84270
+ :is(
83956
84271
  .rb-event-list-treatment-ruled-register,
83957
84272
  .rb-event-list-treatment-editorial-register,
83958
84273
  .rb-event-list-treatment-dense-index
@@ -84003,13 +84318,7 @@ const containerResponsiveThemeCss = `/*
84003
84318
  padding: clamp(1.125rem, 2.5vw, 1.875rem);
84004
84319
  border-radius: calc(var(--rb-block-radius, 0.75rem) * 1.5);
84005
84320
  background: rgb(var(--tb-secondary));
84006
- color: rgb(var(--tb-onSecondary));
84007
- --rb-surface-text-color: rgb(var(--tb-onSecondary));
84008
- --rb-surface-heading-color: rgb(var(--tb-onSecondary));
84009
- --rb-surface-link-color: rgb(var(--tb-onSecondary));
84010
- --rb-surface-link-hover-color: rgb(var(--tb-onSecondary));
84011
- --rb-surface-link-hover-decoration: underline;
84012
- --rb-surface-supporting-color: rgb(var(--tb-onSecondary));
84321
+ /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
84013
84322
  }
84014
84323
 
84015
84324
  :where(.theme-scope)
@@ -84134,16 +84443,8 @@ const containerResponsiveThemeCss = `/*
84134
84443
  }
84135
84444
 
84136
84445
  /* Diptych filled panel: a composition over the \`alternative\` role's surface.
84137
- The 18% supporting alpha is accepted CSS-side — see issue 1297 mapping-table. */
84138
- :where(.theme-scope) .rb-feature-cards-grid--editorial-diptych .rb-feature-card[data-surface-role="panel"] {
84139
- color: rgb(var(--tb-onPrimary));
84140
- --rb-surface-text-color: rgb(var(--tb-onPrimary));
84141
- --rb-surface-heading-color: rgb(var(--tb-onPrimary));
84142
- --rb-surface-link-color: rgb(var(--tb-onPrimary));
84143
- --rb-surface-link-hover-color: rgb(var(--tb-onPrimary));
84144
- --rb-surface-link-hover-decoration: underline;
84145
- --rb-surface-supporting-color: color-mix(in oklab, rgb(var(--tb-onPrimary)), transparent 18%);
84146
- }
84446
+ It paints primary (below); its foreground and button context for that paint
84447
+ come from theme-core/src/blocks/opaquePanels.ts. */
84147
84448
 
84148
84449
  :where(.theme-scope) .rb-feature-cards-grid--editorial-diptych .rb-feature-card[data-surface-role="panel"] > .rb-bg-surface {
84149
84450
  background: rgb(var(--tb-primary));
@@ -84903,10 +85204,10 @@ function normalizeDataLoaders(def) {
84903
85204
  */
84904
85205
  function normalizeContent(block) {
84905
85206
  const source = block.draftContent ?? block.content ?? block.publishedContent ?? {};
84906
- if (!isObjectRecord$1(source)) return {};
85207
+ if (!isObjectRecord$3(source)) return {};
84907
85208
  if ("data" in source) {
84908
85209
  const data = source.data;
84909
- if (isObjectRecord$1(data)) return data;
85210
+ if (isObjectRecord$3(data)) return data;
84910
85211
  if (data === null || data === void 0) return {};
84911
85212
  }
84912
85213
  return source;
@@ -85142,7 +85443,7 @@ function stableNormalize(value) {
85142
85443
  //#endregion
85143
85444
  //#region ../blocks/src/system/data/normalizeLoaderParams.ts
85144
85445
  function toStringParams(value) {
85145
- if (!isObjectRecord$1(value)) return {};
85446
+ if (!isObjectRecord$3(value)) return {};
85146
85447
  const out = {};
85147
85448
  for (const [k, v] of Object.entries(value)) if (typeof v === "string") out[k] = v;
85148
85449
  return out;
@@ -91764,7 +92065,7 @@ var CircuitOpenError = class extends Error {
91764
92065
  * 1. This constant
91765
92066
  * 2. The "version" field in package.json
91766
92067
  */
91767
- const SDK_VERSION = "0.149.0";
92068
+ const SDK_VERSION = "0.150.0";
91768
92069
  //#endregion
91769
92070
  //#region src/next/content-load-failure.ts
91770
92071
  const SdkContentLoadError = RiverbankContentLoadError;