riverbankcms 0.8.0 → 0.9.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.
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { $ as generateBaseInteractiveCSS, $n as createContentEntryRef, $t as NAV_LINK_LETTER_SPACING_MAP, A as getGradientPreset, An as featuresFromHex, At as resolveTokenOrCssColorValue, B as generateCssVars, Bn as normalizeCardRole, Bt as featureCardCompositionTreatmentValues, C as retargetCompiledBoundaryRuntimeForContentAdjacency, Cn as resolveSurfaceForeground, Ct as MQ_SM_DOWN, D as compileTransitionRuntime, Dn as defaultThemeTokens, Dt as isCssColorLiteral, E as getCuratedSiteStyle, En as buildThemeTokens, Et as headerVariantValues, F as parseBackgroundAppearanceColorToken, Fn as surfaceForegroundStyle, Ft as defineBlockDesignCapability, G as resolvedButtonColourDeclarations, Gn as footerModeSchema, Gt as testimonialsCompositionTreatmentValues, H as PUBLIC_BUTTON_ROLES, Hn as mediaSchema, Ht as introCompositionTreatmentValues, I as defineBlockDesignMetadata, In as surfaceForegroundValue, It as defineFrameCapability, J as contextualButtonSurfaceStyles, Jn as unsafeAsOpaqueButtonColourToken, Jt as getComponentBorderWidthPx, K as resolvedButtonFocusDeclarations, Kn as VARIANT_ROLES, Kt as tileTreatmentValues, L as require_jsx_runtime, Ln as generateShadowValue$1, Lt as defineNoBlockDesignCapability, M as boundaryRuntimeMetricsForTransition, Mn as oklchToHexGamut, N as backgroundAppearanceColorTokenNames, Nn as DEFAULT_SURFACE_TEXT_COLOR, Nt as asDesignBlockId, O as gradientToCss, On as ORDINARY_TEXT_MIN_CONTRAST_RATIO, Ot as resolveOnColorForThemeToken, P as backgroundAppearanceQuickColorTokenNames, Pn as surfaceForegroundDeclarations, Pt as assertNever$4, Q as generateEffectsCSS, Qn as createCommandRef, Qt as NAV_LINK_BORDER_RADIUS_MAP, R as require_react, Rn as cardRoleSchema, Rt as eventListTreatmentValues, Sn as textColorStyle, St as MQ_MD_DOWN, T as readHeaderNavFontSizePreference, Tn as onColorTokenName, Tt as MQ_TABLET_ONLY, U as generateButtonCss, Un as mediaTypeDiscriminants, Ut as makeBoundaryId, Vn as mediaIdentifierSchema, Vt as headingDecorationColorTokenValues, W as RESOLVED_BUTTON_DISABLED_DECLARATIONS, Wn as persistableMediaSchema, Wt as offeringsPreviewCompositionTreatmentValues, X as resolveContextualButtonRole, Xn as createBlockRef, Xt as parseBlockCustomCssRules, Y as deriveButtonSurfaceContext, Yn as parseBlockColorToken, Yt as getComponentShadowVar, Z as generateDefaultButtonSystem, Zn as createBlocksRef, Zt as parseCustomCssRules, _ as entryIdentifierForCommand, _n as backgroundColorStyle, _t as BREAKPOINT_LG, a as classifySdkEventBookingOffer, an as INPUT_SPACING_MAP, ar as createPageRef, at as compileButtonColourStates, b as pagePathForCommand, bn as mergeStyles, bt as BREAKPOINT_XL, c as stableStringify, cn as ACCORDION_SPACING_MAP, cr as refSlug, ct as expandPalette, d as mapEventCommandContent, dn as ICON_CONFIG, dt as boxBackgroundOverlaySchema, en as NAV_LINK_PADDING_MAP, er as createEventCategoryRef, et as generateInteractiveChildInheritanceCSS, f as evaluateSiteCommandBatchExposure, fn as ICON_SIZE_PX, ft as boxBackgroundSchema, g as blockOrderIdentifiersForCommand, gn as TokenResolver, gt as renderHeaderPaintTargetRules, h as blockIdentifierForCommand, hn as generateCardCss, ht as getHeaderPaintTargets, in as INPUT_FONT_SIZE_MAP, ir as createNavigationRef, it as parseThemeForPersistence, j as parseGradientPresetId, jn as hexToRgb, jt as pageDesignEditorBackgroundOverrideOwner, k as GRADIENT_PRESET_IDS, kn as contrastRatio, kt as resolveThemeColorReferenceValue, l as createDryRunReport, ln as ACCORDION_TRIGGER_FONT_SCALE, lr as slugPart, lt as getTextColorForBackground, m as getSiteCommandMetadata, mn as getDefaultCardVariants, mt as generateMobileOverlayBackdropFilterFix, nn as NAV_LINK_TEXT_SIZE_MAP, nr as createFooterRef, nt as themeButtonClassName, o as venueManagementFields, on as LABEL_FONT_SIZE_MAP, or as createSiteCommandSiteRef, ot as formatButtonColourContractError, p as evaluateSiteCommandExposure, pn as generateCardCoreCss, pt as generateHeaderScrollTreatmentStyles, q as contextualButtonSurfaceResetStyles, qn as buttonVariantIdSchema, qt as visibleHeadingDecorationFamilyValues, rn as FONT_WEIGHT_MAP, rr as createFormRef, rt as themeButtonClassNameWithTrailingIcon, s as sortRecord, sn as ACCORDION_OPEN_ACCENT_THICKNESS, sr as createVenueRef, st as generateShadowValue, t as classifySdkEventTiming, tn as NAV_LINK_PADDING_X_MAP, tr as createEventSeriesRef, tt as parseThemeButtonVariantId, u as parseAndPlanCommandBatchForTypes, un as ACCORDION_TRIGGER_LETTER_SPACING, ur as __toESM, ut as themeSchema, v as pageIdentifierForBlockCommand, vn as borderColorStyle, vt as BREAKPOINT_MD, w as mergeHeaderNavTypographyPreference, wn as isOnColorBackgroundCandidateToken, wt as MQ_SM_UP, x as hasConfiguredBookingVertical, xn as rgbColorValue, xt as MQ_LG_UP, y as pageIdentifierForCommand, yn as cssVarValue, yt as BREAKPOINT_SM, z as pickShadeTowardBackground, zn as cardVariantRoleValues, zt as eyebrowTreatmentValues } from "../sdk-event-upsert-Bf6wAl4s.mjs";
3
- import { $ as formatEventPricing, A as parseFooterCompositionV1, B as formatBookingTime, C as parseMailingListContentVersionId, D as DEFAULT_MAILING_LIST_SUCCESS_MESSAGE, E as planMailingListChoicePresentation, Et as unsafeAsMediaAssetId, F as normalizeLocationAddressText, G as getLocalScheduleTime, H as formatLocalScheduleTime, Ht as ok, I as toLocationCoordinates, It as unsafeAsStaffMemberId, J as toScheduledBookingDateRange, L as buildBookingUtcDateWindow, N as assertAllowedPublicUrl, O as parseMailingListProviderScope, Q as formatBookingPriceDisplay, R as formatBookingDate, S as parseMailingListBlockId, T as parseMailingListRuntimeContext, U as getBookingLocalDateKey, V as formatLocalScheduleDate, Vt as err, W as getLocalScheduleDate, Y as toScheduledBookingDateTime, Z as parseEventPageSurfaceSubject, _ as createSecret, at as resolvePricingOptionsPriceDisplay, bt as unsafeAsDemoCapability, c as DEFAULT_EVENT_TYPE_PRESETS, ct as formatCurrencyAmount, d as SURFACE_EVENT_PRESET_VALUES, dt as parseEventSeriesId, et as isPublicEventPricingOptionDisplayable, f as WHOLE_SERIES_EVENT_PRESET_VALUES, ft as parseMediaAssetId, g as resolveWholeSeriesBookingPhase, gt as unsafeAsAppointmentResourceId, h as orderedLiveRunSessions, ht as parseUserId, i as isEventSeriesVerticalPresetDefinition, it as resolveExactOrFreePriceDisplay, j as parseMailingListPlacementTargeting, kt as unsafeAsPositiveByteCount, l as EVENT_PRESET_VALUES, lt as assertNever, m as CANCELLED_SESSION_STATUS, mt as parseSiteId, n as areConfiguredBookingVerticalConfigsEqual, nt as publicEventPricingDisplay, p as publicReadFreshnessSeconds, pt as parsePageId, q as toBookingTimeZone, rt as publicEventPricingType, s as resolveSiteVerticalBookingConfig, t as NAVIGATION_LOCATIONS, tt as publicEventPricingCurrency, ut as parseApiKeyId, v as exposeSecret, w as parseMailingListSignedSourceToken, x as buildMailingListSignupBlockSourceRef, y as parseManagementKey, z as formatBookingDateParts } from "../src-B8fOSKJ6.mjs";
4
- import { $ as sdkUpsertEventResponseSchema, A as resolveMediaTransformForAspect, B as asRecord$1, C as walkAndCollectImageAttrs, D as normalizeWidthCandidates, E as rotateNormalizedPoint, F as buildMediaIdentifierFromFilename, G as parseSafeDownloadFilename, H as FILE_SIZE_LIMITS, I as parseMediaIdentifier, J as createHttpClient, K as ManagementApiError, L as deriveVideoSlotPolicy, M as getDirectImageUrlForSiteScopedPath, N as getImageUrl, O as isExplicitRectCrop, P as isSiteScopedDirectImageStoragePath, Q as sdkListEventsResponseSchema, R as resolveVideoSelectionIntentForMediaField, S as buildRenderableMediaAssetIndex, T as looksLikeUuid$1, U as classifyKnownMimeType, V as parseRelativeStoragePath, W as managementMediaLibraryUploadLimitForMimeType, X as sdkConfigureBookingVerticalResponseSchema, Y as is404Error, Z as sdkGetEventResponseSchema, _ as buildSettingsUpdateInput, _t as sdkConfiguredBookingVerticalConfigSchema, a as prepareLocalMediaForPush, at as externalLinkSchema$1, b as isMediaValue, c as writeBinaryFileAtomic, ct as internalRouteOnlyLinkSchema, d as normalizeMediaValueToIdentifierOnly, dt as linkSchema, et as sdkSettingsUpdateSchema, f as walkLocalContentMedia, ft as pageLinkSchema$1, g as SETTINGS_FILE_FIELDS, gt as sdkReorderResponseSchema, h as extractMediaIdentifiers, ht as sdkListEventOccurrencesResponseSchema, i as applyLocalMediaPush, it as entryLinkSchema$1, j as getDirectImageUrlForRelativePath, k as parseAspectRatioValue, l as sha256, lt as isInternalResolvedLinkValue, m as downloadMedia, mt as sdkEventOccurrenceResponseSchema, nt as RESOLVED_INTERNAL_LINK_ENTITY_TYPES, o as admitBinaryWriteDestination, ot as internalLinkSchema, p as buildStorageUrl, pt as sdkDeleteEventOccurrenceResponseSchema, q as buildRequestInfo, r as syncLocalMediaForPull, rt as customLinkSchema$1, s as readStableBinaryFile, st as internalResolvedLinkSchema, t as revalidateLocalMediaPushPlan, tt as linkPayloadSchema, u as normalizeMediaIdentifierInput, ut as isResolvedInternalLinkEntityType, v as hasOwnSettingsField, w as deleteEnvSpecificKeys, x as attachRenderableMediaAssetFields, y as writeMediaManifest, z as getMimeType } from "../local-sync-EcUwLrRx.mjs";
5
- import { n as CliSdkPeerError, r as CLI_VERSION, t as loadConfigFile } from "../load-config-De0cFlPg.mjs";
6
- import { a as RichTextDocSchema, c as isRecord$17, i as findUnfilledSentinels, n as buildEntryScaffold, o as isRichTextDoc, r as validateEntryInstance, s as isObjectRecord, t as eventUpsertInputSchema } from "../eventUpsertInputSchema-BE3nSNsn.mjs";
7
- import { a as prepareScaffoldExecution, c as LOCAL_PACKAGE_VENDOR_DIR, d as loadGeneratedPackageRanges, i as preflightScaffoldTargets, n as createScaffoldCompletion, s as deriveScaffoldLocalManifest, t as deriveScaffoldPlan } from "../plan-DtQEnwCM.mjs";
2
+ import { $ as generateBaseInteractiveCSS, $n as parseBlockColorToken, $t as NAV_LINK_BORDER_RADIUS_MAP, A as getGradientPreset, An as buildThemeTokens, At as resolveThemeColorReferenceValue, B as generateCssVars, Bn as surfaceForegroundValue, Bt as eyebrowTreatmentValues, C as retargetCompiledBoundaryRuntimeForContentAdjacency, Cn as textColorStyle, Ct as MQ_MD_DOWN, D as compileTransitionRuntime, Dn as resolveSurfaceForeground, Dt as headerVariantValues, E as getCuratedSiteStyle, En as surfaceToneFromForegroundToken, Et as MQ_TABLET_ONLY, F as parseBackgroundAppearanceColorToken, Fn as hexToRgb, Ft as assertNever$4, G as resolvedButtonColourDeclarations, Gn as mediaIdentifierSchema, Gt as offeringsPreviewCompositionTreatmentValues, H as PUBLIC_BUTTON_ROLES, Hn as cardRoleSchema, Ht as headingDecorationColorTokenValues, I as defineBlockDesignMetadata, In as oklchToHexGamut, It as defineBlockDesignCapability, J as contextualButtonSurfaceStyles, Jn as persistableMediaSchema, Jt as visibleHeadingDecorationFamilyValues, K as resolvedButtonFocusDeclarations, Kn as mediaSchema, Kt as testimonialsCompositionTreatmentValues, L as require_jsx_runtime, Ln as DEFAULT_SURFACE_TEXT_COLOR, Lt as defineFrameCapability, M as boundaryRuntimeMetricsForTransition, Mn as ORDINARY_TEXT_MIN_CONTRAST_RATIO, Mt as pageDesignEditorBackgroundOverrideOwner, N as backgroundAppearanceColorTokenNames, Nn as contrastRatio, O as gradientToCss, On as isOnColorBackgroundCandidateToken, Ot as isCssColorLiteral, P as backgroundAppearanceQuickColorTokenNames, Pn as featuresFromHex, Pt as asDesignBlockId, Q as generateEffectsCSS, Qn as unsafeAsOpaqueButtonColourToken, Qt as parseCustomCssRules, R as require_react, Rn as surfaceForegroundDeclarations, Rt as defineNoBlockDesignCapability, Sn as rgbColorValue, St as MQ_LG_UP, T as readHeaderNavFontSizePreference, Tn as selectLogoVariant, Tt as MQ_SM_UP, U as generateButtonCss, Un as cardVariantRoleValues, Ut as introCompositionTreatmentValues, Vn as generateShadowValue$1, Vt as featureCardCompositionTreatmentValues, W as RESOLVED_BUTTON_DISABLED_DECLARATIONS, Wn as normalizeCardRole, Wt as makeBoundaryId, X as resolveContextualButtonRole, Xn as VARIANT_ROLES, Xt as getComponentShadowVar, Y as deriveButtonSurfaceContext, Yn as footerModeSchema, Yt as getComponentBorderWidthPx, Z as generateDefaultButtonSystem, Zn as buttonVariantIdSchema, Zt as parseBlockCustomCssRules, _ as entryIdentifierForCommand, _n as TokenResolver, _t as renderHeaderPaintTargetRules, a as classifySdkEventBookingOffer, an as INPUT_FONT_SIZE_MAP, ar as createEventSeriesRef, at as parseThemeForPersistence, b as pagePathForCommand, bn as cssVarValue, bt as BREAKPOINT_SM, c as stableStringify, cn as ACCORDION_OPEN_ACCENT_THICKNESS, cr as createNavigationRef, ct as generateShadowValue, d as mapEventCommandContent, dn as ACCORDION_TRIGGER_LETTER_SPACING, dr as createVenueRef, dt as themeSchema, en as NAV_LINK_LETTER_SPACING_MAP, er as createBlockRef, et as generateInteractiveChildInheritanceCSS, f as evaluateSiteCommandBatchExposure, fn as ICON_CONFIG, fr as refSlug, ft as boxBackgroundOverlaySchema, g as blockOrderIdentifiersForCommand, gn as generateCardCss, gt as getHeaderPaintTargets, h as blockIdentifierForCommand, hn as getDefaultCardVariants, ht as generateMobileOverlayBackdropFilterFix, in as FONT_WEIGHT_MAP, ir as createEventCategoryRef, it as themeButtonVariantClassNames, j as parseGradientPresetId, jn as defaultThemeTokens, jt as resolveTokenOrCssColorValue, k as GRADIENT_PRESET_IDS, kn as onColorTokenName, kt as resolveOnColorForThemeToken, l as createDryRunReport, ln as ACCORDION_SPACING_MAP, lr as createPageRef, lt as expandPalette, m as getSiteCommandMetadata, mn as generateCardCoreCss, mr as __toESM, mt as generateHeaderScrollTreatmentStyles, nn as NAV_LINK_PADDING_X_MAP, nr as createCommandRef, nt as themeButtonExtraClassesWithTrailingIcon, o as venueManagementFields, on as INPUT_SPACING_MAP, or as createFooterRef, ot as compileButtonColourStates, p as evaluateSiteCommandExposure, pn as ICON_SIZE_PX, pr as slugPart, pt as boxBackgroundSchema, q as contextualButtonSurfaceResetStyles, qn as mediaTypeDiscriminants, qt as tileTreatmentValues, rn as NAV_LINK_TEXT_SIZE_MAP, rr as createContentEntryRef, rt as themeButtonSizeClassName, s as sortRecord, sn as LABEL_FONT_SIZE_MAP, sr as createFormRef, st as formatButtonColourContractError, t as classifySdkEventTiming, tn as NAV_LINK_PADDING_MAP, tr as createBlocksRef, tt as parseThemeButtonVariantId, u as parseAndPlanCommandBatchForTypes, un as ACCORDION_TRIGGER_FONT_SCALE, ur as createSiteCommandSiteRef, ut as getTextColorForBackground, v as pageIdentifierForBlockCommand, vn as backgroundColorStyle, vt as BREAKPOINT_LG, w as mergeHeaderNavTypographyPreference, wn as textColorValue, wt as MQ_SM_DOWN, x as hasConfiguredBookingVertical, xn as mergeStyles, xt as BREAKPOINT_XL, y as pageIdentifierForCommand, yn as borderColorStyle, yt as BREAKPOINT_MD, z as pickShadeTowardBackground, zn as surfaceForegroundStyle, zt as eventListTreatmentValues } from "../sdk-event-upsert-BNxbxaA0.mjs";
3
+ import { $ as formatEventPricing, A as parseFooterCompositionV1, B as formatBookingTime, C as parseMailingListContentVersionId, D as DEFAULT_MAILING_LIST_SUCCESS_MESSAGE, E as planMailingListChoicePresentation, Et as unsafeAsMediaAssetId, F as normalizeLocationAddressText, G as getLocalScheduleTime, H as formatLocalScheduleTime, Ht as ok, I as toLocationCoordinates, It as unsafeAsStaffMemberId, J as toScheduledBookingDateRange, L as buildBookingUtcDateWindow, N as assertAllowedPublicUrl, O as parseMailingListProviderScope, Q as formatBookingPriceDisplay, R as formatBookingDate, S as parseMailingListBlockId, T as parseMailingListRuntimeContext, U as getBookingLocalDateKey, V as formatLocalScheduleDate, Vt as err, W as getLocalScheduleDate, Y as toScheduledBookingDateTime, Z as parseEventPageSurfaceSubject, _ as createSecret, at as resolvePricingOptionsPriceDisplay, bt as unsafeAsDemoCapability, c as DEFAULT_EVENT_TYPE_PRESETS, ct as formatCurrencyAmount, d as SURFACE_EVENT_PRESET_VALUES, dt as parseEventSeriesId, et as isPublicEventPricingOptionDisplayable, f as WHOLE_SERIES_EVENT_PRESET_VALUES, ft as parseMediaAssetId, g as resolveWholeSeriesBookingPhase, gt as unsafeAsAppointmentResourceId, h as orderedLiveRunSessions, ht as parseUserId, it as resolveExactOrFreePriceDisplay, j as parseMailingListPlacementTargeting, kt as unsafeAsPositiveByteCount, l as EVENT_PRESET_VALUES, lt as assertNever, m as CANCELLED_SESSION_STATUS, mt as parseSiteId, n as NAVIGATION_LOCATIONS, nt as publicEventPricingDisplay, p as publicReadFreshnessSeconds, pt as parsePageId, q as toBookingTimeZone, r as areConfiguredBookingVerticalConfigsEqual, rt as publicEventPricingType, s as resolveSiteVerticalBookingConfig, t as resolveEventCatalogue, tt as publicEventPricingCurrency, ut as parseApiKeyId, v as exposeSecret, w as parseMailingListSignedSourceToken, x as buildMailingListSignupBlockSourceRef, y as parseManagementKey, z as formatBookingDateParts } from "../src-DbmhanBI.mjs";
4
+ import { $ as sdkUpsertEventResponseSchema, A as resolveMediaTransformForAspect, B as asRecord$1, C as walkAndCollectImageAttrs, D as normalizeWidthCandidates, E as rotateNormalizedPoint, F as buildMediaIdentifierFromFilename, G as parseSafeDownloadFilename, H as FILE_SIZE_LIMITS, I as parseMediaIdentifier, J as createHttpClient, K as ManagementApiError, L as deriveVideoSlotPolicy, M as getDirectImageUrlForSiteScopedPath, N as getImageUrl, O as isExplicitRectCrop, P as isSiteScopedDirectImageStoragePath, Q as sdkListEventsResponseSchema, R as resolveVideoSelectionIntentForMediaField, S as buildRenderableMediaAssetIndex, T as looksLikeUuid$1, U as classifyKnownMimeType, V as parseRelativeStoragePath, W as managementMediaLibraryUploadLimitForMimeType, X as sdkConfigureBookingVerticalResponseSchema, Y as is404Error, Z as sdkGetEventResponseSchema, _ as buildSettingsUpdateInput, _t as sdkConfiguredBookingVerticalConfigSchema, a as prepareLocalMediaForPush, at as externalLinkSchema$1, b as isMediaValue, c as writeBinaryFileAtomic, ct as internalRouteOnlyLinkSchema, d as normalizeMediaValueToIdentifierOnly, dt as linkSchema, et as sdkSettingsUpdateSchema, f as walkLocalContentMedia, ft as pageLinkSchema$1, g as SETTINGS_FILE_FIELDS, gt as sdkReorderResponseSchema, h as extractMediaIdentifiers, ht as sdkListEventOccurrencesResponseSchema, i as applyLocalMediaPush, it as entryLinkSchema$1, j as getDirectImageUrlForRelativePath, k as parseAspectRatioValue, l as sha256, lt as isInternalResolvedLinkValue, m as downloadMedia, mt as sdkEventOccurrenceResponseSchema, nt as RESOLVED_INTERNAL_LINK_ENTITY_TYPES, o as admitBinaryWriteDestination, ot as internalLinkSchema, p as buildStorageUrl, pt as sdkDeleteEventOccurrenceResponseSchema, q as buildRequestInfo, r as syncLocalMediaForPull, rt as customLinkSchema$1, s as readStableBinaryFile, st as internalResolvedLinkSchema, t as revalidateLocalMediaPushPlan, tt as linkPayloadSchema, u as normalizeMediaIdentifierInput, ut as isResolvedInternalLinkEntityType, v as hasOwnSettingsField, w as deleteEnvSpecificKeys, x as attachRenderableMediaAssetFields, y as writeMediaManifest, z as getMimeType } from "../local-sync-DF-2DL_D.mjs";
5
+ import { n as CliSdkPeerError, r as CLI_VERSION, t as loadConfigFile } from "../load-config-Cf5uPEAn.mjs";
6
+ import { a as RichTextDocSchema, c as isRecord$17, i as findUnfilledSentinels, n as buildEntryScaffold, o as isRichTextDoc, r as validateEntryInstance, s as isObjectRecord, t as eventUpsertInputSchema } from "../eventUpsertInputSchema-CqHIJp9H.mjs";
7
+ import { a as prepareScaffoldExecution, c as LOCAL_PACKAGE_VENDOR_DIR, d as loadGeneratedPackageRanges, i as preflightScaffoldTargets, n as createScaffoldCompletion, s as deriveScaffoldLocalManifest, t as deriveScaffoldPlan } from "../plan-By0bjnd3.mjs";
8
8
  import { config } from "dotenv";
