@riverbankcms/sdk 0.140.0 → 0.142.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/{PreviewEditorSidebar-CUyTzd5z.mjs → PreviewEditorSidebar-Dk6Dt11f.mjs} +24 -15
- package/dist/{PreviewEditorUI-Agkw4v5i.mjs → PreviewEditorUI-D6EQTsCA.mjs} +3 -3
- package/dist/{PreviewQueryProvider-CN0ewic5.mjs → PreviewQueryProvider-CC-EPkyQ.mjs} +1 -1
- package/dist/{SdkPreviewModeRuntime-DdbeAdS8.mjs → SdkPreviewModeRuntime-DH1n4ytY.mjs} +85 -54
- package/dist/{SiteChromeCustomizeContext-CqGOz-Kv.mjs → SiteChromeCustomizeContext-DunIzY0K.mjs} +797 -216
- package/dist/_dts/api/src/billing.d.ts +6 -1
- package/dist/_dts/api/src/bookingConfig.d.ts +1 -1
- package/dist/_dts/api/src/commercePortalEndpoints.d.ts +2 -2
- package/dist/_dts/api/src/contentRuntime.d.ts +12 -31
- package/dist/_dts/api/src/domainConnection.d.ts +4 -0
- package/dist/_dts/api/src/endpoints.d.ts +0 -27
- package/dist/_dts/api/src/footerCompositionContracts.d.ts +25 -0
- package/dist/_dts/api/src/index.d.ts +2 -2
- package/dist/_dts/api/src/launchReadiness.d.ts +1 -0
- package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +2 -1
- package/dist/_dts/api/src/publicBookingService.d.ts +1 -0
- package/dist/_dts/api/src/sdkConfig/layout.d.ts +13 -0
- package/dist/_dts/api/src/sdkContracts.d.ts +3 -8
- package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -26
- package/dist/_dts/api/src/siteOnboarding.d.ts +7 -0
- package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -31
- package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
- package/dist/_dts/billing/src/site-arrangements.d.ts +18 -5
- package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
- package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -0
- package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -0
- package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +122 -0
- package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +2 -1
- package/dist/_dts/blocks/src/system/blocks/events/shared/eventSelection.d.ts +11 -0
- package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +56 -0
- package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +8 -0
- package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
- package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
- package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +5 -0
- package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
- package/dist/_dts/blocks/src/system/manifest/schema.d.ts +27 -1
- package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -180
- package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -90
- package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +5 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +4 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.state.d.ts +5 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +10 -3
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -5
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.d.ts +37 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +4 -3
- package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +11 -101
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +63 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +2 -0
- package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +12 -0
- package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +4 -0
- package/dist/_dts/commerce/src/purchase/stripeCommissionMetadata.d.ts +1 -2
- package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3102 -3122
- package/dist/_dts/editor-blocks/src/block-editor/ColourFieldOptionsProvider.d.ts +7 -0
- package/dist/_dts/editor-blocks/src/block-editor/colourFieldVisibility.d.ts +7 -0
- package/dist/_dts/editor-blocks/src/block-editor/preparedManifest.d.ts +2 -0
- package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
- package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +27 -1
- package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -2
- package/dist/_dts/preview-next/src/client/preview/PreviewFooterEditorPanel.d.ts +3 -6
- package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -2
- package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -2
- package/dist/_dts/preview-next/src/client/preview/footerInspection.d.ts +16 -0
- package/dist/_dts/preview-next/src/client/preview/sdkConfig.d.ts +6 -0
- package/dist/_dts/sdk/src/config/types.d.ts +2 -18
- package/dist/_dts/sdk/src/config/validation.d.ts +6 -0
- package/dist/_dts/sdk/src/public-api/contracts.d.ts +4 -1
- package/dist/_dts/sdk/src/version.d.ts +1 -1
- package/dist/_dts/theme-core/src/ThemeFontLoader.d.ts +17 -1
- package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +17 -0
- package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +1 -1
- package/dist/_dts/theme-core/src/buttons/classNames.d.ts +16 -0
- package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +0 -6
- package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +4 -4
- package/dist/_dts/theme-core/src/footer/mode.d.ts +10 -1
- package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
- package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +54 -12
- package/dist/_dts/theme-core/src/index.d.ts +1 -1
- package/dist/_dts/theme-core/src/schema.d.ts +1 -7
- package/dist/_dts/theme-core/src/site-styles/effectivePageDesign.d.ts +32 -0
- package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
- package/dist/client/{BookingConsentAgreement-CuKa82V4.mjs → BookingConsentAgreement-CnJeq3_r.mjs} +2 -2
- package/dist/client/{DiscountCodeDisclosure-BbYieKWB.mjs → DiscountCodeDisclosure-BINEO6J9.mjs} +1 -1
- package/dist/client/{EventCombined.client-LTfR1Aby.mjs → EventCombined.client-srxNQ6sZ.mjs} +11 -15
- package/dist/client/{EventListing.client-DUHpYSuo.mjs → EventListing.client-DbyVyGkX.mjs} +4 -17
- package/dist/client/{LeafletStaticMap-CHRupL6m.mjs → LeafletStaticMap-B-wpijzL.mjs} +1 -1
- package/dist/client/{accordion-6HiIFxNL.mjs → accordion-B-iUXU7n.mjs} +1 -1
- package/dist/client/{bookingForm-Dlmid43H.mjs → bookingForm-BXYPke5q.mjs} +5 -5
- package/dist/client/bookings.mjs +194 -102
- package/dist/client/{carousel-DmkZRRq_.mjs → carousel-Cr4aj63H.mjs} +1 -1
- package/dist/client/{cart-CIC24330.mjs → cart-DibP9WWa.mjs} +3 -3
- package/dist/client/{checkout-D1Zw9imo.mjs → checkout-CrSBVnL8.mjs} +3 -3
- package/dist/client/client.mjs +643 -192
- package/dist/client/{context-Cy1OayHx.mjs → context-Ces-AgdR.mjs} +1 -1
- package/dist/client/{dates-aDcfoLHr.mjs → dates-BXyNeNhB.mjs} +2 -2
- package/dist/client/{eventCalendar-FQxMPAjf.mjs → eventCalendar-HwpPeqrH.mjs} +11 -7
- package/dist/client/{eventCombined-Dr3ac6Hb.mjs → eventCombined-BpFUkuEI.mjs} +3 -3
- package/dist/client/{eventDetails-D-AzUHFQ.mjs → eventDetails-DK_agiWy.mjs} +4 -4
- package/dist/client/{eventListing-B3XxBf3i.mjs → eventListing-DhzHqP1c.mjs} +3 -3
- package/dist/client/{eventRegistration-I6EaokFD.mjs → eventRegistration-BdQ_Dn2d.mjs} +124 -32
- package/dist/client/{form-BbWckVWY.mjs → form-B1frcuzy.mjs} +2 -2
- package/dist/client/{headerSection-C9qU4Y7x.mjs → headerSection-CT5z460s.mjs} +2 -2
- package/dist/client/hooks.mjs +274 -45
- package/dist/client/{locationMap-CLCShvlG.mjs → locationMap-CIQXB9i2.mjs} +2 -2
- package/dist/client/{newsletterForm-Briukxzi.mjs → newsletterForm-BYNYZSes.mjs} +23 -10
- package/dist/client/{pricing-Copadu-2.mjs → pricing-CbTlAsmt.mjs} +1 -1
- package/dist/client/{productDetail-oujlRd-r.mjs → productDetail-CR7Z3yjS.mjs} +3 -3
- package/dist/client/{productList-BRiIRUcd.mjs → productList-DXj00vzR.mjs} +3 -3
- package/dist/client/{propsDecoder-CB2KS_ko.mjs → propsDecoder-DiLiBdek.mjs} +57 -16
- package/dist/client/rendering/client.mjs +476 -132
- package/dist/client/rendering/islands.mjs +17 -17
- package/dist/client/rendering.mjs +686 -195
- package/dist/client/{scrollToBlock-B1IS1_ua.mjs → scrollToBlock-CrcbBf0h.mjs} +28 -11
- package/dist/client/{shop-Vn6yNFED.mjs → shop-DgqiB_1b.mjs} +6 -6
- package/dist/client/{shop-commerce-BVTqipYp.mjs → shop-commerce-D_J781in.mjs} +5 -5
- package/dist/client/{shop-commerce-store-BVnJVy7v.mjs → shop-commerce-store-PGUbDwqe.mjs} +1 -1
- package/dist/client/{shopShared-COIeK77T.mjs → shopShared-C_Bb2zwG.mjs} +3 -3
- package/dist/client/{useEventFilters-DzIUcS9n.mjs → useEventFilters-CM17Xpr1.mjs} +17 -11
- package/dist/preview-next/before-render.mjs +0 -37
- package/dist/preview-next/client/runtime.mjs +4 -4
- package/dist/preview-next/editor-chrome.css +4 -8
- package/dist/preview-next/keepAlive.mjs +0 -37
- package/dist/preview-next/middleware.mjs +0 -37
- package/dist/{previewAuthStore-Gjb6r6vz.mjs → previewAuthStore-oVttoRDO.mjs} +0 -37
- package/dist/{sdk-runtime-CnCLvZRv.mjs → sdk-runtime-DhmuRhIX.mjs} +2 -2
- package/dist/{separator-DKDRJ1oH.mjs → separator-C3hlg9LH.mjs} +1 -1
- package/dist/server/components.mjs +452 -111
- package/dist/server/config-validation.mjs +263 -40
- package/dist/server/config.mjs +263 -40
- package/dist/server/data.mjs +274 -45
- package/dist/server/index.mjs +1 -38
- package/dist/server/next.mjs +427 -119
- package/dist/server/page-converter.mjs +208 -33
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +467 -119
- package/dist/server/rendering.mjs +467 -117
- package/dist/server/routing.mjs +301 -50
- package/dist/server/server.mjs +275 -83
- package/dist/server/theme-bridge.mjs +57 -23
- package/dist/server/theme.mjs +11 -9
- package/dist/styles/index.css +28 -2
- package/package.json +1 -1
|
@@ -2461,6 +2461,7 @@ function isDisplayMediaKind$2(kind) {
|
|
|
2461
2461
|
}
|
|
2462
2462
|
const siteOptionSources = [
|
|
2463
2463
|
"eventCategories",
|
|
2464
|
+
"eventSeries",
|
|
2464
2465
|
"venues",
|
|
2465
2466
|
"staffMembers"
|
|
2466
2467
|
];
|
|
@@ -7186,14 +7187,12 @@ function generateVariantCSS(variant, themeId, cardClasses, tokens, theme) {
|
|
|
7186
7187
|
const shadowValue = generateShadowValue$1(shadow);
|
|
7187
7188
|
rules.push(`box-shadow: ${shadowValue}`);
|
|
7188
7189
|
}
|
|
7189
|
-
|
|
7190
|
-
rules.push(`flex-direction: column`);
|
|
7191
|
-
rules.push(`position: relative`);
|
|
7192
|
-
rules.push(`overflow: visible`);
|
|
7190
|
+
const structureSelector = cardClasses.map((cardClass) => `:where([data-theme-scope="${themeId}"]) :where(.${cardClass})`).join(",\n");
|
|
7193
7191
|
const mediaRadius = MEDIA_CORNER_MAP[corners];
|
|
7194
7192
|
const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
|
|
7195
7193
|
const contentRules = [`padding: ${resolveContentPadding(variant)}`];
|
|
7196
7194
|
return [
|
|
7195
|
+
`${structureSelector} {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: visible;\n}`,
|
|
7197
7196
|
`${containerSelector} {\n ${rules.join(";\n ")};\n}`,
|
|
7198
7197
|
...cardDecorationPseudoRules(containerSelectors, variant.decorations, resolveColor),
|
|
7199
7198
|
`${fallbackBackgroundSelector} {\n background: transparent;\n}`,
|
|
@@ -12663,6 +12662,54 @@ function defaultTypographyForRecipe(recipe) {
|
|
|
12663
12662
|
case "classic-serif": return classicSerifTypography;
|
|
12664
12663
|
}
|
|
12665
12664
|
}
|
|
12665
|
+
//#endregion
|
|
12666
|
+
//#region ../theme-core/src/footer/mode.ts
|
|
12667
|
+
const footerModeSchema = z$1.enum([
|
|
12668
|
+
"default",
|
|
12669
|
+
"blocks",
|
|
12670
|
+
"default+blocks",
|
|
12671
|
+
"none"
|
|
12672
|
+
]);
|
|
12673
|
+
/** Reads only SDK footer intent; unrelated config and theme fields are not authorities. */
|
|
12674
|
+
function resolveSdkFooterMode(config) {
|
|
12675
|
+
const parsed = z$1.object({ layout: z$1.object({ footerMode: footerModeSchema.optional() }).optional() }).safeParse(config);
|
|
12676
|
+
return parsed.success ? parsed.data.layout?.footerMode ?? "default" : "default";
|
|
12677
|
+
}
|
|
12678
|
+
/**
|
|
12679
|
+
* Resolve what to render for the footer given the current mode and whether the
|
|
12680
|
+
* site is SDK-managed.
|
|
12681
|
+
*
|
|
12682
|
+
* Backwards compatible: missing/undefined mode is treated as 'default'.
|
|
12683
|
+
*/
|
|
12684
|
+
function resolveFooterRenderPlan(params) {
|
|
12685
|
+
if (!params.isSdkSite) return {
|
|
12686
|
+
mode: "default",
|
|
12687
|
+
renderDefaultFooter: true,
|
|
12688
|
+
renderFooterBlocks: false
|
|
12689
|
+
};
|
|
12690
|
+
switch (params.mode ?? "default") {
|
|
12691
|
+
case "blocks": return {
|
|
12692
|
+
mode: "blocks",
|
|
12693
|
+
renderDefaultFooter: false,
|
|
12694
|
+
renderFooterBlocks: true
|
|
12695
|
+
};
|
|
12696
|
+
case "default+blocks": return {
|
|
12697
|
+
mode: "default+blocks",
|
|
12698
|
+
renderDefaultFooter: true,
|
|
12699
|
+
renderFooterBlocks: true
|
|
12700
|
+
};
|
|
12701
|
+
case "none": return {
|
|
12702
|
+
mode: "none",
|
|
12703
|
+
renderDefaultFooter: false,
|
|
12704
|
+
renderFooterBlocks: false
|
|
12705
|
+
};
|
|
12706
|
+
default: return {
|
|
12707
|
+
mode: "default",
|
|
12708
|
+
renderDefaultFooter: true,
|
|
12709
|
+
renderFooterBlocks: false
|
|
12710
|
+
};
|
|
12711
|
+
}
|
|
12712
|
+
}
|
|
12666
12713
|
const hotspotSchema = z$1.object({
|
|
12667
12714
|
x: z$1.number().min(0).max(1),
|
|
12668
12715
|
y: z$1.number().min(0).max(1),
|
|
@@ -13224,7 +13271,7 @@ const BUTTON_CONTRAST_POLICY = {
|
|
|
13224
13271
|
nonTextMinimumRatio: 3,
|
|
13225
13272
|
gradientSamplesPerSegment: 20,
|
|
13226
13273
|
alphaBackgrounds: "reject-without-known-surface",
|
|
13227
|
-
disabled: "
|
|
13274
|
+
disabled: "validated-colour-pair-with-muted-control-opacity"
|
|
13228
13275
|
};
|
|
13229
13276
|
function formatButtonColourContractError(error) {
|
|
13230
13277
|
switch (error.tag) {
|
|
@@ -13812,6 +13859,25 @@ function parseThemeForPersistence(value) {
|
|
|
13812
13859
|
};
|
|
13813
13860
|
}
|
|
13814
13861
|
//#endregion
|
|
13862
|
+
//#region ../theme-core/src/buttons/affordanceSuppression.ts
|
|
13863
|
+
/**
|
|
13864
|
+
* Internal: the opt-out the generated affordance rule is written against.
|
|
13865
|
+
*
|
|
13866
|
+
* A button style may declare a trailing `affordance`, which the theme renders as
|
|
13867
|
+
* a CSS `::after` on every button of that variant. An authored button that
|
|
13868
|
+
* renders its own trailing icon must not also receive the theme's, or it shows
|
|
13869
|
+
* two.
|
|
13870
|
+
*
|
|
13871
|
+
* Deliberately not exported from `./index`. This used to be public, and two
|
|
13872
|
+
* block components reached past the theme to draw arrows of their own — one of
|
|
13873
|
+
* them doubling up on the styles that declare an affordance, both of them
|
|
13874
|
+
* overriding the twelve styles that deliberately declare none. Whether a button
|
|
13875
|
+
* carries a trailing affordance is the style's decision; the only caller that
|
|
13876
|
+
* legitimately opts out is the authored-button renderer, which reaches it
|
|
13877
|
+
* through `themeButtonClassNameWithTrailingIcon`.
|
|
13878
|
+
*/
|
|
13879
|
+
const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
|
|
13880
|
+
//#endregion
|
|
13815
13881
|
//#region ../theme-core/src/buttons/classNames.ts
|
|
13816
13882
|
/**
|
|
13817
13883
|
* Parse content/runtime variant identifiers into the closed theme-button class
|
|
@@ -13844,6 +13910,27 @@ function themeButtonClassName(spec) {
|
|
|
13844
13910
|
spec.extraClassName
|
|
13845
13911
|
].filter(Boolean).join(" ");
|
|
13846
13912
|
}
|
|
13913
|
+
/**
|
|
13914
|
+
* Button classes for an authored button that renders its own trailing icon.
|
|
13915
|
+
*
|
|
13916
|
+
* A separate function rather than a flag on `themeButtonClassName`, because
|
|
13917
|
+
* there is exactly one caller and it should stay visible in a diff. The name
|
|
13918
|
+
* states what the caller knows to be true of its own markup — that it renders a
|
|
13919
|
+
* trailing icon — rather than what the theme does about it. The consequence is
|
|
13920
|
+
* the theme's to decide and to change; a caller naming the consequence would be
|
|
13921
|
+
* asserting a policy it does not own, and would quietly become a lie the moment
|
|
13922
|
+
* that policy moved.
|
|
13923
|
+
*
|
|
13924
|
+
* Do not reach for this to remove an arrow you simply do not want. A trailing
|
|
13925
|
+
* affordance is declared by the button style, and a block overriding that is the
|
|
13926
|
+
* defect this replaced.
|
|
13927
|
+
*/
|
|
13928
|
+
function themeButtonClassNameWithTrailingIcon(spec) {
|
|
13929
|
+
return themeButtonClassName({
|
|
13930
|
+
...spec,
|
|
13931
|
+
extraClassName: [spec.extraClassName, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ")
|
|
13932
|
+
});
|
|
13933
|
+
}
|
|
13847
13934
|
//#endregion
|
|
13848
13935
|
//#region ../theme-core/src/interactive/generateBaseCSS.ts
|
|
13849
13936
|
/**
|
|
@@ -15756,26 +15843,19 @@ function resolvedButtonFocusDeclarations(indicator, role) {
|
|
|
15756
15843
|
] : [["outline", value("outline", `3px solid ${indicator.colorCss}`)], ["outline-offset", value("outline-offset", "3px")]];
|
|
15757
15844
|
}
|
|
15758
15845
|
/**
|
|
15759
|
-
* Disabled buttons
|
|
15760
|
-
*
|
|
15761
|
-
*
|
|
15762
|
-
* remain observable.
|
|
15846
|
+
* Disabled buttons are deliberately muted as unavailable controls. Native
|
|
15847
|
+
* disabled controls are exempt from active-control contrast requirements;
|
|
15848
|
+
* opacity distinguishes the state without introducing a focus-like outline.
|
|
15849
|
+
* Retaining pointer events lets the not-allowed cursor remain observable.
|
|
15763
15850
|
*/
|
|
15764
15851
|
const RESOLVED_BUTTON_DISABLED_DECLARATIONS = [
|
|
15765
15852
|
["cursor", "not-allowed"],
|
|
15766
15853
|
["transform", "none"],
|
|
15767
15854
|
["box-shadow", "none"],
|
|
15768
|
-
["
|
|
15769
|
-
["outline-offset", "-4px"]
|
|
15855
|
+
["opacity", "0.55"]
|
|
15770
15856
|
];
|
|
15771
15857
|
//#endregion
|
|
15772
15858
|
//#region ../theme-core/src/buttons/generateButtonCss.ts
|
|
15773
|
-
/**
|
|
15774
|
-
* Class the `button` runtime node adds when it renders its own trailing icon,
|
|
15775
|
-
* so a node-level icon suppresses the theme's CSS `::after` affordance.
|
|
15776
|
-
* Shared so generator and renderer can't drift.
|
|
15777
|
-
*/
|
|
15778
|
-
const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
|
|
15779
15859
|
const BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
|
|
15780
15860
|
/**
|
|
15781
15861
|
* Letter spacing token → CSS value.
|
|
@@ -17748,12 +17828,6 @@ const footerVariant = z$1.enum([
|
|
|
17748
17828
|
"split"
|
|
17749
17829
|
]);
|
|
17750
17830
|
const footerMaxWidth = z$1.enum(["container", "full"]);
|
|
17751
|
-
const footerMode = z$1.enum([
|
|
17752
|
-
"default",
|
|
17753
|
-
"blocks",
|
|
17754
|
-
"default+blocks",
|
|
17755
|
-
"none"
|
|
17756
|
-
]);
|
|
17757
17831
|
const footerNavLayoutMode = z$1.enum([
|
|
17758
17832
|
"stack",
|
|
17759
17833
|
"inline",
|
|
@@ -17842,9 +17916,9 @@ const footerSchema = z$1.object({
|
|
|
17842
17916
|
/**
|
|
17843
17917
|
* SDK-only footer rendering mode.
|
|
17844
17918
|
*
|
|
17845
|
-
*
|
|
17919
|
+
* Historical persisted field; SDK rendering mode now lives in layout.footerMode.
|
|
17846
17920
|
*/
|
|
17847
|
-
mode:
|
|
17921
|
+
mode: footerModeSchema.optional(),
|
|
17848
17922
|
variant: footerVariant,
|
|
17849
17923
|
maxWidth: footerMaxWidth,
|
|
17850
17924
|
showLogoText: z$1.boolean().optional(),
|
|
@@ -27941,6 +28015,15 @@ const publicEventBaseSchema = z$1.object({
|
|
|
27941
28015
|
timeZone: z$1.string(),
|
|
27942
28016
|
pricing: publicEventPricingSchema,
|
|
27943
28017
|
paymentTerms: blockBookingPaymentTermsSchema,
|
|
28018
|
+
cancellationPolicy: z$1.object({ refunds: z$1.object({
|
|
28019
|
+
mode: z$1.enum([
|
|
28020
|
+
"never",
|
|
28021
|
+
"always",
|
|
28022
|
+
"cutoff"
|
|
28023
|
+
]),
|
|
28024
|
+
cutoffHours: z$1.number(),
|
|
28025
|
+
method: z$1.enum(["original_payment_method", "site_credit"])
|
|
28026
|
+
}) }),
|
|
27944
28027
|
consent: blockBookingConsentSchema.nullable(),
|
|
27945
28028
|
accessRestriction: accessRestrictionSchema,
|
|
27946
28029
|
allowedCategoryIds: z$1.array(z$1.string()),
|
|
@@ -28071,6 +28154,7 @@ z$1.object({
|
|
|
28071
28154
|
eventSurface: z$1.enum(eventSurfaceScopeValues).optional(),
|
|
28072
28155
|
eventPresets: z$1.string().optional(),
|
|
28073
28156
|
scheduleScope: z$1.enum(eventScheduleScopeValues).optional(),
|
|
28157
|
+
seriesIds: z$1.string().optional(),
|
|
28074
28158
|
categoryIds: z$1.string().optional(),
|
|
28075
28159
|
venueId: z$1.string().transform(normalizeCalendarFilterId).optional(),
|
|
28076
28160
|
staffMemberId: z$1.string().transform(normalizeCalendarFilterId).optional()
|
|
@@ -28121,7 +28205,56 @@ const calendarWindowPageSchema = z$1.discriminatedUnion("kind", [z$1.object({
|
|
|
28121
28205
|
kind: z$1.literal("partial"),
|
|
28122
28206
|
nextCursor: calendarSourceCursorSchema
|
|
28123
28207
|
})]);
|
|
28208
|
+
//#endregion
|
|
28209
|
+
//#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
|
|
28210
|
+
/** Invalid saved selections fail closed rather than widening discovery. */
|
|
28211
|
+
function resolveEventSelection(mode, value) {
|
|
28212
|
+
if (mode !== "selected") return { kind: "matching" };
|
|
28213
|
+
const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
|
|
28214
|
+
const ids = [];
|
|
28215
|
+
for (const candidate of candidates) {
|
|
28216
|
+
if (typeof candidate !== "string") return {
|
|
28217
|
+
kind: "selected",
|
|
28218
|
+
seriesIds: []
|
|
28219
|
+
};
|
|
28220
|
+
const parsed = parseEventSeriesId(candidate.trim());
|
|
28221
|
+
if (!parsed.ok) return {
|
|
28222
|
+
kind: "selected",
|
|
28223
|
+
seriesIds: []
|
|
28224
|
+
};
|
|
28225
|
+
ids.push(parsed.value);
|
|
28226
|
+
}
|
|
28227
|
+
return {
|
|
28228
|
+
kind: "selected",
|
|
28229
|
+
seriesIds: [...new Set(ids)].sort()
|
|
28230
|
+
};
|
|
28231
|
+
}
|
|
28232
|
+
/** Undefined means discovery; an empty string is an explicitly empty selection. */
|
|
28233
|
+
function eventSeriesScopeCsv(value) {
|
|
28234
|
+
if (value == null) return void 0;
|
|
28235
|
+
return typeof value === "string" ? value : value.join(",");
|
|
28236
|
+
}
|
|
28124
28237
|
const defaultTransforms = createTransformRegistry([
|
|
28238
|
+
{
|
|
28239
|
+
id: "events.calendarSelectionParam",
|
|
28240
|
+
kind: "formatter",
|
|
28241
|
+
summary: "Resolve selected events instead of discovery filters",
|
|
28242
|
+
schema: z$1.object({ key: z$1.enum([
|
|
28243
|
+
"seriesIds",
|
|
28244
|
+
"eventSurface",
|
|
28245
|
+
"filterEventPresets",
|
|
28246
|
+
"scheduleScope",
|
|
28247
|
+
"filterCategoryIds",
|
|
28248
|
+
"filterStaffMemberId",
|
|
28249
|
+
"filterVenueId"
|
|
28250
|
+
]) }),
|
|
28251
|
+
run(value, { key }) {
|
|
28252
|
+
const content = asPartialObject(value) ?? {};
|
|
28253
|
+
const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
|
|
28254
|
+
if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
|
|
28255
|
+
return key === "seriesIds" ? void 0 : content[key];
|
|
28256
|
+
}
|
|
28257
|
+
},
|
|
28125
28258
|
{
|
|
28126
28259
|
id: "events.calendarReadEnabled",
|
|
28127
28260
|
kind: "formatter",
|
|
@@ -29875,17 +30008,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
|
|
|
29875
30008
|
if (process.env.NODE_ENV === "development") console.warn("[ButtonNode] Missing href for link-required button");
|
|
29876
30009
|
return null;
|
|
29877
30010
|
}
|
|
29878
|
-
const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
|
|
29879
30011
|
const resolvedVariantId = parseThemeButtonVariantId(variantId);
|
|
29880
30012
|
if (variantId && !resolvedVariantId) {
|
|
29881
30013
|
console.error("[ButtonNode] Invalid button variant", { variantId });
|
|
29882
30014
|
return null;
|
|
29883
30015
|
}
|
|
29884
|
-
const combinedClassName = resolvedVariantId ? themeButtonClassName({
|
|
30016
|
+
const combinedClassName = resolvedVariantId ? (affordanceIcon ? themeButtonClassNameWithTrailingIcon : themeButtonClassName)({
|
|
29885
30017
|
variant: resolvedVariantId,
|
|
29886
30018
|
size,
|
|
29887
|
-
extraClassName
|
|
29888
|
-
}) :
|
|
30019
|
+
extraClassName: className
|
|
30020
|
+
}) : className;
|
|
29889
30021
|
if (resolvedHref) return /* @__PURE__ */ jsxs("a", {
|
|
29890
30022
|
href: resolvedHref,
|
|
29891
30023
|
target,
|
|
@@ -31157,6 +31289,7 @@ const publicPricingSchema = z$1.object({
|
|
|
31157
31289
|
});
|
|
31158
31290
|
const publicAppointmentServiceSchema = z$1.object({
|
|
31159
31291
|
id: z$1.string().min(1),
|
|
31292
|
+
slug: z$1.string().min(1).optional(),
|
|
31160
31293
|
title: z$1.string(),
|
|
31161
31294
|
description: z$1.string().nullable().optional(),
|
|
31162
31295
|
durationMinutes: z$1.number().int().positive(),
|
|
@@ -31233,7 +31366,7 @@ function formatAmountOrFree(amount, currency) {
|
|
|
31233
31366
|
currency
|
|
31234
31367
|
}, { decimals: "auto" });
|
|
31235
31368
|
}
|
|
31236
|
-
function buildRows(services, pathname) {
|
|
31369
|
+
function buildRows(services, pathname, servicePathPrefix) {
|
|
31237
31370
|
return services.map((service) => ({
|
|
31238
31371
|
id: service.id,
|
|
31239
31372
|
title: service.title,
|
|
@@ -31244,7 +31377,8 @@ function buildRows(services, pathname) {
|
|
|
31244
31377
|
href: resolveDedicatedBookingHref(pathname, {
|
|
31245
31378
|
kind: "appointment_service",
|
|
31246
31379
|
serviceId: service.id
|
|
31247
|
-
})
|
|
31380
|
+
}),
|
|
31381
|
+
detailsHref: servicePathPrefix && service.slug ? `${servicePathPrefix.replace(/\/$/, "")}/${encodeURIComponent(service.slug)}` : null
|
|
31248
31382
|
}));
|
|
31249
31383
|
}
|
|
31250
31384
|
function buildAppointmentServicesView(input) {
|
|
@@ -31263,13 +31397,14 @@ function buildAppointmentServicesView(input) {
|
|
|
31263
31397
|
};
|
|
31264
31398
|
return {
|
|
31265
31399
|
kind: "items",
|
|
31266
|
-
rows: buildRows(parsed.services, input.pathname)
|
|
31400
|
+
rows: buildRows(parsed.services, input.pathname, input.servicePathPrefix ?? null)
|
|
31267
31401
|
};
|
|
31268
31402
|
}
|
|
31269
|
-
function AppointmentServicesNode({ sectionHeading, services, pathname, className }) {
|
|
31403
|
+
function AppointmentServicesNode({ sectionHeading, services, pathname, servicePathPrefix, className }) {
|
|
31270
31404
|
const view = buildAppointmentServicesView({
|
|
31271
31405
|
services,
|
|
31272
|
-
pathname: typeof pathname === "string" ? pathname : void 0
|
|
31406
|
+
pathname: typeof pathname === "string" ? pathname : void 0,
|
|
31407
|
+
servicePathPrefix: typeof servicePathPrefix === "string" ? servicePathPrefix : null
|
|
31273
31408
|
});
|
|
31274
31409
|
const rootClassName = `appointment-services ${className ?? ""}`.trim();
|
|
31275
31410
|
const RowTitle = sectionHeading ? "h3" : "h2";
|
|
@@ -31300,7 +31435,10 @@ function AppointmentServicesNode({ sectionHeading, services, pathname, className
|
|
|
31300
31435
|
children: [
|
|
31301
31436
|
/* @__PURE__ */ jsx(RowTitle, {
|
|
31302
31437
|
className: "appointment-services-row-title rb-text-lg rb-font-medium rb-leading-tight",
|
|
31303
|
-
children: row.
|
|
31438
|
+
children: row.detailsHref ? /* @__PURE__ */ jsx("a", {
|
|
31439
|
+
href: row.detailsHref,
|
|
31440
|
+
children: row.title
|
|
31441
|
+
}) : row.title
|
|
31304
31442
|
}),
|
|
31305
31443
|
row.description ? /* @__PURE__ */ jsx("p", {
|
|
31306
31444
|
className: "appointment-services-row-description rb-text-sm rb-leading-6 status-muted",
|
|
@@ -33807,12 +33945,12 @@ const EventCompactRow = ({ event, buttonVariant = "primary", buttonText }) => {
|
|
|
33807
33945
|
}), cta.hidden ? /* @__PURE__ */ jsx("span", {
|
|
33808
33946
|
className: "event-compact-row-status",
|
|
33809
33947
|
children: cta.label
|
|
33810
|
-
}) : /* @__PURE__ */
|
|
33948
|
+
}) : /* @__PURE__ */ jsx("a", {
|
|
33811
33949
|
href: cta.href,
|
|
33812
33950
|
target: cta.external ? "_blank" : void 0,
|
|
33813
33951
|
rel: cta.external ? "noopener noreferrer" : void 0,
|
|
33814
33952
|
className: `${buttonClass} event-compact-row-cta`,
|
|
33815
|
-
children:
|
|
33953
|
+
children: /* @__PURE__ */ jsx("span", { children: cta.label })
|
|
33816
33954
|
})]
|
|
33817
33955
|
})]
|
|
33818
33956
|
})]
|
|
@@ -34905,6 +35043,7 @@ const eventCollectionFilterSourceSchemaShape = {
|
|
|
34905
35043
|
eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
|
|
34906
35044
|
filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
|
|
34907
35045
|
scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
|
|
35046
|
+
seriesIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
|
|
34908
35047
|
filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
|
|
34909
35048
|
filterStaffMemberId: z$1.string().nullable().optional(),
|
|
34910
35049
|
filterVenueId: z$1.string().nullable().optional()
|
|
@@ -34951,6 +35090,7 @@ const eventCollectionDisplaySchemaShape = {
|
|
|
34951
35090
|
eventSurface: eventSurfaceScopeSchema$1,
|
|
34952
35091
|
filterEventPresets: z$1.string().nullable(),
|
|
34953
35092
|
scheduleScope: eventScheduleScopeSchema$1,
|
|
35093
|
+
seriesIds: z$1.string().nullable().optional(),
|
|
34954
35094
|
filterCategoryIds: z$1.string().nullable(),
|
|
34955
35095
|
filterStaffMemberId: z$1.string().nullable(),
|
|
34956
35096
|
filterVenueId: z$1.string().nullable(),
|
|
@@ -34998,11 +35138,15 @@ function buildEventCollectionDisplay(source) {
|
|
|
34998
35138
|
};
|
|
34999
35139
|
}
|
|
35000
35140
|
function buildEventCollectionFilterDisplay(source) {
|
|
35001
|
-
|
|
35002
|
-
|
|
35003
|
-
|
|
35004
|
-
|
|
35005
|
-
|
|
35141
|
+
const selected = source.seriesIds != null;
|
|
35142
|
+
const matchingFilters = selected ? {
|
|
35143
|
+
eventSurface: "all",
|
|
35144
|
+
filterEventPresets: null,
|
|
35145
|
+
scheduleScope: "any",
|
|
35146
|
+
filterCategoryIds: null,
|
|
35147
|
+
filterStaffMemberId: null,
|
|
35148
|
+
filterVenueId: null
|
|
35149
|
+
} : {
|
|
35006
35150
|
eventSurface: normalizeEventSurfaceScope(source.eventSurface),
|
|
35007
35151
|
filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
|
|
35008
35152
|
scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
|
|
@@ -35010,6 +35154,14 @@ function buildEventCollectionFilterDisplay(source) {
|
|
|
35010
35154
|
filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
|
|
35011
35155
|
filterVenueId: normalizeEventVenueId(source.filterVenueId)
|
|
35012
35156
|
};
|
|
35157
|
+
return {
|
|
35158
|
+
seriesIds: eventSeriesScopeCsv(source.seriesIds),
|
|
35159
|
+
showFilters: selected ? false : source.showFilters ?? true,
|
|
35160
|
+
showCategoryFilter: source.showCategoryFilter ?? "auto",
|
|
35161
|
+
showVenueFilter: source.showVenueFilter ?? false,
|
|
35162
|
+
showStaffFilter: source.showStaffFilter ?? true,
|
|
35163
|
+
...matchingFilters
|
|
35164
|
+
};
|
|
35013
35165
|
}
|
|
35014
35166
|
function buildEventCollectionPresentationDisplay(source) {
|
|
35015
35167
|
return {
|
|
@@ -35024,14 +35176,15 @@ function buildEventCollectionPresentationDisplay(source) {
|
|
|
35024
35176
|
}
|
|
35025
35177
|
function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
|
|
35026
35178
|
const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
|
|
35179
|
+
const selected = source.seriesIds != null;
|
|
35027
35180
|
return {
|
|
35028
35181
|
calendarWindow: source.calendarWindow ?? void 0,
|
|
35029
35182
|
siteId: source.siteId,
|
|
35030
35183
|
stage: source.stage,
|
|
35031
35184
|
prefetchedEvents: source.events != null,
|
|
35032
|
-
eventSurface: normalizeEventSurfaceScope(source.eventSurface),
|
|
35033
|
-
filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
|
|
35034
|
-
scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
|
|
35185
|
+
eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
|
|
35186
|
+
filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
|
|
35187
|
+
scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
|
|
35035
35188
|
calendarContext: {
|
|
35036
35189
|
timeZone,
|
|
35037
35190
|
initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
|
|
@@ -35601,13 +35754,10 @@ function OfferingsPreviewContent(props) {
|
|
|
35601
35754
|
}),
|
|
35602
35755
|
groupCta ? /* @__PURE__ */ jsx("footer", {
|
|
35603
35756
|
className: "offerings-preview-card-footer rb-mt-auto rb-flex",
|
|
35604
|
-
children: /* @__PURE__ */
|
|
35757
|
+
children: /* @__PURE__ */ jsx("a", {
|
|
35605
35758
|
className: groupLinkClass,
|
|
35606
35759
|
href: groupCta.href,
|
|
35607
|
-
children:
|
|
35608
|
-
"aria-hidden": "true",
|
|
35609
|
-
className: "offerings-preview-link-icon rb-h-4 rb-w-4"
|
|
35610
|
-
})]
|
|
35760
|
+
children: /* @__PURE__ */ jsx("span", { children: groupCta.label })
|
|
35611
35761
|
})
|
|
35612
35762
|
}) : null
|
|
35613
35763
|
]
|
|
@@ -38552,6 +38702,65 @@ const formBlockDefinition = {
|
|
|
38552
38702
|
runtime: formBlockRuntime
|
|
38553
38703
|
};
|
|
38554
38704
|
//#endregion
|
|
38705
|
+
//#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
|
|
38706
|
+
const eventSelectionFields = [{
|
|
38707
|
+
id: "eventSelection",
|
|
38708
|
+
type: "select",
|
|
38709
|
+
label: "Events to show",
|
|
38710
|
+
required: false,
|
|
38711
|
+
multiple: false,
|
|
38712
|
+
defaultValue: "matching",
|
|
38713
|
+
options: [{
|
|
38714
|
+
value: "matching",
|
|
38715
|
+
label: "All matching events"
|
|
38716
|
+
}, {
|
|
38717
|
+
value: "selected",
|
|
38718
|
+
label: "Selected events"
|
|
38719
|
+
}],
|
|
38720
|
+
ui: { intent: "behavior" }
|
|
38721
|
+
}, createSiteOptionSelectField({
|
|
38722
|
+
id: "selectedEventSeriesIds",
|
|
38723
|
+
label: "Selected events",
|
|
38724
|
+
description: "Show upcoming dates for these events. Other event filters do not apply.",
|
|
38725
|
+
required: false,
|
|
38726
|
+
multiple: true,
|
|
38727
|
+
defaultValue: [],
|
|
38728
|
+
optionSource: "eventSeries",
|
|
38729
|
+
ui: {
|
|
38730
|
+
intent: "behavior",
|
|
38731
|
+
searchThreshold: 1,
|
|
38732
|
+
visibleWhen: {
|
|
38733
|
+
field: "eventSelection",
|
|
38734
|
+
equals: "selected"
|
|
38735
|
+
}
|
|
38736
|
+
}
|
|
38737
|
+
})];
|
|
38738
|
+
function withEventSelectionVisibility(field) {
|
|
38739
|
+
if (![
|
|
38740
|
+
"eventSurface",
|
|
38741
|
+
"filterEventPresets",
|
|
38742
|
+
"scheduleScope",
|
|
38743
|
+
"filterCategoryIds",
|
|
38744
|
+
"filterStaffMemberId",
|
|
38745
|
+
"filterVenueId",
|
|
38746
|
+
"showFilters",
|
|
38747
|
+
"showCategoryFilter",
|
|
38748
|
+
"showVenueFilter",
|
|
38749
|
+
"showStaffFilter"
|
|
38750
|
+
].includes(field.id)) return field;
|
|
38751
|
+
const visibleWhen = field.ui?.visibleWhen;
|
|
38752
|
+
return {
|
|
38753
|
+
...field,
|
|
38754
|
+
ui: {
|
|
38755
|
+
...field.ui,
|
|
38756
|
+
visibleWhen: { allOf: [{
|
|
38757
|
+
field: "eventSelection",
|
|
38758
|
+
notEquals: "selected"
|
|
38759
|
+
}, ...visibleWhen ? [visibleWhen] : []] }
|
|
38760
|
+
}
|
|
38761
|
+
};
|
|
38762
|
+
}
|
|
38763
|
+
//#endregion
|
|
38555
38764
|
//#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
|
|
38556
38765
|
const eventCalendarSourceSchema = z$1.object({
|
|
38557
38766
|
...eventCollectionSourceSchemaShape,
|
|
@@ -38649,19 +38858,59 @@ function buildEventCalendarInteractiveIslandProps(props) {
|
|
|
38649
38858
|
//#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
|
|
38650
38859
|
const scopeParams = {
|
|
38651
38860
|
siteId: { $bind: { from: "$root.siteId" } },
|
|
38861
|
+
seriesIds: { $bind: {
|
|
38862
|
+
from: "content",
|
|
38863
|
+
transforms: [{
|
|
38864
|
+
id: "events.calendarSelectionParam",
|
|
38865
|
+
options: { key: "seriesIds" }
|
|
38866
|
+
}]
|
|
38867
|
+
} },
|
|
38652
38868
|
stage: { $bind: {
|
|
38653
38869
|
from: "$root.previewStage",
|
|
38654
38870
|
fallback: "published"
|
|
38655
38871
|
} },
|
|
38656
|
-
eventSurface: { $bind: {
|
|
38872
|
+
eventSurface: { $bind: {
|
|
38873
|
+
from: "content",
|
|
38874
|
+
transforms: [{
|
|
38875
|
+
id: "events.calendarSelectionParam",
|
|
38876
|
+
options: { key: "eventSurface" }
|
|
38877
|
+
}, { id: "value.csv" }]
|
|
38878
|
+
} },
|
|
38657
38879
|
eventPresets: { $bind: {
|
|
38658
|
-
from: "content
|
|
38659
|
-
transforms: [{
|
|
38880
|
+
from: "content",
|
|
38881
|
+
transforms: [{
|
|
38882
|
+
id: "events.calendarSelectionParam",
|
|
38883
|
+
options: { key: "filterEventPresets" }
|
|
38884
|
+
}, { id: "value.csv" }]
|
|
38660
38885
|
} },
|
|
38661
|
-
scheduleScope: { $bind: {
|
|
38662
|
-
|
|
38663
|
-
|
|
38664
|
-
|
|
38886
|
+
scheduleScope: { $bind: {
|
|
38887
|
+
from: "content",
|
|
38888
|
+
transforms: [{
|
|
38889
|
+
id: "events.calendarSelectionParam",
|
|
38890
|
+
options: { key: "scheduleScope" }
|
|
38891
|
+
}, { id: "value.csv" }]
|
|
38892
|
+
} },
|
|
38893
|
+
categoryIds: { $bind: {
|
|
38894
|
+
from: "content",
|
|
38895
|
+
transforms: [{
|
|
38896
|
+
id: "events.calendarSelectionParam",
|
|
38897
|
+
options: { key: "filterCategoryIds" }
|
|
38898
|
+
}, { id: "value.csv" }]
|
|
38899
|
+
} },
|
|
38900
|
+
staffMemberId: { $bind: {
|
|
38901
|
+
from: "content",
|
|
38902
|
+
transforms: [{
|
|
38903
|
+
id: "events.calendarSelectionParam",
|
|
38904
|
+
options: { key: "filterStaffMemberId" }
|
|
38905
|
+
}, { id: "value.csv" }]
|
|
38906
|
+
} },
|
|
38907
|
+
venueId: { $bind: {
|
|
38908
|
+
from: "content",
|
|
38909
|
+
transforms: [{
|
|
38910
|
+
id: "events.calendarSelectionParam",
|
|
38911
|
+
options: { key: "filterVenueId" }
|
|
38912
|
+
}, { id: "value.csv" }]
|
|
38913
|
+
} }
|
|
38665
38914
|
};
|
|
38666
38915
|
/** Combined renders two jobs; calendar-only variants never pay for the list seed. */
|
|
38667
38916
|
const eventCalendarDataLoaders = {
|
|
@@ -38791,6 +39040,13 @@ const eventCalendarLayout = [styledSection({
|
|
|
38791
39040
|
from: "content.defaultCalendarView",
|
|
38792
39041
|
fallback: "month"
|
|
38793
39042
|
} },
|
|
39043
|
+
seriesIds: { $bind: {
|
|
39044
|
+
from: "content",
|
|
39045
|
+
transforms: [{
|
|
39046
|
+
id: "events.calendarSelectionParam",
|
|
39047
|
+
options: { key: "seriesIds" }
|
|
39048
|
+
}]
|
|
39049
|
+
} },
|
|
38794
39050
|
showFilters: { $bind: {
|
|
38795
39051
|
from: "content.showFilters",
|
|
38796
39052
|
fallback: true
|
|
@@ -38812,17 +39068,47 @@ const eventCalendarLayout = [styledSection({
|
|
|
38812
39068
|
fallback: true
|
|
38813
39069
|
} },
|
|
38814
39070
|
eventSurface: { $bind: {
|
|
38815
|
-
from: "content
|
|
38816
|
-
|
|
39071
|
+
from: "content",
|
|
39072
|
+
transforms: [{
|
|
39073
|
+
id: "events.calendarSelectionParam",
|
|
39074
|
+
options: { key: "eventSurface" }
|
|
39075
|
+
}]
|
|
39076
|
+
} },
|
|
39077
|
+
filterEventPresets: { $bind: {
|
|
39078
|
+
from: "content",
|
|
39079
|
+
transforms: [{
|
|
39080
|
+
id: "events.calendarSelectionParam",
|
|
39081
|
+
options: { key: "filterEventPresets" }
|
|
39082
|
+
}]
|
|
38817
39083
|
} },
|
|
38818
|
-
filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
|
|
38819
39084
|
scheduleScope: { $bind: {
|
|
38820
|
-
from: "content
|
|
38821
|
-
|
|
39085
|
+
from: "content",
|
|
39086
|
+
transforms: [{
|
|
39087
|
+
id: "events.calendarSelectionParam",
|
|
39088
|
+
options: { key: "scheduleScope" }
|
|
39089
|
+
}]
|
|
39090
|
+
} },
|
|
39091
|
+
filterCategoryIds: { $bind: {
|
|
39092
|
+
from: "content",
|
|
39093
|
+
transforms: [{
|
|
39094
|
+
id: "events.calendarSelectionParam",
|
|
39095
|
+
options: { key: "filterCategoryIds" }
|
|
39096
|
+
}]
|
|
39097
|
+
} },
|
|
39098
|
+
filterStaffMemberId: { $bind: {
|
|
39099
|
+
from: "content",
|
|
39100
|
+
transforms: [{
|
|
39101
|
+
id: "events.calendarSelectionParam",
|
|
39102
|
+
options: { key: "filterStaffMemberId" }
|
|
39103
|
+
}]
|
|
39104
|
+
} },
|
|
39105
|
+
filterVenueId: { $bind: {
|
|
39106
|
+
from: "content",
|
|
39107
|
+
transforms: [{
|
|
39108
|
+
id: "events.calendarSelectionParam",
|
|
39109
|
+
options: { key: "filterVenueId" }
|
|
39110
|
+
}]
|
|
38822
39111
|
} },
|
|
38823
|
-
filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
|
|
38824
|
-
filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
|
|
38825
|
-
filterVenueId: { $bind: { from: "content.filterVenueId" } },
|
|
38826
39112
|
cardRole: { $bind: {
|
|
38827
39113
|
from: "content._cardStyles.role",
|
|
38828
39114
|
fallback: "default"
|
|
@@ -39326,6 +39612,7 @@ const eventCalendarAdditionalFields = [
|
|
|
39326
39612
|
}
|
|
39327
39613
|
}
|
|
39328
39614
|
},
|
|
39615
|
+
...eventSelectionFields,
|
|
39329
39616
|
{
|
|
39330
39617
|
id: "eventSurface",
|
|
39331
39618
|
type: "select",
|
|
@@ -39535,7 +39822,7 @@ const eventCalendarBlockDefinition = {
|
|
|
39535
39822
|
titleSource: "heading",
|
|
39536
39823
|
description: "Display events with calendar, list, or combined views with filtering",
|
|
39537
39824
|
skipSectionStyles: true,
|
|
39538
|
-
additionalFields: eventCalendarAdditionalFields,
|
|
39825
|
+
additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
|
|
39539
39826
|
styleTokens: {
|
|
39540
39827
|
background: "surface",
|
|
39541
39828
|
typography: "body",
|
|
@@ -39644,6 +39931,7 @@ const eventListingHydrationSchema = z$1.object({
|
|
|
39644
39931
|
eventSurface: eventSurfaceScopeSchema,
|
|
39645
39932
|
filterEventPresets: z$1.string().nullable(),
|
|
39646
39933
|
scheduleScope: eventScheduleScopeSchema,
|
|
39934
|
+
seriesIds: z$1.string().nullable().optional(),
|
|
39647
39935
|
filterCategoryIds: z$1.string().nullable().optional(),
|
|
39648
39936
|
filterStaffMemberId: z$1.string().nullable().optional(),
|
|
39649
39937
|
filterVenueId: z$1.string().nullable().optional(),
|
|
@@ -39704,6 +39992,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
|
|
|
39704
39992
|
eventSurface: normalizeEventSurfaceScope(source.eventSurface),
|
|
39705
39993
|
filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
|
|
39706
39994
|
scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
|
|
39995
|
+
seriesIds: eventSeriesScopeCsv(source.seriesIds),
|
|
39707
39996
|
filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
|
|
39708
39997
|
filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
|
|
39709
39998
|
filterVenueId: normalizeEventVenueId(source.filterVenueId),
|
|
@@ -45061,9 +45350,56 @@ function generateNavLinkCSS(options) {
|
|
|
45061
45350
|
if (baseRules.length > 0) cssChunks.unshift(`\n${selector} {\n ${baseRules.join("\n ")}\n}\n`);
|
|
45062
45351
|
if (hoverRules.length > 0) cssChunks.push(`\n${hoverSelector} {\n ${hoverRules.join("\n ")}\n}\n`);
|
|
45063
45352
|
if (activeRules.length > 0) cssChunks.push(`\n${activeSelector} {\n ${activeRules.join("\n ")}\n}\n`);
|
|
45353
|
+
cssChunks.push(navLinkFocusVisibleCss(selector, style, theme, tokens));
|
|
45064
45354
|
cssChunks.push(generateInteractiveChildInheritanceCSS(selector));
|
|
45065
45355
|
return cssChunks.join("");
|
|
45066
45356
|
}
|
|
45357
|
+
/**
|
|
45358
|
+
* Keyboard focus indicator for nav links, in the header, the footer and header
|
|
45359
|
+
* dropdown menus — the three surfaces `generateNavLinkCSS` serves.
|
|
45360
|
+
*
|
|
45361
|
+
* Emitted unconditionally rather than as an effect, because focus visibility is
|
|
45362
|
+
* a floor rather than a style choice. Only the interaction-palette pill ever
|
|
45363
|
+
* wrote an `effects.focus` group, so every other nav — every `quiet` palette,
|
|
45364
|
+
* every footer, every dropdown — previously fell back to whatever outline the
|
|
45365
|
+
* browser drew.
|
|
45366
|
+
*
|
|
45367
|
+
* The outline takes the link's own resolved colour, so on a header that adapts
|
|
45368
|
+
* to the section it floats over it moves with the adaptation instead of
|
|
45369
|
+
* asserting a brand colour against an unknown backdrop.
|
|
45370
|
+
*
|
|
45371
|
+
* Where the style asks for `soft-glow`, the same halo goes on the outline. That
|
|
45372
|
+
* treatment exists because the theme has already conceded the resolved colour
|
|
45373
|
+
* alone is not reliable over an unpredictable backdrop — a hero photograph with
|
|
45374
|
+
* mixed luminance. Without it the text would stay legible by its halo while the
|
|
45375
|
+
* focus ring, which is the part with a contrast requirement of its own, would
|
|
45376
|
+
* not.
|
|
45377
|
+
*
|
|
45378
|
+
* A style that also paints a focus pill keeps it: this adds an outline around
|
|
45379
|
+
* that pill rather than replacing it.
|
|
45380
|
+
*/
|
|
45381
|
+
function navLinkFocusVisibleCss(selector, style, theme, tokens) {
|
|
45382
|
+
const color = tokens.getColor(style.colorToken);
|
|
45383
|
+
const halo = buildTextContrastShadow({
|
|
45384
|
+
theme,
|
|
45385
|
+
colorToken: style.colorToken,
|
|
45386
|
+
treatment: style.contrastTreatment
|
|
45387
|
+
});
|
|
45388
|
+
return `
|
|
45389
|
+
${selector}:focus-visible {
|
|
45390
|
+
outline: 2px solid ${color};
|
|
45391
|
+
outline-offset: ${focusOutlineOffset(selector)};${halo ? `\n box-shadow: ${halo};` : ""}
|
|
45392
|
+
}
|
|
45393
|
+
`;
|
|
45394
|
+
}
|
|
45395
|
+
/**
|
|
45396
|
+
* Dropdown items are full-width inside a panel with no horizontal padding, so
|
|
45397
|
+
* an outset outline would paint over and past the panel's own border. Keeping
|
|
45398
|
+
* it flush is the only way it reads as belonging to the item.
|
|
45399
|
+
*/
|
|
45400
|
+
function focusOutlineOffset(selector) {
|
|
45401
|
+
return selector.includes("nav-dropdown-link") ? "-2px" : "3px";
|
|
45402
|
+
}
|
|
45067
45403
|
function buildTextContrastShadow(input) {
|
|
45068
45404
|
if (input.treatment !== "soft-glow") return null;
|
|
45069
45405
|
return isLikelyLightColorToken(input.theme, input.colorToken) ? "0 1px 3px rgb(0 0 0 / 0.55), 0 0 18px rgb(0 0 0 / 0.38)" : "0 1px 3px rgb(255 255 255 / 0.72), 0 0 18px rgb(255 255 255 / 0.5)";
|
|
@@ -48196,7 +48532,7 @@ function pageBlockPosition(index, blockCount) {
|
|
|
48196
48532
|
//#endregion
|
|
48197
48533
|
//#region ../blocks/src/pageRendererContracts.ts
|
|
48198
48534
|
function buildPageRendererRootRuntime(dataContext) {
|
|
48199
|
-
const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
|
|
48535
|
+
const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], appointmentServicePathPrefix = null, mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
|
|
48200
48536
|
return {
|
|
48201
48537
|
siteId,
|
|
48202
48538
|
pageId,
|
|
@@ -48206,6 +48542,7 @@ function buildPageRendererRootRuntime(dataContext) {
|
|
|
48206
48542
|
apiBaseUrl,
|
|
48207
48543
|
portalToken,
|
|
48208
48544
|
bookingOfferingPresets,
|
|
48545
|
+
appointmentServicePathPrefix,
|
|
48209
48546
|
mailingList,
|
|
48210
48547
|
eventRegistrationOverlayEnabled,
|
|
48211
48548
|
loaderFailures
|
|
@@ -52948,7 +53285,8 @@ const appointmentServicesBlockDefinition = {
|
|
|
52948
53285
|
el("appointment-services", {
|
|
52949
53286
|
sectionHeading: { $bind: { from: "content.heading" } },
|
|
52950
53287
|
services: { $bind: { from: "data.services" } },
|
|
52951
|
-
pathname: { $bind: { from: "$root.pathname" } }
|
|
53288
|
+
pathname: { $bind: { from: "$root.pathname" } },
|
|
53289
|
+
servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
|
|
52952
53290
|
})
|
|
52953
53291
|
], { gap: "lg" })
|
|
52954
53292
|
})]
|
|
@@ -59401,10 +59739,19 @@ const containerResponsiveThemeCss = `/*
|
|
|
59401
59739
|
padding-top: 2.5rem;
|
|
59402
59740
|
padding-bottom: 2.5rem;
|
|
59403
59741
|
}
|
|
59742
|
+
/* Clearance for a surface that is not an authored block page.
|
|
59743
|
+
An authored page gets this through its opening block's container (see the
|
|
59744
|
+
overlay-clearance rule in styles.css). A reserved surface or a system
|
|
59745
|
+
destination page has no such block, so it consumes the same variable here.
|
|
59746
|
+
Marked with one class rather than per-surface selectors, because the last
|
|
59747
|
+
two additions to this family were both missed and shipped overlapping. */
|
|
59404
59748
|
:where(.theme-scope)
|
|
59405
59749
|
[data-site-document-layout-mode="header-overlay"]
|
|
59406
|
-
|
|
59407
|
-
padding-top: calc(
|
|
59750
|
+
.rb-overlay-clearance-surface {
|
|
59751
|
+
padding-top: calc(
|
|
59752
|
+
var(--site-overlay-header-clearance, 5.5rem) +
|
|
59753
|
+
var(--site-overlay-opening-content-extra-pad, clamp(1rem, 2vw, 1.75rem))
|
|
59754
|
+
);
|
|
59408
59755
|
}
|
|
59409
59756
|
.rb-preview-editor-offset {
|
|
59410
59757
|
padding-bottom: calc(
|
|
@@ -69761,6 +70108,23 @@ const containerResponsiveThemeCss = `/*
|
|
|
69761
70108
|
gap: 0.5rem;
|
|
69762
70109
|
}
|
|
69763
70110
|
|
|
70111
|
+
/* Error panel and field notes. The form block scopes these to its own
|
|
70112
|
+
data-block, so the newsletter form (which also renders in the footer)
|
|
70113
|
+
needs its own copy of the treatment. */
|
|
70114
|
+
:where(.theme-scope) .newsletter-form .fb-error:not([data-field-validation-message]) {
|
|
70115
|
+
background-color: var(--fb-error-bg);
|
|
70116
|
+
color: var(--fb-error-text);
|
|
70117
|
+
border: 1px solid var(--fb-error-border);
|
|
70118
|
+
border-radius: var(--rb-block-radius);
|
|
70119
|
+
padding: 1rem;
|
|
70120
|
+
font-size: 0.875rem;
|
|
70121
|
+
}
|
|
70122
|
+
|
|
70123
|
+
:where(.theme-scope) .newsletter-form [data-field-validation-message] {
|
|
70124
|
+
font-size: 0.875rem;
|
|
70125
|
+
color: var(--fb-error-text);
|
|
70126
|
+
}
|
|
70127
|
+
|
|
69764
70128
|
/* Required indicator */
|
|
69765
70129
|
:where(.theme-scope) .newsletter-required {
|
|
69766
70130
|
color: rgb(var(--tb-primary));
|
|
@@ -72027,41 +72391,6 @@ function ThemeScope$1({ theme, children, themeId = "theme-default", responsiveMo
|
|
|
72027
72391
|
children
|
|
72028
72392
|
});
|
|
72029
72393
|
}
|
|
72030
|
-
/**
|
|
72031
|
-
* Resolve what to render for the footer given the current mode and whether the
|
|
72032
|
-
* site is SDK-managed.
|
|
72033
|
-
*
|
|
72034
|
-
* Backwards compatible: missing/undefined mode is treated as 'default'.
|
|
72035
|
-
*/
|
|
72036
|
-
function resolveFooterRenderPlan(params) {
|
|
72037
|
-
if (!params.isSdkSite) return {
|
|
72038
|
-
mode: "default",
|
|
72039
|
-
renderDefaultFooter: true,
|
|
72040
|
-
renderFooterBlocks: false
|
|
72041
|
-
};
|
|
72042
|
-
switch (params.mode ?? "default") {
|
|
72043
|
-
case "blocks": return {
|
|
72044
|
-
mode: "blocks",
|
|
72045
|
-
renderDefaultFooter: false,
|
|
72046
|
-
renderFooterBlocks: true
|
|
72047
|
-
};
|
|
72048
|
-
case "default+blocks": return {
|
|
72049
|
-
mode: "default+blocks",
|
|
72050
|
-
renderDefaultFooter: true,
|
|
72051
|
-
renderFooterBlocks: true
|
|
72052
|
-
};
|
|
72053
|
-
case "none": return {
|
|
72054
|
-
mode: "none",
|
|
72055
|
-
renderDefaultFooter: false,
|
|
72056
|
-
renderFooterBlocks: false
|
|
72057
|
-
};
|
|
72058
|
-
default: return {
|
|
72059
|
-
mode: "default",
|
|
72060
|
-
renderDefaultFooter: true,
|
|
72061
|
-
renderFooterBlocks: false
|
|
72062
|
-
};
|
|
72063
|
-
}
|
|
72064
|
-
}
|
|
72065
72394
|
//#endregion
|
|
72066
72395
|
//#region ../theme-core/src/ResponsiveScope.tsx
|
|
72067
72396
|
/**
|
|
@@ -72129,6 +72458,15 @@ z$1.object({
|
|
|
72129
72458
|
}).optional(),
|
|
72130
72459
|
overrides: z$1.record(z$1.string(), z$1.string()).optional()
|
|
72131
72460
|
}).passthrough();
|
|
72461
|
+
z$1.object({
|
|
72462
|
+
palette: paletteColorsSchema,
|
|
72463
|
+
paletteMode: paletteModeSchema,
|
|
72464
|
+
typography: z$1.object({
|
|
72465
|
+
headingFamily: z$1.string().trim().min(1),
|
|
72466
|
+
bodyFamily: z$1.string().trim().min(1)
|
|
72467
|
+
}).strict(),
|
|
72468
|
+
corners
|
|
72469
|
+
}).strict();
|
|
72132
72470
|
//#endregion
|
|
72133
72471
|
//#region src/rendering/blocks-theme-runtime.ts
|
|
72134
72472
|
function parseBlocksTheme(theme) {
|
|
@@ -74451,7 +74789,7 @@ async function Layout(props) {
|
|
|
74451
74789
|
if (footer === true) {
|
|
74452
74790
|
const footerPlan = resolveFooterRenderPlan({
|
|
74453
74791
|
isSdkSite: Boolean(site.is_sdk_site),
|
|
74454
|
-
mode:
|
|
74792
|
+
mode: resolveSdkFooterMode(siteData.sdkConfig)
|
|
74455
74793
|
});
|
|
74456
74794
|
const footerBlocksElement = footerPlan.renderFooterBlocks && footerBlocks.length > 0 ? /* @__PURE__ */ jsx(PageRenderer, {
|
|
74457
74795
|
theme,
|
|
@@ -77072,11 +77410,14 @@ const sdkSiteStyleConfigSchema = z$1.object({
|
|
|
77072
77410
|
sectionOptions: sdkSectionOptionsConfigSchema.optional(),
|
|
77073
77411
|
containerOptions: sdkContainerOptionsConfigSchema.optional()
|
|
77074
77412
|
});
|
|
77075
|
-
const sdkSiteLayoutConfigSchema = z$1.object({
|
|
77076
|
-
|
|
77077
|
-
|
|
77078
|
-
|
|
77079
|
-
|
|
77413
|
+
const sdkSiteLayoutConfigSchema = z$1.object({
|
|
77414
|
+
footerMode: footerModeSchema.optional(),
|
|
77415
|
+
footerBlocks: z$1.array(z$1.object({
|
|
77416
|
+
id: z$1.string().min(1).optional(),
|
|
77417
|
+
kind: z$1.string().min(1),
|
|
77418
|
+
content: z$1.record(z$1.string(), z$1.unknown()).optional()
|
|
77419
|
+
})).optional()
|
|
77420
|
+
});
|
|
77080
77421
|
const sdkFieldSelectOptionSchema = z$1.object({
|
|
77081
77422
|
value: z$1.string(),
|
|
77082
77423
|
label: z$1.string()
|