@riverbankcms/sdk 0.102.0 → 0.103.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.
Files changed (101) hide show
  1. package/README.md +10 -2
  2. package/dist/{PreviewEditorSidebar-BKkhhkJk.mjs → PreviewEditorSidebar-DkNpCPja.mjs} +75 -9
  3. package/dist/{PreviewEditorUI-DIvTqcqI.mjs → PreviewEditorUI-DeNKtqk3.mjs} +2 -2
  4. package/dist/{SdkPreviewModeRuntime-CA2k7Z_T.mjs → SdkPreviewModeRuntime-5bCsXK2y.mjs} +572 -285
  5. package/dist/{SiteChromeCustomizeContext-Bh9-DtMQ.mjs → SiteChromeCustomizeContext-CO1sTK_W.mjs} +336 -36
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +298 -298
  7. package/dist/_dts/api/src/index.d.ts +1 -1
  8. package/dist/_dts/api/src/navigation/contracts.d.ts +6 -6
  9. package/dist/_dts/api/src/siteBanner.d.ts +2 -2
  10. package/dist/_dts/blocks/src/PageRenderer.d.ts +6 -1
  11. package/dist/_dts/blocks/src/bindings/index.d.ts +2 -2
  12. package/dist/_dts/blocks/src/index.d.ts +1 -1
  13. package/dist/_dts/blocks/src/server.d.ts +1 -1
  14. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +7 -7
  15. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +1 -1
  16. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +14 -14
  17. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +5 -5
  18. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +227 -227
  19. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +1 -1
  20. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  21. package/dist/_dts/blocks/src/system/customize/facets.d.ts +2 -2
  22. package/dist/_dts/blocks/src/system/inlineText.d.ts +2 -2
  23. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +177 -177
  24. package/dist/_dts/blocks/src/system/node/schema.d.ts +1 -1
  25. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +1 -1
  26. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +7 -7
  27. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -1
  28. package/dist/_dts/content-model/src/content-types/schema.d.ts +8 -8
  29. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +154 -18
  30. package/dist/_dts/db/src/schemas/forms.d.ts +15 -15
  31. package/dist/_dts/preview-next/src/client/blocks/previewProjection/types.d.ts +2 -1
  32. package/dist/_dts/preview-next/src/client/preview/CustomizeColorTokenPicker.d.ts +27 -0
  33. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +2 -1
  34. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +10 -2
  35. package/dist/_dts/preview-next/src/client/preview/sidebarTabPreference.d.ts +1 -1
  36. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +16 -1
  37. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +3 -2
  38. package/dist/_dts/sdk/src/config/validation.d.ts +3 -3
  39. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  40. package/dist/_dts/sdk/src/contracts/page.d.ts +2 -0
  41. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +10 -10
  42. package/dist/_dts/sdk/src/next/revalidate.d.ts +14 -1
  43. package/dist/_dts/sdk/src/public-api/contracts.d.ts +4 -4
  44. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -1
  45. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +3 -2
  46. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +3 -4
  47. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +1 -0
  48. package/dist/_dts/sdk/src/version.d.ts +1 -1
  49. package/dist/_dts/site-commands/src/commands.d.ts +19 -19
  50. package/dist/_dts/theme-core/src/accordions/types.d.ts +3 -3
  51. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +3 -3
  52. package/dist/_dts/theme-core/src/buttons/types.d.ts +7 -7
  53. package/dist/_dts/theme-core/src/cards/types.d.ts +6 -6
  54. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  55. package/dist/_dts/theme-core/src/inputs/types.d.ts +4 -4
  56. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +150 -144
  57. package/dist/_dts/theme-core/src/navigation/types.d.ts +6 -6
  58. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +5 -5
  59. package/dist/_dts/theme-core/src/schema.d.ts +199 -169
  60. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  61. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +2 -1
  62. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +24 -24
  63. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +2 -2
  64. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  65. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -2
  66. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +26 -1
  67. package/dist/_dts/theme-core/src/site-styles/sectionTransitions.d.ts +77 -0
  68. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +44 -0
  69. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +1 -1
  70. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  71. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +3 -3
  72. package/dist/_dts/ui/src/badge.d.ts +1 -1
  73. package/dist/_dts/ui/src/button.d.ts +1 -1
  74. package/dist/_dts/ui/src/card.d.ts +1 -1
  75. package/dist/_dts/ui/src/toggle.d.ts +2 -2
  76. package/dist/cli/index.mjs +28 -7
  77. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +9 -1
  78. package/dist/client/client.mjs +337 -69
  79. package/dist/client/hooks.mjs +13 -1
  80. package/dist/client/rendering/client.mjs +25 -4
  81. package/dist/client/rendering.mjs +336 -68
  82. package/dist/preview-next/client/runtime.mjs +3 -3
  83. package/dist/{sdk-runtime-K8Oqj97H.mjs → sdk-runtime-C8whifOy.mjs} +1 -1
  84. package/dist/{separator-CRoP34pT.mjs → separator-CM2C5Axs.mjs} +1 -1
  85. package/dist/server/components.mjs +321 -65
  86. package/dist/server/config-validation.mjs +12 -1
  87. package/dist/server/config.mjs +12 -1
  88. package/dist/server/data.mjs +12 -1
  89. package/dist/server/index.mjs +1 -1
  90. package/dist/server/next/revalidate.mjs +31 -1
  91. package/dist/server/next.mjs +325 -66
  92. package/dist/server/page-converter.mjs +12 -1
  93. package/dist/server/prebuild.mjs +1 -1
  94. package/dist/server/rendering/server.mjs +323 -65
  95. package/dist/server/rendering.mjs +323 -65
  96. package/dist/server/routing.mjs +24 -3
  97. package/dist/server/server.mjs +15 -2
  98. package/dist/server/theme-bridge.mjs +153 -32
  99. package/dist/server/theme.mjs +2 -0
  100. package/dist/styles/index.css +123 -30
  101. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { $ as PreviewRichTextEditor, $a as bindingSchema, $c as useBlockContext, $d as ChevronLeft, $i as getComponentBorderWidthPx, $l as DropdownMenuContent, $n as buildEventCalendarListingRender, $o as assertNever$6, $r as ctaCopyFragment, $s as UploadIcon, $t as deleteEntrySlotBlock, $u as unsafeAsCustomerPassId, Aa as isSemanticSpacing, Ac as getImageUrl, Ad as Image, Al as Root2$1, An as SITE_CHROME_VISIBLE_HEADER_SELECTOR, Ao as formatTime$3, Ar as formatCommercePrice, As as CalendarIcon$1, At as createRoutingHelpers, Au as formatBookingDate, Ba as normalizeOptionalId, Bc as TokenResolver, Bi as sectionTransitionVariantForBoundaryOptionId, Bl as Collapsible, Bn as isInternalResolvedLinkValue, Bo as blockBookingPaymentTermsSchema, Br as augmentManifestWithStyleGroups, Bs as ExternalLinkIcon, Bt as ManifestForm, Bu as formatBookingPriceDisplay, Ca as isOfferingsPreviewSourceKey, Cc as isRotationDimensionSwap, Cd as Pencil, Ci as planPageDesignLayoutLookCompatibility, Cl as Input, Cn as isSupportedLoaderEndpoint, Co as toLocationMapHydrationProps, Cr as buildProductDetailInteractiveIslandProps, Cs as resolveIconPickerPreset, Ct as pushHistoryEntry, Cu as clsx, Da as resolveOfferingsPreviewGroupCta, Dc as resolveMediaTransformForAspect, Dd as Minus, Di as getCuratedSiteStyle, Dl as TabsTrigger, Dn as listBlockDescriptors, Do as formatEventPrice, Dr as buildCartDisplay, Ds as ArrowDownIcon, Dt as recordsEqual, Du as unsafeAsEditorBlockId, Ea as resolveOfferingsPreviewCoursePath, Ec as parseAspectRatioValue, Ei as designRuntimeRulesForTheme, El as TabsList, En as getBlockDefinition, Eo as formatEventDateParts, Er as getShopDisplayForItems, Es as isSemanticIconId, Et as unsafeAsLinkedContentEntryId, Eu as createEditorReorderBlocksCommand, Fa as getEventRuntimeFiltersKey, Fc as generateButtonCss, Fd as FileText, Fl as DialogContent, Fn as mediaTransforms, Fo as resolveEventLinkProps, Fr as deriveCommerceCheckoutState, Fs as ChevronUpIcon, Ft as PaletteProvider, Fu as getBookingLocalDateKey, G as beginAutosaveBatch, Ga as eventLayoutSchema, Gc as mergeStyles, Gd as Copy, Gi as parseBackgroundAppearanceColorToken, Gl as Trigger, Gn as productDetailBlockDefinition, Go as defineClientOwnedBlockRuntime, Gr as faqHeadingFragment, Gs as InfoIcon, Gt as createStoreBackend, Gu as publicEventTicketTypes, Ha as columnOptionSchema, Hc as themeButtonClassName, Hd as EllipsisVertical, Hi as backgroundAppearanceColorTokenNames, Hn as useImageResolveContextOptional, Ho as createInteractiveIslandCodec, Hr as headingFragment, Hs as FileAudioIcon, Hu as publicEventPricingMode, Ia as resolveEventCalendarListPageSize, Ic as generateEffectsCSS, Id as FileSpreadsheet, Il as DialogDescription, In as layoutTransforms, Io as getEventAvailability, Ir as parseStoredCommerceCartState, Is as CircleMinusIcon, It as usePalette, Iu as parseBookingLocalDate, J as enqueueTransaction, Ja as weekStartSchema, Jc as useBackendWatch, Jd as CircleCheck, Jl as CardContent, Jn as eventListingBlockDefinition, Jo as composeHeaderSectionWrapperClassName, Jr as footerBottomTextFragment, Js as MinusIcon, Jt as applyPageDesignEditorAction, Ju as expectParsedBrandedId, K as confirmAutosaveBatch, Ka as filterAutoShowSchema, Kc as rgbColorValue, Kd as CirclePlus, Ki as defaultThemeTokens, Kl as createCollapsibleScope, Kn as newsletterSignupBlockDefinition, Ko as defineProgressiveBlockRuntime, Kr as blogFeaturedPostFragment, Ks as MailIcon, Kt as listContentTypes, Ku as formatCurrencyAmount, La as resolveEventListPaginationAction, Lc as generateShadowValue$1, Ld as FilePlay, Li as defaultSectionTransitionVariantForFamily, Ll as DialogFooter, Ln as uiTransforms, Lo as getLocalDateKey, Lr as productItemKey, Ls as CirclePlusIcon, Lt as recoveryConflictCopy, Lu as resolveBookingTimeZoneId, Ma as buildEventRuntimeFilters, Mc as siblingPath$1, Md as ImagePlus, Ml as ScrollableDialogContent, Mn as planSiteOverlayHeaderClearance, Mo as getContainerClass, Mr as EMPTY_COMMERCE_CART_STATE, Ms as ChevronDownIcon, Mu as formatBookingInstant, Na as eventListPaginationActionSchema, Nd as GripVertical, Nl as Dialog, Nn as visibleHeaderClearancePx, No as groupEventsByDate, Nr as buildPassCartItem, Ns as ChevronLeftIcon, Nu as formatBookingTime, Oa as resolveOfferingsPreviewGroupOrderEntries, Oc as asRecord, Oi as surfaceResolutionContextFromTheme, Ol as Content$1, On as siteFooterManifest, Oo as formatEventPriceDisplay, Or as buildProductCardDisplay, Os as ArrowLeftIcon, Ou as unsafeAsEditorBlockValues, Pa as eventPageSizeSchema, Pd as File, Pl as DialogClose, Pn as contentTransforms, Po as resolveEventCta, Pr as buildProductCartItem, Ps as ChevronRightIcon, Pu as formatLocalScheduleDate, Q as resolvePreviewSidebarTab, Qa as when, Qc as isNonEmptyValue, Qd as ChevronRight, Qi as pageDesignEditorBackgroundOverrideOwner, Ql as DropdownMenu, Qn as buildEventCalendarListingDisplay, Qo as asDesignBlockId, Qr as testimonialsHeadingFragment, Qs as ShoppingCartIcon, Qt as deleteBlock, Qu as unsafeAsAppointmentServiceId, Ra as normalizeCsvIds, Rc as generateBaseInteractiveCSS, Rd as FileHeadphone, Ri as sectionTransitionFamilies, Rl as DialogHeader, Rn as formattingTransforms, Ro as getLocalMinuteOfDay, Rr as reduceCommerceCart, Rs as ClockIcon$1, Rt as unfinishedBlockCopy, Ru as toBookingTimeZone, Sa as inferLegacyOfferingsPreviewGroupOrder, Sc as attachRenderableMediaAssetFields, Sd as Plus, Si as normalEditorCuratedPromotedFieldPaths, Sl as PopoverTrigger, Sn as useUniqueId, So as normalizeLocationMapProps, Sr as buildCheckoutInteractiveIslandProps, Ss as isIconPickerPreset, St as createHistoryState, Su as cn$1, Ta as normalizeOfferingsPreviewItemLimit, Tc as formatAspectRatioToken, Tl as TabsContent, Tn as GRADIENT_PRESETS, To as formatEventCompactDateRail, Tr as buildShopInteractiveIslandProps, Ts as getSemanticIconComponent, Tt as undoHistory, Tu as createEditorRemoveBlockCommand, Ua as eventButtonVariantSchema, Uc as backgroundColorStyle, Ud as Crop, Ui as backgroundAppearanceQuickColorTokenNames, Ul as Content, Un as shopBlockDefinition, Uo as defineInteractiveIslandMetaKeys, Ur as cardFragment, Us as FileSpreadsheetIcon, Ut as FormRenderer, Uu as publicEventPricingType, Va as calendarTabViewsSchema, Vc as parseThemeButtonVariantId, Vd as EyeOff, Vi as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, Vl as CollapsibleContent, Vn as ImageResolveContextProvider, Vo as buildInteractiveIslandProps, Vr as richTextFragment, Vs as FileArchiveIcon, Vt as createManifestFormAdapter, Vu as publicEventPricingCurrency, Wa as eventCalendarDefaultViewSchema, Wc as borderColorStyle, Wd as CreditCard, Wi as foregroundTokenForBackgroundAppearanceColorToken, Wl as Root, Wn as productListBlockDefinition, Wo as createZodCodec, Wr as faqAccordionFragment, Ws as FileTextIcon, Wt as evaluateVisibility, Wu as publicEventScalarPrice, X as rejectAutosaveBatch, Xa as eventCalendarListLayoutOptions, Xc as getModalConfig, Xd as ChevronsUpDown, Xi as isThemeV2NormalEditorRawStyleFieldName, Xl as CardTitle, Xn as eventCalendarBlockDefinition, Xo as splitPositioningClasses, Xr as formCopyFragment, Xs as PlayIcon, Xt as createBlock, Xu as parseSiteId, Y as idleEditorTransactionQueueState, Ya as eventCalendarListLayoutCompatibleDisplayModeValues, Yc as getFieldIntent, Yd as CircleAlert, Yl as CardHeader, Yn as buildEventListingInteractiveIslandProps, Yo as markEditableSurfaceForwarding, Yr as formEmbedFragment, Ys as PhoneIcon, Yt as getPageDesignEditorState, Yu as parseMediaAssetId, Za as el, Zc as isHeaderField, Zd as ChevronUp, Zi as isThemeV2NormalEditorRawStylePath, Zn as buildEventCalendarInteractiveIslandProps, Zo as planSiteChromePlacement, Zr as testimonialsCarouselFragment, Zs as PlusIcon, Zt as createEntrySlotBlock, Zu as unsafeAsAppointmentResourceId, _c as resolveMediaNodeResponsiveImage, _i as formatSiteChromeBackgroundTokenLabel, _l as SelectValue, _n as useSensors, _o as resolveOnColorForThemeToken, _r as courseRegistrationBlockDefinition, _s as getBlockIconSemanticFallbackId, _t as useEditorUiStore, _u as composeEventHandlers, aa as NAV_LINK_PADDING_MAP, ac as coerceInlineTextWithFallback, ad as err$2, af as Archive, ai as PUBLIC_FILE_FIELD_KINDS, al as unmapValueFromSelect, an as DEFAULT_LAUNCH_READINESS_INPUT, ao as normalizeEventScheduleScope, ar as findEventByOccurrenceId, as as ICON_SIZE_PX, at as getRichTextImagePositionFromTarget, au as __awaiter, ba as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, bc as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, bd as RotateCcw, bi as buildEditorModelRuntimeFieldsByBlockId, bl as Popover, bn as useCombinedRefs, bo as featuresFromHex, br as cartBlockDefinition, bs as resolveBlockIconRenderValue, bt as canRedoHistory, bu as cva, ca as FONT_WEIGHT_MAP, cc as parseInlineTextFromUnknown, cd as X, cf as __toESM, ci as MQ_MD_DOWN, cl as Tooltip, cn as DndContext, co as normalizeEventSurfaceScope, cr as resolveEventRequiresPayment, cs as FEATURE_CARD_ICON_TREATMENTS, ct as EditorProvider, cu as __read, da as LABEL_FONT_SIZE_MAP, dc as buildResolveImageUrlContext, di as MQ_TABLET_ONLY, dl as TooltipTrigger, dn as closestCenter, do as generateCardCss, dr as getStepNumber$1, ds as getFeatureCardIconCompletion, dt as useUISelector, du as __spreadArrays, ea as getComponentShadowVar, ec as XIcon, ed as unsafeAsFormId, ef as ChevronDown, ei as heroCtaRowFragment, el as SdkConfigProvider, eo as eventBlockKindValues, er as formBlockDefinition, es as ACCORDION_OPEN_ACCENT_THICKNESS, et as PreviewInlineTextEditor, eu as DropdownMenuItem, fa as expandPalette, fc as computeMediaTransformStyle, fd as Trash2, fi as BACKGROUND_POSITION_PRESET_VALUES, fl as Textarea, fn as getClientRect, fo as statusMutedColorDeclaration, fr as getWizardStepsForContext$1, fs as shouldReserveFeatureCardIconZone, ft as EditableBlockProvider, fu as useId$1, g as PreviewDesignCoordinatorProvider, ga as ctaButton, gc as resolveImageUrlWithContext, gd as Sparkles, gi as resolveBackgroundColorValue, gl as SelectTrigger, gn as useSensor, go as isCssColorLiteral, gr as buildGiftingInteractiveIslandProps, gs as buildGeneratedBlockIconRenderAssetLookupFromUnknown, gu as createContextScope, ha as runTransforms, hc as renderVideo, hd as Star, hi as resolveSectionForegroundStyles, hl as SelectItem, hn as useDroppable, ho as normalizeCardVariantRole, hr as giftingBlockDefinition, hs as toFeatureCardIconSuggestionInputs, ht as useEntryEditorController, hu as useControllableState, i as usePreviewDesignHistoryOrder, ia as NAV_LINK_LETTER_SPACING_MAP, ic as isRecord$18, id as unsafeAsPositiveSeconds, if as ArrowDown, ii as defineFragment, il as mapOptionValueForSelect, in as decodePublicProductCategorySelectorQuery, io as normalizeEventCategoryIdsCsv, ir as toRegistrationEvents, is as ICON_CONFIG, it as RichTextEditorSurface, iu as __assign, ja as resolveSpacing, jc as getAtPath, jd as ImageUp, jl as Trigger$1, jn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, jo as getCardOrientation, jr as formatInterval, js as CheckIcon$1, jt as createSnapshotFromPageRecord, ju as formatBookingDateTime, ka as resolveOfferingsPreviewGroups, kc as getDirectImageUrlForMediaAsset, kd as LoaderCircle, kl as List, kn as siteHeaderManifest, ko as formatEventTeacherLine, kr as buildProductDetailDisplay, ks as ArrowRightIcon, kt as useDebouncedLatestSave, ku as addLocalScheduleDays, la as INPUT_FONT_SIZE_MAP, lc as ImagePresets, ld as Upload, li as MQ_SM_DOWN, ll as TooltipContent, ln as KeyboardCode, lo as normalizeEventVenueId, lr as resolveRegistrationTarget, ls as applyFeatureCardIconSuggestions, lt as useEditor, lu as __rest, ma as createTransformRegistry, mc as renderAudio, mi as boxStylesTransforms, ml as SelectContent, mn as useDraggable, mo as normalizeBoxStylesCardVariant, mr as resolveEventRegistrationScopedEvents, ms as suggestSemanticIconForFeatureCard, mu as createCollection, n as useSiteChromeCustomizeOptional, na as parseCustomCssRules, nc as unwrapRichTextRoot, nd as unsafeAsPassId, nf as Box, ni as heroCopyFragment, nl as hasEmptyOption, nn as reorderBlocks, no as eventSurfaceScopeValues, nr as eventRegistrationBlockDefinition, ns as ACCORDION_TRIGGER_FONT_SCALE, nt as useRichTextEditor, nu as DropdownMenuSeparator, oa as NAV_LINK_PADDING_X_MAP, oc as inlineTextToPlainText, od as ok$3, of as __commonJSMin, oi as siteOptionSources, ol as FieldFrame, on as deriveLaunchReadiness, oo as normalizeEventStaffMemberId, or as findPreSelectedEvent, os as PUBLIC_DOWNLOAD_MEDIA_TYPES, ot as insertOrReplaceRichTextImage, ou as __extends, pa as generateCssVars, pc as getCurrentResolveImageUrlContext, pd as Ticket, pi as getAnchorClasses, pl as Select, pn as useDndContext, po as generateShadowValue, pr as normalizeEventRegistrationPageSurfaceSubject, ps as suggestFeatureCardSemanticIcons, pt as EntryControllerProvider, pu as useDirection, q as deriveTransactionCapabilities, qa as previewStageSchema, qc as textColorStyle, qd as CircleMinus, ql as Card, qn as buildNewsletterFormInteractiveIslandProps, qr as singleButtonFragment, qs as MapPinIcon$1, qt as toRoutableLinkPayload, qu as assertNever$5, r as PreviewDesignHistoryOrderProvider, ra as NAV_LINK_BORDER_RADIUS_MAP, rc as isObjectRecord, rd as unsafeAsPositiveByteCount$1, rf as ArrowUp, ri as bodyCopyFragment, rl as mapCurrentValueForSelect, rn as reorderEntrySlotBlocks, ro as normalizeEventBlockKind, rr as buildEventRegistrationInteractiveIslandProps, rs as ACCORDION_TRIGGER_LETTER_SPACING, rt as EMPTY_DOC, ru as DropdownMenuTrigger, sa as NAV_LINK_TEXT_SIZE_MAP, sc as isInlineTextEmpty, sd as lucide_react_exports, sf as __exportAll, si as MQ_LG_UP, sl as useField, sn as AMBIENT_BACKGROUND_ROLES$1, so as normalizeEventSurfacePresetsCsv, sr as resolveDiscountContext, ss as mediaSchema, st as InlineTextEditor, su as __generator, t as SiteChromeCustomizeProvider, ta as parseBlockCustomCssRules, tc as createRichTextDocFromMarkdown, td as unsafeAsMediaAssetId, tf as Check, ti as ctaRowFragment, tl as useSdkConfig, tn as mutateBlockContent, to as eventScheduleScopeValues, tr as buildFormInteractiveIslandProps, ts as ACCORDION_SPACING_MAP, tt as PreviewTextEditor, ua as INPUT_SPACING_MAP, uc as MediaPlaceholder, ui as MQ_SM_UP, ul as TooltipProvider, un as PointerSensor, uo as publicEventSchema, ur as WIZARD_STEPS$1, us as createFeatureCardIconKey, uu as __spreadArray, v as PreviewThemeOverlayProvider, vc as resolveMediaStorageUrl, vd as Settings, vi as PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE, vl as Label, vn as CSS, vo as resolveTokenOrCssColorValue, vr as buildCourseRegistrationInteractiveIslandProps, vs as getGeneratedBlockIconStyleState, vt as useEditorUiStoreInstance, vu as Primitive, wa as normalizeOfferingsPreviewGroupOrder, wc as normalizeRightAngle, wi as resolveVisiblePromotedFieldPathsForEditorBlock, wl as Tabs, wn as gradientToCss, wo as formatDate$3, wr as buildProductListInteractiveIslandProps, ws as SEMANTIC_ICON_DEFINITIONS, wt as redoHistory, wu as createEditorInsertBlockCommand, xa as buildOfferingsPreviewRenderStates, xc as resolveMediaSlotContract, xi as retargetCompiledRuntimeFieldsForContentAdjacency, xl as PopoverContent, xn as useIsomorphicLayoutEffect, xo as buildGoogleMapsDirectionsUrl, xr as buildCartInteractiveIslandProps, xs as parseSiteIconStyleGuideVersionId, xt as canUndoHistory, xu as useComposedRefs, y as usePreviewThemeOverlay, yc as setContextResolveImageUrlContext, yd as Search, yi as applyCompiledRuntimeFieldsToContent, yl as Badge, yn as isKeyboardEvent, yo as getTextColorForBackground, yr as checkoutBlockDefinition, ys as parseBlockIconValue, yt as useOptionalEditorUiStoreInstance, yu as Button, za as normalizeCsvString, zc as generateInteractiveChildInheritanceCSS, zd as FileArchive, zi as sectionTransitionFamilyForBoundaryOptionId, zl as DialogTitle, zn as createManifestValidator, zo as resolveRuntimeEventPricing, zr as augmentManifest, zs as DownloadIcon, zt as validateBlockManifestIssues, zu as toScheduledBookingDateTime } from "./SiteChromeCustomizeContext-Bh9-DtMQ.mjs";