9
9
  import { Command, CommanderError } from "commander";
10
10
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -3984,6 +3984,17 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3984
3984
  //#endregion
3985
3985
  //#region ../api/src/publicEventEndpointDefinitions.ts
3986
3986
  const PUBLIC_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3987
+ checkPublicEventRegistrationNextStep: {
3988
+ path: "/public/sites/{siteId}/events/registration-next-step",
3989
+ method: "POST",
3990
+ auth: "public",
3991
+ responseKind: "json",
3992
+ errors: [
3993
+ "validation:invalid_input",
3994
+ "auth:forbidden",
3995
+ "server:internal_error"
3996
+ ]
3997
+ },
3987
3998
  listPublicEventCalendarWindow: {
3988
3999
  path: "/public/sites/{siteId}/events/calendar-window",
3989
4000
  method: "GET",
@@ -13570,7 +13581,7 @@ function resolveDashboardBookingsNavPolicy(modules, ctx) {
13570
13581
  appointments: role === "owner" ? { kind: "owner_setup" } : { kind: "hidden" }
13571
13582
  };
13572
13583
  }
13573
- function buildDashboardBookingsNavPlan(modules, ctx, verticalConfig) {
13584
+ function buildDashboardBookingsNavPlan(modules, ctx, catalogue) {
13574
13585
  const policy = resolveDashboardBookingsNavPolicy(modules, ctx);
13575
13586
  if (policy.kind === "staff_scoped") {
13576
13587
  return buildStaffScopedBookingsNavPlan(policy);
@@ -13591,7 +13602,7 @@ function buildDashboardBookingsNavPlan(modules, ctx, verticalConfig) {
13591
13602
  groups.push({
13592
13603
  label: "Events",
13593
13604
  items: modules.events ? [
13594
- ...buildEventNavItems(verticalConfig),
13605
+ ...buildEventNavItems(catalogue),
13595
13606
  {
13596
13607
  label: "Venues",
13597
13608
  destination: { kind: "venues" },
@@ -13848,59 +13859,49 @@ const bookingProductsItem = {
13848
13859
  "unlimited"
13849
13860
  ]
13850
13861
  };
13851
- function buildEventNavItems(verticalConfig) {
13852
- const resolved = resolveSiteVerticalBookingConfig(verticalConfig);
13853
- if (resolved.kind !== "configured") {
13854
- return [{
13855
- label: "Events",
13862
+ function buildEventNavItems(catalogue) {
13863
+ const entries = catalogue.source === "generic" ? catalogue.entries.filter(({ preset }) => preset === "course") : catalogue.entries;
13864
+ return [
13865
+ {
13866
+ label: catalogue.source === "generic" ? "Events" : "All events",
13856
13867
  destination: { kind: "events_all" },
13857
13868
  keywords: [
13858
- "classes",
13859
- "workshops",
13869
+ "events",
13870
+ "all events",
13860
13871
  "sessions",
13861
13872
  "recurring",
13862
13873
  "shows",
13863
- "retreats"
13874
+ ...catalogue.entries.flatMap(({ label, pluralLabel }) => [label, pluralLabel])
13864
13875
  ]
13865
- }, {
13866
- label: "Courses",
13867
- destination: { kind: "courses" },
13876
+ },
13877
+ ...entries.map(buildEventSeriesPresetNavItem),
13878
+ ...catalogue.source === "business_profile" ? [{
13879
+ label: "Other events",
13880
+ destination: { kind: "events_other" },
13868
13881
  keywords: [
13869
- "multi-session",
13870
- "paid upfront",
13871
- "enrollment",
13872
- "series",
13873
- "terms",
13874
- "programmes"
13882
+ "other",
13883
+ "one-off",
13884
+ "fundraiser",
13885
+ "open day",
13886
+ "jumble sale",
13887
+ "party",
13888
+ "uncategorised"
13875
13889
  ]
13876
- }];
13877
- }
13878
- const eventSeriesItems = resolved.selectedPresets.filter(isEventSeriesVerticalPresetDefinition).map(buildEventSeriesPresetNavItem);
13879
- return [{
13880
- label: "All events",
13881
- destination: { kind: "events_all" },
13882
- keywords: [
13883
- "events",
13884
- "all events",
13885
- ...resolved.selectedPresets.flatMap((preset) => [
13886
- preset.label,
13887
- preset.pluralLabel,
13888
- preset.canonicalBehaviour
13889
- ])
13890
- ]
13891
- }, ...eventSeriesItems];
13890
+ }] : []
13891
+ ];
13892
13892
  }
13893
- function buildEventSeriesPresetNavItem(preset) {
13893
+ function buildEventSeriesPresetNavItem(entry) {
13894
13894
  return {
13895
- label: preset.pluralLabel,
13895
+ label: entry.pluralLabel,
13896
13896
  destination: {
13897
13897
  kind: "events_preset",
13898
- preset: preset.canonicalBehaviour
13898
+ preset: entry.preset
13899
13899
  },
13900
13900
  keywords: [
13901
- preset.label,
13902
- preset.pluralLabel,
13903
- preset.canonicalBehaviour
13901
+ entry.label,
13902
+ entry.pluralLabel,
13903
+ entry.preset,
13904
+ ...entry.preset === "term" ? ["course", "courses"] : []
13904
13905
  ]
13905
13906
  };
13906
13907
  }
@@ -16626,9 +16627,7 @@ function navRow(opts) {
16626
16627
  rel: { $bind: { from: `${childItemName}.rel` } },
16627
16628
  "data-active": { $bind: { from: `${childItemName}.active` } }
16628
16629
  }, [text({ as: "span" }, bind(`${childItemName}.label`))], repeat(`${itemName}.children`, childItemName));
16629
- const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [button({
16630
- type: "button",
16631
- variantId: "",
16630
+ const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [el("headerControl", {
16632
16631
  className: prependClassName("nav-dropdown-trigger", linkClassName),
16633
16632
  "aria-haspopup": "menu",
16634
16633
  "aria-expanded": "false",
@@ -16696,9 +16695,7 @@ function navColumn(opts) {
16696
16695
  const dropdown = el("div", {
16697
16696
  className: "nav-mobile-dropdown",
16698
16697
  "data-nav-mobile-dropdown": "true"
16699
- }, [button({
16700
- type: "button",
16701
- variantId: "",
16698
+ }, [el("headerControl", {
16702
16699
  className: triggerClassName,
16703
16700
  "aria-expanded": "false",
16704
16701
  "aria-controls": childrenId,
@@ -21732,6 +21729,58 @@ const layoutTransforms = [
21732
21729
  footerLogoTextVisibleTransform
21733
21730
  ];
21734
21731
 
21732
+ //#endregion
21733
+ //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
21734
+ const chromeLogoSurfaceValues = [
21735
+ "header-root",
21736
+ "header-mobile-panel",
21737
+ "footer-root"
21738
+ ];
21739
+ const chromeLogoSchema = z.object({ surface: z.enum(chromeLogoSurfaceValues) });
21740
+ /** The brand foreground shares the logo's surface; navigation may own a separate capsule. */
21741
+ function chromeSurfaceTextToken(surface, theme, palette) {
21742
+ switch (surface) {
21743
+ case "header-root": {
21744
+ const header = theme.header;
21745
+ const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
21746
+ return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
21747
+ }
21748
+ case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
21749
+ case "footer-root": {
21750
+ const foreground = resolveFooterRootForeground(theme.footer, palette);
21751
+ return foreground.kind === "known" ? foreground.roles.text : undefined;
21752
+ }
21753
+ }
21754
+ }
21755
+ function readChromeTheme(viewModel) {
21756
+ const root = asPartialObject(viewModel?.["$root"]);
21757
+ return asPartialObject(root?.theme) ?? {};
21758
+ }
21759
+ function resolveChromeSurfaceTone(surface, context) {
21760
+ return surfaceToneFromForegroundToken(context.theme.palette, chromeSurfaceTextToken(surface, readChromeTheme(context.viewModel), context.theme.palette));
21761
+ }
21762
+ /**
21763
+ * Picks the site logo for the surface it is drawn on. Bound from block
21764
+ * `content`: `logoVariants` when the renderer supplies both logos, otherwise
21765
+ * the single `logo` older callers pass.
21766
+ */
21767
+ const chromeLogoTransform = {
21768
+ id: "layout.chromeLogo",
21769
+ kind: "formatter",
21770
+ summary: "Select the light- or dark-background site logo for a header or footer surface",
21771
+ schema: chromeLogoSchema,
21772
+ run: (value, options, context) => {
21773
+ const content = asPartialObject(value);
21774
+ const variants = asPartialObject(content?.logoVariants);
21775
+ if (!variants) return content?.logo ?? null;
21776
+ return selectLogoVariant(resolveChromeSurfaceTone(options.surface, context), {
21777
+ forLightBackgrounds: variants.forLightBackgrounds ?? null,
21778
+ forDarkBackgrounds: variants.forDarkBackgrounds ?? null
21779
+ });
21780
+ }
21781
+ };
21782
+ const chromeLogoTransforms = [chromeLogoTransform];
21783
+
21735
21784
  //#endregion
21736
21785
  //#region ../blocks/src/system/transforms/registry/ui.ts
21737
21786
  const joinClasses$2 = (parts) => parts.filter((part) => typeof part === "string" && part.trim().length > 0).join(" ").replace(/\s+/g, " ").trim();
@@ -24514,6 +24563,33 @@ function normalizeEventCalendarDisplayMode(input) {
24514
24563
  if (isEventCalendarDisplayMode(input.variant)) return input.variant;
24515
24564
  return isEventCalendarDisplayMode(input.displayMode) ? input.displayMode : undefined;
24516
24565
  }
24566
+ /** One closed authority for the projections required by each rendered mode. */
24567
+ function resolveEventCalendarReadPlan(input) {
24568
+ const mode = normalizeEventCalendarDisplayMode(input) ?? "combined";
24569
+ switch (mode) {
24570
+ case "combined": return {
24571
+ mode,
24572
+ jobs: "both",
24573
+ readProfile: "listing-card"
24574
+ };
24575
+ case "list": return {
24576
+ mode,
24577
+ jobs: "list",
24578
+ readProfile: "listing-card"
24579
+ };
24580
+ case "calendar": return {
24581
+ mode,
24582
+ jobs: "calendar",
24583
+ readProfile: "listing-card"
24584
+ };
24585
+ case "timetable":
24586
+ case "week-board": return {
24587
+ mode,
24588
+ jobs: "calendar",
24589
+ readProfile: "timetable"
24590
+ };
24591
+ }
24592
+ }
24517
24593
  function isEventCalendarDefaultView(value) {
24518
24594
  return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
24519
24595
  }
@@ -25649,8 +25725,7 @@ function normalizeEventStaffMemberId(value) {
25649
25725
  //#endregion
25650
25726
  //#region ../blocks/src/system/blocks/events/shared/calendarWindow.ts
25651
25727
  function resolveCalendarReadProfile(content) {
25652
- const mode = normalizeEventCalendarDisplayMode(content);
25653
- return mode === "timetable" || mode === "week-board" ? "timetable" : "listing-card";
25728
+ return resolveEventCalendarReadPlan(content).readProfile;
25654
25729
  }
25655
25730
  /** Runtime picker sentinels and bound loader IDs must describe the same query. */
25656
25731
  function normalizeCalendarFilterId(value) {
@@ -25879,8 +25954,8 @@ const eventCalendarReadEnabled = {
25879
25954
  schema: readJobSchema,
25880
25955
  run(value, options) {
25881
25956
  const content = asPartialObject(value) ?? {};
25882
- const mode = normalizeEventCalendarDisplayMode(content) ?? "combined";
25883
- return options.job === "calendar" ? mode !== "list" : mode === "list" || mode === "combined";
25957
+ const plan = resolveEventCalendarReadPlan(content);
25958
+ return plan.jobs === "both" || plan.jobs === options.job;
25884
25959
  }
25885
25960
  };
25886
25961
 
@@ -25892,6 +25967,7 @@ const builtinTransformDefinitions = [
25892
25967
  eventCalendarReadProfile,
25893
25968
  ...formattingTransforms,
25894
25969
  ...layoutTransforms,
25970
+ ...chromeLogoTransforms,
25895
25971
  ...uiTransforms,
25896
25972
  ...mediaTransforms,
25897
25973
  ...backgroundTransforms,
@@ -26062,12 +26138,12 @@ function Grid({ as: Comp = "div", cols, userColumns, gap = "md", className, styl
26062
26138
 
26063
26139
  //#endregion
26064
26140
  //#region ../blocks/src/system/runtime/nodes/layout.tsx
26065
- const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props$1 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Section_default, { ...props$1 });
26066
- const StackNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props$1 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Stack, { ...props$1 });
26067
- const InlineNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props$1 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Inline, { ...props$1 });
26068
- const GridNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props$1 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Grid, { ...props$1 });
26069
- const DivNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props$1 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ...props$1 });
26070
- const FigureNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props$1 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("figure", { ...props$1 });
26141
+ const SectionNode = (props$1) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Section_default, { ...props$1 });
26142
+ const StackNode = (props$1) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Stack, { ...props$1 });
26143
+ const InlineNode = (props$1) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Inline, { ...props$1 });
26144
+ const GridNode = (props$1) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Grid, { ...props$1 });
26145
+ const DivNode = (props$1) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ...props$1 });
26146
+ const FigureNode = (props$1) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("figure", { ...props$1 });
26071
26147
 
26072
26148
  //#endregion
26073
26149
  //#region ../path-utils/dist/redirectPaths.js
@@ -26557,6 +26633,139 @@ function Text$1({ as: Comp = "span", children, className = "", path: path$3, max
26557
26633
  });
26558
26634
  }
26559
26635
 
26636
+ //#endregion
26637
+ //#region ../logger/src/noop.ts
26638
+ const noop = () => {};
26639
+ const logger = {
26640
+ debug: noop,
26641
+ info: noop,
26642
+ warn: noop,
26643
+ error: noop,
26644
+ withFields: (_) => logger
26645
+ };
26646
+
26647
+ //#endregion
26648
+ //#region ../blocks/src/system/runtime/nodes/richText-coerce.ts
26649
+ function parseRichTextDoc(value) {
26650
+ const parsed = RichTextDocSchema.safeParse(value);
26651
+ if (parsed.success) {
26652
+ return {
26653
+ kind: "valid",
26654
+ doc: parsed.data
26655
+ };
26656
+ }
26657
+ return {
26658
+ kind: "invalid",
26659
+ issues: parsed.error.issues.map((issue$1) => ({
26660
+ path: issue$1.path.map((segment) => String(segment)),
26661
+ message: issue$1.message
26662
+ }))
26663
+ };
26664
+ }
26665
+ function coerceRichTextDoc(value, source) {
26666
+ const parsed = parseRichTextDoc(value);
26667
+ if (parsed.kind === "valid") return parsed.doc;
26668
+ if (value !== null && value !== undefined) {
26669
+ logger.warn("blocks:rich-text:invalid-document", {
26670
+ source,
26671
+ issues: parsed.issues.slice(0, 3)
26672
+ });
26673
+ }
26674
+ return null;
26675
+ }
26676
+
26677
+ //#endregion
26678
+ //#region ../blocks/src/system/runtime/nodes/renderInlineText.tsx
26679
+ function renderInlineText(value) {
26680
+ return value.map((run, index) => renderRun(run, index));
26681
+ }
26682
+ function renderRun(run, key) {
26683
+ return (run.marks ?? []).reduceRight((child, mark, index) => renderMark(mark, `${String(key)}-${index}`, child), run.text);
26684
+ }
26685
+ function renderMark(mark, key, child) {
26686
+ switch (mark.kind) {
26687
+ case "strong": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: child }, key);
26688
+ case "emphasis": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("em", { children: child }, key);
26689
+ case "accent": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
26690
+ className: `rb-inline-text-accent rb-inline-text-accent-${mark.tone}`,
26691
+ children: child
26692
+ }, key);
26693
+ case "highlight": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
26694
+ className: `rb-inline-text-highlight rb-inline-text-highlight-${mark.tone}`,
26695
+ children: child
26696
+ }, key);
26697
+ }
26698
+ }
26699
+
26700
+ //#endregion
26701
+ //#region ../blocks/src/system/runtime/nodes/spinner.tsx
26702
+ function resolveColorStyle(color) {
26703
+ switch (color) {
26704
+ case undefined: return undefined;
26705
+ case "inherit": return { color: "inherit" };
26706
+ case "foreground": return { color: "rgb(var(--tb-foreground))" };
26707
+ case "text": return { color: "rgb(var(--tb-text))" };
26708
+ case "primary":
26709
+ default: return undefined;
26710
+ }
26711
+ }
26712
+ function SpinnerNode({ className, size = "md", color, strokeWidth = 3, srLabel, style, ...rest }) {
26713
+ const hasExplicitAriaLabel = typeof rest["aria-label"] === "string" && rest["aria-label"].trim().length > 0;
26714
+ const accessibilityProps = srLabel ? {
26715
+ role: "status",
26716
+ "aria-live": "polite"
26717
+ } : hasExplicitAriaLabel ? {} : { "aria-hidden": true };
26718
+ const trackStroke = color === "inherit" ? "currentColor" : "var(--rb-spinner-track-color)";
26719
+ const trackOpacity = color === "inherit" ? .25 : 1;
26720
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
26721
+ ...accessibilityProps,
26722
+ className: clsx_default("rb-spinner", size ? `rb-spinner--${size}` : null, color === "inherit" ? "rb-spinner--inherit" : null, className),
26723
+ style: {
26724
+ ...resolveColorStyle(color),
26725
+ ...style ?? {}
26726
+ },
26727
+ ...rest,
26728
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
26729
+ viewBox: "0 0 24 24",
26730
+ fill: "none",
26731
+ "aria-hidden": "true",
26732
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
26733
+ cx: "12",
26734
+ cy: "12",
26735
+ r: "10",
26736
+ stroke: trackStroke,
26737
+ strokeWidth,
26738
+ opacity: trackOpacity
26739
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
26740
+ d: "M12 2a10 10 0 0 1 10 10",
26741
+ stroke: "currentColor",
26742
+ strokeWidth,
26743
+ strokeLinecap: "round"
26744
+ })]
26745
+ }), srLabel ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
26746
+ className: "rb-sr-only",
26747
+ children: srLabel
26748
+ }) : null]
26749
+ });
26750
+ }
26751
+
26752
+ //#endregion
26753
+ //#region ../blocks/src/system/runtime/nodes/buttonAffordance.ts
26754
+ function normalize$3(value) {
26755
+ const trimmed = typeof value === "string" ? value.trim() : "";
26756
+ return trimmed.length > 0 ? trimmed : null;
26757
+ }
26758
+ /**
26759
+ * Resolve the node-authored trailing affordance, or `null` when no icon exists.
26760
+ */
26761
+ function resolveButtonAffordance(input) {
26762
+ const nodeIcon = normalize$3(input.trailingIcon);
26763
+ if (nodeIcon) {
26764
+ return { iconId: nodeIcon };
26765
+ }
26766
+ return null;
26767
+ }
26768
+
26560
26769
  //#endregion
