riverbankcms 0.18.0 → 0.19.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 readHeaderNavFontSizePreference, $n as mediaSchema, $r as makeBoundaryId, $t as resolvedButtonColourDeclarations, A as pickShadeTowardBackground, Ai as defaultThemeTokens, An as resolveSectionBackground, Ar as cardVariantRoleValues, At as parseCustomCssRules, B as createNavigationRef, Bi as ORDINARY_TEXT_MIN_CONTRAST_RATIO, Bn as deleteEnvSpecificKeys, Br as asDesignBlockId, Bt as FONT_WEIGHT_MAP, C as pagePathForCommand, Ci as generateShadowValue, Cn as composeBoundary, Cr as parseSafeDownloadFilename, Ct as MQ_SM_DOWN, D as bookingPaymentTermsSchema, Di as selectLogoVariant, Dn as transitionCatalogueEntries, Dr as renderCssDeclarations, Dt as getComponentBorderWidthPx, E as bookingPaymentCollectionOptionSchema, Ei as unsafeAsOpaqueButtonColourToken, En as anglePolygonCss, Er as generateCardCss, Et as headerVariantValues, F as createContentEntryRef, Fi as surfaceForegroundValue, Fn as siteChromeBackgroundOverrideOwner, Fr as defineBlockDesignMetadata, Ft as NAV_LINK_TEXT_SIZE_MAP, G as slugPart, Gi as featuresFromHex, Gn as parseAspectRatioValue, Gr as defineBlockDesignCapability, Gt as ACCORDION_SPACING_MAP, H as createSiteCommandSiteRef, Hi as parseThemeColorToken, Hn as rotateNormalizedPoint, Ht as INPUT_SPACING_MAP, I as createEventCategoryRef, Ii as expandPalette, In as stripStaleTransitionStyleGroup, Ir as resolveEffectiveKnobs, It as navLinkHoverColorCandidate, J as headerLeafTextColor, Ji as __commonJSMin, Jn as getDirectImageUrlForSiteScopedPath, Jr as eventListTreatmentValues, Jt as ICON_CONFIG, K as effectiveHeaderNavLinkStyle, Ki as hexToRgb, Kn as resolveMediaTransformForAspect, Kr as defineFrameCapability, Kt as ACCORDION_TRIGGER_FONT_SCALE, L as createEventSeriesRef, Li as isOnColorBackgroundCandidateToken, Ln as collectPortableMediaReferencesFromContent, Lr as cardListFamilyBlocks, Lt as navLinkOwnsHoverForeground, M as createBlockRef, Mi as surfaceForegroundDeclarations, Mn as boxBackgroundSchema, Mr as backgroundAppearanceColorTokenNames, Mt as NAV_LINK_LETTER_SPACING_MAP, N as createBlocksRef, Ni as surfaceForegroundInputFromResolved, Nn as runtimeBoxBackgroundSchema, Nr as backgroundAppearanceQuickColorTokenNames, Nt as NAV_LINK_PADDING_MAP, O as require_jsx_runtime, Oi as surfaceToneFromForegroundToken, On as deriveSectionGround, Or as generateShadowValue$1, Ot as getComponentShadowVar, P as createCommandRef, Pi as surfaceForegroundStyle, Pn as pageDesignEditorBackgroundOverrideOwner, Pr as parseBackgroundAppearanceColorToken, Pt as NAV_LINK_PADDING_X_MAP, Q as mergeHeaderNavTypographyPreference, Qn as mediaPosterSchema, Qr as introCompositionTreatmentValues, Qt as RESOLVED_BUTTON_DISABLED_DECLARATIONS, R as createFooterRef, Ri as onColorTokenName, Rn as summarizePortableMediaReferences, Rr as cardListKnobBlocks, Rt as navLinkOwnsUnderline, S as pageIdentifierForCommand, Si as resolveTokenOrCssColorValue, Sn as boundaryLayout, Sr as managementMediaLibraryUploadLimitForMimeType, St as MQ_MD_DOWN, Ti as buttonVariantIdSchema, Tn as boundaryRuntimeMetricsForDecorativeTransition, Tr as getDefaultCardVariants, Tt as MQ_TABLET_ONLY, U as createVenueRef, Ui as parseBlockColorToken, Un as normalizeWidthCandidates, Ur as asSiteStyleId, Ut as LABEL_FONT_SIZE_MAP, V as createPageRef, Vi as contrastRatio, Vn as looksLikeUuid$1, Vr as asLayoutVariantKey, Vt as INPUT_FONT_SIZE_MAP, W as refSlug, Wi as parseColorTokenParts, Wn as isExplicitRectCrop, Wr as assertNever$4, Wt as ACCORDION_OPEN_ACCENT_THICKNESS, X as readOpeningForegroundProjection, Xn as isSiteScopedDirectImageStoragePath, Xr as featureCardCompositionTreatmentValues, Xt as generateButtonActionLayoutCss, Y as transparentHeaderForegroundInput, Yi as __toESM, Yn as getImageUrl, Yr as eyebrowTreatmentValues, Yt as ICON_SIZE_PX, Z as getNavLinkPreset, Zn as imageMediaSchema, Zr as headingDecorationColorTokenValues, Zt as generateButtonCss, _ as getSiteCommandMetadata, _i as compileButtonColourStates, _n as arrangementSlotNames, _t as BREAKPOINT_LG, ai as surfaceDecorationColors, an as parseThemeButtonVariantId, ar as mediaTypeDiscriminants, at as resolvePublishedLook, b as entryIdentifierForCommand, bi as resolveOnColorForThemeToken, bt as BREAKPOINT_XL, c as isEventVisibility, ci as backgroundColorStyle, cn as themeButtonVariantClassNames, cr as parseCanonicalMediaIdentifier, ct as GRADIENT_PRESET_IDS, d as stableStringify, di as mergeStyles, dn as skinTokenCssVars, dt as deriveSiteStyleBlockPolicy, ei as offeringsPreviewCompositionTreatmentValues, en as resolvedButtonFocusDeclarations, er as persistableMediaSchema, et as headerRootPaint, f as createDryRunReport, fi as rgbColorValue, fn as buildGoogleFontFamilyQuery, fr as deriveVideoSlotPolicy, ft as themeSchema, g as evaluateSiteCommandExposure, gi as opaqueSurfaceDeclarations, gn as arrangementLookHooks, gr as asRecord$1, gt as renderHeaderPaintTargetRules, h as evaluateSiteCommandBatchExposure, hi as opaqueSurfaceContextFromTheme, hr as getMimeType, ht as getHeaderPaintTargets, ii as resolveSurface, in as generateInteractiveChildInheritanceCSS, ir as resolveManagedMediaReference, it as resolveModeArrangement, j as generateCssVars, ji as DEFAULT_SURFACE_TEXT_COLOR, jn as boxBackgroundOverlaySchema, jr as normalizeCardRole, jt as NAV_LINK_BORDER_RADIUS_MAP, k as require_react, ki as buildThemeTokens, kn as parseCanonicalRuntimeBackground, kr as cardRoleSchema, kt as parseBlockCustomCssRules, l as venueManagementFields, li as borderColorStyle, ln as parseThemeForPersistence, lr as parseMediaIdentifier, lt as getGradientPreset, m as mapEventCommandContent, mi as textColorValue, mn as getFontWidthRange, mt as generateMobileOverlayBackdropFilterFix, ni as tileTreatmentValues, nn as generateEffectsCSS, nr as buildRenderableMediaAssetIndex, nt as readStoredMode, o as classifySdkEventBookingOffer, oi as resolveSurfaceForeground, on as themeButtonExtraClassesWithTrailingIcon, or as mediaIdentifierSchema, ot as requireCuratedSiteStyle, p as parseAndPlanCommandBatchForTypes, pi as textColorStyle, pn as generateFontFaceCss, pr as resolveVideoSelectionIntentForMediaField, pt as generateHeaderScrollTreatmentStyles, q as headerForegroundCandidates, qi as oklchToHexGamut, qn as getDirectImageUrlForRelativePath, qr as defineNoBlockDesignCapability, qt as ACCORDION_TRIGGER_LETTER_SPACING, ri as visibleHeadingDecorationFamilyValues, rn as generateBaseInteractiveCSS, rr as indexRenderableMediaAssets, rt as resolveEffectiveArrangement, si as TokenResolver, sn as themeButtonSizeClassName, sr as buildMediaIdentifierFromFilename, st as gradientToCss, t as classifySdkEventTiming, ti as testimonialsCompositionTreatmentValues, tn as generateDefaultButtonSystem, tr as runtimeMediaSchema, tt as arrangementManifestFromVariants, u as sortRecord, ui as cssVarValue, un as footerModeSchema, ut as parseGradientPresetId, v as blockIdentifierForCommand, vi as formatButtonColourContractError, vn as resolveItemSurface, vr as parseRelativeStoragePath, vt as BREAKPOINT_MD, w as hasConfiguredBookingVertical, wi as PUBLIC_BUTTON_ROLES, wn as sectionFactsForContent, wr as generateCardCoreCss, wt as MQ_SM_UP, x as pageIdentifierForBlockCommand, xi as resolveThemeColorReferenceValue, xr as classifyKnownMimeType, xt as MQ_LG_UP, y as blockOrderIdentifiersForCommand, yi as isCssColorLiteral, yn as resolveLookSlotSurfaces, yr as FILE_SIZE_LIMITS, yt as BREAKPOINT_SM, z as createFormRef, zi as getTextColorForBackground, zn as walkAndCollectImageAttrs, zt as navEffectPolicy } from "../sdk-event-upsert-BamyD2d6.mjs";
3
- import { $ as toBookingTimeZone, $t as unsafeAsCheckoutLineId, At as parsePositiveCents, B as normalizeLocationAddressText, Bt as parseCustomerId, C as parseMailingListBlockId, Ct as publicEventPricingType, D as assessMailingListTargeting, E as parseMailingListRuntimeContext, En as ok, Et as fromArray, F as sameMailingListPlacementTargeting, Ft as formatCurrencyAmount, G as formatBookingDateParts, Gt as parseMembershipId, H as selectCategoryView, Ht as parseDatedOfferingCapacityHoldId, It as parseCurrencyCode, J as formatLocalScheduleTime, Jt as parseSiteId, K as formatBookingTime, Kt as parsePageId, Lt as assertNever, M as parseMailingListPlacementTargeting, Mt as toNonNegativeCents, N as DEFAULT_MAILING_LIST_TARGETING, Nt as unsafeAsNonNegativeCents, O as DEFAULT_MAILING_LIST_SUCCESS_MESSAGE, Ot as isNonNegativeWholeCents$1, P as planMailingListChoicePresentation, Pt as unsafeAsPositiveCents, R as assertAllowedPublicUrl, Rt as formatDurationUnitLabel, S as buildMailingListSignupBlockSourceRef, St as publicEventPricingOptions, T as parseMailingListSignedSourceToken, Tn as err, Tt as resolvePricingOptionsPriceDisplay, U as buildBookingUtcDateWindow, Ut as parseEventSeriesId, V as toLocationCoordinates, Vt as parseDatedOfferingCapacityHoldAuditRef, W as formatBookingDate, X as getLocalScheduleDate, Xt as unsafeAsAppointmentResourceId, Y as getBookingLocalDateKey, Yt as parseUserId, Z as getLocalScheduleTime, _ as resolveWholeSeriesBookingPhase, _t as formatBookingPriceDisplay, at as isSettleableFlexibleBalanceContractStatus, b as parseManagementKey, bn as unsafeAsStaffMemberId, bt as publicEventPricingCurrency, c as resolveSiteVerticalBookingConfig, cn as unsafeAsMediaAssetId, ct as clampConfiguredAmount, dn as unsafeAsPassId, dt as getBookingInstalmentProtectedDepositAmountCents, et as toScheduledBookingDateRange, f as SURFACE_EVENT_PRESET_VALUES, fn as unsafeAsPositiveByteCount, ft as omitZeroAmountFutureRows, g as orderedLiveRunSessions, gt as parseEventPageSurfaceSubject, h as CANCELLED_SESSION_STATUS, ht as resolveFlexibleBalanceInitialPaymentCents, i as areConfiguredBookingVerticalConfigsEqual, in as unsafeAsEventInstanceId, it as isLiveOrderInstalmentPlanStatus, j as parseFooterCompositionV1, jt as toCents, k as parseMailingListProviderScope, kt as parseNonNegativeCents, ln as unsafeAsOccurrenceId, lt as getBookingInstalmentDepositRefundability, m as publicReadFreshnessSeconds, mn as unsafeAsPricingOptionId, mt as resolveFlexibleBalanceDueAt, n as EVENT_PRESET_VOCABULARY, ot as isSettleableOrderInstalmentPlanStatus, p as WHOLE_SERIES_EVENT_PRESET_VALUES, pt as splitAmountWithRemainderInFirst, q as formatLocalScheduleDate, qt as parseRetiredCourseId, r as NAVIGATION_LOCATIONS, rt as validateBookingPaymentOptionKinds, st as addIntervalPreservingMonthAnchor, tn as unsafeAsDemoCapability, tt as toScheduledBookingDateTime, u as EVENT_PRESET_VALUES, ut as getBookingInstalmentPlanIntervalCount, v as createSecret, vt as formatEventPricing, w as parseMailingListContentVersionId, wt as resolveExactOrFreePriceDisplay, x as stableJsonStringify, xt as publicEventPricingDisplay, y as exposeSecret, yt as isPublicEventPricingOptionDisplayable, zt as parseApiKeyId } from "../src-BhrSG8A4.mjs";
4
- import { A as sdkUpsertEventResponseSchema, B as isInternalResolvedLinkValue, C as createHttpClient, D as sdkGetEventResponseSchema, E as sdkConfigureBookingVerticalResponseSchema, F as entryLinkSchema$1, G as sdkGetPageDesignResponseSchema, H as linkSchema, I as externalLinkSchema$1, J as sdkEventOccurrenceResponseSchema, K as sdkSavePageDesignResponseSchema, L as internalLinkSchema, M as linkPayloadSchema, N as RESOLVED_INTERNAL_LINK_ENTITY_TYPES, O as sdkListEventsResponseSchema, P as customLinkSchema$1, R as internalResolvedLinkSchema, S as buildRequestInfo, T as managementTransportError, U as pageLinkSchema$1, V as isResolvedInternalLinkEntityType, W as portablePageDesignSchema, X as sdkReorderResponseSchema, Y as sdkListEventOccurrencesResponseSchema, Z as sdkConfiguredBookingVerticalConfigSchema, _ as buildSettingsUpdateInput, a as prepareLocalMediaForPush, b as isMediaValue, c as writeBinaryFileAtomic, d as normalizeMediaValueToIdentifierOnly, f as walkLocalContentMedia, g as SETTINGS_FILE_FIELDS, h as extractMediaIdentifiers, i as applyLocalMediaPush, j as sdkSettingsUpdateSchema, k as sdkTakeEventOfflineResponseSchema, l as sha256, m as downloadMedia, o as admitBinaryWriteDestination, p as buildStorageUrl, q as sdkDeleteEventOccurrenceResponseSchema, r as syncLocalMediaForPull, s as readStableBinaryFile, t as revalidateLocalMediaPushPlan, u as normalizeMediaIdentifierInput, v as hasOwnSettingsField, w as is404Error, x as ManagementApiError, y as writeMediaManifest, z as internalRouteOnlyLinkSchema } from "../local-sync-B3naCvSc.mjs";
5
- import { n as CliSdkPeerError, r as CLI_VERSION, t as loadConfigFile } from "../load-config-BXspoah3.mjs";
6
- import { a as RichTextDocSchema, c as isRecord$16, i as findUnfilledSentinels, n as buildEntryScaffold, o as isRichTextDoc, r as validateEntryInstance, s as isObjectRecord, t as eventUpsertInputSchema } from "../eventUpsertInputSchema-BNSzkEID.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-DxAHLs05.mjs";
2
+ import { $ as arrangementManifestFromVariants, $n as parseCanonicalMediaIdentifier, $r as backgroundColorStyle, $t as getFontWidthRange, A as pickShadeTowardBackground, Ai as getTextColorForBackground, An as walkAndCollectImageAttrs, At as INPUT_FONT_SIZE_MAP, B as createNavigationRef, Bi as __toESM, Bn as getImageUrl, Br as eyebrowTreatmentValues, Bt as generateButtonCss, C as pagePathForCommand, Ci as surfaceForegroundDeclarations, Cn as boxBackgroundSchema, Cr as backgroundAppearanceColorTokenNames, Ct as MQ_TABLET_ONLY, D as bookingPaymentTermsSchema, Di as expandPalette, Dn as stripStaleTransitionStyleGroup, Dr as resolveEffectiveKnobs, Dt as parseBlockCustomCssRules, E as bookingPaymentCollectionOptionSchema, Ei as surfaceForegroundValue, En as siteChromeBackgroundOverrideOwner, Er as defineBlockDesignMetadata, Et as getComponentShadowVar, F as createContentEntryRef, Fi as parseColorTokenParts, Fn as isExplicitRectCrop, Fr as assertNever$4, Ft as ACCORDION_TRIGGER_FONT_SCALE, G as slugPart, Gn as persistableMediaSchema, Gr as offeringsPreviewCompositionTreatmentValues, Gt as parseThemeButtonVariantId, H as createSiteCommandSiteRef, Hn as imageMediaSchema, Hr as headingDecorationColorTokenValues, Ht as resolvedButtonColourDeclarations, I as createEventCategoryRef, Ii as featuresFromHex, In as parseAspectRatioValue, Ir as defineBlockDesignCapability, It as ACCORDION_TRIGGER_LETTER_SPACING, J as headerLeafTextColor, Jn as indexRenderableMediaAssets, Jr as visibleHeadingDecorationFamilyValues, Jt as themeButtonVariantClassNames, K as effectiveHeaderNavLinkStyle, Kn as runtimeMediaSchema, Kr as testimonialsCompositionTreatmentValues, Kt as themeButtonExtraClassesWithTrailingIcon, L as createEventSeriesRef, Li as hexToRgb, Ln as resolveMediaTransformForAspect, Lr as defineFrameCapability, Lt as ICON_CONFIG, M as createBlockRef, Mi as contrastRatio, Mn as looksLikeUuid$1, Mr as asLayoutVariantKey, Mt as LABEL_FONT_SIZE_MAP, N as createBlocksRef, Ni as parseThemeColorToken, Nn as rotateNormalizedPoint, Nt as ACCORDION_OPEN_ACCENT_THICKNESS, O as require_jsx_runtime, Oi as isOnColorBackgroundCandidateToken, On as collectPortableMediaReferencesFromContent, Or as cardListFamilyBlocks, Ot as parseCustomCssRules, P as createCommandRef, Pi as parseBlockColorToken, Pn as normalizeWidthCandidates, Pr as asSiteStyleId, Pt as ACCORDION_SPACING_MAP, Q as readHeaderNavFontSizePreference, Qn as buildMediaIdentifierFromFilename, Qr as TokenResolver, Qt as generateFontFaceCss, R as createFooterRef, Ri as oklchToHexGamut, Rn as getDirectImageUrlForRelativePath, Rr as defineNoBlockDesignCapability, Rt as ICON_SIZE_PX, S as pageIdentifierForCommand, Si as DEFAULT_SURFACE_TEXT_COLOR, Sn as boxBackgroundOverlaySchema, Sr as normalizeCardRole, St as MQ_SM_UP, Ti as surfaceForegroundStyle, Tn as pageDesignEditorBackgroundOverrideOwner, Tr as parseBackgroundAppearanceColorToken, Tt as getComponentBorderWidthPx, U as createVenueRef, Un as mediaPosterSchema, Ur as introCompositionTreatmentValues, Ut as resolvedButtonFocusDeclarations, V as createPageRef, Vn as isSiteScopedDirectImageStoragePath, Vr as featureCardCompositionTreatmentValues, Vt as RESOLVED_BUTTON_DISABLED_DECLARATIONS, W as refSlug, Wn as mediaSchema, Wr as makeBoundaryId, Wt as generateDefaultButtonSystem, X as readOpeningForegroundProjection, Xn as mediaTypeDiscriminants, Xr as surfaceDecorationColors, Xt as skinTokenCssVars, Y as transparentHeaderForegroundInput, Yn as resolveManagedMediaReference, Yr as resolveSurface, Yt as parseThemeForPersistence, Z as mergeHeaderNavTypographyPreference, Zn as mediaIdentifierSchema, Zr as resolveSurfaceForeground, Zt as buildGoogleFontFamilyQuery, _ as getSiteCommandMetadata, _i as unsafeAsOpaqueButtonColourToken, _n as anglePolygonCss, _r as generateCardCss, _t as BREAKPOINT_SM, ai as textColorValue, an as arrangementLookHooks, at as gradientToCss, b as entryIdentifierForCommand, bi as buildThemeTokens, bn as parseCanonicalRuntimeBackground, br as cardRoleSchema, bt as MQ_MD_DOWN, c as isEventVisibility, ci as compileButtonColourStates, cn as resolveLookSlotSurfaces, ct as parseGradientPresetId, d as stableStringify, di as resolveOnColorForThemeToken, dt as generateHeaderScrollTreatmentStyles, ei as borderColorStyle, er as parseMediaIdentifier, et as readStoredMode, f as createDryRunReport, fi as resolveThemeColorReferenceValue, fn as headerRootPaint, fr as classifyKnownMimeType, ft as generateMobileOverlayBackdropFilterFix, g as evaluateSiteCommandExposure, gi as buttonVariantIdSchema, gn as boundaryRuntimeMetricsForDecorativeTransition, gr as getDefaultCardVariants, gt as BREAKPOINT_MD, h as evaluateSiteCommandBatchExposure, hi as PUBLIC_BUTTON_ROLES, hn as sectionFactsForContent, hr as generateCardCoreCss, ht as BREAKPOINT_LG, ii as textColorStyle, in as generateNavLinkCSS, ir as resolveVideoSelectionIntentForMediaField, it as requireCuratedSiteStyle, j as generateCssVars, ji as ORDINARY_TEXT_MIN_CONTRAST_RATIO, jn as deleteEnvSpecificKeys, jr as asDesignBlockId, jt as INPUT_SPACING_MAP, k as require_react, ki as onColorTokenName, kn as summarizePortableMediaReferences, kr as cardListKnobBlocks, kt as FONT_WEIGHT_MAP, l as venueManagementFields, li as formatButtonColourContractError, lr as parseRelativeStoragePath, lt as deriveSiteStyleBlockPolicy, m as mapEventCommandContent, mi as generateShadowValue, mn as composeBoundary, mr as parseSafeDownloadFilename, mt as renderHeaderPaintTargetRules, ni as mergeStyles, nn as footerForegroundCandidates, nt as resolveModeArrangement, o as classifySdkEventBookingOffer, oi as opaqueSurfaceContextFromTheme, on as arrangementSlotNames, or as getMimeType, ot as GRADIENT_PRESET_IDS, p as parseAndPlanCommandBatchForTypes, pi as resolveTokenOrCssColorValue, pn as boundaryLayout, pr as managementMediaLibraryUploadLimitForMimeType, pt as getHeaderPaintTargets, q as headerForegroundCandidates, qn as buildRenderableMediaAssetIndex, qr as tileTreatmentValues, qt as themeButtonSizeClassName, ri as rgbColorValue, rn as buildTextContrastShadow, rr as deriveVideoSlotPolicy, rt as resolvePublishedLook, si as opaqueSurfaceDeclarations, sn as resolveItemSurface, sr as asRecord$1, st as getGradientPreset, t as classifySdkEventTiming, ti as cssVarValue, tn as generateFooterCss, tt as resolveEffectiveArrangement, u as sortRecord, ui as isCssColorLiteral, ur as FILE_SIZE_LIMITS, ut as themeSchema, v as blockIdentifierForCommand, vi as selectLogoVariant, vn as transitionCatalogueEntries, vr as renderCssDeclarations, vt as BREAKPOINT_XL, w as hasConfiguredBookingVertical, wi as surfaceForegroundInputFromResolved, wn as runtimeBoxBackgroundSchema, wr as backgroundAppearanceQuickColorTokenNames, wt as headerVariantValues, x as pageIdentifierForBlockCommand, xi as defaultThemeTokens, xn as resolveSectionBackground, xr as cardVariantRoleValues, xt as MQ_SM_DOWN, y as blockOrderIdentifiersForCommand, yi as surfaceToneFromForegroundToken, yn as deriveSectionGround, yr as generateShadowValue$1, yt as MQ_LG_UP, z as createFormRef, zi as __commonJSMin, zn as getDirectImageUrlForSiteScopedPath, zr as eventListTreatmentValues, zt as generateButtonActionLayoutCss } from "../sdk-event-upsert-BdvfnCyV.mjs";
3
+ import { A as parseFooterCompositionV1, At as parseNonNegativeCents, B as normalizeLocationAddressText, Bt as parseApiKeyId, C as parseMailingListBlockId, Ct as publicEventPricingOptions, D as assessMailingListTargeting, Dn as ok, Dt as fromArray, E as parseMailingListRuntimeContext, En as err, Et as resolvePricingOptionsPriceDisplay, F as sameMailingListPlacementTargeting, Ft as unsafeAsPositiveCents, G as formatBookingDate, H as selectCategoryView, Ht as parseDatedOfferingCapacityHoldAuditRef, It as formatCurrencyAmount, J as formatLocalScheduleDate, Jt as parseRetiredCourseId, K as formatBookingDateParts, Kt as parseMembershipId, Lt as parseCurrencyCode, M as parseMailingListPlacementTargeting, Mt as toCents, N as DEFAULT_MAILING_LIST_TARGETING, Nt as toNonNegativeCents, O as DEFAULT_MAILING_LIST_SUCCESS_MESSAGE, P as planMailingListChoicePresentation, Pt as unsafeAsNonNegativeCents, Q as getLocalScheduleTime, R as assertAllowedPublicUrl, Rt as assertNever, S as buildMailingListSignupBlockSourceRef, St as publicEventPricingDisplay, T as parseMailingListSignedSourceToken, Tt as resolveExactOrFreePriceDisplay, U as inferSiteDateLocale, Ut as parseDatedOfferingCapacityHoldId, V as toLocationCoordinates, Vt as parseCustomerId, W as buildBookingUtcDateWindow, Wt as parseEventSeriesId, X as getBookingLocalDateKey, Xt as parseUserId, Y as formatLocalScheduleTime, Yt as parseSiteId, Z as getLocalScheduleDate, Zt as unsafeAsAppointmentResourceId, _ as resolveWholeSeriesBookingPhase, _t as parseEventPageSurfaceSubject, an as unsafeAsEventInstanceId, at as isLiveOrderInstalmentPlanStatus, b as parseManagementKey, bt as isPublicEventPricingOptionDisplayable, c as resolveSiteVerticalBookingConfig, ct as addIntervalPreservingMonthAnchor, dt as getBookingInstalmentPlanIntervalCount, en as unsafeAsCheckoutLineId, et as toBookingTimeZone, f as SURFACE_EVENT_PRESET_VALUES, fn as unsafeAsPassId, ft as getBookingInstalmentProtectedDepositAmountCents, g as orderedLiveRunSessions, gt as resolveFlexibleBalanceInitialPaymentCents, h as CANCELLED_SESSION_STATUS, hn as unsafeAsPricingOptionId, ht as resolveFlexibleBalanceDueAt, i as areConfiguredBookingVerticalConfigsEqual, it as validateBookingPaymentOptionKinds, jt as parsePositiveCents, k as parseMailingListProviderScope, kt as isNonNegativeWholeCents$1, ln as unsafeAsMediaAssetId, lt as clampConfiguredAmount, m as publicReadFreshnessSeconds, mt as splitAmountWithRemainderInFirst, n as EVENT_PRESET_VOCABULARY, nn as unsafeAsDemoCapability, nt as toScheduledBookingDateTime, ot as isSettleableFlexibleBalanceContractStatus, p as WHOLE_SERIES_EVENT_PRESET_VALUES, pn as unsafeAsPositiveByteCount, pt as omitZeroAmountFutureRows, q as formatBookingTime, qt as parsePageId, r as NAVIGATION_LOCATIONS, st as isSettleableOrderInstalmentPlanStatus, tt as toScheduledBookingDateRange, u as EVENT_PRESET_VALUES, un as unsafeAsOccurrenceId, ut as getBookingInstalmentDepositRefundability, v as createSecret, vt as formatBookingPriceDisplay, w as parseMailingListContentVersionId, wt as publicEventPricingType, x as stableJsonStringify, xn as unsafeAsStaffMemberId, xt as publicEventPricingCurrency, y as exposeSecret, yt as formatEventPricing, zt as formatDurationUnitLabel } from "../src-yL0DBH7S.mjs";
4
+ import { A as sdkUpsertEventResponseSchema, B as isInternalResolvedLinkValue, C as createHttpClient, D as sdkGetEventResponseSchema, E as sdkConfigureBookingVerticalResponseSchema, F as entryLinkSchema$1, G as sdkGetPageDesignResponseSchema, H as linkSchema, I as externalLinkSchema$1, J as sdkEventOccurrenceResponseSchema, K as sdkSavePageDesignResponseSchema, L as internalLinkSchema, M as linkPayloadSchema, N as RESOLVED_INTERNAL_LINK_ENTITY_TYPES, O as sdkListEventsResponseSchema, P as customLinkSchema$1, R as internalResolvedLinkSchema, S as buildRequestInfo, T as managementTransportError, U as pageLinkSchema$1, V as isResolvedInternalLinkEntityType, W as portablePageDesignSchema, X as sdkReorderResponseSchema, Y as sdkListEventOccurrencesResponseSchema, Z as sdkConfiguredBookingVerticalConfigSchema, _ as buildSettingsUpdateInput, a as prepareLocalMediaForPush, b as isMediaValue, c as writeBinaryFileAtomic, d as normalizeMediaValueToIdentifierOnly, f as walkLocalContentMedia, g as SETTINGS_FILE_FIELDS, h as extractMediaIdentifiers, i as applyLocalMediaPush, j as sdkSettingsUpdateSchema, k as sdkTakeEventOfflineResponseSchema, l as sha256, m as downloadMedia, o as admitBinaryWriteDestination, p as buildStorageUrl, q as sdkDeleteEventOccurrenceResponseSchema, r as syncLocalMediaForPull, s as readStableBinaryFile, t as revalidateLocalMediaPushPlan, u as normalizeMediaIdentifierInput, v as hasOwnSettingsField, w as is404Error, x as ManagementApiError, y as writeMediaManifest, z as internalRouteOnlyLinkSchema } from "../local-sync-CWLEhMZ-.mjs";
5
+ import { n as CliSdkPeerError, r as CLI_VERSION, t as loadConfigFile } from "../load-config-CErro6mj.mjs";
6
+ import { a as RichTextDocSchema, c as isRecord$16, i as findUnfilledSentinels, n as buildEntryScaffold, o as isRichTextDoc, r as validateEntryInstance, s as isObjectRecord, t as eventUpsertInputSchema } from "../eventUpsertInputSchema-Bkafrrjw.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-DW5O751d.mjs";
8
8
  import { config } from "dotenv";
9
9
  import { Command, CommanderError } from "commander";
10
10
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -5423,6 +5423,129 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
5423
5423
  tags: ["billing"],
5424
5424
  auth: "user",
5425
5425
  responseKind: "json"