2
+ import { $ as PreviewRichTextEditor, $a as eventCalendarListLayoutOptions, $c as getModalConfig, $d as ChevronsUpDown, $i as isThemeV2NormalEditorRawStyleFieldName, $l as CardTitle, $n as buildEventCalendarListingRender, $o as splitPositioningClasses, $r as ctaCopyFragment, $s as PlayIcon, $t as deleteEntrySlotBlock, $u as parseSiteId, Aa as resolveOfferingsPreviewGroupCta, Ac as resolveMediaTransformForAspect, Ad as Minus, Ai as surfaceResolutionContextFromTheme, Al as TabsTrigger, An as SITE_CHROME_VISIBLE_HEADER_SELECTOR, Ao as formatEventPrice, Ar as formatCommercePrice, As as ArrowDownIcon, At as createRoutingHelpers, Au as unsafeAsEditorBlockId, Ba as resolveEventListPaginationAction, Bc as generateShadowValue$1, Bd as FilePlay, Bi as defaultSectionTransitionVariantForFamily, Bl as DialogFooter, Bn as isInternalResolvedLinkValue, Bo as getLocalDateKey, Br as augmentManifestWithStyleGroups, Bs as CirclePlusIcon, Bt as ManifestForm, Bu as resolveBookingTimeZoneId, Ca as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, Cc as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, Cd as RotateCcw, Ci as retargetCompiledRuntimeFieldsForContentAdjacency, Cl as Popover, Cn as isSupportedLoaderEndpoint, Co as featuresFromHex, Cr as buildProductDetailInteractiveIslandProps, Cs as resolveBlockIconRenderValue, Ct as pushHistoryEntry, Cu as cva, Da as normalizeOfferingsPreviewGroupOrder, Dc as normalizeRightAngle, Dl as Tabs, Dn as listBlockDescriptors, Do as formatDate$3, Dr as buildCartDisplay, Ds as SEMANTIC_ICON_DEFINITIONS, Dt as recordsEqual, Du as createEditorInsertBlockCommand, Ea as isOfferingsPreviewSourceKey, Ec as isRotationDimensionSwap, Ed as Pencil, Ei as resolveVisiblePromotedFieldPathsForEditorBlock, El as Input, En as getBlockDefinition, Eo as toLocationMapHydrationProps, Er as getShopDisplayForItems, Es as resolveIconPickerPreset, Et as unsafeAsLinkedContentEntryId, Eu as clsx, Fa as buildEventRuntimeFilters, Fc as siblingPath$1, Fd as ImagePlus, Fl as ScrollableDialogContent, Fn as mediaTransforms, Fo as getContainerClass, Fr as deriveCommerceCheckoutState, Fs as ChevronDownIcon, Ft as PaletteProvider, Fu as formatBookingInstant, G as beginAutosaveBatch, Ga as columnOptionSchema, Gc as themeButtonClassName, Gd as EllipsisVertical, Gi as backgroundAppearanceColorTokenNames, Gn as productDetailBlockDefinition, Go as createInteractiveIslandCodec, Gr as faqHeadingFragment, Gs as FileAudioIcon, Gt as createStoreBackend, Gu as publicEventPricingMode, Ha as normalizeCsvString, Hc as generateInteractiveChildInheritanceCSS, Hd as FileArchive, Hi as sectionTransitionFamilyForBoundaryOptionId, Hl as DialogTitle, Hn as useImageResolveContextOptional, Ho as resolveRuntimeEventPricing, Hr as headingFragment, Hs as DownloadIcon, Hu as toScheduledBookingDateTime, Ia as eventListPaginationActionSchema, Id as GripVertical, Il as Dialog, In as layoutTransforms, Io as groupEventsByDate, Ir as parseStoredCommerceCartState, Is as ChevronLeftIcon, It as usePalette, Iu as formatBookingTime, J as enqueueTransaction, Ja as eventLayoutSchema, Jc as mergeStyles, Jd as Copy, Ji as parseBackgroundAppearanceColorToken, Jl as Trigger, Jn as eventListingBlockDefinition, Jo as defineClientOwnedBlockRuntime, Jr as footerBottomTextFragment, Js as InfoIcon, Jt as applyPageDesignEditorAction, Ju as publicEventTicketTypes, K as confirmAutosaveBatch, Ka as eventButtonVariantSchema, Kc as backgroundColorStyle, Kd as Crop, Ki as backgroundAppearanceQuickColorTokenNames, Kl as Content, Kn as newsletterSignupBlockDefinition, Ko as defineInteractiveIslandMetaKeys, Kr as blogFeaturedPostFragment, Ks as FileSpreadsheetIcon, Kt as listContentTypes, Ku as publicEventPricingType, La as eventPageSizeSchema, Ld as File, Ll as DialogClose, Ln as uiTransforms, Lo as resolveEventCta, Lr as productItemKey, Ls as ChevronRightIcon, Lt as recoveryConflictCopy, Lu as formatLocalScheduleDate, Ma as resolveOfferingsPreviewGroups, Mc as getDirectImageUrlForMediaAsset, Md as LoaderCircle, Ml as List, Mn as planSiteOverlayHeaderClearance, Mo as formatEventTeacherLine, Mr as EMPTY_COMMERCE_CART_STATE, Ms as ArrowRightIcon, Mu as addLocalScheduleDays, Na as isSemanticSpacing, Nc as getImageUrl, Nd as Image, Nl as Root2$1, Nn as visibleHeaderClearancePx, No as formatTime$3, Nr as buildPassCartItem, Ns as CalendarIcon$1, Nu as formatBookingDate, Oa as normalizeOfferingsPreviewItemLimit, Oc as formatAspectRatioToken, Oi as designRuntimeRulesForTheme, Ol as TabsContent, On as siteFooterManifest, Oo as formatEventCompactDateRail, Or as buildProductCardDisplay, Os as getSemanticIconComponent, Ou as createEditorRemoveBlockCommand, Pa as resolveSpacing, Pc as getAtPath, Pd as ImageUp, Pl as Trigger$1, Pn as contentTransforms, Po as getCardOrientation, Pr as buildProductCartItem, Ps as CheckIcon$1, Pu as formatBookingDateTime, Q as resolvePreviewSidebarTab, Qa as eventCalendarListLayoutCompatibleDisplayModeValues, Qc as getFieldIntent, Qd as CircleAlert, Ql as CardHeader, Qn as buildEventCalendarListingDisplay, Qo as markEditableSurfaceForwarding, Qr as testimonialsHeadingFragment, Qs as PhoneIcon, Qt as deleteBlock, Qu as parseMediaAssetId, Ra as getEventRuntimeFiltersKey, Rc as generateButtonCss, Rd as FileText, Rl as DialogContent, Rn as formattingTransforms, Ro as resolveEventLinkProps, Rr as reduceCommerceCart, Rs as ChevronUpIcon, Rt as unfinishedBlockCopy, Ru as getBookingLocalDateKey, Sc as setContextResolveImageUrlContext, Sd as Search, Si as retargetCompiledBoundaryRuntimeForContentAdjacency, Sl as Badge, Sn as useUniqueId, So as getTextColorForBackground, Sr as buildCheckoutInteractiveIslandProps, Ss as parseBlockIconValue, St as createHistoryState, Su as Button, Ta as inferLegacyOfferingsPreviewGroupOrder, Tc as attachRenderableMediaAssetFields, Td as Plus, Ti as planPageDesignLayoutLookCompatibility, Tl as PopoverTrigger, Tn as GRADIENT_PRESETS, To as normalizeLocationMapProps, Tr as buildShopInteractiveIslandProps, Ts as isIconPickerPreset, Tt as undoHistory, Tu as cn$1, Ua as normalizeOptionalId, Uc as TokenResolver, Ui as sectionTransitionVariantForBoundaryOptionId, Ul as Collapsible, Un as shopBlockDefinition, Uo as blockBookingPaymentTermsSchema, Ur as cardFragment, Us as ExternalLinkIcon, Ut as FormRenderer, Uu as formatBookingPriceDisplay, Va as normalizeCsvIds, Vc as generateBaseInteractiveCSS, Vd as FileHeadphone, Vi as sectionTransitionFamilies, Vl as DialogHeader, Vn as ImageResolveContextProvider, Vo as getLocalMinuteOfDay, Vr as richTextFragment, Vs as ClockIcon$1, Vt as createManifestFormAdapter, Vu as toBookingTimeZone, Wa as calendarTabViewsSchema, Wc as parseThemeButtonVariantId, Wd as EyeOff, Wi as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, Wl as CollapsibleContent, Wn as productListBlockDefinition, Wo as buildInteractiveIslandProps, Wr as faqAccordionFragment, Ws as FileArchiveIcon, Wt as evaluateVisibility, Wu as publicEventPricingCurrency, X as rejectAutosaveBatch, Xa as previewStageSchema, Xc as textColorStyle, Xd as CircleMinus, Xl as Card, Xn as eventCalendarBlockDefinition, Xr as formCopyFragment, Xs as MapPinIcon$1, Xt as createBlock, Xu as assertNever$5, Y as idleEditorTransactionQueueState, Ya as filterAutoShowSchema, Yc as rgbColorValue, Yd as CirclePlus, Yi as defaultThemeTokens, Yl as createCollapsibleScope, Yn as buildEventListingInteractiveIslandProps, Yo as defineProgressiveBlockRuntime, Yr as formEmbedFragment, Ys as MailIcon, Yt as getPageDesignEditorState, Yu as formatCurrencyAmount, Za as weekStartSchema, Zc as useBackendWatch, Zd as CircleCheck, Zl as CardContent, Zn as buildEventCalendarInteractiveIslandProps, Zo as composeHeaderSectionWrapperClassName, Zr as testimonialsCarouselFragment, Zs as MinusIcon, Zt as createEntrySlotBlock, Zu as expectParsedBrandedId, _a as createTransformRegistry, _c as renderAudio, _i as mergeHeaderNavTypographyPreference, _l as SelectContent, _n as useSensors, _o as normalizeBoxStylesCardVariant, _r as courseRegistrationBlockDefinition, _s as suggestSemanticIconForFeatureCard, _t as useEditorUiStore, _u as createCollection, aa as parseCustomCssRules, ac as unwrapRichTextRoot, ad as unsafeAsPassId, af as Box, ai as PUBLIC_FILE_FIELD_KINDS, al as hasEmptyOption, an as DEFAULT_LAUNCH_READINESS_INPUT, ao as eventSurfaceScopeValues, ar as findEventByOccurrenceId, as as ACCORDION_TRIGGER_FONT_SCALE, at as getRichTextImagePositionFromTarget, au as DropdownMenuSeparator, bc as resolveMediaNodeResponsiveImage, bi as applyCompiledRuntimeFieldsToContent, bl as SelectValue, bn as useCombinedRefs, bo as resolveOnColorForThemeToken, br as cartBlockDefinition, bs as getBlockIconSemanticFallbackId, bt as canRedoHistory, bu as composeEventHandlers, ca as NAV_LINK_PADDING_MAP, cc as coerceInlineTextWithFallback, cd as err$2, cf as Archive, ci as MQ_MD_DOWN, cl as unmapValueFromSelect, cn as DndContext, co as normalizeEventScheduleScope, cr as resolveEventRequiresPayment, cs as ICON_SIZE_PX, ct as EditorProvider, cu as __awaiter, da as FONT_WEIGHT_MAP, dc as parseInlineTextFromUnknown, dd as X, df as __toESM, di as MQ_TABLET_ONLY, dl as Tooltip, dn as closestCenter, do as normalizeEventSurfaceScope, dr as getStepNumber$1, ds as FEATURE_CARD_ICON_TREATMENTS, dt as useUISelector, du as __read, ea as isThemeV2NormalEditorRawStylePath, ec as PlusIcon, ed as unsafeAsAppointmentResourceId, ef as ChevronUp, ei as heroCtaRowFragment, el as isHeaderField, eo as el, er as formBlockDefinition, es as planSiteChromePlacement, et as PreviewInlineTextEditor, fa as INPUT_FONT_SIZE_MAP, fc as ImagePresets, fd as Upload, fi as BACKGROUND_POSITION_PRESET_VALUES, fl as TooltipContent, fn as getClientRect, fo as normalizeEventVenueId, fr as getWizardStepsForContext$1, fs as applyFeatureCardIconSuggestions, ft as EditableBlockProvider, fu as __rest, g as PreviewDesignCoordinatorProvider, ga as generateCssVars, gc as getCurrentResolveImageUrlContext, gd as Ticket, gi as resolveBackgroundColorValue, gl as Select, gn as useSensor, go as generateShadowValue, gr as buildGiftingInteractiveIslandProps, gs as suggestFeatureCardSemanticIcons, gu as useDirection, ha as expandPalette, hc as computeMediaTransformStyle, hd as Trash2, hi as resolveSectionForegroundStyles, hl as Textarea, hn as useDroppable, ho as statusMutedColorDeclaration, hr as giftingBlockDefinition, hs as shouldReserveFeatureCardIconZone, ht as useEntryEditorController, hu as useId$1, i as usePreviewDesignHistoryOrder, ia as parseBlockCustomCssRules, ic as createRichTextDocFromMarkdown, id as unsafeAsMediaAssetId, if as Check, ii as defineFragment, il as useSdkConfig, in as decodePublicProductCategorySelectorQuery, io as eventScheduleScopeValues, ir as toRegistrationEvents, is as ACCORDION_SPACING_MAP, it as RichTextEditorSurface, ja as resolveOfferingsPreviewGroupOrderEntries, jc as asRecord, jl as Content$1, jn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, jo as formatEventPriceDisplay, jr as formatInterval, js as ArrowLeftIcon, jt as createSnapshotFromPageRecord, ju as unsafeAsEditorBlockValues, ka as resolveOfferingsPreviewCoursePath, kc as parseAspectRatioValue, ki as getCuratedSiteStyle, kl as TabsList, kn as siteHeaderManifest, ko as formatEventDateParts, kr as buildProductDetailDisplay, ks as isSemanticIconId, kt as useDebouncedLatestSave, ku as createEditorReorderBlocksCommand, la as NAV_LINK_PADDING_X_MAP, lc as inlineTextToPlainText, ld as ok$3, lf as __commonJSMin, li as MQ_SM_DOWN, ll as FieldFrame, ln as KeyboardCode, lo as normalizeEventStaffMemberId, lr as resolveRegistrationTarget, ls as PUBLIC_DOWNLOAD_MEDIA_TYPES, lt as useEditor, lu as __extends, ma as LABEL_FONT_SIZE_MAP, mc as buildResolveImageUrlContext, mi as boxStylesTransforms, ml as TooltipTrigger, mn as useDraggable, mo as generateCardCss, mr as resolveEventRegistrationScopedEvents, ms as getFeatureCardIconCompletion, mu as __spreadArrays, n as useSiteChromeCustomizeOptional, na as getComponentBorderWidthPx, nc as UploadIcon, nd as unsafeAsCustomerPassId, nf as ChevronLeft, ni as heroCopyFragment, nl as useBlockContext, nn as reorderBlocks, no as bindingSchema, nr as eventRegistrationBlockDefinition, ns as assertNever$6, nt as useRichTextEditor, nu as DropdownMenuContent, oa as NAV_LINK_BORDER_RADIUS_MAP, oc as isObjectRecord, od as unsafeAsPositiveByteCount$1, of as ArrowUp, oi as siteOptionSources, ol as mapCurrentValueForSelect, on as deriveLaunchReadiness, oo as normalizeEventBlockKind, or as findPreSelectedEvent, os as ACCORDION_TRIGGER_LETTER_SPACING, ot as insertOrReplaceRichTextImage, ou as DropdownMenuTrigger, pa as INPUT_SPACING_MAP, pc as MediaPlaceholder, pi as getAnchorClasses, pl as TooltipProvider, pn as useDndContext, po as publicEventSchema, pr as normalizeEventRegistrationPageSurfaceSubject, ps as createFeatureCardIconKey, pt as EntryControllerProvider, pu as __spreadArray, q as deriveTransactionCapabilities, qa as eventCalendarDefaultViewSchema, qc as borderColorStyle, qd as CreditCard, qi as foregroundTokenForBackgroundAppearanceColorToken, ql as Root, qn as buildNewsletterFormInteractiveIslandProps, qo as createZodCodec, qr as singleButtonFragment, qs as FileTextIcon, qt as toRoutableLinkPayload, qu as publicEventScalarPrice, r as PreviewDesignHistoryOrderProvider, ra as getComponentShadowVar, rc as XIcon, rd as unsafeAsFormId, rf as ChevronDown, ri as bodyCopyFragment, rl as SdkConfigProvider, rn as reorderEntrySlotBlocks, ro as eventBlockKindValues, rr as buildEventRegistrationInteractiveIslandProps, rs as ACCORDION_OPEN_ACCENT_THICKNESS, rt as EMPTY_DOC, ru as DropdownMenuItem, sa as NAV_LINK_LETTER_SPACING_MAP, sc as isRecord$19, sd as unsafeAsPositiveSeconds, sf as ArrowDown, si as MQ_LG_UP, sl as mapOptionValueForSelect, sn as AMBIENT_BACKGROUND_ROLES$1, so as normalizeEventCategoryIdsCsv, sr as resolveDiscountContext, ss as ICON_CONFIG, st as InlineTextEditor, su as __assign, t as SiteChromeCustomizeProvider, ta as pageDesignEditorBackgroundOverrideOwner, tc as ShoppingCartIcon, td as unsafeAsAppointmentServiceId, tf as ChevronRight, ti as ctaRowFragment, tl as isNonEmptyValue, tn as mutateBlockContent, to as when, tr as buildFormInteractiveIslandProps, ts as asDesignBlockId, tt as PreviewTextEditor, tu as DropdownMenu, ua as NAV_LINK_TEXT_SIZE_MAP, uc as isInlineTextEmpty, ud as lucide_react_exports, uf as __exportAll, ui as MQ_SM_UP, ul as useField, un as PointerSensor, uo as normalizeEventSurfacePresetsCsv, ur as WIZARD_STEPS$1, us as mediaSchema, uu as __generator, v as PreviewThemeOverlayProvider, va as runTransforms, vc as renderVideo, vd as Star, vi as formatSiteChromeBackgroundTokenLabel, vl as SelectItem, vn as CSS, vo as normalizeCardVariantRole, vr as buildCourseRegistrationInteractiveIslandProps, vs as toFeatureCardIconSuggestionInputs, vt as useEditorUiStoreInstance, vu as useControllableState, wa as buildOfferingsPreviewRenderStates, wc as resolveMediaSlotContract, wi as normalEditorCuratedPromotedFieldPaths, wl as PopoverContent, wn as gradientToCss, wo as buildGoogleMapsDirectionsUrl, wr as buildProductListInteractiveIslandProps, ws as parseSiteIconStyleGuideVersionId, wt as redoHistory, wu as useComposedRefs, xc as resolveMediaStorageUrl, xd as Settings, xi as compileEditorModelRuntime, xl as Label, xn as useIsomorphicLayoutEffect, xo as resolveTokenOrCssColorValue, xr as buildCartInteractiveIslandProps, xs as getGeneratedBlockIconStyleState, xt as canUndoHistory, xu as Primitive, y as usePreviewThemeOverlay, ya as ctaButton, yc as resolveImageUrlWithContext, yd as Sparkles, yi as PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE, yl as SelectTrigger, yn as isKeyboardEvent, yo as isCssColorLiteral, yr as checkoutBlockDefinition, ys as buildGeneratedBlockIconRenderAssetLookupFromUnknown, yt as useOptionalEditorUiStoreInstance, yu as createContextScope, za as resolveEventCalendarListPageSize, zc as generateEffectsCSS, zd as FileSpreadsheet, zi as boundaryRuntimeMetricsForTransition, zl as DialogDescription, zn as createManifestValidator, zo as getEventAvailability, zr as augmentManifest, zs as CircleMinusIcon, zt as validateBlockManifestIssues, zu as parseBookingLocalDate } from "./SiteChromeCustomizeContext-CO1sTK_W.mjs";
3
3
  import { i as useOptionalPreviewLayout, t as PreviewQueryProvider } from "./PreviewQueryProvider-ZF6TXq5Q.mjs";
