riverbankcms 0.25.0 → 0.27.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 createFormRef, $n as deriveVideoSlotPolicy, $r as resolveTokenOrCssColorValue, An as deleteEnvSpecificKeys, Ar as makeBoundaryId, At as generateHeaderScrollTreatmentStyles, Bn as isSiteScopedDirectImageStoragePath, Br as surfaceDecorationColors, Bt as getComponentBorderWidthPx, C as sortRecord, Cn as boxBackgroundSchema, Cr as defineFrameCapability, Ct as deriveSiteStyleBlockPolicy, D as mapEventCommandContent, Dn as collectPortableMediaReferencesFromContent, Dr as featureCardCompositionTreatmentValues, Dt as getGradientPreset, En as stripStaleTransitionStyleGroup, Er as eyebrowTreatmentValues, Et as gradientToCss, F as pageIdentifierForBlockCommand, Fn as parseAspectRatioValue, Fr as visibleHeadingDecorationFamilyValues, Ft as BREAKPOINT_MD, G as ianaTimezoneSchema, Gn as resolveManagedMediaReference, Gr as mergeStyles, Gt as themeButtonExtraClassesWithTrailingIcon, H as bookingPaymentTermsSchema, Hn as persistableMediaSchema, Hr as TokenResolver, Ht as ICON_CONFIG, I as pageIdentifierForCommand, In as resolveMediaTransformForAspect, Ir as parseResolvedSurface, It as BREAKPOINT_SM, J as createCommandRef, Jn as buildMediaIdentifierFromFilename, Jr as mapDrawingStyle, Jt as parseThemeForPersistence, K as createBlockRef, Kn as mediaTypeDiscriminants, Kr as rgbColorValue, Kt as themeButtonSizeClassName, L as pagePathForCommand, Ln as getDirectImageUrlForRelativePath, Lr as parseSurfaceTree, Lt as BREAKPOINT_XL, M as blockIdentifierForCommand, Mn as rotateNormalizedPoint, Mr as testimonialsCompositionTreatmentValues, Mt as getHeaderPaintTargets, N as blockOrderIdentifiersForCommand, Nn as normalizeWidthCandidates, Nr as tileTreatmentValues, Nt as renderHeaderPaintTargetRules, On as summarizePortableMediaReferences, Or as headingDecorationColorTokenValues, Ot as parseGradientPresetId, P as entryIdentifierForCommand, Pn as isExplicitRectCrop, Pr as toNonEmptyReadonlyArray, Pt as BREAKPOINT_LG, Q as createFooterRef, Qr as resolveThemeColorReferenceValue, Qt as normalizeCardRole, R as hasConfiguredBookingVertical, Rn as getDirectImageUrlForSiteScopedPath, Rr as resolveSurface, Rt as MQ_MD_DOWN, S as venueManagementFields, Sn as boxBackgroundOverlaySchema, Sr as defineBlockDesignCapability, St as resolvePublishedLook, Tn as siteChromeBackgroundOverrideOwner, Tr as eventListTreatmentValues, Tt as compiledRuntimeStyleFieldNames, U as require_jsx_runtime, Un as runtimeMediaSchema, Ur as backgroundColorStyle, Ut as generateDefaultButtonSystem, V as bookingPaymentCollectionOptionSchema, Vn as mediaSchema, Vr as resolveSurfaceForeground, Vt as getComponentShadowVar, W as require_react, Wn as buildRenderableMediaAssetIndex, Wr as borderColorStyle, Wt as parseThemeButtonVariantId, X as createEventCategoryRef, Xn as parseMediaIdentifier, Xr as isCssColorLiteral, Xt as cardRoleSchema, Y as createContentEntryRef, Yn as parseCanonicalMediaIdentifier, Yr as opaqueSurfaceDeclarations, Yt as renderCssDeclarations, Z as createEventSeriesRef, Zr as resolveOnColorForThemeToken, Zt as cardVariantRoleValues, _n as heroPhotoPaintsGround, _r as asDesignBlockId, _t as resolveLookSlotSurfaces, ai as surfaceForegroundInputFromResolved, ar as parseRelativeStoragePath, b as isEventVisibility, bn as resolveSectionPhotoPlacement, br as asSiteStyleId, bt as resolveEffectiveArrangement, c as customLinkSchema$1, ci as expandPalette, cn as generateNavLinkCSS, cr as classifyKnownMimeType, ct as headerLeafTextColor, d as internalLinkSchema, di as parseBlockColorToken, dr as defineBlockDesignMetadata, ei as PUBLIC_BUTTON_ROLES, er as resolveVideoSelectionIntentForMediaField, et as createNavigationRef, f as internalResolvedLinkSchema, fi as __commonJSMin, fn as headerRootPaint, fr as resolveEffectiveKnobs, ft as mergeHeaderNavTypographyPreference, g as linkSchema, gn as deriveSectionGround, gt as resolveItemSurface, h as isResolvedInternalLinkEntityType, hn as sectionFactsForContent, hr as arrangementModes, ht as arrangementSlotNames, ii as surfaceForegroundDeclarations, it as refSlug, j as eventManagementTiming, jn as looksLikeUuid, jr as offeringsPreviewCompositionTreatmentValues, jt as generateMobileOverlayBackdropFilterFix, kn as walkAndCollectImageAttrs, kr as introCompositionTreatmentValues, kt as themeSchema, l as entryLinkSchema$1, li as getTextColorForBackground, lr as managementMediaLibraryUploadLimitForMimeType, lt as transparentHeaderForegroundInput, mn as composeBoundary, mr as cardListKnobBlocks, mt as arrangementLookHooks, ni as surfaceToneFromForegroundToken, nr as getMimeType, o as classifySdkEventBookingOffer, oi as surfaceForegroundStyle, on as footerForegroundCandidates, or as FILE_SIZE_LIMITS, ot as effectiveHeaderNavLinkStyle, p as internalRouteOnlyLinkSchema, pi as __toESM, pn as boundaryLayout, pr as cardListFamilyBlocks, pt as readHeaderNavFontSizePreference, q as createBlocksRef, qn as mediaIdentifierSchema, qr as textColorStyle, qt as themeButtonVariantClassNames, ri as defaultThemeTokens, rr as asRecord, rt as createVenueRef, s as RESOLVED_INTERNAL_LINK_ENTITY_TYPES, si as surfaceForegroundValue, sn as buildTextContrastShadow, st as headerForegroundCandidates, t as classifySdkEventTiming, ti as selectLogoVariant, tt as createPageRef, u as externalLinkSchema$1, ui as parseThemeColorToken, ur as parseSafeDownloadFilename, ut as readOpeningForegroundProjection, v as pageLinkSchema$1, vn as parseCanonicalRuntimeBackground, vr as asLayoutVariantKey, vt as arrangementManifestFromVariants, w as stableStringify, wn as runtimeBoxBackgroundSchema, wr as defineNoBlockDesignCapability, wt as requireCuratedSiteStyle, xn as sectionForegroundBackground, xr as assertNever$10, xt as resolveModeArrangement, yn as resolveSectionBackground, yt as readStoredMode, z as eventCommandScheduleSchema, zn as getImageUrl, zr as serializeSurfaceTree, zt as headerVariantValues } from "../sdk-event-upsert-4t4e1z-h.mjs";
3
- import { $ as mapDrawingSchema, $n as ok, $t as isNonNegativeWholeCents$1, A as assessMailingListTargeting, At as addIntervalPreservingMonthAnchor, Bt as parseEventPageSurfaceSubject, C as exposeSecret, Ct as toScheduledBookingDateTime, D as parseMailingListContentVersionId, Dt as isLiveOrderInstalmentPlanStatus, E as parseMailingListBlockId, En as unsafeAsCheckoutLineId, Et as validateBookingPaymentOptionKinds, F as parseMailingListPlacementTargeting, Fn as unsafeAsMediaAssetId, Ft as omitZeroAmountFutureRows, G as locationMapLinks, Gt as publicEventPricingDisplay, H as assertAllowedPublicUrl, Ht as formatEventPricing, I as DEFAULT_MAILING_LIST_TARGETING, In as unsafeAsOccurrenceId, It as splitAmountWithRemainderInFirst, J as parseLocationValue, Jt as resolveExactOrFreePriceDisplay, K as locationValueSchema, Kt as publicEventPricingOptions, L as planMailingListChoicePresentation, Lt as resolveFlexibleBalanceDueAt, M as parseMailingListProviderScope, Mt as getBookingInstalmentDepositRefundability, N as parseFooterCompositionV1, Nt as getBookingInstalmentPlanIntervalCount, O as parseMailingListSignedSourceToken, On as unsafeAsDemoCapability, Ot as isSettleableFlexibleBalanceContractStatus, Pt as getBookingInstalmentProtectedDepositAmountCents, Qn as err, Qt as mapReadonlyNonEmptyArray, R as isCanonicalRichTextDoc, Rn as unsafeAsPassId, Rt as resolveFlexibleBalanceInitialPaymentCents, S as createSecret, Sn as parseUserId, St as toBookingTimeZone, T as slugify, U as decideLocationSave, Ut as isPublicEventPricingOptionDisplayable, V as parseWeeklyOpeningHours, Vn as unsafeAsPricingOptionId, Vt as formatBookingPriceDisplay, Wt as publicEventPricingCurrency, X as publicLocationSchema$1, Xt as fromArray, Y as projectPublicLocation, Yt as resolvePricingOptionsPriceDisplay, Z as toLocationCoordinates, _ as CANCELLED_SESSION_STATUS, _n as parseMembershipId, _t as parseBookingLocalDate, a as NAVIGATION_LOCATIONS, an as unsafeAsPositiveCents, at as formatTime$1, b as resolveWholeSeriesBookingPhase, bn as parseSiteId, bt as resolveBookingBusinessTimeZone, cn as assertNever, ct as resolveBookingDisplayContext, dn as parseCustomerId, dt as formatLocalScheduleDate, en as parseNonNegativeCents, et as selectCategoryView, f as EVENT_PRESET_VALUES, fn as parseDatedOfferingCapacityHoldAuditRef, ft as formatLocalScheduleTime, h as WHOLE_SERIES_EVENT_PRESET_VALUES, hn as parseEventSeriesId, ht as getLocalScheduleTime, i as EVENT_PRESET_VOCABULARY, in as unsafeAsNonNegativeCents, it as formatDateTimeRange, j as DEFAULT_MAILING_LIST_SUCCESS_MESSAGE, jn as unsafeAsEventInstanceId, jt as clampConfiguredAmount, k as parseMailingListRuntimeContext, kt as isSettleableOrderInstalmentPlanStatus, ln as formatDurationUnitLabel, lt as buildBookingUtcDateWindow, m as SURFACE_EVENT_PRESET_VALUES, mt as getLocalScheduleDate, nn as toCents, nt as formatDateRange, on as formatCurrencyAmount, ot as formatTimeRange, pn as parseDatedOfferingCapacityHoldId, pt as getBookingLocalDateKey, q as normalizeLocationAddressText, qt as publicEventPricingType, rn as toNonNegativeCents, rt as formatDateTime, sn as parseCurrencyCode, st as inferSiteDateLocale, tn as parsePositiveCents, tt as formatDate, u as resolveSiteVerticalBookingConfig, un as parseApiKeyId, ut as compareLocalScheduleDates, v as nextLiveRunSessionStartMs, vt as parseLocalScheduleTime, w as parseManagementKey, wt as toUtcIsoDateTimeString, x as resolveWholeSeriesRunLifecycle, xn as parseSiteTermsVersionId, xt as resolveBookingTimeZoneId, y as orderedLiveRunSessions, yn as parseRetiredCourseId, yt as parseUtcIsoDateTimeString, z as formatOpeningHoursRows, zn as unsafeAsPositiveByteCount, zt as deriveTotalTicketQuantity } from "../src-LhtqTjH7.mjs";
4
- import { $ as normalizeMediaValueToIdentifierOnly, $t as createCommandContext, A as formatDiffDetail, An as getEnvPrefix, At as navigationIdentity, B as buildFieldChanges, Bn as portablePageDesignSchema, Bt as preparePushConfigTarget, C as reportFromOutcomes, Cn as requireEnvironmentWriteAuthorization, Ct as fileExists, D as normalizeRemoteHomepageReference, Dn as transportSuggestion, Dt as writeJsonFileAtomic, E as createEmptySyncResult, En as formatError, Et as writeJsonFile, F as calculatePullDiff, Fn as createManagementClient, Ft as navigationCommandItemToManagementInput, G as syncLocalMediaForPull, Gt as APPOINTMENT_SERVICE_VISIBILITY_VALUES, H as formatFieldPath, Hn as API_ENDPOINTS, Ht as extractApiErrorMessage, I as buildJsonDiff, In as ManagementApiError, It as normalizeNavigationConfigItemForCommand, J as admitBinaryWriteDestination, Jt as deriveCmsApiUrlFromDashboardUrl, K as applyLocalMediaPush, Kt as ApiRequestError, L as hasPageOperations, Ln as sdkEventScheduleSchema, Lt as applyPushConfigPlan, M as hasPendingChanges, Mn as isLocalConfigured, Mt as convertPulledFooterToLocal, N as findChangedFieldsWithValues, Nn as isRemoteConfigured, Nt as convertPulledNavigationToLocal, O as calculateDiff, On as CliExit, Ot as isMediaValue, P as formatHumanDiff, Pn as loadSdkEnvironment, Pt as convertPulledPagesToLocal, Q as normalizeMediaIdentifierInput, Qt as createClientForEnv, R as pageMetadataForUpsert, Rn as sdkSettingsUpdateSchema, Rt as createPushConfigCommand, S as planCliCommandBatchForBindings, Sn as planEnvironmentWriteAuthorization, St as ensureDir, T as executeResidualSettingsSyncPlan, Tn as ErrorCodes, Tt as readJsonFile, U as revalidateLocalMediaPushPlan, Un as ApiEnvelopeError, Ut as normalizeApiError, V as formatFieldChange, Vn as sdkConfiguredBookingVerticalConfigSchema, Vt as revalidatePushConfigPlan, Wn as unwrapResponse, Wt as isRecord$2, X as writeBinaryFileAtomic, Xt as bindRequestTimeout, Y as readStableBinaryFile, Yt as mapEnvironmentExecutionOutcomesJson, Z as sha256, Zt as confirmAction, _ as commandExecutionToReport, _n as withErrorHandling, _t as metadataFilePath, a as executeEntryCommandPlanAsReport, an as getOutputContext, at as readEntries, b as executeCompiledCliCommandPlanAsReport, bn as parseEnvironmentSelection, bt as writeMetadataFile, c as titleFromEntryData, cn as managementClientConfigFor, ct as readEventsMeta, d as unsafeAsCliEntryIdentifier, dn as parseJsonData, dt as readNavigationMeta, en as createGetCommand, et as walkLocalContentMedia, f as unsafeAsCliFormSlug, fn as parsePaginationOptions, ft as readPagesMeta, g as commandCompileFailureToReport, gn as withConfirmation, gt as ensureMetadataDir, h as mutationCounterForEffect, hn as withCommandContext, ht as writeMediaManifest, i as entrySiteCommandTypes, in as formatDateShort, it as findLegacyEntryFiles, j as formatDiffSummary, jn as getEnvironmentDebugInfo, jt as navigationIdentityMap, k as calculateFooterDiff, kt as duplicateNavigationIdentityMessage, l as unsafeAsCliBlockIdentifier, ln as mapEntryForOutput, lt as readFooterMeta, m as commandReportToSyncResult, mn as runWithInvocation, mt as readVenuesMeta, n as entryCommandCompileErrorToReport, nn as createOutputForCommand, nt as downloadMedia, o as executeEntryCommandPlanAsSyncResult, on as getOutputOnlyContext, ot as readAllMeta, p as unsafeAsCliPageIdentifier, pn as resolveCommandPath, pt as readSettingsMeta, q as prepareLocalMediaForPush, qt as createBearerAPIClient, r as entryCommandReportToSyncResult, rn as currentInvocationEnvelope, rt as extractMediaIdentifiers, s as syncResultForEntryCommandCompileError, sn as handleCommandError, st as readEventCategoriesMeta, t as compileEntryPushCommands, tn as createListCommand, tt as buildStorageUrl, u as unsafeAsCliContentTypeKey, un as parseJsonArray, ut as readFormsMeta, v as commandReportHasFailures, vn as withOutputOnlyErrorHandling, vt as metadataTargetFromEnvironment, w as mergeManySyncResults, wn as withRiverbankEnv, wt as listFiles, x as formatManagementError, xn as planEnvironmentExecution, xt as writeMetadataRecordMap, y as executeCliCommandPlan, yn as executeEnvironmentPlan, yt as readMetadataFile, zn as linkPayloadSchema, zt as loadPushConfigTarget } from "../entryCommands-nATGxgma.mjs";
5
- import { r as CLI_VERSION, t as loadConfigFile } from "../load-config-DwiS-Ibn.mjs";
6
- import { a as RichTextDocSchema, c as isRecord$18, i as findUnfilledSentinels, n as buildEntryScaffold, o as isRichTextDoc, r as validateEntryInstance, s as isObjectRecord, t as eventUpsertInputSchema } from "../eventUpsertInputSchema-XRzH6yFb.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-ChNV88KF.mjs";
2
+ import { $ as createFooterRef, $n as parseCanonicalMediaIdentifier, $r as textColorStyle, $t as cardVariantRoleValues, An as stripStaleTransitionStyleGroup, Ar as eyebrowTreatmentValues, At as parseGradientPresetId, B as eventCommandScheduleSchema, Bn as resolveMediaTransformForAspect, Br as parseResolvedSurface, Bt as MQ_MD_DOWN, C as sortRecord, Cn as resolveCompiledSectionContextFromContent, Ct as resolveModeArrangement, D as resolveEventSeriesWaitlistMapping, Dn as boxBackgroundSchema, Dr as defineFrameCapability, Dt as compiledRuntimeStyleFieldNames, En as boxBackgroundOverlaySchema, Er as defineBlockDesignCapability, Et as requireCuratedSiteStyle, F as entryIdentifierForCommand, Fn as looksLikeUuid, Fr as offeringsPreviewCompositionTreatmentValues, Ft as renderHeaderPaintTargetRules, G as require_react, Gn as mediaSchema, Gr as isCssColorLiteral, Gt as generateDefaultButtonSystem, H as bookingPaymentCollectionOptionSchema, Hn as getDirectImageUrlForSiteScopedPath, Hr as resolveSurface, Ht as getComponentBorderWidthPx, I as pageIdentifierForBlockCommand, In as rotateNormalizedPoint, Ir as testimonialsCompositionTreatmentValues, It as BREAKPOINT_LG, J as createBlocksRef, Jn as buildRenderableMediaAssetIndex, Jr as resolveTokenOrCssColorValue, Jt as themeButtonSizeClassName, K as ianaTimezoneSchema, Kn as persistableMediaSchema, Kr as resolveOnColorForThemeToken, Kt as parseThemeButtonVariantId, L as pageIdentifierForCommand, Ln as normalizeWidthCandidates, Lr as tileTreatmentValues, Lt as BREAKPOINT_MD, M as eventManagementTiming, Mn as summarizePortableMediaReferences, Mr as headingDecorationColorTokenValues, Mt as generateHeaderScrollTreatmentStyles, N as blockIdentifierForCommand, Nn as walkAndCollectImageAttrs, Nr as introCompositionTreatmentValues, Nt as generateMobileOverlayBackdropFilterFix, O as mapEventCommandContent, On as runtimeBoxBackgroundSchema, Or as defineNoBlockDesignCapability, Ot as gradientToCss, P as blockOrderIdentifiersForCommand, Pn as deleteEnvSpecificKeys, Pr as makeBoundaryId, Pt as getHeaderPaintTargets, Q as createEventSeriesRef, Qn as buildMediaIdentifierFromFilename, Qr as rgbColorValue, Qt as cardRoleSchema, R as pagePathForCommand, Rn as isExplicitRectCrop, Rr as toNonEmptyReadonlyArray, Rt as BREAKPOINT_SM, S as venueManagementFields, Sn as parseCanonicalRuntimeBackground, Sr as asLayoutVariantKey, St as resolveEffectiveArrangement, Tn as sectionForegroundBackground, Tr as assertNever$10, Tt as deriveSiteStyleBlockPolicy, U as bookingPaymentTermsSchema, Un as getImageUrl, Ur as serializeSurfaceTree, Ut as getComponentShadowVar, Vn as getDirectImageUrlForRelativePath, Vr as parseSurfaceTree, Vt as headerVariantValues, W as require_jsx_runtime, Wn as isSiteScopedDirectImageStoragePath, Wr as surfaceDecorationColors, Wt as ICON_CONFIG, X as createContentEntryRef, Xn as mediaTypeDiscriminants, Xr as borderColorStyle, Xt as parseThemeForPersistence, Y as createCommandRef, Yn as resolveManagedMediaReference, Yr as backgroundColorStyle, Yt as themeButtonVariantClassNames, Z as createEventCategoryRef, Zn as mediaIdentifierSchema, Zr as mergeStyles, Zt as renderCssDeclarations, _i as parseThemeColorToken, _n as composeBoundary, _r as cardListFamilyBlocks, _t as arrangementSlotNames, ai as surfaceInkPublication, at as refSlug, b as isEventVisibility, bi as __toESM, bn as deriveSectionGround, bt as arrangementManifestFromVariants, c as customLinkSchema$1, ci as TokenResolver, cn as footerForegroundCandidates, ct as headerForegroundCandidates, d as internalLinkSchema, di as surfaceForegroundInputFromResolved, dt as readOpeningForegroundProjection, ei as mapDrawingStyle, en as normalizeCardRole, er as parseMediaIdentifier, et as createFormRef, f as internalResolvedLinkSchema, fi as surfaceForegroundStyle, fr as classifyKnownMimeType, ft as readOpeningToneProjection, g as linkSchema, gi as PUBLIC_BUTTON_ROLES, gn as boundaryLayout, gr as resolveEffectiveKnobs, gt as arrangementLookHooks, h as isResolvedInternalLinkEntityType, hi as surfaceInkStyle, hn as headerRootPaint, hr as defineBlockDesignMetadata, ht as readHeaderNavFontSizePreference, i as sdkEventUpsertOptionalFieldSchemas, ii as resolveSurfaceForeground, ir as resolveVideoSelectionIntentForMediaField, it as createVenueRef, jn as collectPortableMediaReferencesFromContent, jr as featureCardCompositionTreatmentValues, jt as themeSchema, kn as siteChromeBackgroundOverrideOwner, kr as eventListTreatmentValues, kt as getGradientPreset, l as entryLinkSchema$1, li as defaultThemeTokens, ln as buildTextContrastShadow, lr as parseRelativeStoragePath, lt as headerLeafTextColor, mi as surfaceInkDeclarations, mn as headerNeedsPhotoShade, mr as parseSafeDownloadFilename, mt as mergeHeaderNavTypographyPreference, ni as selectLogoVariant, nt as createPageRef, o as classifySdkEventBookingOffer, oi as expandPalette, or as getMimeType, p as internalRouteOnlyLinkSchema, pi as surfaceForegroundValue, pr as managementMediaLibraryUploadLimitForMimeType, q as createBlockRef, qn as runtimeMediaSchema, qr as resolveThemeColorReferenceValue, qt as themeButtonExtraClassesWithTrailingIcon, ri as surfaceToneFromForegroundToken, rr as deriveVideoSlotPolicy, s as RESOLVED_INTERNAL_LINK_ENTITY_TYPES, si as getTextColorForBackground, sr as asRecord, st as effectiveHeaderNavLinkStyle, t as classifySdkEventTiming, ti as opaqueSurfaceDeclarations, tt as createNavigationRef, u as externalLinkSchema$1, ui as surfaceForegroundDeclarations, un as generateNavLinkCSS, ur as FILE_SIZE_LIMITS, ut as transparentHeaderForegroundInput, v as pageLinkSchema$1, vi as parseBlockColorToken, vn as sectionFactsForContent, vr as cardListKnobBlocks, vt as resolveItemSurface, w as stableStringify, wn as resolveSectionBackground, wr as asSiteStyleId, wt as resolvePublishedLook, xn as heroPhotoPaintsGround, xr as asDesignBlockId, xt as readStoredMode, yi as __commonJSMin, yn as applyLookPhotoTreatment, yr as arrangementModes, yt as resolveLookSlotSurfaces, z as hasConfiguredBookingVertical, zn as parseAspectRatioValue, zr as visibleHeadingDecorationFamilyValues, zt as BREAKPOINT_XL } from "../sdk-event-upsert-CnvVuQJy.mjs";
3
+ import { $n as err, $t as mapReadonlyNonEmptyArray, A as parseMailingListRuntimeContext, At as isSettleableOrderInstalmentPlanStatus, B as formatOpeningHoursRows, Bn as unsafeAsPositiveByteCount, Bt as deriveTotalTicketQuantity, C as createSecret, Cn as parseUserId, Ct as toBookingTimeZone, D as parseMailingListBlockId, Dn as unsafeAsCheckoutLineId, Dt as validateBookingPaymentOptionKinds, E as slugify, Ft as getBookingInstalmentProtectedDepositAmountCents, Gt as publicEventPricingCurrency, H as parseWeeklyOpeningHours, Hn as unsafeAsPricingOptionId, Ht as formatBookingPriceDisplay, I as parseMailingListPlacementTargeting, In as unsafeAsMediaAssetId, It as omitZeroAmountFutureRows, J as normalizeLocationAddressText, Jt as publicEventPricingType, K as locationMapLinks, Kt as publicEventPricingDisplay, L as DEFAULT_MAILING_LIST_TARGETING, Ln as unsafeAsOccurrenceId, Lt as splitAmountWithRemainderInFirst, M as DEFAULT_MAILING_LIST_SUCCESS_MESSAGE, Mn as unsafeAsEventInstanceId, Mt as clampConfiguredAmount, N as parseMailingListProviderScope, Nt as getBookingInstalmentDepositRefundability, O as parseMailingListContentVersionId, Ot as isLiveOrderInstalmentPlanStatus, P as parseFooterCompositionV1, Pt as getBookingInstalmentPlanIntervalCount, Q as toLocationCoordinates, R as planMailingListChoicePresentation, Rt as resolveFlexibleBalanceDueAt, S as resolveWholeSeriesRunLifecycle, Sn as parseSiteTermsVersionId, St as resolveBookingTimeZoneId, T as parseManagementKey, Tt as toUtcIsoDateTimeString, U as assertAllowedPublicUrl, Ut as formatEventPricing, Vt as parseEventPageSurfaceSubject, W as decideLocationSave, Wt as isPublicEventPricingOptionDisplayable, X as projectPublicLocation, Xt as resolvePricingOptionsPriceDisplay, Y as parseLocationValue, Yt as resolveExactOrFreePriceDisplay, Z as publicLocationSchema$1, Zt as fromArray, a as NAVIGATION_LOCATIONS, an as unsafeAsNonNegativeCents, at as formatDateTimeRange, b as orderedLiveRunSessions, bn as parseRetiredCourseId, bt as parseUtcIsoDateTimeString, cn as parseCurrencyCode, ct as inferSiteDateLocale, dn as parseApiKeyId, dt as compareLocalScheduleDates, en as isNonNegativeWholeCents$1, er as ok, et as mapDrawingSchema, f as EVENT_PRESET_VALUES, fn as parseCustomerId, ft as formatLocalScheduleDate, gn as parseEventSeriesId, gt as getLocalScheduleTime, h as WHOLE_SERIES_EVENT_PRESET_VALUES, ht as getLocalScheduleDate, i as EVENT_PRESET_VOCABULARY, in as toNonNegativeCents, it as formatDateTime, j as assessMailingListTargeting, jt as addIntervalPreservingMonthAnchor, k as parseMailingListSignedSourceToken, kn as unsafeAsDemoCapability, kt as isSettleableFlexibleBalanceContractStatus, ln as assertNever, lt as resolveBookingDisplayContext, m as SURFACE_EVENT_PRESET_VALUES, mn as parseDatedOfferingCapacityHoldId, mt as getBookingLocalDateKey, nn as parsePositiveCents, nt as formatDate, on as unsafeAsPositiveCents, ot as formatTime$1, pn as parseDatedOfferingCapacityHoldAuditRef, pt as formatLocalScheduleTime, q as locationValueSchema, qt as publicEventPricingOptions, rn as toCents, rt as formatDateRange, sn as formatCurrencyAmount, st as formatTimeRange, tn as parseNonNegativeCents, tr as blockInteractionContextSchema, tt as selectCategoryView, u as resolveSiteVerticalBookingConfig, un as formatDurationUnitLabel, ut as buildBookingUtcDateWindow, v as CANCELLED_SESSION_STATUS, vn as parseMembershipId, vt as parseBookingLocalDate, w as exposeSecret, wt as toScheduledBookingDateTime, x as resolveWholeSeriesBookingPhase, xn as parseSiteId, xt as resolveBookingBusinessTimeZone, y as nextLiveRunSessionStartMs, yt as parseLocalScheduleTime, z as isCanonicalRichTextDoc, zn as unsafeAsPassId, zt as resolveFlexibleBalanceInitialPaymentCents } from "../src-DqoU7zKs.mjs";
4
+ import { $ as normalizeMediaValueToIdentifierOnly, $t as createCommandContext, A as formatDiffDetail, An as getEnvPrefix, At as navigationIdentity, B as buildFieldChanges, Bn as portablePageDesignSchema, Bt as preparePushConfigTarget, C as reportFromOutcomes, Cn as requireEnvironmentWriteAuthorization, Ct as fileExists, D as normalizeRemoteHomepageReference, Dn as transportSuggestion, Dt as writeJsonFileAtomic, E as createEmptySyncResult, En as formatError, Et as writeJsonFile, F as calculatePullDiff, Fn as createManagementClient, Ft as navigationCommandItemToManagementInput, G as syncLocalMediaForPull, Gt as APPOINTMENT_SERVICE_VISIBILITY_VALUES, H as formatFieldPath, Hn as API_ENDPOINTS, Ht as extractApiErrorMessage, I as buildJsonDiff, In as ManagementApiError, It as normalizeNavigationConfigItemForCommand, J as admitBinaryWriteDestination, Jt as ApiRequestError, K as applyLocalMediaPush, Kt as createBearerAPIClient, L as hasPageOperations, Ln as sdkEventScheduleSchema, Lt as applyPushConfigPlan, M as hasPendingChanges, Mn as isLocalConfigured, Mt as convertPulledFooterToLocal, N as findChangedFieldsWithValues, Nn as isRemoteConfigured, Nt as convertPulledNavigationToLocal, O as calculateDiff, On as CliExit, Ot as isMediaValue, P as formatHumanDiff, Pn as loadSdkEnvironment, Pt as convertPulledPagesToLocal, Q as normalizeMediaIdentifierInput, Qt as createClientForEnv, R as pageMetadataForUpsert, Rn as sdkSettingsUpdateSchema, Rt as createPushConfigCommand, S as planCliCommandBatchForBindings, Sn as planEnvironmentWriteAuthorization, St as ensureDir, T as executeResidualSettingsSyncPlan, Tn as ErrorCodes, Tt as readJsonFile, U as revalidateLocalMediaPushPlan, Un as ApiEnvelopeError, Ut as normalizeApiError, V as formatFieldChange, Vn as sdkConfiguredBookingVerticalConfigSchema, Vt as revalidatePushConfigPlan, Wn as unwrapResponse, Wt as isRecord$2, X as writeBinaryFileAtomic, Xt as bindRequestTimeout, Y as readStableBinaryFile, Yt as mapEnvironmentExecutionOutcomesJson, Z as sha256, Zt as confirmAction, _ as commandExecutionToReport, _n as withErrorHandling, _t as metadataFilePath, a as executeEntryCommandPlanAsReport, an as getOutputContext, at as readEntries, b as executeCompiledCliCommandPlanAsReport, bn as parseEnvironmentSelection, bt as writeMetadataFile, c as titleFromEntryData, cn as managementClientConfigFor, ct as readEventsMeta, d as unsafeAsCliEntryIdentifier, dn as parseJsonData, dt as readNavigationMeta, en as createGetCommand, et as walkLocalContentMedia, f as unsafeAsCliFormSlug, fn as parsePaginationOptions, ft as readPagesMeta, g as commandCompileFailureToReport, gn as withConfirmation, gt as ensureMetadataDir, h as mutationCounterForEffect, hn as withCommandContext, ht as writeMediaManifest, i as entrySiteCommandTypes, in as formatDateShort, it as findLegacyEntryFiles, j as formatDiffSummary, jn as getEnvironmentDebugInfo, jt as navigationIdentityMap, k as calculateFooterDiff, kt as duplicateNavigationIdentityMessage, l as unsafeAsCliBlockIdentifier, ln as mapEntryForOutput, lt as readFooterMeta, m as commandReportToSyncResult, mn as runWithInvocation, mt as readVenuesMeta, n as entryCommandCompileErrorToReport, nn as createOutputForCommand, nt as downloadMedia, o as executeEntryCommandPlanAsSyncResult, on as getOutputOnlyContext, ot as readAllMeta, p as unsafeAsCliPageIdentifier, pn as resolveCommandPath, pt as readSettingsMeta, q as prepareLocalMediaForPush, qt as deriveCmsApiUrlFromDashboardUrl, r as entryCommandReportToSyncResult, rn as currentInvocationEnvelope, rt as extractMediaIdentifiers, s as syncResultForEntryCommandCompileError, sn as handleCommandError, st as readEventCategoriesMeta, t as compileEntryPushCommands, tn as createListCommand, tt as buildStorageUrl, u as unsafeAsCliContentTypeKey, un as parseJsonArray, ut as readFormsMeta, v as commandReportHasFailures, vn as withOutputOnlyErrorHandling, vt as metadataTargetFromEnvironment, w as mergeManySyncResults, wn as withRiverbankEnv, wt as listFiles, x as formatManagementError, xn as planEnvironmentExecution, xt as writeMetadataRecordMap, y as executeCliCommandPlan, yn as executeEnvironmentPlan, yt as readMetadataFile, zn as linkPayloadSchema, zt as loadPushConfigTarget } from "../entryCommands-Dg5IT7Uv.mjs";
5
+ import { r as CLI_VERSION, t as loadConfigFile } from "../load-config-DsPKn5yN.mjs";
6
+ import { a as RichTextDocSchema, c as isRecord$18, i as findUnfilledSentinels, n as buildEntryScaffold, o as isRichTextDoc, r as validateEntryInstance, s as isObjectRecord, t as eventUpsertInputSchema } from "../eventUpsertInputSchema-D4xpVjUT.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-oltx4aO0.mjs";
8
8
  import { config } from "dotenv";