5426
+ },
5427
+ stripeConnectSetupStart: {
5428
+ path: "/sites/{siteId}/billing/connect/setup",
5429
+ method: "POST",
5430
+ tags: ["site-{siteId}", "stripe-connect"],
5431
+ auth: "user",
5432
+ responseKind: "json",
5433
+ errors: [
5434
+ "validation:invalid_input",
5435
+ "auth:forbidden",
5436
+ "resource:conflict",
5437
+ "server:internal_error"
5438
+ ]
5439
+ },
5440
+ stripeConnectSetupDiscard: {
5441
+ path: "/sites/{siteId}/billing/connect/setup",
5442
+ method: "DELETE",
5443
+ tags: ["site-{siteId}", "stripe-connect"],
5444
+ auth: "user",
5445
+ responseKind: "json",
5446
+ errors: [
5447
+ "validation:invalid_input",
5448
+ "auth:forbidden",
5449
+ "resource:conflict",
5450
+ "server:internal_error"
5451
+ ]
5452
+ },
5453
+ stripeConnectSetupSave: {
5454
+ path: "/sites/{siteId}/billing/connect/setup/save",
5455
+ method: "POST",
5456
+ tags: ["site-{siteId}", "stripe-connect"],
5457
+ auth: "user",
5458
+ responseKind: "json",
5459
+ errors: [
5460
+ "validation:invalid_input",
5461
+ "auth:forbidden",
5462
+ "resource:conflict",
5463
+ "server:internal_error"
5464
+ ]
5465
+ },
5466
+ stripeConnectAccountSession: {
5467
+ path: "/sites/{siteId}/billing/connect/session",
5468
+ method: "POST",
5469
+ tags: ["site-{siteId}", "stripe-connect"],
5470
+ auth: "user",
5471
+ responseKind: "json",
5472
+ errors: [
5473
+ "validation:invalid_input",
5474
+ "auth:forbidden",
5475
+ "resource:conflict",
5476
+ "server:internal_error"
5477
+ ]
5478
+ },
5479
+ stripeConnectStart: {
5480
+ path: "/sites/{siteId}/billing/connect/start",
5481
+ method: "POST",
5482
+ tags: ["site-{siteId}", "stripe-connect"],
5483
+ auth: "user",
5484
+ responseKind: "json",
5485
+ errors: [
5486
+ "validation:invalid_input",
5487
+ "auth:forbidden",
5488
+ "resource:conflict",
5489
+ "server:internal_error"
5490
+ ]
5491
+ },
5492
+ stripeConnectStatus: {
5493
+ path: "/sites/{siteId}/billing/connect/status",
5494
+ method: "GET",
5495
+ tags: ["site-{siteId}", "stripe-connect"],
5496
+ auth: "user",
5497
+ responseKind: "json",
5498
+ errors: [
5499
+ "validation:invalid_input",
5500
+ "auth:forbidden",
5501
+ "resource:conflict",
5502
+ "server:internal_error"
5503
+ ]
5504
+ },
5505
+ stripeAutomaticTaxUpdate: {
5506
+ path: "/sites/{siteId}/billing/automatic-tax",
5507
+ method: "POST",
5508
+ tags: [
5509
+ "site-{siteId}",
5510
+ "billing",
5511
+ "stripe-tax"
5512
+ ],
5513
+ auth: "user",
5514
+ responseKind: "json",
5515
+ errors: [
5516
+ "validation:invalid_input",
5517
+ "auth:forbidden",
5518
+ "resource:not_found",
5519
+ "server:unavailable",
5520
+ "server:internal_error"
5521
+ ]
5522
+ },
5523
+ stripeConnectDisconnect: {
5524
+ path: "/sites/{siteId}/billing/connect/disconnect",
5525
+ method: "DELETE",
5526
+ tags: ["site-{siteId}", "stripe-connect"],
5527
+ auth: "user",
5528
+ responseKind: "json",
5529
+ errors: [
5530
+ "validation:invalid_input",
5531
+ "auth:forbidden",
5532
+ "resource:conflict",
5533
+ "server:internal_error"
5534
+ ]
5535
+ },
5536
+ billingConnectReturn: {
5537
+ path: "/billing/connect/return",
5538
+ method: "GET",
5539
+ auth: "user",
5540
+ responseKind: "void",
5541
+ errors: []
5542
+ },
5543
+ billingConnectRefresh: {
5544
+ path: "/billing/connect/refresh",
5545
+ method: "GET",
5546
+ auth: "user",
5547
+ responseKind: "void",
5548
+ errors: []
5426
5549
  }
5427
5550
  });
5428
5551
 