26561
26770
  //#region ../blocks/src/system/icons/svg.tsx
26562
26771
  function createIcon(displayName, children) {
@@ -27700,89 +27909,146 @@ function getIconComponent(name) {
27700
27909
  }
27701
27910
 
27702
27911
  //#endregion
27703
- //#region ../blocks/src/system/runtime/nodes/buttonAffordance.ts
27704
- function normalize$3(value) {
27705
- const trimmed = typeof value === "string" ? value.trim() : "";
27706
- return trimmed.length > 0 ? trimmed : null;
27912
+ //#region ../blocks/src/system/runtime/shared/components/ThemedButton.tsx
27913
+ function themedButtonClasses(variant, size, extraClassName) {
27914
+ return [
27915
+ ...themeButtonVariantClassNames(variant),
27916
+ themeButtonSizeClassName(size),
27917
+ extraClassName
27918
+ ].filter(Boolean).join(" ");
27707
27919
  }
27708
- /**
27709
- * Resolve the node-authored trailing affordance, or `null` when no icon exists.
27710
- */
27711
- function resolveButtonAffordance(input) {
27712
- const nodeIcon = normalize$3(input.trailingIcon);
27713
- if (nodeIcon) {
27714
- return { iconId: nodeIcon };
27715
- }
27716
- return null;
27920
+ function ThemedButtonLabel(props$1) {
27921
+ const content = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
27922
+ props$1.pending ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SpinnerNode, {
27923
+ size: props$1.pending.spinnerSize ?? "sm",
27924
+ color: "inherit",
27925
+ className: props$1.pending.spinnerClassName ?? "rb-mr-2",
27926
+ srLabel: props$1.pending.srLabel
27927
+ }) : null,
27928
+ props$1.labelClassName ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27929
+ className: props$1.labelClassName,
27930
+ children: props$1.pending?.label ?? props$1.label
27931
+ }) : props$1.pending?.label ?? props$1.label,
27932
+ props$1.screenReaderSuffix ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27933
+ className: "rb-sr-only",
27934
+ children: props$1.screenReaderSuffix
27935
+ }) : null
27936
+ ] });
27937
+ return props$1.pending?.contentClassName ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27938
+ className: props$1.pending.contentClassName,
27939
+ children: content
27940
+ }) : content;
27717
27941
  }
27718
-
27719
- //#endregion
27720
- //#region ../logger/src/noop.ts
27721
- const noop = () => {};
27722
- const logger = {
27723
- debug: noop,
27724
- info: noop,
27725
- warn: noop,
27726
- error: noop,
27727
- withFields: (_) => logger
27728
- };
27729
-
27730
- //#endregion
27731
- //#region ../blocks/src/system/runtime/nodes/richText-coerce.ts
27732
- function parseRichTextDoc(value) {
27733
- const parsed = RichTextDocSchema.safeParse(value);
27734
- if (parsed.success) {
27735
- return {
27736
- kind: "valid",
27737
- doc: parsed.data
27738
- };
27739
- }
27740
- return {
27741
- kind: "invalid",
27742
- issues: parsed.error.issues.map((issue$1) => ({
27743
- path: issue$1.path.map((segment) => String(segment)),
27744
- message: issue$1.message
27745
- }))
27746
- };
27942
+ function ThemedButton({ variant, size, extraClassName, screenReaderSuffix, labelClassName, pending, label, ...buttonProps }) {
27943
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
27944
+ ...buttonProps,
27945
+ className: themedButtonClasses(variant, size, extraClassName),
27946
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLabel, {
27947
+ label,
27948
+ pending,
27949
+ screenReaderSuffix,
27950
+ labelClassName
27951
+ })
27952
+ });
27747
27953
  }
27748
- function coerceRichTextDoc(value, source) {
27749
- const parsed = parseRichTextDoc(value);
27750
- if (parsed.kind === "valid") return parsed.doc;
27751
- if (value !== null && value !== undefined) {
27752
- logger.warn("blocks:rich-text:invalid-document", {
27753
- source,
27754
- issues: parsed.issues.slice(0, 3)
27755
- });
27756
- }
27757
- return null;
27954
+ function ThemedButtonLink({ variant, size, extraClassName, screenReaderSuffix, labelClassName, label, ...anchorProps }) {
27955
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
27956
+ ...anchorProps,
27957
+ className: themedButtonClasses(variant, size, extraClassName),
27958
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLabel, {
27959
+ label,
27960
+ screenReaderSuffix,
27961
+ labelClassName
27962
+ })
27963
+ });
27758
27964
  }
27759
-
27760
- //#endregion
27761
- //#region ../blocks/src/system/runtime/nodes/renderInlineText.tsx
27762
- function renderInlineText(value) {
27763
- return value.map((run, index) => renderRun(run, index));
27965
+ /** Noninteractive button-style preview with no caller-owned markup. */
27966
+ function ThemedButtonSpecimen({ variant, size, label, extraClassName, forceHover = false }) {
27967
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27968
+ "data-force-hover": forceHover ? "true" : undefined,
27969
+ className: themedButtonClasses(variant, size, extraClassName),
27970
+ children: label
27971
+ });
27972
+ }
27973
+ /** Fixed icon-only actions control; callers cannot supply icon children. */
27974
+ function ThemedActionsButton({ variant, size, extraClassName, ...buttonProps }) {
27975
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
27976
+ ...buttonProps,
27977
+ "aria-label": "Actions",
27978
+ className: themedButtonClasses(variant, size, extraClassName),
27979
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
27980
+ width: "16",
27981
+ height: "16",
27982
+ viewBox: "0 0 16 16",
27983
+ fill: "currentColor",
27984
+ "aria-hidden": "true",
27985
+ children: [
27986
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
27987
+ cx: "8",
27988
+ cy: "3",
27989
+ r: "1.5"
27990
+ }),
27991
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
27992
+ cx: "8",
27993
+ cy: "8",
27994
+ r: "1.5"
27995
+ }),
27996
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
27997
+ cx: "8",
27998
+ cy: "13",
27999
+ r: "1.5"
28000
+ })
28001
+ ]
28002
+ })
28003
+ });
27764
28004
  }