4
4
  import { _ as API_ENDPOINTS, a as usePreviewToken, c as createBearerAPIClient, d as unwrapResponse, g as resolveSurfaceDocumentAttributes, h as SURFACE_IDS, i as usePreviewAuthFetch, l as ApiEnvelopeError, m as SURFACE_DOCUMENT_DATA_ATTRIBUTE, n as markPreviewAuthExpired, o as isPreviewRuntimeSessionEditable, r as usePreviewAuth, s as ApiRequestError, t as initPreviewAuth, u as extractApiEnvelopeErrorDetails } from "./previewAuthStore-ByPPZqmp.mjs";
5
5
  import * as React$1 from "react";
@@ -1280,7 +1280,7 @@ var BlockApiError = class extends Error {
1280
1280
  this.name = "BlockApiError";
1281
1281
  }
1282
1282
  };
1283
- function isRecord$17(value) {
1283
+ function isRecord$18(value) {
1284
1284
  return typeof value === "object" && value !== null;
1285
1285
  }
1286
1286
  function isJsonResponseContentType(contentType) {
@@ -1304,8 +1304,8 @@ async function parseJsonBody(response) {
1304
1304
  }
1305
1305
  }
1306
1306
  function getBlockApiErrorDetails(data) {
1307
- if (!isRecord$17(data)) return {};
1308
- const nestedError = isRecord$17(data.error) ? data.error : void 0;
1307
+ if (!isRecord$18(data)) return {};
1308
+ const nestedError = isRecord$18(data.error) ? data.error : void 0;
1309
1309
  return {
1310
1310
  message: typeof nestedError?.message === "string" ? nestedError.message : typeof data.message === "string" ? data.message : void 0,
1311
1311
  code: typeof nestedError?.code === "string" ? nestedError.code : typeof data.code === "string" ? data.code : void 0
@@ -2517,7 +2517,7 @@ function Text$1({ as: Comp = "span", children, className = "", path, maxLength:
2517
2517
  function coerceRichTextDoc(value) {
2518
2518
  const raw = unwrapRichTextRoot(value);
2519
2519
  if (typeof raw === "string") return createRichTextDocFromMarkdown(raw);
2520
- if (isRecord$18(raw) && typeof raw.type === "string") return raw;
2520
+ if (isRecord$19(raw) && typeof raw.type === "string") return raw;
2521
2521
  return null;
2522
2522
  }
2523
2523
  //#endregion
@@ -3634,12 +3634,12 @@ function resolveBookingSiteId(siteId, form) {
3634
3634
  return siteId || form?.siteId || "";
3635
3635
  }
3636
3636
  function normalizeBookingFormConfig(form) {
3637
- if (!isRecord$16(form)) return null;
3637
+ if (!isRecord$17(form)) return null;
3638
3638
  const id = readNonEmptyString(form.id);
3639
3639
  const name = readNonEmptyString(form.name);
3640
3640
  if (!id || !name) return null;
3641
- const schemaSource = isRecord$16(form.schema) ? form.schema : isRecord$16(form.schemaJson) ? form.schemaJson : null;
3642
- const settingsSource = isRecord$16(form.settings) ? form.settings : isRecord$16(form.settingsJson) ? form.settingsJson : null;
3641
+ const schemaSource = isRecord$17(form.schema) ? form.schema : isRecord$17(form.schemaJson) ? form.schemaJson : null;
3642
+ const settingsSource = isRecord$17(form.settings) ? form.settings : isRecord$17(form.settingsJson) ? form.settingsJson : null;
3643
3643
  return {
3644
3644
  id,
3645
3645
  name,
@@ -3659,8 +3659,8 @@ function normalizeBookingServices(services) {
3659
3659
  };
3660
3660
  if (!services) return [];
3661
3661
  if (Array.isArray(services)) return services.filter(isBookingFormService).map(normalizeService);
3662
- if (isRecord$16(services) && "services" in services) return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
3663
- return isRecord$16(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
3662
+ if (isRecord$17(services) && "services" in services) return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
3663
+ return isRecord$17(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
3664
3664
  }
3665
3665
  function normalizeBookingSchema(value) {
3666
3666
  if (!value) return void 0;
@@ -3671,7 +3671,7 @@ function normalizeBookingSchema(value) {
3671
3671
  };
3672
3672
  }
3673
3673
  function readBookingFormField(value) {
3674
- if (!isRecord$16(value)) return null;
3674
+ if (!isRecord$17(value)) return null;
3675
3675
  const id = readNonEmptyString(value.id);
3676
3676
  const label = readNonEmptyString(value.label);
3677
3677
  const type = readBookingFieldType(value.type);
@@ -3715,7 +3715,7 @@ function readBookingFieldOptions(value) {
3715
3715
  return options.length > 0 ? options : void 0;
3716
3716
  }
3717
3717
  function readBookingFieldOption(value) {
3718
- if (!isRecord$16(value)) return null;
3718
+ if (!isRecord$17(value)) return null;
3719
3719
  const optionValue = readNonEmptyString(value.value);
3720
3720
  const label = readNonEmptyString(value.label);
3721
3721
  return optionValue && label ? {
@@ -3735,7 +3735,7 @@ function normalizeBookingSettings(value) {
3735
3735
  };
3736
3736
  }
3737
3737
  function isBookingFormService(value) {
3738
- return isRecord$16(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
3738
+ return isRecord$17(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
3739
3739
  }
3740
3740
  function collectBookingCustomFields(data) {
3741
3741
  const customFields = {};
@@ -3785,7 +3785,7 @@ function readStringArray(value) {
3785
3785
  const strings = value.filter((item) => typeof item === "string");
3786
3786
  return strings.length > 0 ? strings : void 0;
3787
3787
  }
3788
- function isRecord$16(value) {
3788
+ function isRecord$17(value) {
3789
3789
  return typeof value === "object" && value !== null;
3790
3790
  }
3791
3791
  function getBookingServicePaymentSelectionMode(service) {
@@ -19249,7 +19249,7 @@ const LEAFLET_JS_INTEGRITY = "sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo
19249
19249
  let leafletLoaded = false;
19250
19250
  let leafletLoadPromise = null;
19251
19251
  function isLeafletApi(value) {
19252
- if (!isRecord$18(value)) return false;
19252
+ if (!isRecord$19(value)) return false;
19253
19253
  return typeof value.map === "function" && typeof value.tileLayer === "function" && typeof value.marker === "function";
19254
19254
  }
19255
19255
  function loadLeaflet() {
@@ -20571,7 +20571,7 @@ Autoplay.globalOptions = void 0;
20571
20571
  function isObject$2(subject) {
20572
20572
  return Object.prototype.toString.call(subject) === "[object Object]";
20573
20573
  }
20574
- function isRecord$15(subject) {
20574
+ function isRecord$16(subject) {
20575
20575
  return isObject$2(subject) || Array.isArray(subject);
20576
20576
  }
20577
20577
  function canUseDOM() {
@@ -20586,7 +20586,7 @@ function areOptionsEqual(optionsA, optionsB) {
20586
20586
  const valueA = optionsA[key];
20587
20587
  const valueB = optionsB[key];
20588
20588
  if (typeof valueA === "function") return `${valueA}` === `${valueB}`;
20589
- if (!isRecord$15(valueA) || !isRecord$15(valueB)) return valueA === valueB;
20589
+ if (!isRecord$16(valueA) || !isRecord$16(valueB)) return valueA === valueB;
20590
20590
  return areOptionsEqual(valueA, valueB);
20591
20591
  });
20592
20592
  }
@@ -27129,7 +27129,7 @@ function WeeklySlotAvailabilityClient({ serviceId, resourceId, horizonWeeks, tim
27129
27129
  }
27130
27130
  //#endregion
27131
27131
  //#region ../blocks/src/system/runtime/components/registry.client.tsx
27132
- function isRecord$14(value) {
27132
+ function isRecord$15(value) {
27133
27133
  return typeof value === "object" && value !== null;
27134
27134
  }
27135
27135
  function buildRenderFromLooseProps(runtime, mode, props) {
@@ -27148,12 +27148,12 @@ function withRuntimeBackedEnvelope(source, runtime, render) {
27148
27148
  function normalizeLegacyInteractiveRenderProps(runtime, mode, props) {
27149
27149
  const source = props;
27150
27150
  const render = props["render"];
27151
- if (!isRecord$14(render)) return withRuntimeBackedEnvelope(source, runtime, buildRenderFromLooseProps(runtime, mode, props));
27152
- if (isRecord$14(render["hydration"])) return withRuntimeBackedEnvelope(source, runtime, {
27151
+ if (!isRecord$15(render)) return withRuntimeBackedEnvelope(source, runtime, buildRenderFromLooseProps(runtime, mode, props));
27152
+ if (isRecord$15(render["hydration"])) return withRuntimeBackedEnvelope(source, runtime, {
27153
27153
  ...render,
27154
27154
  mode
27155
27155
  });
27156
- if (!isRecord$14(render["display"])) return withRuntimeBackedEnvelope(source, runtime, buildRenderFromLooseProps(runtime, mode, props));
27156
+ if (!isRecord$15(render["display"])) return withRuntimeBackedEnvelope(source, runtime, buildRenderFromLooseProps(runtime, mode, props));
27157
27157
  const { display, mode: _legacyMode, ...legacyHydration } = render;
27158
27158
  return withRuntimeBackedEnvelope(source, runtime, {
27159
27159
  display,
@@ -27699,7 +27699,7 @@ const defaultTransforms = createTransformRegistry([
27699
27699
  //#region ../blocks/src/system/data/linkedContentEntries.ts
27700
27700
  const LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
27701
27701
  function coerceLinkedContentEntriesPayload(payload) {
27702
- if (!isRecord$13(payload)) return payload;
27702
+ if (!isRecord$14(payload)) return payload;
27703
27703
  const response = payload;
27704
27704
  if (!Array.isArray(response.entries)) return payload;
27705
27705
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -27707,16 +27707,16 @@ function coerceLinkedContentEntriesPayload(payload) {
27707
27707
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
27708
27708
  }
27709
27709
  function getLinkedContentEntryMeta(value) {
27710
- if (!isRecord$13(value)) return null;
27710
+ if (!isRecord$14(value)) return null;
27711
27711
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
27712
27712
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
27713
27713
  }
27714
27714
  function buildLinkedContentEditTarget(input) {
27715
27715
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
27716
- if (!isRecord$13(entry)) return null;
27716
+ if (!isRecord$14(entry)) return null;
27717
27717
  const meta = getLinkedContentEntryMeta(entry);
27718
27718
  if (!meta || meta.support.kind !== "supported") return null;
27719
- const content = isRecord$13(entry.content) ? entry.content : {};
27719
+ const content = isRecord$14(entry.content) ? entry.content : {};
27720
27720
  return {
27721
27721
  kind: "linked-content-entry",
27722
27722
  entryId: meta.entryId,
@@ -27780,12 +27780,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
27780
27780
  };
27781
27781
  }
27782
27782
  function enrichLinkedContentEntry(entry, contentType) {
27783
- if (!isRecord$13(entry)) return entry;
27783
+ if (!isRecord$14(entry)) return entry;
27784
27784
  const entryId = typeof entry.id === "string" ? entry.id : null;
27785
27785
  if (!entryId) return entry;
27786
27786
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
27787
27787
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
27788
- const content = isRecord$13(entry.content) ? entry.content : {};
27788
+ const content = isRecord$14(entry.content) ? entry.content : {};
27789
27789
  const meta = {
27790
27790
  kind: "linked-content-entry",
27791
27791
  entryId,
@@ -27881,7 +27881,7 @@ function capitalize(value) {
27881
27881
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
27882
27882
  }
27883
27883
  function parsePublicContentTypeMeta(value) {
27884
- if (!isRecord$13(value)) return null;
27884
+ if (!isRecord$14(value)) return null;
27885
27885
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
27886
27886
  return {
27887
27887
  key: value.key,
@@ -27891,7 +27891,7 @@ function parsePublicContentTypeMeta(value) {
27891
27891
  };
27892
27892
  }
27893
27893
  function parsePublicContentTypeLinkedEntryEditing(value) {
27894
- if (!isRecord$13(value) || typeof value.kind !== "string") return null;
27894
+ if (!isRecord$14(value) || typeof value.kind !== "string") return null;
27895
27895
  switch (value.kind) {
27896
27896
  case "generic": return { kind: "generic" };
27897
27897
  case "unsupported-domain-backed": return {
@@ -27902,7 +27902,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
27902
27902
  }
27903
27903
  }
27904
27904
  function parsePublicContentTypeFieldMeta(value) {
27905
- if (!isRecord$13(value)) return [];
27905
+ if (!isRecord$14(value)) return [];
27906
27906
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
27907
27907
  return [{
27908
27908
  id: value.id,
@@ -27917,14 +27917,14 @@ function parseStringArray(value) {
27917
27917
  return value.filter((item) => typeof item === "string");
27918
27918
  }
27919
27919
  function isLinkedContentEntryMeta(value) {
27920
- if (!isRecord$13(value)) return false;
27920
+ if (!isRecord$14(value)) return false;
27921
27921
  if (value.kind !== "linked-content-entry") return false;
27922
27922
  if (typeof value.entryId !== "string") return false;
27923
27923
  if (typeof value.contentTypeKey !== "string") return false;
27924
27924
  if (typeof value.contentTypeLabel !== "string") return false;
27925
27925
  if (typeof value.title !== "string") return false;
27926
27926
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
27927
- if (!isRecord$13(value.contentType)) return false;
27927
+ if (!isRecord$14(value.contentType)) return false;
27928
27928
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
27929
27929
  return isLinkedContentEditSupport(value.support);
27930
27930
  }
@@ -27932,7 +27932,7 @@ function isLinkedEntryFieldSourceArray(value) {
27932
27932
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
27933
27933
  }
27934
27934
  function isLinkedEntryFieldSource(value) {
27935
- if (!isRecord$13(value)) return false;
27935
+ if (!isRecord$14(value)) return false;
27936
27936
  if (typeof value.displayPath !== "string") return false;
27937
27937
  switch (value.kind) {
27938
27938
  case "content-field": return typeof value.fieldPath === "string" && (value.fieldType === "text" || value.fieldType === "richText");
@@ -27953,7 +27953,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
27953
27953
  }
27954
27954
  }
27955
27955
  function isLinkedContentEditSupport(value) {
27956
- if (!isRecord$13(value) || typeof value.kind !== "string") return false;
27956
+ if (!isRecord$14(value) || typeof value.kind !== "string") return false;
27957
27957
  switch (value.kind) {
27958
27958
  case "supported": return true;
27959
27959
  case "unsupported-domain-backed":
@@ -27962,7 +27962,7 @@ function isLinkedContentEditSupport(value) {
27962
27962
  default: return false;
27963
27963
  }
27964
27964
  }
27965
- function isRecord$13(value) {
27965
+ function isRecord$14(value) {
27966
27966
  return typeof value === "object" && value !== null && !Array.isArray(value);
27967
27967
  }
27968
27968
  //#endregion
@@ -28016,14 +28016,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
28016
28016
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
28017
28017
  }
28018
28018
  function readVariant(blockContent) {
28019
- if (!isRecord$12(blockContent)) return void 0;
28019
+ if (!isRecord$13(blockContent)) return void 0;
28020
28020
  const variant = blockContent.variant;
28021
28021
  return typeof variant === "string" ? variant : void 0;
28022
28022
  }
28023
28023
  function isFaqDecoratedVariant(variant) {
28024
28024
  return variant === "default" || variant === "question-columns";
28025
28025
  }
28026
- function isRecord$12(value) {
28026
+ function isRecord$13(value) {
28027
28027
  return typeof value === "object" && value !== null && !Array.isArray(value);
28028
28028
  }
28029
28029
  function buildHeadingDecorationWrapperClassName(className) {
@@ -30286,15 +30286,19 @@ function generateLogoTextBehaviorStyles(logoText, themeId) {
30286
30286
  * legacy navStyle, navWeight, navColor, and navEffects settings.
30287
30287
  */
30288
30288
  function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment, navTextSize) {
30289
+ const navPreferences = {
30290
+ typography: header.navTypography ?? "inherit",
30291
+ fontSize: header.navTextSize ?? "inherit"
30292
+ };
30289
30293
  if (header.navLinkStyle) return generateNavLinkCSS({
30290
30294
  themeId,
30291
30295
  tokens,
30292
30296
  theme,
30293
- style: contrastTreatment || navTextSize ? {
30297
+ style: mergeHeaderNavTypographyPreference(contrastTreatment || navTextSize ? {
30294
30298
  ...header.navLinkStyle,
30295
30299
  ...contrastTreatment ? { contrastTreatment } : {},
30296
30300
  ...navTextSize ? { textSize: navTextSize } : {}
30297
- } : header.navLinkStyle,
30301
+ } : header.navLinkStyle, navPreferences),
30298
30302
  className: "header-nav-link"
30299
30303
  });
30300
30304
  const navStyle = header.navStyle ?? "minimal";
@@ -30366,7 +30370,7 @@ function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment
30366
30370
  themeId,
30367
30371
  tokens,
30368
30372
  theme,
30369
- style: mergedStyle,
30373
+ style: mergeHeaderNavTypographyPreference(mergedStyle, navPreferences),
30370
30374
  className: "header-nav-link"
30371
30375
  });
30372
30376
  }
@@ -30757,6 +30761,9 @@ const boldWaveTransitionMask = svgDataUrl("<svg viewBox='0 0 1440 72' xmlns='htt
30757
30761
  const driftWaveTransitionMask = svgDataUrl("<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V39C115 31 205 54 340 48C505 41 610 16 760 33C920 51 1015 64 1160 44C1280 27 1375 35 1440 50V72H0Z' fill='white'/></svg>");
30758
30762
  function generateSiteStyleTransitionCss(themeId) {
30759
30763
  const selector = `:where([data-theme-scope="${themeId}"])`;
30764
+ const compactBoundaryHeight = requiredBoundaryHeightCss("wave-edge-gentle");
30765
+ const mediumBoundaryHeight = requiredBoundaryHeightCss("wave-edge");
30766
+ const largeBoundaryHeight = requiredBoundaryHeightCss("wave-edge-bold");
30760
30767
  return `${selector} [data-style-group^='site-style-transition-'] {
30761
30768
  position: relative;
30762
30769
  z-index: 2;
@@ -30764,23 +30771,48 @@ function generateSiteStyleTransitionCss(themeId) {
30764
30771
  --site-style-transition-to: rgb(var(--tb-background));
30765
30772
  }
30766
30773
 
30767
- ${selector} [data-block-transition][data-style-group^='site-style-transition-'] {
30774
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-'] {
30768
30775
  position: relative;
30769
30776
  z-index: 3;
30770
30777
  height: 0;
30771
30778
  pointer-events: none;
30779
+ --site-style-boundary-height: ${mediumBoundaryHeight};
30780
+ }
30781
+
30782
+ ${selector} [data-block][data-site-style-boundary-before] > :where([data-slot='section']) {
30783
+ padding-top: calc(var(--rb-section-pad-y, 0rem) + var(--site-style-boundary-before-reserve, 0rem));
30784
+ }
30785
+
30786
+ ${selector} [data-block][data-site-style-boundary-after] > :where([data-slot='section']) {
30787
+ padding-bottom: calc(var(--rb-section-pad-y, 0rem) + var(--site-style-boundary-after-reserve, 0rem));
30788
+ }
30789
+
30790
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-']::before,
30791
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-angle-edge-']::before,
30792
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-soft-fade']::before {
30793
+ content: '';
30794
+ position: absolute;
30795
+ left: 0;
30796
+ right: 0;
30797
+ top: 0;
30798
+ transform: translateY(-50%);
30799
+ z-index: 0;
30800
+ height: var(--site-style-boundary-height);
30801
+ background: var(--site-style-transition-from);
30802
+ pointer-events: none;
30772
30803
  }
30773
30804
 
30774
- ${selector} [data-block-transition][data-style-group^='site-style-transition-wave-edge-']::after,
30775
- ${selector} [data-block-transition][data-style-group^='site-style-transition-angle-edge-']::after,
30776
- ${selector} [data-block-transition][data-style-group^='site-style-transition-soft-fade']::after {
30805
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-']::after,
30806
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-angle-edge-']::after,
30807
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-soft-fade']::after {
30777
30808
  content: '';
30778
30809
  position: absolute;
30779
30810
  left: 0;
30780
30811
  right: 0;
30781
- bottom: -2px;
30812
+ top: 0;
30813
+ transform: translateY(-50%);
30782
30814
  z-index: 1;
30783
- height: calc(6rem + 2px);
30815
+ height: var(--site-style-boundary-height);
30784
30816
  pointer-events: none;
30785
30817
  }
30786
30818
 
@@ -30818,7 +30850,7 @@ ${selector} [data-style-group$='-to-brand-depth-band'] {
30818
30850
  --site-style-transition-to: rgb(var(--tb-primary-800));
30819
30851
  }
30820
30852
 
30821
- ${selector} [data-block-transition][data-style-group^='site-style-transition-soft-fade']::after {
30853
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-soft-fade']::after {
30822
30854
  /* Fallback for browsers without color-mix(). */
30823
30855
  background: linear-gradient(
30824
30856
  to bottom,
@@ -30834,30 +30866,37 @@ ${selector} [data-block-transition][data-style-group^='site-style-transition-sof
30834
30866
  );
30835
30867
  }
30836
30868
 
30837
- ${selector} [data-block-transition][data-style-group^='site-style-transition-soft-fade-long-']::after {
30838
- height: 10rem;
30869
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-soft-fade-long-'] {
30870
+ --site-style-boundary-height: ${requiredBoundaryHeightCss("soft-fade-long")};
30839
30871
  }
30840
30872
 
30841
- ${selector} [data-block-transition][data-style-group^='site-style-transition-soft-fade-expansive-']::after {
30842
- height: 14rem;
30873
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-soft-fade-expansive-'] {
30874
+ --site-style-boundary-height: ${requiredBoundaryHeightCss("soft-fade-expansive")};
30843
30875
  }
30844
30876
 
30845
- ${selector} [data-block-transition][data-style-group^='site-style-transition-angle-edge-']::after {
30877
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-angle-edge-']::after {
30878
+ height: calc(var(--site-style-boundary-height) + 2px);
30846
30879
  background: var(--site-style-transition-to);
30847
30880
  clip-path: polygon(0 42%, 100% 8%, 100% 100%, 0 100%);
30848
30881
  }
30849
30882
 
30850
- ${selector} [data-block-transition][data-style-group^='site-style-transition-angle-edge-subtle-']::after {
30851
- height: calc(4.5rem + 2px);
30883
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-angle-edge-subtle-'] {
30884
+ --site-style-boundary-height: ${compactBoundaryHeight};
30885
+ }
30886
+
30887
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-angle-edge-subtle-']::after {
30852
30888
  clip-path: polygon(0 34%, 100% 18%, 100% 100%, 0 100%);
30853
30889
  }
30854
30890
 
30855
- ${selector} [data-block-transition][data-style-group^='site-style-transition-angle-edge-steep-']::after {
30856
- height: calc(7rem + 2px);
30891
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-angle-edge-steep-'] {
30892
+ --site-style-boundary-height: ${largeBoundaryHeight};
30893
+ }
30894
+
30895
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-angle-edge-steep-']::after {
30857
30896
  clip-path: polygon(0 54%, 100% 0%, 100% 100%, 0 100%);
30858
30897
  }
30859
30898
 
30860
- ${selector} [data-block-transition][data-style-group^='site-style-transition-wave-edge-']::after {
30899
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-']::after {
30861
30900
  background: var(--site-style-transition-to);
30862
30901
  mask-image: url("${classicWaveTransitionMask}");
30863
30902
  mask-repeat: no-repeat;
@@ -30867,28 +30906,39 @@ ${selector} [data-block-transition][data-style-group^='site-style-transition-wav
30867
30906
  -webkit-mask-size: 100% 100%;
30868
30907
  }
30869
30908
 
30870
- ${selector} [data-block-transition][data-style-group^='site-style-transition-wave-edge-balanced-']::after {
30909
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-balanced-']::after {
30871
30910
  mask-image: url("${balancedWaveTransitionMask}");
30872
30911
  -webkit-mask-image: url("${balancedWaveTransitionMask}");
30873
30912
  }
30874
30913
 
30875
- ${selector} [data-block-transition][data-style-group^='site-style-transition-wave-edge-gentle-']::after {
30876
- height: calc(4.5rem + 2px);
30914
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-gentle-'] {
30915
+ --site-style-boundary-height: ${compactBoundaryHeight};
30916
+ }
30917
+
30918
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-gentle-']::after {
30877
30919
  mask-image: url("${gentleWaveTransitionMask}");
30878
30920
  -webkit-mask-image: url("${gentleWaveTransitionMask}");
30879
30921
  }
30880
30922
 
30881
- ${selector} [data-block-transition][data-style-group^='site-style-transition-wave-edge-bold-']::after {
30882
- height: calc(7rem + 2px);
30923
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-bold-'] {
30924
+ --site-style-boundary-height: ${largeBoundaryHeight};
30925
+ }
30926
+
30927
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-bold-']::after {
30883
30928
  mask-image: url("${boldWaveTransitionMask}");
30884
30929
  -webkit-mask-image: url("${boldWaveTransitionMask}");
30885
30930
  }
30886
30931
 
30887
- ${selector} [data-block-transition][data-style-group^='site-style-transition-wave-edge-drift-']::after {
30932
+ ${selector} [data-block-boundary][data-style-group^='site-style-transition-wave-edge-drift-']::after {
30888
30933
  mask-image: url("${driftWaveTransitionMask}");
30889
30934
  -webkit-mask-image: url("${driftWaveTransitionMask}");
30890
30935
  }`;
30891
30936
  }
30937
+ function requiredBoundaryHeightCss(transition) {
30938
+ const metrics = boundaryRuntimeMetricsForTransition(transition);
30939
+ if (!metrics) throw new Error(`Missing boundary runtime metrics for ${transition}`);
30940
+ return metrics.heightCss;
30941
+ }
30892
30942
  function svgDataUrl(svg) {
30893
30943
  return `data:image/svg+xml,${encodeURIComponent(svg)}`;
30894
30944
  }
@@ -32822,7 +32872,7 @@ function hydrateValue(value, context) {
32822
32872
  const resolvedItems = value.map((item) => hydrateValue(item, context));
32823
32873
  return resolvedItems.every((item, index) => item === value[index]) ? value : resolvedItems;
32824
32874
  }
32825
- if (isRecord$18(value)) {
32875
+ if (isRecord$19(value)) {
32826
32876
  if (isInternalLink(value)) return hydrateInternalLink(value, context.routes);
32827
32877
  if (isPageLink(value)) return hydratePageLink(value, context);
32828
32878
  if (isEntryLink(value)) return hydrateEntryLink(value, context);
@@ -33024,13 +33074,15 @@ function mergeBlockDescriptorsWithRegistry(systemBlocks, registry, onConflict) {
33024
33074
  }
33025
33075
  //#endregion
33026
33076
  //#region ../blocks/src/PageRenderer.tsx
33027
- function PageRenderer({ theme, page, usePlaceholders = false, dataContext, wrapBlock, registry, themeTokens: providedThemeTokens, routeMap, blockOverrides, sdkConfig, customBlocks, previewAuthoring }) {
33077
+ function PageRenderer({ theme, page, runtimeBoundaries, usePlaceholders = false, dataContext, wrapBlock, wrapBoundary, registry, themeTokens: providedThemeTokens, routeMap, blockOverrides, sdkConfig, customBlocks, previewAuthoring }) {
33028
33078
  const imageResolveContext = React$1.useMemo(() => resolvePageRendererImageResolveContext(dataContext), [
33029
33079
  dataContext?.imageResolveContext,
33030
33080
  dataContext?.mediaAssets,
33031
33081
  dataContext?.siteId,
33032
33082
  dataContext?.supabaseUrl
33033
33083
  ]);
33084
+ const boundaryByAdjacentBlockIds = React$1.useMemo(() => boundaryMapForAdjacentBlockIds(runtimeBoundaries ?? []), [runtimeBoundaries]);
33085
+ const usesRuntimeBoundaries = runtimeBoundaries !== void 0;
33034
33086
  if (!page || page.blocks.length === 0) return /* @__PURE__ */ jsx("div", {
33035
33087
  className: "rb-p-6 rb-caption",
33036
33088
  style: textColorStyle("mutedText"),
@@ -33042,6 +33094,17 @@ function PageRenderer({ theme, page, usePlaceholders = false, dataContext, wrapB
33042
33094
  return /* @__PURE__ */ jsx("div", { children: page.blocks.map((block, index) => {
33043
33095
  const blockPosition = pageBlockPosition(index, page.blocks.length);
33044
33096
  const blockKey = block.id ?? `${block.kind}-${index}`;
33097
+ const previousBlock = page.blocks[index - 1] ?? null;
33098
+ const nextBlock = page.blocks[index + 1] ?? null;
33099
+ const boundaryBefore = boundaryBetweenBlocks(previousBlock, block, boundaryByAdjacentBlockIds);
33100
+ const boundaryAfter = boundaryBetweenBlocks(block, nextBlock, boundaryByAdjacentBlockIds);
33101
+ const boundaryElement = renderBoundaryAfterBlock({
33102
+ block,
33103
+ nextBlock,
33104
+ blockKey,
33105
+ boundaryByAdjacentBlockIds,
33106
+ wrapBoundary
33107
+ });
33045
33108
  const cleanKind = block.kind.replace(/^block\./, "");
33046
33109
  const definition = getBlockDefinition(block.kind);
33047
33110
  const managesOwnWrapper = definition?.manifest.behaviours?.managesOwnWrapper;
@@ -33064,11 +33127,18 @@ function PageRenderer({ theme, page, usePlaceholders = false, dataContext, wrapB
33064
33127
  imageResolveContext,
33065
33128
  previewAuthoring
33066
33129
  };
33067
- if (!shouldUseWrapper) return /* @__PURE__ */ jsx(MemoBlockSection, { ...blockSectionProps }, blockKey);
33130
+ if (!shouldUseWrapper) {
33131
+ const rendered = /* @__PURE__ */ jsx(MemoBlockSection, { ...blockSectionProps }, `${blockKey}:block`);
33132
+ return boundaryElement ? /* @__PURE__ */ jsxs(React$1.Fragment, { children: [rendered, boundaryElement] }, blockKey) : rendered;
33133
+ }
33068
33134
  const wrapperClassName = [`block-${cleanKind}`, wrapBlock ? "group relative" : null].filter(Boolean).join(" ");
33069
33135
  const styleGroup = typeof renderableContent.styleGroup === "string" ? renderableContent.styleGroup : void 0;
33070
33136
  const blockLook = typeof renderableContent.blockLook === "string" ? renderableContent.blockLook : void 0;
33071
33137
  const transitionStyle = transitionCssVarsStyle(renderableContent);
33138
+ const blockStyle = mergeStyleObjects(transitionStyle, boundaryReserveCssVarsStyle({
33139
+ before: boundaryBefore,
33140
+ after: boundaryAfter
33141
+ }));
33072
33142
  const blockElement = /* @__PURE__ */ jsx("div", {
33073
33143
  className: wrapperClassName,
33074
33144
  "data-block": cleanKind,
@@ -33078,11 +33148,14 @@ function PageRenderer({ theme, page, usePlaceholders = false, dataContext, wrapB
33078
33148
  "data-block-variant": variantKey ?? void 0,
33079
33149
  "data-block-look": blockLook,
33080
33150
  "data-page-block-position": blockPosition,
33151
+ "data-site-style-boundary-before": boundaryBefore?.metrics.size,
33152
+ "data-site-style-boundary-after": boundaryAfter?.metrics.size,
33081
33153
  "data-style-group": styleGroup,
33082
- style: transitionStyle,
33154
+ style: blockStyle,
33083
33155
  children: /* @__PURE__ */ jsx(MemoBlockSection, { ...blockSectionProps })
33084
33156
  }, blockKey);
33085
- if (!isSiteStyleTransitionStyleGroup(styleGroup)) return blockElement;
33157
+ if (boundaryElement) return /* @__PURE__ */ jsxs(React$1.Fragment, { children: [blockElement, boundaryElement] }, blockKey);
33158
+ if (usesRuntimeBoundaries || !isSiteStyleTransitionStyleGroup(styleGroup)) return blockElement;
33086
33159
  return /* @__PURE__ */ jsxs(React$1.Fragment, { children: [blockElement, /* @__PURE__ */ jsx("div", {
33087
33160
  "aria-hidden": "true",
33088
33161
  "data-block-transition": "",
@@ -33095,6 +33168,53 @@ function PageRenderer({ theme, page, usePlaceholders = false, dataContext, wrapB
33095
33168
  function isSiteStyleTransitionStyleGroup(value) {
33096
33169
  return value?.startsWith("site-style-transition-") === true;
33097
33170
  }
33171
+ function boundaryMapForAdjacentBlockIds(boundaries) {
33172
+ return new Map(boundaries.map((boundary) => [boundaryKey(boundary.previousBlockId, boundary.nextBlockId), boundary]));
33173
+ }
33174
+ function boundaryKey(previousBlockId, nextBlockId) {
33175
+ return `${previousBlockId}\u0000${nextBlockId}`;
33176
+ }
33177
+ function boundaryBetweenBlocks(previousBlock, nextBlock, boundaryByAdjacentBlockIds) {
33178
+ const previousBlockId = previousBlock?.id ?? null;
33179
+ const nextBlockId = nextBlock?.id ?? null;
33180
+ if (!previousBlockId || !nextBlockId) return null;
33181
+ return boundaryByAdjacentBlockIds.get(boundaryKey(previousBlockId, nextBlockId)) ?? null;
33182
+ }
33183
+ function renderBoundaryAfterBlock(input) {
33184
+ const previousBlockId = input.block.id;
33185
+ const nextBlockId = input.nextBlock?.id ?? null;
33186
+ if (!previousBlockId || !nextBlockId) return null;
33187
+ const boundary = input.boundaryByAdjacentBlockIds.get(boundaryKey(previousBlockId, nextBlockId));
33188
+ if (!boundary) return null;
33189
+ const rendered = /* @__PURE__ */ jsx("div", {
33190
+ "aria-hidden": "true",
33191
+ "data-block-boundary": "",
33192
+ "data-boundary-id": boundary.boundaryId,
33193
+ "data-boundary-previous-block-id": boundary.previousBlockId,
33194
+ "data-boundary-next-block-id": boundary.nextBlockId,
33195
+ "data-style-group": boundary.styleGroup,
33196
+ style: boundaryCssVarsStyle(boundary)
33197
+ }, `${input.blockKey}:boundary`);
33198
+ return input.wrapBoundary ? input.wrapBoundary(boundary, rendered) : rendered;
33199
+ }
33200
+ function boundaryCssVarsStyle(boundary) {
33201
+ return {
33202
+ "--site-style-transition-from": boundary.cssVars.from,
33203
+ "--site-style-transition-to": boundary.cssVars.to
33204
+ };
33205
+ }
33206
+ function boundaryReserveCssVarsStyle(input) {
33207
+ const before = input.before ? boundaryReserveValueForTreatment(input.before) : null;
33208
+ const after = input.after ? boundaryReserveValueForTreatment(input.after) : null;
33209
+ if (!before && !after) return void 0;
33210
+ return {
33211
+ ...before ? { "--site-style-boundary-before-reserve": before } : {},
33212
+ ...after ? { "--site-style-boundary-after-reserve": after } : {}
33213
+ };
33214
+ }
33215
+ function boundaryReserveValueForTreatment(boundary) {
33216
+ return boundary.metrics.reserveCss;
33217
+ }
33098
33218
  function transitionCssVarsStyle(content) {
33099
33219
  const transitionStyles = isObjectRecord(content._transitionStyles) ? content._transitionStyles : null;
33100
33220
  const cssVars = isObjectRecord(transitionStyles?.cssVars) ? transitionStyles.cssVars : null;
@@ -33106,6 +33226,14 @@ function transitionCssVarsStyle(content) {
33106
33226
  ...to ? { "--site-style-transition-to": to } : {}
33107
33227
  };
33108
33228
  }
33229
+ function mergeStyleObjects(left, right) {
33230
+ if (!left) return right;
33231
+ if (!right) return left;
33232
+ return {
33233
+ ...left,
33234
+ ...right
33235
+ };
33236
+ }
33109
33237
  function pageBlockPosition(index, blockCount) {
33110
33238
  if (blockCount <= 1) return "only";
33111
33239
  if (index === 0) return "first";
@@ -35017,52 +35145,53 @@ const containerResponsiveThemeCss = `/*
35017
35145
 
35018
35146
  /* Semantic spacing tokens (replaces Tailwind maps in src/system/spacing.ts) */
35019
35147
  .rb-section-pad-none {
35020
- padding-top: 0;
35021
- padding-bottom: 0;
35148
+ --rb-section-pad-y: 0rem;
35149
+ padding-top: var(--rb-section-pad-y);
35150
+ padding-bottom: var(--rb-section-pad-y);
35022
35151
  }
35023
35152
  .rb-section-pad-compact {
35024
- padding-top: 1.5rem;
35025
- padding-bottom: 1.5rem;
35153
+ --rb-section-pad-y: 1.5rem;
35154
+ padding-top: var(--rb-section-pad-y);
35155
+ padding-bottom: var(--rb-section-pad-y);
35026
35156
  }
35027
35157
  .rb-section-pad-cozy {
35028
- padding-top: 2.5rem;
35029
- padding-bottom: 2.5rem;
35158
+ --rb-section-pad-y: 2.5rem;
35159
+ padding-top: var(--rb-section-pad-y);
35160
+ padding-bottom: var(--rb-section-pad-y);
35030
35161
  }
35031
35162
  .rb-section-pad-medium {
35032
- padding-top: 3rem;
35033
- padding-bottom: 3rem;
35163
+ --rb-section-pad-y: 3rem;
35164
+ padding-top: var(--rb-section-pad-y);
35165
+ padding-bottom: var(--rb-section-pad-y);
35034
35166
  }
35035
35167
  .rb-section-pad-comfortable {
35036
- padding-top: 4rem;
35037
- padding-bottom: 4rem;
35168
+ --rb-section-pad-y: 4rem;
35169
+ padding-top: var(--rb-section-pad-y);
35170
+ padding-bottom: var(--rb-section-pad-y);
35038
35171
  }
35039
35172
  .rb-section-pad-spacious {
35040
- padding-top: 5rem;
35041
- padding-bottom: 5rem;
35173
+ --rb-section-pad-y: 5rem;
35174
+ padding-top: var(--rb-section-pad-y);
35175
+ padding-bottom: var(--rb-section-pad-y);
35042
35176
  }
35043
35177
 
35044
35178
  @container rb-site (min-width: 640px) {
35045
35179
 
35046
35180
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
35047
35181
  .rb-section-pad-compact {
35048
- padding-top: 2rem;
35049
- padding-bottom: 2rem;
35182
+ --rb-section-pad-y: 2rem;
35050
35183
  }
35051
35184
  .rb-section-pad-cozy {
35052
- padding-top: 3.5rem;
35053
- padding-bottom: 3.5rem;
35185
+ --rb-section-pad-y: 3.5rem;
35054
35186
  }
35055
35187
  .rb-section-pad-medium {
35056
- padding-top: 4rem;
35057
- padding-bottom: 4rem;
35188
+ --rb-section-pad-y: 4rem;
35058
35189
  }
35059
35190
  .rb-section-pad-comfortable {
35060
- padding-top: 5rem;
35061
- padding-bottom: 5rem;
35191
+ --rb-section-pad-y: 5rem;
35062
35192
  }
35063
35193
  .rb-section-pad-spacious {
35064
- padding-top: 7rem;
35065
- padding-bottom: 7rem;
35194
+ --rb-section-pad-y: 7rem;
35066
35195
  }
35067
35196
  }
35068
35197
 
@@ -36452,30 +36581,122 @@ const containerResponsiveThemeCss = `/*
36452
36581
  :where(.theme-scope) .header-logo-text {
36453
36582
  font-size: 1.125rem; /* matches rb-text-lg */
36454
36583
  line-height: 1.75rem;
36584
+ margin-inline: -0.18em;
36585
+ padding-inline: 0.18em;
36455
36586
  transition: font-size 300ms var(--motion-ease, ease);
36456
36587
  }
36457
36588
 
36458
- /* Mobile: reduce site title size (~30%) to keep header compact */
36589
+ /* Centered variant uses larger title */
36590
+ :where(.theme-scope) .header-variant-centered .header-logo-text {
36591
+ font-size: 1.25rem; /* matches rb-text-xl */
36592
+ line-height: 1.75rem;
36593
+ }
36594
+
36595
+ :where(.theme-scope) .header-logo-size-compact .header-logo-text {
36596
+ font-size: 0.95rem;
36597
+ line-height: 1.5rem;
36598
+ }
36599
+ :where(.theme-scope) .header-logo-size-standard .header-logo-text {
36600
+ font-size: 1.125rem;
36601
+ line-height: 1.75rem;
36602
+ }
36603
+ :where(.theme-scope) .header-logo-size-generous .header-logo-text {
36604
+ font-size: 1.35rem;
36605
+ line-height: 1.9rem;
36606
+ }
36607
+ :where(.theme-scope) .header-logo-size-display .header-logo-text {
36608
+ font-size: 1.75rem;
36609
+ line-height: 2.25rem;
36610
+ }
36611
+
36612
+ :where(.theme-scope)
36613
+ .header-variant-centered
36614
+ .header-logo-size-compact
36615
+ .header-logo-text {
36616
+ font-size: 1.125rem;
36617
+ line-height: 1.75rem;
36618
+ }
36619
+ :where(.theme-scope)
36620
+ .header-variant-centered
36621
+ .header-logo-size-standard
36622
+ .header-logo-text {
36623
+ font-size: 1.25rem;
36624
+ line-height: 1.75rem;
36625
+ }
36626
+ :where(.theme-scope)
36627
+ .header-variant-centered
36628
+ .header-logo-size-generous
36629
+ .header-logo-text {
36630
+ font-size: 1.6rem;
36631
+ line-height: 2rem;
36632
+ }
36633
+ :where(.theme-scope)
36634
+ .header-variant-centered
36635
+ .header-logo-size-display
36636
+ .header-logo-text {
36637
+ font-size: 2.1rem;
36638
+ line-height: 2.5rem;
36639
+ }
36640
+
36641
+ /* Mobile: reduce site title size to keep header compact */
36459
36642
  @container rb-site (max-width: 767px) {
36460
36643
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
36461
- :where(.theme-scope) .header-logo-text {
36644
+ :where(.theme-scope) .header-logo-text,
36645
+ :where(.theme-scope) .header-logo-size-standard .header-logo-text {
36462
36646
  font-size: 0.8rem;
36463
36647
  line-height: 1.25rem;
36464
36648
  }
36465
36649
 
36466
- :where(.theme-scope) .header-variant-centered .header-logo-text {
36650
+ :where(.theme-scope) .header-logo-size-compact .header-logo-text {
36651
+ font-size: 0.75rem;
36652
+ line-height: 1.15rem;
36653
+ }
36654
+
36655
+ :where(.theme-scope) .header-logo-size-generous .header-logo-text {
36656
+ font-size: 1rem;
36657
+ line-height: 1.4rem;
36658
+ }
36659
+
36660
+ :where(.theme-scope) .header-logo-size-display .header-logo-text {
36661
+ font-size: 1.25rem;
36662
+ line-height: 1.65rem;
36663
+ }
36664
+
36665
+ :where(.theme-scope) .header-variant-centered .header-logo-text,
36666
+ :where(.theme-scope)
36667
+ .header-variant-centered
36668
+ .header-logo-size-standard
36669
+ .header-logo-text {
36467
36670
  font-size: 0.875rem;
36468
36671
  line-height: 1.25rem;
36469
36672
  }
36673
+
36674
+ :where(.theme-scope)
36675
+ .header-variant-centered
36676
+ .header-logo-size-compact
36677
+ .header-logo-text {
36678
+ font-size: 0.8rem;
36679
+ line-height: 1.2rem;
36680
+ }
36681
+
36682
+ :where(.theme-scope)
36683
+ .header-variant-centered
36684
+ .header-logo-size-generous
36685
+ .header-logo-text {
36686
+ font-size: 1.125rem;
36687
+ line-height: 1.5rem;
36688
+ }
36689
+
36690
+ :where(.theme-scope)
36691
+ .header-variant-centered
36692
+ .header-logo-size-display
36693
+ .header-logo-text {
36694
+ font-size: 1.35rem;
36695
+ line-height: 1.75rem;
36696
+ }
36470
36697
  }
36471
36698
  }
36472
36699
 
36473
- /* Centered variant uses larger title */
36474
- :where(.theme-scope) .header-variant-centered .header-logo-text {
36475
- font-size: 1.25rem; /* matches rb-text-xl */
36476
- line-height: 1.75rem;
36477
- }
36478
-
36479
36700
  /* =================================================================
36480
36701
  Shrink on Scroll - Logo & Title
36481
36702
  ================================================================= */
@@ -52816,7 +53037,7 @@ function asPositiveSeconds(value) {
52816
53037
  if (!Number.isSafeInteger(value) || value <= 0) return err("not-positive-seconds");
52817
53038
  return ok$1(value);
52818
53039
  }
52819
- function isRecord$11(value) {
53040
+ function isRecord$12(value) {
52820
53041
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
52821
53042
  }
52822
53043
  function parseFileKindJson(value) {
@@ -53037,7 +53258,7 @@ function parseEntitledCustomerAccessScopeJson(value) {
53037
53258
  }
53038
53259
  }
53039
53260
  function requireRecord(value) {
53040
- if (!isRecord$11(value)) return err("expected-object");
53261
+ if (!isRecord$12(value)) return err("expected-object");
53041
53262
  return ok$1(value);
53042
53263
  }
53043
53264
  function requireString(value) {
@@ -53292,7 +53513,7 @@ const DEFAULT_MESSAGES = {
53292
53513
  update: "Failed to update media asset",
53293
53514
  delete: "Failed to delete media asset"
53294
53515
  };
53295
- function isRecord$10(value) {
53516
+ function isRecord$11(value) {
53296
53517
  return typeof value === "object" && value !== null;
53297
53518
  }
53298
53519
  const normalizeLabels = (labels) => labels !== void 0 && labels.length > 0 ? labels.map((label) => label.trim()).filter((label) => label.length > 0).join(",") : void 0;
@@ -53326,7 +53547,7 @@ const filterUpdatePayload = (input) => {
53326
53547
  return payload;
53327
53548
  };
53328
53549
  const extractErrorMessage = (body) => {
53329
- if (!isRecord$10(body)) return typeof body === "string" && body.trim().length > 0 ? body : null;
53550
+ if (!isRecord$11(body)) return typeof body === "string" && body.trim().length > 0 ? body : null;
53330
53551
  for (const key of [
53331
53552
  "error",
53332
53553
  "message",
@@ -53339,11 +53560,11 @@ const extractErrorMessage = (body) => {
53339
53560
  const details = body.details;
53340
53561
  if (Array.isArray(details)) for (const entry of details) {
53341
53562
  if (typeof entry === "string" && entry.trim().length > 0) return entry;
53342
- if (isRecord$10(entry) && typeof entry.message === "string" && entry.message.trim().length > 0) return entry.message;
53563
+ if (isRecord$11(entry) && typeof entry.message === "string" && entry.message.trim().length > 0) return entry.message;
53343
53564
  }
53344
53565
  const errors = body.errors;
53345
53566
  if (Array.isArray(errors)) {
53346
- for (const entry of errors) if (isRecord$10(entry) && typeof entry.message === "string" && entry.message.trim().length > 0) return entry.message;
53567
+ for (const entry of errors) if (isRecord$11(entry) && typeof entry.message === "string" && entry.message.trim().length > 0) return entry.message;
53347
53568
  }
53348
53569
  return null;
53349
53570
  };
@@ -60706,11 +60927,14 @@ function buildPreviewDashboardSetupUrl(dashboardBaseUrl, handoff) {
60706
60927
  //#region ../preview-next/src/client/preview/sidebarTabPreference.ts
60707
60928
  const STORAGE_KEY = "preview-sidebar-tab";
60708
60929
  const REQUEST_EVENT = "riverbank:preview-sidebar:request-open";
60930
+ function normalizeOpenRequest(input) {
60931
+ return parsePreviewSidebarOpenRequestDetail(typeof input === "string" ? { tab: input } : input);
60932
+ }
60709
60933
  function parsePreviewSidebarOpenRequestDetail(detail) {
60710
- const request = isRecord$9(detail) ? detail : {};
60934
+ const request = isRecord$10(detail) ? detail : {};
60711
60935
  return {
60712
60936
  tab: resolvePreviewSidebarTab(request.tab === "assistant" ? "assistant" : "editor"),
60713
- ...request.designRow === "header" || request.designRow === "footer" ? { designRow: request.designRow } : {}
60937
+ ...isPreviewDesignRow(request.designRow) ? { designRow: request.designRow } : {}
60714
60938
  };
60715
60939
  }
60716
60940
  function getPreviewSidebarTab() {
@@ -60727,18 +60951,27 @@ function setPreviewSidebarTab(tab) {
60727
60951
  window.localStorage.setItem(STORAGE_KEY, resolvePreviewSidebarTab(tab));
60728
60952
  } catch {}
60729
60953
  }
60954
+ function requestPreviewSidebarOpen(input) {
60955
+ if (typeof window === "undefined") return;
60956
+ const request = normalizeOpenRequest(input);
60957
+ setPreviewSidebarTab(request.tab);
60958
+ window.dispatchEvent(new window.CustomEvent(REQUEST_EVENT, { detail: request }));
60959
+ }
60730
60960
  function onPreviewSidebarOpenRequest(handler) {
60731
60961
  if (typeof window === "undefined") return () => void 0;
60732
60962
  const listener = (event) => {
60733
- if (!(event instanceof CustomEvent)) return;
60963
+ if (!("detail" in event)) return;
60734
60964
  handler(parsePreviewSidebarOpenRequestDetail(event.detail));
60735
60965
  };
60736
60966
  window.addEventListener(REQUEST_EVENT, listener);
60737
60967
  return () => window.removeEventListener(REQUEST_EVENT, listener);
60738
60968
  }
60739
- function isRecord$9(value) {
60969
+ function isRecord$10(value) {
60740
60970
  return typeof value === "object" && value !== null;
60741
60971
  }
60972
+ function isPreviewDesignRow(value) {
60973
+ return value === "header" || value === "footer" || value === "header-layout" || value === "header-style" || value === "footer-layout";
60974
+ }
60742
60975
  //#endregion
60743
60976
  //#region ../preview-next/src/client/preview/previewChromeSurface.ts
60744
60977
  const PREVIEW_CHROME_THEME_CLASS_NAME = "builder-dashboard-chrome-theme";
@@ -60934,14 +61167,14 @@ function backgroundCapabilityFromModes(modeCapabilities) {
60934
61167
  };
60935
61168
  }
60936
61169
  function parseBackgroundOverrideFromContent(content) {
60937
- return parseBackgroundOverride((isRecord$8(content._sectionStyles) ? content._sectionStyles : null)?.background);
61170
+ return parseBackgroundOverride((isRecord$9(content._sectionStyles) ? content._sectionStyles : null)?.background);
60938
61171
  }
60939
61172
  function parseBackgroundOverride(value) {
60940
61173
  if (value === null || value === void 0) return {
60941
61174
  kind: "supported",
60942
61175
  override: DEFAULT_BACKGROUND_OVERRIDE
60943
61176
  };
60944
- if (!isRecord$8(value)) return {
61177
+ if (!isRecord$9(value)) return {
60945
61178
  kind: "legacy",
60946
61179
  reason: "unsupported-shape",
60947
61180
  background: {}
@@ -61057,7 +61290,7 @@ function serializeBackgroundOverride(override) {
61057
61290
  }
61058
61291
  }
61059
61292
  function applyBackgroundOverrideContentPatch(content, override) {
61060
- const sectionStyles = isRecord$8(content._sectionStyles) ? content._sectionStyles : {};
61293
+ const sectionStyles = isRecord$9(content._sectionStyles) ? content._sectionStyles : {};
61061
61294
  const serialized = serializeBackgroundOverride(override);
61062
61295
  if (serialized === null) return withSectionStyles(content, omitRecordKey$1(sectionStyles, "background"));
61063
61296
  return withSectionStyles(content, {
@@ -61286,7 +61519,7 @@ function imageAllowed(mediaId, pool) {
61286
61519
  return pool?.some((item) => item.mediaId === mediaId) ?? false;
61287
61520
  }
61288
61521
  function parseImageMediaAssetId(value) {
61289
- if (!isRecord$8(value)) return { kind: "missing" };
61522
+ if (!isRecord$9(value)) return { kind: "missing" };
61290
61523
  if (value.type !== void 0 && value.type !== "image") return { kind: "missing" };
61291
61524
  const parsed = parseMediaAssetId(value.assetId);
61292
61525
  if (!parsed.ok) return value.assetId === void 0 || value.assetId === null ? { kind: "missing" } : { kind: "invalid" };
@@ -61327,7 +61560,7 @@ function withSectionStyles(content, sectionStyles) {
61327
61560
  function omitRecordKey$1(content, key) {
61328
61561
  return Object.fromEntries(Object.entries(content).filter(([entryKey]) => entryKey !== key));
61329
61562
  }
61330
- function isRecord$8(value) {
61563
+ function isRecord$9(value) {
61331
61564
  return typeof value === "object" && value !== null && !Array.isArray(value);
61332
61565
  }
61333
61566
  //#endregion
@@ -62124,8 +62357,8 @@ function contentWithPreviousLayoutVariant(currentContent, previousContent) {
62124
62357
  return nextContent;
62125
62358
  }
62126
62359
  function contentWithPreviousBackground(currentContent, previousContent) {
62127
- const previousSectionStyles = isRecord$7(previousContent._sectionStyles) ? previousContent._sectionStyles : {};
62128
- const nextSectionStyles = { ...isRecord$7(currentContent._sectionStyles) ? currentContent._sectionStyles : {} };
62360
+ const previousSectionStyles = isRecord$8(previousContent._sectionStyles) ? previousContent._sectionStyles : {};
62361
+ const nextSectionStyles = { ...isRecord$8(currentContent._sectionStyles) ? currentContent._sectionStyles : {} };
62129
62362
  if (Object.prototype.hasOwnProperty.call(previousSectionStyles, "background")) nextSectionStyles.background = previousSectionStyles.background;
62130
62363
  else delete nextSectionStyles.background;
62131
62364
  if (Object.keys(nextSectionStyles).length > 0) return {
@@ -62138,9 +62371,9 @@ function contentWithPreviousBackground(currentContent, previousContent) {
62138
62371
  }
62139
62372
  function withRuntimeBackgroundImageAsset(content, imageAsset) {
62140
62373
  if (!imageAsset) return content;
62141
- const sectionStyles = isRecord$7(content._sectionStyles) ? content._sectionStyles : null;
62142
- const background = isRecord$7(sectionStyles?.background) ? sectionStyles.background : null;
62143
- const image = isRecord$7(background?.image) ? background.image : null;
62374
+ const sectionStyles = isRecord$8(content._sectionStyles) ? content._sectionStyles : null;
62375
+ const background = isRecord$8(sectionStyles?.background) ? sectionStyles.background : null;
62376
+ const image = isRecord$8(background?.image) ? background.image : null;
62144
62377
  if (!sectionStyles || !background || !image || background.type !== "image") return content;
62145
62378
  return {
62146
62379
  ...content,
@@ -62153,7 +62386,7 @@ function withRuntimeBackgroundImageAsset(content, imageAsset) {
62153
62386
  }
62154
62387
  };
62155
62388
  }
62156
- function isRecord$7(value) {
62389
+ function isRecord$8(value) {
62157
62390
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
62158
62391
  }
62159
62392
  //#endregion
@@ -62183,7 +62416,7 @@ function rollbackPreviewCustomizeDraftPatch(uiStore, patch) {
62183
62416
  }
62184
62417
  function currentLocalBlockContent(uiStore, targetBlockId) {
62185
62418
  const current = uiStore.getState().drafts.getCurrentValues(unsafeAsEditorBlockId(targetBlockId));
62186
- return isRecord$6(current) ? current : null;
62419
+ return isRecord$7(current) ? current : null;
62187
62420
  }
62188
62421
  function replaceLocalBlockContentWithoutHistory(input) {
62189
62422
  const editorBlockId = unsafeAsEditorBlockId(input.targetBlockId);
@@ -62235,7 +62468,7 @@ function localRuntimeDraftForBlock(input) {
62235
62468
  }
62236
62469
  };
62237
62470
  }
62238
- function isRecord$6(value) {
62471
+ function isRecord$7(value) {
62239
62472
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
62240
62473
  }
62241
62474
  //#endregion
@@ -63064,25 +63297,25 @@ const INITIAL_ONBOARDING_CONFIRMATION_STATE = {
63064
63297
  resendFeedback: null,
63065
63298
  statusLoadFailed: false
63066
63299
  };
63067
- function isRecord$5(value) {
63300
+ function isRecord$6(value) {
63068
63301
  return value !== null && typeof value === "object";
63069
63302
  }
63070
63303
  function getErrorMessageFromEnvelope(payload, fallback) {
63071
- const error = isRecord$5(payload) ? payload.error : null;
63072
- const message = isRecord$5(error) ? error.message : null;
63304
+ const error = isRecord$6(payload) ? payload.error : null;
63305
+ const message = isRecord$6(error) ? error.message : null;
63073
63306
  return typeof message === "string" && message.trim().length > 0 ? message : fallback;
63074
63307
  }
63075
63308
  function isLaunchReadiness(value) {
63076
- return isRecord$5(value) && Array.isArray(value.requirements) && typeof value.pendingRequiredCount === "number" && typeof value.pendingRecommendedCount === "number" && typeof value.pendingOptionalCount === "number" && isRecord$5(value.goLiveDecision) && (value.goLiveDecision.kind === "allowed" || value.goLiveDecision.kind === "blocked");
63309
+ return isRecord$6(value) && Array.isArray(value.requirements) && typeof value.pendingRequiredCount === "number" && typeof value.pendingRecommendedCount === "number" && typeof value.pendingOptionalCount === "number" && isRecord$6(value.goLiveDecision) && (value.goLiveDecision.kind === "allowed" || value.goLiveDecision.kind === "blocked");
63077
63310
  }
63078
63311
  function isOnboardingPreviewStatusResponse(value) {
63079
- return isRecord$5(value) && typeof value.dashboardUnlocked === "boolean" && typeof value.requiresEmailConfirmation === "boolean" && isLaunchReadiness(value.launchReadiness);
63312
+ return isRecord$6(value) && typeof value.dashboardUnlocked === "boolean" && typeof value.requiresEmailConfirmation === "boolean" && isLaunchReadiness(value.launchReadiness);
63080
63313
  }
63081
63314
  function isResendOnboardingPreviewConfirmationResponse(value) {
63082
- return isRecord$5(value) && (value.result === "resent" || value.result === "already_confirmed") && typeof value.dashboardUnlocked === "boolean" && typeof value.requiresEmailConfirmation === "boolean" && isLaunchReadiness(value.launchReadiness);
63315
+ return isRecord$6(value) && (value.result === "resent" || value.result === "already_confirmed") && typeof value.dashboardUnlocked === "boolean" && typeof value.requiresEmailConfirmation === "boolean" && isLaunchReadiness(value.launchReadiness);
63083
63316
  }
63084
63317
  function getSuccessData(payload, isData) {
63085
- if (!isRecord$5(payload) || payload.success !== true || !isData(payload.data)) return null;
63318
+ if (!isRecord$6(payload) || payload.success !== true || !isData(payload.data)) return null;
63086
63319
  return payload.data;
63087
63320
  }
63088
63321
  function useOnboardingConfirmationCheck(input) {
@@ -64004,6 +64237,84 @@ function cycleAvailabilityFromFlags(input) {
64004
64237
  return { kind: "available" };
64005
64238
  }
64006
64239
  //#endregion
64240
+ //#region ../preview-next/src/client/preview/CustomizeColorTokenPicker.tsx
64241
+ function CustomizeColorTokenPicker({ title, selectedToken, recommendedTokens, advancedTokens = [], disabled = false, columnsClassName = "grid-cols-2", showTitle = true, labelForToken, swatchColorForToken, onChooseToken }) {
64242
+ if (recommendedTokens.length === 0 && advancedTokens.length === 0) return null;
64243
+ const renderGrid = (tokens) => /* @__PURE__ */ jsx("div", {
64244
+ className: `grid gap-1 ${columnsClassName}`,
64245
+ children: tokens.map((token) => /* @__PURE__ */ jsx(ColorTokenButton, {
64246
+ token,
64247
+ label: labelForToken(token),
64248
+ swatchColor: swatchColorForToken(token),
64249
+ selected: selectedToken === token,
64250
+ disabled,
64251
+ onClick: (event) => onChooseToken(token, event)
64252
+ }, token))
64253
+ });
64254
+ return /* @__PURE__ */ jsxs("div", { children: [
64255
+ showTitle ? /* @__PURE__ */ jsx("div", {
64256
+ className: "mb-1 text-xs font-medium text-muted-foreground",
64257
+ children: title
64258
+ }) : null,
64259
+ renderGrid(recommendedTokens),
64260
+ advancedTokens.length > 0 ? /* @__PURE__ */ jsxs("details", {
64261
+ className: "mt-1",
64262
+ children: [/* @__PURE__ */ jsx("summary", {
64263
+ className: "cursor-pointer text-xs text-muted-foreground",
64264
+ children: "More colors"
64265
+ }), /* @__PURE__ */ jsx("div", {
64266
+ className: "mt-1",
64267
+ children: renderGrid(advancedTokens)
64268
+ })]
64269
+ }) : null
64270
+ ] });
64271
+ }
64272
+ function CustomizeBackgroundColorPicker({ title = "Colors", selectedToken, recommendedTokens, advancedTokens = [], disabled = false, columnsClassName = "grid-cols-2", defaultSelected = false, defaultLabel = "Default", labelForToken, swatchColorForToken, onChooseDefault, onChooseToken }) {
64273
+ const hasTokens = recommendedTokens.length > 0 || advancedTokens.length > 0;
64274
+ if (!onChooseDefault && !hasTokens) return null;
64275
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
64276
+ className: "mb-2 flex items-center justify-between gap-2",
64277
+ children: [/* @__PURE__ */ jsx("div", {
64278
+ className: "text-xs font-medium text-muted-foreground",
64279
+ children: title
64280
+ }), onChooseDefault ? /* @__PURE__ */ jsx("button", {
64281
+ type: "button",
64282
+ className: `rounded-md border px-2 py-1 text-xs hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50 ${defaultSelected ? "border-foreground" : "bg-background"}`,
64283
+ disabled,
64284
+ onClick: onChooseDefault,
64285
+ children: defaultLabel
64286
+ }) : null]
64287
+ }), hasTokens ? /* @__PURE__ */ jsx(CustomizeColorTokenPicker, {
64288
+ title,
64289
+ selectedToken,
64290
+ recommendedTokens,
64291
+ advancedTokens,
64292
+ disabled,
64293
+ columnsClassName,
64294
+ labelForToken,
64295
+ swatchColorForToken,
64296
+ onChooseToken,
64297
+ showTitle: false
64298
+ }) : null] });
64299
+ }
64300
+ function ColorTokenButton({ token, label, swatchColor, selected, disabled, onClick }) {
64301
+ return /* @__PURE__ */ jsxs("button", {
64302
+ type: "button",
64303
+ className: `flex min-w-0 items-center gap-2 rounded-md border px-2 py-1 text-left text-xs hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50 ${selected ? "border-foreground" : "bg-background"}`,
64304
+ disabled,
64305
+ "aria-label": `Choose ${label}`,
64306
+ onClick,
64307
+ "data-token": token,
64308
+ children: [/* @__PURE__ */ jsx("span", {
64309
+ className: "h-3 w-3 shrink-0 rounded-full border",
64310
+ style: { backgroundColor: swatchColor }
64311
+ }), /* @__PURE__ */ jsx("span", {
64312
+ className: "truncate",
64313
+ children: label
64314
+ })]
64315
+ });
64316
+ }
64317
+ //#endregion
64007
64318
  //#region ../preview-next/src/client/preview/SiteChromeCustomizeButton.tsx
64008
64319
  function SiteChromeCustomizeButton({ surface, containerClassName = "pointer-events-auto absolute right-2 top-2 z-50 opacity-0 transition group-focus-within/site-chrome:opacity-100 group-hover/site-chrome:opacity-100" }) {
64009
64320
  const customize = useSiteChromeCustomizeOptional();
@@ -64103,7 +64414,6 @@ function SiteChromeCustomizeButton({ surface, containerClassName = "pointer-even
64103
64414
  children: [
64104
64415
  controlPlan.cycleRows.map((row) => /* @__PURE__ */ jsx(CustomizeCycleRow, { ...row }, row.label)),
64105
64416
  background?.available ? /* @__PURE__ */ jsx(SiteChromeBackgroundPalette, {
64106
- surface: surfaceState.surface,
64107
64417
  background,
64108
64418
  applyAllowed: surfaceState.applyAllowed,
64109
64419
  onChoose: (override) => customize?.chooseSurfaceBackground(surfaceState.surface, override)
@@ -64128,7 +64438,7 @@ function SiteChromeCustomizeButton({ surface, containerClassName = "pointer-even
64128
64438
  })]
64129
64439
  }), /* @__PURE__ */ jsxs("label", {
64130
64440
  className: "block text-xs font-medium text-muted-foreground",
64131
- children: [/* @__PURE__ */ jsx("span", { children: "Logo size" }), /* @__PURE__ */ jsx("select", {
64441
+ children: [/* @__PURE__ */ jsx("span", { children: surfaceState.brandSizeLabel }), /* @__PURE__ */ jsx("select", {
64132
64442
  className: "mt-1 h-8 w-full rounded-md border bg-background px-2 text-sm text-foreground disabled:cursor-not-allowed disabled:opacity-50",
64133
64443
  value: surfaceState.logoSize,
64134
64444
  onChange: (event) => {
@@ -64143,6 +64453,23 @@ function SiteChromeCustomizeButton({ surface, containerClassName = "pointer-even
64143
64453
  })]
64144
64454
  })]
64145
64455
  }) : null,
64456
+ /* @__PURE__ */ jsx("div", {
64457
+ className: "border-t pt-2",
64458
+ children: /* @__PURE__ */ jsx("button", {
64459
+ type: "button",
64460
+ className: "w-full rounded-md border bg-background px-3 py-2 text-sm font-medium hover:bg-muted",
64461
+ onClick: (event) => {
64462
+ event.preventDefault();
64463
+ event.stopPropagation();
64464
+ requestPreviewSidebarOpen({
64465
+ tab: "editor",
64466
+ designRow: surfaceState.surface === "header" ? "header-style" : "footer"
64467
+ });
64468
+ popover.close();
64469
+ },
64470
+ children: "More options"
64471
+ })
64472
+ }),
64146
64473
  surfaceState.diagnostics.length > 0 ? /* @__PURE__ */ jsx("ul", {
64147
64474
  className: "space-y-1 text-xs text-amber-700",
64148
64475
  children: surfaceState.diagnostics.map((diagnostic) => /* @__PURE__ */ jsx("li", { children: diagnostic }, diagnostic))
@@ -64223,77 +64550,32 @@ function chooseSiteChromeCustomizePopoverSide(input) {
64223
64550
  if (measuredPanelHeight <= availableBelow) return "below";
64224
64551
  return availableAbove > availableBelow ? "above" : "below";
64225
64552
  }
64226
- function SiteChromeBackgroundPalette({ surface, background, applyAllowed, onChoose }) {
64553
+ function SiteChromeBackgroundPalette({ background, applyAllowed, onChoose }) {
64227
64554
  const choose = (override) => (event) => {
64228
64555
  event.preventDefault();
64229
64556
  event.stopPropagation();
64230
64557
  onChoose(override);
64231
64558
  };
64232
- return /* @__PURE__ */ jsxs("div", {
64559
+ return /* @__PURE__ */ jsx("div", {
64233
64560
  className: "border-t pt-3",
64234
- children: [
64235
- /* @__PURE__ */ jsxs("div", {
64236
- className: "mb-2 flex items-center justify-between gap-2",
64237
- children: [/* @__PURE__ */ jsx("div", {
64238
- className: "text-xs font-medium text-muted-foreground",
64239
- children: "Background colors"
64240
- }), /* @__PURE__ */ jsx("button", {
64241
- type: "button",
64242
- className: `rounded-md border px-2 py-1 text-xs hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50 ${background.current.kind === "default" ? "border-foreground" : "bg-background"}`,
64243
- disabled: !applyAllowed,
64244
- onClick: choose({ kind: "default" }),
64245
- children: "Default"
64246
- })]
64247
- }),
64248
- /* @__PURE__ */ jsx("div", {
64249
- className: "grid grid-cols-3 gap-1",
64250
- children: background.quickTokens.map((token) => /* @__PURE__ */ jsx(BackgroundSwatchButton, {
64251
- token,
64252
- surface,
64253
- selected: background.current.kind === "color" && background.current.token === token,
64254
- disabled: !applyAllowed,
64255
- onClick: choose({
64256
- kind: "color",
64257
- token
64258
- })
64259
- }, token))
64260
- }),
64261
- background.advancedTokens.length ? /* @__PURE__ */ jsxs("details", {
64262
- className: "mt-2",
64263
- children: [/* @__PURE__ */ jsx("summary", {
64264
- className: "cursor-pointer text-xs text-muted-foreground",
64265
- children: "More colors"
64266
- }), /* @__PURE__ */ jsx("div", {
64267
- className: "mt-1 grid grid-cols-3 gap-1",
64268
- children: background.advancedTokens.map((token) => /* @__PURE__ */ jsx(BackgroundSwatchButton, {
64269
- token,
64270
- surface,
64271
- selected: background.current.kind === "color" && background.current.token === token,
64272
- disabled: !applyAllowed,
64273
- onClick: choose({
64274
- kind: "color",
64275
- token
64276
- })
64277
- }, token))
64278
- })]
64279
- }) : null
64280
- ]
64281
- });
64282
- }
64283
- function BackgroundSwatchButton({ token, surface, selected, disabled, onClick }) {
64284
- return /* @__PURE__ */ jsxs("button", {
64285
- type: "button",
64286
- className: `flex min-w-0 items-center gap-2 rounded-md border px-2 py-1 text-left text-xs hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50 ${selected ? "border-foreground" : "bg-background"}`,
64287
- disabled,
64288
- "aria-label": `Set ${surface} background to ${token}`,
64289
- onClick,
64290
- children: [/* @__PURE__ */ jsx("span", {
64291
- className: "h-3 w-3 shrink-0 rounded-full border",
64292
- style: { backgroundColor: tokenSwatchCss$1(token) }
64293
- }), /* @__PURE__ */ jsx("span", {
64294
- className: "truncate",
64295
- children: formatSiteChromeBackgroundTokenLabel(token)
64296
- })]
64561
+ children: /* @__PURE__ */ jsx(CustomizeBackgroundColorPicker, {
64562
+ title: "Background colors",
64563
+ defaultSelected: background.current.kind === "default",
64564
+ onChooseDefault: choose({ kind: "default" }),
64565
+ selectedToken: background.current.kind === "color" ? background.current.token : null,
64566
+ recommendedTokens: background.quickTokens,
64567
+ advancedTokens: background.advancedTokens,
64568
+ disabled: !applyAllowed,
64569
+ columnsClassName: "grid-cols-3",
64570
+ labelForToken: formatSiteChromeBackgroundTokenLabel,
64571
+ swatchColorForToken: tokenSwatchCss$1,
64572
+ onChooseToken: (token, event) => {
64573
+ choose({
64574
+ kind: "color",
64575
+ token
64576
+ })(event);
64577
+ }
64578
+ })
64297
64579
  });
64298
64580
  }
64299
64581
  function tokenSwatchCss$1(token) {
@@ -64565,10 +64847,10 @@ function LinkedEntryEditEventBridge() {
64565
64847
  //#region ../preview-next/src/client/preview/PreviewShellLayout.tsx
64566
64848
  const previewContainerResponsiveEnabled = process.env.NEXT_PUBLIC_ENABLE_PREVIEW_CONTAINER_RESPONSIVE !== "false";
64567
64849
  const PreviewEditorSidebar = React.lazy(async () => {
64568
- return { default: (await import("./PreviewEditorSidebar-BKkhhkJk.mjs")).PreviewEditorSidebar };
64850
+ return { default: (await import("./PreviewEditorSidebar-DkNpCPja.mjs")).PreviewEditorSidebar };
64569
64851
  });
64570
64852
  const PreviewEditorUI = React.lazy(async () => {
64571
- return { default: (await import("./PreviewEditorUI-DIvTqcqI.mjs")).PreviewEditorUI };
64853
+ return { default: (await import("./PreviewEditorUI-DeNKtqk3.mjs")).PreviewEditorUI };
64572
64854
  });
64573
64855
  const previewPaneContainmentStyle = {
64574
64856
  contain: "layout paint",
@@ -64963,11 +65245,11 @@ function defaultDesignEditorEligibility(input) {
64963
65245
  //#region ../preview-next/src/client/utils/path.ts
64964
65246
  const PATH_SEPARATOR_REGEX = /\./g;
64965
65247
  const BRACKET_ACCESS_REGEX = /\[([^\]]+)\]/g;
64966
- function isRecord$4(value) {
65248
+ function isRecord$5(value) {
64967
65249
  return typeof value === "object" && value !== null && !Array.isArray(value);
64968
65250
  }
64969
65251
  function isPathContainer(value) {
64970
- return Array.isArray(value) || isRecord$4(value);
65252
+ return Array.isArray(value) || isRecord$5(value);
64971
65253
  }
64972
65254
  function createPathContainer(nextIsIndex) {
64973
65255
  return nextIsIndex ? [] : {};
@@ -65120,28 +65402,33 @@ function cloneRecord(value) {
65120
65402
  //#endregion
65121
65403
  //#region ../preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.ts
65122
65404
  function runtimeContentDecorationProjectionFromEditorModel(editorModel, surfaceResolutionContext, designRules) {
65405
+ const compiled = compileEditorModelRuntime({
65406
+ editorModel,
65407
+ surfaceResolutionContext,
65408
+ designRules
65409
+ });
65123
65410
  return {
65124
65411
  kind: "runtime-content-decoration",
65125
65412
  source: "page-design",
65126
- fieldsByBlockId: buildEditorModelRuntimeFieldsByBlockId({
65127
- editorModel,
65128
- surfaceResolutionContext,
65129
- designRules
65130
- })
65413
+ fieldsByBlockId: runtimeFieldsByBlockId(compiled.blocks),
65414
+ boundaries: compiled.boundaries
65131
65415
  };
65132
65416
  }
65417
+ function runtimeFieldsByBlockId(blocks) {
65418
+ return new Map(blocks.map((block) => [block.blockId, block.fields]));
65419
+ }
65133
65420
  function applyRuntimeContentDecorationProjection(block, content, projection, adjacency) {
65134
65421
  const blockId = designBlockIdFromBlockItem(block);
65135
65422
  const retargetedFields = retargetCompiledRuntimeFieldsForContentAdjacency(blockId ? projection.fieldsByBlockId.get(blockId) : void 0, {
65136
- currentContent: isRecord$3(content) ? content : null,
65423
+ currentContent: isRecord$4(content) ? content : null,
65137
65424
  nextContent: adjacency?.nextContent
65138
65425
  });
65139
- return applyCompiledRuntimeFieldsToContent(isRecord$3(content) ? content : {}, retargetedFields);
65426
+ return applyCompiledRuntimeFieldsToContent(isRecord$4(content) ? content : {}, retargetedFields);
65140
65427
  }
65141
65428
  function designBlockIdFromBlockItem(block) {
65142
65429
  return typeof block.id === "string" && block.id.length > 0 ? asDesignBlockId(block.id) : null;
65143
65430
  }
65144
- function isRecord$3(value) {
65431
+ function isRecord$4(value) {
65145
65432
  return typeof value === "object" && value !== null && !Array.isArray(value);
65146
65433
  }
65147
65434
  //#endregion
@@ -65192,7 +65479,7 @@ function overlayValue(value, overlays) {
65192
65479
  });
65193
65480
  return changed ? next : value;
65194
65481
  }
65195
- if (!isRecord$2(value)) return value;
65482
+ if (!isRecord$3(value)) return value;
65196
65483
  const meta = parseLinkedEntryMeta(value[LINKED_CONTENT_ENTRY_META_KEY]);
65197
65484
  if (meta) {
65198
65485
  const overlay = overlays.get(unsafeAsLinkedContentEntryId(meta.entryId));
@@ -65258,7 +65545,7 @@ function resolveOverlayTitle(content, meta) {
65258
65545
  function parseLinkedEntryMeta(value) {
65259
65546
  return getLinkedContentEntryMeta({ [LINKED_CONTENT_ENTRY_META_KEY]: value });
65260
65547
  }
65261
- function isRecord$2(value) {
65548
+ function isRecord$3(value) {
65262
65549
  return typeof value === "object" && value !== null && !Array.isArray(value);
65263
65550
  }
65264
65551
  //#endregion
@@ -65300,9 +65587,9 @@ function readProjectedDraftRenderContent(block, editorBlockId, snap, projections
65300
65587
  return applyPreviewContentFieldProjections(editorBlockId, snap?.current ?? snap?.baseline ?? block.content ?? block.publishedContent ?? null, projections);
65301
65588
  }
65302
65589
  function renderContent(block, content, projections, linkedEntryOverlays, nextContent) {
65303
- return applyPreviewRuntimeContentProjections(block, applyLinkedEntryRenderOverlay(content, linkedEntryOverlays), projections, { nextContent: isRecord$1(nextContent) ? nextContent : null });
65590
+ return applyPreviewRuntimeContentProjections(block, applyLinkedEntryRenderOverlay(content, linkedEntryOverlays), projections, { nextContent: isRecord$2(nextContent) ? nextContent : null });
65304
65591
  }
65305
- function isRecord$1(value) {
65592
+ function isRecord$2(value) {
65306
65593
  return typeof value === "object" && value !== null && !Array.isArray(value);
65307
65594
  }
65308
65595
  //#endregion
@@ -65517,7 +65804,7 @@ const editorRegistry = {
65517
65804
  };
65518
65805
  //#endregion
65519
65806
  //#region ../preview-next/src/client/blocks/isRecord.ts
65520
- function isRecord(value) {
65807
+ function isRecord$1(value) {
65521
65808
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
65522
65809
  }
65523
65810
  //#endregion
@@ -65691,7 +65978,7 @@ function BlockToolbar({ blockId, blockKind, content, bookingOfferingPresets, the
65691
65978
  const uiStore = useEditorUiStoreInstance();
65692
65979
  const editorBlockId = useMemo(() => unsafeAsEditorBlockId(blockId), [blockId]);
65693
65980
  const draftContent = useEditorUiStore((state) => state.drafts.getCurrentValues(editorBlockId));
65694
- const customizeContent = useMemo(() => isRecord(draftContent) ? draftContent : content, [content, draftContent]);
65981
+ const customizeContent = useMemo(() => isRecord$1(draftContent) ? draftContent : content, [content, draftContent]);
65695
65982
  const customizeSelection = usePreviewBlockCustomizeSelectionOptional();
65696
65983
  const popover = useCustomizePopoverController();
65697
65984
  const focusTarget = useMemo(() => computeDefaultFocus(blockKind, customizeContent), [blockKind, customizeContent]);
@@ -66108,54 +66395,22 @@ function BackgroundChooser({ capability, current, imagePoolStatus, onChoose }) {
66108
66395
  }, { selectedImage });
66109
66396
  setMediaPickerOpenKey(0);
66110
66397
  };
66111
- const renderColorOptions = () => recommendedTokens.length || advancedTokens.length ? /* @__PURE__ */ jsxs("div", { children: [
66112
- /* @__PURE__ */ jsx("div", {
66113
- className: "mb-1 text-xs font-medium text-muted-foreground",
66114
- children: "Colors"
66115
- }),
66116
- /* @__PURE__ */ jsx("div", {
66117
- className: "grid grid-cols-2 gap-1",
66118
- children: recommendedTokens.map((token) => /* @__PURE__ */ jsxs("button", {
66119
- type: "button",
66120
- className: `flex min-w-0 items-center gap-2 rounded-md border px-2 py-1 text-left text-xs hover:bg-muted ${current.kind === "color" && current.token === token ? "border-foreground" : "bg-background"}`,
66121
- onClick: chooseFromClick({
66122
- kind: "color",
66123
- token
66124
- }),
66125
- children: [/* @__PURE__ */ jsx("span", {
66126
- className: "h-3 w-3 shrink-0 rounded-full border",
66127
- style: { backgroundColor: tokenSwatchCss(token) }
66128
- }), /* @__PURE__ */ jsx("span", {
66129
- className: "truncate",
66130
- children: formatTokenLabel(token)
66131
- })]
66132
- }, token))
66133
- }),
66134
- advancedTokens.length ? /* @__PURE__ */ jsxs("details", {
66135
- className: "mt-1",
66136
- children: [/* @__PURE__ */ jsx("summary", {
66137
- className: "cursor-pointer text-xs text-muted-foreground",
66138
- children: "More colors"
66139
- }), /* @__PURE__ */ jsx("div", {
66140
- className: "mt-1 grid grid-cols-2 gap-1",
66141
- children: advancedTokens.map((token) => /* @__PURE__ */ jsxs("button", {
66142
- type: "button",
66143
- className: `flex min-w-0 items-center gap-2 rounded-md border px-2 py-1 text-left text-xs hover:bg-muted ${current.kind === "color" && current.token === token ? "border-foreground" : "bg-background"}`,
66144
- onClick: chooseFromClick({
66145
- kind: "color",
66146
- token
66147
- }),
66148
- children: [/* @__PURE__ */ jsx("span", {
66149
- className: "h-3 w-3 shrink-0 rounded-full border",
66150
- style: { backgroundColor: tokenSwatchCss(token) }
66151
- }), /* @__PURE__ */ jsx("span", {
66152
- className: "truncate",
66153
- children: formatTokenLabel(token)
66154
- })]
66155
- }, token))
66156
- })]
66157
- }) : null
66158
- ] }) : null;
66398
+ const renderColorOptions = () => /* @__PURE__ */ jsx(CustomizeBackgroundColorPicker, {
66399
+ title: "Colors",
66400
+ selectedToken: current.kind === "color" ? current.token : null,
66401
+ recommendedTokens,
66402
+ advancedTokens,
66403
+ defaultSelected: current.kind === "default",
66404
+ onChooseDefault: capability.modes.includes("default") ? chooseFromClick(defaultBackgroundOverrideForMode("default", capability)) : void 0,
66405
+ labelForToken: formatTokenLabel,
66406
+ swatchColorForToken: tokenSwatchCss,
66407
+ onChooseToken: (token, event) => {
66408
+ chooseFromClick({
66409
+ kind: "color",
66410
+ token
66411
+ })(event);
66412
+ }
66413
+ });
66159
66414
  const renderGradientOptions = () => capability.gradientIds?.length ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
66160
66415
  className: "mb-1 text-xs font-medium text-muted-foreground",
66161
66416
  children: "Gradients"
@@ -66260,16 +66515,7 @@ function BackgroundChooser({ capability, current, imagePoolStatus, onChoose }) {
66260
66515
  return /* @__PURE__ */ jsxs("div", {
66261
66516
  className: "mt-2 max-h-80 overflow-y-auto rounded-md border bg-muted/20 p-2",
66262
66517
  children: [
66263
- current.kind === "default" ? /* @__PURE__ */ jsxs("button", {
66264
- type: "button",
66265
- className: "flex w-full items-center gap-2 rounded-md border border-foreground bg-background px-2 py-1 text-left text-xs",
66266
- onClick: chooseFromClick(defaultBackgroundOverrideForMode("default", capability)),
66267
- children: [/* @__PURE__ */ jsx(BackgroundPreviewSwatch, {
66268
- override: current,
66269
- imagePool: images
66270
- }), /* @__PURE__ */ jsx("span", { children: "Default background" })]
66271
- }) : null,
66272
- current.kind === "color" ? renderColorOptions() : null,
66518
+ current.kind === "default" || current.kind === "color" ? renderColorOptions() : null,
66273
66519
  current.kind === "gradient" ? renderGradientOptions() : null,
66274
66520
  current.kind === "image" ? renderImageOptions() : null
66275
66521
  ]
@@ -66297,13 +66543,13 @@ function findFirstFieldPath(fields, data, prefix) {
66297
66543
  if (Array.isArray(field.visibleRoles) && !field.visibleRoles.includes("author")) continue;
66298
66544
  const nextPrefix = [...prefix, field.id];
66299
66545
  if (field.type === "group") {
66300
- const groupValue = isRecord(data) ? data[field.id] : void 0;
66546
+ const groupValue = isRecord$1(data) ? data[field.id] : void 0;
66301
66547
  const nested = findFirstFieldPath(field.schema.fields, groupValue, nextPrefix);
66302
66548
  if (nested) return nested;
66303
66549
  continue;
66304
66550
  }
66305
66551
  if (field.type === "repeater" && field.schema) {
66306
- const collection = isRecord(data) ? data[field.id] : void 0;
66552
+ const collection = isRecord$1(data) ? data[field.id] : void 0;
66307
66553
  const items = isUnknownArray(collection) ? collection : [];
66308
66554
  if (items.length > 0) {
66309
66555
  const firstItem = items[0];
@@ -66831,6 +67077,35 @@ function EditablePageRenderer(props) {
66831
67077
  uiStore,
66832
67078
  renderStateVersion
66833
67079
  ]) ?? pageRendererProps.page;
67080
+ const runtimeBoundaries = useMemo(() => retargetRuntimeBoundariesForRenderPage(runtimeProjection?.boundaries ?? pageRendererProps.runtimeBoundaries ?? [], renderPage), [
67081
+ pageRendererProps.runtimeBoundaries,
67082
+ renderPage,
67083
+ runtimeProjection
67084
+ ]);
67085
+ const renderedBlockById = useMemo(() => {
67086
+ return new Map((renderPage?.blocks ?? []).filter((block) => Boolean(block.id)).map((block) => [block.id, block]));
67087
+ }, [renderPage?.blocks]);
67088
+ const wrapBoundaryWithControl = useCallback((boundary, rendered) => {
67089
+ const previousBlock = renderedBlockById.get(boundary.previousBlockId);
67090
+ const nextBlock = renderedBlockById.get(boundary.nextBlockId);
67091
+ const control = !isEntryTemplatePage && previousBlock && nextBlock ? /* @__PURE__ */ jsx(BoundaryControl, {
67092
+ previousBlockId: asDesignBlockId(boundary.previousBlockId),
67093
+ nextBlockId: asDesignBlockId(boundary.nextBlockId),
67094
+ previousBlockKind: previousBlock.kind,
67095
+ nextBlockKind: nextBlock.kind
67096
+ }) : null;
67097
+ const wrapped = pageRendererProps.wrapBoundary ? pageRendererProps.wrapBoundary(boundary, rendered) : rendered;
67098
+ return /* @__PURE__ */ jsxs("div", {
67099
+ className: "relative",
67100
+ "data-preview-boundary-wrapper": "",
67101
+ "data-boundary-id": boundary.boundaryId,
67102
+ children: [wrapped, control]
67103
+ });
67104
+ }, [
67105
+ isEntryTemplatePage,
67106
+ pageRendererProps.wrapBoundary,
67107
+ renderedBlockById
67108
+ ]);
66834
67109
  const wrapBlockWithProvider = useCallback((blockId, rendered) => {
66835
67110
  const renderedBlocks = renderPage?.blocks ?? [];
66836
67111
  const controllerBlockIndex = blockItemsForRender.findIndex((b) => b.id === blockId);
@@ -66838,9 +67113,6 @@ function EditablePageRenderer(props) {
66838
67113
  const blockIndex = controllerBlockIndex >= 0 ? controllerBlockIndex : renderedBlockIndex;
66839
67114
  const chromeBlocks = controllerBlockIndex >= 0 ? blockItemsForRender : renderedBlocks;
66840
67115
  const block = blockIndex >= 0 ? chromeBlocks[blockIndex] ?? null : null;
66841
- const previousBlock = blockIndex > 0 ? chromeBlocks[blockIndex - 1] ?? null : null;
66842
- const canonicalBlockIndex = blockItems.findIndex((b) => b.id === blockId);
66843
- const canonicalPreviousBlock = canonicalBlockIndex > 0 ? blockItems[canonicalBlockIndex - 1] ?? null : null;
66844
67116
  const editorBlockId = unsafeAsEditorBlockId(blockId);
66845
67117
  if (!block) return /* @__PURE__ */ jsx(EditableBlockProvider, {
66846
67118
  blockId,
@@ -66853,12 +67125,7 @@ function EditablePageRenderer(props) {
66853
67125
  children: /* @__PURE__ */ jsxs(Fragment$1, { children: [rendered, /* @__PURE__ */ jsxs(Fragment$1, { children: [blockHasPreviewContentFieldProjection(editorBlockId, aiProjections) ? /* @__PURE__ */ jsx("span", {
66854
67126
  className: "pointer-events-none absolute left-2 top-2 z-10 rounded-full bg-amber-500/90 px-2 py-0.5 text-[10px] font-semibold uppercase text-white shadow",
66855
67127
  children: "AI"
66856
- }) : null, !isEntryTemplatePage ? /* @__PURE__ */ jsxs(Fragment$1, { children: [previousBlock?.id && canonicalPreviousBlock?.id === previousBlock.id ? /* @__PURE__ */ jsx(BoundaryControl, {
66857
- previousBlockId: asDesignBlockId(previousBlock.id),
66858
- nextBlockId: asDesignBlockId(blockId),
66859
- previousBlockKind: previousBlock.kind,
66860
- nextBlockKind: block.kind
66861
- }) : null, /* @__PURE__ */ jsx(BlockToolbar, {
67128
+ }) : null, !isEntryTemplatePage ? /* @__PURE__ */ jsx(BlockToolbar, {
66862
67129
  blockId,
66863
67130
  blockKind: block.kind,
66864
67131
  content,
@@ -66869,11 +67136,10 @@ function EditablePageRenderer(props) {
66869
67136
  blockIndex,
66870
67137
  headerClearance
66871
67138
  })
66872
- })] }) : null] })] })
67139
+ }) : null] })] })
66873
67140
  });
66874
67141
  }, [
66875
67142
  aiProjections,
66876
- blockItems,
66877
67143
  blockItemsForRender,
66878
67144
  headerClearance,
66879
67145
  isEntryTemplatePage,
@@ -66891,13 +67157,34 @@ function EditablePageRenderer(props) {
66891
67157
  return /* @__PURE__ */ jsx(PageRenderer, {
66892
67158
  ...pageRendererProps,
66893
67159
  page: renderPage,
67160
+ runtimeBoundaries,
66894
67161
  registry: allowInlineEditing ? editorRegistry : pageRendererProps.registry ?? clientComponentRegistry,
66895
67162
  wrapBlock: allowInlineEditing ? wrapBlockWithProvider : pageRendererProps.wrapBlock,
67163
+ wrapBoundary: allowInlineEditing ? wrapBoundaryWithControl : pageRendererProps.wrapBoundary,
66896
67164
  dataContext,
66897
67165
  previewAuthoring,
66898
67166
  usePlaceholders: true
66899
67167
  });
66900
67168
  }
67169
+ function retargetRuntimeBoundariesForRenderPage(boundaries, page) {
67170
+ if (!boundaries?.length) return boundaries;
67171
+ const blockById = new Map(page.blocks.filter((block) => Boolean(block.id)).map((block) => [block.id, block]));
67172
+ return boundaries.map((boundary) => {
67173
+ const currentBlock = blockById.get(boundary.previousBlockId);
67174
+ const nextBlock = blockById.get(boundary.nextBlockId);
67175
+ return retargetCompiledBoundaryRuntimeForContentAdjacency(boundary, {
67176
+ currentContent: renderableBoundaryContent(currentBlock),
67177
+ nextContent: renderableBoundaryContent(nextBlock)
67178
+ });
67179
+ });
67180
+ }
67181
+ function renderableBoundaryContent(block) {
67182
+ const source = block?.draftContent ?? block?.content ?? null;
67183
+ return isRecord(source) ? source : null;
67184
+ }
67185
+ function isRecord(value) {
67186
+ return typeof value === "object" && value !== null && !Array.isArray(value);
67187
+ }
66901
67188
  function usePreviewBlockResolvedData(args) {
66902
67189
  const { page, dataContext, apiClient } = args;
66903
67190
  const cacheKey = useMemo(() => {