9
9
  import { Command, CommanderError } from "commander";
10
10
  import * as fs$2 from "fs/promises";
@@ -1277,6 +1277,9 @@ function parseLocalEventRun(raw, filePath) {
1277
1277
  assertLocalEventRunName(fields$1, identity.bookingScope, filePath);
1278
1278
  assertLocalEventRunRefs(fields$1, filePath);
1279
1279
  assertLocalEventRunVisibility(fields$1, filePath);
1280
+ if (!sdkEventUpsertOptionalFieldSchemas.waitlistMode.safeParse(fields$1.waitlistMode).success) {
1281
+ throw new InvalidLocalEventScheduleIdentityError(filePath, "waitlistMode must be inherit, off or on");
1282
+ }
1280
1283
  if ("categoryRef" in fields$1) {
1281
1284
  throw new InvalidLocalEventScheduleIdentityError(filePath, "Move categoryRef to the parent Event file");
1282
1285
  }
@@ -2191,6 +2194,7 @@ function mapEventRunToComparable(run) {
2191
2194
  authoredSchedule: run.authoredSchedule,
2192
2195
  occurrences: run.occurrences,
2193
2196
  capacity: run.capacity,
2197
+ waitlistMode: run.waitlistMode,
2194
2198
  bookingOffer: run.bookingOffer,
2195
2199
  venueRef: run.venueRef,
2196
2200
  formRef: run.formRef,
@@ -4090,6 +4094,7 @@ function normalizeRemoteRun(run) {
4090
4094
  authoredSchedule: run.authoredSchedule ?? null,
4091
4095
  occurrences: [...run.occurrences],
4092
4096
  capacity: run.capacity,
4097
+ waitlistMode: nullishToNull(run.waitlistMode),
4093
4098
  bookingOffer: normalizeCanonicalBookingOffer(run.bookingOffer),
4094
4099
  venueRef: run.venueRef,
4095
4100
  formRef: run.formRef,
@@ -4111,6 +4116,7 @@ function normalizeLocalRun(local, remote) {
4111
4116
  authoredSchedule: local.authoredSchedule ?? null,
4112
4117
  occurrences: [...local.occurrences],
4113
4118
  capacity: overrideWhenDefined(local.capacity, base.capacity, (value) => typeof value === "number" ? value : null),
4119
+ waitlistMode: local.waitlistMode === undefined ? base.waitlistMode : local.waitlistMode,
4114
4120
  bookingOffer: overrideWhenDefined(local.bookingOffer, base.bookingOffer, normalizeCanonicalBookingOffer),
4115
4121
  venueRef: overrideWhenDefined(local.venueRef, base.venueRef, normalizeNullableString),
4116
4122
  formRef: overrideWhenDefined(local.formRef, base.formRef, normalizeNullableString),
@@ -4149,6 +4155,7 @@ function normalizeNewLocalRun(run) {
4149
4155
  authoredSchedule: run.authoredSchedule ?? null,
4150
4156
  occurrences: [...run.occurrences],
4151
4157
  capacity: run.capacity ?? null,
4158
+ waitlistMode: nullishToNull(run.waitlistMode),
4152
4159
  bookingOffer: normalizeCanonicalBookingOffer(run.bookingOffer),
4153
4160
  venueRef: run.venueRef ?? null,
4154
4161
  formRef: run.formRef ?? null,
@@ -4849,6 +4856,7 @@ function buildEventSeriesCommand(event, run, schedule, offer) {
4849
4856
  categoryIdentifier: event.categoryRef ?? undefined,
4850
4857
  formIdentifier: run.formRef ?? undefined,
4851
4858
  capacity: eventCapacity(run.capacity),
4859
+ ...run.waitlistMode === undefined ? {} : { waitlist: { kind: run.waitlistMode === "on" ? "enabled_when_full" : run.waitlistMode === "off" ? "disabled" : "inherit" } },
4852
4860
  bookingOffer: offer.bookingOffer,
4853
4861
  ...schedule.schedule !== undefined ? { schedule: schedule.schedule } : { occurrences: schedule.occurrences },
4854
4862
  content: eventContent(event.content),
@@ -5085,6 +5093,8 @@ function preferredRef(identifier, ref) {
5085
5093
  }
5086
5094
  function eventRunUpsertInput(command, eventIdentifier) {
5087
5095
  const { input } = command;
5096
+ const waitlist = resolveEventSeriesWaitlistMapping(input.waitlist);
5097
+ if (waitlist.kind === "unsupported") throw new Error(waitlist.gap.message);
5088
5098
  return {
5089
5099
  identifier: input.slug,
5090
5100
  eventRef: eventIdentifier,
@@ -5096,6 +5106,7 @@ function eventRunUpsertInput(command, eventIdentifier) {
5096
5106
  status: input.status,
5097
5107
  ...input.bookingScope === "whole_series" ? {} : { visibility: managementVisibility(input.visibility) },
5098
5108
  capacity: capacityLimit(input.capacity),
5109
+ ...waitlist.waitlistMode === undefined ? {} : { waitlistMode: waitlist.waitlistMode },
5099
5110
  bookingOffer: input.bookingOffer,
5100
5111
  attendeeMigration: input.attendeeMigration,
5101
5112
  venueRef: preferredRef(input.venueIdentifier, input.venueRef),
@@ -11049,6 +11060,13 @@ function formatValidationResult(pageIdentifier, blockIdentifier$1, blockKind, re
11049
11060
  return lines;
11050
11061
  }
11051
11062
 
11063
+ //#endregion
11064
+ //#region ../blocks/src/system/registryStore.ts
11065
+ const REGISTRY_SYMBOL$1 = Symbol.for("@riverbankcms/blocks/system/definitions");
11066
+ const isBlocksTestRuntime$1 = typeof process !== "undefined" && typeof process.env !== "undefined" && process.env.RIVERBANK_BLOCKS_TEST === "1";
11067
+ const globalScope$1 = globalThis;
11068
+ const blockStore = isBlocksTestRuntime$1 ? new Map() : globalScope$1[REGISTRY_SYMBOL$1] ??= new Map();
11069
+
11052
11070
  //#endregion
11053
11071
  //#region ../blocks/src/system/manifest/augmentManifest.ts
11054
11072
  /**
@@ -11263,10 +11281,10 @@ function resolveBlockTitle(manifest, blockContent, blockKind) {
11263
11281
 
11264
11282
  //#endregion
11265
11283
  //#region ../blocks/src/system/manifest/registry.ts
11266
- const REGISTRY_SYMBOL$1 = Symbol.for("@riverbankcms/blocks/manifest-registry");
11267
- const isBlocksTestRuntime$1 = typeof process !== "undefined" && typeof process.env !== "undefined" && process.env.RIVERBANK_BLOCKS_TEST === "1";
11268
- const globalScope$1 = globalThis;
11269
- const manifestStore = isBlocksTestRuntime$1 ? new Map() : globalScope$1[REGISTRY_SYMBOL$1] ??= new Map();
11284
+ const REGISTRY_SYMBOL = Symbol.for("@riverbankcms/blocks/manifest-registry");
11285
+ const isBlocksTestRuntime = typeof process !== "undefined" && typeof process.env !== "undefined" && process.env.RIVERBANK_BLOCKS_TEST === "1";
11286
+ const globalScope = globalThis;
11287
+ const manifestStore = isBlocksTestRuntime ? new Map() : globalScope[REGISTRY_SYMBOL] ??= new Map();
11270
11288
  function registerManifest(manifest) {
11271
11289
  manifestStore.set(manifest.name, manifest);
11272
11290
  return manifest;
@@ -13796,13 +13814,14 @@ const FLOATING_BLUR = "blur(16px)";
13796
13814
  * Similar to button system - generates theme-scoped CSS using [data-theme-scope] selector
13797
13815
  */
13798
13816
  function generateHeaderCss(options) {
13799
- const { themeId, theme, responsiveMode = DEFAULT_THEME_RESPONSIVE_MODE } = options;
13817
+ const { themeId, theme, responsiveMode = DEFAULT_THEME_RESPONSIVE_MODE, solvedInks = "withhold" } = options;
13800
13818
  const tokens = new TokenResolver(theme);
13801
13819
  const header = theme.header;
13802
13820
  const cssChunks = [];
13803
13821
  const headerContrastTreatment = resolveHeaderContrastTreatment(header);
13804
13822
  const headerNavTextSize = resolveHeaderNavTextSize(header);
13805
- cssChunks.push(generateHeaderRootStyles(header, themeId, tokens));
13823
+ cssChunks.push(generateHeaderRootStyles(header, themeId, tokens, headerPaintInks(header, theme, solvedInks)));
13824
+ cssChunks.push(generateOpeningPhotoShade(header, themeId));
13806
13825
  cssChunks.push(generateMobileOverlayBackdropFilterFix(themeId, header.variant));
13807
13826
  cssChunks.push(generateHeaderLogoStyles({
13808
13827
  logo: header.logo,
@@ -13816,20 +13835,26 @@ function generateHeaderCss(options) {
13816
13835
  }));
13817
13836
  cssChunks.push(generateLogoTextBehaviorStyles(header.logoText, themeId));
13818
13837
  cssChunks.push(generateHeaderNavLinkStyles(header, themeId, tokens, theme, headerContrastTreatment, headerNavTextSize));
13819
- cssChunks.push(generateDropdownContainerStyles(header, themeId, tokens, theme));
13820
- cssChunks.push(generateDropdownLinkStyles(header, themeId, tokens, theme));
13838
+ const dropdown = resolveDropdownSurface(header, theme, tokens, solvedInks);
13839
+ cssChunks.push(generateDropdownContainerStyles(themeId, tokens, dropdown));
13840
+ cssChunks.push(generateDropdownLinkStyles(header, themeId, tokens, theme, dropdown));
13821
13841
  cssChunks.push(generateDropdownCaretStyles(themeId));
13822
13842
  cssChunks.push(generateDropdownTriggerOverrides(header, themeId));
13823
- cssChunks.push(generateMobilePanelStyles(header, themeId, tokens, theme));
13843
+ cssChunks.push(generateMobilePanelStyles(themeId, dropdown));
13824
13844
  if (header.variant === "floating" && header.container) {
13825
13845
  cssChunks.push(generateFloatingContainerStyles(header, themeId, tokens, responsiveMode));
13826
13846
  }
13827
- cssChunks.push(generateNavContainerStyles(header, themeId, tokens));
13847
+ cssChunks.push(generateNavContainerStyles(header, themeId, tokens, theme, solvedInks));
13828
13848
  cssChunks.push(generateHeaderCtaTreatmentStyles(header, themeId, tokens));
13829
13849
  cssChunks.push(generateCtaGapStyles(header, themeId));
13830
13850
  return cssChunks.filter(Boolean).join("\n\n");
13831
13851
  }
13832
13852
  const _testExports = { generateHeaderRootStyles };
13853
+ /** Scope shading to the actual opening under overlay chrome, including hidden-header pages. */
13854
+ function generateOpeningPhotoShade(header, themeId) {
13855
+ const shade = headerNeedsPhotoShade(header) ? "linear-gradient(to bottom, rgba(0,0,0,0.78) 0px, rgba(0,0,0,0.64) 110px, transparent 220px)" : "linear-gradient(transparent, transparent)";
13856
+ return `:where([data-theme-scope="${themeId}"]) [data-site-document-layout-mode="header-overlay"] :is([data-page-block-position="first"], [data-page-block-position="only"]) { --rb-opening-photo-shade: ${shade}; }`;
13857
+ }
13833
13858
  function resolveHeaderContrastTreatment(header) {
13834
13859
  if (header.navLinkStyle?.contrastTreatment) {
13835
13860
  return header.navLinkStyle.contrastTreatment;
@@ -13852,7 +13877,7 @@ function isDetachedFloatingHeaderShape(header) {
13852
13877
  /**
13853
13878
  * Generate root header container styles
13854
13879
  */
13855
- function generateHeaderRootStyles(header, themeId, tokens) {
13880
+ function generateHeaderRootStyles(header, themeId, tokens, inks) {
13856
13881
  const selector = `:where([data-theme-scope="${themeId}"]) .header-root`;
13857
13882
  const rules = [];
13858
13883
  const isContainedNav = headerRootPaint(header) === "contained-nav";
@@ -13864,7 +13889,11 @@ function generateHeaderRootStyles(header, themeId, tokens) {
13864
13889
  } : buildHeaderSurfaceRules(header, tokens);
13865
13890
  const floatingSurfaceBorder = header.variant === "floating";
13866
13891
  if (!floatingSurfaceBorder) rules.push(...surfaceRules.border);
13867
- const basePaintRules = floatingSurfaceBorder ? [...surfaceRules.base, ...surfaceRules.border] : surfaceRules.base;
13892
+ const basePaintRules = floatingSurfaceBorder ? [
13893
+ ...surfaceRules.base,
13894
+ ...surfaceRules.border,
13895
+ ...inks
13896
+ ] : [...surfaceRules.base, ...inks];
13868
13897
  const scrolledPaintRules = floatingSurfaceBorder ? surfaceRules.border : [];
13869
13898
  if (header.positioning === "sticky" || header.positioning === "fixed") {
13870
13899
  const shadowElevation = header.shadow?.elevation ?? "none";
@@ -13923,14 +13952,13 @@ function generateLogoTextBehaviorStyles(logoText, themeId) {
13923
13952
  /**
13924
13953
  * Generate dropdown menu container styles
13925
13954
  */
13926
- function generateDropdownContainerStyles(header, themeId, tokens, theme) {
13955
+ function generateDropdownContainerStyles(themeId, tokens, surface) {
13927
13956
  const selector = `:where([data-theme-scope="${themeId}"]) .nav-dropdown-menu`;
13928
13957
  const rules = [];
13929
- const dropdownStyle = header.dropdownStyle;
13958
+ const dropdownStyle = surface.style;
13930
13959
  rules.push(...NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES);
13931
- const surface = resolveDropdownSurface(header, theme);
13932
- rules.push(`background-color: ${tokens.getColor(surface.backgroundToken)};`);
13933
- rules.push(...surface.declarations(tokens));
13960
+ rules.push(`background-color: ${surface.backgroundColor};`);
13961
+ rules.push(...surface.foregroundDeclarations);
13934
13962
  const borderToken = dropdownStyle?.borderColor;
13935
13963
  if (borderToken === null) {
13936
13964
  rules.push(`border: none;`);
@@ -13951,79 +13979,64 @@ function generateDropdownContainerStyles(header, themeId, tokens, theme) {
13951
13979
  };
13952
13980
  rules.push(`border-radius: ${radiusMap[borderRadius]};`);
13953
13981
  rules.push(`padding: 0.5rem 0;`);
13954
- return `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
13955
- }
13956
- function generateDropdownLinkStyles(header, themeId, tokens, theme) {
13957
- const configuredDropdownStyle = header.dropdownStyle;
13958
- const textColorToken = resolveDropdownSurface(header, theme).textToken;
13959
- const hoverBgToken = configuredDropdownStyle?.hoverBackground ?? textColorToken;
13960
- const hoverEffects = {
13961
- hover: hoverBgToken === null ? [] : [{
13962
- effectId: "background-on-hover-alpha",
13963
- options: {
13964
- colorToken: hoverBgToken,
13965
- opacity: 12
13966
- }
13967
- }],
13968
- active: hoverBgToken === null ? [] : [{
13969
- effectId: "background-on-hover-alpha",
13970
- options: {
13971
- colorToken: hoverBgToken,
13972
- opacity: 18
13973
- }
13974
- }]
13975
- };
13976
- if (configuredDropdownStyle?.hoverTextColor) {
13977
- hoverEffects.hover?.push({
13978
- effectId: "text-color-change",
13979
- options: { hoverColorToken: configuredDropdownStyle.hoverTextColor }
13980
- });
13981
- hoverEffects.active?.push({
13982
- effectId: "text-color-change",
13983
- options: { hoverColorToken: configuredDropdownStyle.hoverTextColor }
13984
- });
13985
- }
13986
- const dropdownLinkStyle = {
13982
+ return `\n${selector} {\n ${rules.join("\n ")}\n}\n` + generateDropdownFrosting(selector, surface);
13983
+ }
13984
+ function dropdownLinkEffects(style, textToken, opacity) {
13985
+ const background = style?.hoverBackground === undefined ? textToken : style.hoverBackground;
13986
+ return [...background === null ? [] : [{
13987
+ effectId: "background-on-hover-alpha",
13988
+ options: {
13989
+ colorToken: background,
13990
+ opacity
13991
+ }
13992
+ }], ...style?.hoverTextColor ? [{
13993
+ effectId: "text-color-change",
13994
+ options: { hoverColorToken: style.hoverTextColor }
13995
+ }] : []];
13996
+ }
13997
+ function dropdownNavLinkStyle(header, surface) {
13998
+ const style = surface.style;
13999
+ const textToken = surface.textToken;
14000
+ return {
13987
14001
  name: "Dropdown",
13988
14002
  typography: "body",
13989
- fontWeight: configuredDropdownStyle?.fontWeight ?? header.navWeight ?? "medium",
13990
- textTransform: configuredDropdownStyle?.textTransform ?? "none",
14003
+ fontWeight: style?.fontWeight ?? header.navWeight ?? "medium",
14004
+ textTransform: style?.textTransform ?? "none",
13991
14005
  italic: false,
13992
- colorToken: textColorToken,
14006
+ colorToken: textToken,
13993
14007
  padding: "compact",
13994
14008
  borderRadius: "sm",
13995
- effects: hoverEffects
14009
+ effects: {
14010
+ hover: dropdownLinkEffects(style, textToken, 12),
14011
+ active: dropdownLinkEffects(style, textToken, 18)
14012
+ }
13996
14013
  };
14014
+ }
14015
+ function dropdownTypographyRules(style) {
14016
+ const letterSpacing = style?.letterSpacing ?? "normal";
14017
+ const spacing = {
14018
+ normal: "0em",
14019
+ wide: "0.05em",
14020
+ wider: "0.1em"
14021
+ };
14022
+ const sizes = {
14023
+ xs: "0.75rem",
14024
+ sm: "0.875rem",
14025
+ base: "1rem",
14026
+ lg: "1.125rem"
14027
+ };
14028
+ return [...letterSpacing === "normal" ? [] : [`letter-spacing: ${spacing[letterSpacing]};`], `font-size: ${sizes[style?.textSize ?? "sm"]};`];
14029
+ }
14030
+ function generateDropdownLinkStyles(header, themeId, tokens, theme, surface) {
13997
14031
  const baseCSS = generateNavLinkCSS({
13998
14032
  themeId,
13999
14033
  tokens,
14000
14034
  theme,
14001
- style: dropdownLinkStyle,
14035
+ style: dropdownNavLinkStyle(header, surface),
14002
14036
  className: "nav-dropdown-link"
14003
14037
  });
14004
- const additionalRules = [];
14005
- const letterSpacing = configuredDropdownStyle?.letterSpacing ?? "normal";
14006
- if (letterSpacing !== "normal") {
14007
- const letterSpacingMap = {
14008
- normal: "0em",
14009
- wide: "0.05em",
14010
- wider: "0.1em"
14011
- };
14012
- additionalRules.push(`letter-spacing: ${letterSpacingMap[letterSpacing]};`);
14013
- }
14014
- const textSize = configuredDropdownStyle?.textSize ?? "sm";
14015
- const textSizeMap = {
14016
- xs: "0.75rem",
14017
- sm: "0.875rem",
14018
- base: "1rem",
14019
- lg: "1.125rem"
14020
- };
14021
- additionalRules.push(`font-size: ${textSizeMap[textSize]};`);
14022
- if (additionalRules.length > 0) {
14023
- const selector = `:where([data-theme-scope="${themeId}"]) .nav-dropdown-link`;
14024
- return baseCSS + `\n${selector} {\n ${additionalRules.join("\n ")}\n}\n`;
14025
- }
14026
- return baseCSS;
14038
+ const selector = `:where([data-theme-scope="${themeId}"]) .nav-dropdown-link`;
14039
+ return baseCSS + `\n${selector} {\n ${dropdownTypographyRules(surface.style).join("\n ")}\n}\n`;
14027
14040
  }
14028
14041
  function generateDropdownCaretStyles(themeId) {
14029
14042
  const selector = `:where([data-theme-scope="${themeId}"]) .nav-caret`;
@@ -14054,43 +14067,72 @@ ${selector} {
14054
14067
  }
14055
14068
  `.trim();
14056
14069
  }
14057
- /**
14058
- * The dropdown menu and mobile panel share one surface: `dropdownStyle`'s
14059
- * background, with the text candidate (the dropdown's own colour, then the
14060
- * header's nav colour) validated against it through the surface contract. The
14061
- * nav colour is chosen for the header bar, which can be dark or transparent,
14062
- * so it only carries over when it is legible on the menu too.
14063
- */
14064
- function resolveDropdownSurface(header, theme) {
14065
- const backgroundToken = header.dropdownStyle?.background ?? "surface";
14066
- const candidate = header.dropdownStyle?.textColor ?? ((header.navColor ?? header.textColor)?.trim() || "text");
14070
+ /** Reuse the header's decided opening tone; unknown openings retain opaque paint. */
14071
+ function contextualDropdownStyle(header) {
14072
+ const style = header.dropdownStyle;
14073
+ const treatment = style?.surfaceTreatment;
14074
+ if (!style || treatment?.kind !== "frosted" || treatment.tone !== "opening") return style;
14075
+ const tone = readOpeningToneProjection(header);
14076
+ if (!tone) return {
14077
+ ...style,
14078
+ surfaceTreatment: { kind: "solid" }
14079
+ };
14080
+ const textColor = tone === "dark" ? "neutral-50" : "neutral-950";
14081
+ return {
14082
+ ...style,
14083
+ background: tone === "dark" ? "neutral-950" : "neutral-50",
14084
+ textColor,
14085
+ hoverBackground: textColor,
14086
+ borderColor: null
14087
+ };
14088
+ }
14089
+ /** Menu text wins; only an absent preference falls back to the header's ink. */
14090
+ function dropdownTextCandidate(style, header) {
14091
+ return style?.textColor ?? ((header.navColor ?? header.textColor)?.trim() || "text");
14092
+ }
14093
+ function resolveDropdownSurface(header, theme, tokens, solvedInks) {
14094
+ const style = contextualDropdownStyle(header);
14095
+ const backgroundToken = style?.background ?? "surface";
14096
+ const candidate = dropdownTextCandidate(style, header);
14067
14097
  const foreground = resolveSurfaceForeground({
14068
14098
  type: "color",
14069
14099
  color: backgroundToken,
14070
14100
  textColor: candidate
14071
14101
  }, expandPalette(theme.palette));
14072
14102
  return {
14073
- backgroundToken,
14103
+ backgroundColor: tokens.getColor(backgroundToken),
14074
14104
  textToken: foreground.kind === "known" ? foreground.roles.text : candidate,
14075
- declarations: (tokens) => foreground.kind === "known" ? surfaceForegroundDeclarations(surfaceForegroundInputFromResolved(foreground, (token) => tokens.getColor(token))) : [`color: ${tokens.getColor(candidate)};`]
14105
+ foregroundDeclarations: [...foreground.kind === "known" ? surfaceForegroundDeclarations(surfaceForegroundInputFromResolved(foreground, (token) => tokens.getColor(token))) : [`color: ${tokens.getColor(candidate)};`], ...surfaceInkDeclarations(surfaceInkPublication(foreground, solvedInks))],
14106
+ treatment: style?.surfaceTreatment,
14107
+ style
14076
14108
  };
14077
14109
  }
14078
- /**
14079
- * Generate mobile navigation panel styles
14080
- * Uses the same dropdownStyle settings as the desktop dropdown menus
14081
- */
14082
- function generateMobilePanelStyles(header, themeId, tokens, theme) {
14110
+ /** Solid paint is the fallback. Blur is enhancement, never the readability mechanism. */
14111
+ function generateDropdownFrosting(selector, surface) {
14112
+ if (surface.treatment?.kind !== "frosted") return "";
14113
+ const blur = surface.treatment.blur === "sm" ? "8px" : "12px";
14114
+ return `
14115
+ @supports (background-color: color-mix(in srgb, white, transparent)) and ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
14116
+ ${selector} {
14117
+ background-color: color-mix(in srgb, ${surface.backgroundColor} ${surface.treatment.opacity * 100}%, transparent);
14118
+ backdrop-filter: blur(${blur});
14119
+ -webkit-backdrop-filter: blur(${blur});
14120
+ ${surface.treatment.opacity < 1 ? surfaceInkDeclarations({ kind: "reset" }).join("\n ") : ""}
14121
+ }
14122
+ }
14123
+ `;
14124
+ }
14125
+ /** Mobile shares the resolved opaque surface, never desktop translucency. */
14126
+ function generateMobilePanelStyles(themeId, surface) {
14083
14127
  const selector = `:where([data-theme-scope="${themeId}"]) .nav-mobile-panel`;
14084
14128
  const selfSelector = `:where(.nav-mobile-panel[data-theme-scope="${themeId}"])`;
14085
- const surface = resolveDropdownSurface(header, theme);
14086
- const rules = [`background-color: ${tokens.getColor(surface.backgroundToken)};`, ...surface.declarations(tokens)];
14087
- const body = renderCssDeclarations(rules);
14129
+ const body = renderCssDeclarations([`background-color: ${surface.backgroundColor};`, ...surface.foregroundDeclarations]);
14088
14130
  return `\n${selector} {\n ${body}\n}\n\n${selfSelector} {\n ${body}\n}\n`;
14089
14131
  }
14090
14132
  /**
14091
14133
  * Generate nav container styles (pill/glass)
14092
14134
  */
14093
- function generateNavContainerStyles(header, themeId, tokens) {
14135
+ function generateNavContainerStyles(header, themeId, tokens, theme, solvedInks) {
14094
14136
  const navContainer = header.navContainer;
14095
14137
  const navContainerType = navContainer?.type ?? "none";
14096
14138
  if (!navContainer || navContainerType === "none") return "";
@@ -14106,27 +14148,31 @@ function generateNavContainerStyles(header, themeId, tokens) {
14106
14148
  rules.push("align-self: flex-start;");
14107
14149
  }
14108
14150
  }
14109
- if (navContainerType === "glass") {
14110
- const opacity = resolveFloatingGlassOpacity(header, navContainer.opacity, .15);
14111
- const background = navContainer.tint ? buildTint(tokens.getColor(navContainer.tint), opacity) : buildRgbWhite(opacity);
14112
- rules.push(`background-color: ${background};`);
14113
- rules.push(`backdrop-filter: ${HEADER_BLUR};`);
14114
- rules.push(`-webkit-backdrop-filter: ${HEADER_BLUR};`);
14115
- rules.push("border: 1px solid rgba(255, 255, 255, 0.2);");
14116
- rules.push("box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);");
14117
- } else if (navContainerType === "pill") {
14118
- const opacity = clampOpacity(navContainer.opacity, .15);
14119
- if (navContainer.tint) {
14120
- rules.push(`background-color: ${buildTint(tokens.getColor(navContainer.tint), opacity)};`);
14121
- } else {
14122
- rules.push(`background-color: ${tokens.getColor("surface")};`);
14123
- }
14124
- rules.push(`border: 1px solid ${tokens.getColor("border")};`);
14125
- }
14126
- if (rules.length > 0) {
14127
- return `${selector} { ${rules.join(" ")} }`;
14151
+ rules.push(...navContainerSurfaceRules(header, navContainer, tokens, theme, solvedInks));
14152
+ return `${selector} { ${rules.join(" ")} }`;
14153
+ }
14154
+ /** Paint and publication are decided together, so translucent containers cannot borrow solid inks. */
14155
+ function navContainerSurfaceRules(header, container, tokens, theme, policy) {
14156
+ if (container.type === "glass") {
14157
+ const opacity$1 = resolveFloatingGlassOpacity(header, container.opacity, .15);
14158
+ const background$1 = container.tint ? buildTint(tokens.getColor(container.tint), opacity$1) : buildRgbWhite(opacity$1);
14159
+ return [
14160
+ `background-color: ${background$1};`,
14161
+ `backdrop-filter: ${HEADER_BLUR};`,
14162
+ `-webkit-backdrop-filter: ${HEADER_BLUR};`,
14163
+ "border: 1px solid rgba(255, 255, 255, 0.2);",
14164
+ "box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);",
14165
+ ...surfaceInkDeclarations({ kind: "reset" })
14166
+ ];
14128
14167
  }
14129
- return "";
14168
+ const opacity = clampOpacity(container.opacity, .15);
14169
+ const background = container.tint ? buildTint(tokens.getColor(container.tint), opacity) : tokens.getColor("surface");
14170
+ const solid = container.tint ? opacity === 1 ? container.tint : null : "surface";
14171
+ return [
14172
+ `background-color: ${background};`,
14173
+ `border: 1px solid ${tokens.getColor("border")};`,
14174
+ ...headerContainerInks(solid, theme, policy)
14175
+ ];
14130
14176
  }
14131
14177
  /**
14132
14178
  * Generate floating container styles
@@ -14144,6 +14190,7 @@ function generateFloatingContainerStyles(header, themeId, tokens, responsiveMode
14144
14190
  }
14145
14191
  rules.push(`backdrop-filter: ${FLOATING_BLUR};`);
14146
14192
  rules.push(`-webkit-backdrop-filter: ${FLOATING_BLUR};`);
14193
+ rules.push(...surfaceInkDeclarations({ kind: "reset" }));
14147
14194
  if (container.border) {
14148
14195
  rules.push(`border: 1px solid rgb(255 255 255 / 0.2);`);
14149
14196
  }
@@ -14270,6 +14317,21 @@ function applyAlpha(color, opacity) {
14270
14317
  }
14271
14318
  return color;
14272
14319
  }
14320
+ /** Container glass is deliberately unmeasured; an opaque pill owns its solid paint. */
14321
+ function headerContainerInks(color, theme, policy) {
14322
+ if (color === null) return surfaceInkDeclarations({ kind: "reset" });
14323
+ const foreground = resolveSurfaceForeground({
14324
+ type: "color",
14325
+ color
14326
+ }, expandPalette(theme.palette));
14327
+ return surfaceInkDeclarations(surfaceInkPublication(foreground, policy));
14328
+ }
14329
+ /** Floating mobile bars paint the header background even when the root overlays the page. */
14330
+ function headerPaintInks(header, theme, policy) {
14331
+ if (headerRootPaint(header) === "contained-nav") return [];
14332
+ const foreground = resolveSurfaceForeground(header.background, expandPalette(theme.palette));
14333
+ return surfaceInkDeclarations(surfaceInkPublication(foreground, policy));
14334
+ }
14273
14335
 
14274
14336
  //#endregion
14275
14337
  //#region ../blocks/src/system/transforms/registry/_utils/themeColorResolution.ts
@@ -14281,7 +14343,7 @@ function resolveBackgroundColorValue(value, context) {
14281
14343
  //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
14282
14344
  const sectionSurfaceCache = new WeakMap();
14283
14345
  function resolveHeaderRootForeground(header, palette, isTransparent) {
14284
- if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "unknown" };
14346
+ if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "inherits" };
14285
14347
  const background = header?.background;
14286
14348
  return resolveSurfaceForeground(background ?? {
14287
14349
  type: "color",
@@ -14297,12 +14359,32 @@ function resolveFooterRootForeground(footer, palette, proseHoverCandidate) {
14297
14359
  function resolveSurfaceForegroundStyles(value, context, options) {
14298
14360
  const resolved = cachedSectionSurface(value, context, options);
14299
14361
  const foreground = resolved.foreground;
14300
- if (foreground.kind === "unknown") return { ...resolved.buttonStyles };
14301
- return {
14302
- ...arrangementSurfaceInk(foreground, context),
14303
- ...resolved.buttonStyles,
14304
- ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context)))
14305
- };
14362
+ const inks = surfaceInkStyle(resolved.inks);
14363
+ switch (foreground.kind) {
14364
+ case "inherits":
14365
+ case "unmeasured-paint": return {
14366
+ ...resolved.buttonStyles,
14367
+ ...inks
14368
+ };
14369
+ case "known": return {
14370
+ ...arrangementSurfaceInk(foreground, context),
14371
+ ...resolved.buttonStyles,
14372
+ ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context))),
14373
+ ...inks
14374
+ };
14375
+ }
14376
+ }
14377
+ /**
14378
+ * The render's ink policy, set by the runtime its theme tokens came from. A
14379
+ * render that can't vouch for its runtime withholds, so its owned surfaces
14380
+ * reset the inks rather than publish ones solved for tokens that may differ.
14381
+ */
14382
+ function transformSolvedInks(context) {
14383
+ return context.theme.solvedInks ?? "withhold";
14384
+ }
14385
+ /** Chrome roots publish the same ink decision as sections. */
14386
+ function solvedInkStyle(foreground, context) {
14387
+ return surfaceInkStyle(surfaceInkPublication(foreground, transformSolvedInks(context)));
14306
14388
  }
14307
14389
  /** The section ground's resolved foreground, for decorations drawn on that ground (maps). */
14308
14390
  function resolveSectionSurfaceForeground(value, context, options) {
@@ -14334,7 +14416,8 @@ function resolveRuntimeSectionSurface(value, context, options) {
14334
14416
  palette: context.theme.palette,
14335
14417
  buttonSystem: context.theme.buttons,
14336
14418
  linkHoverToken: context.proseHoverCandidate,
14337
- compositeBase: options?.fallbackToken
14419
+ compositeBase: options?.fallbackToken,
14420
+ solvedInks: transformSolvedInks(context)
14338
14421
  });
14339
14422
  }
14340
14423
  function arrangementSurfaceInk(foreground, context) {
@@ -14343,7 +14426,7 @@ function arrangementSurfaceInk(foreground, context) {
14343
14426
  }
14344
14427
  /** Decoration roles already resolved by the surface owner, shared with footer arrangements. */
14345
14428
  function surfaceInkStyles(foreground, palette) {
14346
- if (foreground.kind === "unknown") return {};
14429
+ if (foreground.kind !== "known") return {};
14347
14430
  const decorations$1 = surfaceDecorationColors(foreground, palette);
14348
14431
  return {
14349
14432
  "--rb-surface-muted-color": foreground.roles.muted ?? foreground.roles.text,
@@ -18326,6 +18409,7 @@ const newsletterFormFragment = defineFragment({
18326
18409
  }
18327
18410
  ],
18328
18411
  layout: [el("newsletter-form", withApiBindings({
18412
+ interactionContext: { $bind: { from: "$root.interactionContext" } },
18329
18413
  lookSlots: { $bind: { from: "content._lookSlots" } },
18330
18414
  source: { $bind: {
18331
18415
  from: "mailingListSource",
@@ -19873,7 +19957,8 @@ function readinessStage(surface) {
19873
19957
  //#region ../blocks/src/system/blocks/readiness.ts
19874
19958
  const newsletterReadiness = {
19875
19959
  needs: ["mailingList"],
19876
- assess: (content, facts) => {
19960
+ assess: (content, facts, interaction) => {
19961
+ if (interaction?.kind === "demo") return ready;
19877
19962
  if (facts.mailingList.kind === "Unavailable") return unknownReadiness;
19878
19963
  const targeting = parseMailingListPlacementTargeting(content.targeting ?? { mode: "default" });
19879
19964
  if (!targeting.ok) return unknownReadiness;
@@ -21842,8 +21927,11 @@ function resolveHeaderVisualStyles(header) {
21842
21927
  return visuals;
21843
21928
  }
21844
21929
  function resolvedForegroundStyle(foreground) {
21845
- if (foreground.kind === "unknown") return undefined;
21846
- return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
21930
+ switch (foreground.kind) {
21931
+ case "inherits":
21932
+ case "unmeasured-paint": return undefined;
21933
+ case "known": return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
21934
+ }
21847
21935
  }
21848
21936
  function footerBottomBarBorderWidthStyle(width) {
21849
21937
  if (!width) return undefined;
@@ -21929,7 +22017,7 @@ const headerRootStyleTransform = {
21929
22017
  const foreground = resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent);
21930
22018
  const foregroundStyle = resolvedForegroundStyle(foreground) ?? (visuals.isTransparent ? surfaceForegroundStyle(transparentHeaderForegroundInput(header, context.theme.palette)) : { color: rgbColorValue(headerLeafTextColor(header)) });
21931
22019
  const borderColorToken = header?.border?.colorToken ?? "border";
21932
- return mergeStyles(foregroundStyle, borderColorStyle(borderColorToken));
22020
+ return mergeStyles(foregroundStyle, solvedInkStyle(foreground, context), borderColorStyle(borderColorToken));
21933
22021
  }
21934
22022
  };
21935
22023
  const headerSectionBackgroundTransform = {
@@ -21958,9 +22046,10 @@ const footerRootStyleTransform = {
21958
22046
  styleParts.push(backgroundColorStyle(token));
21959
22047
  }
21960
22048
  }
21961
- styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
22049
+ const foreground = resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate);
22050
+ styleParts.push(resolvedForegroundStyle(foreground), solvedInkStyle(foreground, context));
21962
22051
  if (footer?.variant === "centred") {
21963
- styleParts.push(surfaceInkStyles(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate), context.theme.palette));
22052
+ styleParts.push(surfaceInkStyles(foreground, context.theme.palette));
21964
22053
  }
21965
22054
  styleParts.push(borderColorStyle("border"));
21966
22055
  return mergeStyles(...styleParts);
@@ -22026,21 +22115,27 @@ const footerBottomBarStyleTransform = {
22026
22115
  run: (value, _options, context) => {
22027
22116
  const footer = asPartialObject(value);
22028
22117
  const bottomBar = footer?.bottomBar;
22029
- return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : undefined, footerBottomBarBorderColorStyle(footer), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
22118
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : undefined, footerBottomBarBorderColorStyle(footer), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette), footerBottomBarInkStyle(footer, context));
22030
22119
  }
22031
22120
  };
22032
22121
  function footerBottomBarForegroundStyle(footer, palette) {
22033
22122
  if (!footer?.bottomBar) return undefined;
22123
+ const foreground = footerBottomBarSurfaceForeground(footer, palette);
22124
+ return foreground === null ? backgroundlessBottomBarForegroundStyle(footer) : resolvedForegroundStyle(foreground);
22125
+ }
22126
+ /** A bar without its own colour paints nothing, so the footer's inks carry on. */
22127
+ function footerBottomBarInkStyle(footer, context) {
22128
+ const foreground = footer ? footerBottomBarSurfaceForeground(footer, context.theme.palette) : null;
22129
+ return foreground === null ? undefined : solvedInkStyle(foreground, context);
22130
+ }
22131
+ function footerBottomBarSurfaceForeground(footer, palette) {
22034
22132
  const bar = footer.bottomBar;
22035
- if (bar.background?.type !== "color") {
22036
- return backgroundlessBottomBarForegroundStyle(footer);
22037
- }
22038
- const foreground = resolveSurfaceForeground(bar.background, palette, {
22133
+ if (bar?.background?.type !== "color") return null;
22134
+ return resolveSurfaceForeground(bar.background, palette, {
22039
22135
  text: bar.textColor,
22040
22136
  link: footer.bottomTextLinkStyle?.colorToken ?? bar.textColor,
22041
22137
  linkHover: footer.bottomTextLinkStyle?.hoverColorToken
22042
22138
  }, { compositeBase: measuredFooterBackdrop(footer, palette) });
22043
- return resolvedForegroundStyle(foreground);
22044
22139
  }
22045
22140
  function backgroundlessBottomBarForegroundStyle(footer) {
22046
22141
  if (footer.background?.contentOwner === siteChromeBackgroundOverrideOwner) {
@@ -30668,7 +30763,7 @@ function MembershipHero({ membershipName, classPrefix, onBookForSomeoneElse }) {
30668
30763
  * LICENSE file in the root directory of this source tree.
30669
30764
  */
30670
30765
  var require_react_dom_production = /* @__PURE__ */ __commonJSMin(((exports) => {
30671
- var React$81 = require_react();
30766
+ var React$82 = require_react();
30672
30767
  function formatProdErrorMessage(code) {
30673
30768
  var url = "https://react.dev/errors/" + code;
30674
30769
  if (1 < arguments.length) {
@@ -30705,7 +30800,7 @@ var require_react_dom_production = /* @__PURE__ */ __commonJSMin(((exports) => {
30705
30800
  implementation
30706
30801
  };
30707
30802
  }
30708
- var ReactSharedInternals = React$81.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
30803
+ var ReactSharedInternals = React$82.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
30709
30804
  function getCrossOriginStringAs(as, input) {
30710
30805
  if ("font" === as) return "";
30711
30806
  if ("string" === typeof input) return "use-credentials" === input ? input : "";
@@ -30848,7 +30943,7 @@ var require_react_dom_development = /* @__PURE__ */ __commonJSMin(((exports) =>
30848
30943
  return dispatcher;
30849
30944
  }
30850
30945
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
30851
- var React$90 = require_react(), Internals$1 = {
30946
+ var React$91 = require_react(), Internals$1 = {
30852
30947
  d: {
30853
30948
  f: noop$2,
30854
30949
  r: function() {
@@ -30864,7 +30959,7 @@ var require_react_dom_development = /* @__PURE__ */ __commonJSMin(((exports) =>
30864
30959
  },
30865
30960
  p: 0,
30866
30961
  findDOMNode: null
30867
- }, REACT_PORTAL_TYPE$1 = Symbol.for("react.portal"), ReactSharedInternals$1 = React$90.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
30962
+ }, REACT_PORTAL_TYPE$1 = Symbol.for("react.portal"), ReactSharedInternals$1 = React$91.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
30868
30963
  "function" === typeof Map && null != Map.prototype && "function" === typeof Map.prototype.forEach && "function" === typeof Set && null != Set.prototype && "function" === typeof Set.prototype.clear && "function" === typeof Set.prototype.forEach || console.error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
30869
30964
  exports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = Internals$1;
30870
30965
  exports.createPortal = function(children, container) {
@@ -36126,37 +36221,6 @@ function buildTransferredAttendeeConfirmationEmailPaymentSummary(options) {
36126
36221
  }
36127
36222
  return assertNever$7(options.paymentMethod);
36128
36223
  }
36129
- function toConfirmationEmailTemplatePaymentFields(summary) {
36130
- if (!summary) {
36131
- return {};
36132
- }
36133
- switch (summary.kind) {
36134
- case "free": return { paymentMethod: "free" };
36135
- case "manual_due": return { paymentMethod: "manual" };
36136
- case "managed_balance_due": return {
36137
- paymentMethod: "manual",
36138
- managedBalanceDueAt: summary.dueAt
36139
- };
36140
- case "waived": return { paymentMethod: "waived" };
36141
- case "pass": return {
36142
- paymentMethod: "pass",
36143
- passName: summary.passName,
36144
- passCreditsUsed: summary.passCreditsUsed
36145
- };
36146
- case "membership": return {
36147
- paymentMethod: "membership",
36148
- membershipName: summary.membershipName
36149
- };
36150
- case "monetary": return {
36151
- paymentMethod: "stripe",
36152
- amountPaid: summary.amountPaidCents,
36153
- amountOutstanding: summary.amountOutstandingCents,
36154
- currency: summary.currency,
36155
- managedBalanceDueAt: summary.dueAt
36156
- };
36157
- }
36158
- return assertNever$7(summary);
36159
- }
36160
36224
 
36161
36225
  //#endregion
36162
36226
  //#region ../commerce/src/purchase/discountApplication.ts
@@ -36604,6 +36668,7 @@ function buildOrderConfirmationContent(input) {
36604
36668
  })) } : null
36605
36669
  };
36606
36670
  const templateVars = {
36671
+ customer_first_name: firstWordOf(customerDisplayName),
36607
36672
  customer_name: customerDisplayName,
36608
36673
  site_name: input.siteTitle ?? "Your Business",
36609
36674
  order_subject: confirmationCopy.subject,
@@ -36635,6 +36700,10 @@ function buildOrderConfirmationContent(input) {
36635
36700
  }
36636
36701
  };
36637
36702
  }
36703
+ /** The first word of their name (or their email, when that's all there is), for the headline. */
36704
+ function firstWordOf(displayName) {
36705
+ return displayName.trim().split(/\s+/)[0] || displayName;
36706
+ }
36638
36707
  function resolveConfirmationCopy(variant, orderNumber) {
36639
36708
  switch (variant.kind) {
36640
36709
  case "pass_only": {
@@ -38613,11 +38682,6 @@ const eventRegistrationErrors = {
38613
38682
  message: "The payment options for this event have changed. Please check the latest options before continuing.",
38614
38683
  action: "payment-options"
38615
38684
  },
38616
- verificationFailed: {
38617
- endsCommand: false,
38618
- message: "We couldn’t confirm this request came from a person. Please refresh the page and try again.",
38619
- action: "none"
38620
- },
38621
38685
  idempotencyConflict: {
38622
38686
  endsCommand: false,
38623
38687
  message: "You’ve already started booking this event. Please finish in the other tab if it’s still open, or check your booking status before starting again.",
@@ -39264,8 +39328,11 @@ function getStepLabel(step) {
39264
39328
  function visitorHoldsOwnPlace(input) {
39265
39329
  return input.hasWaitlistClaim || input.retryingHeldPlace;
39266
39330
  }
39267
- function getTicketSelectionPurpose(admission) {
39268
- return admission.kind === "waitlist" ? "waitlist" : "book";
39331
+ /** A first quote needs a selection, including when all published tickets are full.
39332
+ * Cached capacity permits requesting waitlist places; fresh admission still owns continuation. */
39333
+ function getTicketSelectionPurpose(input) {
39334
+ if (input.admission.kind === "waitlist") return "waitlist";
39335
+ return input.admission.kind === "checking" && input.event && canJoinEventWaitlist(input.event, { attendanceMode: input.attendanceMode }) ? "waitlist" : "book";
39269
39336
  }
39270
39337
  function resolveRegistrationAdmission(input) {
39271
39338
  if (input.holdsOwnPlace) return { kind: "resume" };
@@ -41378,7 +41445,6 @@ const eventRegistrationCommonSchemaShape = {
41378
41445
  successMessage: z.string().optional(),
41379
41446
  buttonVariant: registrationButtonVariantSchema.optional(),
41380
41447
  host: bookingHostSchema.optional(),
41381
- spamProtectionEnabled: z.boolean().optional(),
41382
41448
  supportEmail: z.string().optional(),
41383
41449
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
41384
41450
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional(),
@@ -41578,7 +41644,6 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
41578
41644
  successMessage: source.successMessage,
41579
41645
  buttonVariant: source.buttonVariant,
41580
41646
  host: source.host ?? "overlay",
41581
- spamProtectionEnabled: source.spamProtectionEnabled,
41582
41647
  supportEmail: source.supportEmail,
41583
41648
  sitePasses: source.sitePasses ?? null,
41584
41649
  siteMemberships: source.siteMemberships ?? null,
@@ -44352,17 +44417,7 @@ function resolveCardListSchedule(item, mode) {
44352
44417
  }
44353
44418
  /** Each part owns optional-content collapse once, for calendar and catalogue items. */
44354
44419
  const partRenderers = {
44355
- title: ({ item, presentation, Title = "h3" }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Title, {
44356
- ...listLookSlot(presentation, "item-title"),
44357
- children: item.titleLink || item.href ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
44358
- ...item.titleLink,
44359
- href: item.titleLink?.href ?? item.href ?? undefined,
44360
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LinkedLabel, {
44361
- label: item.title,
44362
- newTabHint: item.newTabHint
44363
- })
44364
- }) : item.title
44365
- }),
44420
+ title: CardListTitle,
44366
44421
  text: ({ item, presentation }) => item.textDocument ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RichText, {
44367
44422
  doc: item.textDocument,
44368
44423
  ...listLookSlot(presentation, "item-text"),
@@ -44371,14 +44426,7 @@ const partRenderers = {
44371
44426
  ...listLookSlot(presentation, "item-text"),
44372
44427
  children: item.text
44373
44428
  }) : null,
44374
- media: ({ item, presentation }) => item.media ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
44375
- ...listLookSlot(presentation, "item-media"),
44376
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MediaNodeServer, {
44377
- value: item.media,
44378
- size: ImagePresets.card,
44379
- ...listLookSlot(presentation, "photo")
44380
- })
44381
- }) : null,
44429
+ media: CardListMedia,
44382
44430
  facts: ({ item, presentation }) => item.facts?.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", {
44383
44431
  ...listLookSlot(presentation, "facts"),
44384
44432
  children: item.facts.map(({ label, value }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -44466,6 +44514,41 @@ const partRenderers = {
44466
44514
  children: props$1.actionNode
44467
44515
  })
44468
44516
  };
44517
+ /** Title and photo share the same destination and external-link behavior. */
44518
+ function cardListItemLink(item) {
44519
+ return item.titleLink ?? (item.href ? { href: item.href } : null);
44520
+ }
44521
+ function CardListTitle({ item, presentation, Title = "h3" }) {
44522
+ const link$2 = cardListItemLink(item);
44523
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Title, {
44524
+ ...listLookSlot(presentation, "item-title"),
44525
+ children: link$2 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
44526
+ ...link$2,
44527
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LinkedLabel, {
44528
+ label: item.title,
44529
+ newTabHint: item.newTabHint
44530
+ })
44531
+ }) : item.title
44532
+ });
44533
+ }
44534
+ function CardListMedia({ item, presentation }) {
44535
+ if (!item.media) return null;
44536
+ const link$2 = cardListItemLink(item);
44537
+ const photo = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MediaNodeServer, {
44538
+ value: item.media,
44539
+ size: ImagePresets.card,
44540
+ ...listLookSlot(presentation, "photo")
44541
+ });
44542
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
44543
+ ...listLookSlot(presentation, "item-media"),
44544
+ children: link$2 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
44545
+ ...link$2,
44546
+ className: "rb-block rb-h-full",
44547
+ "aria-label": `${item.title}${item.newTabHint ? " (opens in a new tab)" : ""}`,
44548
+ children: photo
44549
+ }) : photo
44550
+ });
44551
+ }
44469
44552
  function CardListContentPart({ part, ...props$1 }) {
44470
44553
  return partRenderers[part](props$1);
44471
44554
  }
@@ -44546,6 +44629,56 @@ function LinkedLabel({ label, newTabHint }) {
44546
44629
  })] });
44547
44630
  }
44548
44631
 
44632
+ //#endregion
44633
+ //#region ../blocks/src/system/runtime/nodes/events/shared/EventCardIcons.tsx
44634
+ function MapPinIcon({ className, size = 16, strokeWidth = 2 }) {
44635
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
44636
+ className,
44637
+ width: size,
44638
+ height: size,
44639
+ viewBox: "0 0 24 24",
44640
+ fill: "none",
44641
+ stroke: "currentColor",
44642
+ strokeWidth,
44643
+ strokeLinecap: "round",
44644
+ strokeLinejoin: "round",
44645
+ "aria-hidden": "true",
44646
+ focusable: "false",
44647
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
44648
+ cx: "12",
44649
+ cy: "10",
44650
+ r: "3"
44651
+ })]
44652
+ });
44653
+ }
44654
+ function CalendarIcon({ className, size = 16, strokeWidth = 2 }) {
44655
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
44656
+ className,
44657
+ width: size,
44658
+ height: size,
44659
+ viewBox: "0 0 24 24",
44660
+ fill: "none",
44661
+ stroke: "currentColor",
44662
+ strokeWidth,
44663
+ strokeLinecap: "round",
44664
+ strokeLinejoin: "round",
44665
+ "aria-hidden": "true",
44666
+ focusable: "false",
44667
+ children: [
44668
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", {
44669
+ x: "3",
44670
+ y: "4",
44671
+ width: "18",
44672
+ height: "18",
44673
+ rx: "2"
44674
+ }),
44675
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M16 2v4" }),
44676
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M8 2v4" }),
44677
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 10h18" })
44678
+ ]
44679
+ });
44680
+ }
44681
+
44549
44682
  //#endregion
44550
44683
  //#region ../blocks/src/system/runtime/nodes/events/shared/EventItem.tsx
44551
44684
  /** Arrangement content choices are data, ready for other live offering lists to reuse. */
@@ -44579,6 +44712,8 @@ const eventItemParts = {
44579
44712
  "date",
44580
44713
  "title",
44581
44714
  "meta",
44715
+ "time",
44716
+ "places",
44582
44717
  "action"
44583
44718
  ],
44584
44719
  "month-day": [
@@ -44591,20 +44726,41 @@ const eventItemParts = {
44591
44726
  function eventItemFacts(props$1) {
44592
44727
  const options = eventDateOptions(props$1.event);
44593
44728
  const availability = getEventAvailabilityStatus(props$1.event);
44729
+ const time = formatEventTimeRange(props$1.event, options);
44730
+ const price$1 = formatEventPrice(props$1.event);
44594
44731
  return {
44595
44732
  date: formatEventCompactDateRail(props$1.event.startsAt, options, "as-written"),
44596
- time: formatEventTimeRange(props$1.event, options),
44597
- price: formatEventPrice(props$1.event),
44598
- meta: [
44599
- ...(props$1.parts ?? eventItemParts[props$1.arrangement]).includes("time") ? [] : [formatEventTimeRange(props$1.event, options)],
44600
- formatEventTeacherLine(props$1.event),
44601
- props$1.showVenue !== false ? props$1.event.venue?.name : null
44602
- ].filter(Boolean).join(" · "),
44733
+ time,
44734
+ price: price$1,
44735
+ link: resolveEventLinkProps(props$1.event),
44736
+ meta: eventItemMeta(props$1, {
44737
+ time,
44738
+ price: price$1
44739
+ }),
44740
+ venueIcon: props$1.arrangement === "compact" && props$1.showVenue !== false && Boolean(props$1.event.venue),
44603
44741
  places: props$1.showCapacity ? formatEventRemainingPlaces(props$1.event, { full: "Sold out" }) : null,
44604
44742
  availability: availability.isFull ? "full" : availability.status === "filling" ? "low" : "available",
44605
44743
  description: props$1.event.presentation?.summary ?? props$1.event.description
44606
44744
  };
44607
44745
  }
44746
+ /** Compact rows keep pricing in the details rail and time in the action rail. */
44747
+ function eventItemMeta(props$1, formatted) {
44748
+ const parts = props$1.parts ?? eventItemParts[props$1.arrangement];
44749
+ const venue = props$1.showVenue !== false ? props$1.event.venue?.name : null;
44750
+ const teacher = formatEventTeacherLine(props$1.event);
44751
+ const time = parts.includes("time") ? null : formatted.time;
44752
+ const price$1 = props$1.arrangement === "compact" && !parts.includes("price") ? formatted.price : null;
44753
+ return (props$1.arrangement === "compact" ? [
44754
+ venue,
44755
+ teacher,
44756
+ price$1,
44757
+ time
44758
+ ] : [
44759
+ time,
44760
+ teacher,
44761
+ venue
44762
+ ]).filter(Boolean).join(" · ");
44763
+ }
44608
44764
  /**
44609
44765
  * Keep one RSC component boundary per item. Re-forwarding shared presentation
44610
44766
  * props through layout/part components multiplies React's development debug
@@ -44638,21 +44794,28 @@ function renderCalendarItem(props$1) {
44638
44794
  ...listLookSlot(props$1, props$1.arrangement === "grid" ? "item-body" : "what"),
44639
44795
  children: parts.filter(body).map(renderPart)
44640
44796
  }),
44641
- parts.filter((part) => [
44797
+ renderCalendarTrailingParts(props$1, parts.filter((part) => [
44642
44798
  "time",
44643
44799
  "places",
44644
44800
  "price",
44645
44801
  "action"
44646
- ].includes(part) && !body(part)).map(renderPart)
44802
+ ].includes(part) && !body(part)), renderPart)
44647
44803
  ]
44648
44804
  });
44649
44805
  }
44806
+ function renderCalendarTrailingParts(props$1, parts, renderPart) {
44807
+ const content = parts.map(renderPart);
44808
+ return props$1.arrangement === "compact" && parts.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
44809
+ ...listLookSlot(props$1, "item-actions"),
44810
+ children: content
44811
+ }) : content;
44812
+ }
44650
44813
  function eventItemTag(arrangement) {
44651
44814
  return arrangement === "ledger" || arrangement === "day-groups" ? "li" : "article";
44652
44815
  }
44653
44816
  function renderEventItemContentPart({ part, props: props$1, facts }) {
44654
44817
  switch (part) {
44655
- case "image": return renderEventItemImage(props$1);
44818
+ case "image": return renderEventItemImage(props$1, facts.link);
44656
44819
  case "date": return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("time", {
44657
44820
  ...listLookSlot(props$1, "date"),
44658
44821
  dateTime: props$1.event.startsAt,
@@ -44675,13 +44838,13 @@ function renderEventItemContentPart({ part, props: props$1, facts }) {
44675
44838
  case "title": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
44676
44839
  ...listLookSlot(props$1, "item-title"),
44677
44840
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
44678
- ...resolveEventLinkProps(props$1.event),
44841
+ ...facts.link,
44679
44842
  children: props$1.event.title
44680
44843
  })
44681
44844
  });
44682
- case "time": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
44845
+ case "time": return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
44683
44846
  ...listLookSlot(props$1, "time"),
44684
- children: facts.time
44847
+ children: [props$1.arrangement === "compact" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ClockIcon, { "aria-hidden": "true" }) : null, facts.time]
44685
44848
  });
44686
44849
  case "places": return facts.places ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
44687
44850
  ...listLookSlot(props$1, "places"),
@@ -44703,8 +44866,7 @@ function renderEventItemContentPart({ part, props: props$1, facts }) {
44703
44866
  item: {
44704
44867
  id: props$1.event.id,
44705
44868
  title: props$1.event.title,
44706
- text: facts.description,
44707
- action: { label: "" }
44869
+ text: facts.description
44708
44870
  },
44709
44871
  presentation: props$1
44710
44872
  });
@@ -44716,6 +44878,7 @@ function renderEventItemMeta({ props: props$1, facts }) {
44716
44878
  return facts.meta || places ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
44717
44879
  ...listLookSlot(props$1, "item-meta"),
44718
44880
  children: [
44881
+ facts.venueIcon ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MapPinIcon, {}) : null,
44719
44882
  facts.meta,
44720
44883
  facts.meta && places ? " · " : null,
44721
44884
  places ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
@@ -44725,14 +44888,15 @@ function renderEventItemMeta({ props: props$1, facts }) {
44725
44888
  ]
44726
44889
  }) : null;
44727
44890
  }
44728
- function renderEventItemImage(props$1) {
44891
+ function renderEventItemImage(props$1, link$2) {
44729
44892
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardListContentPart, {
44730
44893
  part: "media",
44731
44894
  item: {
44732
44895
  id: props$1.event.id,
44733
44896
  title: props$1.event.title,
44734
44897
  media: props$1.event.presentation?.image,
44735
- action: { label: "" }
44898
+ titleLink: link$2,
44899
+ newTabHint: link$2.target === "_blank"
44736
44900
  },
44737
44901
  presentation: props$1
44738
44902
  });
@@ -45122,56 +45286,6 @@ function cropHeightStyle(height, heightAs) {
45122
45286
  return heightAs === "minimum" ? { minHeight: height } : { height };
45123
45287
  }
45124
45288
 
45125
- //#endregion
45126
- //#region ../blocks/src/system/runtime/nodes/events/shared/EventCardIcons.tsx
45127
- function MapPinIcon({ className, size = 16, strokeWidth = 2 }) {
45128
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
45129
- className,
45130
- width: size,
45131
- height: size,
45132
- viewBox: "0 0 24 24",
45133
- fill: "none",
45134
- stroke: "currentColor",
45135
- strokeWidth,
45136
- strokeLinecap: "round",
45137
- strokeLinejoin: "round",
45138
- "aria-hidden": "true",
45139
- focusable: "false",
45140
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
45141
- cx: "12",
45142
- cy: "10",
45143
- r: "3"
45144
- })]
45145
- });
45146
- }
45147
- function CalendarIcon({ className, size = 16, strokeWidth = 2 }) {
45148
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
45149
- className,
45150
- width: size,
45151
- height: size,
45152
- viewBox: "0 0 24 24",
45153
- fill: "none",
45154
- stroke: "currentColor",
45155
- strokeWidth,
45156
- strokeLinecap: "round",
45157
- strokeLinejoin: "round",
45158
- "aria-hidden": "true",
45159
- focusable: "false",
45160
- children: [
45161
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", {
45162
- x: "3",
45163
- y: "4",
45164
- width: "18",
45165
- height: "18",
45166
- rx: "2"
45167
- }),
45168
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M16 2v4" }),
45169
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M8 2v4" }),
45170
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 10h18" })
45171
- ]
45172
- });
45173
- }
45174
-
45175
45289
  //#endregion
45176
45290
  //#region ../blocks/src/system/runtime/nodes/events/shared/EventCard.tsx
45177
45291
  /** The category's badge, when the event has a category. */
@@ -46243,7 +46357,7 @@ function buildEventCollectionListDisplay(source) {
46243
46357
  events: Array.isArray(source.events) ? [...source.events] : [],
46244
46358
  listLayout: source.listLayout ?? "stack",
46245
46359
  listColumns: source.listColumns ?? "3",
46246
- eventsPerPage: source.lookSlots !== undefined && source.listLayout === "compact" ? 3 : resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
46360
+ eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage ?? (source.lookSlots !== undefined && source.listLayout === "compact" ? "3" : undefined) }),
46247
46361
  paginationAction,
46248
46362
  sectionAction: paginationAction.kind === "seeAllLink" ? {
46249
46363
  href: paginationAction.href,
@@ -53521,6 +53635,7 @@ function withOptionalPhone(fields$1, includePhone) {
53521
53635
 
53522
53636
  //#endregion
53523
53637
  //#region ../blocks/src/system/runtime/nodes/newsletter-form.interactive.ts
53638
+ const NEWSLETTER_DEMO_MESSAGE = "This is a demo. No signup has been saved.";
53524
53639
  const NEWSLETTER_SIGNUPS_PAUSED_MESSAGE = "We can’t accept signups right now. Please try again later.";
53525
53640
  function newsletterBlockSubmissionMessage(target) {
53526
53641
  if (target.tag === "block-source") {
@@ -53580,6 +53695,7 @@ const newsletterSourceCommonSchema = z.object({
53580
53695
  siteId: z.string().optional(),
53581
53696
  apiBaseUrl: z.string().optional(),
53582
53697
  mailingList: mailingListContextSchema.optional(),
53698
+ interactionContext: blockInteractionContextSchema.optional(),
53583
53699
  targeting: mailingListTargetingSchema.optional(),
53584
53700
  buttonVariant: newsletterButtonVariantSchema.nullable().optional(),
53585
53701
  spamProtectionEnabled: z.boolean().optional(),
@@ -53636,6 +53752,7 @@ const newsletterHydrationSchema = z.object({
53636
53752
  token: signedMailingListSourceTokenSchema
53637
53753
  })
53638
53754
  }),
53755
+ z.object({ tag: z.literal("demo") }),
53639
53756
  z.object({ tag: z.literal("preview") }),
53640
53757
  z.object({
53641
53758
  tag: z.literal("unpublished-preview"),
@@ -53664,25 +53781,28 @@ const newsletterIslandMetaCodec = createZodCodec(z.object({
53664
53781
  apiBaseUrl: z.string().optional()
53665
53782
  }));
53666
53783
  const newsletterIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl");
53667
- function buildNewsletterDisplay(source) {
53668
- const context = source.mailingList;
53669
- const form$1 = context?.tag === "configured" ? context.form : {
53784
+ function newsletterGlobalForm(context) {
53785
+ return context?.tag === "configured" ? context.form : {
53670
53786
  fields: { preset: "emailOnly" },
53671
53787
  includeOptionalPhone: false,
53672
53788
  buttonLabel: "Subscribe",
53673
53789
  successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
53674
53790
  privacyNote: null
53675
53791
  };
53792
+ }
53793
+ function buildNewsletterDisplay(source) {
53794
+ const context = source.mailingList;
53795
+ const form$1 = newsletterGlobalForm(context);
53676
53796
  const targeting = source.targeting ?? { mode: "default" };
53677
53797
  const assessment = assessMailingListTargeting(context, targeting);
53678
53798
  const choices = resolveRuntimeChoices(assessment);
53679
53799
  return {
53680
53800
  kind: "newsletter-form",
53681
53801
  ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
53682
- availability: assessment.tag === "available" ? "ready" : "unavailable",
53802
+ availability: source.interactionContext?.kind === "demo" || assessment.tag === "available" ? "ready" : "unavailable",
53683
53803
  className: source.className ?? null,
53684
53804
  buttonLabel: form$1.buttonLabel,
53685
- successMessage: form$1.successMessage,
53805
+ successMessage: source.interactionContext?.kind === "demo" ? NEWSLETTER_DEMO_MESSAGE : form$1.successMessage,
53686
53806
  buttonVariant: source.buttonVariant ?? "primary",
53687
53807
  privacyNote: form$1.privacyNote,
53688
53808
  fields: getGlobalFormFields(form$1, source),
@@ -53705,12 +53825,13 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
53705
53825
  setupRevision: source.mailingList?.tag === "configured" ? source.mailingList.revision : null,
53706
53826
  choiceProvider: targeting.mode === "custom" ? targeting.provider : null,
53707
53827
  choicePresentation: presentation.tag,
53708
- spamProtectionEnabled: source.spamProtectionEnabled
53828
+ spamProtectionEnabled: source.interactionContext?.kind === "demo" ? false : source.spamProtectionEnabled
53709
53829
  }
53710
53830
  };
53711
53831
  }
53712
53832
  });
53713
53833
  function projectNewsletterFormHydrationTarget(source) {
53834
+ if (source.interactionContext?.kind === "demo") return { tag: "demo" };
53714
53835
  switch (source.source) {
53715
53836
  case "block": {
53716
53837
  switch (source.newsletterBlockSubmission.tag) {
@@ -55778,10 +55899,6 @@ function normalizeBlockContent(definition$1, content) {
55778
55899
  ...Object.fromEntries(Object.entries(normalized).filter(([key]) => owned.has(key)))
55779
55900
  };
55780
55901
  }
55781
- const REGISTRY_SYMBOL = Symbol.for("@riverbankcms/blocks/system/definitions");
55782
- const isBlocksTestRuntime = typeof process !== "undefined" && typeof process.env !== "undefined" && process.env.RIVERBANK_BLOCKS_TEST === "1";
55783
- const globalScope = globalThis;
55784
- const blockStore = isBlocksTestRuntime ? new Map() : globalScope[REGISTRY_SYMBOL] ??= new Map();
55785
55902
  function ensureDefaults() {
55786
55903
  ensureSystemBlockDefinitionsRegistered();
55787
55904
  }
@@ -56319,7 +56436,10 @@ const systemCustomizeFacetDefinitions = [
56319
56436
  ], "icons"),
56320
56437
  blockKinds: cardListFamilyBlocks
56321
56438
  },
56322
- fixedKnob("block.event-calendar", "showCapacity", "Show places left", onOff, "true", false, true)
56439
+ {
56440
+ ...fixedKnob("block.event-calendar", "showCapacity", "Places left", onOff, "true", false, true),
56441
+ description: "Show how many places are left on each event"
56442
+ }
56323
56443
  ];
56324
56444
  const systemCustomizeFacetIds = systemCustomizeFacetDefinitions.map((definition$1) => definition$1.id);
56325
56445
  const systemCustomizeFacetValues = Array.from(new Set(systemCustomizeFacetDefinitions.flatMap((definition$1) => definition$1.values.map((option) => option.value))));
@@ -60157,8 +60277,7 @@ function buildStandardBookingPaymentDisclosure(input, payment, amount) {
60157
60277
  ...discountCode ? { discountCode } : {},
60158
60278
  ...amount,
60159
60279
  ...selectedCollectionOptionKind ? { selectedCollectionOptionKind } : {},
60160
- shownTerms: input.shownTerms ?? snapshotBookingShownTerms(payment, input.promisedDiscountId),
60161
- altchaSolution: input.altchaSolution ?? null
60280
+ shownTerms: input.shownTerms ?? snapshotBookingShownTerms(payment, input.promisedDiscountId)
60162
60281
  };
60163
60282
  }
60164
60283
  function validateBookingSlidingSelection(service, data) {
@@ -60511,8 +60630,7 @@ function buildEventRegistrationSourceProps(input) {
60511
60630
  showVenue: input.showVenue,
60512
60631
  showCapacity: input.showCapacity,
60513
60632
  successMessage: input.successMessage,
60514
- buttonVariant: input.buttonVariant,
60515
- spamProtectionEnabled: input.spamProtectionEnabled
60633
+ buttonVariant: input.buttonVariant
60516
60634
  };
60517
60635
  }
60518
60636
 
@@ -60602,7 +60720,6 @@ const bookingSourceSchema = z.object({
60602
60720
  successMessage: z.string().nullable().optional(),
60603
60721
  form: bookingSourceFormSchema.nullable().optional(),
60604
60722
  services: bookingServicesSourceSchema.nullable().optional(),
60605
- spamProtectionEnabled: z.boolean().optional(),
60606
60723
  className: z.string().nullable().optional()
60607
60724
  });
60608
60725
  const bookingDisplaySchema = z.object({
@@ -60631,8 +60748,7 @@ const bookingHydrationSchema = z.object({
60631
60748
  rebookContext: z.object({ kind: z.literal("portal_rebook") }).nullable().optional(),
60632
60749
  form: bookingConfigSchema.nullable(),
60633
60750
  services: z.array(bookingServiceSchema),
60634
- serviceCategories: z.array(bookingServiceCategorySchema).optional(),
60635
- spamProtectionEnabled: z.boolean().optional()
60751
+ serviceCategories: z.array(bookingServiceCategorySchema).optional()
60636
60752
  });
60637
60753
  const bookingRenderSchema = z.object({
60638
60754
  display: bookingDisplaySchema,
@@ -60683,8 +60799,7 @@ const bookingFormBlockRuntime = defineClientOwnedBlockRuntime({
60683
60799
  rebookContext: source.rebookContext ?? null,
60684
60800
  form: form$1,
60685
60801
  services,
60686
- serviceCategories: normalizeBookingServiceCategories(source.services),
60687
- spamProtectionEnabled: source.spamProtectionEnabled
60802
+ serviceCategories: normalizeBookingServiceCategories(source.services)
60688
60803
  }
60689
60804
  };
60690
60805
  }
@@ -62843,13 +62958,12 @@ function previewCardContent(item, props$1, datesBySeries, typeLabel) {
62843
62958
  }
62844
62959
  function nativeRunCardContent(item, content, props$1) {
62845
62960
  const open$1 = resolveWholeSeriesBookingPhase(item.run.run, props$1.now).kind === "open";
62961
+ const path$3 = content.titleLink?.href ?? null;
62846
62962
  return {
62847
62963
  ...content,
62848
- href: item.path,
62849
- titleLink: undefined,
62850
62964
  action: {
62851
- label: open$1 ? item.path ? props$1.buttonText || "Book" : "Details coming soon" : "Registration closed",
62852
- ...open$1 && item.path ? { href: item.path } : {}
62965
+ label: open$1 ? path$3 ? props$1.buttonText || "Book" : "Details coming soon" : "Registration closed",
62966
+ ...open$1 && path$3 ? { href: path$3 } : {}
62853
62967
  }
62854
62968
  };
62855
62969
  }
@@ -65528,6 +65642,16 @@ function EventRegistrationShell({ display }) {
65528
65642
  }
65529
65643
  var event_registration_server_default = EventRegistrationSSR;
65530
65644
 
65645
+ //#endregion
65646
+ //#region ../blocks/src/system/runtime/shared/components/ProtectedSubmitButton.tsx
65647
+ /** Verification readiness is decided here, never recomputed by individual forms. */
65648
+ function ProtectedSubmitButton({ submission, disabled, ...props$1 }) {
65649
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
65650
+ ...props$1,
65651
+ disabled: disabled || submission.kind === "waiting"
65652
+ });
65653
+ }
65654
+
65531
65655
  //#endregion
65532
65656
  //#region ../blocks/src/system/runtime/nodes/form.fields.tsx
65533
65657
  function fieldBasics(field) {
@@ -65710,14 +65834,15 @@ function FormFieldGroups({ groups, lookSlots }) {
65710
65834
  children: group.fields.map(renderField$1)
65711
65835
  }, group.key) : renderField$1(group.field)) });
65712
65836
  }
65713
- function FormSubmitAction({ lookSlots, submitLabel, disabled }) {
65837
+ function FormSubmitAction({ lookSlots, submitLabel, disabled, submission }) {
65714
65838
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
65715
65839
  className: "fb-actions",
65716
65840
  ...listLookSlot({ lookSlots }, "actions"),
65717
65841
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
65718
65842
  className: "fb-actions-inner",
65719
65843
  ...listLookSlot({ lookSlots }, "inline"),
65720
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
65844
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProtectedSubmitButton, {
65845
+ submission,
65721
65846
  ...listLookSlot({ lookSlots }, "action"),
65722
65847
  type: "submit",
65723
65848
  variant: "primary",
@@ -65782,6 +65907,7 @@ const FormNodeSSR = ({ blockId, lookSlots, value, submitLabel, successMessage, c
65782
65907
  lookSlots: display.lookSlots
65783
65908
  }),
65784
65909
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FormSubmitAction, {
65910
+ submission: { kind: "waiting" },
65785
65911
  submitLabel: display.submitLabel,
65786
65912
  lookSlots: display.lookSlots
65787
65913
  })
@@ -65846,7 +65972,7 @@ function NewsletterExtraField({ field, disabled, error: error$1, lookSlots }) {
65846
65972
  });
65847
65973
  }
65848
65974
  /** The email field and submit button sharing one input-styled shell. */
65849
- function NewsletterEmailEntry({ field, buttonVariant, buttonLabel, disabled, error: error$1 }) {
65975
+ function NewsletterEmailEntry({ field, buttonVariant, buttonLabel, submission, disabled, error: error$1 }) {
65850
65976
  const inputId = inputIdFor(field);
65851
65977
  const errorId = `${inputId}-error`;
65852
65978
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -65873,7 +65999,8 @@ function NewsletterEmailEntry({ field, buttonVariant, buttonLabel, disabled, err
65873
65999
  messageId: errorId
65874
66000
  })
65875
66001
  }),
65876
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
66002
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProtectedSubmitButton, {
66003
+ submission,
65877
66004
  type: "submit",
65878
66005
  variant: buttonVariant,
65879
66006
  size: "md",
@@ -65892,7 +66019,7 @@ function NewsletterEmailEntry({ field, buttonVariant, buttonLabel, disabled, err
65892
66019
  * The submit action: joined to the email field when the preset has one
65893
66020
  * (every current preset does), otherwise a plain themed button.
65894
66021
  */
65895
- function NewsletterSubmitRow({ emailField: emailField$1, lookSlots, buttonVariant, buttonLabel, disabled, error: error$1 }) {
66022
+ function NewsletterSubmitRow({ emailField: emailField$1, lookSlots, buttonVariant, buttonLabel, submission, disabled, error: error$1 }) {
65896
66023
  if (lookSlots) {
65897
66024
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [emailField$1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterExtraField, {
65898
66025
  field: emailField$1,
@@ -65901,7 +66028,8 @@ function NewsletterSubmitRow({ emailField: emailField$1, lookSlots, buttonVarian
65901
66028
  error: error$1
65902
66029
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
65903
66030
  ...listLookSlot({ lookSlots }, "actions"),
65904
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
66031
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProtectedSubmitButton, {
66032
+ submission,
65905
66033
  ...listLookSlot({ lookSlots }, "action"),
65906
66034
  type: "submit",
65907
66035
  variant: buttonVariant,
@@ -65916,13 +66044,15 @@ function NewsletterSubmitRow({ emailField: emailField$1, lookSlots, buttonVarian
65916
66044
  field: emailField$1,
65917
66045
  buttonVariant,
65918
66046
  buttonLabel,
66047
+ submission,
65919
66048
  disabled,
65920
66049
  error: error$1
65921
66050
  });
65922
66051
  }
65923
66052
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
65924
66053
  className: "newsletter-submit",
65925
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
66054
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProtectedSubmitButton, {
66055
+ submission,
65926
66056
  type: "submit",
65927
66057
  variant: buttonVariant,
65928
66058
  size: "md",
@@ -66021,6 +66151,7 @@ function NewsletterFormSSR(props$1) {
66021
66151
  }, field.id))
66022
66152
  }) : null,
66023
66153
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterSubmitRow, {
66154
+ submission: { kind: "waiting" },
66024
66155
  lookSlots: display.lookSlots,
66025
66156
  emailField: emailField$1,
66026
66157
  buttonVariant: display.buttonVariant,
@@ -68860,10 +68991,15 @@ function arrangementRuntime(content) {
68860
68991
  const value = parseSurfaceTree(content._arrangementLooks);
68861
68992
  return isObjectRecord(value) && isObjectRecord(value.byMode) && Array.isArray(value.available) && Array.isArray(value.rhythm) ? restoreArrangementRuntime(value) : null;
68862
68993
  }
68863
- /** JSON transports carry resolver inputs; rebuild every surface at this boundary. */
68994
+ /**
68995
+ * JSON transports carry resolver inputs; rebuild every surface at this boundary.
68996
+ * A payload cached before compiled looks carried `slotRoles` gets the Look's own.
68997
+ */
68864
68998
  function restoreCompiledLook(look) {
68999
+ const transported = look;
68865
69000
  return {
68866
69001
  ...look,
69002
+ slotRoles: transported.slotRoles ?? look.look.structure.slotRoles ?? {},
68867
69003
  itemSurfaces: Object.fromEntries(Object.entries(look.itemSurfaces).map(([slot, surface]) => [slot, parseResolvedSurface(surface)])),
68868
69004
  ...look.roleSurfaces ? { roleSurfaces: {
68869
69005
  card: parseResolvedSurface(look.roleSurfaces.card),
@@ -68916,6 +69052,7 @@ function planArrangementContent(blockKind, manifest, content, audience) {
68916
69052
  });
68917
69053
  return {
68918
69054
  ...activeContent,
69055
+ ...arrangementPhotoTreatmentContent(activeContent, effective.look),
68919
69056
  ...mode !== null ? { variant: mode } : {},
68920
69057
  ...effectiveContent,
68921
69058
  ...photoContent,
@@ -68937,6 +69074,16 @@ function planArrangementContent(blockKind, manifest, content, audience) {
68937
69074
  blockLook: effective.look.id
68938
69075
  };
68939
69076
  }
69077
+ /** Typed Look composition owns contrast treatment; parsing preserves authored paint. */
69078
+ function arrangementPhotoTreatmentContent(content, look) {
69079
+ if (!look.structure.photoTreatment) return {};
69080
+ const authored = parseCanonicalRuntimeBackground(content);
69081
+ if (authored.kind === "none") return {};
69082
+ return { _sectionStyles: {
69083
+ ...isObjectRecord(content._sectionStyles) ? content._sectionStyles : {},
69084
+ background: applyLookPhotoTreatment(authored.background, look.structure.photoTreatment)
69085
+ } };
69086
+ }
68940
69087
  /** Widget section hooks use the theme; hero background geometry never travels to list islands. */
68941
69088
  function arrangementContentSlots(blockKind) {
68942
69089
  return Object.fromEntries(arrangementSlotNames.filter((slot) => (!slot.startsWith("price-") || blockKind === "block.shop") && slot !== "schedule-section" && slot !== "shop-section" && (slot !== "background" || blockKind === "block.hero")).map((slot) => [slot, slot]));
@@ -69029,6 +69176,7 @@ function applyArrangementRhythm(entry, position) {
69029
69176
  const tinted = resolveArrangementTints(updated$1, grounded, runtime, surface) ?? grounded;
69030
69177
  return {
69031
69178
  ...entry,
69179
+ styleBackground: arrangementGroundToken(resolveSectionBackground({ kind: "none" }, null, rhythm)),
69032
69180
  renderableContent: {
69033
69181
  ...updated$1,
69034
69182
  _effectiveLook: tinted,
@@ -69141,7 +69289,7 @@ function resolveArrangementRoleSurfaces(look, runtime, background) {
69141
69289
  ...look,
69142
69290
  ground,
69143
69291
  roleSurfaces,
69144
- itemSurfaces: resolveLookSlotSurfaces(look.look, look.itemRoles, roleSurfaces)
69292
+ itemSurfaces: resolveLookSlotSurfaces(look, look.itemRoles, roleSurfaces)
69145
69293
  };
69146
69294
  }
69147
69295
  /** The arrangement key is resolved once by planBlock, including pinned Looks. */
@@ -69149,7 +69297,7 @@ function heroPhotoGround(entry) {
69149
69297
  return entry.kind === "renderable" && entry.block.kind === "block.hero" ? { paintsGround: heroPhotoPaintsGround(entry.effectiveArrangementKey ?? undefined) } : undefined;
69150
69298
  }
69151
69299
  /** Header consumers receive the opening that the public render plan actually admits. */
69152
- function resolvePageOpeningSection(page, options = {}) {
69300
+ function resolvePageOpeningSection(page, options) {
69153
69301
  const presentation = toPresentationPage(page);
69154
69302
  if (!presentation) return null;
69155
69303
  const opening = buildPageRenderPlan({
@@ -69163,11 +69311,12 @@ function resolvePageOpeningSection(page, options = {}) {
69163
69311
  blockOverrides: undefined
69164
69312
  }).entries[0];
69165
69313
  if (!opening) return null;
69166
- const background = resolveSectionBackground(parseCanonicalRuntimeBackground(opening.renderableContent), null);
69314
+ const appearance = resolveCompiledSectionContextFromContent(opening.renderableContent, expandPalette(options.theme.palette), heroPhotoGround(opening));
69167
69315
  return {
69168
69316
  blockKind: opening.block.kind,
69169
69317
  content: opening.renderableContent,
69170
- photoPlacement: resolveSectionPhotoPlacement(background, heroPhotoGround(opening))
69318
+ appearance,
69319
+ photoPlacement: appearance.openingPhotoBehindText ? "behind-text" : "none"
69171
69320
  };
69172
69321
  }
69173
69322
 
@@ -79899,7 +80048,7 @@ async function loadConfig(configPath, output) {
79899
80048
  return { errorMessage: "No config path provided." };
79900
80049
  }
79901
80050
  try {
79902
- const { loadConfigFile: loadConfigFile$1 } = await import("../load-config-zu397zDX.mjs");
80051
+ const { loadConfigFile: loadConfigFile$1 } = await import("../load-config-BcATOVmw.mjs");
79903
80052
  const rawConfig = await loadConfigFile$1(configPath);
79904
80053
  const parsed = riverbankSiteConfigSchema.safeParse(rawConfig);
79905
80054
  if (!parsed.success) {
@@ -82657,6 +82806,7 @@ function cancelledRunInput(run) {
82657
82806
  status: "cancelled",
82658
82807
  visibility: run.visibility,
82659
82808
  capacity: run.capacity,
82809
+ waitlistMode: run.waitlistMode,
82660
82810
  bookingOffer: run.bookingOffer,
82661
82811
  venueRef: run.venueRef,
82662
82812
  formRef: run.formRef,
@@ -95463,257 +95613,6 @@ async function retryResendRequest(apiClient, { domainId, options }) {
95463
95613
  }
95464
95614
  }
95465
95615
 
95466
- //#endregion
95467
- //#region ../api/src/admin.ts
95468
- async function startImpersonation(apiClient, body, options) {
95469
- try {
95470
- return unwrapResponse(await apiClient({
95471
- endpoint: "adminStartImpersonation",
95472
- body,
95473
- options
95474
- }));
95475
- } catch (error$1) {
95476
- return normalizeApiError(error$1, "Failed to start impersonation session");
95477
- }
95478
- }
95479
- async function stopImpersonation(apiClient, body, options) {
95480
- try {
95481
- return unwrapResponse(await apiClient({
95482
- endpoint: "adminStopImpersonation",
95483
- body,
95484
- options
95485
- }));
95486
- } catch (error$1) {
95487
- return normalizeApiError(error$1, "Failed to stop impersonation session");
95488
- }
95489
- }
95490
- async function assignAdminRole(apiClient, body, options) {
95491
- try {
95492
- return unwrapResponse(await apiClient({
95493
- endpoint: "adminAssignRole",
95494
- body,
95495
- options
95496
- }));
95497
- } catch (error$1) {
95498
- return normalizeApiError(error$1, "Failed to assign admin role");
95499
- }
95500
- }
95501
- async function revokeAdminRole(apiClient, body, options) {
95502
- try {
95503
- return unwrapResponse(await apiClient({
95504
- endpoint: "adminRevokeRole",
95505
- body,
95506
- options
95507
- }));
95508
- } catch (error$1) {
95509
- return normalizeApiError(error$1, "Failed to revoke admin role");
95510
- }
95511
- }
95512
- async function adminChangePlan(apiClient, body, options) {
95513
- try {
95514
- return unwrapResponse(await apiClient({
95515
- endpoint: "adminChangePlan",
95516
- body: {
95517
- ...body,
95518
- attemptId: body.attemptId ?? crypto.randomUUID()
95519
- },
95520
- options
95521
- }));
95522
- } catch (error$1) {
95523
- return normalizeApiError(error$1, "Failed to update billing plan");
95524
- }
95525
- }
95526
- async function listAdminInvites(apiClient, params = {}, options) {
95527
- try {
95528
- return unwrapResponse(await apiClient({
95529
- endpoint: "adminListInvites",
95530
- params,
95531
- options
95532
- }));
95533
- } catch (error$1) {
95534
- return normalizeApiError(error$1, "Failed to load invites");
95535
- }
95536
- }
95537
- async function createAdminInvite(apiClient, body, options) {
95538
- try {
95539
- return unwrapResponse(await apiClient({
95540
- endpoint: "adminCreateInvite",
95541
- body,
95542
- options
95543
- }));
95544
- } catch (error$1) {
95545
- return normalizeApiError(error$1, "Failed to create invite");
95546
- }
95547
- }
95548
- async function revokeAdminInvite(apiClient, inviteId, options) {
95549
- try {
95550
- return unwrapResponse(await apiClient({
95551
- endpoint: "adminRevokeInvite",
95552
- params: { inviteId },
95553
- options
95554
- }));
95555
- } catch (error$1) {
95556
- return normalizeApiError(error$1, "Failed to revoke invite");
95557
- }
95558
- }
95559
- async function createAdminUser(apiClient, body, options) {
95560
- try {
95561
- return unwrapResponse(await apiClient({
95562
- endpoint: "adminCreateUser",
95563
- body,
95564
- options
95565
- }));
95566
- } catch (error$1) {
95567
- return normalizeApiError(error$1, "Failed to create user");
95568
- }
95569
- }
95570
- async function adminDeleteSite(apiClient, siteId, options) {
95571
- try {
95572
- return unwrapResponse(await apiClient({
95573
- endpoint: "adminDeleteSite",
95574
- params: { siteId },
95575
- options
95576
- }));
95577
- } catch (error$1) {
95578
- return normalizeApiError(error$1, "Failed to delete site");
95579
- }
95580
- }
95581
- async function adminDeleteUser(apiClient, userId, params = {}, options) {
95582
- const forceQuery = params.force ? { force: "true" } : {};
95583
- try {
95584
- return unwrapResponse(await apiClient({
95585
- endpoint: "adminDeleteUser",
95586
- params: {
95587
- userId,
95588
- ...forceQuery
95589
- },
95590
- options
95591
- }));
95592
- } catch (error$1) {
95593
- return normalizeApiError(error$1, "Failed to delete user");
95594
- }
95595
- }
95596
- async function listAllowedDomains(apiClient, params = {}, options) {
95597
- try {
95598
- return unwrapResponse(await apiClient({
95599
- endpoint: "adminListAllowedDomains",
95600
- params,
95601
- options
95602
- }));
95603
- } catch (error$1) {
95604
- return normalizeApiError(error$1, "Failed to load allowed domains");
95605
- }
95606
- }
95607
- async function addAllowedDomain(apiClient, body, options) {
95608
- try {
95609
- return unwrapResponse(await apiClient({
95610
- endpoint: "adminAddAllowedDomain",
95611
- body,
95612
- options
95613
- }));
95614
- } catch (error$1) {
95615
- return normalizeApiError(error$1, "Failed to add domain");
95616
- }
95617
- }
95618
- async function deleteAllowedDomain(apiClient, domainId, options) {
95619
- try {
95620
- return unwrapResponse(await apiClient({
95621
- endpoint: "adminDeleteAllowedDomain",
95622
- params: { domainId },
95623
- options
95624
- }));
95625
- } catch (error$1) {
95626
- return normalizeApiError(error$1, "Failed to remove domain");
95627
- }
95628
- }
95629
- async function listGscPropertiesAdmin(apiClient, options) {
95630
- try {
95631
- return unwrapResponse(await apiClient({
95632
- endpoint: "listGscPropertiesAdmin",
95633
- options
95634
- }));
95635
- } catch (error$1) {
95636
- return normalizeApiError(error$1, "Failed to load GSC properties");
95637
- }
95638
- }
95639
- async function setGscPersistEnabled(apiClient, body, options) {
95640
- try {
95641
- return unwrapResponse(await apiClient({
95642
- endpoint: "adminGscMetaPersist",
95643
- body,
95644
- options
95645
- }));
95646
- } catch (error$1) {
95647
- return normalizeApiError(error$1, "Failed to update GSC persist toggle");
95648
- }
95649
- }
95650
- async function startGscVerification(apiClient, body, options) {
95651
- try {
95652
- return unwrapResponse(await apiClient({
95653
- endpoint: "adminGscVerifyStart",
95654
- body,
95655
- options
95656
- }));
95657
- } catch (error$1) {
95658
- return normalizeApiError(error$1, "Failed to start GSC verification");
95659
- }
95660
- }
95661
- async function confirmGscVerification(apiClient, body, options) {
95662
- try {
95663
- return unwrapResponse(await apiClient({
95664
- endpoint: "adminGscVerifyConfirm",
95665
- body,
95666
- options
95667
- }));
95668
- } catch (error$1) {
95669
- return normalizeApiError(error$1, "Failed to confirm GSC verification");
95670
- }
95671
- }
95672
- async function runGscIngestionForSite(apiClient, body, options) {
95673
- try {
95674
- return unwrapResponse(await apiClient({
95675
- endpoint: "adminSeoIngestRun",
95676
- body,
95677
- options
95678
- }));
95679
- } catch (error$1) {
95680
- return normalizeApiError(error$1, "Failed to run GSC ingestion");
95681
- }
95682
- }
95683
- async function getPriceOverride(apiClient, params, options) {
95684
- try {
95685
- return unwrapResponse(await apiClient({
95686
- endpoint: "adminGetPriceOverride",
95687
- params,
95688
- options
95689
- }));
95690
- } catch (error$1) {
95691
- return normalizeApiError(error$1, "Failed to get price override");
95692
- }
95693
- }
95694
- async function upsertPriceOverride(apiClient, body, options) {
95695
- try {
95696
- return unwrapResponse(await apiClient({
95697
- endpoint: "adminUpsertPriceOverride",
95698
- body,
95699
- options
95700
- }));
95701
- } catch (error$1) {
95702
- return normalizeApiError(error$1, "Failed to set custom price");
95703
- }
95704
- }
95705
- async function deletePriceOverride(apiClient, body, options) {
95706
- try {
95707
- return unwrapResponse(await apiClient({
95708
- endpoint: "adminDeletePriceOverride",
95709
- body,
95710
- options
95711
- }));
95712
- } catch (error$1) {
95713
- return normalizeApiError(error$1, "Failed to clear custom price");
95714
- }
95715
- }
95716
-
95717
95616
  //#endregion
95718
95617
  //#region ../api/src/auth.ts
95719
95618
  function extractErrorMessage(error$1, fallback) {