27765
- function renderRun(run, key) {
27766
- return (run.marks ?? []).reduceRight((child, mark, index) => renderMark(mark, `${String(key)}-${index}`, child), run.text);
28005
+ /** Fixed semantic download affordance; callers cannot supply arbitrary icon children. */
28006
+ function ThemedDownloadLink({ variant, size, extraClassName, label, screenReaderSuffix, labelClassName, ...anchorProps }) {
28007
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
28008
+ ...anchorProps,
28009
+ className: themedButtonClasses(variant, size, extraClassName),
28010
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(DownloadIcon, {
28011
+ "aria-hidden": "true",
28012
+ size: 24
28013
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLabel, {
28014
+ label,
28015
+ screenReaderSuffix,
28016
+ labelClassName
28017
+ })]
28018
+ });
27767
28019
  }
27768
- function renderMark(mark, key, child) {
27769
- switch (mark.kind) {
27770
- case "strong": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: child }, key);
27771
- case "emphasis": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("em", { children: child }, key);
27772
- case "accent": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27773
- className: `rb-inline-text-accent rb-inline-text-accent-${mark.tone}`,
27774
- children: child
27775
- }, key);
27776
- case "highlight": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27777
- className: `rb-inline-text-highlight rb-inline-text-highlight-${mark.tone}`,
27778
- children: child
27779
- }, key);
27780
- }
28020
+ /** Boundary for authored button nodes and their registry-backed trailing icon. */
28021
+ function ThemedAuthoredButton({ label, href, variant, size, extraClassName, disabled, type = "button", target, rel, ariaLabel, dataTestId, trailingIcon, onClick }) {
28022
+ const affordance = resolveButtonAffordance({ trailingIcon });
28023
+ const Icon = affordance ? getIconComponent(affordance.iconId) : null;
28024
+ const className = variant ? themedButtonClasses(variant, size, Icon ? [extraClassName, themeButtonExtraClassesWithTrailingIcon()].filter(Boolean).join(" ") : extraClassName) : extraClassName ?? undefined;
28025
+ const content = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [label, Icon ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, {
28026
+ "aria-hidden": true,
28027
+ className: "rb-ml-2 rb-h-4 rb-w-4 rb-inline-block"
28028
+ }) : null] });
28029
+ return href ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
28030
+ href,
28031
+ target,
28032
+ rel,
28033
+ "aria-label": ariaLabel,
28034
+ "data-testid": dataTestId,
28035
+ className,
28036
+ onClick,
28037
+ children: content
28038
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
28039
+ type,
28040
+ disabled,
28041
+ "aria-label": ariaLabel,
28042
+ "data-testid": dataTestId,
28043
+ className,
28044
+ onClick,
28045
+ children: content
28046
+ });
27781
28047
  }
27782
28048
 
27783
28049
  //#endregion
27784
28050
  //#region ../blocks/src/system/runtime/nodes/basic.tsx
27785
- const TextNode = ({ value, children, blockId: _blockId, blockKind: _blockKind, blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, inlineTextFallbackPath, ...rest }) => {
28051
+ const TextNode = ({ value, children, blockContent, inlineTextFallbackPath, ...rest }) => {
27786
28052
  const inlineText = parseInlineTextFromUnknown(value);
27787
28053
  if (inlineText.ok && !isInlineTextEmpty(inlineText.value)) {
27788
28054
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text$1, {
@@ -27805,37 +28071,23 @@ function readStringPath(source, path$3) {
27805
28071
  const value = getAtPath(source, path$3);
27806
28072
  return typeof value === "string" ? value : null;
27807
28073
  }
27808
- const RichTextNode = ({ value, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...rest }) => {
27809
- const source = `block-runtime:${_blockKind ?? "unknown"}:${rest.path ?? "richText"}`;
28074
+ const RichTextNode = ({ value, blockKind, ...rest }) => {
28075
+ const source = `block-runtime:${blockKind ?? "unknown"}:${rest.path ?? "richText"}`;
27810
28076
  const doc = coerceRichTextDoc(value, source);
27811
28077
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RichText$1, {
27812
28078
  doc: doc ?? undefined,
27813
28079
  ...rest
27814
28080
  });
27815
28081
  };
27816
- /**
27817
- * Render the resolved trailing affordance icon using the button's foreground.
27818
- */
27819
- function renderTrailingAffordanceIcon(affordance) {
27820
- if (!affordance) return null;
27821
- const Icon = getIconComponent(affordance.iconId);
27822
- if (!Icon) return null;
27823
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, {
27824
- "aria-hidden": true,
27825
- className: "rb-ml-2 rb-h-4 rb-w-4 rb-inline-block"
27826
- });
27827
- }
27828
28082
  function isMissingRequiredLink(linkRequired, resolvedHref) {
27829
28083
  return linkRequired && resolvedHref.length === 0;
27830
28084
  }
27831
- const ButtonNode = ({ value, children, href, variantId = "primary", size = "md", disabled, type = "button", target, rel, linkRequired = false, trailingIcon, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, className, ...rest }) => {
28085
+ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md", disabled, type = "button", target, rel, linkRequired = false, trailingIcon, onClick, className, ...rest }) => {
27832
28086
  const content = value ?? children;
27833
28087
  if (!content) {
27834
28088
  console.warn("[ButtonNode] No content to render - value and children are both empty");
27835
28089
  return null;
27836
28090
  }
27837
- const affordance = resolveButtonAffordance({ trailingIcon });
27838
- const affordanceIcon = renderTrailingAffordanceIcon(affordance);
27839
28091
  const resolvedHref = typeof href === "string" ? href.trim() : "";
27840
28092
  if (isMissingRequiredLink(linkRequired, resolvedHref)) {
27841
28093
  if (process.env.NODE_ENV === "development") {
@@ -27848,31 +28100,23 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
27848
28100
  console.error("[ButtonNode] Invalid button variant", { variantId });
27849
28101
  return null;
27850
28102
  }
27851
- const buildClassName = affordanceIcon ? themeButtonClassNameWithTrailingIcon : themeButtonClassName;
27852
- const combinedClassName = resolvedVariantId ? buildClassName({
27853
- variant: resolvedVariantId,
28103
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedAuthoredButton, {
28104
+ label: content,
28105
+ href: resolvedHref || undefined,
28106
+ target,
28107
+ rel,
28108
+ variant: resolvedVariantId ?? null,
27854
28109
  size,
27855
- extraClassName: className
27856
- }) : className;
27857
- if (resolvedHref) {
27858
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
27859
- href: resolvedHref,
27860
- target,
27861
- rel,
27862
- className: combinedClassName,
27863
- ...rest,
27864
- children: [content, affordanceIcon]
27865
- });
27866
- }
27867
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
27868
- type,
27869
28110
  disabled,
27870
- className: combinedClassName,
27871
- ...rest,
27872
- children: [content, affordanceIcon]
28111
+ type,
28112
+ trailingIcon,
28113
+ onClick,
28114
+ extraClassName: className,
28115
+ ariaLabel: rest["aria-label"],
28116
+ dataTestId: rest["data-testid"]
27873
28117
  });
27874
28118
  };
27875
- const LinkNode = ({ href, children, className, target, rel, linkRequired = false, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, ...rest }) => {
28119
+ const LinkNode = ({ href, children, className, target, rel, linkRequired = false, ...rest }) => {
27876
28120
  if (!children) return null;
27877
28121
  const resolvedHref = typeof href === "string" ? href.trim() : "";
27878
28122
  if (resolvedHref.length === 0) {
@@ -28496,18 +28740,13 @@ function FileDownloadNode({ value, title, description, buttonLabel, buttonVarian
28496
28740
  })
28497
28741
  ]
28498
28742
  })]
28499
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
28743
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedDownloadLink, {
28500
28744
  href,
28501
28745
  download: filename,
28502
- className: themeButtonClassName({
28503
- variant,
28504
- size: "md",
28505
- extraClassName: "rb-inline-flex rb-shrink-0 rb-items-center rb-justify-center rb-gap-2"
28506
- }),
28507
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(DownloadIcon, {
28508
- "aria-hidden": "true",
28509
- size: 24
28510
- }), label]
28746
+ variant,
28747
+ size: "md",
28748
+ extraClassName: "rb-inline-flex rb-shrink-0 rb-items-center rb-justify-center rb-gap-2",
28749
+ label
28511
28750
  })]
28512
28751
  })
28513
28752
  })
@@ -29171,54 +29410,19 @@ const HeaderSectionNode = ({ blockId, children, className, runtime, "data-previe
29171
29410
  var header_section_server_default = markEditableSurfaceForwarding(HeaderSectionNode);
29172
29411
 
29173
29412
  //#endregion
29174
- //#region ../blocks/src/system/runtime/nodes/spinner.tsx
29175
- function resolveColorStyle(color) {
29176
- switch (color) {
29177
- case undefined: return undefined;
29178
- case "inherit": return { color: "inherit" };
29179
- case "foreground": return { color: "rgb(var(--tb-foreground))" };
29180
- case "text": return { color: "rgb(var(--tb-text))" };
29181
- case "primary":
29182
- default: return undefined;
29183
- }
29184
- }
29185
- function SpinnerNode({ className, size = "md", color, strokeWidth = 3, srLabel, style, ...rest }) {
29186
- const hasExplicitAriaLabel = typeof rest["aria-label"] === "string" && rest["aria-label"].trim().length > 0;
29187
- const accessibilityProps = srLabel ? {
29188
- role: "status",
29189
- "aria-live": "polite"
29190
- } : hasExplicitAriaLabel ? {} : { "aria-hidden": true };
29191
- const trackStroke = color === "inherit" ? "currentColor" : "var(--rb-spinner-track-color)";
29192
- const trackOpacity = color === "inherit" ? .25 : 1;
29193
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
29194
- ...accessibilityProps,
29195
- className: clsx_default("rb-spinner", size ? `rb-spinner--${size}` : null, color === "inherit" ? "rb-spinner--inherit" : null, className),
29196
- style: {
29197
- ...resolveColorStyle(color),
29198
- ...style ?? {}
29199
- },
29200
- ...rest,
29201
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
29202
- viewBox: "0 0 24 24",
29203
- fill: "none",
29204
- "aria-hidden": "true",
29205
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
29206
- cx: "12",
29207
- cy: "12",
29208
- r: "10",
29209
- stroke: trackStroke,
29210
- strokeWidth,
29211
- opacity: trackOpacity
29212
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
29213
- d: "M12 2a10 10 0 0 1 10 10",
29214
- stroke: "currentColor",
29215
- strokeWidth,
29216
- strokeLinecap: "round"
29217
- })]
29218
- }), srLabel ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
29219
- className: "rb-sr-only",
29220
- children: srLabel
29221
- }) : null]
29413
+ //#region ../blocks/src/system/runtime/nodes/header-control.tsx
29414
+ /** System navigation controls retain their runtime hooks independently of authored CTAs. */
29415
+ function HeaderControlNode({ className, children, "aria-label": label, "aria-expanded": expanded, "aria-controls": controls, "aria-haspopup": hasPopup, "data-nav-mobile-toggle": mobileToggle, "data-nav-mobile-trigger": mobileTrigger }) {
29416
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
29417
+ type: "button",
29418
+ className,
29419
+ "aria-label": label,
29420
+ "aria-expanded": expanded,
29421
+ "aria-controls": controls,
29422
+ "aria-haspopup": hasPopup,
29423
+ "data-nav-mobile-toggle": mobileToggle,
29424
+ "data-nav-mobile-trigger": mobileTrigger,
29425
+ children
29222
29426
  });
29223
29427
  }
29224
29428
 
@@ -29548,11 +29752,6 @@ function AppointmentServicesNode({ sectionHeading, services, pathname, servicePa
29548
29752
  })
29549
29753
  });
29550
29754
  }
29551
- const actionClassName = themeButtonClassName({
29552
- variant: "secondary",
29553
- size: "sm",
29554
- extraClassName: "appointment-services-row-action"
29555
- });
29556
29755
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
29557
29756
  className: `${rootClassName} rb-flex rb-flex-col`,
29558
29757
  "data-appointment-services-state": "populated",
@@ -29585,13 +29784,13 @@ function AppointmentServicesNode({ sectionHeading, services, pathname, servicePa
29585
29784
  className: "appointment-services-row-price rb-text-lg",
29586
29785
  children: row.priceLabel
29587
29786
  }) : null,
29588
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
29589
- className: actionClassName,
29787
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
29788
+ variant: "secondary",
29789
+ size: "sm",
29790
+ extraClassName: "appointment-services-row-action",
29590
29791
  href: row.href,
29591
- children: ["Check times", /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
29592
- className: "rb-sr-only",
29593
- children: [" for ", row.title]
29594
- })]
29792
+ label: "Check times",
29793
+ screenReaderSuffix: ` for ${row.title}`
29595
29794
  })
29596
29795
  ]
29597
29796
  }, row.id))
@@ -32644,6 +32843,7 @@ function buildEventRegistrationSourceProps(input) {
32644
32843
  apiBaseUrl: input.apiBaseUrl,
32645
32844
  portalToken: input.portalToken,
32646
32845
  previewToken: input.previewToken,
32846
+ readAuthority: input.readAuthority,
32647
32847
  occurrenceContext: input.occurrenceContext,
32648
32848
  events: input.events ? [...input.events] : null,
32649
32849
  stage: input.stage,
@@ -34557,16 +34757,14 @@ function LocationMapView({ addressText, location: location$1, zoom, heightPx, sh
34557
34757
  style: textColorStyle("mutedText"),
34558
34758
  children: addressText
34559
34759
  }) : null,
34560
- showDirections && directionsUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
34760
+ showDirections && directionsUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
34561
34761
  href: directionsUrl,
34562
34762
  target: "_blank",
34563
34763
  rel: "noreferrer",
34564
- className: themeButtonClassName({
34565
- variant: "ghost",
34566
- size: "sm",
34567
- extraClassName: "rb-w-fit"
34568
- }),
34569
- children: directionsLabel
34764
+ variant: "ghost",
34765
+ size: "sm",
34766
+ extraClassName: "rb-w-fit",
34767
+ label: directionsLabel
34570
34768
  }) : null
34571
34769
  ]
34572
34770
  });
@@ -34724,10 +34922,6 @@ const EventCard = ({ event, cardRole = "default", buttonVariant = "primary", but
34724
34922
  const formattedTime = `${formatTime(event.startsAt, { timeZone })} - ${formatTime(event.endsAt, { timeZone })}`;
34725
34923
  const cta = resolveEventCta(event, buttonText);
34726
34924
  const cardClass = boxStyleClassNames({ role: cardRole }, { baseClass: "event-card" });
34727
- const buttonClass = themeButtonClassName({
34728
- variant: buttonVariant,
34729
- size: "md"
34730
- });
34731
34925
  const title = event.title;
34732
34926
  const summary = event.presentation?.summary ?? event.description;
34733
34927
  const image = event.presentation?.image ?? null;
@@ -34758,7 +34952,7 @@ const EventCard = ({ event, cardRole = "default", buttonVariant = "primary", but
34758
34952
  image
34759
34953
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EventCardContent, {
34760
34954
  allowMap,
34761
- buttonClass,
34955
+ buttonVariant,
34762
34956
  capacityText,
34763
34957
  categoryBadge,
34764
34958
  categoryId: category?.id,
@@ -34862,7 +35056,7 @@ function EventCardContent(props$1) {
34862
35056
  children: props$1.summary
34863
35057
  }),
34864
35058
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EventCardFooter, {
34865
- buttonClass: props$1.buttonClass,
35059
+ buttonVariant: props$1.buttonVariant,
34866
35060
  capacityText: props$1.capacityText,
34867
35061
  cta: props$1.cta,
34868
35062
  priceText: props$1.priceText
@@ -34900,12 +35094,14 @@ function EventCardFooter(props$1) {
34900
35094
  className: "event-card-status rb-caption status-muted rb-text-center",
34901
35095
  children: props$1.cta.label
34902
35096
  }),
34903
- !props$1.cta.hidden && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
35097
+ !props$1.cta.hidden && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
34904
35098
  href: props$1.cta.href,
34905
35099
  target: props$1.cta.external ? "_blank" : undefined,
34906
35100
  rel: props$1.cta.external ? "noopener noreferrer" : undefined,
34907
- className: `${props$1.buttonClass} event-card-cta`,
34908
- children: props$1.cta.label
35101
+ variant: props$1.buttonVariant,
35102
+ size: "md",
35103
+ extraClassName: "event-card-cta",
35104
+ label: props$1.cta.label
34909
35105
  })
34910
35106
  ]
34911
35107
  });
