@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
@@ -4748,6 +4748,68 @@ const paletteValueKeySchema = z.string().transform((value, ctx) => {
4748
4748
  return z.NEVER;
4749
4749
  });
4750
4750
  //#endregion
4751
+ //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
4752
+ /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
4753
+ function resolveOpaqueSurfaceHex(reference, palette, underlayReference) {
4754
+ const opaque = resolveConcreteColorHex(reference, palette);
4755
+ if (opaque) return opaque;
4756
+ if (!underlayReference) return null;
4757
+ const underlayHex = resolveConcreteColorHex(underlayReference, palette);
4758
+ if (!underlayHex) return null;
4759
+ const parts = parseColorTokenParts(reference);
4760
+ if (parts.kind === "token" && parts.opacityPercent !== null) {
4761
+ const foregroundHex = normalizePaletteHex(palette[parts.token] ?? "");
4762
+ return foregroundHex ? compositeHex(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
4763
+ }
4764
+ const rgba = parseRgba(parts.kind === "raw" ? parts.value : reference);
4765
+ return rgba ? compositeHex(rgbToHex(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
4766
+ }
4767
+ /** Resolve a colour reference only when it is already fully opaque. */
4768
+ function resolveConcreteColorHex(reference, palette) {
4769
+ const literalHex = normalizePaletteHex(reference);
4770
+ if (literalHex) return literalHex;
4771
+ const parts = parseColorTokenParts(reference);
4772
+ if (parts.kind === "token") {
4773
+ if (parts.opacityPercent !== null) return null;
4774
+ return normalizePaletteHex(palette[parts.token] ?? "");
4775
+ }
4776
+ const literal = parts.kind === "raw" ? parts.value : reference;
4777
+ if (literal.toLowerCase() === "black") return "#000000";
4778
+ if (literal.toLowerCase() === "white") return "#ffffff";
4779
+ return normalizePaletteHex(literal);
4780
+ }
4781
+ function compositeHex(foregroundHex, underlayHex, alpha) {
4782
+ const foreground = hexToRgb(foregroundHex);
4783
+ const underlay = hexToRgb(underlayHex);
4784
+ const channel = (foregroundValue, underlayValue) => Math.round(foregroundValue * alpha + underlayValue * (1 - alpha));
4785
+ return rgbToHex(channel(foreground.r, underlay.r), channel(foreground.g, underlay.g), channel(foreground.b, underlay.b));
4786
+ }
4787
+ function parseRgba(value) {
4788
+ const match = value.trim().match(/^rgba?\(\s*([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*(?:,|\/)\s*([\d.]+%?))?\s*\)$/i);
4789
+ if (!match) return null;
4790
+ const [, rSource, gSource, bSource] = match;
4791
+ if (!rSource || !gSource || !bSource) return null;
4792
+ const r = Number(rSource);
4793
+ const g = Number(gSource);
4794
+ const b = Number(bSource);
4795
+ const alpha = parseAlpha(match[4]);
4796
+ if (alpha === null || !isRgbChannel(r) || !isRgbChannel(g) || !isRgbChannel(b)) return null;
4797
+ return {
4798
+ r,
4799
+ g,
4800
+ b,
4801
+ alpha
4802
+ };
4803
+ }
4804
+ function parseAlpha(source) {
4805
+ if (!source) return 1;
4806
+ const value = source.endsWith("%") ? Number(source.slice(0, -1)) / 100 : Number(source);
4807
+ return Number.isFinite(value) && value >= 0 && value <= 1 ? value : null;
4808
+ }
4809
+ function isRgbChannel(value) {
4810
+ return Number.isFinite(value) && value >= 0 && value <= 255;
4811
+ }
4812
+ //#endregion
4751
4813
  //#region ../theme-core/src/site-styles/styleTags.ts
4752
4814
  /**
4753
4815
  * Descriptive style-axis metadata for button personalities and palette
@@ -7356,68 +7418,6 @@ function interpolateHex(startHex, endHex, position) {
7356
7418
  const channel = (from, to) => Math.round(from + (to - from) * position).toString(16).padStart(2, "0");
7357
7419
  return `#${channel(start.r, end.r)}${channel(start.g, end.g)}${channel(start.b, end.b)}`;
7358
7420
  }
7359
- //#endregion
7360
- //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
7361
- /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
7362
- function resolveOpaqueSurfaceHex(reference, palette, underlayReference) {
7363
- const opaque = resolveConcreteColorHex(reference, palette);
7364
- if (opaque) return opaque;
7365
- if (!underlayReference) return null;
7366
- const underlayHex = resolveConcreteColorHex(underlayReference, palette);
7367
- if (!underlayHex) return null;
7368
- const parts = parseColorTokenParts(reference);
7369
- if (parts.kind === "token" && parts.opacityPercent !== null) {
7370
- const foregroundHex = normalizePaletteHex(palette[parts.token] ?? "");
7371
- return foregroundHex ? compositeHex(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
7372
- }
7373
- const rgba = parseRgba(parts.kind === "raw" ? parts.value : reference);
7374
- return rgba ? compositeHex(rgbToHex(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
7375
- }
7376
- /** Resolve a colour reference only when it is already fully opaque. */
7377
- function resolveConcreteColorHex(reference, palette) {
7378
- const literalHex = normalizePaletteHex(reference);
7379
- if (literalHex) return literalHex;
7380
- const parts = parseColorTokenParts(reference);
7381
- if (parts.kind === "token") {
7382
- if (parts.opacityPercent !== null) return null;
7383
- return normalizePaletteHex(palette[parts.token] ?? "");
7384
- }
7385
- const literal = parts.kind === "raw" ? parts.value : reference;
7386
- if (literal.toLowerCase() === "black") return "#000000";
7387
- if (literal.toLowerCase() === "white") return "#ffffff";
7388
- return normalizePaletteHex(literal);
7389
- }
7390
- function compositeHex(foregroundHex, underlayHex, alpha) {
7391
- const foreground = hexToRgb(foregroundHex);
7392
- const underlay = hexToRgb(underlayHex);
7393
- const channel = (foregroundValue, underlayValue) => Math.round(foregroundValue * alpha + underlayValue * (1 - alpha));
7394
- return rgbToHex(channel(foreground.r, underlay.r), channel(foreground.g, underlay.g), channel(foreground.b, underlay.b));
7395
- }
7396
- function parseRgba(value) {
7397
- const match = value.trim().match(/^rgba?\(\s*([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*(?:,|\/)\s*([\d.]+%?))?\s*\)$/i);
7398
- if (!match) return null;
7399
- const [, rSource, gSource, bSource] = match;
7400
- if (!rSource || !gSource || !bSource) return null;
7401
- const r = Number(rSource);
7402
- const g = Number(gSource);
7403
- const b = Number(bSource);
7404
- const alpha = parseAlpha(match[4]);
7405
- if (alpha === null || !isRgbChannel(r) || !isRgbChannel(g) || !isRgbChannel(b)) return null;
7406
- return {
7407
- r,
7408
- g,
7409
- b,
7410
- alpha
7411
- };
7412
- }
7413
- function parseAlpha(source) {
7414
- if (!source) return 1;
7415
- const value = source.endsWith("%") ? Number(source.slice(0, -1)) / 100 : Number(source);
7416
- return Number.isFinite(value) && value >= 0 && value <= 1 ? value : null;
7417
- }
7418
- function isRgbChannel(value) {
7419
- return Number.isFinite(value) && value >= 0 && value <= 255;
7420
- }
7421
7421
  /**
7422
7422
  * Derive the hover foreground that belongs with a resolved resting foreground.
7423
7423
  *
@@ -7983,6 +7983,15 @@ function fallbackBackground(fallbackToken, palette) {
7983
7983
  reason: "unresolvable-colour"
7984
7984
  };
7985
7985
  }
7986
+ /** Every role's contextual styles against one proven solid surface. */
7987
+ function knownSurfaceButtonContextStyles(input) {
7988
+ return Object.fromEntries(VARIANT_ROLES.flatMap((role) => Object.entries(contextualButtonSurfaceStyles(resolveContextualButtonRole({
7989
+ role,
7990
+ buttonSystem: input.buttonSystem,
7991
+ palette: input.palette,
7992
+ surface: input.surface
7993
+ })))));
7994
+ }
7986
7995
  function resolveContextualButtonRole(input) {
7987
7996
  const requested = findVariant(input.buttonSystem, input.role);
7988
7997
  if (!requested) return {
@@ -10982,6 +10991,18 @@ function brandNonEmptyString(value, label) {
10982
10991
  if (value.length === 0) throw new Error(`${label} must be a non-empty string.`);
10983
10992
  return value;
10984
10993
  }
10994
+ /**
10995
+ * What a block's own section background field admits, read from its manifest.
10996
+ * A site style's surface rule may paint a gradient or a photo; a block whose
10997
+ * `_sectionStyles.background` refuses that paint would be dropped at render
10998
+ * admission, so the runtime compiler paints the surface's colour equivalent
10999
+ * instead (see `compileSectionBackground`).
11000
+ */
11001
+ const sectionBackgroundPaintValues = [
11002
+ "color",
11003
+ "gradient",
11004
+ "image"
11005
+ ];
10985
11006
  const plainFrame = { kind: "plain" };
10986
11007
  function panelFrame(treatment) {
10987
11008
  return {
@@ -11066,6 +11087,7 @@ function defineBlockDesignCapability(capability) {
11066
11087
  ...capability,
11067
11088
  kind: "designed",
11068
11089
  looks: capability.looks ?? "not-applicable",
11090
+ sectionBackgroundPaints: admittedSectionBackgroundPaints(capability.sectionBackgroundPaints),
11069
11091
  sectionHeights: capability.sectionHeights ?? ["default"],
11070
11092
  imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
11071
11093
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
@@ -11078,6 +11100,10 @@ function defineBlockDesignCapability(capability) {
11078
11100
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
11079
11101
  };
11080
11102
  }
11103
+ /** Absent means the block admits every section background paint. */
11104
+ function admittedSectionBackgroundPaints(paints) {
11105
+ return paints ?? sectionBackgroundPaintValues;
11106
+ }
11081
11107
  //#endregion
11082
11108
  //#region ../theme-core/src/site-styles/logoBranding.ts
11083
11109
  const logoTextConfidenceValues = [
@@ -11356,12 +11382,22 @@ const mediaPresentationSchema = commonSchema.extend({
11356
11382
  const boxBackgroundSchema = z.discriminatedUnion("type", [
11357
11383
  commonSchema.extend({
11358
11384
  type: z.literal("color"),
11359
- color: tokenOrCssColorValueSchema.nullable().optional()
11385
+ color: tokenOrCssColorValueSchema.nullable().optional(),
11386
+ /**
11387
+ * Compiler-owned. The scrim a site-style colour surface lays over media
11388
+ * that replaces it (a Look's band meeting an authored photo), sized so the
11389
+ * surface's foreground stays legible over any pixel. A colour background
11390
+ * never draws it itself; `resolveSectionBackground` moves it onto the
11391
+ * merged media background as its overlay.
11392
+ */
11393
+ mediaScrim: boxBackgroundOverlaySchema.nullable().optional()
11360
11394
  }),
11361
11395
  commonSchema.extend({
11362
11396
  type: z.literal("gradient"),
11363
11397
  gradient: z.string().nullable().optional(),
11364
- gradientPresetId: z.string().min(1).nullable().optional()
11398
+ gradientPresetId: z.string().min(1).nullable().optional(),
11399
+ /** Compiler-owned; see the colour branch. */
11400
+ mediaScrim: boxBackgroundOverlaySchema.nullable().optional()
11365
11401
  }),
11366
11402
  mediaPresentationSchema.extend({
11367
11403
  type: z.literal("image"),
@@ -12159,6 +12195,17 @@ function defineBlockAppearancePreset(preset) {
12159
12195
  * (`defineBlockAppearancePreset` defaults it to `none`) — the block's own
12160
12196
  * composition still governs how its items look. The per-Look rationale for the card-bearing ones lives
12161
12197
  * in `.project/plans/1297-card-role-contract-site-styles-own-card-surfaces/mapping-table.md`.
12198
+ *
12199
+ * A Look asking for the `alternative` or `open` role is offered only where the
12200
+ * site style defines that role (`siteStyleSupportsLookDesign`), so two Looks
12201
+ * that differ only in role are distinct wherever both are offered.
12202
+ *
12203
+ * Retiring a Look is removing its entry. A stored pin to a retired id reads as
12204
+ * an unsupported pin in the page design editor model and renders the block's
12205
+ * auto Look, the same path an unavailable Look takes. Duplicates retired in
12206
+ * the 2026-09 Look audit: `feature-cards-soft-panels`,
12207
+ * `feature-cards-photo-tiles`, `feature-cards-editorial-pathways`,
12208
+ * `testimonials-default-cards`.
12162
12209
  */
12163
12210
  const brandScrimOptionGroups = [{
12164
12211
  id: "image-surface-treatment",
@@ -12543,16 +12590,6 @@ defineBlockAppearancePreset({
12543
12590
  treatment: "framed-programme"
12544
12591
  }
12545
12592
  }
12546
- }), defineBlockAppearancePreset({
12547
- id: "feature-cards-soft-panels",
12548
- target: "feature-cards",
12549
- label: "Soft tinted panels",
12550
- blockKinds: ["block.feature-cards"],
12551
- design: {
12552
- sectionSurface: "base",
12553
- contentFrame: plainFrame,
12554
- cardRole: "alternative"
12555
- }
12556
12593
  }), defineBlockAppearancePreset({
12557
12594
  id: "feature-cards-editorial-diptych",
12558
12595
  target: "feature-cards",
@@ -12564,27 +12601,6 @@ defineBlockAppearancePreset({
12564
12601
  contentFrame: plainFrame,
12565
12602
  cardRole: "default"
12566
12603
  }
12567
- }), defineBlockAppearancePreset({
12568
- id: "feature-cards-editorial-pathways",
12569
- target: "feature-cards",
12570
- label: "Editorial pathways",
12571
- blockKinds: ["block.feature-cards"],
12572
- constraints: { layoutVariantKeys: ["editorial-pathways"] },
12573
- design: {
12574
- sectionSurface: "base",
12575
- contentFrame: plainFrame,
12576
- cardRole: "default"
12577
- }
12578
- }), defineBlockAppearancePreset({
12579
- id: "feature-cards-photo-tiles",
12580
- target: "feature-cards",
12581
- label: "Photo tiles",
12582
- blockKinds: ["block.feature-cards"],
12583
- design: {
12584
- sectionSurface: "base",
12585
- contentFrame: plainFrame,
12586
- cardRole: "default"
12587
- }
12588
12604
  }), defineBlockAppearancePreset({
12589
12605
  id: "events-lined-panel",
12590
12606
  target: "events",
@@ -12673,16 +12689,6 @@ defineBlockAppearancePreset({
12673
12689
  contentFrame: panelFrame("raised"),
12674
12690
  cardRole: "default"
12675
12691
  }
12676
- }), defineBlockAppearancePreset({
12677
- id: "testimonials-default-cards",
12678
- target: "testimonials",
12679
- label: "Default cards",
12680
- blockKinds: ["block.testimonials"],
12681
- design: {
12682
- sectionSurface: "base",
12683
- contentFrame: plainFrame,
12684
- cardRole: "default"
12685
- }
12686
12692
  }), defineBlockAppearancePreset({
12687
12693
  id: "testimonials-statement-cards",
12688
12694
  target: "testimonials",
@@ -16164,9 +16170,7 @@ const curatedSiteStyles = [
16164
16170
  recommendedAppearancePresetIds: [
16165
16171
  "hero-split-editorial",
16166
16172
  "intro-portrait-bio",
16167
- "feature-cards-soft-panels",
16168
- "feature-cards-editorial-columns",
16169
- "feature-cards-photo-tiles",
16173
+ "feature-cards-bold-colors",
16170
16174
  "testimonials-non-carded",
16171
16175
  "faq-contained-help",
16172
16176
  "contact-form-panel"
@@ -16810,8 +16814,7 @@ const curatedSiteStyles = [
16810
16814
  "intro-portrait-bio",
16811
16815
  "feature-cards-editorial-columns",
16812
16816
  "feature-cards-editorial-diptych",
16813
- "feature-cards-editorial-pathways",
16814
- "feature-cards-soft-panels",
16817
+ "feature-cards-bold-colors",
16815
16818
  "events-lined-panel",
16816
16819
  "testimonials-non-carded",
16817
16820
  "faq-base-accordion",
@@ -18617,6 +18620,34 @@ function withLookCapability(declaration) {
18617
18620
  }
18618
18621
  };
18619
18622
  }
18623
+ /**
18624
+ * The section background paints a block's own `_sectionStyles.background`
18625
+ * field admits, read from its manifest so the design capability cannot drift
18626
+ * from what render admission accepts. A block without the field admits none.
18627
+ */
18628
+ function sectionBackgroundPaintsOfFields(fields) {
18629
+ const sectionStyles = fields.find((field) => field.id === "_sectionStyles");
18630
+ if (!sectionStyles || sectionStyles.type !== "modal") return [];
18631
+ const background = sectionStyles.schema.fields.find((field) => field.id === "background");
18632
+ if (!background || background.type !== "tabGroup") return [];
18633
+ const tabIds = new Set(background.tabs.map((tab) => tab.id));
18634
+ return [
18635
+ "color",
18636
+ "gradient",
18637
+ "image"
18638
+ ].filter((paint) => tabIds.has(paint));
18639
+ }
18640
+ /** Pins a designed capability's section background paints to the block's manifest. */
18641
+ function withManifestSectionBackgroundPaints(declaration, fields) {
18642
+ if (declaration.kind !== "capability") return declaration;
18643
+ return {
18644
+ kind: "capability",
18645
+ capability: {
18646
+ ...declaration.capability,
18647
+ sectionBackgroundPaints: sectionBackgroundPaintsOfFields(fields)
18648
+ }
18649
+ };
18650
+ }
18620
18651
  function declareNoBlockDesignCapability(reason) {
18621
18652
  return {
18622
18653
  kind: "none",
@@ -20479,15 +20510,11 @@ function resolveContextualButtonStyles(background, foreground, context, options)
20479
20510
  if (!paletteCache.has(palette)) paletteCache.set(palette, surfaceCache);
20480
20511
  const cached = surfaceCache.get(cacheKey);
20481
20512
  if (cached) return cached;
20482
- const styles = Object.fromEntries(VARIANT_ROLES.flatMap((role) => {
20483
- const resolution = resolveContextualButtonRole({
20484
- role,
20485
- buttonSystem,
20486
- palette,
20487
- surface: surface.surface
20488
- });
20489
- return Object.entries(contextualButtonSurfaceStyles(resolution));
20490
- }));
20513
+ const styles = knownSurfaceButtonContextStyles({
20514
+ surface: surface.surface,
20515
+ palette,
20516
+ buttonSystem
20517
+ });
20491
20518
  surfaceCache.set(cacheKey, styles);
20492
20519
  return styles;
20493
20520
  }
@@ -27175,6 +27202,20 @@ const footerEngagement = stack({
27175
27202
  ...footerSpamProtectionBinding
27176
27203
  }), [], when("module.engagement.kind", { equals: "mailing-list" }))
27177
27204
  ], when("module.kind", { equals: "engagement" }));
27205
+ const platformAttribution = el("div", {
27206
+ className: "rb-caption",
27207
+ "data-site-attribution": "macadamia"
27208
+ }, [
27209
+ text({ as: "span" }, bind("module.lead")),
27210
+ text({
27211
+ as: "span",
27212
+ value: " "
27213
+ }),
27214
+ link({
27215
+ href: { $bind: { from: "module.link.href" } },
27216
+ className: "footer-nav-link rb-caption transition-theme-standard"
27217
+ }, [text({ as: "span" }, bind("module.link.label"))])
27218
+ ], when("module.kind", { equals: "attribution" }));
27178
27219
  const footerGroup = stack({
27179
27220
  gap: "md",
27180
27221
  align: "stretch",
@@ -27204,6 +27245,7 @@ const footerGroup = stack({
27204
27245
  hours,
27205
27246
  socials,
27206
27247
  footerEngagement,
27248
+ platformAttribution,
27207
27249
  stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
27208
27250
  stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
27209
27251
  ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
@@ -30070,14 +30112,18 @@ const calendarTabViewsSchema = z.enum([
30070
30112
  * @param needsPaymentStep - Whether user must complete payment method selection
30071
30113
  * @returns Array of wizard steps to display
30072
30114
  */
30073
- function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
30115
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep, paymentActive = false) {
30074
30116
  const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : [
30075
30117
  "select-event",
30076
30118
  "select-tickets",
30077
30119
  "enter-details"
30078
30120
  ];
30079
30121
  if (!needsPaymentStep) return baseSteps;
30080
- return [...baseSteps, "select-payment"];
30122
+ return paymentActive ? [
30123
+ ...baseSteps,
30124
+ "select-payment",
30125
+ "payment"
30126
+ ] : [...baseSteps, "select-payment"];
30081
30127
  }
30082
30128
  //#endregion
30083
30129
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
@@ -30196,6 +30242,7 @@ const EVENT_REGISTRATION_SHELL_STEP_LABELS = [
30196
30242
  "Date",
30197
30243
  "Tickets",
30198
30244
  "Details",
30245
+ "Payment options",
30199
30246
  "Payment"
30200
30247
  ];
30201
30248
  const eventRegistrationPublicEventSchema = z.preprocess(normalizeEventRegistrationEventInput, publicEventSchema);
@@ -30338,12 +30385,13 @@ function shellLabelForRegistrationStep(step, events) {
30338
30385
  switch (step) {
30339
30386
  case "select-event": return isDateSelection(events) ? "Date" : "Event";
30340
30387
  case "select-tickets": return "Tickets";
30388
+ case "fully-booked":
30341
30389
  case "enter-details": return "Details";
30342
- case "select-payment": return "Payment";
30390
+ case "select-payment": return "Payment options";
30391
+ case "payment": return "Payment";
30343
30392
  case "error":
30344
30393
  case "success":
30345
30394
  case "submitting":
30346
- case "redirecting":
30347
30395
  case "verifying-payment":
30348
30396
  case "verifying-timeout":
30349
30397
  case "payment-status":
@@ -30355,7 +30403,7 @@ function isDateSelection(events) {
30355
30403
  return Boolean(events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId));
30356
30404
  }
30357
30405
  function buildEventRegistrationShellBodyText(stepLabels) {
30358
- if (stepLabels.includes("Payment")) return "Preparing tickets, details, and payment options.";
30406
+ if (stepLabels.includes("Payment options")) return "Preparing tickets, details, and payment options.";
30359
30407
  if (stepLabels[0] === "Tickets") return "Preparing tickets and booking details.";
30360
30408
  return "Preparing dates, tickets, and booking details.";
30361
30409
  }
@@ -32330,7 +32378,8 @@ const eventCalendarLayout = [styledSection({
32330
32378
  fallback: false
32331
32379
  } },
32332
32380
  banded: { $bind: {
32333
- from: "content.banded",
32381
+ from: "content",
32382
+ transforms: [{ id: "events.calendarBanded" }],
32334
32383
  fallback: false
32335
32384
  } }
32336
32385
  }))]
@@ -38485,7 +38534,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
38485
38534
  if (definition.manifest.name !== blockKind) throw new Error(`System block kind mismatch: expected ${blockKind}, received ${definition.manifest.name}.`);
38486
38535
  return {
38487
38536
  ...definition,
38488
- designCapability,
38537
+ designCapability: withManifestSectionBackgroundPaints(designCapability, definition.manifest.fields),
38489
38538
  designMetadata,
38490
38539
  manifest: {
38491
38540
  ...definition.manifest,
@@ -39538,6 +39587,16 @@ const builtinTransformDefinitions = [
39538
39587
  return resolveCalendarReadProfile(asPartialObject(value) ?? {});
39539
39588
  }
39540
39589
  },
39590
+ {
39591
+ id: "events.calendarBanded",
39592
+ kind: "formatter",
39593
+ summary: "Paint the week-board band only on a section with no background of its own",
39594
+ run(value) {
39595
+ const content = asPartialObject(value) ?? {};
39596
+ const sectionStyles = asPartialObject(content._sectionStyles);
39597
+ return content.banded === true && parseBackgroundContent(sectionStyles?.background) === null;
39598
+ }
39599
+ },
39541
39600
  ...formattingTransforms,
39542
39601
  ...layoutTransforms,
39543
39602
  ...chromeLogoTransforms,