@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.
- package/dist/EventEmbeddedCheckoutStep-D00Kc8Zj.mjs +285 -0
- package/dist/{PreviewEditorSidebar-DBKln68M.mjs → PreviewEditorSidebar-7ZhmmnBB.mjs} +3 -3
- package/dist/{PreviewEditorUI-DpRX4Mum.mjs → PreviewEditorUI-BIJucTRd.mjs} +2 -2
- package/dist/{SdkPreviewModeRuntime-DJPmPY-r.mjs → SdkPreviewModeRuntime-tj45gmCX.mjs} +4 -3
- package/dist/{SiteChromeCustomizeContext-JYA0cJ_Z.mjs → SiteChromeCustomizeContext-BFOt0ss-.mjs} +4454 -4059
- package/dist/_dts/ai/src/contracts/proposals.d.ts +660 -0
- package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +510 -0
- package/dist/_dts/api/src/billing.d.ts +2 -2
- package/dist/_dts/api/src/contentRuntime.d.ts +5 -1
- package/dist/_dts/api/src/footerCompositionContracts.d.ts +9 -0
- package/dist/_dts/api/src/footerSettings.d.ts +3 -3
- package/dist/_dts/api/src/index.d.ts +1 -1
- package/dist/_dts/api/src/navigation/bookingPortalLink.d.ts +13 -0
- package/dist/_dts/api/src/navigation.d.ts +1 -0
- package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +9 -173
- package/dist/_dts/api/src/sdkThemeWire.d.ts +12 -0
- package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -3
- package/dist/_dts/api/src/siteSettings.d.ts +2 -0
- package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -1
- package/dist/_dts/blocks/src/client.d.ts +2 -1
- package/dist/_dts/blocks/src/rendering/server.d.ts +1 -1
- package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +30 -3
- package/dist/_dts/blocks/src/system/designCapabilities.d.ts +10 -1
- package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +38 -18
- package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.server.d.ts +6 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventEmbeddedCheckoutStep.d.ts +13 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationPayment.d.ts +15 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +0 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/FullyBookedStep.d.ts +6 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentBlockingPanel.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentSelectionStep.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +15 -5
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +4 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/paymentLocation.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/paymentResponse.d.ts +72 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationCompletion.d.ts +66 -5
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationErrorRecovery.d.ts +1 -4
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationStateMachine.d.ts +13 -5
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/sessionStorage.d.ts +11 -52
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +19 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.d.ts +7 -42
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +7 -8
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +90 -24
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useGuestRegistrationRecovery.d.ts +30 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/usePaymentStatusRecovery.d.ts +24 -12
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useRegistrationAdmission.d.ts +18 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/wizardSteps.d.ts +6 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/shared/stripe/browserStripe.d.ts +8 -0
- package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +8 -0
- package/dist/_dts/commerce/src/purchase/checkoutCopy.d.ts +10 -0
- package/dist/_dts/commerce/src/purchase/checkoutPresentation.d.ts +49 -0
- package/dist/_dts/commerce/src/purchase/checkoutSessionMetadata.d.ts +4 -4
- package/dist/_dts/commerce/src/purchase/checkoutStripeFinalizationPlanning.d.ts +5 -1
- package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +9 -0
- package/dist/_dts/commerce/src/purchase/index.d.ts +2 -0
- package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +1 -0
- package/dist/_dts/commerce/src/purchase/stripeCheckoutReturnUrl.d.ts +9 -2
- package/dist/_dts/commerce/src/purchase/types.d.ts +5 -6
- package/dist/_dts/content-editor/src/FooterComposerOverview.d.ts +3 -2
- package/dist/_dts/content-editor/src/footerPreviewRuntime.d.ts +6 -1
- package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +7 -0
- package/dist/_dts/core/src/index.d.ts +1 -0
- package/dist/_dts/core/src/patch/index.d.ts +30 -0
- package/dist/_dts/db/src/generated/supabase/database.types.d.ts +30 -1
- package/dist/_dts/sdk/src/bookings/index.d.ts +2 -1
- package/dist/_dts/sdk/src/bookings/types.d.ts +1 -1
- package/dist/_dts/sdk/src/version.d.ts +1 -1
- package/dist/_dts/theme-core/src/blocks/index.d.ts +1 -0
- package/dist/_dts/theme-core/src/blocks/opaquePanels.d.ts +147 -0
- package/dist/_dts/theme-core/src/boxBackgroundSchema.d.ts +22 -0
- package/dist/_dts/theme-core/src/buttons/buttonSurfaceContext.d.ts +22 -0
- package/dist/_dts/theme-core/src/cards/roles.d.ts +12 -0
- package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
- package/dist/_dts/theme-core/src/mock-themes/all.d.ts +198 -0
- package/dist/_dts/theme-core/src/palette/utils/index.d.ts +2 -0
- package/dist/_dts/theme-core/src/palette/utils/scrimContrast.d.ts +22 -0
- package/dist/_dts/theme-core/src/runtime/bridgeColourTokens.d.ts +10 -0
- package/dist/_dts/theme-core/src/schema.d.ts +330 -0
- package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +0 -51
- package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +0 -51
- package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +11 -0
- package/dist/_dts/theme-core/src/site-styles/pageDesignEditorCapabilities.d.ts +7 -1
- package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +7 -1
- package/dist/_dts/theme-core/src/site-styles/previewRuntimeCapabilities.d.ts +12 -6
- package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +7 -4
- package/dist/_dts/theme-core/src/site-styles/sectionSurfaceBackgrounds.d.ts +65 -0
- package/dist/_dts/theme-core/src/site-styles/types.d.ts +17 -0
- package/dist/_dts/theme-core/src/surfaces/opaqueSurface.d.ts +43 -0
- package/dist/client/{BookingMailingListNote-Cr3EeTP5.mjs → BookingMailingListNote-CYHOufsI.mjs} +10 -440
- package/dist/client/{CheckboxChoice-B33MqoUo.mjs → CheckboxChoice-M-3HycLw.mjs} +1 -1
- package/dist/client/{DemoBookingPortalAccess-BFGB1Fay.mjs → DemoBookingPortalAccess-Cvr9O_ca.mjs} +2 -2
- package/dist/client/{EventCombined.client-DKYV0_ft.mjs → EventCombined.client-m5UZIobP.mjs} +7 -7
- package/dist/client/EventEmbeddedCheckoutStep-DL6zFAkA.mjs +289 -0
- package/dist/client/{EventListing.client-B9UIcEYc.mjs → EventListing.client-DeMfCM04.mjs} +2 -2
- package/dist/client/{LeafletStaticMap-CFLPkP0K.mjs → LeafletStaticMap-CvZ3gOdD.mjs} +1 -1
- package/dist/client/{checkoutUrls-CXhko2Rv.mjs → RichText-BtfNvQV6.mjs} +2 -29
- package/dist/client/{TerminalPanel-JjmgxEsR.mjs → TerminalPanel-CUCNEwlH.mjs} +2 -18
- package/dist/client/{ThemedButton-CKV1Jh2m.mjs → ThemedButton-C7WhXuRl.mjs} +2 -2
- package/dist/client/{accordion-DXWIfT3T.mjs → accordion-cQm5mjqs.mjs} +1 -1
- package/dist/client/{bookingForm-CjZgHNvv.mjs → bookingForm-BVPJE5RQ.mjs} +11 -10
- package/dist/client/bookings.mjs +2668 -1134
- package/dist/client/{carousel-DSLikmvZ.mjs → carousel-3vgnY7LC.mjs} +2 -2
- package/dist/client/{carousel.client-A2lG-9od.mjs → carousel.client-CISsdZvg.mjs} +1 -1
- package/dist/client/{cart-HDjWReFt.mjs → cart-BGK4oOjm.mjs} +3 -3
- package/dist/client/{checkout-CUvRZA3W.mjs → checkout-GsBLUNJD.mjs} +3 -3
- package/dist/client/checkoutUrls-ChxwaNtO.mjs +28 -0
- package/dist/client/client.mjs +3042 -1868
- package/dist/client/{colorStyles-j5U9v5JA.mjs → colorStyles-D-32xHZh.mjs} +2 -30
- package/dist/client/{context-DFmaZa-Q.mjs → context-D_8s12Fp.mjs} +1 -1
- package/dist/client/{dates-BBep1JnF.mjs → dates-DeJQbQ9T.mjs} +2 -2
- package/dist/client/{eventCalendar-zEobhxo4.mjs → eventCalendar-cmucD4NR.mjs} +10 -10
- package/dist/client/{eventCombined-Dp7bz5k-.mjs → eventCombined-ku3E9FTl.mjs} +4 -4
- package/dist/client/{eventDetails-FE-zqTt7.mjs → eventDetails-CyKZ61sF.mjs} +5 -5
- package/dist/client/{eventListing-BMt5snal.mjs → eventListing-B7yxGIhX.mjs} +4 -4
- package/dist/client/{eventRegistration-O6ZxHfOb.mjs → eventRegistration-BoXfSFgZ.mjs} +1403 -857
- package/dist/client/{form-DFa1D8vt.mjs → form-CNQOWhJo.mjs} +5 -5
- package/dist/client/{headerSection-CmjHLR-N.mjs → headerSection-DahaBJGQ.mjs} +3 -3
- package/dist/client/hooks.mjs +123 -64
- package/dist/client/{locationMap-BXKP_lGh.mjs → locationMap-BoDjqYlW.mjs} +4 -4
- package/dist/client/{media-Cl38iOMI.mjs → media-BFY0y2rb.mjs} +2 -1
- package/dist/client/{newsletterForm-CU-HmxGx.mjs → newsletterForm-DtzXDklw.mjs} +4 -4
- package/dist/client/{pricing-KEAEsibq.mjs → pricing-DXEh2Lhh.mjs} +1 -1
- package/dist/client/{productDetail-Ckp7MGnt.mjs → productDetail-D7cPa-00.mjs} +3 -3
- package/dist/client/{productList-D91V0sYa.mjs → productList-D1XMap66.mjs} +3 -3
- package/dist/client/{propsDecoder-DZd6RJeA.mjs → propsDecoder-DiIeBopB.mjs} +758 -245
- package/dist/client/rendering/client.mjs +4381 -2892
- package/dist/client/rendering/islands.mjs +19 -19
- package/dist/client/rendering.mjs +3026 -1852
- package/dist/client/result-DRW7JWXz.mjs +30 -0
- package/dist/client/{routeIslandApiConfig-E1EkhhYY.mjs → routeIslandApiConfig-wzR4lKAY.mjs} +1 -1
- package/dist/client/scrollToBlock-C86BYkyV.mjs +17 -0
- package/dist/client/{shop-4F2jLQPI.mjs → shop-CYT5P-S5.mjs} +8 -8
- package/dist/client/{shop-commerce-store-vicweP2K.mjs → shop-commerce-store-wKhsJQxI.mjs} +1 -1
- package/dist/client/{shop-commerce-BbfCJjB3.mjs → shop-commerce-ypBu_dx4.mjs} +9 -9
- package/dist/client/{shopShared-DlONJt0T.mjs → shopShared-DFGhYrf2.mjs} +52 -6
- package/dist/client/{useEventFilters-COYyL3m7.mjs → useEventFilters-blSbN5o7.mjs} +8 -8
- package/dist/preview-next/client/runtime.mjs +3 -3
- package/dist/{sdk-runtime-CwvFFjB-.mjs → sdk-runtime-2p8uQk1V.mjs} +1 -1
- package/dist/{separator-ByL72zUT.mjs → separator-Cvvzk0Oo.mjs} +1 -1
- package/dist/server/components.mjs +4066 -3765
- package/dist/server/config-validation.mjs +185 -126
- package/dist/server/config.mjs +185 -126
- package/dist/server/data.mjs +123 -64
- package/dist/server/index.mjs +1 -1
- package/dist/server/next.mjs +615 -314
- package/dist/server/page-converter.mjs +100 -56
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +4041 -3751
- package/dist/server/rendering.mjs +4069 -3768
- package/dist/server/routing.mjs +149 -72
- package/dist/server/server.mjs +124 -65
- package/dist/server/theme-bridge.mjs +1122 -310
- package/dist/server/theme.mjs +126 -116
- package/dist/spinner-CDo6AkDz.mjs +658 -0
- package/dist/styles/index.css +75 -212
- package/package.json +1 -1
- package/dist/_dts/billing/src/checkout/platform.d.ts +0 -77
- package/dist/_dts/billing/src/config/env.d.ts +0 -29
- package/dist/_dts/billing/src/stripe/client.d.ts +0 -29
- package/dist/_dts/blocks/src/system/runtime/hooks/usePaymentVerification.d.ts +0 -63
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +0 -9
- 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-
|
|
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-
|
|
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 =
|
|
20483
|
-
|
|
20484
|
-
|
|
20485
|
-
|
|
20486
|
-
|
|
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 [
|
|
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
|
|
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,
|