@@ -34977,10 +35173,6 @@ const EventCompactRow = ({ event, buttonVariant = "primary", buttonText }) => {
34977
35173
  const price = formatEventPrice(event);
34978
35174
  const teacherLine = formatEventTeacherLine(event);
34979
35175
  const cta = resolveEventCta(event, buttonText);
34980
- const buttonClass = themeButtonClassName({
34981
- variant: buttonVariant,
34982
- size: "sm"
34983
- });
34984
35176
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", {
34985
35177
  className: "event-compact-row",
34986
35178
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("time", {
@@ -35044,12 +35236,15 @@ const EventCompactRow = ({ event, buttonVariant = "primary", buttonText }) => {
35044
35236
  }), cta.hidden ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
35045
35237
  className: "event-compact-row-status",
35046
35238
  children: cta.label
35047
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
35239
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
35048
35240
  href: cta.href,
35049
35241
  target: cta.external ? "_blank" : undefined,
35050
35242
  rel: cta.external ? "noopener noreferrer" : undefined,
35051
- className: `${buttonClass} event-compact-row-cta`,
35052
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: cta.label })
35243
+ variant: buttonVariant,
35244
+ size: "sm",
35245
+ extraClassName: "event-compact-row-cta",
35246
+ labelClassName: "event-compact-row-cta-label",
35247
+ label: cta.label
35053
35248
  })]
35054
35249
  })]
35055
35250
  })]
@@ -35093,10 +35288,6 @@ function EventQuickDateCard(props$1) {
35093
35288
  kind: "event_occurrence",
35094
35289
  occurrenceId: event.occurrenceId
35095
35290
  });
35096
- const buttonClass = themeButtonClassName({
35097
- variant: props$1.buttonVariant,
35098
- size: "sm"
35099
- });
35100
35291
  const quickDateLabel = `${event.title}, ${date.label}`;
35101
35292
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", {
35102
35293
  className: "event-quick-date rb-flex rb-min-w-12rem rb-shrink-0 rb-flex-col rb-gap-3 rb-rounded-lg rb-border rb-bg-surface rb-p-4",
@@ -35128,13 +35319,15 @@ function EventQuickDateCard(props$1) {
35128
35319
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
35129
35320
  className: "event-quick-date-price",
35130
35321
  children: formatEventPrice(event)
35131
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
35132
- className: `${buttonClass} event-quick-date-cta`,
35322
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
35323
+ variant: props$1.buttonVariant,
35324
+ size: "sm",
35325
+ extraClassName: "event-quick-date-cta",
35133
35326
  href: ctaHref,
35134
35327
  target: cta.external ? "_blank" : undefined,
35135
35328
  rel: cta.external ? "noopener noreferrer" : undefined,
35136
35329
  "aria-label": `${cta.label} ${quickDateLabel}`,
35137
- children: cta.label
35330
+ label: cta.label
35138
35331
  })]
35139
35332
  })
35140
35333
  ]
@@ -35214,10 +35407,6 @@ const EventSpotlight = ({ events, layout = "grid", columns = "3", cardRole = "de
35214
35407
  }
35215
35408
  const containerClass = getContainerClass(layout, columns);
35216
35409
  const cardOrientation = getCardOrientation(layout);
35217
- const buttonClass = themeButtonClassName({
35218
- variant: buttonVariant,
35219
- size: "md"
35220
- });
35221
35410
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
35222
35411
  className: `event-spotlight-section ${className || ""}`,
35223
35412
  "data-block": "event-spotlight",
@@ -35235,16 +35424,45 @@ const EventSpotlight = ({ events, layout = "grid", columns = "3", cardRole = "de
35235
35424
  }, event.occurrenceId || event.id))
35236
35425
  }), ctaLabel && ctaUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
35237
35426
  className: "rb-mt-8 rb-text-center",
35238
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
35427
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
35239
35428
  href: ctaUrl,
35240
- className: buttonClass,
35241
- children: ctaLabel
35429
+ variant: buttonVariant,
35430
+ size: "md",
35431
+ label: ctaLabel
35242
35432
  })
35243
35433
  }) : null]
35244
35434
  });
35245
35435
  };
35246
35436
  var EventSpotlight_default = EventSpotlight;
35247
35437
 
35438
+ //#endregion
35439
+ //#region ../blocks/src/system/runtime/api/readAuthority.ts
35440
+ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("published") }).strict(), z.object({
35441
+ kind: z.literal("preview"),
35442
+ token: z.string().min(1)
35443
+ }).strict()]);
35444
+ /** Generic SDK/editor configuration is projected here; hosted callers supply the closed union. */
35445
+ function getBlockApiReadStage(config$1) {
35446
+ return config$1.readAuthority?.kind ?? (config$1.isPreview && config$1.auth.type !== "none" ? "preview" : "published");
35447
+ }
35448
+ function createHostedBlockApiConfig(input) {
35449
+ const { baseUrl, siteId, readAuthority, portalToken } = input;
35450
+ return {
35451
+ baseUrl,
35452
+ siteId,
35453
+ readAuthority,
35454
+ auth: readAuthority.kind === "preview" ? {
35455
+ type: "bearer",
35456
+ token: readAuthority.token
35457
+ } : { type: "none" },
35458
+ isPreview: readAuthority.kind === "preview",
35459
+ authOverrides: { portal: portalToken ? {
35460
+ type: "bearer",
35461
+ token: portalToken
35462
+ } : { type: "none" } }
35463
+ };
35464
+ }
35465
+
35248
35466
  //#endregion
35249
35467
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
35250
35468
  const previewStageSchema = z.enum(["preview", "published"]);
@@ -36249,6 +36467,7 @@ const eventCollectionSourceSchemaShape = {
36249
36467
  events: z.array(publicEventSchema).nullable().optional(),
36250
36468
  siteId: z.string(),
36251
36469
  apiBaseUrl: z.string().optional(),
36470
+ readAuthority: browserReadAuthoritySchema.optional(),
36252
36471
  stage: previewStageSchema.optional(),
36253
36472
  listLayout: eventLayoutSchema.optional(),
36254
36473
  listColumns: columnOptionSchema.optional(),
@@ -36301,7 +36520,6 @@ const eventCollectionDisplaySchemaShape = {
36301
36520
  const eventCollectionHydrationSchema = z.object({
36302
36521
  siteId: z.string(),
36303
36522
  calendarWindow: calendarWindowPageSchema.optional(),
36304
- stage: previewStageSchema.optional(),
36305
36523
  prefetchedEvents: z.boolean(),
36306
36524
  eventSurface: eventSurfaceScopeSchema$1,
36307
36525
  filterEventPresets: z.string().nullable(),
@@ -36376,7 +36594,6 @@ function buildEventCollectionHydration(source, now = new Date()) {
36376
36594
  return {
36377
36595
  calendarWindow: source.calendarWindow ?? undefined,
36378
36596
  siteId: source.siteId,
36379
- stage: source.stage,
36380
36597
  prefetchedEvents: source.events != null,
36381
36598
  eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
36382
36599
  filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
@@ -36424,9 +36641,10 @@ const eventCombinedRenderSchema = z.object({
36424
36641
  const eventCombinedIslandMetaCodec = createZodCodec(z.object({
36425
36642
  siteId: z.string(),
36426
36643
  apiBaseUrl: z.string().optional(),
36644
+ readAuthority: browserReadAuthoritySchema.optional(),
36427
36645
  stage: previewStageSchema.optional()
36428
36646
  }));
36429
- const eventCombinedIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
36647
+ const eventCombinedIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "readAuthority", "stage");
36430
36648
  function buildEventCombinedDisplay(source) {
36431
36649
  return {
36432
36650
  ...buildEventCollectionDisplay(source),
@@ -36456,6 +36674,7 @@ const eventCombinedInteractiveIslandPropsCodec = createInteractiveIslandCodec({
36456
36674
  selectMeta: (value) => ({
36457
36675
  siteId: value.siteId,
36458
36676
  apiBaseUrl: value.apiBaseUrl,
36677
+ readAuthority: value.readAuthority,
36459
36678
  stage: value.stage
36460
36679
  })
36461
36680
  });
@@ -36466,6 +36685,7 @@ function buildEventCombinedInteractiveIslandProps(props$1) {
36466
36685
  meta: {
36467
36686
  siteId: props$1.siteId,
36468
36687
  apiBaseUrl: props$1.apiBaseUrl,
36688
+ readAuthority: props$1.readAuthority,
36469
36689
  stage: props$1.stage
36470
36690
  },
36471
36691
  source: props$1
@@ -36960,11 +37180,6 @@ function OfferingsCatalogue(props$1) {
36960
37180
  //#endregion
36961
37181
  //#region ../blocks/src/system/runtime/nodes/offerings-preview-content.tsx
36962
37182
  function OfferingsPreviewContent(props$1) {
36963
- const groupLinkClass = themeButtonClassName({
36964
- variant: props$1.buttonVariant,
36965
- size: "md",
36966
- extraClassName: "offerings-preview-card-link rb-inline-flex rb-items-center rb-gap-2"
36967
- });
36968
37183
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
36969
37184
  className: "offerings-preview rb-flex rb-flex-col rb-gap-6",
36970
37185
  "data-block": "offerings-preview",
@@ -37004,10 +37219,12 @@ function OfferingsPreviewContent(props$1) {
37004
37219
  }),
37005
37220
  groupCta ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("footer", {
37006
37221
  className: "offerings-preview-card-footer rb-mt-auto rb-flex",
37007
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
37008
- className: groupLinkClass,
37222
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
37223
+ variant: props$1.buttonVariant,
37224
+ size: "md",
37225
+ extraClassName: "offerings-preview-card-link rb-inline-flex rb-items-center rb-gap-2",
37009
37226
  href: groupCta.href,
37010
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: groupCta.label })
37227
+ label: groupCta.label
37011
37228
  })
37012
37229
  }) : null
37013
37230
  ]
@@ -37343,10 +37560,6 @@ function WholeSeriesRunCompactRow({ group, path: path$3, now }) {
37343
37560
  const timeRange = `${formatTime(firstSession.startsAt, { timeZone })} - ${formatTime(firstSession.endsAt, { timeZone })}`;
37344
37561
  const price = formatEventPriceDisplay(group.representative.pricing);
37345
37562
  const statusLabel = resolveWholeSeriesBookingPhase(group.run, now).kind === "open" ? null : "Registration closed";
37346
- const ctaClass = themeButtonClassName({
37347
- variant: "primary",
37348
- size: "sm"
37349
- });
37350
37563
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", {
37351
37564
  className: "event-compact-row offerings-preview-whole-series-row",
37352
37565
  children: [
@@ -37405,10 +37618,13 @@ function WholeSeriesRunCompactRow({ group, path: path$3, now }) {
37405
37618
  }), statusLabel || !path$3 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
37406
37619
  className: "event-compact-row-status",
37407
37620
  children: statusLabel ?? "Details coming soon"
37408
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
37621
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
37409
37622
  href: path$3,
37410
- className: `${ctaClass} event-compact-row-cta`,
37411
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Book now" })
37623
+ variant: "primary",
37624
+ size: "sm",
37625
+ extraClassName: "event-compact-row-cta",
37626
+ labelClassName: "event-compact-row-cta-label",
37627
+ label: "Book now"
37412
37628
  })]
37413
37629
  })
37414
37630
  ]
@@ -37425,10 +37641,6 @@ function WholeSeriesRunFeatureCard({ group, now, path: path$3, buttonVariant, bu
37425
37641
  const formattedDate = formatEventCompactDateRail(firstSession.startsAt, { timeZone }).label;
37426
37642
  const timeRange = `${formatTime(firstSession.startsAt, { timeZone })} - ${formatTime(firstSession.endsAt, { timeZone })}`;
37427
37643
  const price = formatEventPriceDisplay(group.representative.pricing);
37428
- const ctaClass = themeButtonClassName({
37429
- variant: buttonVariant,
37430
- size: "md"
37431
- });
37432
37644
  const statusLabel = resolveWholeSeriesBookingPhase(group.run, now).kind === "open" ? null : "Registration closed";
37433
37645
  const description = group.representative.description;
37434
37646
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("article", {
@@ -37461,10 +37673,12 @@ function WholeSeriesRunFeatureCard({ group, now, path: path$3, buttonVariant, bu
37461
37673
  }), statusLabel || !path$3 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
37462
37674
  className: "event-compact-row-status",
37463
37675
  children: statusLabel ?? "Details coming soon"
37464
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
37676
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
37465
37677
  href: path$3,
37466
- className: `${ctaClass} event-card-cta`,
37467
- children: buttonText || "Book now"
37678
+ variant: buttonVariant,
37679
+ size: "md",
37680
+ extraClassName: "event-card-cta",
37681
+ label: buttonText || "Book now"
37468
37682
  })]
37469
37683
  })
37470
37684
  ]
@@ -37627,15 +37841,13 @@ function WeeklySlotAvailabilityView({ availability, loading = false, error: erro
37627
37841
  "."
37628
37842
  ]
37629
37843
  }),
37630
- resolvedCtaUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
37631
- className: themeButtonClassName({
37632
- variant: "ghost",
37633
- size: "sm",
37634
- extraClassName: "weekly-slot-availability__cta"
37635
- }),
37844
+ resolvedCtaUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
37845
+ variant: "ghost",
37846
+ size: "sm",
37847
+ extraClassName: "weekly-slot-availability__cta",
37636
37848
  href: buildSlotCtaUrl(resolvedCtaUrl, slot),
37637
37849
  "aria-label": buildSlotCtaLabel(resolvedCtaText, slot),
37638
- children: resolvedCtaText
37850
+ label: resolvedCtaText
37639
37851
  }) : null
37640
37852
  ]
37641
37853
  }, slot.id))
@@ -38590,6 +38802,7 @@ const shopSourceSchema = z.object({
38590
38802
  products: z.array(publicProductSchema).nullable().optional(),
38591
38803
  siteId: z.string().optional(),
38592
38804
  apiBaseUrl: z.string().optional(),
38805
+ readAuthority: browserReadAuthoritySchema.optional(),
38593
38806
  stage: previewStageSchema.optional()
38594
38807
  });