@@ -5590,6 +5713,14 @@ const PAGE_SURFACE_EDITOR_ENDPOINT_DEFINITIONS = {
5590
5713
  * person when nothing is attached to them.
5591
5714
  */
5592
5715
  const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
5716
+ getBookingPerson: {
5717
+ path: "/sites/{siteId}/bookings/people/{personId}",
5718
+ method: "GET",
5719
+ tags: ["site-{siteId}", "customers-{siteId}"],
5720
+ auth: "user",
5721
+ responseKind: "json",
5722
+ errors: ["resource:not_found", "server:internal_error"]
5723
+ },
5593
5724
  listPeople: {
5594
5725
  path: "/sites/{siteId}/bookings/people",
5595
5726
  method: "GET",
@@ -8829,57 +8960,6 @@ const ENDPOINT_DEFINITIONS = {
8829
8960
  errors: [],
8830
8961
  responseKind: "json"
8831
8962
  },
8832
- stripeConnectStart: {
8833
- path: "/sites/{siteId}/billing/connect/start",
8834
- method: "POST",
8835
- tags: ["site-{siteId}", "stripe-connect"],
8836
- auth: "user",
8837
- responseKind: "json"
8838
- },
8839
- stripeConnectStatus: {
8840
- path: "/sites/{siteId}/billing/connect/status",
8841
- method: "GET",
8842
- tags: ["site-{siteId}", "stripe-connect"],
8843
- auth: "user",
8844
- responseKind: "json"
8845
- },
8846
- stripeAutomaticTaxUpdate: {
8847
- path: "/sites/{siteId}/billing/automatic-tax",
8848
- method: "POST",
8849
- tags: [
8850
- "site-{siteId}",
8851
- "billing",
8852
- "stripe-tax"
8853
- ],
8854
- auth: "user",
8855
- responseKind: "json",
8856
- errors: [
8857
- "validation:invalid_input",
8858
- "auth:forbidden",
8859
- "resource:not_found",
8860
- "server:unavailable",
8861
- "server:internal_error"
8862
- ]
8863
- },
8864
- stripeConnectDisconnect: {
8865
- path: "/sites/{siteId}/billing/connect/disconnect",
8866
- method: "DELETE",
8867
- tags: ["site-{siteId}", "stripe-connect"],
8868
- auth: "user",
8869
- responseKind: "json"
8870
- },
8871
- billingConnectReturn: {
8872
- path: "/billing/connect/return",
8873
- method: "GET",
8874
- auth: "user",
8875
- responseKind: "void"
8876
- },
8877
- billingConnectRefresh: {
8878
- path: "/billing/connect/refresh",
8879
- method: "GET",
8880
- auth: "user",
8881
- responseKind: "void"
8882
- },
8883
8963
  importSiteBackup: {
8884
8964
  path: "/sites/{siteId}/backup/import",
8885
8965
  method: "POST",
@@ -9785,6 +9865,7 @@ const ENDPOINT_DEFINITIONS = {
9785
9865
  errors: [
9786
9866
  "validation:invalid_input",
9787
9867
  "resource:not_found",
9868
+ "resource:conflict",
9788
9869
  "server:internal_error"
9789
9870
  ]
9790
9871
  },
@@ -9810,6 +9891,7 @@ const ENDPOINT_DEFINITIONS = {
9810
9891
  errors: [
9811
9892
  "validation:invalid_input",
9812
9893
  "resource:not_found",
9894
+ "resource:conflict",
9813
9895
  "server:internal_error"
9814
9896
  ]
9815
9897
  },
@@ -15214,15 +15296,15 @@ function createRepeaterGridColumnField(options) {
15214
15296
  ui: { hidden: true }
15215
15297
  };
15216
15298
  }
15217
- function withRepeaterGridSpanField(fields$2, options) {
15299
+ function withRepeaterGridSpanField(fields$1, options) {
15218
15300
  const spanFieldId = resolveRepeaterGridSpanFieldId(options);
15219
- if (fields$2.some((field) => field.id === spanFieldId)) {
15220
- return [...fields$2];
15301
+ if (fields$1.some((field) => field.id === spanFieldId)) {
15302
+ return [...fields$1];
15221
15303
  }
15222
- return [createRepeaterGridSpanField(options), ...fields$2];
15304
+ return [createRepeaterGridSpanField(options), ...fields$1];
15223
15305
  }
15224
- function withRepeaterGridPositionFields(fields$2, options) {
15225
- let nextFields = [...fields$2];
15306
+ function withRepeaterGridPositionFields(fields$1, options) {
15307
+ let nextFields = [...fields$1];
15226
15308
  const rowFieldId = resolveRepeaterGridRowFieldId(options?.row);
15227
15309
  if (!nextFields.some((field) => field.id === rowFieldId)) {
15228
15310
  nextFields = [createRepeaterGridRowField(options?.row), ...nextFields];
@@ -16267,11 +16349,11 @@ var FragmentConfigError = class extends Error {
16267
16349
  };
16268
16350
  function defineFragment(config$1) {
16269
16351
  const parsed = fragmentConfigSchema.parse(config$1);
16270
- const fields$2 = parseFieldDefinitions(parsed.fields);
16271
- validateFieldDefinitions(fields$2, parsed.id);
16352
+ const fields$1 = parseFieldDefinitions(parsed.fields);
16353
+ validateFieldDefinitions(fields$1, parsed.id);
16272
16354
  return {
16273
16355
  ...parsed,
16274
- fields: fields$2.map((field) => cloneFieldDefinition$1(field)),
16356
+ fields: fields$1.map((field) => cloneFieldDefinition$1(field)),
16275
16357
  layout: parsed.layout.map((node) => ({ ...node }))
16276
16358
  };
16277
16359
  }
@@ -16286,9 +16368,9 @@ function scopeFragmentLayout(fragment, scope) {
16286
16368
  const normalizedScope = scope.trim();
16287
16369
  return fragment.layout.map((node) => cloneAndScopeNode(node, normalizedScope));
16288
16370
  }
16289
- function validateFieldDefinitions(fields$2, fragmentId) {
16371
+ function validateFieldDefinitions(fields$1, fragmentId) {
16290
16372
  const seen = new Set();
16291
- for (const field of fields$2) {
16373
+ for (const field of fields$1) {
16292
16374
  if (field.id.includes(".")) {
16293
16375
  throw new FragmentConfigError(`Field "${field.id}" in fragment "${fragmentId}" should not include dot notation; the builder scopes fields automatically.`);
16294
16376
  }
@@ -16457,7 +16539,7 @@ var FragmentCompositionError = class extends Error {
16457
16539
  const DOT_SCOPE_REGEX = /^[A-Za-z0-9_.-]*$/;
16458
16540
  function materializeFragment(config$1) {
16459
16541
  const scope = normalizeScope(config$1.scope);
16460
- const fields$2 = scopeFragmentFields(config$1.fragment, scope);
16542
+ const fields$1 = scopeFragmentFields(config$1.fragment, scope);
16461
16543
  const layout = scopeFragmentLayout(config$1.fragment, scope);
16462
16544
  const fieldPriority = config$1.fieldPriority ?? 0;
16463
16545
  let data;
@@ -16474,7 +16556,7 @@ function materializeFragment(config$1) {
16474
16556
  return {
16475
16557
  fragment: config$1.fragment,
16476
16558
  scope,
16477
- fields: fields$2,
16559
+ fields: fields$1,
16478
16560
  layout,
16479
16561
  data,
16480
16562
  fieldPriority
@@ -16560,6 +16642,71 @@ function buildFragmentDataLoaders(composition$1) {
16560
16642
  return loaders;
16561
16643
  }
16562
16644
 
16645
+ //#endregion
16646
+ //#region ../blocks/src/system/transforms/registry/core.ts
16647
+ /**
16648
+ * Safely narrows unknown values to partial object shapes used by transforms.
16649
+ * Arrays are intentionally excluded.
16650
+ */
16651
+ function asPartialObject(value) {
16652
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
16653
+ return undefined;
16654
+ }
16655
+ return value;
16656
+ }
16657
+ function runTransforms(value, transforms, context, registry) {
16658
+ if (!transforms?.length) return value;
16659
+ return transforms.reduce((acc, step) => {
16660
+ const transform = registry.get(step.id);
16661
+ if (!transform) {
16662
+ throw new Error(`Unknown transform: ${step.id}`);
16663
+ }
16664
+ const options = transform.schema ? transform.schema.parse(step.options ?? {}) : step.options ?? {};
16665
+ return transform.run(acc, options, context);
16666
+ }, value);
16667
+ }
16668
+ function createTransformRegistry(definitions$1) {
16669
+ const registry = new Map();
16670
+ for (const definition$1 of definitions$1) {
16671
+ if (registry.has(definition$1.id)) continue;
16672
+ registry.set(definition$1.id, definition$1);
16673
+ }
16674
+ return registry;
16675
+ }
16676
+ function mergeTransformRegistries(...registries) {
16677
+ const merged = new Map();
16678
+ for (const registry of registries) {
16679
+ for (const [id, definition$1] of registry.entries()) {
16680
+ if (merged.has(id)) continue;
16681
+ merged.set(id, definition$1);
16682
+ }
16683
+ }
16684
+ return merged;
16685
+ }
16686
+
16687
+ //#endregion
16688
+ //#region ../blocks/src/system/customize/testimonialCount.ts
16689
+ /** The loader consumes the content-stage plan; it never selects a Look. */
16690
+ function testimonialLoaderLimit(content) {
16691
+ if (typeof content._quoteLoaderLimit === "string") return content._quoteLoaderLimit;
16692
+ return typeof content.maxEntries === "string" || typeof content.maxEntries === "number" ? String(content.maxEntries) : "6";
16693
+ }
16694
+
16695
+ //#endregion
16696
+ //#region ../blocks/src/system/node/fragments/lookSlot.ts
16697
+ /** Compiler-owned slots are absent for legacy Looks, preserving their HTML. */
16698
+ const lookSlot = (name) => ({ "data-slot": { $bind: { from: `content._lookSlots.${name}` } } });
16699
+ const lookLeadSlotTransform = {
16700
+ id: "look.leadSlot",
16701
+ kind: "string",
16702
+ run: (value, _options, context) => asPartialObject(context.viewModel?.content)?._lookSlots === undefined ? undefined : value === 0 ? "lead" : "item"
16703
+ };
16704
+ const lookQuoteLimitTransform = {
16705
+ id: "look.quoteLimit",
16706
+ kind: "string",
16707
+ run: (value) => testimonialLoaderLimit(asPartialObject(value) ?? {})
16708
+ };
16709
+
16563
16710
  //#endregion
16564
16711
  //#region ../blocks/src/utils/env.ts
16565
16712
  /**
@@ -16809,6 +16956,7 @@ const bodyCopyFragment = defineFragment({
16809
16956
  ],
16810
16957
  layout: stack({
16811
16958
  gap: "md",
16959
+ ...lookSlot("copy"),
16812
16960
  className: "body-copy-container",
16813
16961
  align: { $bind: {
16814
16962
  from: "content.alignment",
@@ -16817,6 +16965,7 @@ const bodyCopyFragment = defineFragment({
16817
16965
  } }
16818
16966
  }, [text({
16819
16967
  as: "h2",
16968
+ ...lookSlot("heading"),
16820
16969
  className: { $bind: {
16821
16970
  from: "content.alignment",
16822
16971
  transforms: [{
@@ -16825,81 +16974,24 @@ const bodyCopyFragment = defineFragment({
16825
16974
  }],
16826
16975
  fallback: "body-copy-heading"
16827
16976
  } }
16828
- }, when("content.heading"), bind("content.heading")), richText({ className: { $bind: {
16829
- from: "content.alignment",
16830
- transforms: [{
16831
- id: "ui.bodyClassFromAlignment",
16832
- options: { base: "body-copy-body rb-prose rb-max-w-none" }
16833
- }],
16834
- fallback: "body-copy-body rb-prose rb-max-w-none"
16835
- } } }, bind("content.body"))])
16977
+ }, when("content.heading", { authoringPresence: {
16978
+ kind: "recover-empty-when-active",
16979
+ placeholder: "Add heading"
16980
+ } }), bind("content.heading")), richText({
16981
+ ...lookSlot("item-body"),
16982
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
16983
+ lookSlots: { $bind: { from: "content._lookSlots" } },
16984
+ className: { $bind: {
16985
+ from: "content.alignment",
16986
+ transforms: [{
16987
+ id: "ui.bodyClassFromAlignment",
16988
+ options: { base: "body-copy-body rb-prose rb-max-w-none" }
16989
+ }],
16990
+ fallback: "body-copy-body rb-prose rb-max-w-none"
16991
+ } }
16992
+ }, bind("content.body"))])
16836
16993
  });
16837
16994
 
16838
- //#endregion
16839
- //#region ../blocks/src/system/transforms/registry/core.ts
16840
- /**
16841
- * Safely narrows unknown values to partial object shapes used by transforms.
16842
- * Arrays are intentionally excluded.
16843
- */
16844
- function asPartialObject(value) {
16845
- if (typeof value !== "object" || value === null || Array.isArray(value)) {
16846
- return undefined;
16847
- }
16848
- return value;
16849
- }
16850
- function runTransforms(value, transforms, context, registry) {
16851
- if (!transforms?.length) return value;
16852
- return transforms.reduce((acc, step) => {
16853
- const transform = registry.get(step.id);
16854
- if (!transform) {
16855
- throw new Error(`Unknown transform: ${step.id}`);
16856
- }
16857
- const options = transform.schema ? transform.schema.parse(step.options ?? {}) : step.options ?? {};
16858
- return transform.run(acc, options, context);
16859
- }, value);
16860
- }
16861
- function createTransformRegistry(definitions$1) {
16862
- const registry = new Map();
16863
- for (const definition$1 of definitions$1) {
16864
- if (registry.has(definition$1.id)) continue;
16865
- registry.set(definition$1.id, definition$1);
16866
- }
16867
- return registry;
16868
- }
16869
- function mergeTransformRegistries(...registries) {
16870
- const merged = new Map();
16871
- for (const registry of registries) {
16872
- for (const [id, definition$1] of registry.entries()) {
16873
- if (merged.has(id)) continue;
16874
- merged.set(id, definition$1);
16875
- }
16876
- }
16877
- return merged;
16878
- }
16879
-
16880
- //#endregion
16881
- //#region ../blocks/src/system/customize/testimonialCount.ts
16882
- /** The loader consumes the content-stage plan; it never selects a Look. */
16883
- function testimonialLoaderLimit(content) {
16884
- if (typeof content._quoteLoaderLimit === "string") return content._quoteLoaderLimit;
16885
- return typeof content.maxEntries === "string" || typeof content.maxEntries === "number" ? String(content.maxEntries) : "6";
16886
- }
16887
-
16888
- //#endregion
16889
- //#region ../blocks/src/system/node/fragments/lookSlot.ts
16890
- /** Compiler-owned slots are absent for legacy Looks, preserving their HTML. */
16891
- const lookSlot = (name) => ({ "data-slot": { $bind: { from: `content._lookSlots.${name}` } } });
16892
- const lookLeadSlotTransform = {
16893
- id: "look.leadSlot",
16894
- kind: "string",
16895
- run: (value, _options, context) => asPartialObject(context.viewModel?.content)?._lookSlots === undefined ? undefined : value === 0 ? "lead" : "item"
16896
- };
16897
- const lookQuoteLimitTransform = {
16898
- id: "look.quoteLimit",
16899
- kind: "string",
16900
- run: (value) => testimonialLoaderLimit(asPartialObject(value) ?? {})
16901
- };
16902
-
16903
16995
  //#endregion
16904
16996
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
16905
16997
  const BACKGROUND_FRAME_BASE_CLASS = "rb-background-frame rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-isolate rb-pointer-events-none";
@@ -17825,160 +17917,6 @@ function footerNav(opts) {
17825
17917
  return buildFooterNavAll(common);
17826
17918
  }
17827
17919
 
17828
- //#endregion
17829
- //#region ../theme-core/src/navigation/generateNavLinkCSS.ts
17830
- /**
17831
- * Generate complete CSS for nav links from a NavLinkStyle configuration
17832
- */
17833
- function generateNavLinkCSS(options) {
17834
- const { themeId, tokens, theme, style, className } = options;
17835
- const surfaceDependent = options.surfaceDependent === true && !navLinkOwnsHoverForeground(style);
17836
- const overriddenSurface = options.surfaceDependent === true && options.surfaceRestingColor === true;
17837
- const surfaceRestingColor = surfaceDependent || overriddenSurface;
17838
- const selector = `:where([data-theme-scope="${themeId}"]) .${className}`;
17839
- const activeSelector = `${selector}:active, ${selector}[data-active="true"]`;
17840
- const baseRules = navBaseRules(style, tokens, theme, surfaceRestingColor, overriddenSurface);
17841
- const hoverRules = navHoverRules(style, tokens, surfaceDependent);
17842
- const activeRules = surfaceDependent ? [`color: ${surfaceForegroundValue("linkHover", tokens.getColor(style.colorToken))};`] : [];
17843
- const authoredColor = tokens.getColor(style.colorToken);
17844
- const effectsCss = style.effects ? generateEffectsCSS({
17845
- themeId,
17846
- variantId: className,
17847
- effects: surfaceDependent ? withoutSurfaceTextColorEffects(style.effects) : style.effects,
17848
- elementConfig: {
17849
- background: { type: "transparent" },
17850
- textColorToken: style.colorToken || "text"
17851
- },
17852
- tokens,
17853
- theme
17854
- }) : "";
17855
- const underlineColorCss = surfaceDependent && navLinkOwnsUnderline(style) ? `\n${selector}::after {\n background: ${surfaceForegroundValue("link", authoredColor)};\n}\n` : "";
17856
- return [
17857
- cssRule(selector, baseRules),
17858
- effectsCss,
17859
- cssRule(`${selector}:hover`, hoverRules),
17860
- cssRule(activeSelector, activeRules),
17861
- underlineColorCss,
17862
- navLinkFocusVisibleCss(selector, style, theme, tokens, surfaceRestingColor, overriddenSurface),
17863
- generateInteractiveChildInheritanceCSS(selector)
17864
- ].join("");
17865
- }
17866
- function navBaseRules(style, tokens, theme, surfaceRestingColor, overriddenSurface) {
17867
- const typographyRules = generateBaseInteractiveCSS({
17868
- typography: {
17869
- typography: style.typography,
17870
- fontWeight: style.fontWeight,
17871
- textTransform: style.textTransform,
17872
- italic: style.italic
17873
- },
17874
- padding: style.padding ? NAV_LINK_PADDING_MAP[style.padding] : undefined,
17875
- borderRadius: style.borderRadius ? NAV_LINK_BORDER_RADIUS_MAP[style.borderRadius] : undefined,
17876
- includeTransition: true,
17877
- includeFlexCenter: false
17878
- });
17879
- const contrastShadow = navContrastShadow(style, theme, overriddenSurface);
17880
- return [
17881
- ...typographyRules,
17882
- ...style.paddingX ? [`padding-left: ${NAV_LINK_PADDING_X_MAP[style.paddingX]};`, `padding-right: ${NAV_LINK_PADDING_X_MAP[style.paddingX]};`] : [],
17883
- ...style.textSize ? [`font-size: ${NAV_LINK_TEXT_SIZE_MAP[style.textSize]};`] : [],
17884
- ...style.letterSpacing && style.letterSpacing !== "normal" ? [`letter-spacing: ${NAV_LINK_LETTER_SPACING_MAP[style.letterSpacing]};`] : [],
17885
- ...surfaceRestingColor ? [`color: ${surfaceForegroundValue("link", tokens.getColor(style.colorToken))};`] : style.colorToken ? [`color: ${tokens.getColor(style.colorToken)};`] : [],
17886
- ...contrastShadow ? [`text-shadow: ${contrastShadow};`] : []
17887
- ];
17888
- }
17889
- function navHoverRules(style, tokens, surfaceDependent) {
17890
- if (surfaceDependent) return [`color: ${surfaceForegroundValue("linkHover", tokens.getColor(style.colorToken))};`, ...navLinkOwnsUnderline(style) ? [] : ["text-decoration-line: var(--rb-surface-link-hover-decoration, none);"]];
17891
- return style.hoverColorToken && !style.effects?.hover?.length ? [`color: ${tokens.getColor(style.hoverColorToken)};`] : [];
17892
- }
17893
- function cssRule(selector, rules) {
17894
- return rules.length > 0 ? `\n${selector} {\n ${rules.join("\n ")}\n}\n` : "";
17895
- }
17896
- function navContrastShadow(style, theme, overriddenSurface) {
17897
- return overriddenSurface ? null : buildTextContrastShadow({
17898
- theme,
17899
- colorToken: style.colorToken,
17900
- treatment: style.contrastTreatment
17901
- });
17902
- }
17903
- function withoutSurfaceTextColorEffects(effects) {
17904
- const withoutColor = (items) => items?.filter((effect) => navEffectPolicy(effect.effectId) !== "text-colour");
17905
- return {
17906
- base: withoutColor(effects.base),
17907
- hover: withoutColor(effects.hover),
17908
- active: withoutColor(effects.active),
17909
- focus: withoutColor(effects.focus)
17910
- };
17911
- }
17912
- /**
17913
- * Keyboard focus indicator for nav links, in the header, the footer and header
17914
- * dropdown menus — the three surfaces `generateNavLinkCSS` serves.
17915
- *
17916
- * Emitted unconditionally rather than as an effect, because focus visibility is
17917
- * a floor rather than a style choice. Only the interaction-palette pill ever
17918
- * wrote an `effects.focus` group, so every other nav — every `quiet` palette,
17919
- * every footer, every dropdown — previously fell back to whatever outline the
17920
- * browser drew.
17921
- *
17922
- * The outline takes the link's own resolved colour, so on a header that adapts
17923
- * to the section it floats over it moves with the adaptation instead of
17924
- * asserting a brand colour against an unknown backdrop.
17925
- *
17926
- * Where the style asks for `soft-glow`, the same halo goes on the outline. That
17927
- * treatment exists because the theme has already conceded the resolved colour
17928
- * alone is not reliable over an unpredictable backdrop — a hero photograph with
17929
- * mixed luminance. Without it the text would stay legible by its halo while the
17930
- * focus ring, which is the part with a contrast requirement of its own, would
17931
- * not.
17932
- *
17933
- * A style that also paints a focus pill keeps it: this adds an outline around
17934
- * that pill rather than replacing it.
17935
- */
17936
- function navLinkFocusVisibleCss(selector, style, theme, tokens, surfaceRestingColor, overriddenSurface) {
17937
- const color = surfaceRestingColor ? surfaceForegroundValue("link", tokens.getColor(style.colorToken)) : tokens.getColor(style.colorToken);
17938
- const halo = navContrastShadow(style, theme, overriddenSurface);
17939
- return `
17940
- ${selector}:focus-visible {
17941
- outline: 2px solid ${color};
17942
- outline-offset: ${focusOutlineOffset(selector)};${halo ? `\n box-shadow: ${halo};` : ""}
17943
- }
17944
- `;
17945
- }
17946
- /**
17947
- * Dropdown items are full-width inside a panel with no horizontal padding, so
17948
- * an outset outline would paint over and past the panel's own border. Keeping
17949
- * it flush is the only way it reads as belonging to the item.
17950
- */
17951
- function focusOutlineOffset(selector) {
17952
- return selector.includes("nav-dropdown-link") ? "-2px" : "3px";
17953
- }
17954
- function buildTextContrastShadow(input) {
17955
- if (input.treatment !== "soft-glow") return null;
17956
- return isLikelyLightColorToken(input.theme, input.colorToken) ? "0 1px 3px rgb(0 0 0 / 0.55), 0 0 18px rgb(0 0 0 / 0.38)" : "0 1px 3px rgb(255 255 255 / 0.72), 0 0 18px rgb(255 255 255 / 0.5)";
17957
- }
17958
- function isLikelyLightColorToken(theme, colorToken) {
17959
- const hex = resolveColorTokenHex(theme, colorToken);
17960
- if (hex) {
17961
- try {
17962
- return featuresFromHex(hex).Y >= .5;
17963
- } catch {}
17964
- }
17965
- const normalizedToken = colorToken?.toLowerCase() ?? "";
17966
- if (normalizedToken.includes("foreground") || normalizedToken.startsWith("on") || normalizedToken.includes("white") || normalizedToken.endsWith("-50") || normalizedToken.endsWith("-100")) {
17967
- return true;
17968
- }
17969
- if (normalizedToken.includes("black") || normalizedToken.endsWith("-800") || normalizedToken.endsWith("-900") || normalizedToken.endsWith("-950")) {
17970
- return false;
17971
- }
17972
- return theme.palette.meta.mode === "dark";
17973
- }
17974
- function resolveColorTokenHex(theme, colorToken) {
17975
- if (!colorToken) return null;
17976
- if (colorToken === "white") return "#ffffff";
17977
- if (colorToken === "black") return "#000000";
17978
- if (colorToken === "transparent") return null;
17979
- return expandPalette(theme.palette)[colorToken] ?? null;
17980
- }
17981
-
17982
17920
  //#endregion
17983
17921
  //#region ../theme-core/src/header/navDropdownSizing.ts
17984
17922
  const NAV_DROPDOWN_MIN_WIDTH_REM = 12;
@@ -18574,129 +18512,6 @@ function applyAlpha(color, opacity) {
18574
18512
  return color;
18575
18513
  }
18576
18514
 
18577
- //#endregion
18578
- //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
18579
- function effectiveFooterNavLinkStyle(footer) {
18580
- if (!footer) return null;
18581
- if (footer.navLinkStyle) return footer.navLinkStyle;
18582
- const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
18583
- if (!basePreset) return null;
18584
- return {
18585
- ...basePreset,
18586
- fontWeight: footer.navWeight ?? basePreset.fontWeight,
18587
- colorToken: footer.navColor?.trim() || basePreset.colorToken
18588
- };
18589
- }
18590
- function footerForegroundCandidates(footer, proseHoverCandidate) {
18591
- if (!footer) return {};
18592
- const style = effectiveFooterNavLinkStyle(footer);
18593
- return {
18594
- text: footer.background?.textColor,
18595
- link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
18596
- linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
18597
- };
18598
- }
18599
-
18600
- //#endregion
18601
- //#region ../theme-core/src/footer/generateFooterCss.ts
18602
- /**
18603
- * Generate CSS for footer navigation styling
18604
- *
18605
- * Similar to header nav but with independent configuration and no advanced effects
18606
- */
18607
- function generateFooterCss(options) {
18608
- const { themeId, theme } = options;
18609
- const tokens = new TokenResolver(theme);
18610
- const footer = theme.footer;
18611
- const cssChunks = [];
18612
- cssChunks.push(generateFooterNavLinkStyles(footer, themeId, tokens, theme));
18613
- cssChunks.push(generateFooterLogoStyles(theme, themeId));
18614
- cssChunks.push(generateFooterBottomTextLinkStyles(footer, themeId, tokens));
18615
- return cssChunks.filter(Boolean).join("\n\n");
18616
- }
18617
- function generateFooterLogoStyles(theme, themeId) {
18618
- const size = resolveFooterLogoSize(theme.footer, theme.header.logo);
18619
- const height = footerLogoHeight(size);
18620
- const scope = `:where([data-theme-scope="${themeId}"])`;
18621
- return `
18622
- ${scope} .footer-logo img {
18623
- width: auto;
18624
- height: ${height};
18625
- }
18626
- `;
18627
- }
18628
- function resolveFooterLogoSize(footer, headerLogo) {
18629
- const brandDrivenSize = footerLogoSizeFromHeaderLogo(headerLogo);
18630
- return footer.logo?.maxHeight ?? brandDrivenSize ?? footer.logo?.size ?? "md";
18631
- }
18632
- function footerLogoSizeFromHeaderLogo(headerLogo) {
18633
- const size = headerLogo?.size;
18634
- switch (size) {
18635
- case "compact": return "sm";
18636
- case "standard": return "md";
18637
- case "generous": return "lg";
18638
- case "display": return "xl";
18639
- case "auto":
18640
- case undefined: return null;
18641
- default: {
18642
- const _exhaustive = size;
18643
- return _exhaustive;
18644
- }
18645
- }
18646
- }
18647
- function footerLogoHeight(size) {
18648
- switch (size) {
18649
- case "sm": return "2.5rem";
18650
- case "md": return "4rem";
18651
- case "lg": return "5rem";
18652
- case "xl": return "6rem";
18653
- default: {
18654
- const _exhaustive = size;
18655
- return _exhaustive;
18656
- }
18657
- }
18658
- }
18659
- /**
18660
- * Generate navigation link styles for footer
18661
- *
18662
- * Uses the composable NavLinkStyle system with backward compatibility for
18663
- * legacy navStyle, navWeight, and navColor settings.
18664
- */
18665
- function generateFooterNavLinkStyles(footer, themeId, tokens, theme) {
18666
- const style = effectiveFooterNavLinkStyle(footer);
18667
- if (!style) return "";
18668
- return generateNavLinkCSS({
18669
- themeId,
18670
- tokens,
18671
- theme,
18672
- style,
18673
- className: "footer-nav-link",
18674
- surfaceDependent: true,
18675
- surfaceRestingColor: footer.background?.contentOwner === siteChromeBackgroundOverrideOwner
18676
- });
18677
- }
18678
- function generateFooterBottomTextLinkStyles(footer, themeId, tokens) {
18679
- const style = footer.bottomTextLinkStyle;
18680
- if (!style) return "";
18681
- const scope = `:where([data-theme-scope="${themeId}"])`;
18682
- const selectors = [`${scope} .block-site-footer [data-footer-region="bottom"] .rb-prose a`, `${scope} .block-siteFooter [data-footer-region="bottom"] .rb-prose a`];
18683
- const baseRules = [];
18684
- const decorationColorToken = style.decorationColorToken?.trim();
18685
- if (decorationColorToken) {
18686
- baseRules.push(`text-decoration-color: ${tokens.getColor(decorationColorToken)};`);
18687
- }
18688
- if (style.underline === true) {
18689
- baseRules.push("text-decoration: underline;");
18690
- } else if (style.underline === false) {
18691
- baseRules.push("text-decoration: none;");
18692
- }
18693
- const cssChunks = [];
18694
- if (baseRules.length > 0) {
18695
- cssChunks.push(`\n${selectors.join(",\n")} {\n ${baseRules.join("\n ")}\n}\n`);
18696
- }
18697
- return cssChunks.join("\n");
18698
- }
18699
-
18700
18515
  //#endregion
18701
18516
  //#region ../blocks/src/system/fields/backgroundContent.ts
18702
18517
  /**
@@ -18817,7 +18632,12 @@ function resolveRuntimeSectionSurface(value, context, options) {
18817
18632
  }
18818
18633
  function arrangementSurfaceInk(foreground, context) {
18819
18634
  if (context.data?._lookSlots === undefined) return {};
18820
- const decorations = surfaceDecorationColors(foreground, context.theme.palette);
18635
+ return surfaceInkStyles(foreground, context.theme.palette);
18636
+ }
18637
+ /** Decoration roles already resolved by the surface owner, shared with footer arrangements. */
18638
+ function surfaceInkStyles(foreground, palette) {
18639
+ if (foreground.kind === "unknown") return {};
18640
+ const decorations = surfaceDecorationColors(foreground, palette);
18821
18641
  return {
18822
18642
  "--rb-surface-muted-color": foreground.roles.muted ?? foreground.roles.text,
18823
18643
  ...decorations ? {
@@ -19517,51 +19337,50 @@ const boxStylesTransforms = [
19517
19337
 
19518
19338
  //#endregion
19519
19339
  //#region ../blocks/src/system/node/fragments/responsiveTwoColumn.ts
19520
- function responsiveTwoColumn({ image, text: text$1, ratioFrom, imagePositionFrom, gapClassName = "rb-gap-6", gapFrom, gapFallback = "comfortable", containerClassName = "rb-flex rb-flex-col rb-md-flex-row", imageWrapperClassName = "rb-w-full rb-shrink-0", textWrapperClassName = "rb-w-full rb-min-w-0 rb-flex-1" }) {
19521
- const useStaticGap = !gapFrom;
19522
- const baseClass = useStaticGap ? `${containerClassName} ${gapClassName}`.trim() : containerClassName;
19523
- const props$1 = { className: { $bind: {
19524
- from: imagePositionFrom,
19525
- transforms: [{
19526
- id: "ui.twoColumnContainerClass",
19527
- options: {
19528
- base: baseClass,
19529
- reverseClass: "rb-md-flex-row-reverse"
19530
- }
19531
- }],
19532
- fallback: baseClass
19533
- } } };
19534
- if (gapFrom) {
19535
- props$1.style = { gap: { $bind: {
19536
- from: gapFrom,
19340
+ /** The shared two-column shell keeps Look hooks opt-in and absent for legacy content. */
19341
+ function responsiveTwoColumn(config$1) {
19342
+ return el("div", twoColumnProps(config$1), [twoColumnWrapper(config$1, "image", config$1.image), twoColumnWrapper(config$1, "text", config$1.text)]);
19343
+ }
19344
+ function twoColumnProps(config$1) {
19345
+ const base = `${config$1.containerClassName ?? "rb-flex rb-flex-col rb-md-flex-row"} ${config$1.gapFrom ? "" : config$1.gapClassName ?? "rb-gap-6"}`.trim();
19346
+ const fallback = config$1.gapFallback ?? "comfortable";
19347
+ return {
19348
+ ...config$1.lookSlots ? lookSlot("frame") : {},
19349
+ className: { $bind: {
19350
+ from: config$1.imagePositionFrom,
19537
19351
  transforms: [{
19538
- id: "boxStyles.semanticGapValue",
19539
- options: { fallback: gapFallback }
19352
+ id: "ui.twoColumnContainerClass",
19353
+ options: {
19354
+ base,
19355
+ reverseClass: "rb-md-flex-row-reverse"
19356
+ }
19540
19357
  }],
19541
- fallback: GAP_VALUE_MAP[gapFallback]
19542
- } } };
19543
- }
19544
- return el("div", props$1, [el("div", {
19545
- className: imageWrapperClassName,
19546
- style: { flexBasis: { $bind: {
19547
- from: ratioFrom,
19358
+ fallback: base
19359
+ } },
19360
+ ...config$1.gapFrom ? { style: { gap: { $bind: {
19361
+ from: config$1.gapFrom,
19548
19362
  transforms: [{
19549
- id: "ui.twoColumnFlexBasis",
19550
- options: { side: "image" }
19363
+ id: "boxStyles.semanticGapValue",
19364
+ options: { fallback }
19551
19365
  }],
19552
- fallback: "50%"
19553
- } } }
19554
- }, [image]), el("div", {
19555
- className: textWrapperClassName,
19366
+ fallback: GAP_VALUE_MAP[fallback]
19367
+ } } } } : {}
19368
+ };
19369
+ }
19370
+ function twoColumnWrapper(config$1, side, child) {
19371
+ const className = side === "image" ? config$1.imageWrapperClassName ?? "rb-w-full rb-shrink-0" : config$1.textWrapperClassName ?? "rb-w-full rb-min-w-0 rb-flex-1";
19372
+ return el("div", {
19373
+ ...config$1.lookSlots ? lookSlot(side === "image" ? "media" : "copy") : {},
19374
+ className,
19556
19375
  style: { flexBasis: { $bind: {
19557
- from: ratioFrom,
19376
+ from: config$1.ratioFrom,
19558
19377
  transforms: [{
19559
19378
  id: "ui.twoColumnFlexBasis",
19560
- options: { side: "text" }
19379
+ options: { side }
19561
19380
  }],
19562
19381
  fallback: "50%"
19563
19382
  } } }
19564
- }, [text$1])]);
19383
+ }, [child]);
19565
19384
  }
19566
19385
 
19567
19386
  //#endregion
@@ -19800,6 +19619,50 @@ function headingDecoration({ bindFrom = defaultBindFrom, className } = {}) {
19800
19619
  } } })], when(`${bindFrom}.family`));
19801
19620
  }
19802
19621
 
19622
+ //#endregion
19623
+ //#region ../blocks/src/system/node/fragments/sectionHead.ts
19624
+ const recoverEmptyHeadingWhenActive = {
19625
+ kind: "recover-empty-when-active",
19626
+ placeholder: "Add heading"
19627
+ };
19628
+ const recoverEmptyDescriptionWhenActive = {
19629
+ kind: "recover-empty-when-active",
19630
+ placeholder: "Add description"
19631
+ };
19632
+ function sectionHeaderLayoutNodes(options = {}) {
19633
+ const headingNode$1 = text({
19634
+ as: "h2",
19635
+ ...lookSlot("heading")
19636
+ }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
19637
+ const descriptionNode = richText({
19638
+ className: "rb-prose rb-max-w-none",
19639
+ ...lookSlot("intro")
19640
+ }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
19641
+ if (options.splitClassName) {
19642
+ return [el("div", {
19643
+ className: options.splitClassName,
19644
+ ...lookSlot("head")
19645
+ }, [headingNode$1, descriptionNode])];
19646
+ }
19647
+ return [headingNode$1, descriptionNode];
19648
+ }
19649
+ /** Shared optional section copy. Existing consumers keep their description ID. */
19650
+ const sectionHeaderFields = (defaultHeading, introLabel = "Description") => [{
19651
+ id: "heading",
19652
+ type: "text",
19653
+ label: "Heading",
19654
+ description: "Main heading for the section",
19655
+ required: false,
19656
+ multiline: false,
19657
+ ...defaultHeading === undefined ? {} : { defaultValue: defaultHeading }
19658
+ }, {
19659
+ id: "description",
19660
+ type: "richText",
19661
+ label: introLabel,
19662
+ description: "Optional introductory text",
19663
+ required: false
19664
+ }];
19665
+
19803
19666
  //#endregion
19804
19667
  //#region ../blocks/src/system/fragments/library/heroCopy.ts
19805
19668
  const heroCopyFragment = defineFragment({
@@ -20720,8 +20583,19 @@ const formCopyFragment = defineFragment({
20720
20583
  }],
20721
20584
  layout: [text({
20722
20585
  as: "h2",
20586
+ ...lookSlot("heading"),
20723
20587
  className: "form-copy-title"
20724
- }, when("content.title"), bind("content.title")), richText({ className: "form-copy-intro rb-prose rb-max-w-none" }, when("content.intro"), bind("content.intro"))]
20588
+ }, when("content.title", { authoringPresence: {
20589
+ kind: "recover-empty-when-active",
20590
+ placeholder: "Add heading"
20591
+ } }), bind("content.title")), richText({
20592
+ className: "form-copy-intro rb-prose rb-max-w-none",
20593
+ ...lookSlot("intro"),
20594
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } }
20595
+ }, when("content.intro", { authoringPresence: {
20596
+ kind: "recover-empty-when-active",
20597
+ placeholder: "Add introduction"
20598
+ } }), bind("content.intro"))]
20725
20599
  });
20726
20600
 
20727
20601
  //#endregion
@@ -20774,6 +20648,7 @@ const formEmbedFragment = defineFragment({
20774
20648
  }
20775
20649
  ],
20776
20650
  layout: [form(withApiBindings({
20651
+ lookSlots: { $bind: { from: "content._lookSlots" } },
20777
20652
  spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
20778
20653
  submitLabel: { $bind: { from: "submitLabel" } },
20779
20654
  successMessage: { $bind: { from: "successMessage" } }
@@ -22176,8 +22051,18 @@ const newsletterCopyFragment = defineFragment({
22176
22051
  }],
22177
22052
  layout: [text({
22178
22053
  as: "h2",
22179
- className: "newsletter-copy-title"
22180
- }, when("content.title"), bind("content.title")), richText({ className: "newsletter-copy-subtitle rb-prose rb-max-w-none" }, when("content.subtitle"), bind("content.subtitle"))]
22054
+ className: "newsletter-copy-title",
22055
+ ...lookSlot("heading")
22056
+ }, when("content.title", { authoringPresence: {
22057
+ kind: "recover-empty-when-active",
22058
+ placeholder: "Add heading"
22059
+ } }), bind("content.title")), richText({
22060
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none",
22061
+ ...lookSlot("intro")
22062
+ }, when("content.subtitle", { authoringPresence: {
22063
+ kind: "recover-empty-when-active",
22064
+ placeholder: "Add introduction"
22065
+ } }), bind("content.subtitle"))]
22181
22066
  });
22182
22067
 
22183
22068
  //#endregion
@@ -22246,6 +22131,7 @@ const newsletterFormFragment = defineFragment({
22246
22131
  }
22247
22132
  ],
22248
22133
  layout: [el("newsletter-form", withApiBindings({
22134
+ lookSlots: { $bind: { from: "content._lookSlots" } },
22249
22135
  source: { $bind: {
22250
22136
  from: "mailingListSource",
22251
22137
  fallback: "block"
@@ -22424,6 +22310,10 @@ function listLookSlot(presentation, slot) {
22424
22310
  ...surface === undefined ? { "data-surface": "section" } : resolvedItemSurfaceProps(surface, slot)
22425
22311
  };
22426
22312
  }
22313
+ /** Control kind is semantic; legacy markup receives no extra attributes. */
22314
+ function listLookControl(presentation, kind) {
22315
+ return presentation.lookSlots === undefined ? {} : { "data-control": kind };
22316
+ }
22427
22317
  function resolvedSurfaceBackground(surface, token) {
22428
22318
  const color = token.startsWith("#") ? token : `rgb(var(--tb-${token}))`;
22429
22319
  const base = surface.kind === "owned" ? surface.tintBase : undefined;
@@ -24560,6 +24450,26 @@ const formattingTransforms = [
24560
24450
  mapTokenTransform
24561
24451
  ];
24562
24452
 
24453
+ //#endregion
24454
+ //#region ../blocks/src/system/transforms/registry/footerArrangement.ts
24455
+ const footerBrandArrangementTransform = {
24456
+ id: "layout.footerBrandArrangement",
24457
+ kind: "string",
24458
+ run: (value) => {
24459
+ const module$1 = asPartialObject(value);
24460
+ return module$1?.kind === "brand" ? module$1.slots ? "centred" : "row" : undefined;
24461
+ }
24462
+ };
24463
+ const footerModuleInkStyleTransform = {
24464
+ id: "layout.footerModuleInkStyle",
24465
+ kind: "formatter",
24466
+ run: (value, options) => value === "centred" ? undefined : textColorStyle(asPartialObject(options)?.opacity === 70 ? "text/70" : "text/80")
24467
+ };
24468
+ /** A centred base without authored bar paint inherits its measured surface line. */
24469
+ function footerBottomBarBorderColorStyle(footer) {
24470
+ return footer?.variant === "centred" && !footer.bottomBar ? { borderColor: "var(--rb-surface-line-color)" } : borderColorStyle(footer?.bottomBar?.borderTop?.colorToken ?? "border");
24471
+ }
24472
+
24563
24473
  //#endregion
24564
24474
  //#region ../theme-core/src/siteChromePlacement.ts
24565
24475
  const SITE_CHROME_PLACEMENT_CLASSES = [
@@ -24903,6 +24813,9 @@ const footerRootStyleTransform = {
24903
24813
  }
24904
24814
  }
24905
24815
  styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
24816
+ if (footer?.variant === "centred") {
24817
+ styleParts.push(surfaceInkStyles(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate), context.theme.palette));
24818
+ }
24906
24819
  styleParts.push(borderColorStyle("border"));
24907
24820
  return mergeStyles(...styleParts);
24908
24821
  }
@@ -24967,7 +24880,7 @@ const footerBottomBarStyleTransform = {
24967
24880
  run: (value, _options, context) => {
24968
24881
  const footer = asPartialObject(value);
24969
24882
  const bottomBar = footer?.bottomBar;
24970
- return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : undefined, borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
24883
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : undefined, footerBottomBarBorderColorStyle(footer), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
24971
24884
  }
24972
24885
  };
24973
24886
  function footerBottomBarForegroundStyle(footer, palette) {
@@ -24994,27 +24907,7 @@ function measuredFooterBackdrop(footer, palette) {
24994
24907
  const foreground = resolveFooterRootForeground(footer, palette);
24995
24908
  return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
24996
24909
  }
24997
- const footerSplitMainClassSchema = z.object({
24998
- base: z.string().optional(),
24999
- reverseClass: z.string().optional()
25000
- });
25001
- const footerSplitMainClassTransform = {
25002
- id: "layout.footerSplitMainClass",
25003
- kind: "string",
25004
- summary: "Compose split-footer main row classes from footer logo placement",
25005
- schema: footerSplitMainClassSchema,
25006
- run: (value, options) => {
25007
- const logo = asPartialObject(value);
25008
- const placement = logo?.placement ?? "right";
25009
- const shouldPlaceLogoFirst = placement === "left" || placement === "above";
25010
- const baseClass = shouldPlaceLogoFirst ? "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-end rb-gap-8 rb-md-flex-row rb-md-items-end" : "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end";
25011
- return joinClasses$5([options.base ?? baseClass, shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null]);
25012
- }
25013
- };
25014
- const footerLogoClassSchema = z.object({
25015
- base: z.string().optional(),
25016
- requireExplicitShow: z.boolean().optional()
25017
- });
24910
+ const footerLogoClassSchema = z.object({ base: z.string().optional() });
25018
24911
  const footerLogoClassTransform = {
25019
24912
  id: "layout.footerLogoClass",
25020
24913
  kind: "string",
@@ -25023,38 +24916,8 @@ const footerLogoClassTransform = {
25023
24916
  run: (value, options) => {
25024
24917
  const logo = asPartialObject(value);
25025
24918
  const align = logo?.align ?? "end";
25026
- const hiddenClass = options.requireExplicitShow ? logo?.showLogo === true ? null : "rb-hidden" : logo?.showLogo === false ? "rb-hidden" : null;
25027
24919
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
25028
- return joinClasses$5([
25029
- options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80",
25030
- selfAlignClass,
25031
- hiddenClass
25032
- ]);
25033
- }
25034
- };
25035
- const footerLogoMediaClassSchema = z.object({ base: z.string().optional() });
25036
- const footerLogoMediaClassTransform = {
25037
- id: "layout.footerLogoMediaClass",
25038
- kind: "string",
25039
- summary: "Compose footer logo image classes from size controls",
25040
- schema: footerLogoMediaClassSchema,
25041
- run: (_value, options) => {
25042
- return joinClasses$5([options.base ?? "rb-w-auto"]);
25043
- }
25044
- };
25045
- function shouldShowFooterLogoText(footer) {
25046
- if (!footer) return false;
25047
- const explicit = footer.logo?.showLogoText;
25048
- const legacy = footer.showLogoText === true;
25049
- return explicit === true || explicit === undefined && legacy;
25050
- }
25051
- const footerLogoTextVisibleTransform = {
25052
- id: "layout.footerLogoTextVisible",
25053
- kind: "formatter",
25054
- summary: "Return whether footer logo text should render",
25055
- run: (value) => {
25056
- const footer = asPartialObject(value);
25057
- return shouldShowFooterLogoText(footer);
24920
+ return joinClasses$5([options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80", selfAlignClass]);
25058
24921
  }
25059
24922
  };
25060
24923
  function extractBackgroundColorToken(background, fallback) {
@@ -25079,13 +24942,12 @@ const layoutTransforms = [
25079
24942
  headerRootStyleTransform,
25080
24943
  headerSectionBackgroundTransform,
25081
24944
  footerRootStyleTransform,
24945
+ footerModuleInkStyleTransform,
24946
+ footerBrandArrangementTransform,
25082
24947
  footerBottomBarClassTransform,
25083
24948
  footerBottomBarContainerClassTransform,
25084
24949
  footerBottomBarStyleTransform,
25085
- footerSplitMainClassTransform,
25086
- footerLogoClassTransform,
25087
- footerLogoMediaClassTransform,
25088
- footerLogoTextVisibleTransform
24950
+ footerLogoClassTransform
25089
24951
  ];
25090
24952
 
25091
24953
  //#endregion
@@ -26153,7 +26015,7 @@ function extractRouteHref(candidate, stageInput = "published") {
26153
26015
  return trimmed.length > 0 ? trimmed : null;
26154
26016
  }
26155
26017
  if (!isRouteRecord(candidate)) return null;
26156
- const fields$2 = normalizeRenderStage(stageInput) === "preview" ? [
26018
+ const fields$1 = normalizeRenderStage(stageInput) === "preview" ? [
26157
26019
  "draftPath",
26158
26020
  "path",
26159
26021
  "href",
@@ -26163,7 +26025,7 @@ function extractRouteHref(candidate, stageInput = "published") {
26163
26025
  "href",
26164
26026
  "url"
26165
26027
  ];
26166
- for (const field of fields$2) {
26028
+ for (const field of fields$1) {
26167
26029
  const value = candidate[field];
26168
26030
  if (typeof value === "string" && value.trim().length > 0) return value.trim();
26169
26031
  }
@@ -27031,21 +26893,14 @@ function groupItemsByDate(items, accessors) {
27031
26893
  *
27032
26894
  * Sites don't store a locale, and every public word around a date is English,
27033
26895
  * so the only open question is which English conventions to follow: day or
27034
- * month first, and a 24 or 12-hour clock. The site's time zone is the one
26896
+ * month first. The site's time zone is the one
27035
26897
  * fact every site carries about where it is. It is the site's, never an
27036
26898
  * event's: a venue left at UTC must not turn a UK site's dates American.
27037
26899
  * Anywhere this can't place (UTC, the Americas, Asia) keeps US English, which
27038
26900
  * is what these helpers wrote before sites were placed at all.
27039
26901
  */
27040
26902
  function eventDateLocale(siteTimeZone) {
27041
- if (!siteTimeZone) return "en-US";
27042
- if (siteTimeZone === "Europe/Dublin") return "en-IE";
27043
- if (siteTimeZone.startsWith("Europe/")) return "en-GB";
27044
- if (siteTimeZone.startsWith("Australia/")) return "en-AU";
27045
- if (siteTimeZone === "Pacific/Auckland" || siteTimeZone === "Pacific/Chatham") {
27046
- return "en-NZ";
27047
- }
27048
- return "en-US";
26903
+ return inferSiteDateLocale(siteTimeZone);
27049
26904
  }
27050
26905
  /**
27051
26906
  * Formatting options for an event's dates: the times in the event's own zone,
@@ -28142,7 +27997,7 @@ const defaultTransforms = createTransformRegistry(builtinTransformDefinitions);
28142
27997
 
28143
27998
  //#endregion
28144
27999
  //#region ../blocks/src/primitives/layout/Section.tsx
28145
- const Section = (0, import_react.forwardRef)(function Section$1({ as: Comp = "section", children, background, className = "", style, "data-slot": dataSlot, "data-surface": dataSurface }, ref) {
28000
+ const Section = (0, import_react.forwardRef)(function Section$1({ as: Comp = "section", children, background, className = "", style, "data-slot": dataSlot, "data-arrangement": dataArrangement, "data-surface": dataSurface }, ref) {
28146
28001
  const alwaysClass = clsx_default("rb-relative rb-isolate rb-overflow-visible", className);
28147
28002
  const backgroundStyle = typeof background === "string" && background.trim().length > 0 ? backgroundColorStyle(background.trim()) : undefined;
28148
28003
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Comp, {
@@ -28151,6 +28006,7 @@ const Section = (0, import_react.forwardRef)(function Section$1({ as: Comp = "se
28151
28006
  style: mergeStyles(backgroundStyle, style),
28152
28007
  "data-slot": dataSlot ?? "section",
28153
28008
  "data-surface": dataSurface,
28009
+ "data-arrangement": dataArrangement,
28154
28010
  children
28155
28011
  });
28156
28012
  });
@@ -28697,7 +28553,7 @@ function normalizeRel(target, rel) {
28697
28553
  tokens.add("noreferrer");
28698
28554
  return Array.from(tokens).join(" ");
28699
28555
  }
28700
- function renderMarks(text$1, marks, key, linkTarget) {
28556
+ function renderMarks(text$1, marks, key, context) {
28701
28557
  if (!marks || marks.length === 0) return text$1;
28702
28558
  return marks.reduce((acc, mark) => {
28703
28559
  switch (mark.type) {
@@ -28705,25 +28561,66 @@ function renderMarks(text$1, marks, key, linkTarget) {
28705
28561
  case "strong": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: acc }, `${key}-b`);
28706
28562
  case "italic":
28707
28563
  case "em": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("em", { children: acc }, `${key}-i`);
28708
- case "link": {
28709
- if (typeof acc === "string" && acc.length === 0) return acc;
28710
- const attrs = mark.attrs ?? {};
28711
- const href = sanitizeHref(attrs.href);
28712
- if (!href) return acc;
28713
- const storedTarget = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : undefined;
28714
- const target = linkTarget === "new-tab" ? "_blank" : storedTarget;
28715
- const rel = typeof attrs.rel === "string" ? attrs.rel : undefined;
28716
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
28717
- href,
28718
- target,
28719
- rel: normalizeRel(target, rel),
28720
- children: acc
28721
- }, `${key}-l`);
28722
- }
28564
+ case "link": return renderLinkMark(mark, acc, key, context);
28723
28565
  default: return acc;
28724
28566
  }
28725
28567
  }, text$1);
28726
28568
  }
28569
+ function richTextLinkAttributes(mark, mode) {
28570
+ const attrs = mark.attrs ?? {};
28571
+ const href = sanitizeHref(attrs.href);
28572
+ if (!href) return null;
28573
+ const storedTarget = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : undefined;
28574
+ const target = mode === "new-tab" ? "_blank" : storedTarget;
28575
+ const rel = typeof attrs.rel === "string" ? attrs.rel : undefined;
28576
+ return {
28577
+ href,
28578
+ target,
28579
+ rel: normalizeRel(target, rel)
28580
+ };
28581
+ }
28582
+ function renderLinkMark(mark, text$1, key, context) {
28583
+ if (typeof text$1 === "string" && text$1.length === 0) return text$1;
28584
+ const attributes = richTextLinkAttributes(mark, context.linkTarget);
28585
+ return attributes ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
28586
+ ...attributes,
28587
+ ...listLookControl(context, "link"),
28588
+ children: text$1
28589
+ }, `${key}-l`) : text$1;
28590
+ }
28591
+ function renderDoc(node, key, context) {
28592
+ if (!node || !node.type) return null;
28593
+ const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, context));
28594
+ switch (node.type) {
28595
+ case "doc": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
28596
+ case "paragraph": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key, context) }, key);
28597
+ case "heading": return renderHeading(node, key, children, context);
28598
+ case "blockquote": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("blockquote", {
28599
+ ...listLookSlot(context, "quote"),
28600
+ children
28601
+ }, key);
28602
+ case "image": return renderRichTextImage(node, key, context);
28603
+ default: return renderSimpleNode(node, key, children, context);
28604
+ }
28605
+ }
28606
+ function renderHeading(node, key, children, context) {
28607
+ const level = Math.min(Math.max(Number(node.attrs?.level ?? 2), 1), 6);
28608
+ return import_react.createElement(`h${level}`, {
28609
+ key,
28610
+ ...level === 2 ? listLookSlot(context, "heading") : {}
28611
+ }, children);
28612
+ }
28613
+ function renderSimpleNode(node, key, children, context) {
28614
+ switch (node.type) {
28615
+ case "bulletList": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { children }, key);
28616
+ case "orderedList": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ol", { children }, key);
28617
+ case "listItem": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children }, key);
28618
+ case "horizontalRule": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("hr", {}, key);
28619
+ case "hardBreak": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("br", {}, key);
28620
+ case "text": return renderMarks(node.text ?? "", node.marks, key, context);
28621
+ default: return null;
28622
+ }
28623
+ }
28727
28624
  function richTextImageOptions(width, height) {
28728
28625
  if (width) return {
28729
28626
  width,
@@ -28755,7 +28652,7 @@ function renderRichTextImage(node, key, context) {
28755
28652
  const attrs = node.attrs ?? {};
28756
28653
  const width = parseDimension(attrs.width);
28757
28654
  const height = parseDimension(attrs.height);
28758
- const src = resolveRichTextImageSource(attrs, width, height, context);
28655
+ const src = resolveRichTextImageSource(attrs, width, height, context.imageResolveContext);
28759
28656
  if (!src) return null;
28760
28657
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
28761
28658
  src,
@@ -28764,37 +28661,27 @@ function renderRichTextImage(node, key, context) {
28764
28661
  width,
28765
28662
  height,
28766
28663
  loading: "lazy",
28767
- decoding: "async"
28664
+ decoding: "async",
28665
+ ...listLookSlot(context, "photo")
28768
28666
  }, key);
28769
28667
  }
28770
- function renderDoc(node, key, imageResolveContext, linkTarget) {
28771
- if (!node || !node.type) return null;
28772
- const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, imageResolveContext, linkTarget));
28773
- switch (node.type) {
28774
- case "doc": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
28775
- case "paragraph":
28776
- if (!children && !node.text) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {}, key);
28777
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key, linkTarget) }, key);
28778
- case "heading": {
28779
- const level = Math.min(Math.max(node.attrs?.level ?? 2, 1), 6);
28780
- const headingTag = `h${level}`;
28781
- return import_react.createElement(headingTag, { key }, children);
28782
- }
28783
- case "bulletList": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { children }, key);
28784
- case "orderedList": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ol", { children }, key);
28785
- case "listItem": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children }, key);
28786
- case "blockquote": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("blockquote", { children }, key);
28787
- case "horizontalRule": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("hr", {}, key);
28788
- case "hardBreak": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("br", {}, key);
28789
- case "image": return renderRichTextImage(node, key, imageResolveContext);
28790
- case "text": return renderMarks(node.text ?? "", node.marks, key, linkTarget);
28791
- default: return null;
28792
- }
28668
+ /** Mark meaning in the renderer, rather than choosing ink with a positional CSS rule. */
28669
+ function renderRichTextContent(doc, context, leadSlot) {
28670
+ if (!leadSlot) return renderDoc(doc, "doc", context);
28671
+ const leadIndex = doc.content?.findIndex((node) => node.type === "paragraph");
28672
+ return doc.content?.map((node, index) => {
28673
+ const rendered = renderDoc(node, `doc-${index}`, context);
28674
+ return index === leadIndex && import_react.isValidElement(rendered) ? import_react.cloneElement(rendered, { "data-slot": leadSlot }) : rendered;
28675
+ });
28793
28676
  }
28794
28677
  const DEFAULT_RICH_TEXT_CLASS = "rb-prose rb-max-w-none";
28795
- function RichText$1({ as: Comp = "div", className, doc, path: path$4, style, "data-slot": dataSlot, "data-surface": dataSurface, linkTarget = "stored" }) {
28678
+ function RichText$1({ as: Comp = "div", className, doc, path: path$4, style, "data-slot": dataSlot, "data-surface": dataSurface, linkTarget = "stored", leadParagraphSlot, lookSlots }) {
28796
28679
  const imageResolveContext = getCurrentResolveImageUrlContext() ?? null;
28797
- const content = doc ? renderDoc(doc, "doc", imageResolveContext, linkTarget) : null;
28680
+ const content = doc ? renderRichTextContent(doc, {
28681
+ imageResolveContext,
28682
+ linkTarget,
28683
+ lookSlots
28684
+ }, leadParagraphSlot) : null;
28798
28685
  const dataAttributes = path$4 ? { "data-builder-richtext": path$4 } : undefined;
28799
28686
  const resolvedClassName = className?.trim() || DEFAULT_RICH_TEXT_CLASS;
28800
28687
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Comp, {
@@ -34483,9 +34370,9 @@ function createFieldIds(idPrefix, suffixes) {
34483
34370
  for (const field of Object.keys(suffixes)) ids[field] = `${idPrefix}-${suffixes[field]}`;
34484
34371
  return ids;
34485
34372
  }
34486
- function clearFieldErrors(fieldErrors, fields$2) {
34373
+ function clearFieldErrors(fieldErrors, fields$1) {
34487
34374
  const next = { ...fieldErrors };
34488
- for (const field of fields$2) delete next[field];
34375
+ for (const field of fields$1) delete next[field];
34489
34376
  return next;
34490
34377
  }
34491
34378
  function clearFieldError(fieldErrors, field) {
@@ -34498,8 +34385,8 @@ function clearNullableFieldError(fieldErrors, field) {
34498
34385
  [field]: null
34499
34386
  };
34500
34387
  }
34501
- function clearNullableFieldErrors(fieldErrors, fields$2) {
34502
- return fields$2.reduce((nextErrors, field) => clearNullableFieldError(nextErrors, field), fieldErrors);
34388
+ function clearNullableFieldErrors(fieldErrors, fields$1) {
34389
+ return fields$1.reduce((nextErrors, field) => clearNullableFieldError(nextErrors, field), fieldErrors);
34503
34390
  }
34504
34391
  function normalizeApiFieldPath(field) {
34505
34392
  return field.replace(/^body\./, "");
@@ -38154,7 +38041,7 @@ function buildOrderConfirmationContent(input) {
38154
38041
  settlement: input.settlement,
38155
38042
  instalmentPlan: input.instalmentPlan,
38156
38043
  formatCurrencyAmount: input.formatters.formatCurrencyAmount,
38157
- formatDateTime: input.formatters.formatDateTime
38044
+ formatPaymentDueDate: input.formatters.formatPaymentDueDate
38158
38045
  }) : confirmationCopy.introText;
38159
38046
  const orderReceiptDetails = {
38160
38047
  orderNumber: input.order.orderNumber,
@@ -38254,7 +38141,7 @@ function resolveInstalmentPlanIntroText(input) {
38254
38141
  return `You've paid ${paidToday} today.`;
38255
38142
  }
38256
38143
  if (input.instalmentPlan.rows.filter((row) => row.phaseKind === "scheduled").length === 1) {
38257
- return `You've paid ${paidToday} today. The remaining ${input.formatCurrencyAmount(firstFutureInstalment.amountCents, input.order.currency)} will be taken on ${input.formatDateTime(firstFutureInstalment.dueAt)}.`;
38144
+ return `You've paid ${paidToday} today. The remaining ${input.formatCurrencyAmount(firstFutureInstalment.amountCents, input.order.currency)} will be taken on ${input.formatPaymentDueDate(firstFutureInstalment.dueAt)}.`;
38258
38145
  }
38259
38146
  return `You've paid ${paidToday} today. The rest will be taken automatically on the dates below.`;
38260
38147
  }
@@ -40290,10 +40177,10 @@ function formatBookingReservedFieldCollisionMessages(collisions) {
40290
40177
  * use exact case-sensitive matching because the runtime stores JavaScript
40291
40178
  * object keys without case normalization.
40292
40179
  */
40293
- function findBookingFormDataReservedFieldCollisions(fields$2) {
40180
+ function findBookingFormDataReservedFieldCollisions(fields$1) {
40294
40181
  const seen = new Set();
40295
40182
  const collisions = [];
40296
- for (const field of fields$2) {
40183
+ for (const field of fields$1) {
40297
40184
  if (!isBookingFormDataReservedKey(field.id) || seen.has(field.id)) {
40298
40185
  continue;
40299
40186
  }
@@ -40327,7 +40214,7 @@ function projectSelectedAppointmentConsentIntoForm(form$1, selectedConsent) {
40327
40214
  if (!form$1) return null;
40328
40215
  const sourceFields = form$1.schema?.fields ?? [];
40329
40216
  const baseFields = sourceFields.filter((field) => field.type !== "booking_requirement_consent");
40330
- const fields$2 = selectedConsent.kind === "required-for-selected-service" ? [...baseFields, selectedConsent.field] : baseFields;
40217
+ const fields$1 = selectedConsent.kind === "required-for-selected-service" ? [...baseFields, selectedConsent.field] : baseFields;
40331
40218
  if (selectedConsent.kind === "not-applicable" && baseFields.length === sourceFields.length) {
40332
40219
  return form$1;
40333
40220
  }
@@ -40335,7 +40222,7 @@ function projectSelectedAppointmentConsentIntoForm(form$1, selectedConsent) {
40335
40222
  ...form$1,
40336
40223
  schema: {
40337
40224
  ...form$1.schema,
40338
- fields: fields$2
40225
+ fields: fields$1
40339
40226
  }
40340
40227
  };
40341
40228
  }
@@ -40519,10 +40406,10 @@ function normalizeBookingServices(services) {
40519
40406
  function normalizeBookingSchema(value) {
40520
40407
  if (!value) return undefined;
40521
40408
  const rawFields = Array.isArray(value.fields) ? value.fields : [];
40522
- const fields$2 = rawFields.map(readBookingFormField).filter((field) => field !== null);
40409
+ const fields$1 = rawFields.map(readBookingFormField).filter((field) => field !== null);
40523
40410
  return {
40524
40411
  version: typeof value.version === "string" ? value.version : undefined,
40525
- fields: fields$2
40412
+ fields: fields$1
40526
40413
  };
40527
40414
  }
40528
40415
  function readBookingFormField(value) {
@@ -44017,9 +43904,9 @@ function createBoxStylesFieldWithDepth(type, options = {}) {
44017
43904
  };
44018
43905
  const { id = defaults[type].id, label = defaults[type].label, includeBackground = true, renderInHeader, intent } = options;
44019
43906
  const contextName = defaults[type].contextName;
44020
- const fields$2 = [];
43907
+ const fields$1 = [];
44021
43908
  if (includeBackground) {
44022
- fields$2.push(createBackgroundField({
43909
+ fields$1.push(createBackgroundField({
44023
43910
  id: "background",
44024
43911
  label: "Background",
44025
43912
  allowColor: true,
@@ -44028,7 +43915,7 @@ function createBoxStylesFieldWithDepth(type, options = {}) {
44028
43915
  includeAdvanced: true
44029
43916
  }));
44030
43917
  }
44031
- fields$2.push({
43918
+ fields$1.push({
44032
43919
  id: "spacing",
44033
43920
  type: "select",
44034
43921
  label: "Inner spacing",
@@ -44063,7 +43950,7 @@ function createBoxStylesFieldWithDepth(type, options = {}) {
44063
43950
  ]
44064
43951
  });
44065
43952
  if (type === "card") {
44066
- fields$2.push({
43953
+ fields$1.push({
44067
43954
  id: "border",
44068
43955
  type: "group",
44069
43956
  label: "Border",
@@ -44121,14 +44008,14 @@ function createBoxStylesFieldWithDepth(type, options = {}) {
44121
44008
  ] }
44122
44009
  });
44123
44010
  }
44124
- fields$2.push({
44011
+ fields$1.push({
44125
44012
  id: "raised",
44126
44013
  type: "boolean",
44127
44014
  label: "Raised",
44128
44015
  description: `Add shadow depth to the ${contextName}.`,
44129
44016
  required: false
44130
44017
  });
44131
- fields$2.push({
44018
+ fields$1.push({
44132
44019
  id: "rounded",
44133
44020
  type: "select",
44134
44021
  label: "Rounded corners",
@@ -44167,7 +44054,7 @@ function createBoxStylesFieldWithDepth(type, options = {}) {
44167
44054
  ]
44168
44055
  });
44169
44056
  if (type === "container") {
44170
- fields$2.push({
44057
+ fields$1.push({
44171
44058
  id: "fullWidth",
44172
44059
  type: "boolean",
44173
44060
  label: "Full width",
@@ -44181,7 +44068,7 @@ function createBoxStylesFieldWithDepth(type, options = {}) {
44181
44068
  type: "modal",
44182
44069
  label,
44183
44070
  required: false,
44184
- schema: { fields: fields$2 },
44071
+ schema: { fields: fields$1 },
44185
44072
  ui: {
44186
44073
  ...typeof renderInHeader === "boolean" ? { renderInHeader } : {},
44187
44074
  ...intent ? { intent } : {},
@@ -44196,9 +44083,9 @@ function createBoxStylesFieldWithDepth(type, options = {}) {
44196
44083
  }
44197
44084
  function sectionStylesField(options = {}) {
44198
44085
  const { id = "_sectionStyles", label = "Section styles", includeBackground = true, allowBackgroundColor = true, allowBackgroundGradient = true, allowBackgroundImage = true, includeAdvancedBackground = true, renderInHeader = true } = options;
44199
- const fields$2 = [];
44086
+ const fields$1 = [];
44200
44087
  if (includeBackground) {
44201
- fields$2.push(createBackgroundField({
44088
+ fields$1.push(createBackgroundField({
44202
44089
  id: "background",
44203
44090
  label: "Background",
44204
44091
  allowColor: allowBackgroundColor,
@@ -44207,7 +44094,7 @@ function sectionStylesField(options = {}) {
44207
44094
  includeAdvanced: includeAdvancedBackground
44208
44095
  }));
44209
44096
  }
44210
- fields$2.push({
44097
+ fields$1.push({
44211
44098
  id: "spacing",
44212
44099
  type: "select",
44213
44100
  label: "Inner spacing",
@@ -44246,7 +44133,7 @@ function sectionStylesField(options = {}) {
44246
44133
  type: "modal",
44247
44134
  label,
44248
44135
  required: false,
44249
- schema: { fields: fields$2 },
44136
+ schema: { fields: fields$1 },
44250
44137
  ui: {
44251
44138
  renderInHeader,
44252
44139
  intent: "style",
@@ -44373,24 +44260,6 @@ const emptyStateField = {
44373
44260
  ui: { intent: "display" }
44374
44261
  };
44375
44262
  /**
44376
- * Section heading and description fields
44377
- */
44378
- const sectionHeaderFields = (defaultHeading) => [{
44379
- id: "heading",
44380
- type: "text",
44381
- label: "Heading",
44382
- description: "Main heading for the events section",
44383
- required: false,
44384
- multiline: false,
44385
- defaultValue: defaultHeading
44386
- }, {
44387
- id: "description",
44388
- type: "richText",
44389
- label: "Description",
44390
- description: "Optional introductory text",
44391
- required: false
44392
- }];
44393
- /**
44394
44263
  * Layout selection field with grid/stack options
44395
44264
  */
44396
44265
  const layoutField = {
@@ -44438,34 +44307,6 @@ const columnsField = (options = [
44438
44307
  }))
44439
44308
  });
44440
44309
 
44441
- //#endregion
44442
- //#region ../blocks/src/system/blocks/events/shared/layout.ts
44443
- const recoverEmptyHeadingWhenActive = {
44444
- kind: "recover-empty-when-active",
44445
- placeholder: "Add heading"
44446
- };
44447
- const recoverEmptyDescriptionWhenActive = {
44448
- kind: "recover-empty-when-active",
44449
- placeholder: "Add description"
44450
- };
44451
- function eventSectionHeaderLayoutNodes(options = {}) {
44452
- const headingNode$1 = text({
44453
- as: "h2",
44454
- ...lookSlot("heading")
44455
- }, bind("content.heading"), when("content.heading", { authoringPresence: recoverEmptyHeadingWhenActive }));
44456
- const descriptionNode = richText({
44457
- className: "rb-prose rb-max-w-none",
44458
- ...lookSlot("intro")
44459
- }, bind("content.description"), when("content.description", { authoringPresence: recoverEmptyDescriptionWhenActive }));
44460
- if (options.splitClassName) {
44461
- return [el("div", {
44462
- className: options.splitClassName,
44463
- ...lookSlot("head")
44464
- }, [headingNode$1, descriptionNode])];
44465
- }
44466
- return [headingNode$1, descriptionNode];
44467
- }
44468
-
44469
44310
  //#endregion
44470
44311
  //#region ../blocks/src/system/runtime/hooks/utils/normalize.ts
44471
44312
  function normalizeOptionalId(value) {
@@ -46381,7 +46222,7 @@ function augmentManifestWithStyleGroups(manifest, styleGroups, blockKind) {
46381
46222
  * ```
46382
46223
  */
46383
46224
  function createBlockManifest(config$1) {
46384
- const fields$2 = parseFieldDefinitions(composeBlockFields(config$1));
46225
+ const fields$1 = parseFieldDefinitions(composeBlockFields(config$1));
46385
46226
  const layout = normalizeBlockLayout(config$1.layout);
46386
46227
  const variants = config$1.variants;
46387
46228
  const behaviours = blockBehaviours(config$1);
@@ -46392,7 +46233,7 @@ function createBlockManifest(config$1) {
46392
46233
  titleSource: config$1.titleSource,
46393
46234
  description: config$1.description ?? "",
46394
46235
  component: deriveComponentName(config$1.id),
46395
- fields: fields$2,
46236
+ fields: fields$1,
46396
46237
  slots: [],
46397
46238
  styleTokens: config$1.styleTokens,
46398
46239
  behaviours,
@@ -49928,7 +49769,7 @@ function MembershipHero({ membershipName, classPrefix, onBookForSomeoneElse }) {
49928
49769
  * LICENSE file in the root directory of this source tree.
49929
49770
  */
49930
49771
  var require_react_dom_production = /* @__PURE__ */ __commonJSMin(((exports) => {
49931
- var React$30 = require_react();
49772
+ var React$31 = require_react();
49932
49773
  function formatProdErrorMessage(code) {
49933
49774
  var url = "https://react.dev/errors/" + code;
49934
49775
  if (1 < arguments.length) {
@@ -49965,7 +49806,7 @@ var require_react_dom_production = /* @__PURE__ */ __commonJSMin(((exports) => {
49965
49806
  implementation
49966
49807
  };
49967
49808
  }
49968
- var ReactSharedInternals = React$30.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
49809
+ var ReactSharedInternals = React$31.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
49969
49810
  function getCrossOriginStringAs(as, input) {
49970
49811
  if ("font" === as) return "";
49971
49812
  if ("string" === typeof input) return "use-credentials" === input ? input : "";
@@ -50108,7 +49949,7 @@ var require_react_dom_development = /* @__PURE__ */ __commonJSMin(((exports) =>
50108
49949
  return dispatcher;
50109
49950
  }
50110
49951
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
50111
- var React$86 = require_react(), Internals$1 = {
49952
+ var React$87 = require_react(), Internals$1 = {
50112
49953
  d: {
50113
49954
  f: noop$2,
50114
49955
  r: function() {
@@ -50124,7 +49965,7 @@ var require_react_dom_development = /* @__PURE__ */ __commonJSMin(((exports) =>
50124
49965
  },
50125
49966
  p: 0,
50126
49967
  findDOMNode: null
50127
- }, REACT_PORTAL_TYPE$1 = Symbol.for("react.portal"), ReactSharedInternals$1 = React$86.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
49968
+ }, REACT_PORTAL_TYPE$1 = Symbol.for("react.portal"), ReactSharedInternals$1 = React$87.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
50128
49969
  "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");
50129
49970
  exports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = Internals$1;
50130
49971
  exports.createPortal = function(children, container) {
@@ -52647,13 +52488,13 @@ function isHalfWidthEligibleField(field) {
52647
52488
  const type = String(field.type ?? "text");
52648
52489
  return type === "text" || type === "email" || type === "tel" || type === "url" || type === "number" || type === "date" || type === "time";
52649
52490
  }
52650
- function groupFormFields(fields$2) {
52491
+ function groupFormFields(fields$1) {
52651
52492
  const groups = [];
52652
- for (let i = 0; i < fields$2.length; i += 1) {
52653
- const current = fields$2[i];
52493
+ for (let i = 0; i < fields$1.length; i += 1) {
52494
+ const current = fields$1[i];
52654
52495
  if (!current) continue;
52655
52496
  if (isHalfWidthEligibleField(current)) {
52656
- const next = fields$2[i + 1];
52497
+ const next = fields$1[i + 1];
52657
52498
  if (next && isHalfWidthEligibleField(next)) {
52658
52499
  groups.push({
52659
52500
  type: "row",
@@ -52709,6 +52550,7 @@ const formFieldGroupSchema = z.discriminatedUnion("type", [z.object({
52709
52550
  fields: z.tuple([formFieldSchema, formFieldSchema])
52710
52551
  })]);
52711
52552
  const formSourceSchema = z.object({
52553
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
52712
52554
  value: formRecordSchema.optional(),
52713
52555
  siteId: z.string().optional(),
52714
52556
  apiBaseUrl: z.string().optional(),
@@ -52718,6 +52560,7 @@ const formSourceSchema = z.object({
52718
52560
  spamProtectionEnabled: z.boolean().optional()
52719
52561
  });
52720
52562
  const formDisplaySchema = z.object({
52563
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
52721
52564
  kind: z.literal("form"),
52722
52565
  state: z.enum(["missing", "ready"]),
52723
52566
  className: z.string().nullable(),
@@ -52739,17 +52582,30 @@ const formIslandMetaCodec = createZodCodec(z.object({
52739
52582
  const formIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl");
52740
52583
  function buildFormDisplay(source) {
52741
52584
  const form$1 = source.value ?? null;
52742
- const fields$2 = form$1?.schemaJson?.fields;
52743
- const groups = Array.isArray(fields$2) ? groupFormFields(fields$2) : [];
52585
+ const fields$1 = formDisplayFields(form$1);
52744
52586
  return {
52745
52587
  kind: "form",
52746
- state: form$1 ? "ready" : "missing",
52588
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
52589
+ state: fields$1.state,
52747
52590
  className: source.className ?? null,
52748
- formId: form$1?.id ?? null,
52591
+ formId: fields$1.formId,
52749
52592
  submitLabel: source.submitLabel?.trim() || "Submit",
52750
52593
  successMessage: source.successMessage ?? null,
52751
52594
  form: form$1,
52752
- groups
52595
+ groups: fields$1.groups
52596
+ };
52597
+ }
52598
+ function formDisplayFields(form$1) {
52599
+ if (!form$1) return {
52600
+ state: "missing",
52601
+ formId: null,
52602
+ groups: []
52603
+ };
52604
+ const fields$1 = form$1.schemaJson?.fields;
52605
+ return {
52606
+ state: "ready",
52607
+ formId: form$1.id,
52608
+ groups: Array.isArray(fields$1) ? groupFormFields(fields$1) : []
52753
52609
  };
52754
52610
  }
52755
52611
  const formBlockRuntime = defineProgressiveBlockRuntime({
@@ -52794,9 +52650,10 @@ function fragmentLayoutNode$1(layout) {
52794
52650
  function isNodeDefinitionArray$1(layout) {
52795
52651
  return Array.isArray(layout);
52796
52652
  }
52797
- const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
52653
+ const copyLayout = props(lookSlot("head"))(fragmentLayoutNode$1(formCopyFragment.layout));
52798
52654
  const embedLayout$1 = fragmentLayoutNode$1(formEmbedFragment.layout);
52799
52655
  const formSurface = styledContainer({
52656
+ rootProps: lookSlot("panel"),
52800
52657
  bindFrom: "_containerStyles",
52801
52658
  constrainWidth: false,
52802
52659
  baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
@@ -52805,9 +52662,16 @@ const formSurface = styledContainer({
52805
52662
  function createFormLayout(variant) {
52806
52663
  if (variant === "two-column") {
52807
52664
  return styledSection({
52808
- children: el("div", { className: "rb-container" }, [el("div", { className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start" }, [stack({
52665
+ children: el("div", {
52666
+ className: "rb-container",
52667
+ ...lookSlot("layout")
52668
+ }, [el("div", {
52669
+ className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start",
52670
+ ...lookSlot("frame")
52671
+ }, [stack({
52809
52672
  gap: "md",
52810
- className: "rb-form-copy-column"
52673
+ className: "rb-form-copy-column",
52674
+ ...lookSlot("copy")
52811
52675
  }, [copyLayout]), formSurface])]),
52812
52676
  baseClass: "",
52813
52677
  spacing: "medium",
@@ -52836,6 +52700,15 @@ const formManifest = createBlockManifest({
52836
52700
  description: "Renders a saved form definition with server-side submit.",
52837
52701
  includeContainerStyles: true,
52838
52702
  fragments: [{ fragment: formCopyFragment }, { fragment: formEmbedFragment }],
52703
+ additionalFields: [{
52704
+ id: "archFrame",
52705
+ type: "boolean",
52706
+ label: "Arch frame",
52707
+ ui: {
52708
+ intent: "display",
52709
+ hidden: true
52710
+ }
52711
+ }],
52839
52712
  layout: formLayout,
52840
52713
  variants: {
52841
52714
  default: formLayout,
@@ -53389,7 +53262,7 @@ const eventCalendarLayout = [styledSection({
53389
53262
  gap: "lg",
53390
53263
  ...lookSlot("layout")
53391
53264
  },
53392
- children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
53265
+ children: [...sectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
53393
53266
  readAuthority: { $bind: { from: "$root.readAuthority" } },
53394
53267
  events: { $bind: { from: "data.events" } },
53395
53268
  effectiveListArrangementKey: { $bind: { from: "$root.effectiveListArrangementKey" } },
@@ -54718,7 +54591,7 @@ const eventListingLayout = [styledSection({
54718
54591
  children: styledContainer({
54719
54592
  rootType: "stack",
54720
54593
  rootProps: { gap: "lg" },
54721
- children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
54594
+ children: [...sectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
54722
54595
  readAuthority: { $bind: { from: "$root.readAuthority" } },
54723
54596
  events: { $bind: { from: "data.events" } },
54724
54597
  stage: { $bind: {
@@ -54873,83 +54746,79 @@ const eventListingBlockDefinition = {
54873
54746
  /**
54874
54747
  * Get form fields based on preset configuration.
54875
54748
  */
54876
- function getGlobalFormFields(form$1) {
54877
- const includePhone = form$1.includeOptionalPhone;
54878
- switch (form$1.fields.preset) {
54879
- case "emailOnly": return withOptionalPhone([{
54880
- id: "email",
54881
- type: "email",
54882
- label: "Email",
54883
- required: true,
54884
- placeholder: "your@email.com"
54885
- }], includePhone);
54886
- case "emailName": return withOptionalPhone([{
54887
- id: "email",
54888
- type: "email",
54889
- label: "Email",
54890
- required: true,
54891
- placeholder: "your@email.com"
54892
- }, {
54749
+ function getGlobalFormFields(form$1, presentation = {}) {
54750
+ const fields$1 = withOptionalPhone(newsletterPresetFields(form$1.fields), form$1.includeOptionalPhone);
54751
+ return presentation.lookSlots ? fields$1.map((field) => ({
54752
+ ...field,
54753
+ label: lookFieldLabel(field)
54754
+ })) : fields$1;
54755
+ }
54756
+ function lookFieldLabel(field) {
54757
+ switch (field.id) {
54758
+ case "firstName": return "First name";
54759
+ case "lastName": return "Last name";
54760
+ default: return field.label;
54761
+ }
54762
+ }
54763
+ const emailField = {
54764
+ id: "email",
54765
+ type: "email",
54766
+ label: "Email",
54767
+ required: true,
54768
+ placeholder: "your@email.com"
54769
+ };
54770
+ const firstNameField = (required) => ({
54771
+ id: "firstName",
54772
+ type: "text",
54773
+ label: "First Name",
54774
+ required,
54775
+ placeholder: "First name"
54776
+ });
54777
+ function newsletterPresetFields(fields$1) {
54778
+ switch (fields$1.preset) {
54779
+ case "emailOnly": return [emailField];
54780
+ case "emailName": return [emailField, {
54893
54781
  id: "name",
54894
54782
  type: "text",
54895
54783
  label: "Name",
54896
- required: form$1.fields.name === "required",
54784
+ required: fields$1.name === "required",
54897
54785
  placeholder: "Your name"
54898
- }], includePhone);
54899
- case "emailFirstLast": return withOptionalPhone([
54900
- {
54901
- id: "email",
54902
- type: "email",
54903
- label: "Email",
54904
- required: true,
54905
- placeholder: "your@email.com"
54906
- },
54907
- {
54908
- id: "firstName",
54909
- type: "text",
54910
- label: "First Name",
54911
- required: form$1.fields.firstName === "required",
54912
- placeholder: "First name"
54913
- },
54786
+ }];
54787
+ case "emailFirstName": return [emailField, firstNameField(fields$1.firstName === "required")];
54788
+ case "emailFirstLast": return [
54789
+ emailField,
54790
+ firstNameField(fields$1.firstName === "required"),
54914
54791
  {
54915
54792
  id: "lastName",
54916
54793
  type: "text",
54917
54794
  label: "Last Name",
54918
- required: form$1.fields.lastName === "required",
54795
+ required: fields$1.lastName === "required",
54919
54796
  placeholder: "Last name"
54920
54797
  }
54921
- ], includePhone);
54922
- case "emailNameCompany": return withOptionalPhone([
54923
- {
54924
- id: "email",
54925
- type: "email",
54926
- label: "Email",
54927
- required: true,
54928
- placeholder: "your@email.com"
54929
- },
54798
+ ];
54799
+ case "emailNameCompany": return [
54800
+ emailField,
54930
54801
  {
54931
54802
  id: "name",
54932
54803
  type: "text",
54933
54804
  label: "Name",
54934
- required: form$1.fields.name === "required",
54805
+ required: fields$1.name === "required",
54935
54806
  placeholder: "Your name"
54936
54807
  },
54937
54808
  {
54938
54809
  id: "company",
54939
54810
  type: "text",
54940
54811
  label: "Company",
54941
- required: form$1.fields.company === "required",
54812
+ required: fields$1.company === "required",
54942
54813
  placeholder: "Company name"
54943
54814
  }
54944
- ], includePhone);
54945
- default: {
54946
- throw new Error("Unknown newsletter preset");
54947
- }
54815
+ ];
54816
+ default: return assertNever(fields$1);
54948
54817
  }
54949
54818
  }
54950
- function withOptionalPhone(fields$2, includePhone) {
54951
- if (!includePhone) return fields$2;
54952
- return [...fields$2, {
54819
+ function withOptionalPhone(fields$1, includePhone) {
54820
+ if (!includePhone) return fields$1;
54821
+ return [...fields$1, {
54953
54822
  id: "phone",
54954
54823
  type: "text",
54955
54824
  label: "Phone",
@@ -55015,6 +54884,7 @@ const mailingListSignupBlockSourceRefSchema = z.object({
55015
54884
  });
55016
54885
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
55017
54886
  const newsletterSourceCommonSchema = z.object({
54887
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
55018
54888
  siteId: z.string().optional(),
55019
54889
  apiBaseUrl: z.string().optional(),
55020
54890
  mailingList: mailingListContextSchema.optional(),
@@ -55047,6 +54917,7 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
55047
54917
  newsletterSourceCommonSchema.extend({ source: z.literal("preview") })
55048
54918
  ]);
55049
54919
  const newsletterDisplaySchema = z.object({
54920
+ lookSlots: lookListPresentationSchemaShape.lookSlots,
55050
54921
  kind: z.literal("newsletter-form"),
55051
54922
  availability: z.enum(["ready", "unavailable"]),
55052
54923
  className: z.string().nullable(),
@@ -55115,13 +54986,14 @@ function buildNewsletterDisplay(source) {
55115
54986
  const choices = resolveRuntimeChoices(assessment);
55116
54987
  return {
55117
54988
  kind: "newsletter-form",
54989
+ ...source.lookSlots ? { lookSlots: source.lookSlots } : {},
55118
54990
  availability: assessment.tag === "available" ? "ready" : "unavailable",
55119
54991
  className: source.className ?? null,
55120
54992
  buttonLabel: form$1.buttonLabel,
55121
54993
  successMessage: form$1.successMessage,
55122
54994
  buttonVariant: source.buttonVariant ?? "primary",
55123
54995
  privacyNote: form$1.privacyNote,
55124
- fields: getGlobalFormFields(form$1),
54996
+ fields: getGlobalFormFields(form$1, source),
55125
54997
  choices
55126
54998
  };
55127
54999
  }
@@ -55238,32 +55110,50 @@ function normalizeMailingListBlockContent(record) {
55238
55110
  //#region ../blocks/src/system/blocks/newsletter-signup.ts
55239
55111
  const stackedComposition = composeFragments([{ fragment: newsletterCopyFragment }, { fragment: newsletterFormFragment }]);
55240
55112
  const stackedLayout$1 = styledSection({
55241
- children: sectionContainer(stackedComposition.layout, {
55113
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
55242
55114
  gap: "md",
55243
55115
  className: "rb-text-center newsletter-stacked"
55244
- }),
55116
+ })),
55245
55117
  baseClass: "",
55246
55118
  spacing: "medium",
55247
55119
  background: "surface"
55248
55120
  });
55249
55121
  const inlineLayout = styledSection({
55250
- children: sectionContainer(stackedComposition.layout, {
55122
+ children: props(lookSlot("layout"))(sectionContainer(stackedComposition.layout, {
55251
55123
  gap: "md",
55252
55124
  className: "newsletter-inline"
55253
- }),
55125
+ })),
55254
55126
  baseClass: "",
55255
55127
  spacing: "medium",
55256
55128
  background: "surface"
55257
55129
  });
55258
55130
  const editorialSplitLayout = styledSection({
55259
- children: sectionContainer([el("div", { className: "newsletter-editorial-split-copy" }, newsletterCopyFragment.layout), el("div", { className: "newsletter-editorial-split-form" }, newsletterFormFragment.layout)], {
55131
+ children: props(lookSlot("layout"))(sectionContainer([el("div", {
55132
+ className: "newsletter-editorial-split-copy",
55133
+ ...lookSlot("head")
55134
+ }, newsletterCopyFragment.layout), el("div", {
55135
+ className: "newsletter-editorial-split-form",
55136
+ ...lookSlot("panel")
55137
+ }, newsletterFormFragment.layout)], {
55260
55138
  gap: "lg",
55261
55139
  className: "newsletter-editorial-split"
55262
- }),
55140
+ })),
55263
55141
  baseClass: "",
55264
55142
  spacing: "comfortable",
55265
55143
  background: "surface"
55266
55144
  });
55145
+ const archLayout = styledSection({
55146
+ children: el("div", {
55147
+ className: "rb-container",
55148
+ ...lookSlot("layout")
55149
+ }, [el("div", lookSlot("frame"), [el("div", {
55150
+ className: "rb-grid",
55151
+ ...lookSlot("head")
55152
+ }, newsletterCopyFragment.layout), ...newsletterFormFragment.layout])]),
55153
+ baseClass: "",
55154
+ spacing: "medium",
55155
+ background: "surface"
55156
+ });
55267
55157
  const newsletterSignupManifest = createBlockManifest({
55268
55158
  id: "block.newsletter-signup",
55269
55159
  title: "Newsletter Signup",
@@ -55278,13 +55168,26 @@ const newsletterSignupManifest = createBlockManifest({
55278
55168
  fragment: newsletterFormFragment,
55279
55169
  fieldPriority: 1
55280
55170
  }],
55171
+ additionalFields: [{
55172
+ id: "archFrame",
55173
+ type: "boolean",
55174
+ label: "Arch frame",
55175
+ ui: {
55176
+ intent: "display",
55177
+ hidden: true
55178
+ }
55179
+ }],
55281
55180
  layout: stackedLayout$1,
55282
55181
  variants: {
55182
+ arch: archLayout,
55283
55183
  stacked: stackedLayout$1,
55284
55184
  inline: inlineLayout,
55285
55185
  "editorial-split": editorialSplitLayout
55286
55186
  },
55287
- variantMeaning: { kind: "arrangement" },
55187
+ variantMeaning: {
55188
+ kind: "arrangement",
55189
+ lookOnlyKeys: ["arch"]
55190
+ },
55288
55191
  defaultVariant: "stacked",
55289
55192
  variantOptions: {
55290
55193
  stacked: {
@@ -58354,41 +58257,48 @@ function textInputConstraints(field, inputType) {
58354
58257
  ...typeof field.pattern === "string" && field.pattern ? { pattern: field.pattern } : {}
58355
58258
  };
58356
58259
  }
58357
- function LabelledField({ basics, children }) {
58260
+ function LabelledField({ basics, children, lookSlots }) {
58358
58261
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
58359
58262
  className: "fb-field",
58263
+ ...listLookSlot({ lookSlots }, "item"),
58360
58264
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", {
58361
58265
  htmlFor: basics.inputId,
58362
58266
  className: "form-label",
58267
+ ...listLookSlot({ lookSlots }, "fact-label"),
58363
58268
  children: basics.label
58364
58269
  }), children]
58365
58270
  });
58366
58271
  }
58367
- function TextareaField({ field }) {
58272
+ function TextareaField({ field, lookSlots }) {
58368
58273
  const basics = fieldBasics(field);
58369
58274
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LabelledField, {
58370
58275
  basics,
58276
+ lookSlots,
58371
58277
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", {
58372
58278
  id: basics.inputId,
58373
58279
  name: field.id,
58374
58280
  required: basics.required,
58375
58281
  placeholder: field.placeholder,
58376
58282
  rows: field.rows,
58283
+ ...listLookSlot({ lookSlots }, "control"),
58377
58284
  className: "form-textarea"
58378
58285
  })
58379
58286
  });
58380
58287
  }
58381
- function SelectField({ field }) {
58288
+ function SelectField({ field, lookSlots }) {
58382
58289
  const basics = fieldBasics(field);
58383
58290
  const options = field.options ?? [];
58384
58291
  const multiple = Boolean(field.multiple);
58385
58292
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LabelledField, {
58386
58293
  basics,
58294
+ lookSlots,
58387
58295
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", {
58388
58296
  id: basics.inputId,
58389
58297
  name: field.id,
58390
58298
  multiple,
58299
+ ...listLookControl({ lookSlots }, multiple ? "select-multiple" : "select"),
58391
58300
  required: basics.required,
58301
+ ...listLookSlot({ lookSlots }, "control"),
58392
58302
  className: "form-select",
58393
58303
  children: [!multiple && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", {
58394
58304
  value: "",
@@ -58400,13 +58310,15 @@ function SelectField({ field }) {
58400
58310
  })
58401
58311
  });
58402
58312
  }
58403
- function RadioField({ field }) {
58313
+ function RadioField({ field, lookSlots }) {
58404
58314
  const basics = fieldBasics(field);
58405
58315
  const options = field.options ?? [];
58406
58316
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("fieldset", {
58407
58317
  className: "fb-fieldset",
58318
+ ...listLookSlot({ lookSlots }, "item"),
58408
58319
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("legend", {
58409
58320
  className: "form-label",
58321
+ ...listLookSlot({ lookSlots }, "fact-label"),
58410
58322
  children: basics.label
58411
58323
  }), options.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", {
58412
58324
  className: "form-check",
@@ -58415,19 +58327,22 @@ function RadioField({ field }) {
58415
58327
  name: field.id,
58416
58328
  value: opt.value,
58417
58329
  required: basics.required,
58330
+ ...listLookSlot({ lookSlots }, "mark"),
58418
58331
  className: "form-radio"
58419
58332
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
58420
58333
  className: "form-check-label",
58334
+ ...listLookSlot({ lookSlots }, "fact-label"),
58421
58335
  children: opt.label
58422
58336
  })]
58423
58337
  }, opt.value))]
58424
58338
  });
58425
58339
  }
58426
- function TextInputField({ field, type }) {
58340
+ function TextInputField({ field, type, lookSlots }) {
58427
58341
  const basics = fieldBasics(field);
58428
58342
  const inputType = textInputType(type);
58429
58343
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LabelledField, {
58430
58344
  basics,
58345
+ lookSlots,
58431
58346
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
58432
58347
  id: basics.inputId,
58433
58348
  name: field.id,
@@ -58435,37 +58350,95 @@ function TextInputField({ field, type }) {
58435
58350
  required: basics.required,
58436
58351
  placeholder: field.placeholder,
58437
58352
  ...textInputConstraints(field, inputType),
58353
+ ...listLookSlot({ lookSlots }, "control"),
58438
58354
  className: "form-input"
58439
58355
  })
58440
58356
  });
58441
58357
  }
58442
- function FormFieldControl({ field }) {
58358
+ function FormFieldControl({ field, lookSlots }) {
58443
58359
  const type = String(field.type ?? "text");
58444
58360
  switch (type) {
58445
- case "textarea": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TextareaField, { field });
58446
- case "select": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SelectField, { field });
58447
- case "radio": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RadioField, { field });
58361
+ case "textarea": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TextareaField, {
58362
+ field,
58363
+ lookSlots
58364
+ });
58365
+ case "select": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SelectField, {
58366
+ field,
58367
+ lookSlots
58368
+ });
58369
+ case "radio": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RadioField, {
58370
+ field,
58371
+ lookSlots
58372
+ });
58448
58373
  case "checkbox":
58449
- case "consent": {
58450
- const basics = fieldBasics(field);
58451
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CheckboxChoice, {
58452
- name: field.id,
58453
- required: basics.required,
58454
- label: basics.label,
58455
- presentation: type === "consent" ? "tile" : "row"
58456
- });
58457
- }
58374
+ case "consent": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChoiceField, {
58375
+ field,
58376
+ lookSlots
58377
+ });
58458
58378
  default: return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TextInputField, {
58459
58379
  field,
58460
- type
58380
+ type,
58381
+ lookSlots
58461
58382
  });
58462
58383
  }
58463
58384
  }
58385
+ function ChoiceField({ field, lookSlots }) {
58386
+ const basics = fieldBasics(field);
58387
+ const choice = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CheckboxChoice, {
58388
+ ...listLookSlot({ lookSlots }, "mark"),
58389
+ name: field.id,
58390
+ required: basics.required,
58391
+ label: lookSlots ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
58392
+ ...listLookSlot({ lookSlots }, "fact-label"),
58393
+ children: basics.label
58394
+ }) : basics.label,
58395
+ presentation: field.type === "consent" ? "tile" : "row"
58396
+ });
58397
+ return lookSlots ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58398
+ ...listLookSlot({ lookSlots }, "item"),
58399
+ children: choice
58400
+ }) : choice;
58401
+ }
58402
+
58403
+ //#endregion
58404
+ //#region ../blocks/src/system/runtime/nodes/form.parts.tsx
58405
+ /** SSR and hydration consume the same decided field groups and Look hooks. */
58406
+ function FormFieldGroups({ groups, lookSlots }) {
58407
+ const renderField$1 = (field) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FormFieldControl, {
58408
+ field,
58409
+ lookSlots
58410
+ }, field.id);
58411
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: groups.map((group) => group.type === "row" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58412
+ className: "fb-row fb-row-2",
58413
+ ...listLookSlot({ lookSlots }, "group"),
58414
+ children: group.fields.map(renderField$1)
58415
+ }, group.key) : renderField$1(group.field)) });
58416
+ }
58417
+ function FormSubmitAction({ lookSlots, submitLabel, disabled }) {
58418
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58419
+ className: "fb-actions",
58420
+ ...listLookSlot({ lookSlots }, "actions"),
58421
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58422
+ className: "fb-actions-inner",
58423
+ ...listLookSlot({ lookSlots }, "inline"),
58424
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
58425
+ ...listLookSlot({ lookSlots }, "action"),
58426
+ type: "submit",
58427
+ variant: "primary",
58428
+ size: "md",
58429
+ extraClassName: "rb-w-full rb-sm-w-auto",
58430
+ disabled,
58431
+ label: submitLabel
58432
+ })
58433
+ })
58434
+ });
58435
+ }
58464
58436
 
58465
58437
  //#endregion
58466
58438
  //#region ../blocks/src/system/runtime/nodes/form.server.tsx
58467
- const FormNodeSSR = ({ blockId, value, submitLabel, successMessage, className, onSubmit, action = "/api/forms/submit", siteId, apiBaseUrl, spamProtectionEnabled }) => {
58439
+ const FormNodeSSR = ({ blockId, lookSlots, value, submitLabel, successMessage, className, onSubmit, action = "/api/forms/submit", siteId, apiBaseUrl, spamProtectionEnabled }) => {
58468
58440
  const islandProps = buildFormInteractiveIslandProps({
58441
+ lookSlots,
58469
58442
  value,
58470
58443
  siteId,
58471
58444
  apiBaseUrl,
@@ -58487,14 +58460,13 @@ const FormNodeSSR = ({ blockId, value, submitLabel, successMessage, className, o
58487
58460
  })]
58488
58461
  });
58489
58462
  }
58490
- const groups = display.groups;
58491
- const renderField$1 = (field) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FormFieldControl, { field }, field.id);
58492
58463
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
58493
58464
  ...getIslandRootProps("form", blockId),
58494
58465
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(IslandPropsScript, { value: islandProps }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", {
58495
58466
  method: "POST",
58496
58467
  action,
58497
58468
  onSubmit,
58469
+ ...listLookSlot(display, "grid"),
58498
58470
  className: clsx_default("fb-form", display.className ?? undefined),
58499
58471
  children: [
58500
58472
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
@@ -58509,27 +58481,13 @@ const FormNodeSSR = ({ blockId, value, submitLabel, successMessage, className, o
58509
58481
  tabIndex: -1,
58510
58482
  autoComplete: "off"
58511
58483
  }),
58512
- groups.map((group) => {
58513
- if (group.type === "row") {
58514
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58515
- className: "fb-row fb-row-2",
58516
- children: group.fields.map(renderField$1)
58517
- }, group.key);
58518
- }
58519
- return renderField$1(group.field);
58484
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FormFieldGroups, {
58485
+ groups: display.groups,
58486
+ lookSlots: display.lookSlots
58520
58487
  }),
58521
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58522
- className: "fb-actions",
58523
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58524
- className: "fb-actions-inner",
58525
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
58526
- type: "submit",
58527
- variant: "primary",
58528
- size: "md",
58529
- extraClassName: "rb-w-full rb-sm-w-auto",
58530
- label: display.submitLabel
58531
- })
58532
- })
58488
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FormSubmitAction, {
58489
+ submitLabel: display.submitLabel,
58490
+ lookSlots: display.lookSlots
58533
58491
  })
58534
58492
  ]
58535
58493
  })]
@@ -58542,29 +58500,30 @@ const FormNodeSSR = ({ blockId, value, submitLabel, successMessage, className, o
58542
58500
  * Newsletter form pieces shared by the SSR render and the hydrated island, so
58543
58501
  * both produce the same markup.
58544
58502
  *
58545
- * Labels are visually hidden: every field has a placeholder, and a visible
58546
- * "Email *" label over a single field reads like a generic form. Screen
58547
- * readers still get the label.
58503
+ * Legacy layouts keep visually hidden labels and the joined email/button.
58504
+ * Compiler-owned Look hooks expose labelled controls and a separate action.
58548
58505
  */
58549
58506
  const TOPIC_CHOICE_FIELD_ID = "mailingListChoice";
58550
58507
  const inputIdFor = (field) => `newsletter_${field.id}`;
58551
58508
  /** Splits the preset's fields into the email (joined with the button) and the rest. */
58552
- function partitionNewsletterFields(fields$2) {
58553
- const email = fields$2.find((field) => field.type === "email") ?? null;
58509
+ function partitionNewsletterFields(fields$1) {
58510
+ const email = fields$1.find((field) => field.type === "email") ?? null;
58554
58511
  return {
58555
58512
  email,
58556
- extra: fields$2.filter((field) => field !== email)
58513
+ extra: fields$1.filter((field) => field !== email)
58557
58514
  };
58558
58515
  }
58559
- function NewsletterExtraField({ field, disabled, error: error$1 }) {
58516
+ function NewsletterExtraField({ field, disabled, error: error$1, lookSlots }) {
58560
58517
  const inputId = inputIdFor(field);
58561
58518
  const errorId = `${inputId}-error`;
58562
58519
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
58563
58520
  className: "fb-field newsletter-field",
58521
+ ...listLookSlot({ lookSlots }, field.type === "email" ? "row" : "item"),
58564
58522
  children: [
58565
58523
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", {
58566
58524
  htmlFor: inputId,
58567
- className: "rb-sr-only",
58525
+ className: lookSlots ? undefined : "rb-sr-only",
58526
+ ...listLookSlot({ lookSlots }, "fact-label"),
58568
58527
  children: field.label
58569
58528
  }),
58570
58529
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
@@ -58574,6 +58533,8 @@ function NewsletterExtraField({ field, disabled, error: error$1 }) {
58574
58533
  required: field.required,
58575
58534
  placeholder: field.placeholder ?? field.label,
58576
58535
  className: "form-input",
58536
+ autoComplete: lookSlots ? field.type === "email" ? "email" : field.id === "firstName" ? "given-name" : undefined : undefined,
58537
+ ...listLookSlot({ lookSlots }, "control"),
58577
58538
  disabled,
58578
58539
  ...getFieldValidationControlProps({
58579
58540
  message: error$1,
@@ -58635,10 +58596,28 @@ function NewsletterEmailEntry({ field, buttonVariant, buttonLabel, disabled, err
58635
58596
  * The submit action: joined to the email field when the preset has one
58636
58597
  * (every current preset does), otherwise a plain themed button.
58637
58598
  */
58638
- function NewsletterSubmitRow({ emailField, buttonVariant, buttonLabel, disabled, error: error$1 }) {
58639
- if (emailField) {
58599
+ function NewsletterSubmitRow({ emailField: emailField$1, lookSlots, buttonVariant, buttonLabel, disabled, error: error$1 }) {
58600
+ if (lookSlots) {
58601
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [emailField$1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterExtraField, {
58602
+ field: emailField$1,
58603
+ lookSlots,
58604
+ disabled,
58605
+ error: error$1
58606
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58607
+ ...listLookSlot({ lookSlots }, "actions"),
58608
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemedButton, {
58609
+ ...listLookSlot({ lookSlots }, "action"),
58610
+ type: "submit",
58611
+ variant: buttonVariant,
58612
+ size: "md",
58613
+ disabled,
58614
+ label: buttonLabel
58615
+ })
58616
+ })] });
58617
+ }
58618
+ if (emailField$1) {
58640
58619
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterEmailEntry, {
58641
- field: emailField,
58620
+ field: emailField$1,
58642
58621
  buttonVariant,
58643
58622
  buttonLabel,
58644
58623
  disabled,
@@ -58704,7 +58683,7 @@ function NewsletterFormSSR(props$1) {
58704
58683
  className
58705
58684
  });
58706
58685
  const display = islandProps.render.display;
58707
- const fields$2 = display.fields;
58686
+ const fields$1 = display.fields;
58708
58687
  const submissionMessage = newsletterBlockSubmissionMessage(islandProps.render.hydration.target);
58709
58688
  if (display.availability === "unavailable") {
58710
58689
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
@@ -58715,9 +58694,10 @@ function NewsletterFormSSR(props$1) {
58715
58694
  })
58716
58695
  });
58717
58696
  }
58718
- const { email: emailField, extra: extraFields } = partitionNewsletterFields(fields$2);
58697
+ const { email: emailField$1, extra: extraFields } = partitionNewsletterFields(fields$1);
58719
58698
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
58720
58699
  ...getIslandRootProps("newsletter-form", blockId),
58700
+ ...listLookSlot(display, "panel"),
58721
58701
  className: clsx_default("newsletter-form-ssr", className),
58722
58702
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(IslandPropsScript, { value: islandProps }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", {
58723
58703
  method: "POST",
@@ -58733,14 +58713,20 @@ function NewsletterFormSSR(props$1) {
58733
58713
  }),
58734
58714
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
58735
58715
  className: "newsletter-form-fields",
58716
+ ...listLookSlot(display, "grid"),
58736
58717
  children: [
58737
58718
  islandProps.render.hydration.choicePresentation === "visitor_choice" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterTopicChips, { choices: display.choices }) : null,
58738
58719
  extraFields.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
58739
58720
  className: "newsletter-extra-fields",
58740
- children: extraFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterExtraField, { field }, field.id))
58721
+ ...listLookSlot(display, "items"),
58722
+ children: extraFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterExtraField, {
58723
+ lookSlots: display.lookSlots,
58724
+ field
58725
+ }, field.id))
58741
58726
  }) : null,
58742
58727
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NewsletterSubmitRow, {
58743
- emailField,
58728
+ lookSlots: display.lookSlots,
58729
+ emailField: emailField$1,
58744
58730
  buttonVariant: display.buttonVariant,
58745
58731
  buttonLabel: display.buttonLabel,
58746
58732
  disabled: submissionMessage !== null
@@ -58753,6 +58739,7 @@ function NewsletterFormSSR(props$1) {
58753
58739
  }),
58754
58740
  display.privacyNote && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
58755
58741
  className: "newsletter-privacy-note",
58742
+ ...listLookSlot(display, "caption"),
58756
58743
  children: display.privacyNote
58757
58744
  })
58758
58745
  ]
@@ -60121,9 +60108,8 @@ function arrangementSlotProps(props$1, content, scopes$1) {
60121
60108
  function arrangementMediaPlaceholder(node, context) {
60122
60109
  const content = context.blockContent;
60123
60110
  if (!isPlainObject$5(content) || content._lookAudience !== "authoring" || content.showPhotos === false) return null;
60124
- const media$1 = node.type === "media" ? node : node.children?.find((child) => child.type === "media");
60125
- if (!media$1?.$bind) return null;
60126
- const from = parseBinding(media$1.$bind, "$bind").from;
60111
+ const from = arrangementPlaceholderMediaPath(node);
60112
+ if (!from) return null;
60127
60113
  const fieldPath = arrangementPlaceholderFieldPath(from, context);
60128
60114
  const placeholder = import_react.createElement(MediaPlaceholder, {
60129
60115
  fieldPath,
@@ -60136,6 +60122,13 @@ function arrangementMediaPlaceholder(node, context) {
60136
60122
  "data-placeholder-field": fieldPath
60137
60123
  }, placeholder);
60138
60124
  }
60125
+ /** Layout/legacy guards stay hidden even if their subtree contains empty media. */
60126
+ function arrangementPlaceholderMediaPath(node) {
60127
+ const media$1 = node.type === "media" ? node : node.children?.find((child) => child.type === "media");
60128
+ if (!media$1?.$bind || !node.$when) return null;
60129
+ const from = parseBinding(media$1.$bind, "$bind").from;
60130
+ return parseBinding(node.$when.when, "$when.when").from === from ? from : null;
60131
+ }
60139
60132
  function arrangementPlaceholderFieldPath(from, context) {
60140
60133
  const segments = getAbsoluteSegments(from, context);
60141
60134
  return segments === undefined ? from : segmentsToPath(segments)?.replace(/^content\./, "") ?? from;
@@ -64113,6 +64106,92 @@ function shouldDebugCustomBlocks() {
64113
64106
  }
64114
64107
  }
64115
64108
 
64109
+ //#endregion
64110
+ //#region ../blocks/src/system/fields/imageShape.ts
64111
+ const standardImageShapeOptions = [
64112
+ {
64113
+ value: "default",
64114
+ label: "Default"
64115
+ },
64116
+ {
64117
+ value: "square",
64118
+ label: "Square corners"
64119
+ },
64120
+ {
64121
+ value: "rounded",
64122
+ label: "Rounded corners"
64123
+ },
64124
+ {
64125
+ value: "circle",
64126
+ label: "Circle"
64127
+ },
64128
+ {
64129
+ value: "arch",
64130
+ label: "Arch"
64131
+ }
64132
+ ];
64133
+ function createImageShapeField(options = {}) {
64134
+ return {
64135
+ id: options.id ?? "imageShape",
64136
+ type: "select",
64137
+ label: options.label ?? "Image shape",
64138
+ ...options.description ? { description: options.description } : {},
64139
+ required: false,
64140
+ defaultValue: options.defaultValue ?? "default",
64141
+ multiple: false,
64142
+ options: [...standardImageShapeOptions],
64143
+ ui: {
64144
+ intent: options.uiIntent ?? "display",
64145
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
64146
+ }
64147
+ };
64148
+ }
64149
+
64150
+ //#endregion
64151
+ //#region ../blocks/src/system/fields/aspectRatio.ts
64152
+ const standardAspectRatioOptions = [
64153
+ {
64154
+ value: "auto",
64155
+ label: "Auto (original)"
64156
+ },
64157
+ {
64158
+ value: "16/9",
64159
+ label: "16:9 (Landscape)"
64160
+ },
64161
+ {
64162
+ value: "4/3",
64163
+ label: "4:3 (Standard)"
64164
+ },
64165
+ {
64166
+ value: "1/1",
64167
+ label: "1:1 (Square)"
64168
+ },
64169
+ {
64170
+ value: "3/4",
64171
+ label: "3:4 (Portrait)"
64172
+ },
64173
+ {
64174
+ value: "9/16",
64175
+ label: "9:16 (Tall portrait)"
64176
+ }
64177
+ ];
64178
+ function createAspectRatioField(options = {}) {
64179
+ return {
64180
+ id: options.id ?? "aspectRatio",
64181
+ type: "select",
64182
+ label: options.label ?? "Aspect ratio",
64183
+ ...options.description ? { description: options.description } : {},
64184
+ required: false,
64185
+ defaultValue: options.defaultValue ?? "auto",
64186
+ multiple: false,
64187
+ options: [...standardAspectRatioOptions],
64188
+ ui: {
64189
+ intent: options.uiIntent ?? "display",
64190
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
64191
+ }
64192
+ };
64193
+ }
64194
+
64116
64195
  //#endregion
64117
64196
  //#region ../blocks/src/system/customize/facets.ts
64118
64197
  function defineCustomizeFacet(definition$1) {
@@ -64207,7 +64286,14 @@ const systemCustomizeFacetDefinitions = [
64207
64286
  }
64208
64287
  ], "3", true),
64209
64288
  fixedKnob("block.testimonials", "tilt", "Tilt the small cards", onOff, "true", false, true),
64210
- fixedKnob("block.testimonials", "archFrame", "Arch frame", onOff, "true", false, true),
64289
+ {
64290
+ ...fixedKnob("block.testimonials", "archFrame", "Arch frame", onOff, "true", false, true),
64291
+ blockKinds: [
64292
+ "block.testimonials",
64293
+ "block.newsletter-signup",
64294
+ "block.form"
64295
+ ]
64296
+ },
64211
64297
  fixedKnob("block.hero", "candleGlow", "Candle glow", onOff, "true", false, true),
64212
64298
  fixedKnob("block.hero", "columnGuides", "Column guides", onOff, "true", false, true),
64213
64299
  fixedKnob("block.hero", "titleSize", "Headline size", [
@@ -64231,6 +64317,15 @@ const systemCustomizeFacetDefinitions = [
64231
64317
  value: "right",
64232
64318
  label: "Right"
64233
64319
  }], "right"),
64320
+ fixedKnob("block.media-text", "imagePosition", "Photo side", [{
64321
+ value: "left",
64322
+ label: "Left"
64323
+ }, {
64324
+ value: "right",
64325
+ label: "Right"
64326
+ }], "left"),
64327
+ fixedKnob("block.media-text", "imageShape", "Media shape", standardImageShapeOptions, "default"),
64328
+ fixedKnob("block.media-text", "aspectRatio", "Media aspect ratio", standardAspectRatioOptions, "auto"),
64234
64329
  textKnob("stickerLine", "Sticker line", 32),
64235
64330
  textKnob("smallCaption", "Small caption", 24),
64236
64331
  {
@@ -64887,8 +64982,8 @@ function deriveFieldValidationPlan(field, path$4 = [field.id]) {
64887
64982
  default: return assertNever$5(field);
64888
64983
  }
64889
64984
  }
64890
- function deriveFieldValidationPlans(fields$2, parentPath = []) {
64891
- return fields$2.map((field) => deriveFieldValidationPlan(field, [...parentPath, field.id]));
64985
+ function deriveFieldValidationPlans(fields$1, parentPath = []) {
64986
+ return fields$1.map((field) => deriveFieldValidationPlan(field, [...parentPath, field.id]));
64892
64987
  }
64893
64988
  function commonConstraints(required, ...specific) {
64894
64989
  return required ? [{ kind: "required" }, ...specific] : [...specific];
@@ -64939,15 +65034,15 @@ function deriveRepeatedItemVariants(field, parentPath) {
64939
65034
  fields: deriveNestedFieldPlans(getFlattenedRepeaterFields(itemType.fields), parentPath)
64940
65035
  }));
64941
65036
  }
64942
- function deriveNestedFieldPlans(fields$2, parentPath) {
64943
- return deriveFieldValidationPlans(fields$2, parentPath);
65037
+ function deriveNestedFieldPlans(fields$1, parentPath) {
65038
+ return deriveFieldValidationPlans(fields$1, parentPath);
64944
65039
  }
64945
65040
  function getRepeaterFields(field) {
64946
- const fields$2 = field.polymorphic && field.itemTypes ? Object.values(field.itemTypes).flatMap((itemType) => itemType.fields) : field.schema?.fields ?? [];
64947
- return getFlattenedRepeaterFields(fields$2);
65041
+ const fields$1 = field.polymorphic && field.itemTypes ? Object.values(field.itemTypes).flatMap((itemType) => itemType.fields) : field.schema?.fields ?? [];
65042
+ return getFlattenedRepeaterFields(fields$1);
64948
65043
  }
64949
- function getFlattenedRepeaterFields(fields$2) {
64950
- return fields$2.flatMap((child) => {
65044
+ function getFlattenedRepeaterFields(fields$1) {
65045
+ return fields$1.flatMap((child) => {
64951
65046
  if (child.type === "group" && child.ui?.flattenInRepeater) {
64952
65047
  return child.schema?.fields ?? [];
64953
65048
  }
@@ -65088,11 +65183,11 @@ function normalizeStoredRepeaterItems(plan, value, ctx) {
65088
65183
  return item;
65089
65184
  }
65090
65185
  const itemRecord = item;
65091
- const fields$2 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemRecord._type)?.fields : plan.repeatedItemPlan;
65092
- if (!fields$2) {
65186
+ const fields$1 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemRecord._type)?.fields : plan.repeatedItemPlan;
65187
+ if (!fields$1) {
65093
65188
  return item;
65094
65189
  }
65095
- return normalizeStoredObjectChildren(fields$2, itemRecord, ctx);
65190
+ return normalizeStoredObjectChildren(fields$1, itemRecord, ctx);
65096
65191
  });
65097
65192
  }
65098
65193
  function validateFieldValue(plan, value, options = {}) {
@@ -65145,9 +65240,9 @@ function normalizeRepeaterItems(plan, value, ctx) {
65145
65240
  return value.map((item) => {
65146
65241
  if (!item || typeof item !== "object" || Array.isArray(item)) return item;
65147
65242
  const itemRecord = item;
65148
- const fields$2 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemRecord._type)?.fields : plan.repeatedItemPlan;
65149
- if (!fields$2) return item;
65150
- return normalizeObjectChildren(fields$2, itemRecord, ctx);
65243
+ const fields$1 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemRecord._type)?.fields : plan.repeatedItemPlan;
65244
+ if (!fields$1) return item;
65245
+ return normalizeObjectChildren(fields$1, itemRecord, ctx);
65151
65246
  });
65152
65247
  }
65153
65248
  function normalizeNumberInput(value, _allowNull) {
@@ -65299,9 +65394,9 @@ function validateRepeaterItem(plan, item, index, ctx) {
65299
65394
  label: `${plan.label} item type`
65300
65395
  }];
65301
65396
  }
65302
- const fields$2 = variant?.fields ?? plan.repeatedItemPlan;
65303
- if (!fields$2) return [];
65304
- return fields$2.flatMap((childPlan) => {
65397
+ const fields$1 = variant?.fields ?? plan.repeatedItemPlan;
65398
+ if (!fields$1) return [];
65399
+ return fields$1.flatMap((childPlan) => {
65305
65400
  const indexedPlan = materializeRepeaterItemPlan(childPlan, plan.path, index);
65306
65401
  return validateNormalizedFieldValue(indexedPlan, item[childPlan.fieldId], ctx);
65307
65402
  });
@@ -65570,8 +65665,8 @@ function fieldValidationDescriptor(plan) {
65570
65665
  function sameFieldPath(left, right) {
65571
65666
  return left.length === right.length && left.every((segment, index) => segment === right[index]);
65572
65667
  }
65573
- function validateManifestValues(fields$2, values, options = {}) {
65574
- const plans = deriveFieldValidationPlans(fields$2);
65668
+ function validateManifestValues(fields$1, values, options = {}) {
65669
+ const plans = deriveFieldValidationPlans(fields$1);
65575
65670
  const normalized = normalizeStoredContentValues(plans, values, options);
65576
65671
  return plans.flatMap((plan) => validateFieldValue(plan, normalized[plan.fieldId], options));
65577
65672
  }
@@ -65893,8 +65988,8 @@ function deriveStrictContentZodFromPlans(plans, mode = "strict") {
65893
65988
  return z.object(shape).catchall(z.unknown()).passthrough();
65894
65989
  }
65895
65990
  function derivePlansFromManifestOrFields(manifestOrFields) {
65896
- const fields$2 = Array.isArray(manifestOrFields) ? manifestOrFields : manifestOrFields.fields ?? [];
65897
- return deriveFieldValidationPlans(fields$2);
65991
+ const fields$1 = Array.isArray(manifestOrFields) ? manifestOrFields : manifestOrFields.fields ?? [];
65992
+ return deriveFieldValidationPlans(fields$1);
65898
65993
  }
65899
65994
  function zodAdmissionError(error$1) {
65900
65995
  return {
@@ -65951,8 +66046,8 @@ function visitRepeatedMedia(plan, value, path$4, visit) {
65951
66046
  if (!Array.isArray(value)) return;
65952
66047
  value.forEach((item, index) => {
65953
66048
  if (!isPlainRecord(item)) return;
65954
- const fields$2 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === item._type)?.fields : plan.repeatedItemPlan;
65955
- if (fields$2) visitPlannedMedia(fields$2, item, [...path$4, index], visit);
66049
+ const fields$1 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === item._type)?.fields : plan.repeatedItemPlan;
66050
+ if (fields$1) visitPlannedMedia(fields$1, item, [...path$4, index], visit);
65956
66051
  });
65957
66052
  }
65958
66053
  function collectManifestMediaReferences(contract, content) {
@@ -66047,8 +66142,8 @@ function withLookCapability(declaration) {
66047
66142
  * field admits, read from its manifest so the design capability cannot drift
66048
66143
  * from what render admission accepts. A block without the field admits none.
66049
66144
  */
66050
- function sectionBackgroundPaintsOfFields(fields$2) {
66051
- const sectionStyles = fields$2.find((field) => field.id === "_sectionStyles");
66145
+ function sectionBackgroundPaintsOfFields(fields$1) {
66146
+ const sectionStyles = fields$1.find((field) => field.id === "_sectionStyles");
66052
66147
  if (!sectionStyles || sectionStyles.type !== "modal") return [];
66053
66148
  const background = sectionStyles.schema.fields.find((field) => field.id === "background");
66054
66149
  if (!background || background.type !== "tabGroup") return [];
@@ -66060,13 +66155,13 @@ function sectionBackgroundPaintsOfFields(fields$2) {
66060
66155
  ].filter((paint) => tabIds.has(paint));
66061
66156
  }
66062
66157
  /** Pins a designed capability's section background paints to the block's manifest. */
66063
- function withManifestSectionBackgroundPaints(declaration, fields$2) {
66158
+ function withManifestSectionBackgroundPaints(declaration, fields$1) {
66064
66159
  if (declaration.kind !== "capability") return declaration;
66065
66160
  return {
66066
66161
  kind: "capability",
66067
66162
  capability: {
66068
66163
  ...declaration.capability,
66069
- sectionBackgroundPaints: sectionBackgroundPaintsOfFields(fields$2)
66164
+ sectionBackgroundPaints: sectionBackgroundPaintsOfFields(fields$1)
66070
66165
  }
66071
66166
  };
66072
66167
  }
@@ -66173,47 +66268,6 @@ function createImagePositionField(options = {}) {
66173
66268
  };
66174
66269
  }
66175
66270
 
66176
- //#endregion
66177
- //#region ../blocks/src/system/fields/imageShape.ts
66178
- const standardImageShapeOptions = [
66179
- {
66180
- value: "default",
66181
- label: "Default"
66182
- },
66183
- {
66184
- value: "square",
66185
- label: "Square corners"
66186
- },
66187
- {
66188
- value: "rounded",
66189
- label: "Rounded corners"
66190
- },
66191
- {
66192
- value: "circle",
66193
- label: "Circle"
66194
- },
66195
- {
66196
- value: "arch",
66197
- label: "Arch"
66198
- }
66199
- ];
66200
- function createImageShapeField(options = {}) {
66201
- return {
66202
- id: options.id ?? "imageShape",
66203
- type: "select",
66204
- label: options.label ?? "Image shape",
66205
- ...options.description ? { description: options.description } : {},
66206
- required: false,
66207
- defaultValue: options.defaultValue ?? "default",
66208
- multiple: false,
66209
- options: [...standardImageShapeOptions],
66210
- ui: {
66211
- intent: options.uiIntent ?? "display",
66212
- ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
66213
- }
66214
- };
66215
- }
66216
-
66217
66271
  //#endregion
66218
66272
  //#region ../blocks/src/system/blocks/hero.ts
66219
66273
  const heroCopyAndCta = composeFragments([{ fragment: heroCopyFragment }, { fragment: heroCtaRowFragment }]);
@@ -66568,51 +66622,6 @@ function gapSelectField(options = {}) {
66568
66622
  });
66569
66623
  }
66570
66624
 
66571
- //#endregion
66572
- //#region ../blocks/src/system/fields/aspectRatio.ts
66573
- const standardAspectRatioOptions = [
66574
- {
66575
- value: "auto",
66576
- label: "Auto (original)"
66577
- },
66578
- {
66579
- value: "16/9",
66580
- label: "16:9 (Landscape)"
66581
- },
66582
- {
66583
- value: "4/3",
66584
- label: "4:3 (Standard)"
66585
- },
66586
- {
66587
- value: "1/1",
66588
- label: "1:1 (Square)"
66589
- },
66590
- {
66591
- value: "3/4",
66592
- label: "3:4 (Portrait)"
66593
- },
66594
- {
66595
- value: "9/16",
66596
- label: "9:16 (Tall portrait)"
66597
- }
66598
- ];
66599
- function createAspectRatioField(options = {}) {
66600
- return {
66601
- id: options.id ?? "aspectRatio",
66602
- type: "select",
66603
- label: options.label ?? "Aspect ratio",
66604
- ...options.description ? { description: options.description } : {},
66605
- required: false,
66606
- defaultValue: options.defaultValue ?? "auto",
66607
- multiple: false,
66608
- options: [...standardAspectRatioOptions],
66609
- ui: {
66610
- intent: options.uiIntent ?? "display",
66611
- ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
66612
- }
66613
- };
66614
- }
66615
-
66616
66625
  //#endregion
66617
66626
  //#region ../blocks/src/system/blocks/intro.ts
66618
66627
  function introHeading(className) {
@@ -66847,18 +66856,11 @@ const introBlockDefinition = { manifest: introManifest };
66847
66856
  //#endregion
66848
66857
  //#region ../blocks/src/system/blocks/body-text.ts
66849
66858
  const bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
66850
- const proseLayout = styledSection({
66851
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
66852
- spacing: "medium",
66853
- baseClass: ""
66854
- });
66855
- const introLayout = styledSection({
66856
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
66857
- spacing: "medium",
66858
- baseClass: ""
66859
- });
66860
- const narrowLayout = styledSection({
66861
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
66859
+ const bodyTextLayout = styledSection({
66860
+ children: stack({
66861
+ className: "rb-container",
66862
+ ...lookSlot("frame")
66863
+ }, bodyCopyComposition.layout),
66862
66864
  spacing: "medium",
66863
66865
  baseClass: ""
66864
66866
  });
@@ -66872,11 +66874,11 @@ const bodyTextManifest = createBlockManifest({
66872
66874
  fragment: bodyCopyFragment,
66873
66875
  fieldPriority: 0
66874
66876
  }],
66875
- layout: proseLayout,
66877
+ layout: bodyTextLayout,
66876
66878
  variants: {
66877
- prose: proseLayout,
66878
- intro: introLayout,
66879
- narrow: narrowLayout
66879
+ prose: bodyTextLayout,
66880
+ intro: bodyTextLayout,
66881
+ narrow: bodyTextLayout
66880
66882
  },
66881
66883
  variantMeaning: { kind: "arrangement" },
66882
66884
  defaultVariant: "prose",
@@ -67636,10 +67638,7 @@ const transformDefinitions = {
67636
67638
  "layout.footerBottomBarClass": footerBottomBarClassTransform,
67637
67639
  "layout.footerBottomBarContainerClass": footerBottomBarContainerClassTransform,
67638
67640
  "layout.footerBottomBarStyle": footerBottomBarStyleTransform,
67639
- "layout.footerSplitMainClass": footerSplitMainClassTransform,
67640
67641
  "layout.footerLogoClass": footerLogoClassTransform,
67641
- "layout.footerLogoMediaClass": footerLogoMediaClassTransform,
67642
- "layout.footerLogoTextVisible": footerLogoTextVisibleTransform,
67643
67642
  "ui.headingClassFromAlignment": headingClassFromAlignment,
67644
67643
  "ui.bodyClassFromAlignment": bodyClassFromAlignment,
67645
67644
  "ui.stackAlignFromAlignment": stackAlignFromAlignment,
@@ -67963,7 +67962,14 @@ const footerNavGroupsLayout = stack({
67963
67962
  }, [text({
67964
67963
  as: "h3",
67965
67964
  className: "rb-label",
67966
- style: textColorStyle("text/70")
67965
+ "data-slot": { $bind: { from: "content.footerRuntime.slots.group-label" } },
67966
+ style: { $bind: {
67967
+ from: "content.footerRuntime.arrangement",
67968
+ transforms: [{
67969
+ id: "layout.footerModuleInkStyle",
67970
+ options: { opacity: 70 }
67971
+ }]
67972
+ } }
67967
67973
  }, when("group.label"), bind("group.label")), stack({
67968
67974
  gap: "sm",
67969
67975
  align: "start",
@@ -67994,6 +68000,14 @@ const footerMailingListBindings = {
67994
68000
  targeting: { $bind: { from: "module.engagement.runtime.targeting" } }
67995
68001
  };
67996
68002
  const footerSpamProtectionBinding = { spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } } };
68003
+ const brandMedia = media({ className: "rb-h-10 rb-w-auto" }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
68004
+ id: "layout.chromeLogo",
68005
+ options: { surface: "footer-root" }
68006
+ }] }));
68007
+ const brandTitle = text({
68008
+ as: "strong",
68009
+ className: "footer-logo-text rb-nav-text"
68010
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }));
67997
68011
  const brandLogo = link$1({
67998
68012
  href: "/",
67999
68013
  className: { $bind: {
@@ -68004,20 +68018,39 @@ const brandLogo = link$1({
68004
68018
  }],
68005
68019
  fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
68006
68020
  } }
68007
- }, [media({ className: { $bind: {
68008
- from: "$root.theme.footer.logo",
68009
- transforms: [{
68010
- id: "layout.footerLogoMediaClass",
68011
- options: { base: "rb-h-10 rb-w-auto" }
68012
- }],
68013
- fallback: "rb-h-10 rb-w-auto"
68014
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
68015
- id: "layout.chromeLogo",
68016
- options: { surface: "footer-root" }
68017
- }] })), text({
68018
- as: "strong",
68019
- className: "footer-logo-text rb-nav-text"
68020
- }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
68021
+ }, [brandMedia, brandTitle], (node) => ({
68022
+ ...node,
68023
+ $when: {
68024
+ when: {
68025
+ from: "module",
68026
+ transforms: [{ id: "layout.footerBrandArrangement" }]
68027
+ },
68028
+ equals: "row"
68029
+ }
68030
+ }));
68031
+ const centredBrand = stack({
68032
+ gap: "md",
68033
+ align: "center"
68034
+ }, [link$1({
68035
+ href: "/",
68036
+ "data-slot": { $bind: { from: "module.slots.media" } },
68037
+ className: "footer-logo rb-inline-flex rb-items-center rb-no-underline"
68038
+ }, [brandMedia], when("module.slots.media")), {
68039
+ ...brandTitle,
68040
+ props: {
68041
+ ...brandTitle.props,
68042
+ "data-slot": { $bind: { from: "module.slots.heading" } }
68043
+ }
68044
+ }], (node) => ({
68045
+ ...node,
68046
+ $when: {
68047
+ when: {
68048
+ from: "module",
68049
+ transforms: [{ id: "layout.footerBrandArrangement" }]
68050
+ },
68051
+ equals: "centred"
68052
+ }
68053
+ }));
68021
68054
  const navigation = stack({
68022
68055
  gap: "md",
68023
68056
  className: "rb-w-full"
@@ -68042,14 +68075,18 @@ const address = text({
68042
68075
  }, when("module.kind", { equals: "business-address" }), bind("module.address"));
68043
68076
  const contact = stack({
68044
68077
  gap: "sm",
68045
- className: "rb-items-start"
68078
+ className: { $bind: {
68079
+ from: "module.contactClassName",
68080
+ fallback: "rb-items-start"
68081
+ } }
68046
68082
  }, [link$1({
68047
68083
  href: { $bind: { from: "contactLink.href" } },
68048
68084
  className: "rb-nav-text rb-break-words transition-theme-standard"
68049
68085
  }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
68050
68086
  const hours = stack({
68051
68087
  gap: "sm",
68052
- className: "rb-w-full"
68088
+ className: "rb-w-full",
68089
+ "data-slot": { $bind: { from: "module.slots.schedule" } }
68053
68090
  }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
68054
68091
  as: "span",
68055
68092
  className: "rb-label"
@@ -68060,7 +68097,10 @@ const hours = stack({
68060
68097
  as: "p",
68061
68098
  className: "rb-caption rb-opacity-70"
68062
68099
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
68063
- const socials = inline({ className: "rb-footer-socials" }, [link$1({
68100
+ const socials = inline({
68101
+ className: "rb-footer-socials",
68102
+ "data-slot": { $bind: { from: "module.slots.social" } }
68103
+ }, [link$1({
68064
68104
  href: { $bind: { from: "social.href" } },
68065
68105
  target: "_blank",
68066
68106
  rel: "noreferrer noopener",
@@ -68069,7 +68109,14 @@ const socials = inline({ className: "rb-footer-socials" }, [link$1({
68069
68109
  }, [icon({ className: "rb-footer-social-icon" }, bind("social.icon"), when("social.icon")), text({ as: "span" }, bind("social.label"), when("social.icon", { equals: null }))], repeat("module.socialLinks", "social"))], when("module.kind", { equals: "social-links" }));
68070
68110
  const authoredCopy = richText({
68071
68111
  className: "rb-prose rb-prose-sm rb-max-w-none",
68072
- style: textColorStyle("text/80")
68112
+ "data-slot": { $bind: { from: "module.slots.copy" } },
68113
+ style: { $bind: {
68114
+ from: "content.footerRuntime.arrangement",
68115
+ transforms: [{
68116
+ id: "layout.footerModuleInkStyle",
68117
+ options: { opacity: 80 }
68118
+ }]
68119
+ } }
68073
68120
  }, when("module.content"), bind("module.content", { transforms: [{
68074
68121
  id: "content.interpolateRichTextTokens",
68075
68122
  options: { tokens: ["year", "site_name"] }
@@ -68107,19 +68154,32 @@ const platformAttribution = el("div", {
68107
68154
  ], when("module.kind", { equals: "attribution" }));
68108
68155
  const footerModule = stack({
68109
68156
  gap: "md",
68110
- align: "start",
68157
+ align: { $bind: {
68158
+ from: "module.align",
68159
+ fallback: "start"
68160
+ } },
68161
+ className: { $bind: { from: "module.className" } },
68111
68162
  "data-preview-footer-module-id": { $bind: { from: "module.id" } }
68112
68163
  }, [
68113
68164
  text({
68114
68165
  as: "h2",
68115
68166
  className: "rb-label",
68116
- style: textColorStyle("text/70")
68167
+ "data-slot": { $bind: { from: "module.slots.group-label" } },
68168
+ style: { $bind: {
68169
+ from: "content.footerRuntime.arrangement",
68170
+ transforms: [{
68171
+ id: "layout.footerModuleInkStyle",
68172
+ options: { opacity: 70 }
68173
+ }]
68174
+ } }
68117
68175
  }, bind("module.heading"), when("module.heading")),
68118
68176
  brandLogo,
68177
+ centredBrand,
68119
68178
  navigation,
68120
68179
  stack({
68121
68180
  gap: "sm",
68122
- className: "rb-w-full"
68181
+ className: "rb-w-full",
68182
+ "data-slot": { $bind: { from: "module.slots.navigation" } }
68123
68183
  }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
68124
68184
  address,
68125
68185
  contact,
@@ -68132,19 +68192,25 @@ const footerModule = stack({
68132
68192
  ], repeat("group.modules", "module"));
68133
68193
  const footerGroup = stack({
68134
68194
  gap: "md",
68135
- align: "stretch",
68195
+ align: { $bind: {
68196
+ from: "group.align",
68197
+ fallback: "stretch"
68198
+ } },
68136
68199
  className: { $bind: {
68137
68200
  from: "group.className",
68138
68201
  fallback: "rb-min-w-0"
68139
68202
  } },
68203
+ "data-slot": { $bind: { from: "group.slot" } },
68140
68204
  "data-footer-group": { $bind: { from: "group.kind" } }
68141
68205
  }, [footerModule], repeat("region.groups", "group"));
68142
68206
  const footerMainRegion = stack({
68143
68207
  className: { $bind: { from: "region.className" } },
68208
+ "data-slot": { $bind: { from: "region.slot" } },
68144
68209
  "data-footer-region": { $bind: { from: "region.kind" } }
68145
68210
  }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
68146
68211
  const footerEngagementRegion = stack({
68147
68212
  className: { $bind: { from: "region.className" } },
68213
+ "data-slot": { $bind: { from: "region.slot" } },
68148
68214
  "data-footer-region": "engagement-row"
68149
68215
  }, [footerGroup], when("region.kind", { equals: "engagement-row" }), repeat("content.footerRuntime.regions", "region"));
68150
68216
  const footerBottomRegion = stack({ className: { $bind: {
@@ -68161,6 +68227,7 @@ const footerBottomRegion = stack({ className: { $bind: {
68161
68227
  from: "$root.theme.footer",
68162
68228
  transforms: [{ id: "layout.footerBottomBarStyle" }]
68163
68229
  } },
68230
+ "data-slot": { $bind: { from: "region.slot" } },
68164
68231
  "data-footer-region": "bottom"
68165
68232
  }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
68166
68233
  const footerLayout = section$1({
@@ -68175,6 +68242,7 @@ const footerLayout = section$1({
68175
68242
  transforms: [{ id: "layout.footerRootStyle" }],
68176
68243
  fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
68177
68244
  } },
68245
+ "data-arrangement": { $bind: { from: "content.footerRuntime.arrangementHook" } },
68178
68246
  "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
68179
68247
  }, [
68180
68248
  footerEngagementRegion,
@@ -69467,7 +69535,7 @@ function createCarouselBehaviorFields(options = {}) {
69467
69535
  arrowVisibility: options.defaults?.arrowVisibility ?? "hover"
69468
69536
  };
69469
69537
  const intent = options.ui?.intent ?? "behavior";
69470
- const fields$2 = [
69538
+ const fields$1 = [
69471
69539
  {
69472
69540
  id: ids.transition,
69473
69541
  type: "select",
@@ -69541,7 +69609,7 @@ function createCarouselBehaviorFields(options = {}) {
69541
69609
  ui: { intent }
69542
69610
  }
69543
69611
  ];
69544
- return fields$2;
69612
+ return fields$1;
69545
69613
  }
69546
69614
 
69547
69615
  //#endregion
@@ -69764,17 +69832,30 @@ const mediaTextManifest = createBlockManifest({
69764
69832
  }],
69765
69833
  fallback: ""
69766
69834
  } };
69767
- const copyHeading = el("div", { className: titleClassNameFromAlignment }, [text({
69835
+ const copyHeading = el("div", {
69836
+ className: titleClassNameFromAlignment,
69837
+ ...lookSlot("head")
69838
+ }, [text({
69768
69839
  as: "p",
69769
- className: eyebrowClassName("rb-eyebrow heading-eyebrow")
69770
- }, when("content.eyebrow"), bind("content.eyebrow")), text({ as: "h2" }, bind("content.title"))], when("content.title"));
69771
- const defaultTextColumn = el("div", {}, [styledCard([richText({ className: "rb-prose rb-max-w-none" }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText({ className: "rb-prose rb-max-w-none" }, when("content.wrapTextInCard", { not: true }), bind("content.text"))]);
69772
- const bioTextColumn = el("div", { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" }, [
69773
- copyHeading,
69774
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
69775
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
69776
- ]);
69840
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
69841
+ ...lookSlot("eyebrow")
69842
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
69843
+ as: "h2",
69844
+ ...lookSlot("heading")
69845
+ }, bind("content.title"))], when("content.title"));
69846
+ const textContentNodes = (className) => {
69847
+ const props$1 = {
69848
+ className,
69849
+ ...lookSlot("intro"),
69850
+ leadParagraphSlot: { $bind: { from: "content._lookSlots.lede" } },
69851
+ lookSlots: { $bind: { from: "content._lookSlots" } }
69852
+ };
69853
+ return [styledCard([richText(props$1, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText(props$1, when("content.wrapTextInCard", { not: true }), bind("content.text"))];
69854
+ };
69855
+ const defaultTextColumn = el("div", {}, textContentNodes("rb-prose rb-max-w-none"));
69856
+ const bioTextColumn = el("div", { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" }, [copyHeading, ...textContentNodes(bodyClassNameFromAlignment)]);
69777
69857
  const defaultImageCommonProps = {
69858
+ ...lookSlot("photo"),
69778
69859
  className: { $bind: {
69779
69860
  from: "content.imageShape",
69780
69861
  transforms: [{
@@ -69814,6 +69895,7 @@ const mediaTextManifest = createBlockManifest({
69814
69895
  slidesToShow: 1
69815
69896
  }, [media(defaultImageCommonProps, bind("item.image"), repeat("content.images", "item"))]);
69816
69897
  const defaultImagesLayout = el("div", {}, [responsiveTwoColumn({
69898
+ lookSlots: true,
69817
69899
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
69818
69900
  text: defaultTextColumn,
69819
69901
  ratioFrom: "content.ratio",
@@ -69825,6 +69907,7 @@ const mediaTextManifest = createBlockManifest({
69825
69907
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1"
69826
69908
  })], whenImagesLength(0, { not: true }));
69827
69909
  const bioImagesLayout = el("div", {}, [responsiveTwoColumn({
69910
+ lookSlots: true,
69828
69911
  image: el("div", {}, [el("div", {}, [defaultSingleImage], whenImagesLength(1)), el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))]),
69829
69912
  text: bioTextColumn,
69830
69913
  ratioFrom: "content.ratio",
@@ -69835,15 +69918,15 @@ const mediaTextManifest = createBlockManifest({
69835
69918
  imageWrapperClassName: "rb-w-full rb-shrink-0",
69836
69919
  textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
69837
69920
  })], whenImagesLength(0, { not: true }));
69838
- const defaultTextOnlyLayout = el("div", {}, [styledCard([richText({ className: "rb-prose rb-max-w-none" }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")), richText({ className: "rb-prose rb-max-w-none" }, when("content.wrapTextInCard", { not: true }), bind("content.text"))], whenImagesLength(0));
69839
- const bioTextOnlyLayout = el("div", { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" }, [
69840
- text({
69841
- as: "h2",
69842
- className: titleClassNameFromAlignment
69843
- }, when("content.title"), bind("content.title")),
69844
- styledCard([richText({ className: bodyClassNameFromAlignment }, bind("content.text"))], mediaTextCardOptions, when("content.wrapTextInCard")),
69845
- richText({ className: bodyClassNameFromAlignment }, when("content.wrapTextInCard", { not: true }), bind("content.text"))
69846
- ], whenImagesLength(0));
69921
+ const defaultTextOnlyLayout = el("div", lookSlot("copy"), textContentNodes("rb-prose rb-max-w-none"), whenImagesLength(0));
69922
+ const bioTextOnlyLayout = el("div", {
69923
+ className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5",
69924
+ ...lookSlot("copy")
69925
+ }, [text({
69926
+ as: "h2",
69927
+ className: titleClassNameFromAlignment,
69928
+ ...lookSlot("heading")
69929
+ }, when("content.title"), bind("content.title")), ...textContentNodes(bodyClassNameFromAlignment)], whenImagesLength(0));
69847
69930
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
69848
69931
  const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
69849
69932
  const defaultLayout$1 = styledSection({
@@ -69864,13 +69947,36 @@ const mediaTextManifest = createBlockManifest({
69864
69947
  baseClass: "",
69865
69948
  spacing: "medium"
69866
69949
  });
69950
+ const circleLayout = styledSection({
69951
+ baseClass: "",
69952
+ spacing: "medium",
69953
+ children: styledContainer({ children: el("div", lookSlot("frame"), [el("div", lookSlot("media"), [
69954
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(1)),
69955
+ el("div", {}, [el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))], whenImagesLength(0, { not: true })),
69956
+ el("div", {}, [when("content.images[0].image")(defaultSingleImage)], whenImagesLength(0))
69957
+ ]), el("div", lookSlot("copy"), [el("div", lookSlot("head"), [text({
69958
+ as: "p",
69959
+ className: eyebrowClassName("rb-eyebrow heading-eyebrow"),
69960
+ ...lookSlot("eyebrow")
69961
+ }, when("content.eyebrow"), bind("content.eyebrow")), text({
69962
+ as: "h2",
69963
+ ...lookSlot("heading")
69964
+ }, bind("content.title"), when("content.title", { authoringPresence: {
69965
+ kind: "recover-empty-when-active",
69966
+ placeholder: "Add heading"
69967
+ } }))]), defaultTextColumn])]) })
69968
+ });
69867
69969
  return {
69868
69970
  layout: defaultLayout$1,
69869
69971
  variants: {
69870
69972
  default: defaultLayout$1,
69871
- bio: bioLayout
69973
+ bio: bioLayout,
69974
+ "circle-beside": circleLayout
69975
+ },
69976
+ variantMeaning: {
69977
+ kind: "arrangement",
69978
+ lookOnlyKeys: ["circle-beside"]
69872
69979
  },
69873
- variantMeaning: { kind: "arrangement" },
69874
69980
  defaultVariant: "default",
69875
69981
  variantOptions: {
69876
69982
  default: { label: "Default" },
@@ -70718,7 +70824,7 @@ const eventSpotlightFields = [
70718
70824
  })
70719
70825
  ];
70720
70826
  const eventSpotlightLayout = [styledSection({
70721
- children: sectionContainer([...eventSectionHeaderLayoutNodes(), el("event-spotlight", {
70827
+ children: sectionContainer([...sectionHeaderLayoutNodes(), el("event-spotlight", {
70722
70828
  events: { $bind: { from: "data.events" } },
70723
70829
  layout: { $bind: {
70724
70830
  from: "content.layout",
@@ -72207,234 +72313,9 @@ const embedBlockDefinition = {
72207
72313
  };
72208
72314
 
72209
72315
  //#endregion
72210
- //#region ../blocks/src/system/blocks/image-gallery.ts
72211
- const grid$1 = (props$1, children, ...mods) => el("grid", props$1 ?? undefined, children ?? undefined, ...mods);
72212
- const galleryContainer = (children, opts) => {
72213
- const gap = opts?.gap ?? "md";
72214
- const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
72215
- if (opts?.fullWidth) {
72216
- return stack({
72217
- gap,
72218
- className: withExtraClass("rb-container-bleed")
72219
- }, children);
72220
- }
72221
- return stack({
72222
- gap,
72223
- className: { $bind: {
72224
- from: "content.fullBleed",
72225
- transforms: [{
72226
- id: "ui.conditionalClass",
72227
- options: {
72228
- whenTrue: withExtraClass("rb-container-bleed"),
72229
- whenFalse: withExtraClass("rb-container")
72230
- }
72231
- }],
72232
- fallback: withExtraClass("rb-container")
72233
- } }
72234
- }, children);
72235
- };
72236
- const galleryItem = (options) => stack({
72237
- gap: "xs",
72238
- className: options.containerClassName
72239
- }, [el("figure", {
72240
- className: { $bind: {
72241
- from: "content",
72242
- transforms: [{ id: "ui.imageGalleryTileClass" }],
72243
- fallback: "rb-overflow-hidden rb-relative rb-rounded-3xl rb-border-2"
72244
- } },
72245
- style: { $bind: {
72246
- from: "content",
72247
- transforms: [{ id: "ui.imageGalleryTileStyle" }]
72248
- } }
72249
- }, [media({
72250
- className: {
72251
- $bind: {
72252
- from: "content.imageFilter",
72253
- transforms: [{ id: "ui.imageGalleryFilterClass" }],
72254
- fallback: ""
72255
- },
72256
- $prepend: `${options.imageClassName} `
72257
- },
72258
- ...options.bindAspectRatio && { style: { aspectRatio: { $bind: { from: "content.aspectRatio" } } } }
72259
- }, bind("item.image"))]), text({
72260
- as: "figcaption",
72261
- className: "rb-caption rb-text-center",
72262
- style: textColorStyle("mutedText")
72263
- }, bind("item.caption"), when("item.caption"))], repeat("content.images", "item"));
72264
- const gridLayout = grid$1({ className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3" }, [galleryItem({
72265
- imageClassName: "rb-w-full rb-h-full rb-object-cover",
72266
- bindAspectRatio: true
72267
- })]);
72268
- const carouselLayout = carousel({
72269
- className: { $bind: {
72270
- from: "content.fullBleed",
72271
- transforms: [{
72272
- id: "ui.conditionalClass",
72273
- options: {
72274
- whenTrue: "rb-image-gallery-carousel rb-image-gallery-carousel--full-bleed",
72275
- whenFalse: "rb-image-gallery-carousel"
72276
- }
72277
- }],
72278
- fallback: "rb-image-gallery-carousel"
72279
- } },
72280
- slidesToShow: {
72281
- mobile: { $bind: {
72282
- from: "content.slidesToShow",
72283
- fallback: 1
72284
- } },
72285
- tablet: { $bind: { from: "content.slidesToShowTablet" } },
72286
- desktop: { $bind: { from: "content.slidesToShowDesktop" } }
72287
- },
72288
- transition: { $bind: {
72289
- from: "content.transition",
72290
- fallback: "slide"
72291
- } },
72292
- showControls: { $bind: {
72293
- from: "content.showControls",
72294
- fallback: true
72295
- } },
72296
- showDots: { $bind: {
72297
- from: "content.showDots",
72298
- fallback: false
72299
- } },
72300
- autoplay: { $bind: {
72301
- from: "content.autoplay",
72302
- fallback: false
72303
- } },
72304
- autoplayDelay: { $bind: {
72305
- from: "content.autoplayDelay",
72306
- fallback: 5e3,
72307
- coerce: "number"
72308
- } },
72309
- arrowVisibility: { $bind: {
72310
- from: "content.arrowVisibility",
72311
- fallback: "always"
72312
- } },
72313
- loop: { $bind: {
72314
- from: "content.loop",
72315
- fallback: true
72316
- } }
72317
- }, [galleryItem({
72318
- imageClassName: "rb-w-full rb-h-full rb-object-cover",
72319
- bindAspectRatio: true
72320
- })]);
72321
- const masonryLayout = el("div", { style: {
72322
- columns: "3 250px",
72323
- columnGap: "1rem"
72324
- } }, [galleryItem({
72325
- imageClassName: "rb-w-full rb-h-auto",
72326
- bindAspectRatio: false,
72327
- containerClassName: "rb-mb-4 rb-break-inside-avoid"
72328
- })]);
72329
- const marqueeTileBase = stack({
72330
- gap: "xs",
72331
- className: "rb-flex-shrink-0"
72332
- }, [el("figure", {
72333
- className: { $bind: {
72334
- from: "content",
72335
- transforms: [{ id: "ui.imageGalleryTileClass" }],
72336
- fallback: "rb-overflow-hidden rb-relative rb-rounded-3xl rb-border-2"
72337
- } },
72338
- style: { $bind: {
72339
- from: "content",
72340
- transforms: [{ id: "ui.imageGalleryMarqueeTileStyle" }]
72341
- } }
72342
- }, [media({
72343
- className: {
72344
- $bind: {
72345
- from: "content.imageFilter",
72346
- transforms: [{ id: "ui.imageGalleryFilterClass" }],
72347
- fallback: ""
72348
- },
72349
- $prepend: "rb-w-full rb-h-full rb-object-cover "
72350
- },
72351
- style: { aspectRatio: "1 / 1" }
72352
- }, bind("item.image"))]), text({
72353
- as: "figcaption",
72354
- className: "rb-caption rb-text-center",
72355
- style: textColorStyle("mutedText")
72356
- }, bind("item.caption"), when("item.caption"))]);
72357
- const marqueeTile = {
72358
- ...marqueeTileBase,
72359
- $repeat: {
72360
- collection: {
72361
- from: "content.images",
72362
- pick: "collection",
72363
- transforms: [{
72364
- id: "array.marqueeLoop",
72365
- options: { minItems: 10 }
72366
- }]
72367
- },
72368
- itemName: "item",
72369
- indexName: "index"
72370
- }
72371
- };
72372
- const marqueeLayout = el("div", { className: {
72373
- $bind: {
72374
- from: "content.marqueePauseOnHover",
72375
- transforms: [{
72376
- id: "ui.conditionalClass",
72377
- options: {
72378
- whenTrue: "rb-image-gallery-marquee rb-marquee-pause-on-hover",
72379
- whenFalse: "rb-image-gallery-marquee"
72380
- }
72381
- }],
72382
- fallback: "rb-image-gallery-marquee"
72383
- },
72384
- $prepend: "rb-py-4 "
72385
- } }, [el("div", {
72386
- className: "rb-flex rb-animate-marquee rb-transform-gpu rb-will-change-transform",
72387
- style: {
72388
- "--rb-marquee-duration": { $bind: {
72389
- from: "content.marqueeSpeed",
72390
- transforms: [{ id: "ui.imageGalleryMarqueeDuration" }],
72391
- fallback: "40s"
72392
- } },
72393
- "--rb-marquee-direction": { $bind: {
72394
- from: "content.marqueeDirection",
72395
- transforms: [{ id: "ui.imageGalleryMarqueeDirection" }],
72396
- fallback: "normal"
72397
- } }
72398
- }
72399
- }, [marqueeTile])]);
72400
- const emptyState$1 = {
72401
- type: "stack",
72402
- props: {
72403
- align: "center",
72404
- gap: "md",
72405
- className: "rb-py-12 rb-text-center rb-rounded-xl rb-border rb-border-dashed",
72406
- style: mergeStyles(borderColorStyle("border"), backgroundColorStyle("surface"))
72407
- },
72408
- children: [{
72409
- type: "text",
72410
- props: {
72411
- as: "p",
72412
- style: textColorStyle("mutedText")
72413
- },
72414
- $bind: {
72415
- from: "content.emptyMessage",
72416
- fallback: "Add images to create your gallery"
72417
- }
72418
- }],
72419
- $when: {
72420
- when: {
72421
- from: "content.images",
72422
- transforms: [{ id: "array.length" }]
72423
- },
72424
- equals: 0
72425
- }
72426
- };
72427
- const wrapVariant$1 = (layout, opts) => styledSection({
72428
- children: galleryContainer([layout, emptyState$1], {
72429
- gap: "md",
72430
- fullWidth: opts?.fullWidth,
72431
- className: opts?.className
72432
- }),
72433
- baseClass: "",
72434
- spacing: "medium",
72435
- background: "background"
72436
- });
72437
- const fields$1 = parseFieldDefinitions([
72316
+ //#region ../blocks/src/system/blocks/image-gallery/fields.ts
72317
+ const imageGalleryFields = parseFieldDefinitions([
72318
+ ...sectionHeaderFields(undefined, "Intro"),
72438
72319
  {
72439
72320
  id: "images",
72440
72321
  type: "repeater",
@@ -72936,6 +72817,261 @@ const fields$1 = parseFieldDefinitions([
72936
72817
  ui: { intent: "style" }
72937
72818
  }
72938
72819
  ]);
72820
+
72821
+ //#endregion
72822
+ //#region ../blocks/src/system/blocks/image-gallery.ts
72823
+ const grid$1 = (props$1, children, ...mods) => el("grid", props$1 ?? undefined, children ?? undefined, ...mods);
72824
+ const galleryContainer = (children, opts) => {
72825
+ const gap = opts?.gap ?? "md";
72826
+ const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
72827
+ if (opts?.fullWidth) {
72828
+ return stack({
72829
+ gap,
72830
+ className: withExtraClass("rb-container-bleed")
72831
+ }, children);
72832
+ }
72833
+ return stack({
72834
+ gap,
72835
+ className: { $bind: {
72836
+ from: "content.fullBleed",
72837
+ transforms: [{
72838
+ id: "ui.conditionalClass",
72839
+ options: {
72840
+ whenTrue: withExtraClass("rb-container-bleed"),
72841
+ whenFalse: withExtraClass("rb-container")
72842
+ }
72843
+ }],
72844
+ fallback: withExtraClass("rb-container")
72845
+ } }
72846
+ }, children);
72847
+ };
72848
+ const galleryItem = (options) => stack({
72849
+ gap: "xs",
72850
+ className: options.containerClassName
72851
+ }, [el("figure", {
72852
+ className: { $bind: {
72853
+ from: "content",
72854
+ transforms: [{ id: "ui.imageGalleryTileClass" }],
72855
+ fallback: "rb-overflow-hidden rb-relative rb-rounded-3xl rb-border-2"
72856
+ } },
72857
+ style: { $bind: {
72858
+ from: "content",
72859
+ transforms: [{ id: "ui.imageGalleryTileStyle" }]
72860
+ } }
72861
+ }, [media({
72862
+ className: {
72863
+ $bind: {
72864
+ from: "content.imageFilter",
72865
+ transforms: [{ id: "ui.imageGalleryFilterClass" }],
72866
+ fallback: ""
72867
+ },
72868
+ $prepend: `${options.imageClassName} `
72869
+ },
72870
+ ...options.bindAspectRatio && { style: { aspectRatio: { $bind: { from: "content.aspectRatio" } } } }
72871
+ }, bind("item.image"))]), text({
72872
+ as: "figcaption",
72873
+ className: "rb-caption rb-text-center",
72874
+ style: textColorStyle("mutedText")
72875
+ }, bind("item.caption"), when("item.caption"))], repeat("content.images", "item"));
72876
+ const gridLayout = grid$1({ className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3" }, [galleryItem({
72877
+ imageClassName: "rb-w-full rb-h-full rb-object-cover",
72878
+ bindAspectRatio: true
72879
+ })]);
72880
+ const carouselLayout = carousel({
72881
+ className: { $bind: {
72882
+ from: "content.fullBleed",
72883
+ transforms: [{
72884
+ id: "ui.conditionalClass",
72885
+ options: {
72886
+ whenTrue: "rb-image-gallery-carousel rb-image-gallery-carousel--full-bleed",
72887
+ whenFalse: "rb-image-gallery-carousel"
72888
+ }
72889
+ }],
72890
+ fallback: "rb-image-gallery-carousel"
72891
+ } },
72892
+ slidesToShow: {
72893
+ mobile: { $bind: {
72894
+ from: "content.slidesToShow",
72895
+ fallback: 1
72896
+ } },
72897
+ tablet: { $bind: { from: "content.slidesToShowTablet" } },
72898
+ desktop: { $bind: { from: "content.slidesToShowDesktop" } }
72899
+ },
72900
+ transition: { $bind: {
72901
+ from: "content.transition",
72902
+ fallback: "slide"
72903
+ } },
72904
+ showControls: { $bind: {
72905
+ from: "content.showControls",
72906
+ fallback: true
72907
+ } },
72908
+ showDots: { $bind: {
72909
+ from: "content.showDots",
72910
+ fallback: false
72911
+ } },
72912
+ autoplay: { $bind: {
72913
+ from: "content.autoplay",
72914
+ fallback: false
72915
+ } },
72916
+ autoplayDelay: { $bind: {
72917
+ from: "content.autoplayDelay",
72918
+ fallback: 5e3,
72919
+ coerce: "number"
72920
+ } },
72921
+ arrowVisibility: { $bind: {
72922
+ from: "content.arrowVisibility",
72923
+ fallback: "always"
72924
+ } },
72925
+ loop: { $bind: {
72926
+ from: "content.loop",
72927
+ fallback: true
72928
+ } }
72929
+ }, [galleryItem({
72930
+ imageClassName: "rb-w-full rb-h-full rb-object-cover",
72931
+ bindAspectRatio: true
72932
+ })]);
72933
+ const masonryLayout = el("div", { style: {
72934
+ columns: "3 250px",
72935
+ columnGap: "1rem"
72936
+ } }, [galleryItem({
72937
+ imageClassName: "rb-w-full rb-h-auto",
72938
+ bindAspectRatio: false,
72939
+ containerClassName: "rb-mb-4 rb-break-inside-avoid"
72940
+ })]);
72941
+ const marqueeTileBase = stack({
72942
+ gap: "xs",
72943
+ className: "rb-flex-shrink-0"
72944
+ }, [el("figure", {
72945
+ className: { $bind: {
72946
+ from: "content",
72947
+ transforms: [{ id: "ui.imageGalleryTileClass" }],
72948
+ fallback: "rb-overflow-hidden rb-relative rb-rounded-3xl rb-border-2"
72949
+ } },
72950
+ style: { $bind: {
72951
+ from: "content",
72952
+ transforms: [{ id: "ui.imageGalleryMarqueeTileStyle" }]
72953
+ } }
72954
+ }, [media({
72955
+ className: {
72956
+ $bind: {
72957
+ from: "content.imageFilter",
72958
+ transforms: [{ id: "ui.imageGalleryFilterClass" }],
72959
+ fallback: ""
72960
+ },
72961
+ $prepend: "rb-w-full rb-h-full rb-object-cover "
72962
+ },
72963
+ style: { aspectRatio: "1 / 1" }
72964
+ }, bind("item.image"))]), text({
72965
+ as: "figcaption",
72966
+ className: "rb-caption rb-text-center",
72967
+ style: textColorStyle("mutedText")
72968
+ }, bind("item.caption"), when("item.caption"))]);
72969
+ const marqueeTile = {
72970
+ ...marqueeTileBase,
72971
+ $repeat: {
72972
+ collection: {
72973
+ from: "content.images",
72974
+ pick: "collection",
72975
+ transforms: [{
72976
+ id: "array.marqueeLoop",
72977
+ options: { minItems: 10 }
72978
+ }]
72979
+ },
72980
+ itemName: "item",
72981
+ indexName: "index"
72982
+ }
72983
+ };
72984
+ const marqueeLayout = el("div", { className: {
72985
+ $bind: {
72986
+ from: "content.marqueePauseOnHover",
72987
+ transforms: [{
72988
+ id: "ui.conditionalClass",
72989
+ options: {
72990
+ whenTrue: "rb-image-gallery-marquee rb-marquee-pause-on-hover",
72991
+ whenFalse: "rb-image-gallery-marquee"
72992
+ }
72993
+ }],
72994
+ fallback: "rb-image-gallery-marquee"
72995
+ },
72996
+ $prepend: "rb-py-4 "
72997
+ } }, [el("div", {
72998
+ className: "rb-flex rb-animate-marquee rb-transform-gpu rb-will-change-transform",
72999
+ style: {
73000
+ "--rb-marquee-duration": { $bind: {
73001
+ from: "content.marqueeSpeed",
73002
+ transforms: [{ id: "ui.imageGalleryMarqueeDuration" }],
73003
+ fallback: "40s"
73004
+ } },
73005
+ "--rb-marquee-direction": { $bind: {
73006
+ from: "content.marqueeDirection",
73007
+ transforms: [{ id: "ui.imageGalleryMarqueeDirection" }],
73008
+ fallback: "normal"
73009
+ } }
73010
+ }
73011
+ }, [marqueeTile])]);
73012
+ const emptyState$1 = {
73013
+ type: "stack",
73014
+ props: {
73015
+ align: "center",
73016
+ gap: "md",
73017
+ className: "rb-py-12 rb-text-center rb-rounded-xl rb-border rb-border-dashed",
73018
+ style: mergeStyles(borderColorStyle("border"), backgroundColorStyle("surface"))
73019
+ },
73020
+ children: [{
73021
+ type: "text",
73022
+ props: {
73023
+ as: "p",
73024
+ style: textColorStyle("mutedText")
73025
+ },
73026
+ $bind: {
73027
+ from: "content.emptyMessage",
73028
+ fallback: "Add images to create your gallery"
73029
+ }
73030
+ }],
73031
+ $when: {
73032
+ when: {
73033
+ from: "content.images",
73034
+ transforms: [{ id: "array.length" }]
73035
+ },
73036
+ equals: 0
73037
+ }
73038
+ };
73039
+ const wrapVariant$1 = (layout, opts) => styledSection({
73040
+ children: galleryContainer([
73041
+ ...sectionHeaderLayoutNodes(),
73042
+ layout,
73043
+ emptyState$1
73044
+ ], {
73045
+ gap: "md",
73046
+ fullWidth: opts?.fullWidth,
73047
+ className: opts?.className
73048
+ }),
73049
+ baseClass: "",
73050
+ spacing: "medium",
73051
+ background: "background"
73052
+ });
73053
+ const lookGalleryTile = (imageFrom, captionFrom, ...mods) => el("li", lookSlot("item"), [el("figure", lookSlot("figure"), [el("div", lookSlot("media"), [media(lookSlot("photo"), bind(imageFrom), when(imageFrom))]), text({
73054
+ as: "figcaption",
73055
+ ...lookSlot("caption")
73056
+ }, bind(captionFrom), when(captionFrom))])], ...mods);
73057
+ const tilesLayout = styledSection({
73058
+ children: el("div", {
73059
+ className: "rb-container",
73060
+ ...lookSlot("layout")
73061
+ }, [...sectionHeaderLayoutNodes({ splitClassName: "rb-grid" }), el("ol", lookSlot("items"), [lookGalleryTile("item.image", "item.caption", repeat("content.images", "item")), lookGalleryTile("content.images.0.image", "content.images.0.caption", (node) => ({
73062
+ ...node,
73063
+ $when: {
73064
+ when: {
73065
+ from: "content.images",
73066
+ transforms: [{ id: "array.length" }]
73067
+ },
73068
+ equals: 0
73069
+ }
73070
+ }))])]),
73071
+ baseClass: "",
73072
+ spacing: "medium",
73073
+ background: "background"
73074
+ });
72939
73075
  const baseImageGalleryManifest = createBlockManifest({
72940
73076
  id: "block.image-gallery",
72941
73077
  title: "Image Gallery",
@@ -72948,9 +73084,10 @@ const baseImageGalleryManifest = createBlockManifest({
72948
73084
  "marqueeSpeed",
72949
73085
  "marqueePauseOnHover"
72950
73086
  ] },
72951
- additionalFields: fields$1,
73087
+ additionalFields: imageGalleryFields,
72952
73088
  layout: wrapVariant$1(gridLayout),
72953
73089
  variants: {
73090
+ tiles: tilesLayout,
72954
73091
  grid: wrapVariant$1(gridLayout),
72955
73092
  carousel: wrapVariant$1(carouselLayout),
72956
73093
  masonry: wrapVariant$1(masonryLayout),
@@ -72959,7 +73096,10 @@ const baseImageGalleryManifest = createBlockManifest({
72959
73096
  className: "rb-image-gallery-marquee-container"
72960
73097
  })
72961
73098
  },
72962
- variantMeaning: { kind: "arrangement" },
73099
+ variantMeaning: {
73100
+ kind: "arrangement",
73101
+ lookOnlyKeys: ["tiles"]
73102
+ },
72963
73103
  defaultVariant: "grid",
72964
73104
  variantOptions: {
72965
73105
  grid: {
@@ -74380,7 +74520,7 @@ const systemBlockDefinitionsRaw = [
74380
74520
  })
74381
74521
  ]
74382
74522
  })),
74383
- withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
74523
+ withDesignCapability("block.body-text", bodyTextBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
74384
74524
  flow: bodyFlow,
74385
74525
  layoutProfiles: [
74386
74526
  layoutProfile({
@@ -74755,7 +74895,7 @@ const systemBlockDefinitionsRaw = [
74755
74895
  weight: "quiet"
74756
74896
  })]
74757
74897
  })),
74758
- withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
74898
+ withDesignCapability("block.image-gallery", imageGalleryBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
74759
74899
  flow: mediaFlow,
74760
74900
  layoutProfiles: [
74761
74901
  layoutProfile({
@@ -74844,7 +74984,7 @@ const systemBlockDefinitionsRaw = [
74844
74984
  weight: "standard"
74845
74985
  })]
74846
74986
  })),
74847
- withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
74987
+ withDesignCapability("block.newsletter-signup", newsletterSignupBlockDefinition, withLookCapability(sectionOnly()), defineBlockDesignMetadata({
74848
74988
  flow: conversionFlow,
74849
74989
  layoutProfiles: [
74850
74990
  layoutProfile({
@@ -74985,8 +75125,8 @@ function buildPreviewFieldConstraints(manifest) {
74985
75125
  if (entries.length === 0) return undefined;
74986
75126
  return Object.fromEntries(entries);
74987
75127
  }
74988
- function collectPreviewFieldConstraintEntries(fields$2, prefix = "") {
74989
- return fields$2.flatMap((field) => {
75128
+ function collectPreviewFieldConstraintEntries(fields$1, prefix = "") {
75129
+ return fields$1.flatMap((field) => {
74990
75130
  const path$4 = prefix ? `${prefix}.${field.id}` : field.id;
74991
75131
  const own = field.type === "text" && typeof field.maxLength === "number" ? [[path$4, { maxLength: field.maxLength }]] : [];
74992
75132
  return [...own, ...collectNestedPreviewFieldConstraintEntries(field, path$4)];
@@ -75603,9 +75743,9 @@ function valueAtField(current, fieldId) {
75603
75743
  return isRecord$18(current) ? current[fieldId] : undefined;
75604
75744
  }
75605
75745
  function collectConstrainedVideoMediaValues(options) {
75606
- const { blockKind, fields: fields$2, currentValue, parentPath = [] } = options;
75746
+ const { blockKind, fields: fields$1, currentValue, parentPath = [] } = options;
75607
75747
  const values = [];
75608
- for (const field of fields$2) {
75748
+ for (const field of fields$1) {
75609
75749
  const fieldPathSegments = [...parentPath, field.id];
75610
75750
  const fieldPath = fieldPathSegments.join(".");
75611
75751
  const fieldValue = valueAtField(currentValue, field.id);
@@ -76090,10 +76230,7 @@ function arrangementPhotoContent(content, knobs) {
76090
76230
  }) };
76091
76231
  }
76092
76232
  function arrangementContentFacts(content) {
76093
- const section$2 = isObjectRecord(content._sectionStyles) ? content._sectionStyles : {};
76094
- const background = isObjectRecord(section$2.background) ? section$2.background : {};
76095
- const itemPhotos = Array.isArray(content.cards) ? content.cards.filter((card) => isObjectRecord(card) && isObjectRecord(card.media)).length : 0;
76096
- const photoCount = Array.isArray(content.cards) ? itemPhotos : isObjectRecord(background.image) ? 1 : 0;
76233
+ const photoCount = arrangementPhotoCount(content);
76097
76234
  return {
76098
76235
  photoCount,
76099
76236
  facts: {
@@ -76104,6 +76241,14 @@ function arrangementContentFacts(content) {
76104
76241
  }
76105
76242
  };
76106
76243
  }
76244
+ /** The content stage owns media presence for every arrangement consumer. */
76245
+ function arrangementPhotoCount(content) {
76246
+ if (Array.isArray(content.cards)) return content.cards.filter((card) => isObjectRecord(card) && isObjectRecord(card.media)).length;
76247
+ if (Array.isArray(content.images)) return content.images.filter((item) => isObjectRecord(item) && isObjectRecord(item.image)).length;
76248
+ const section$2 = isObjectRecord(content._sectionStyles) ? content._sectionStyles : {};
76249
+ const background = isObjectRecord(section$2.background) ? section$2.background : {};
76250
+ return isObjectRecord(background.image) ? 1 : 0;
76251
+ }
76107
76252
  function effectiveContentKnobValue(blockKind, key, value) {
76108
76253
  const facet = systemCustomizeFacetDefinitionsForBlock(blockKind).find((entry) => entry.target.kind === "content-field" && entry.target.field === key);
76109
76254
  return facet?.target.kind === "content-field" && facet.target.boolean ? value === "true" : value;
@@ -79961,6 +80106,82 @@ function getDefaultInputSettings() {
79961
80106
  };
79962
80107
  }
79963
80108
 
80109
+ //#endregion
80110
+ //#region ../theme-core/src/footer/mode.ts
80111
+ const footerModeSchema = z.enum([
80112
+ "default",
80113
+ "blocks",
80114
+ "default+blocks",
80115
+ "none"
80116
+ ]);
80117
+ /** Reads only SDK footer intent; unrelated config and theme fields are not authorities. */
80118
+ function resolveSdkFooterMode(config$1) {
80119
+ const parsed = z.object({ layout: z.object({ footerMode: footerModeSchema.optional() }).optional() }).safeParse(config$1);
80120
+ return parsed.success ? parsed.data.layout?.footerMode ?? "default" : "default";
80121
+ }
80122
+ const legacyFooterBrandSchema = z.object({
80123
+ variant: z.enum([
80124
+ "simple",
80125
+ "columns",
80126
+ "split",
80127
+ "centred"
80128
+ ]),
80129
+ showLogoText: z.boolean().optional(),
80130
+ logo: z.object({
80131
+ showLogo: z.boolean().optional(),
80132
+ showLogoText: z.boolean().optional()
80133
+ }).optional()
80134
+ });
80135
+ /** Offline composition backfill only. Never read appearance visibility at runtime. */
80136
+ function readLegacyFooterBrandVisibility(value) {
80137
+ const parsed = legacyFooterBrandSchema.safeParse(value);
80138
+ if (!parsed.success) return null;
80139
+ const footer = parsed.data;
80140
+ return {
80141
+ showLogo: footer.variant === "simple" ? footer.logo?.showLogo === true : footer.logo?.showLogo !== false,
80142
+ showTitle: footer.logo?.showLogoText ?? footer.showLogoText === true
80143
+ };
80144
+ }
80145
+ /**
80146
+ * Resolve what to render for the footer given the current mode and whether the
80147
+ * site is SDK-managed.
80148
+ *
80149
+ * Backwards compatible: missing/undefined mode is treated as 'default'.
80150
+ */
80151
+ function resolveFooterRenderPlan(params) {
80152
+ if (!params.isSdkSite) {
80153
+ return {
80154
+ mode: "default",
80155
+ renderDefaultFooter: true,
80156
+ renderFooterBlocks: false
80157
+ };
80158
+ }
80159
+ const mode = params.mode ?? "default";
80160
+ switch (mode) {
80161
+ case "blocks": return {
80162
+ mode: "blocks",
80163
+ renderDefaultFooter: false,
80164
+ renderFooterBlocks: true
80165
+ };
80166
+ case "default+blocks": return {
80167
+ mode: "default+blocks",
80168
+ renderDefaultFooter: true,
80169
+ renderFooterBlocks: true
80170
+ };
80171
+ case "none": return {
80172
+ mode: "none",
80173
+ renderDefaultFooter: false,
80174
+ renderFooterBlocks: false
80175
+ };
80176
+ case "default":
80177
+ default: return {
80178
+ mode: "default",
80179
+ renderDefaultFooter: true,
80180
+ renderFooterBlocks: false
80181
+ };
80182
+ }
80183
+ }
80184
+
79964
80185
  //#endregion
79965
80186
  //#region ../theme-core/src/generated/containerResponsiveThemeCss.ts
79966
80187
  /**
@@ -88442,7 +88663,7 @@ const containerResponsiveThemeCss = `/*
88442
88663
  /* -----------------------------------------------------------------------------
88443
88664
  * Event section head — split (heading left, intro right)
88444
88665
  * Rendered by the block frame (outside [data-block="event-calendar"]) via
88445
- * eventSectionHeaderLayoutNodes({ splitClassName }). Lays the heading and its
88666
+ * sectionHeaderLayoutNodes({ splitClassName }). Lays the heading and its
88446
88667
  * supporting intro out as a two-column head on wide viewports, stacking on
88447
88668
  * narrow ones. The section band above provides the distinct background.
88448
88669
  * ----------------------------------------------------------------------------- */
@@ -94141,6 +94362,26 @@ const containerResponsiveThemeCss = `/*
94141
94362
  .theme-scope [data-arrangement] [data-event-list-empty] [data-slot="action"] { margin: 0; padding: 0; border: 0; background: none; color: var(--rb-surface-text-color); font: inherit; text-decoration: underline; text-underline-offset: 0.2em; cursor: pointer; }
94142
94363
  .theme-scope [data-arrangement] [data-event-list-empty] [data-slot="action"] button { margin: 0; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-decoration: inherit; cursor: pointer; }
94143
94364
 
94365
+ /* ---------------------------------------------------- image gallery: tiles */
94366
+ .theme-scope [data-arrangement="tiles"]:not(:has([data-slot="heading"], [data-slot="intro"], [data-slot="photo"], [data-placeholder-field])) { display: none; }
94367
+ .theme-scope [data-arrangement="tiles"] [data-slot="items"] {
94368
+ display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
94369
+ gap: var(--rb-skin-gallery-gap, 1.5rem); list-style: none; padding: 0;
94370
+ margin: 0 auto; max-width: 64rem;
94371
+ }
94372
+ .theme-scope [data-arrangement="tiles"] [data-slot="item"] { min-width: 0; margin: 0; }
94373
+ .theme-scope [data-arrangement="tiles"] [data-slot="figure"] { display: grid; gap: 0; align-items: stretch; min-width: 0; margin: 0; }
94374
+ .theme-scope [data-arrangement="tiles"] [data-slot="media"] { aspect-ratio: 1; overflow: hidden; }
94375
+ .theme-scope [data-arrangement="tiles"] [data-slot="photo"] { width: 100%; height: 100%; object-fit: cover; }
94376
+ .theme-scope [data-arrangement="tiles"] [data-slot="item"]:not(:has([data-slot="photo"], [data-placeholder-field])),
94377
+ .theme-scope [data-arrangement="tiles"] [data-slot="items"]:not(:has([data-slot="photo"], [data-placeholder-field])) { display: none; }
94378
+ .theme-scope [data-arrangement="tiles"] [data-slot="head"]:not(:has(*)) { display: none; }
94379
+ @container rb-site (max-width: 767px) {
94380
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
94381
+ .theme-scope:is(*, :scope) [data-arrangement="tiles"] [data-slot="items"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
94382
+ }
94383
+ }
94384
+
94144
94385
  /* Bounded style skins (issue 1575, D14): one stylesheet per arrangement style, keyed on data-skin. */
94145
94386
 
94146
94387
  /* =============================================================================
@@ -95184,6 +95425,7 @@ const containerResponsiveThemeCss = `/*
95184
95425
 
95185
95426
  /* Section heads: centred under the lozenge rule. */
95186
95427
  [data-skin="lantern"] [data-arrangement] [data-slot="head"] {
95428
+ grid-template-columns: minmax(0, 1fr);
95187
95429
  position: relative;
95188
95430
  justify-items: center;
95189
95431
  text-align: center;
@@ -95869,6 +96111,254 @@ const containerResponsiveThemeCss = `/*
95869
96111
  [data-skin="lantern"] [data-card-list-item] [data-slot="dates"] { gap: 0.5rem; }
95870
96112
  [data-skin="lantern"] [data-card-list-item] [data-slot="dates"] [data-slot="date"] { padding: 0.625rem 0.75rem; border: 1px solid var(--rb-surface-line-color); border-radius: var(--lantern-tablet); }
95871
96113
 
96114
+ /* Centred footer: the same lozenge head over a quiet, deep-ground ending. */
96115
+ [data-skin="lantern"] [data-arrangement="footer-centred"] { padding-block: 5.5rem 2.25rem; border-top: 0; text-align: center; }
96116
+ [data-skin="lantern"] [data-arrangement="footer-centred"] > [data-slot="stack"] { padding-block: 0; gap: 0; }
96117
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="head"] { margin-bottom: 0; gap: 0.75rem; width: 100%; }
96118
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="heading"] { font-size: clamp(2rem, 3cqi, 2.5rem); line-height: 1.1; margin-top: 0.25rem; }
96119
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="intro"] { --rb-surface-text-color: var(--rb-surface-muted-color); font-size: 1.125rem; line-height: 1.55; color: var(--rb-surface-muted-color); }
96120
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="navigation"] { font-family: var(--font-heading); font-size: 1.125rem; }
96121
+ [data-skin="lantern"] [data-arrangement="footer-centred"] > [data-slot="stack"] > [data-slot="navigation"] { margin-top: 2.25rem; }
96122
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="navigation"] [data-slot="stack"]:has(> :not([data-slot])) { flex-direction: row; flex-wrap: wrap; justify-content: center; gap: 0.5rem 2.5rem; }
96123
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="contact"] { margin-top: 1.75rem; gap: 0.5rem 1.75rem; font-size: 1.0625rem; }
96124
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="contact"] [data-slot="stack"] { gap: 0.5rem 1.75rem; }
96125
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="schedule"] { margin-top: 0.75rem; width: min(100%, 20rem); align-self: center; }
96126
+ [data-skin="lantern"] [data-arrangement="footer-centred"] > [data-slot="stack"] > [data-slot="social"] { margin-top: 1.75rem; }
96127
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="social"] [data-slot="social"] { justify-content: center; gap: 0.75rem; }
96128
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="social"] [data-slot="social"] > * { display: grid; place-items: center; width: 44px; height: 44px; border: 1px solid var(--rb-surface-mark-color); border-radius: 50%; }
96129
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="social"] [data-slot="social"] > * > * { width: 19px; height: 19px; }
96130
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="panel"] { margin-top: 2.5rem; max-width: 36rem; width: 100%; margin-inline: auto; }
96131
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="base"] { --rb-surface-text-color: var(--rb-surface-muted-color); --rb-surface-link-color: var(--rb-surface-muted-color); gap: 0.5rem 1.5rem; font-size: 0.9375rem; color: var(--rb-surface-muted-color); }
96132
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="stack"] > [data-slot="base"] { margin-top: 3.5rem; padding: 1.5rem 0 0; border-top: 1px solid var(--rb-surface-line-color); }
96133
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="base"] > [data-slot="base"] { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; justify-content: space-between; width: 100%; }
96134
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="base"] [data-slot="navigation"] { font-family: var(--font-body); font-size: inherit; }
96135
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="caption"] { font-size: inherit; letter-spacing: normal; }
96136
+
96137
+ @container rb-site (max-width: 767px) {
96138
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
96139
+ [data-skin="lantern"]:is(*, :scope) [data-arrangement="footer-centred"] { padding-top: 4rem; }
96140
+ [data-skin="lantern"]:is(*, :scope) [data-arrangement="footer-centred"] [data-slot="navigation"] [data-slot="stack"]:has(> :not([data-slot])) { gap: 0.5rem 1.5rem; }
96141
+ [data-skin="lantern"]:is(*, :scope) [data-arrangement="footer-centred"] [data-slot="base"] > [data-slot="base"] { justify-content: center; text-align: center; }
96142
+ }
96143
+ }
96144
+
96145
+ /* Leaf utilities inherit the decided footer type, including the quieter legal row. */
96146
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="navigation"] * { font-family: inherit; font-size: inherit; }
96147
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="contact"] * { font-family: var(--font-body); font-size: inherit; }
96148
+
96149
+ /* Visual review: contact emphasis, quiet hours, and balanced sparse/panel endings. */
96150
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="contact"] > [data-slot="stack"] > [data-slot="stack"] > * { text-decoration: underline; text-decoration-color: var(--rb-surface-mark-color); text-decoration-thickness: 1.5px; text-underline-offset: 5px; }
96151
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="contact"] > [data-slot="stack"] > :not([data-slot]) { font-style: normal; opacity: 1; color: var(--rb-surface-muted-color); }
96152
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="schedule"] [data-slot="inline"] > :first-child { text-transform: none; letter-spacing: normal; font-weight: 500; font-size: inherit; }
96153
+ [data-skin="lantern"] [data-arrangement="footer-centred"]:not(:has([data-slot="base"])) { padding-bottom: 4rem; }
96154
+ [data-skin="lantern"] [data-arrangement="footer-centred"] > [data-slot="panel"] { margin-bottom: 3.5rem; }
96155
+ [data-skin="lantern"] [data-arrangement="footer-centred"][data-slot="section"] [data-slot="head"]::after { border-width: 1.5px; }
96156
+ [data-skin="lantern"] [data-arrangement="footer-centred"] [data-slot="panel"] [data-slot="group-label"] { font-family: var(--font-body); font-weight: 500; font-size: 0.8125rem; letter-spacing: 0.08em; color: var(--rb-surface-text-color); }
96157
+
96158
+ /* ================================================= MEDIA TEXT: CIRCLE BESIDE
96159
+ * Kept separate from footer dressing for concurrent footer work.
96160
+ */
96161
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="frame"] {
96162
+ display: grid;
96163
+ grid-template-columns: repeat(12, minmax(0, 1fr));
96164
+ column-gap: var(--rb-skin-gutter);
96165
+ align-items: center;
96166
+ }
96167
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="media"] { grid-column: 1 / 6; min-width: 0; }
96168
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="copy"] {
96169
+ grid-column: 7 / 13;
96170
+ display: grid;
96171
+ gap: var(--rb-skin-copy-gap);
96172
+ justify-items: start;
96173
+ max-width: 34rem;
96174
+ }
96175
+ [data-skin="lantern"] [data-treat="circle-beside"][data-knob-image-position="right"] [data-slot="media"] { grid-column: 8 / 13; grid-row: 1; }
96176
+ [data-skin="lantern"] [data-treat="circle-beside"][data-knob-image-position="right"] [data-slot="copy"] { grid-column: 1 / 7; grid-row: 1; }
96177
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="head"]:not(:has(*)) { display: none; }
96178
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="head"] {
96179
+ justify-self: start;
96180
+ justify-items: start;
96181
+ text-align: start;
96182
+ margin: 0;
96183
+ padding-top: 2rem;
96184
+ }
96185
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="head"] > [data-slot="heading"] { text-align: start; }
96186
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="head"]::before {
96187
+ left: 0;
96188
+ transform: none;
96189
+ background: linear-gradient(to right, transparent 0 18px, var(--rb-surface-mark-color) 18px) center 4px / 52px 1px no-repeat;
96190
+ width: 52px;
96191
+ height: 9px;
96192
+ }
96193
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="head"]::after { left: 1px; transform: rotate(45deg); }
96194
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="intro"] { font-size: 1.1875rem; line-height: 1.65; max-width: none; color: var(--rb-surface-muted-color); }
96195
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="intro"] > [data-slot="lede"] { font-size: inherit; line-height: inherit; color: var(--rb-surface-text-color); }
96196
+ [data-skin="lantern"] [data-treat="circle-beside"][data-has-photo="false"] [data-slot="media"]:not(:has([data-placeholder-field])) { display: none; }
96197
+ [data-skin="lantern"] [data-treat="circle-beside"][data-has-photo="false"] [data-slot="frame"]:not(:has([data-placeholder-field])) > [data-slot="copy"] { grid-column: 1 / -1; grid-row: auto; }
96198
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-placeholder-field] { aspect-ratio: 1; height: auto; border-radius: 50%; overflow: hidden; }
96199
+ @container rb-site (max-width: 767px) {
96200
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
96201
+ [data-skin="lantern"]:is(*, :scope) [data-treat="circle-beside"] [data-slot="frame"] { grid-template-columns: minmax(0, 1fr); row-gap: 2.5rem; }
96202
+ [data-skin="lantern"]:is(*, :scope) [data-treat="circle-beside"] [data-slot="frame"] > [data-slot="media"] { grid-column: 1 / -1; grid-row: auto; width: 76%; justify-self: center; }
96203
+ [data-skin="lantern"]:is(*, :scope) [data-treat="circle-beside"] [data-slot="frame"] > [data-slot="copy"] { grid-column: 1 / -1; grid-row: auto; }
96204
+ }
96205
+ }
96206
+
96207
+ /* ---------------------------------------------------- image gallery: Lucy Looks */
96208
+ [data-skin="lantern"] [data-arrangement="tiles"] [data-slot="head"] { width: 100%; }
96209
+ [data-skin="lantern"] [data-arrangement="tiles"] [data-slot="head"]:not(:has([data-slot="heading"])) { padding-top: 0; }
96210
+ [data-skin="lantern"] [data-arrangement="tiles"] [data-slot="head"]:not(:has([data-slot="heading"]))::before,
96211
+ [data-skin="lantern"] [data-arrangement="tiles"] [data-slot="head"]:not(:has([data-slot="heading"]))::after { display: none; }
96212
+ [data-skin="lantern"] [data-treat="square-tiles"] [data-slot="items"] { --rb-skin-gallery-gap: 0; border-radius: var(--rb-skin-radius, 10px); overflow: hidden; }
96213
+ [data-skin="lantern"] [data-treat="square-tiles"] [data-slot="caption"] { display: none; }
96214
+ [data-skin="lantern"] [data-treat="arched-captions"] [data-slot="items"] { --rb-skin-gallery-gap: clamp(1rem, 3cqi, 2.5rem); align-items: start; }
96215
+ [data-skin="lantern"] [data-treat="arched-captions"] [data-slot="item"]:nth-child(3n + 2) { transform: translateY(4.5rem); }
96216
+ [data-skin="lantern"] [data-treat="arched-captions"] [data-slot="items"]:has([data-slot="item"]:nth-child(3n + 2)) { padding-bottom: 4.5rem; }
96217
+ [data-skin="lantern"] [data-treat="arched-captions"] [data-slot="media"] { aspect-ratio: 3 / 4; border-radius: var(--lantern-arch); }
96218
+ [data-skin="lantern"] [data-treat="arched-captions"] [data-slot="caption"] { margin-top: 1rem; text-align: center; font-size: 1rem; line-height: 1.5; color: var(--rb-surface-muted-color); }
96219
+ @container rb-site (max-width: 767px) {
96220
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
96221
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-captions"] [data-slot="item"]:nth-child(3n + 2) { transform: none; }
96222
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-captions"] [data-slot="item"]:nth-child(2n) { transform: translateY(3rem); }
96223
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-captions"] [data-slot="items"]:has([data-slot="item"]:nth-child(3n + 2)) { padding-bottom: 0; }
96224
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-captions"] [data-slot="items"]:has([data-slot="item"]:nth-child(2n)) { padding-bottom: 3rem; }
96225
+ }
96226
+ }
96227
+
96228
+ /* ---------------------------------------------------- newsletter: Signup in an arch */
96229
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="frame"] {
96230
+ display: grid; grid-template-columns: minmax(0, 1fr); justify-items: center;
96231
+ text-align: center; gap: 1.125rem; width: 100%; max-width: 53.75rem; margin-inline: auto;
96232
+ padding: 7rem clamp(1.5rem, 5cqi, 5rem) 3rem;
96233
+ border: 1px solid var(--rb-surface-mark-color); border-bottom: 0; border-radius: var(--lantern-arch-wide);
96234
+ }
96235
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="frame"]::before {
96236
+ content: ""; position: absolute; inset: 8px 8px 0; pointer-events: none;
96237
+ border: 1px solid var(--rb-surface-mark-color); border-bottom: 0; border-radius: var(--lantern-arch-wide); opacity: 0.55;
96238
+ }
96239
+ [data-skin="lantern"] [data-treat="signup-arch"][data-knob-arch-frame="false"] [data-slot="frame"] { border-color: transparent; }
96240
+ [data-skin="lantern"] [data-treat="signup-arch"][data-knob-arch-frame="false"] [data-slot="frame"]::before { display: none; }
96241
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="head"] { margin: 0; width: 100%; }
96242
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="head"]:not(:has(*)) { display: none; }
96243
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="head"]:not(:has([data-slot="heading"])) { padding-top: 0; }
96244
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="head"]:not(:has([data-slot="heading"]))::before,
96245
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="head"]:not(:has([data-slot="heading"]))::after { display: none; }
96246
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="intro"] { --rb-surface-text-color: var(--rb-surface-muted-color); color: var(--rb-surface-muted-color); }
96247
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="panel"] { width: 100%; max-width: 44rem; margin-top: 1.25rem; text-align: left; }
96248
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="grid"] { display: flex; flex-direction: row; flex-wrap: wrap; gap: 1rem; align-items: end; }
96249
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="items"] { display: contents; }
96250
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="item"] { display: grid; gap: 0.4rem; min-width: 0; flex: 1 1 12rem; margin: 0; }
96251
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="row"] { display: grid; gap: 0.4rem; min-width: 0; flex: 1.35 1 16rem; margin: 0; }
96252
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="fact-label"] { font-size: 1rem; font-weight: 500; color: var(--rb-surface-text-color); }
96253
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="control"] {
96254
+ width: 100%; min-width: 0; min-height: 52px; padding: 0.8rem 1.25rem;
96255
+ border: 1px solid var(--rb-surface-muted-color); border-radius: 9999px;
96256
+ background: transparent; color: var(--rb-surface-text-color); font-family: var(--font-body); font-size: 1.0625rem; line-height: 1.4;
96257
+ }
96258
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="control"]::placeholder { color: var(--rb-surface-muted-color); opacity: 1; }
96259
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="control"]:focus-visible { outline: 2px solid var(--rb-surface-mark-color); outline-offset: 2px; border-color: var(--rb-surface-mark-color); }
96260
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="actions"] { margin: 0; flex: 0 0 auto; }
96261
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="action"] { min-height: 52px; padding-block: 0; }
96262
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="grid"] > :not([data-slot]) { flex-basis: 100%; }
96263
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="caption"] { margin-top: 1.25rem; font-size: 1rem; line-height: 1.5; color: var(--rb-surface-muted-color); text-align: center; }
96264
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="outcome"] { width: 100%; margin-top: 1rem; font-family: var(--font-heading); font-size: 1.5rem; line-height: 1.3; text-align: center; }
96265
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="frame"]:not(:has([data-slot="heading"])) { padding-top: 4.5rem; }
96266
+ [data-skin="lantern"] [data-treat="signup-arch"][data-knob-arch-frame="false"] [data-slot="frame"] { padding-top: 0; }
96267
+ [data-skin="lantern"] [data-treat="signup-arch"] [data-slot="panel"]:not(:has([data-slot="item"])) { max-width: 34rem; }
96268
+ @container rb-site (max-width: 767px) {
96269
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
96270
+ [data-skin="lantern"]:is(*, :scope) [data-treat="signup-arch"] [data-slot="frame"] { padding: 5rem 1.25rem 2.5rem; }
96271
+ [data-skin="lantern"]:is(*, :scope) [data-treat="signup-arch"] [data-slot="grid"] { flex-direction: column; align-items: stretch; }
96272
+ [data-skin="lantern"]:is(*, :scope) [data-treat="signup-arch"] :is([data-slot="item"], [data-slot="row"], [data-slot="actions"]) { flex: none; width: 100%; }
96273
+ [data-skin="lantern"]:is(*, :scope) [data-treat="signup-arch"] [data-slot="action"] { width: 100%; }
96274
+ }
96275
+ }
96276
+
96277
+ /* ---------------------------------------------------- form: beside introduction, arched panel */
96278
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="frame"] { grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 2rem; align-items: start; }
96279
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="copy"] { grid-column: 1 / 6; padding-top: 0; min-width: 0; }
96280
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="head"] { padding-top: 5rem; display: grid; justify-items: start; justify-self: start; margin-inline: 0; width: 100%; text-align: left; }
96281
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="head"] > :is([data-slot="heading"], [data-slot="intro"]) { text-align: left; }
96282
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="head"]::before { width: 52px; height: 9px; left: 0; transform: none; background: linear-gradient(to right, transparent 0 18px, var(--rb-surface-mark-color) 18px) center 4px / 52px 1px no-repeat; }
96283
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="head"]::after { left: 0; transform: rotate(45deg); }
96284
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="intro"] { font-size: 1.1875rem; line-height: 1.65; }
96285
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="head"]:not(:has([data-slot="heading"])) { padding-top: 0; }
96286
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="head"]:not(:has([data-slot="heading"]))::before,
96287
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="head"]:not(:has([data-slot="heading"]))::after { display: none; }
96288
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="copy"]:not(:has([data-slot="heading"], [data-slot="intro"])) { display: none; }
96289
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="panel"] {
96290
+ grid-column: 7 / 13; min-width: 0; padding: 5.5rem clamp(1.5rem, 3cqi, 2.75rem) 2.5rem;
96291
+ border: 1px solid var(--rb-surface-mark-color); border-radius: 50% 50% var(--rb-skin-radius, 10px) var(--rb-skin-radius, 10px) / 140px 140px var(--rb-skin-radius, 10px) var(--rb-skin-radius, 10px);
96292
+ }
96293
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="panel"]::before {
96294
+ content: ""; position: absolute; inset: 8px 8px auto; height: 160px; pointer-events: none;
96295
+ border: 1px solid var(--rb-surface-mark-color); border-bottom: 0; border-radius: 50% 50% 0 0 / 132px 132px 0 0; opacity: 0.55;
96296
+ mask-image: linear-gradient(currentcolor 40%, transparent);
96297
+ }
96298
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="frame"]:not(:has([data-slot="heading"], [data-slot="intro"])) > [data-slot="panel"] { grid-column: 1 / -1; width: 100%; max-width: 44rem; margin-inline: auto; }
96299
+ [data-skin="lantern"] [data-treat="arched-panel"][data-knob-arch-frame="false"] [data-slot="panel"] { border-color: transparent; border-radius: var(--rb-skin-radius, 10px); padding-top: 2.5rem; }
96300
+ [data-skin="lantern"] [data-treat="arched-panel"][data-knob-arch-frame="false"] [data-slot="panel"]::before { display: none; }
96301
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="grid"] { display: grid; gap: 1.25rem; }
96302
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="group"] { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; }
96303
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="item"] { min-width: 0; margin: 0; }
96304
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="fact-label"] { font-weight: 500; color: var(--rb-surface-text-color); font-size: 1rem; }
96305
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="control"] {
96306
+ width: 100%; min-width: 0; padding: 0.875rem 1rem; border: 1px solid var(--rb-surface-muted-color);
96307
+ border-radius: var(--rb-skin-radius, 10px); background: transparent; color: var(--rb-surface-text-color); font-family: var(--font-body); font-size: 1.0625rem;
96308
+ }
96309
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-control="select"] { padding-right: 2.5rem; background-image: linear-gradient(45deg, transparent 50%, var(--rb-surface-text-color) 50%), linear-gradient(135deg, var(--rb-surface-text-color) 50%, transparent 50%); background-position: calc(100% - 22px) 50%, calc(100% - 16px) 50%; background-size: 6px 6px; background-repeat: no-repeat; }
96310
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="intro"] > [data-slot="lede"] { font-size: inherit; line-height: inherit; color: var(--rb-surface-text-color); }
96311
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="control"]::placeholder { color: var(--rb-surface-muted-color); opacity: 1; }
96312
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="mark"] { border-color: var(--rb-surface-muted-color); }
96313
+ [data-skin="lantern"] [data-treat="arched-panel"] :is([data-slot="control"], [data-slot="mark"]):focus-visible { outline: 2px solid var(--rb-surface-mark-color); outline-offset: 2px; }
96314
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="actions"] { margin-top: 0.5rem; }
96315
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="inline"] { display: flex; flex-wrap: wrap; gap: 1rem; }
96316
+ [data-skin="lantern"] [data-treat="arched-panel"] [data-slot="outcome"] { padding: 1rem 0 2rem; text-align: center; font-family: var(--font-heading); font-size: 1.5rem; line-height: 1.3; color: var(--rb-surface-text-color); }
96317
+ @container rb-site (max-width: 1023px) {
96318
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
96319
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-panel"] [data-slot="frame"] { grid-template-columns: minmax(0, 1fr); }
96320
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-panel"] :is([data-slot="copy"], [data-slot="panel"]) { grid-column: 1 / -1; }
96321
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-panel"] [data-slot="copy"] { padding-top: 0; }
96322
+ }
96323
+ }
96324
+ @container rb-site (max-width: 767px) {
96325
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
96326
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-panel"] [data-slot="panel"] { padding: 4.5rem 1.125rem 1.75rem; border-radius: 50% 50% var(--rb-skin-radius, 10px) var(--rb-skin-radius, 10px) / 90px 90px var(--rb-skin-radius, 10px) var(--rb-skin-radius, 10px); }
96327
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-panel"] [data-slot="panel"]::before { border-radius: 50% 50% 0 0 / 84px 84px 0 0; height: 110px; }
96328
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-panel"][data-knob-arch-frame="false"] [data-slot="panel"] { padding-top: 1.75rem; border-radius: var(--rb-skin-radius, 10px); }
96329
+ [data-skin="lantern"]:is(*, :scope) [data-treat="arched-panel"] [data-slot="group"] { grid-template-columns: minmax(0, 1fr); }
96330
+ }
96331
+ }
96332
+
96333
+ /* Lucy slice 5 — Reading column. Existing rich-text nodes carry semantic hooks. */
96334
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="copy"] { width: 100%; max-width: 36rem; margin-inline: auto; align-items: stretch; gap: 1.25rem; text-align: left; }
96335
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="item-body"] { width: 100%; font-size: 1.1875rem; line-height: 1.7; text-align: left; }
96336
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="lede"] { font-size: clamp(1.3125rem, 1.8cqi, 1.5rem); line-height: 1.55; color: var(--rb-surface-text-color); }
96337
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="heading"] { position: relative; padding-top: 2rem; margin-block: 2.25rem 1.25rem; font-size: clamp(1.75rem, 2.6cqi, 2.125rem); line-height: 1.12; text-align: center; color: var(--rb-surface-heading-color); }
96338
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="heading"]::before { content: ""; position: absolute; top: 0; left: 50%; width: 92px; height: 9px; transform: translateX(-50%); background: linear-gradient(to right, var(--rb-surface-mark-color) 0 34px, transparent 34px 58px, var(--rb-surface-mark-color) 58px) center 4px / 92px 1px no-repeat; }
96339
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="heading"]::after { content: ""; position: absolute; top: 1px; left: 50%; width: 7px; height: 7px; border: 1.5px solid var(--rb-surface-mark-color); transform: translateX(-50%) rotate(45deg); }
96340
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="quote"] { position: relative; margin: 2rem 0; padding: 2.25rem 0.5rem 2rem; border: 0; border-bottom: 1px solid var(--rb-surface-line-color); text-align: center; font-family: var(--font-heading); font-size: clamp(1.5rem, 2.3cqi, 1.875rem); line-height: 1.3; text-wrap: balance; color: var(--rb-surface-heading-color); }
96341
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="quote"] > * { margin: 0; font-family: inherit; font-size: inherit; line-height: inherit; color: inherit; }
96342
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="quote"]::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 1px; background: linear-gradient(to right, var(--rb-surface-line-color) 0 calc(50% - 12px), transparent calc(50% - 12px) calc(50% + 12px), var(--rb-surface-line-color) calc(50% + 12px)); }
96343
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="quote"]::after { content: ""; position: absolute; top: -4px; left: 50%; width: 9px; height: 9px; border: 1.5px solid var(--rb-surface-mark-color); transform: translateX(-50%) rotate(45deg); }
96344
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="photo"] { display: block; width: 100%; max-width: none; height: auto; aspect-ratio: 4 / 3; object-fit: cover; margin: 1.5rem 0; border-radius: 50% 50% 0 0 / 90px 90px 0 0; }
96345
+ @container rb-site (min-width: 1024px) {
96346
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
96347
+ [data-skin="lantern"]:is(*, :scope) [data-treat="reading-column"] [data-slot="photo"] { width: calc(100% + 12rem); margin-inline: -6rem; border-radius: var(--lantern-arch-wide); }
96348
+ }
96349
+ }
96350
+
96351
+ /* Reading-column flow owns one gap; optional title spans the whole column. */
96352
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="item-body"] { display: grid; gap: 1.25rem; }
96353
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="item-body"] > * { margin-block: 0; }
96354
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="item-body"] > [data-slot="heading"] { margin-top: 2.25rem; }
96355
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="item-body"] > [data-slot="quote"] { margin-block: 2rem; }
96356
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="item-body"] > [data-slot="photo"] { margin-block: 1.5rem; }
96357
+ [data-skin="lantern"] [data-treat="reading-column"] [data-slot="copy"] > [data-slot="heading"] { width: 100%; margin-top: 0; font-size: clamp(2.25rem, 3.9cqi, 3.375rem); }
96358
+
96359
+ /* Rich-text links use the same ink and decorative underline as the mockup. */
96360
+ [data-skin="lantern"] [data-treat="circle-beside"] [data-slot="intro"] [data-control="link"] { color: var(--rb-surface-text-color); text-decoration-color: var(--rb-surface-mark-color); text-decoration-thickness: 1.5px; text-underline-offset: 5px; }
96361
+
95872
96362
  /* =============================================================================
95873
96363
  * Measure skin (issue 1575 Phase 1b, D14).
95874
96364
  *
@@ -101596,10 +102086,10 @@ function parseLocalEventRun(raw, filePath) {
101596
102086
  }
101597
102087
  if ("schedule" in raw) throw new LegacyEventScheduleShapeError(filePath);
101598
102088
  const identity = parseLocalEventRunScheduleIdentity(raw, filePath);
101599
- const fields$2 = raw;
101600
- assertLocalEventRunRefs(fields$2, filePath);
101601
- assertLocalEventRunVisibility(fields$2, filePath);
101602
- if ("categoryRef" in fields$2) {
102089
+ const fields$1 = raw;
102090
+ assertLocalEventRunRefs(fields$1, filePath);
102091
+ assertLocalEventRunVisibility(fields$1, filePath);
102092
+ if ("categoryRef" in fields$1) {
101603
102093
  throw new InvalidLocalEventScheduleIdentityError(filePath, "Move categoryRef to the parent Event file");
101604
102094
  }
101605
102095
  const { presentation: _retiredPresentation, ...run } = raw;
@@ -108894,7 +109384,7 @@ function nestedFieldsFor(field) {
108894
109384
  * - repeater: has schema.fields (monomorphic) or itemTypes (polymorphic)
108895
109385
  * - tabGroup: has tabs[].fields
108896
109386
  */
108897
- function extractFieldIds(fields$2) {
109387
+ function extractFieldIds(fields$1) {
108898
109388
  const ids = new Set();
108899
109389
  function processField(field) {
108900
109390
  ids.add(field.id);
@@ -108902,7 +109392,7 @@ function extractFieldIds(fields$2) {
108902
109392
  processField(nestedField);
108903
109393
  }
108904
109394
  }
108905
- for (const field of fields$2) {
109395
+ for (const field of fields$1) {
108906
109396
  processField(field);
108907
109397
  }
108908
109398
  return ids;
@@ -108914,9 +109404,9 @@ function extractFieldIds(fields$2) {
108914
109404
  * within groups/repeaters are not validated at this level since their
108915
109405
  * presence depends on parent field structure.
108916
109406
  */
108917
- function extractRequiredFieldIds(fields$2) {
109407
+ function extractRequiredFieldIds(fields$1) {
108918
109408
  const required = new Set();
108919
- for (const field of fields$2) {
109409
+ for (const field of fields$1) {
108920
109410
  if (field.required) {
108921
109411
  required.add(field.id);
108922
109412
  }
@@ -110315,8 +110805,8 @@ function reportStoppedExecution(commandReports, residualSyncResults, remainingSt
110315
110805
  }
110316
110806
  function skippedResidualSettingsResult(residual) {
110317
110807
  const result = createEmptySyncResult();
110318
- const fields$2 = residual.diff.settings?.changes ?? [];
110319
- result.warnings.push(fields$2.length === 0 ? "Skipped remaining settings changes because an earlier push step failed." : `Skipped remaining settings changes because an earlier push step failed: ${fields$2.join(", ")}.`);
110808
+ const fields$1 = residual.diff.settings?.changes ?? [];
110809
+ result.warnings.push(fields$1.length === 0 ? "Skipped remaining settings changes because an earlier push step failed." : `Skipped remaining settings changes because an earlier push step failed: ${fields$1.join(", ")}.`);
110320
110810
  return result;
110321
110811
  }
110322
110812
  function executeResidualSettingsSync(input, residual) {
@@ -117625,8 +118115,7 @@ const THEME_FIELD_CATEGORY_MAP = {
117625
118115
  "name",
117626
118116
  "description",
117627
118117
  "rationale",
117628
- "siteStyleId",
117629
- "skin"
118118
+ "siteStyleId"
117630
118119
  ],
117631
118120
  "Design Axes": ["axes"],
117632
118121
  "Palette": ["palette"],
@@ -117642,9 +118131,7 @@ const THEME_FIELD_CATEGORY_MAP = {
117642
118131
  "motion",
117643
118132
  "corners",
117644
118133
  "gradients",
117645
- "headingDecoration",
117646
- "skinTokens",
117647
- "skinMarks"
118134
+ "headingDecoration"
117648
118135
  ],
117649
118136
  "Component Systems": [
117650
118137
  "buttons",
@@ -117662,6 +118149,11 @@ const THEME_FIELD_CATEGORY_MAP = {
117662
118149
  "layout",
117663
118150
  "hero"
117664
118151
  ],
118152
+ "Site Style Dressing": [
118153
+ "skin",
118154
+ "skinTokens",
118155
+ "skinMarks"
118156
+ ],
117665
118157
  "Custom CSS": [
117666
118158
  "customCssRules",
117667
118159
  "blockCustomCssRules",
@@ -117898,13 +118390,13 @@ function extractSchemaInfo(schema, skipFields = []) {
117898
118390
  if (typeName !== ZodTypeName.ZodObject) {
117899
118391
  return [];
117900
118392
  }
117901
- const fields$2 = [];
118393
+ const fields$1 = [];
117902
118394
  for (const [name, fieldSchema$1] of getSchemaShapeEntries(inner)) {
117903
118395
  if (skipFields.includes(name)) continue;
117904
118396
  const fieldInfo = extractFieldInfo(name, fieldSchema$1);
117905
- fields$2.push(fieldInfo);
118397
+ fields$1.push(fieldInfo);
117906
118398
  }
117907
- return fields$2;
118399
+ return fields$1;
117908
118400
  }
117909
118401
  /**
117910
118402
  * Extract information from a single field
@@ -118006,7 +118498,7 @@ function formatUnionOption(schema) {
118006
118498
  /**
118007
118499
  * Group fields by category for documentation organization
118008
118500
  */
118009
- function groupFieldsByCategory(fields$2) {
118501
+ function groupFieldsByCategory(fields$1) {
118010
118502
  const categories = new Map();
118011
118503
  const categorizedFieldNames = new Set();
118012
118504
  for (const fieldNames of Object.values(THEME_FIELD_CATEGORY_MAP)) {
@@ -118015,12 +118507,12 @@ function groupFieldsByCategory(fields$2) {
118015
118507
  }
118016
118508
  }
118017
118509
  for (const [category, fieldNames] of Object.entries(THEME_FIELD_CATEGORY_MAP)) {
118018
- const categoryFields = fields$2.filter((f) => fieldNames.includes(f.name));
118510
+ const categoryFields = fields$1.filter((f) => fieldNames.includes(f.name));
118019
118511
  if (categoryFields.length > 0) {
118020
118512
  categories.set(category, categoryFields);
118021
118513
  }
118022
118514
  }
118023
- const otherFields = fields$2.filter((f) => !categorizedFieldNames.has(f.name));
118515
+ const otherFields = fields$1.filter((f) => !categorizedFieldNames.has(f.name));
118024
118516
  if (otherFields.length > 0) {
118025
118517
  categories.set("Other", otherFields);
118026
118518
  }
@@ -118222,8 +118714,8 @@ const COMMON_PATTERNS = [{
118222
118714
  function getCommonPatternId(field) {
118223
118715
  return COMMON_PATTERNS.find((pattern) => pattern.match(field))?.id;
118224
118716
  }
118225
- function renderFieldList(fields$2, depth, skipPatternCheck = false) {
118226
- return fields$2.flatMap((field) => renderField(field, depth, skipPatternCheck));
118717
+ function renderFieldList(fields$1, depth, skipPatternCheck = false) {
118718
+ return fields$1.flatMap((field) => renderField(field, depth, skipPatternCheck));
118227
118719
  }
118228
118720
  function renderField(field, depth, skipPatternCheck) {
118229
118721
  const indent$1 = " ".repeat(depth);
@@ -118672,16 +119164,16 @@ function buildThemeSchemaTemplate() {
118672
119164
  }
118673
119165
  function buildThemeSchemaGeneratedSection() {
118674
119166
  const sections = [];
118675
- const fields$2 = extractSchemaInfo(themeSchema, DEPRECATED_THEME_FIELDS);
118676
- const categorized = groupFieldsByCategory(fields$2);
119167
+ const fields$1 = extractSchemaInfo(themeSchema, DEPRECATED_THEME_FIELDS);
119168
+ const categorized = groupFieldsByCategory(fields$1);
118677
119169
  for (const [category, categoryFields] of categorized) {
118678
119170
  sections.push(renderThemeSchemaCategorySection(category, categoryFields));
118679
119171
  }
118680
119172
  return sections.join("\n");
118681
119173
  }
118682
- function renderThemeSchemaCategorySection(category, fields$2) {
119174
+ function renderThemeSchemaCategorySection(category, fields$1) {
118683
119175
  const lines = [`## ${category}`, ""];
118684
- for (const field of fields$2) {
119176
+ for (const field of fields$1) {
118685
119177
  lines.push(...renderThemeSchemaField(field, 0));
118686
119178
  lines.push("");
118687
119179
  }
@@ -118812,10 +119304,10 @@ function renderBlockFieldOptionsSection(options) {
118812
119304
  lines.push("");
118813
119305
  return lines.join("\n");
118814
119306
  }
118815
- for (const [blockId, fields$2] of Object.entries(options)) {
119307
+ for (const [blockId, fields$1] of Object.entries(options)) {
118816
119308
  lines.push(`### ${blockId}`);
118817
119309
  lines.push("");
118818
- for (const [fieldId, config$1] of Object.entries(fields$2)) {
119310
+ for (const [fieldId, config$1] of Object.entries(fields$1)) {
118819
119311
  lines.push(`- ${fieldId}`);
118820
119312
  if (config$1.options && config$1.options.length > 0) {
118821
119313
  lines.push(...renderOptionsList(config$1.options, 1));
@@ -118944,7 +119436,7 @@ async function loadConfig(configPath, output) {
118944
119436
  return { errorMessage: "No config path provided." };
118945
119437
  }
118946
119438
  try {
118947
- const { loadConfigFile: loadConfigFile$1 } = await import("../load-config-s-HOXD6E.mjs");
119439
+ const { loadConfigFile: loadConfigFile$1 } = await import("../load-config-rPaisrdG.mjs");
118948
119440
  const rawConfig = await loadConfigFile$1(configPath);
118949
119441
  const parsed = riverbankSiteConfigSchema.safeParse(rawConfig);
118950
119442
  if (!parsed.success) {
@@ -125472,8 +125964,8 @@ async function hostFingerprint() {
125472
125964
  function linuxProcessStartToken(raw) {
125473
125965
  const commandEnd = raw.lastIndexOf(")");
125474
125966
  if (commandEnd < 0) return null;
125475
- const fields$2 = raw.slice(commandEnd + 1).trim().split(/\s+/);
125476
- return fields$2[19] ?? null;
125967
+ const fields$1 = raw.slice(commandEnd + 1).trim().split(/\s+/);
125968
+ return fields$1[19] ?? null;
125477
125969
  }
125478
125970
  async function processStartProbe(pid) {
125479
125971
  if (process.platform === "linux") {
@@ -129044,26 +129536,26 @@ function parseReceiptKeyIds(value) {
129044
129536
  };
129045
129537
  return value.tag === "standard" ? parseStandardKnownCredentialKeyIds(parsedFields) : parsePreviewKnownCredentialKeyIds(parsedFields);
129046
129538
  }
129047
- function parseStandardKnownCredentialKeyIds(fields$2) {
129048
- if (fields$2.live !== undefined && fields$2.management !== undefined) {
129539
+ function parseStandardKnownCredentialKeyIds(fields$1) {
129540
+ if (fields$1.live !== undefined && fields$1.management !== undefined) {
129049
129541
  return ok({
129050
129542
  tag: "standard",
129051
- live: fields$2.live,
129052
- management: fields$2.management
129543
+ live: fields$1.live,
129544
+ management: fields$1.management
129053
129545
  });
129054
129546
  }
129055
- if (fields$2.live !== undefined) return ok({
129547
+ if (fields$1.live !== undefined) return ok({
129056
129548
  tag: "standard",
129057
- live: fields$2.live
129549
+ live: fields$1.live
129058
129550
  });
129059
- if (fields$2.management !== undefined) return ok({
129551
+ if (fields$1.management !== undefined) return ok({
129060
129552
  tag: "standard",
129061
- management: fields$2.management
129553
+ management: fields$1.management
129062
129554
  });
129063
129555
  return err({ tag: "invalid_key_ids" });
129064
129556
  }
129065
- function parsePreviewKnownCredentialKeyIds(fields$2) {
129066
- const { live, management, preview } = fields$2;
129557
+ function parsePreviewKnownCredentialKeyIds(fields$1) {
129558
+ const { live, management, preview } = fields$1;
129067
129559
  if (live !== undefined && management !== undefined && preview !== undefined) {
129068
129560
  return ok({
129069
129561
  tag: "with_preview",
@@ -131445,7 +131937,7 @@ function appointmentsRequirements(context, input) {
131445
131937
  acknowledgedAt: override.acknowledgedAt,
131446
131938
  acknowledgedBy: override.acknowledgedBy
131447
131939
  } : evidenceFromDerivedState(state);
131448
- const fields$2 = {
131940
+ const fields$1 = {
131449
131941
  packId: "bookings_appointments",
131450
131942
  owner: "admin",
131451
131943
  title: "Configure appointments",
@@ -131455,7 +131947,7 @@ function appointmentsRequirements(context, input) {
131455
131947
  evidence
131456
131948
  };
131457
131949
  return [requirement(context.publicExperience, appointments.kind === "pending_setup" ? {
131458
- ...fields$2,
131950
+ ...fields$1,
131459
131951
  id: "configure_appointments",
131460
131952
  state: "pending",
131461
131953
  detail: {
@@ -131463,14 +131955,14 @@ function appointmentsRequirements(context, input) {
131463
131955
  missing: appointments.missing
131464
131956
  }
131465
131957
  } : {
131466
- ...fields$2,
131958
+ ...fields$1,
131467
131959
  id: "configure_appointments",
131468
131960
  state: "complete"
131469
131961
  })];
131470
131962
  }
131471
131963
  function eventsRequirements(context, events) {
131472
131964
  if (events.kind === "disabled") return [];
131473
- const fields$2 = derivedFields(context, {
131965
+ const fields$1 = derivedFields(context, {
131474
131966
  packId: "bookings_events",
131475
131967
  complete: events.kind === "ready",
131476
131968
  copy: {
@@ -131481,7 +131973,7 @@ function eventsRequirements(context, events) {
131481
131973
  actionLabel: "Create an event"
131482
131974
  });
131483
131975
  return [requirement(context.publicExperience, events.kind === "pending_setup" ? {
131484
- ...fields$2,
131976
+ ...fields$1,
131485
131977
  id: "configure_events",
131486
131978
  state: "pending",
131487
131979
  detail: {
@@ -131489,7 +131981,7 @@ function eventsRequirements(context, events) {
131489
131981
  offeredKinds: events.offeredKinds
131490
131982
  }
131491
131983
  } : {
131492
- ...fields$2,
131984
+ ...fields$1,
131493
131985
  id: "configure_events",
131494
131986
  state: "complete"
131495
131987
  })];
@@ -131510,7 +132002,7 @@ function coursesRequirements(context, courses) {
131510
132002
  }
131511
132003
  function paymentsRequirements(context, payments) {
131512
132004
  if (payments.kind === "not_applicable") return [];
131513
- const fields$2 = derivedFields(context, {
132005
+ const fields$1 = derivedFields(context, {
131514
132006
  packId: "payments",
131515
132007
  complete: payments.kind === "ready",
131516
132008
  copy: {
@@ -131521,11 +132013,11 @@ function paymentsRequirements(context, payments) {
131521
132013
  actionLabel: "Connect payments"
131522
132014
  });
131523
132015
  return [requirement(context.publicExperience, payments.kind === "ready" ? {
131524
- ...fields$2,
132016
+ ...fields$1,
131525
132017
  id: "connect_payments",
131526
132018
  state: "complete"
131527
132019
  } : {
131528
- ...fields$2,
132020
+ ...fields$1,
131529
132021
  id: "connect_payments",
131530
132022
  state: "pending",
131531
132023
  detail: {
@@ -134897,6 +135389,24 @@ async function acceptAdminInvite(apiClient, params) {
134897
135389
  }
134898
135390
  }
134899
135391
 
135392
+ //#endregion
135393
+ //#region ../billing/dist/stripe/connectSetupTypes.js
135394
+ /** Explicit choices only: an unmatched offering uses Stripe's guided category selection. */
135395
+ const STRIPE_CONNECT_BUSINESS_CATEGORIES = [
135396
+ {
135397
+ mcc: "8299",
135398
+ label: "Educational classes and workshops"
135399
+ },
135400
+ {
135401
+ mcc: "7997",
135402
+ label: "Fitness clubs and membership-based activities"
135403
+ },
135404
+ {
135405
+ mcc: "7911",
135406
+ label: "Dance schools and studios"
135407
+ }
135408
+ ];
135409
+
134900
135410
  //#endregion
134901
135411
  //#region src/project-linking/atomic-write.ts
134902
135412
  function isNodeError$3(error$1) {