38595
38808
  const productVariantOptionDisplaySchema = z.object({
@@ -38757,13 +38970,15 @@ function resolveShowPricePerCredit(source) {
38757
38970
  const shopIslandMetaCodec = createZodCodec(z.object({
38758
38971
  siteId: z.string().optional(),
38759
38972
  apiBaseUrl: z.string().optional(),
38973
+ readAuthority: browserReadAuthoritySchema.optional(),
38760
38974
  stage: previewStageSchema.optional()
38761
38975
  }));
38762
- const shopIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
38976
+ const shopIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "readAuthority", "stage");
38763
38977
  function selectShopIslandMeta(value) {
38764
38978
  return {
38765
38979
  siteId: value.siteId,
38766
38980
  apiBaseUrl: value.apiBaseUrl,
38981
+ readAuthority: value.readAuthority,
38767
38982
  stage: value.stage
38768
38983
  };
38769
38984
  }
@@ -38934,6 +39149,7 @@ function buildShopInteractiveIslandProps(props$1) {
38934
39149
  meta: {
38935
39150
  siteId: props$1.siteId,
38936
39151
  apiBaseUrl: props$1.apiBaseUrl,
39152
+ readAuthority: props$1.readAuthority,
38937
39153
  stage: props$1.stage
38938
39154
  },
38939
39155
  source: {
@@ -38949,6 +39165,7 @@ function buildProductListInteractiveIslandProps(props$1) {
38949
39165
  meta: {
38950
39166
  siteId: props$1.siteId,
38951
39167
  apiBaseUrl: props$1.apiBaseUrl,
39168
+ readAuthority: props$1.readAuthority,
38952
39169
  stage: props$1.stage
38953
39170
  },
38954
39171
  source: {
@@ -38964,6 +39181,7 @@ function buildProductDetailInteractiveIslandProps(props$1) {
38964
39181
  meta: {
38965
39182
  siteId: props$1.siteId,
38966
39183
  apiBaseUrl: props$1.apiBaseUrl,
39184
+ readAuthority: props$1.readAuthority,
38967
39185
  stage: props$1.stage
38968
39186
  },
38969
39187
  source: {
@@ -38979,6 +39197,7 @@ function buildCartInteractiveIslandProps(props$1) {
38979
39197
  meta: {
38980
39198
  siteId: props$1.siteId,
38981
39199
  apiBaseUrl: props$1.apiBaseUrl,
39200
+ readAuthority: props$1.readAuthority,
38982
39201
  stage: props$1.stage
38983
39202
  },
38984
39203
  source: {
@@ -38994,6 +39213,7 @@ function buildCheckoutInteractiveIslandProps(props$1) {
38994
39213
  meta: {
38995
39214
  siteId: props$1.siteId,
38996
39215
  apiBaseUrl: props$1.apiBaseUrl,
39216
+ readAuthority: props$1.readAuthority,
38997
39217
  stage: props$1.stage
38998
39218
  },
38999
39219
  source: {
@@ -39096,6 +39316,7 @@ const cartManifest = createBlockManifest({
39096
39316
  baseClass: "",
39097
39317
  spacing: "spacious",
39098
39318
  children: sectionContainer([cart(withApiBindings({
39319
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
39099
39320
  mode: "cart",
39100
39321
  heading: { $bind: {
39101
39322
  from: "content.heading",
@@ -39183,6 +39404,7 @@ const checkoutManifest = createBlockManifest({
39183
39404
  baseClass: "",
39184
39405
  spacing: "spacious",
39185
39406
  children: sectionContainer([checkout(withApiBindings({
39407
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
39186
39408
  mode: "checkout",
39187
39409
  heading: { $bind: {
39188
39410
  from: "content.heading",
@@ -39514,6 +39736,18 @@ function getStepNumber(step, wizardSteps) {
39514
39736
 
39515
39737
  //#endregion
39516
39738
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
39739
+ /** Public requests share subject identity without copying the run's display sessions. */
39740
+ function toRegistrationRequestSubject(subject, attendanceMode) {
39741
+ return subject.kind === "occurrence" ? {
39742
+ kind: "occurrence",
39743
+ occurrenceId: subject.occurrenceId,
39744
+ attendanceMode: attendanceMode ?? undefined
39745
+ } : {
39746
+ kind: "wholeSeries",
39747
+ eventSeriesId: subject.eventSeriesId,
39748
+ attendanceMode: attendanceMode ?? undefined
39749
+ };
39750
+ }
39517
39751
  function eventMatchesOccurrenceId(event, occurrenceId) {
39518
39752
  return event.registrationSubject.kind === "occurrence" && (event.registrationSubject.occurrenceId === occurrenceId || event.selectionId === occurrenceId);
39519
39753
  }
@@ -39724,6 +39958,7 @@ const eventRegistrationSourceSchema = z.object({
39724
39958
  apiBaseUrl: z.string().optional(),
39725
39959
  portalToken: z.string().nullable().optional(),
39726
39960
  previewToken: z.string().nullable().optional(),
39961
+ readAuthority: browserReadAuthoritySchema.optional(),
39727
39962
  ...eventRegistrationHydrationSchemaShape,
39728
39963
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
39729
39964
  wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
@@ -39761,9 +39996,10 @@ const eventRegistrationIslandMetaCodec = createZodCodec(z.object({
39761
39996
  apiBaseUrl: z.string().optional(),
39762
39997
  portalToken: z.string().nullable().optional(),
39763
39998
  previewToken: z.string().nullable().optional(),
39999
+ readAuthority: browserReadAuthoritySchema.optional(),
39764
40000
  stage: previewStageSchema.optional()
39765
40001
  }));
39766
- const eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "portalToken", "previewToken", "stage");
40002
+ const eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "portalToken", "previewToken", "readAuthority", "stage");
39767
40003
  function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents) {
39768
40004
  const selectedRun = resolveSelectedWholeSeriesRun(scopedSourceEvents);
39769
40005
  if (selectedRun && (!selectedRun.run.enrollmentOpen || toWholeSeriesRegistrationEvent(selectedRun) === null)) {
@@ -39844,6 +40080,7 @@ function shellLabelForRegistrationStep(step, events) {
39844
40080
  case "redirecting":
39845
40081
  case "verifying-payment":
39846
40082
  case "verifying-timeout":
40083
+ case "payment-status":
39847
40084
  case "payment-failed": return "Details";
39848
40085
  }
39849
40086
  }
@@ -39918,6 +40155,7 @@ const eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCode
39918
40155
  apiBaseUrl: value.apiBaseUrl,
39919
40156
  portalToken: value.portalToken,
39920
40157
  previewToken: value.previewToken,
40158
+ readAuthority: value.readAuthority,
39921
40159
  stage: value.stage
39922
40160
  })
39923
40161
  });
@@ -39930,6 +40168,7 @@ function buildEventRegistrationInteractiveIslandProps(props$1) {
39930
40168
  apiBaseUrl: props$1.apiBaseUrl,
39931
40169
  portalToken: props$1.portalToken,
39932
40170
  previewToken: props$1.previewToken,
40171
+ readAuthority: props$1.readAuthority,
39933
40172
  stage: props$1.stage
39934
40173
  },
39935
40174
  source: props$1
@@ -40079,6 +40318,7 @@ const eventRegistrationManifest = createBlockManifest({
40079
40318
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
40080
40319
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
40081
40320
  eventRegistration(withApiBindings({
40321
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
40082
40322
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
40083
40323
  subject: { $bind: { from: "$root.subject" } },
40084
40324
  portalToken: { $bind: {
@@ -40540,9 +40780,10 @@ const eventCalendarRenderSchema = z.object({
40540
40780
  const eventCalendarIslandMetaCodec = createZodCodec(z.object({
40541
40781
  siteId: z.string(),
40542
40782
  apiBaseUrl: z.string().optional(),
40783
+ readAuthority: browserReadAuthoritySchema.optional(),
40543
40784
  stage: previewStageSchema.optional()
40544
40785
  }));
40545
- const eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
40786
+ const eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "readAuthority", "stage");
40546
40787
  /**
40547
40788
  * Collapse an optional/blank string to `undefined` so downstream week-board
40548
40789
  * copy (title, footer note) and the CTA href stay hidden unless a site opts in
@@ -40562,7 +40803,7 @@ function buildEventCalendarDisplay(source) {
40562
40803
  listColumns: source.listColumns ?? source.columns
40563
40804
  }),
40564
40805
  kind: "event-calendar",
40565
- displayMode: normalizeEventCalendarDisplayMode(source) ?? "combined",
40806
+ displayMode: resolveEventCalendarReadPlan(source).mode,
40566
40807
  className: source.className ?? null,
40567
40808
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
40568
40809
  boardTitle: normalizeOptionalText(source.boardTitle),
@@ -40583,7 +40824,6 @@ function buildEventCalendarListingRender(render, className = render.display.clas
40583
40824
  display: buildEventCalendarListingDisplay(display, hydration.prefetchedEvents, className),
40584
40825
  hydration: {
40585
40826
  siteId: hydration.siteId,
40586
- stage: hydration.stage,
40587
40827
  eventsPerPage: display.eventsPerPage,
40588
40828
  paginationAction: display.paginationAction,
40589
40829
  showFilters: display.showFilters,
@@ -40607,13 +40847,17 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
40607
40847
  source: createZodCodec(eventCalendarSourceSchema),
40608
40848
  render: createZodCodec(eventCalendarRenderSchema)
40609
40849
  },
40610
- buildRender: (source) => ({
40611
- display: buildEventCalendarDisplay(source.calendarWindow && (source.variant ?? source.displayMode ?? "combined") !== "combined" && (source.variant ?? source.displayMode) !== "list" ? {
40850
+ buildRender: (source) => {
40851
+ const plan = resolveEventCalendarReadPlan(source);
40852
+ const displaySource = source.calendarWindow && plan.jobs === "calendar" ? {
40612
40853
  ...source,
40613
40854
  events: source.calendarWindow.events
40614
- } : source),
40615
- hydration: buildEventCollectionHydration(source)
40616
- })
40855
+ } : source;
40856
+ return {
40857
+ display: buildEventCalendarDisplay(displaySource),
40858
+ hydration: buildEventCollectionHydration(source)
40859
+ };
40860
+ }
40617
40861
  });
40618
40862
  const eventCalendarInteractiveIslandPropsCodec = createInteractiveIslandCodec({
40619
40863
  runtime: eventCalendarBlockRuntime,
@@ -40623,6 +40867,7 @@ const eventCalendarInteractiveIslandPropsCodec = createInteractiveIslandCodec({
40623
40867
  selectMeta: (value) => ({
40624
40868
  siteId: value.siteId,
40625
40869
  apiBaseUrl: value.apiBaseUrl,
40870
+ readAuthority: value.readAuthority,
40626
40871
  stage: value.stage
40627
40872
  })
40628
40873
  });
@@ -40633,6 +40878,7 @@ function buildEventCalendarInteractiveIslandProps(props$1) {
40633
40878
  meta: {
40634
40879
  siteId: props$1.siteId,
40635
40880
  apiBaseUrl: props$1.apiBaseUrl,
40881
+ readAuthority: props$1.readAuthority,
40636
40882
  stage: props$1.stage
40637
40883
  },
40638
40884
  source: props$1
@@ -40788,6 +41034,7 @@ const eventCalendarLayout = [styledSection({
40788
41034
  rootType: "stack",
40789
41035
  rootProps: { gap: "lg" },
40790
41036
  children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
41037
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
40791
41038
  events: { $bind: { from: "data.events" } },
40792
41039
  calendarWindow: { $bind: { from: "data.calendarWindow" } },
40793
41040
  stage: { $bind: {
@@ -41671,6 +41918,7 @@ const eventListingSourceSchema = z.object({
41671
41918
  events: z.array(publicEventSchema).nullable().optional(),
41672
41919
  siteId: z.string(),
41673
41920
  apiBaseUrl: z.string().optional(),
41921
+ readAuthority: browserReadAuthoritySchema.optional(),
41674
41922
  stage: previewStageSchema.optional(),
41675
41923
  layout: eventLayoutSchema.optional(),
41676
41924
  columns: columnOptionSchema.optional(),
@@ -41711,7 +41959,6 @@ const eventListingDisplaySchema = z.object({
41711
41959
  });
41712
41960
  const eventListingHydrationSchema = z.object({
41713
41961
  siteId: z.string(),
41714
- stage: previewStageSchema.optional(),
41715
41962
  eventsPerPage: eventPageSizeSchema,
41716
41963
  paginationAction: eventListPaginationActionSchema,
41717
41964
  showFilters: z.boolean(),
@@ -41734,6 +41981,7 @@ const eventListingRenderSchema = z.object({
41734
41981
  const eventListingIslandMetaCodec = createZodCodec(z.object({
41735
41982
  siteId: z.string(),
41736
41983
  apiBaseUrl: z.string().optional(),
41984
+ readAuthority: browserReadAuthoritySchema.optional(),
41737
41985
  stage: previewStageSchema.optional()
41738
41986
  }));
41739
41987
  const eventListingBlockRuntime = defineProgressiveBlockRuntime({
@@ -41768,7 +42016,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
41768
42016
  },
41769
42017
  hydration: {
41770
42018
  siteId: source.siteId,
41771
- stage: source.stage,
41772
42019
  eventsPerPage: pageSize,
41773
42020
  paginationAction: resolveEventListPaginationAction({
41774
42021
  paginationMode: source.paginationMode,
@@ -41791,7 +42038,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
41791
42038
  };
41792
42039
  }
41793
42040
  });
41794
- const eventListingIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
42041
+ const eventListingIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "readAuthority", "stage");
41795
42042
  const eventListingInteractiveIslandPropsCodec = createInteractiveIslandCodec({
41796
42043
  runtime: eventListingBlockRuntime,
41797
42044
  mode: "event-listing",
@@ -41800,6 +42047,7 @@ const eventListingInteractiveIslandPropsCodec = createInteractiveIslandCodec({
41800
42047
  selectMeta: (value) => ({
41801
42048
  siteId: value.siteId,
41802
42049
  apiBaseUrl: value.apiBaseUrl,
42050
+ readAuthority: value.readAuthority,
41803
42051
  stage: value.stage
41804
42052
  })
41805
42053
  });
@@ -41810,6 +42058,7 @@ function buildEventListingInteractiveIslandProps(props$1) {
41810
42058
  meta: {
41811
42059
  siteId: props$1.siteId,
41812
42060
  apiBaseUrl: props$1.apiBaseUrl,
42061
+ readAuthority: props$1.readAuthority,
41813
42062
  stage: props$1.stage
41814
42063
  },
41815
42064
  source: props$1
@@ -42055,6 +42304,7 @@ const eventListingLayout = [styledSection({
42055
42304
  rootType: "stack",
42056
42305
  rootProps: { gap: "lg" },
42057
42306
  children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
42307
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
42058
42308
  events: { $bind: { from: "data.events" } },
42059
42309
  stage: { $bind: {
42060
42310
  from: "$root.previewStage",
@@ -42777,6 +43027,7 @@ const productDetailManifest = createBlockManifest({
42777
43027
  baseClass: "",
42778
43028
  spacing: "spacious",
42779
43029
  children: sectionContainer([productDetail(withApiBindings({
43030
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
42780
43031
  mode: "product-detail",
42781
43032
  heading: { $bind: {
42782
43033
  from: "content.heading",
@@ -42949,6 +43200,7 @@ const productListManifest = createBlockManifest({
42949
43200
  baseClass: "",
42950
43201
  spacing: "spacious",
42951
43202
  children: sectionContainer([productList(withApiBindings({
43203
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
42952
43204
  mode: "product-list",
42953
43205
  heading: { $bind: {
42954
43206
  from: "content.heading",
@@ -43233,6 +43485,7 @@ const shopManifest = createBlockManifest({
43233
43485
  baseClass: "",
43234
43486
  spacing: "spacious",
43235
43487
  children: sectionContainer([shop(withApiBindings({
43488
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
43236
43489
  mode: "passes-memberships",
43237
43490
  showPasses: { $bind: {
43238
43491
  from: "content.showPasses",
@@ -43643,15 +43896,13 @@ function CheckoutShellView(props$1) {
43643
43896
  //#endregion
43644
43897
  //#region ../blocks/src/system/runtime/nodes/shop-commerce.server.tsx
43645
43898
  function renderServerPendingAction(label, soldOut) {
43646
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
43899
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
43647
43900
  type: "button",
43648
- className: themeButtonClassName({
43649
- variant: "default",
43650
- size: "md"
43651
- }),
43901
+ variant: "default",
43902
+ size: "md",
43903
+ label: soldOut ? "Sold out" : label,
43652
43904
  disabled: true,
43653
- "aria-disabled": "true",
43654
- children: soldOut ? "Sold out" : label
43905
+ "aria-disabled": "true"
43655
43906
  }), !soldOut ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
43656
43907
  className: "rb-caption status-muted",
43657
43908
  children: "Cart actions become interactive after page load."
@@ -43668,13 +43919,11 @@ function ProductListServerContent(props$1) {
43668
43919
  selectedVariantId: card.selectedVariantId,
43669
43920
  disabled: true
43670
43921
  }),
43671
- actions: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [renderServerPendingAction(card.actionLabel, card.soldOut), card.path ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
43922
+ actions: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [renderServerPendingAction(card.actionLabel, card.soldOut), card.path ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
43672
43923
  href: card.path,
43673
- className: themeButtonClassName({
43674
- variant: "secondary",
43675
- size: "sm"
43676
- }),
43677
- children: "View details"
43924
+ variant: "secondary",
43925
+ size: "sm",
43926
+ label: "View details"
43678
43927
  }) : null] })
43679
43928
  }, card.productId))
43680
43929
  });
@@ -43978,10 +44227,6 @@ function AgendaLinkCard({ event, showCapacity, showVenue, buttonVariant, buttonT
43978
44227
  const price = formatEventPrice(event);
43979
44228
  const capacity = showCapacity ? formatEventRemainingPlaces(event) : null;
43980
44229
  const cta = resolveEventCta(event, buttonText);
43981
- const buttonClass = themeButtonClassName({
43982
- variant: buttonVariant,
43983
- size: "sm"
43984
- });
43985
44230
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", {
43986
44231
  className: "event-agenda-card event-agenda-card--agenda",
43987
44232
  children: [
@@ -44033,12 +44278,14 @@ function AgendaLinkCard({ event, showCapacity, showVenue, buttonVariant, buttonT
44033
44278
  }), cta.hidden ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
44034
44279
  className: "event-agenda-card-status status-muted",
44035
44280
  children: cta.label
44036
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
44281
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
44037
44282
  href: cta.href,
44038
44283
  target: cta.external ? "_blank" : undefined,
44039
44284
  rel: cta.external ? "noopener noreferrer" : undefined,
44040
- className: `${buttonClass} event-agenda-card-cta`,
44041
- children: cta.label
44285
+ variant: buttonVariant,
44286
+ size: "sm",
44287
+ extraClassName: "event-agenda-card-cta",
44288
+ label: cta.label
44042
44289
  })]
44043
44290
  })
44044
44291
  ]
@@ -44244,7 +44491,7 @@ const WeekBoardCard = ({ event, showCapacity, calendarTimeZone }) => {
44244
44491
  ]
44245
44492
  });
44246
44493
  };
44247
- const WeekBoardNavigationControls = ({ navigation: navigation$1, todayClassName }) => {
44494
+ const WeekBoardNavigationControls = ({ navigation: navigation$1, buttonVariant }) => {
44248
44495
  const handlers = navigation$1.kind === "interactive" ? navigation$1 : {
44249
44496
  onPrevious: undefined,
44250
44497
  onNext: undefined,
@@ -44277,12 +44524,13 @@ const WeekBoardNavigationControls = ({ navigation: navigation$1, todayClassName
44277
44524
  onClick: handlers.onNext,
44278
44525
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CalendarNavigationChevron, { direction: "next" })
44279
44526
  }),
44280
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44527
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
44281
44528
  type: "button",
44282
- className: todayClassName,
44529
+ variant: buttonVariant,
44530
+ size: "sm",
44531
+ label: "Today",
44283
44532
  disabled: navigation$1.isCurrentWeek,
44284
- onClick: handlers.onToday,
44285
- children: "Today"
44533
+ onClick: handlers.onToday
44286
44534
  })
44287
44535
  ]
44288
44536
  });
@@ -44298,18 +44546,19 @@ const WeekBoardLegend = () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div",
44298
44546
  }), item.label]
44299
44547
  }, item.status))
44300
44548
  });
44301
- const WeekBoardLoadError = ({ navigation: navigation$1, buttonClassName }) => {
44549
+ const WeekBoardLoadError = ({ navigation: navigation$1, buttonVariant }) => {
44302
44550
  if (navigation$1.kind !== "interactive" || navigation$1.loadState.kind !== "error") {
44303
44551
  return null;
44304
44552
  }
44305
44553
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44306
44554
  className: "event-week-board-error",
44307
44555
  role: "status",
44308
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "Failed to load events" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44556
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "Failed to load events" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
44309
44557
  type: "button",
44310
- className: buttonClassName,
44311
- onClick: navigation$1.loadState.onRetry,
44312
- children: "Try again"
44558
+ variant: buttonVariant,
44559
+ size: "sm",
44560
+ label: "Try again",
44561
+ onClick: navigation$1.loadState.onRetry
44313
44562
  })]
44314
44563
  });
44315
44564
  };
@@ -44341,17 +44590,18 @@ const WeekBoardGrid = ({ days, eventsByDate, showCapacity, calendarTimeZone, tod
44341
44590
  }, dateKey);
44342
44591
  })
44343
44592
  });
44344
- const WeekBoardFooter = ({ note, ctaHref, ctaLabel, ctaClassName }) => {
44593
+ const WeekBoardFooter = ({ note, ctaHref, ctaLabel, buttonVariant }) => {
44345
44594
  if (note === null && ctaHref === null) return null;
44346
44595
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44347
44596
  className: "event-week-board-foot",
44348
44597
  children: [note === null ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
44349
44598
  className: "event-week-board-foot-note",
44350
44599
  children: note
44351
- }), ctaHref === null ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
44352
- className: ctaClassName,
44600
+ }), ctaHref === null ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButtonLink, {
44601
+ variant: buttonVariant,
44602
+ size: "sm",
44353
44603
  href: ctaHref,
44354
- children: ctaLabel
44604
+ label: ctaLabel
44355
44605
  })]
44356
44606
  });
44357
44607
  };
@@ -44366,14 +44616,6 @@ const WeekBoardFooter = ({ note, ctaHref, ctaLabel, ctaClassName }) => {
44366
44616
  const WeekBoardView = ({ days, events, navigation: navigation$1, showCapacity, emptyMessage = "No classes scheduled this week", title, footerNote, ctaLabel = "Reserve a place", ctaHref = null, buttonVariant = "outline", elevated = false, banded = false, calendarTimeZone, today }) => {
44367
44617
  const eventsByDate = groupEventsByDate(events, calendarTimeZone);
44368
44618
  const hasAnyEvents = days.some((date) => (eventsByDate.get(formatDateKey(date)) ?? []).length > 0);
44369
- const ctaClassName = themeButtonClassName({
44370
- variant: buttonVariant,
44371
- size: "sm"
44372
- });
44373
- const todayClassName = themeButtonClassName({
44374
- variant: buttonVariant,
44375
- size: "sm"
44376
- });
44377
44619
  const hasTitle = typeof title === "string" && title.length > 0;
44378
44620
  const hasFooterNote = typeof footerNote === "string" && footerNote.length > 0;
44379
44621
  const footerNoteText = hasAnyEvents ? hasFooterNote ? footerNote : null : emptyMessage;
@@ -44396,14 +44638,14 @@ const WeekBoardView = ({ days, events, navigation: navigation$1, showCapacity, e
44396
44638
  }) : null,
44397
44639
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeekBoardNavigationControls, {
44398
44640
  navigation: navigation$1,
44399
- todayClassName
44641
+ buttonVariant
44400
44642
  }),
44401
44643
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeekBoardLegend, {})
44402
44644
  ]
44403
44645
  }),
44404
44646
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeekBoardLoadError, {
44405
44647
  navigation: navigation$1,
44406
- buttonClassName: todayClassName
44648
+ buttonVariant
44407
44649
  }),
44408
44650
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeekBoardGrid, {
44409
44651
  days,
@@ -44416,7 +44658,7 @@ const WeekBoardView = ({ days, events, navigation: navigation$1, showCapacity, e
44416
44658
  note: footerNoteText,
44417
44659
  ctaHref: resolvedCtaHref,
44418
44660
  ctaLabel,
44419
- ctaClassName
44661
+ buttonVariant
44420
44662
  })
44421
44663
  ]
44422
44664
  })
@@ -44521,6 +44763,54 @@ function assertNeverDisplayMode(value) {
44521
44763
  function renderEventCard(event, display) {
44522
44764
  return renderEventListItem(event, display);
44523
44765
  }
44766
+ function CalendarSsrHeader(props$1) {
44767
+ const periodLabel = props$1.period === "week" ? "week" : "month";
44768
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44769
+ className: "event-calendar-header",
44770
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44771
+ className: "event-calendar-nav",
44772
+ children: [
44773
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44774
+ type: "button",
44775
+ className: "event-calendar-nav-btn",
44776
+ "aria-label": `Previous ${periodLabel}`,
44777
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CalendarSsrChevron, { direction: "previous" })
44778
+ }),
44779
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
44780
+ className: "event-calendar-title",
44781
+ children: props$1.title
44782
+ }),
44783
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44784
+ type: "button",
44785
+ className: "event-calendar-nav-btn",
44786
+ "aria-label": `Next ${periodLabel}`,
44787
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CalendarSsrChevron, { direction: "next" })
44788
+ })
44789
+ ]
44790
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
44791
+ type: "button",
44792
+ variant: props$1.buttonVariant,
44793
+ size: "sm",
44794
+ label: "Today"
44795
+ })]
44796
+ });
44797
+ }
44798
+ function CalendarSsrChevron(props$1) {
44799
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
44800
+ width: "20",
44801
+ height: "20",
44802
+ fill: "none",
44803
+ stroke: "currentColor",
44804
+ strokeWidth: 2,
44805
+ viewBox: "0 0 24 24",
44806
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
44807
+ strokeLinecap: "round",
44808
+ strokeLinejoin: "round",
44809
+ strokeWidth: 2,
44810
+ d: props$1.direction === "previous" ? "M15 19l-7-7 7-7" : "M9 5l7 7-7 7"
44811
+ })
44812
+ });
44813
+ }
44524
44814
  function renderCombinedSsr(display, prefetchedEvents) {
44525
44815
  const listDisplay = buildEventCalendarListingDisplay(display, prefetchedEvents, "event-combined-content");
44526
44816
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -44568,62 +44858,10 @@ function renderCalendarSsr(display, hydration) {
44568
44858
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44569
44859
  className: clsx_default("event-calendar", display.className ?? undefined),
44570
44860
  "data-block": "event-calendar",
44571
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44572
- className: "event-calendar-header",
44573
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44574
- className: "event-calendar-nav",
44575
- children: [
44576
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44577
- type: "button",
44578
- className: "event-calendar-nav-btn",
44579
- "aria-label": calendarView === "week" ? "Previous week" : "Previous month",
44580
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
44581
- width: "20",
44582
- height: "20",
44583
- fill: "none",
44584
- stroke: "currentColor",
44585
- strokeWidth: 2,
44586
- viewBox: "0 0 24 24",
44587
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
44588
- strokeLinecap: "round",
44589
- strokeLinejoin: "round",
44590
- strokeWidth: 2,
44591
- d: "M15 19l-7-7 7-7"
44592
- })
44593
- })
44594
- }),
44595
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
44596
- className: "event-calendar-title",
44597
- children: viewport.title
44598
- }),
44599
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44600
- type: "button",
44601
- className: "event-calendar-nav-btn",
44602
- "aria-label": calendarView === "week" ? "Next week" : "Next month",
44603
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
44604
- width: "20",
44605
- height: "20",
44606
- fill: "none",
44607
- stroke: "currentColor",
44608
- strokeWidth: 2,
44609
- viewBox: "0 0 24 24",
44610
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
44611
- strokeLinecap: "round",
44612
- strokeLinejoin: "round",
44613
- strokeWidth: 2,
44614
- d: "M9 5l7 7-7 7"
44615
- })
44616
- })
44617
- })
44618
- ]
44619
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44620
- type: "button",
44621
- className: themeButtonClassName({
44622
- variant: display.buttonVariant,
44623
- size: "sm"
44624
- }),
44625
- children: "Today"
44626
- })]
44861
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CalendarSsrHeader, {
44862
+ title: viewport.title,
44863
+ period: calendarView,
44864
+ buttonVariant: display.buttonVariant
44627
44865
  }), viewport.kind === "week" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeekAgendaView, {
44628
44866
  days: viewport.days,
44629
44867
  events: [...display.events],
@@ -44700,62 +44938,10 @@ function renderTimetableSsr(display, hydration) {
44700
44938
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44701
44939
  className: clsx_default("event-calendar", "event-calendar--timetable", display.className ?? undefined),
44702
44940
  "data-block": "event-calendar",
44703
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44704
- className: "event-calendar-header",
44705
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44706
- className: "event-calendar-nav",
44707
- children: [
44708
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44709
- type: "button",
44710
- className: "event-calendar-nav-btn",
44711
- "aria-label": "Previous week",
44712
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
44713
- width: "20",
44714
- height: "20",
44715
- fill: "none",
44716
- stroke: "currentColor",
44717
- strokeWidth: 2,
44718
- viewBox: "0 0 24 24",
44719
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
44720
- strokeLinecap: "round",
44721
- strokeLinejoin: "round",
44722
- strokeWidth: 2,
44723
- d: "M15 19l-7-7 7-7"
44724
- })
44725
- })
44726
- }),
44727
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
44728
- className: "event-calendar-title",
44729
- children: viewport.title
44730
- }),
44731
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44732
- type: "button",
44733
- className: "event-calendar-nav-btn",
44734
- "aria-label": "Next week",
44735
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
44736
- width: "20",
44737
- height: "20",
44738
- fill: "none",
44739
- stroke: "currentColor",
44740
- strokeWidth: 2,
44741
- viewBox: "0 0 24 24",
44742
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
44743
- strokeLinecap: "round",
44744
- strokeLinejoin: "round",
44745
- strokeWidth: 2,
44746
- d: "M9 5l7 7-7 7"
44747
- })
44748
- })
44749
- })
44750
- ]
44751
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
44752
- type: "button",
44753
- className: themeButtonClassName({
44754
- variant: display.buttonVariant,
44755
- size: "sm"
44756
- }),
44757
- children: "Today"
44758
- })]
44941
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CalendarSsrHeader, {
44942
+ title: viewport.title,
44943
+ period: "week",
44944
+ buttonVariant: display.buttonVariant
44759
44945
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
44760
44946
  className: "event-timetable",
44761
44947
  children: [
@@ -45271,14 +45457,12 @@ const FormNodeSSR = ({ blockId, value, submitLabel, successMessage, className, o
45271
45457
  className: "fb-actions",
45272
45458
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
45273
45459
  className: "fb-actions-inner",
45274
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
45460
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
45275
45461
  type: "submit",
45276
- className: themeButtonClassName({
45277
- variant: "primary",
45278
- size: "md",
45279
- extraClassName: "rb-w-full rb-sm-w-auto"
45280
- }),
45281
- children: display.submitLabel
45462
+ variant: "primary",
45463
+ size: "md",
45464
+ extraClassName: "rb-w-full rb-sm-w-auto",
45465
+ label: display.submitLabel
45282
45466
  })
45283
45467
  })
45284
45468
  })
@@ -45376,13 +45560,11 @@ function NewsletterFormSSR(props$1) {
45376
45560
  }) : null,
45377
45561
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
45378
45562
  className: "newsletter-submit",
45379
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
45563
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
45380
45564
  type: "submit",
45381
- className: themeButtonClassName({
45382
- variant: display.buttonVariant,
45383
- size: "md"
45384
- }),
45385
- children: display.buttonLabel
45565
+ variant: display.buttonVariant,
45566
+ size: "md",
45567
+ label: display.buttonLabel
45386
45568
  })
45387
45569
  })
45388
45570
  ]
@@ -45470,28 +45652,24 @@ function ShopSSR({ blockId, siteId, apiBaseUrl, stage, children, checkoutEndpoin
45470
45652
  display: render.display,
45471
45653
  passCards: render.display.passes.map((pass) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PassCardView, {
45472
45654
  display: pass,
45473
- action: pass.action.kind === "unavailable" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PassPurchaseUnavailable, { label: pass.action.label }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
45655
+ action: pass.action.kind === "unavailable" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PassPurchaseUnavailable, { label: pass.action.label }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
45474
45656
  type: "button",
45475
- className: themeButtonClassName({
45476
- variant: render.hydration.buttonVariant,
45477
- size: "md"
45478
- }),
45657
+ variant: render.hydration.buttonVariant,
45658
+ size: "md",
45659
+ label: pass.action.label,
45479
45660
  disabled: true,
45480
- "aria-disabled": "true",
45481
- children: pass.action.label
45661
+ "aria-disabled": "true"
45482
45662
  })
45483
45663
  }, pass.id)),
45484
45664
  membershipCards: render.display.memberships.map((membership) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MembershipCardView, {
45485
45665
  display: membership,
45486
- action: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
45666
+ action: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
45487
45667
  type: "button",
45488
- className: themeButtonClassName({
45489
- variant: render.hydration.buttonVariant,
45490
- size: "md"
45491
- }),
45668
+ variant: render.hydration.buttonVariant,
45669
+ size: "md",
45670
+ label: membership.actionLabel,
45492
45671
  disabled: true,
45493
- "aria-disabled": "true",
45494
- children: membership.actionLabel
45672
+ "aria-disabled": "true"
45495
45673
  })
45496
45674
  }, membership.id))
45497
45675
  }),
@@ -45559,6 +45737,7 @@ const serverComponentRegistry = {
45559
45737
  svg: SvgNode,
45560
45738
  section: SectionNode,
45561
45739
  headerSection: header_section_server_default,
45740
+ headerControl: HeaderControlNode,
45562
45741
  stack: StackNode,
45563
45742
  inline: InlineNode,
45564
45743
  grid: GridNode,
@@ -46501,16 +46680,73 @@ function resolveChildren(nodes, context) {
46501
46680
  function isReactNode(value) {
46502
46681
  return value !== null && value !== undefined;
46503
46682
  }
46683
+ const RENDERER_METADATA_PROP_KEYS = new Set([
46684
+ "pathBase",
46685
+ "blockId",
46686
+ "blockKind",
46687
+ "blockContent",
46688
+ "fragmentRegistry",
46689
+ "previewAuthoring",
46690
+ "contentVersionId",
46691
+ "imageResolveContext"
46692
+ ]);
46693
+ function omitRendererMetadataProps(props$1) {
46694
+ const presentationProps = {};
46695
+ for (const [key, value] of Object.entries(props$1)) {
46696
+ if (!RENDERER_METADATA_PROP_KEYS.has(key)) presentationProps[key] = value;
46697
+ }
46698
+ return presentationProps;
46699
+ }
46700
+ const BLOCK_ID_METADATA_CONSUMERS = new Set([
46701
+ "accordion",
46702
+ "appointment-services",
46703
+ "booking-form",
46704
+ "carousel",
46705
+ "cart",
46706
+ "checkout",
46707
+ "event-calendar",
46708
+ "event-combined",
46709
+ "event-details",
46710
+ "event-listing",
46711
+ "event-registration",
46712
+ "form",
46713
+ "gifting",
46714
+ "headersection",
46715
+ "location-map",
46716
+ "newsletter-form",
46717
+ "product-detail",
46718
+ "product-list",
46719
+ "shop",
46720
+ "weekly-slot-availability"
46721
+ ]);
46722
+ const BLOCK_CONTENT_METADATA_CONSUMERS = new Set([
46723
+ "feature-card-icon",
46724
+ "headersection",
46725
+ "media",
46726
+ "text"
46727
+ ]);
46728
+ const BLOCK_KIND_METADATA_CONSUMERS = new Set([
46729
+ "headersection",
46730
+ "media",
46731
+ "richtext"
46732
+ ]);
46733
+ /**
46734
+ * Projects resolver context only to node kinds with an explicit metadata
46735
+ * contract. Presentation props and renderer metadata never share a universal
46736
+ * spread boundary, so adding metadata cannot leak it into DOM-backed nodes.
46737
+ */
46504
46738
  function resolveNodeMetadata(nodeType, context) {
46505
- return {
46506
- pathBase: context.pathBase,
46507
- blockId: context.blockId,
46508
- blockKind: context.blockKind,
46509
- blockContent: context.blockContent,
46510
- fragmentRegistry: context.fragmentRegistry,
46511
- previewAuthoring: context.previewAuthoring,
46512
- ...nodeType.toLowerCase() === "newsletter-form" ? { contentVersionId: context.contentVersionId } : {},
46513
- ...nodeType === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {}
46739
+ const normalizedType = nodeType.toLowerCase();
46740
+ return {
46741
+ ...BLOCK_ID_METADATA_CONSUMERS.has(normalizedType) ? { blockId: context.blockId } : {},
46742
+ ...BLOCK_KIND_METADATA_CONSUMERS.has(normalizedType) ? { blockKind: context.blockKind } : {},
46743
+ ...BLOCK_CONTENT_METADATA_CONSUMERS.has(normalizedType) ? { blockContent: context.blockContent } : {},
46744
+ ...normalizedType === "headersection" ? {
46745
+ pathBase: context.pathBase,
46746
+ fragmentRegistry: context.fragmentRegistry
46747
+ } : {},
46748
+ ...normalizedType === "newsletter-form" ? { contentVersionId: context.contentVersionId } : {},
46749
+ ...normalizedType === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {}
46514
46750
  };
46515
46751
  }
46516
46752
  /**
@@ -46553,7 +46789,7 @@ function resolveNode(node, context, indexFallback) {
46553
46789
  props$1 = omitHeadingDecorationProps(props$1);
46554
46790
  const children = resolveChildren(node.children, scopeContext);
46555
46791
  const elementProps = {
46556
- ...props$1,
46792
+ ...omitRendererMetadataProps(props$1),
46557
46793
  key: node.key ?? indexFallback,
46558
46794
  ...resolveNodeMetadata(node.type, context)
46559
46795
  };
@@ -47276,7 +47512,7 @@ function generateInputCss({ themeId, theme, inputSystem }) {
47276
47512
  baseInputRules.push("transition: border-color 0.2s ease, box-shadow 0.2s ease");
47277
47513
  const labelSelector = `${rootSelector} .form-label`;
47278
47514
  const labelRules = [];
47279
- labelRules.push(`color: ${rgbColorValue(inputSystem.label.textColorToken)}`);
47515
+ labelRules.push(`color: ${textColorValue(inputSystem.label.textColorToken)}`);
47280
47516
  labelRules.push(`font-weight: ${FONT_WEIGHT_MAP[inputSystem.label.fontWeight]}`);
47281
47517
  labelRules.push(`font-size: ${LABEL_FONT_SIZE_MAP[inputSystem.label.fontSize]}`);
47282
47518
  if (inputSystem.label.textTransform && inputSystem.label.textTransform !== "none") {
@@ -50394,15 +50630,6 @@ function indent(str, spaces) {
50394
50630
  //#endregion
50395
50631
  //#region ../theme-core/src/customCss/patch.ts
50396
50632
  /**
50397
- * Generate a unique ID for a new CSS rule.
50398
- * Uses timestamp + random suffix for uniqueness.
50399
- */
50400
- function generateCssRuleId() {
50401
- const timestamp = Date.now().toString(36);
50402
- const random = Math.random().toString(36).slice(2, 6);
50403
- return `css-${timestamp}-${random}`;
50404
- }
50405
- /**
50406
50633
  * Apply a single patch operation to a rules array.
50407
50634
  *
50408
50635
  * @param rules - Current rules array
@@ -51173,7 +51400,7 @@ function pageBlockPosition(index, blockCount) {
51173
51400
  //#endregion
51174
51401
  //#region ../blocks/src/pageRendererContracts.ts
51175
51402
  function buildPageRendererRootRuntime(dataContext) {
51176
- 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 ?? {};
51403
+ const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, readAuthority, bookingOfferingPresets = [], appointmentServicePathPrefix = null, mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
51177
51404
  return {
51178
51405
  siteId,
51179
51406
  pageId,
@@ -51182,6 +51409,7 @@ function buildPageRendererRootRuntime(dataContext) {
51182
51409
  previewStage,
51183
51410
  apiBaseUrl,
51184
51411
  portalToken,
51412
+ readAuthority,
51185
51413
  bookingOfferingPresets,
51186
51414
  appointmentServicePathPrefix,
51187
51415
  mailingList,
@@ -54322,6 +54550,7 @@ const transformDefinitions = {
54322
54550
  "layout.headerRuntimeContract": headerRuntimeContractTransform,
54323
54551
  "layout.headerLogoClass": headerLogoClassTransform,
54324
54552
  "layout.headerLogoMediaClass": headerLogoMediaClassTransform,
54553
+ "layout.chromeLogo": chromeLogoTransform,
54325
54554
  "layout.headerLogoTextVisible": headerLogoTextVisibleTransform,
54326
54555
  "layout.footerRootClass": footerRootClassTransform,
54327
54556
  "layout.headerRootStyle": headerRootStyleTransform,
@@ -54401,46 +54630,42 @@ const whenTransformed = (from, transformId, equals = true) => (node) => ({
54401
54630
  equals
54402
54631
  }
54403
54632
  });
54404
- const logoRow = link$1({
54633
+ /** Draw whichever site logo suits the surface this row sits on. */
54634
+ const bindChromeLogo = (surface) => bind("content", { transforms: [{
54635
+ id: "layout.chromeLogo",
54636
+ options: { surface }
54637
+ }] });
54638
+ /**
54639
+ * The brand link. The logo is chosen per surface because the open mobile menu
54640
+ * paints its own background, which may be the opposite tone to the header.
54641
+ */
54642
+ const createLogoRow = (surface) => link$1({
54405
54643
  href: "/",
54406
54644
  className: bindProp("$root.theme.header.logo", {
54407
54645
  transforms: pipe(tx("layout.headerLogoClass")),
54408
54646
  fallback: "header-logo rb-flex rb-min-w-0 rb-items-center rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80"
54409
54647
  })
54410
- }, [
54411
- media({ className: bindProp("$root.theme.header.logo", {
54412
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
54413
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
54414
- }) }, when("content.logo"), bind("content.logo")),
54415
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
54416
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
54417
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
54418
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
54419
- text({
54420
- as: "strong",
54421
- className: "header-logo-text rb-truncate"
54422
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
54423
- ]);
54648
+ }, [media({ className: bindProp("$root.theme.header.logo", {
54649
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
54650
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
54651
+ }) }, when("content.logo"), bindChromeLogo(surface)), text({
54652
+ as: "strong",
54653
+ className: "header-logo-text rb-truncate"
54654
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
54655
+ const logoRow = createLogoRow("header-root");
54424
54656
  const centeredLogoRow = link$1({
54425
54657
  href: "/",
54426
54658
  className: bindProp("$root.theme.header.logo", {
54427
54659
  transforms: pipe(tx("layout.headerLogoClass", { base: "header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80" })),
54428
54660
  fallback: "header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80"
54429
54661
  })
54430
- }, [
54431
- media({ className: bindProp("$root.theme.header.logo", {
54432
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
54433
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
54434
- }) }, when("content.logo"), bind("content.logo")),
54435
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
54436
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
54437
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
54438
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
54439
- text({
54440
- as: "strong",
54441
- className: "header-logo-text"
54442
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
54443
- ]);
54662
+ }, [media({ className: bindProp("$root.theme.header.logo", {
54663
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
54664
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
54665
+ }) }, when("content.logo"), bindChromeLogo("header-root")), text({
54666
+ as: "strong",
54667
+ className: "header-logo-text"
54668
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
54444
54669
  const createNavRow = (className, align = "end") => navRow({
54445
54670
  className: `${className} header-nav-row`,
54446
54671
  align,
@@ -54480,10 +54705,8 @@ const mobileToggleIcon = stack({
54480
54705
  }
54481
54706
  ]);
54482
54707
  const mobileToggleButton = {
54483
- type: "button",
54708
+ type: "headerControl",
54484
54709
  props: {
54485
- type: "button",
54486
- variantId: "",
54487
54710
  className: `nav-mobile-toggle ${mobileOnlyDisplay("inline-flex")} rb-h-10 rb-w-10 rb-items-center rb-justify-center rb-rounded-md transition-theme-standard`,
54488
54711
  "aria-label": "Open menu",
54489
54712
  "aria-expanded": "false",
@@ -54493,10 +54716,8 @@ const mobileToggleButton = {
54493
54716
  children: [mobileToggleIcon]
54494
54717
  };
54495
54718
  const mobileOverlayToggleButton = {
54496
- type: "button",
54719
+ type: "headerControl",
54497
54720
  props: {
54498
- type: "button",
54499
- variantId: "",
54500
54721
  className: "nav-mobile-toggle rb-inline-flex rb-h-10 rb-w-10 rb-items-center rb-justify-center rb-rounded-md transition-theme-standard",
54501
54722
  "aria-label": "Open menu",
54502
54723
  "aria-expanded": "false",
@@ -54520,7 +54741,7 @@ const mobileOverlayHeader = inline({
54520
54741
  align: "center",
54521
54742
  justify: "between",
54522
54743
  style: borderColorStyle("border")
54523
- }, [logoRow, mobileOverlayToggleButton]);
54744
+ }, [createLogoRow("header-mobile-panel"), mobileOverlayToggleButton]);
54524
54745
  const mobileOverlayBody = stack({
54525
54746
  className: "rb-flex-1 rb-px-6 rb-py-6",
54526
54747
  gap: "md",
@@ -54712,7 +54933,10 @@ const brandLogo = link$1({
54712
54933
  options: { base: "rb-h-10 rb-w-auto" }
54713
54934
  }],
54714
54935
  fallback: "rb-h-10 rb-w-auto"
54715
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
54936
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
54937
+ id: "layout.chromeLogo",
54938
+ options: { surface: "footer-root" }
54939
+ }] })), text({
54716
54940
  as: "strong",
54717
54941
  className: "footer-logo-text rb-nav-text"
54718
54942
  }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
@@ -62641,6 +62865,7 @@ function blockSessionProps(dataContext) {
62641
62865
  supabaseUrl: dataContext?.supabaseUrl,
62642
62866
  portalToken: dataContext?.portalToken ?? null,
62643
62867
  previewToken: dataContext?.previewToken ?? null,
62868
+ readAuthority: dataContext?.readAuthority,
62644
62869
  stage: dataContext?.previewStage
62645
62870
  };
62646
62871
  }
@@ -65770,6 +65995,12 @@ function generateRecommendedThemes(input, opts) {
65770
65995
 
65771
65996
  //#endregion
65772
65997
  //#region ../theme-core/src/inputs/core.ts
65998
+ /**
65999
+ * Core Input CSS Generator
66000
+ *
66001
+ * Pure functions for generating form input CSS without requiring the full Theme type.
66002
+ * Used by both the full CMS theme system and the SDK theme bridge.
66003
+ */
65773
66004
  const CORNER_RADIUS_MAP$1 = {
65774
66005
  square: "0",
65775
66006
  soft: "0.25rem",
@@ -65804,7 +66035,7 @@ function generateInputCoreCss(scopeId, settings) {
65804
66035
  const borderRadius = CORNER_RADIUS_MAP$1[settings.corners];
65805
66036
  const cssBlocks = [];
65806
66037
  cssBlocks.push(`${root} .form-label {
65807
- color: rgb(var(--tb-${settings.labelToken}));
66038
+ color: ${textColorValue(settings.labelToken)};
65808
66039
  font-weight: 600;
65809
66040
  font-size: 0.875rem;
65810
66041
  display: block;
@@ -68063,6 +68294,12 @@ const containerResponsiveThemeCss = `/*
68063
68294
  :where(.theme-scope) .rb-prose p {
68064
68295
  margin: var(--rt-space-y) 0;
68065
68296
  }
68297
+ :where(.theme-scope) .rb-prose li > p:first-child {
68298
+ margin-top: 0;
68299
+ }
68300
+ :where(.theme-scope) .rb-prose li > p:last-child {
68301
+ margin-bottom: 0;
68302
+ }
68066
68303
  :where(.theme-scope) .rb-prose img {
68067
68304
  display: block;
68068
68305
  max-width: 100%;
@@ -95790,6 +96027,7 @@ function emptyPulledContent(overrides) {
95790
96027
  homepageId: null,
95791
96028
  seoDefaults: null,
95792
96029
  logoIdentifier: null,
96030
+ logoDarkBackgroundIdentifier: null,
95793
96031
  faviconIdentifier: null
95794
96032
  },
95795
96033
  forms: [],
@@ -101567,7 +101805,7 @@ async function loadConfig(configPath, output) {
101567
101805
  return { errorMessage: "No config path provided." };
101568
101806
  }
101569
101807
  try {
101570
- const { loadConfigFile: loadConfigFile$1 } = await import("../load-config-Ca13nCpT.mjs");
101808
+ const { loadConfigFile: loadConfigFile$1 } = await import("../load-config-CKBdp8M0.mjs");
101571
101809
  const rawConfig = await loadConfigFile$1(configPath);
101572
101810
  const parsed = riverbankSiteConfigSchema.safeParse(rawConfig);
101573
101811
  if (!parsed.success) {
@@ -116027,6 +116265,13 @@ function applyBookingSettingsSectionUpdate(settings, update) {
116027
116265
  function applyBookingSettingsSectionUpdates(settings, updates) {
116028
116266
  return updates.reduce(applyBookingSettingsSectionUpdate, settings);
116029
116267
  }
116268
+ /** Normalize optional wire defaults once before projecting operational Event policy. */
116269
+ function resolveBookingSettingsEventCatalogue(settings) {
116270
+ return resolveEventCatalogue({
116271
+ verticalConfig: settings.verticalConfig,
116272
+ eventTypePresets: settings.eventTypePresets ?? DEFAULT_EVENT_TYPE_PRESETS
116273
+ });
116274
+ }
116030
116275
 
116031
116276
  //#endregion
116032
116277
  //#region ../api/src/bookingPaymentTermSchemas.ts
@@ -116652,16 +116897,12 @@ async function deleteRedirectRule(apiClient, { siteId, ruleId, options }) {
116652
116897
 
116653
116898
  //#endregion
116654
116899
  //#region ../api/src/billing.ts
116655
- async function changePlan(apiClient, { attemptId, planId, interval, prorationBehavior, options }) {
116900
+ async function changePlan(apiClient, request) {
116901
+ const { options, ...body } = request;
116656
116902
  try {
116657
116903
  return unwrapResponse(await apiClient({
116658
116904
  endpoint: "changePlan",
116659
- body: {
116660
- attemptId,
116661
- planId,
116662
- interval,
116663
- prorationBehavior
116664
- },
116905
+ body,
116665
116906
  options
116666
116907
  }));
116667
116908
  } catch (error$1) {