@riverbankcms/sdk 0.90.1 → 0.91.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 (70) hide show
  1. package/dist/{PreviewEditorSidebar-FNFRVSIM.mjs → PreviewEditorSidebar-3TT47WCF.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-3WXJFQXG.mjs → PreviewEditorUI-ORCLLUNZ.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-GMCDQPZZ.mjs +8 -0
  4. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +17 -0
  5. package/dist/_dts/core/src/string.d.ts +12 -0
  6. package/dist/_dts/sdk/src/cli/sync/validation.d.ts +2 -2
  7. package/dist/_dts/sdk/src/version.d.ts +1 -1
  8. package/dist/{chunk-SYYJZPKU.mjs → chunk-AFPMCLS7.mjs} +2 -2
  9. package/dist/{chunk-H6TT5ZXI.mjs → chunk-GDT2QGIL.mjs} +1 -1
  10. package/dist/{chunk-CR2VX432.mjs → chunk-RQUZYSES.mjs} +48 -36
  11. package/dist/{chunk-FA6LVZ7C.mjs → chunk-S3YHJWEU.mjs} +7 -7
  12. package/dist/{chunk-UG7I7S7W.mjs → chunk-U5YM4AWE.mjs} +1 -1
  13. package/dist/{chunk-BOQXMCSP.mjs → chunk-ZA2S7H34.mjs} +3 -3
  14. package/dist/cli/index.mjs +204 -335
  15. package/dist/cli/init-docs/content/workflow-add-block.md +48 -0
  16. package/dist/cli/init-docs/content/workflow-custom-block.md +10 -0
  17. package/dist/client/{accordion-4K7VGZ3I.mjs → accordion-AFX37652.mjs} +2 -2
  18. package/dist/client/{bookingForm-3QXA3CIS.mjs → bookingForm-32V5QCOW.mjs} +6 -6
  19. package/dist/client/bookings.mjs +16 -15
  20. package/dist/client/{carousel-BEJKNGQ7.mjs → carousel-TJGQJ7ER.mjs} +3 -3
  21. package/dist/client/{cart-44BBM6XG.mjs → cart-JUU2JEW4.mjs} +6 -6
  22. package/dist/client/{checkout-THMHEYKF.mjs → checkout-RD6BTFX4.mjs} +6 -6
  23. package/dist/client/{chunk-JV7ZNAOU.mjs → chunk-6QZIBNGV.mjs} +8 -8
  24. package/dist/client/{chunk-DQIRKNZE.mjs → chunk-6RN62XBV.mjs} +1 -1
  25. package/dist/client/{chunk-ZIAF2DA4.mjs → chunk-C4LP6BPG.mjs} +1 -1
  26. package/dist/client/{chunk-SLY6UDAS.mjs → chunk-CKXEUWWA.mjs} +2 -2
  27. package/dist/client/{chunk-5AJIMWKS.mjs → chunk-E6VIWZUG.mjs} +3 -3
  28. package/dist/client/{chunk-PEDNDLPB.mjs → chunk-FMZZHAIR.mjs} +2 -2
  29. package/dist/client/{chunk-KNTLBQ3N.mjs → chunk-ISAUXU5R.mjs} +1 -1
  30. package/dist/client/{chunk-HIHOQGIP.mjs → chunk-LJCX6V7Q.mjs} +9 -9
  31. package/dist/client/{chunk-B4H6QMPY.mjs → chunk-MLBNVN4H.mjs} +7 -5
  32. package/dist/client/{chunk-EJBHK74Y.mjs → chunk-PMNAV6LO.mjs} +1 -1
  33. package/dist/client/{chunk-4COPESPO.mjs → chunk-RMOFBBNA.mjs} +5 -5
  34. package/dist/client/{chunk-3H5CLFKT.mjs → chunk-RWYFG625.mjs} +9 -8
  35. package/dist/client/client.mjs +34 -31
  36. package/dist/client/{courseRegistration-URX7RCCK.mjs → courseRegistration-X63QAIVV.mjs} +6 -6
  37. package/dist/client/{eventCalendar-GTENOQCE.mjs → eventCalendar-5T24GCZL.mjs} +9 -9
  38. package/dist/client/{eventCombined-EZVB72MF.mjs → eventCombined-AZVTF22X.mjs} +9 -9
  39. package/dist/client/{eventDetails-CH4BJR5Z.mjs → eventDetails-7GPFNLGF.mjs} +9 -9
  40. package/dist/client/{eventListing-4BVOI5HS.mjs → eventListing-QEUMTMUM.mjs} +9 -9
  41. package/dist/client/{eventRegistration-37LPIKIE.mjs → eventRegistration-P2EDKCQZ.mjs} +9 -9
  42. package/dist/client/{form-FX3Y54YK.mjs → form-NUJ7H4IN.mjs} +3 -3
  43. package/dist/client/{headerSection-UOZZGVYL.mjs → headerSection-JB7LECPL.mjs} +3 -3
  44. package/dist/client/hooks.mjs +7 -7
  45. package/dist/client/{locationMap-VSIPKV35.mjs → locationMap-UEYWUCSW.mjs} +3 -3
  46. package/dist/client/{newsletterForm-6FRJKNAF.mjs → newsletterForm-S2YZQ2X7.mjs} +3 -3
  47. package/dist/client/{productDetail-6AHMLXCO.mjs → productDetail-H5MADGG7.mjs} +6 -6
  48. package/dist/client/{productList-M2CYIZVH.mjs → productList-DK7YON7H.mjs} +6 -6
  49. package/dist/client/rendering/client.mjs +31 -28
  50. package/dist/client/rendering/islands.mjs +19 -19
  51. package/dist/client/rendering.mjs +33 -30
  52. package/dist/client/{shop-AUOT6GEX.mjs → shop-6PA7RDRJ.mjs} +6 -6
  53. package/dist/client/spam-protection.mjs +10 -10
  54. package/dist/preview-next/client/runtime.mjs +5 -5
  55. package/dist/{sdk-runtime-6GPJNLU6.mjs → sdk-runtime-JP5347OB.mjs} +6 -6
  56. package/dist/server/components.mjs +13 -11
  57. package/dist/server/config-validation.mjs +7 -7
  58. package/dist/server/config.mjs +7 -7
  59. package/dist/server/data.mjs +7 -7
  60. package/dist/server/index.mjs +1 -1
  61. package/dist/server/navigation.mjs +2 -2
  62. package/dist/server/next.mjs +14 -12
  63. package/dist/server/page-converter.mjs +5 -5
  64. package/dist/server/prebuild.mjs +1 -1
  65. package/dist/server/rendering/server.mjs +13 -11
  66. package/dist/server/rendering.mjs +13 -11
  67. package/dist/server/routing.mjs +14 -14
  68. package/dist/server/server.mjs +8 -8
  69. package/package.json +1 -1
  70. package/dist/SdkPreviewModeRuntime-2UCIMKUB.mjs +0 -8
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { resolvePreviewDashboardSetupHandoff, buildPreviewDashboardSetupUrl, resolvePreviewSidebarChromeModel, resolvePreviewEditorGuidanceModel, previewWidgetOverrides, canInspectSiteStyle, mapContentSchemaToFormFields, PreviewFormProvider, usePreviewBlockCustomizeSelectionOptional, BlockEditor, canApplySiteStyle, useBlockCustomizeControls, MAX_QUICK_MANIFEST_FIELDS } from './chunk-H6TT5ZXI.mjs';
3
- import { useEntryController, useEditorUiStoreInstance, useUISelector, resolvePreviewSidebarTab, unsafeAsEditorBlockId, Tabs, TabsList, TabsTrigger, Button, X, TabsContent, useEditorUiStore, deriveRouteMetadataPresentation, resolvePageRouteSlug, createManifestValidation, createStoreBackend, ManifestForm, previewAssistantEnabled, Collapsible, CollapsibleTrigger, ChevronRight, CollapsibleContent, ContentFieldsForm, usePreviewDesignCoordinator, useSiteChromeCustomizeOptional, resolveStyleConfiguratorInitialSnapshot, createStyleConfiguratorState, isPreviewingChange, createOptimisticActionRunner, syncStyleConfiguratorState, getCuratedSiteStyle, planSiteStylePreviewChange, openRow, previewSiteStyle, applyResolvedSelections, previewButtonPersonality, previewHeaderLayout, previewHeaderStyle, planSiteChromeLookSelection, previewFooterLook, buildSiteChromeLookModels, planSiteChromeFooterLayoutSelection, previewPaletteVariant, previewTypographyPreset, setTypographyBodyFontOverride, setTypographyHeadingFontOverride, clearTypographyFontOverrides, paletteOverridesSchema, setPaletteOverrides, toggleRow, cancelPreview, dismissWarnings, dismissNotices, deriveStyleConfiguratorCapabilities, buildApplySiteStyleSelectionBody, markApplyFailed, selectionSnapshotFromApplySiteStyleSelectionResponse, styleConfiguratorHistoryEntryForPersistedSelection, markApplySaved, unwrapResponse, markApplySaving, findButtonPersonality, findPaletteVariant, findTypographyPreset, getHeaderLayout, getHeaderStyle, getFooterLayout, findFooterLook, cycleSiteChromeLookId, resolveContentTitle, foldSubroute, SUBROUTE_KINDS, Smartphone, Tablet, Monitor, Maximize2, cn, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuItem, listEntryPageContentSlots, ContentSpinner, Callout, CalloutDescription, curatedSiteStyles, ChevronLeft, cycleableSiteChromeOptions, requireEntriesForCuratedChoices, buttonPersonalities, typographyPresets, paletteVariants, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, FormRenderer, evaluateTypographyFontSlot, Separator, Surface, ColorPicker, Input } from './chunk-CR2VX432.mjs';
4
- import { usePreviewAuth, getDashboardUrl } from './chunk-BOQXMCSP.mjs';
2
+ import { resolvePreviewDashboardSetupHandoff, buildPreviewDashboardSetupUrl, resolvePreviewSidebarChromeModel, resolvePreviewEditorGuidanceModel, previewWidgetOverrides, canInspectSiteStyle, mapContentSchemaToFormFields, PreviewFormProvider, usePreviewBlockCustomizeSelectionOptional, BlockEditor, canApplySiteStyle, useBlockCustomizeControls, MAX_QUICK_MANIFEST_FIELDS } from './chunk-GDT2QGIL.mjs';
3
+ import { useEntryController, useEditorUiStoreInstance, useUISelector, resolvePreviewSidebarTab, unsafeAsEditorBlockId, Tabs, TabsList, TabsTrigger, Button, X, TabsContent, useEditorUiStore, deriveRouteMetadataPresentation, resolvePageRouteSlug, createManifestValidation, createStoreBackend, ManifestForm, previewAssistantEnabled, Collapsible, CollapsibleTrigger, ChevronRight, CollapsibleContent, ContentFieldsForm, usePreviewDesignCoordinator, useSiteChromeCustomizeOptional, resolveStyleConfiguratorInitialSnapshot, createStyleConfiguratorState, isPreviewingChange, createOptimisticActionRunner, syncStyleConfiguratorState, getCuratedSiteStyle, planSiteStylePreviewChange, openRow, previewSiteStyle, applyResolvedSelections, previewButtonPersonality, previewHeaderLayout, previewHeaderStyle, planSiteChromeLookSelection, previewFooterLook, buildSiteChromeLookModels, planSiteChromeFooterLayoutSelection, previewPaletteVariant, previewTypographyPreset, setTypographyBodyFontOverride, setTypographyHeadingFontOverride, clearTypographyFontOverrides, paletteOverridesSchema, setPaletteOverrides, toggleRow, cancelPreview, dismissWarnings, dismissNotices, deriveStyleConfiguratorCapabilities, buildApplySiteStyleSelectionBody, markApplyFailed, selectionSnapshotFromApplySiteStyleSelectionResponse, styleConfiguratorHistoryEntryForPersistedSelection, markApplySaved, unwrapResponse, markApplySaving, findButtonPersonality, findPaletteVariant, findTypographyPreset, getHeaderLayout, getHeaderStyle, getFooterLayout, findFooterLook, cycleSiteChromeLookId, resolveContentTitle, foldSubroute, SUBROUTE_KINDS, Smartphone, Tablet, Monitor, Maximize2, cn, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuItem, listEntryPageContentSlots, ContentSpinner, Callout, CalloutDescription, curatedSiteStyles, ChevronLeft, cycleableSiteChromeOptions, requireEntriesForCuratedChoices, buttonPersonalities, typographyPresets, paletteVariants, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, FormRenderer, evaluateTypographyFontSlot, Separator, Surface, ColorPicker, Input } from './chunk-RQUZYSES.mjs';
4
+ import { usePreviewAuth, getDashboardUrl } from './chunk-ZA2S7H34.mjs';
5
5
  import './chunk-R7POPVJR.mjs';
6
6
  import { useMemo, useRef, useCallback, useEffect, useState, useTransition, useLayoutEffect, useSyncExternalStore, useId } from 'react';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { resolvePreviewChromeSurface, usePreviewPageDesignEditorState, PREVIEW_CHROME_PORTAL_CLASS_NAME, PREVIEW_CHROME_THEME_CLASS_NAME, applyPreviewChromeSurfaceToElement, setPreviewSidebarTab } from './chunk-SYYJZPKU.mjs';
3
- import { useEntryEditorController, useEditorUiStore, useMultiAutosave, usePreviewDesignHistoryOrder, useSiteChromeCustomizeOptional, selectPreviewDesignHistoryDomain, EditorChrome, previewDesignHistoryDomainForCommand, classifyHistoryShortcut, previewAssistantEnabled, unwrapResponse, cn, Dialog, Button, Palette, DialogContent, DialogHeader, DialogTitle, DialogDescription, TriangleAlert, Pencil, Sparkles, useEditorUiStoreInstance } from './chunk-CR2VX432.mjs';
4
- import { usePreviewAuth } from './chunk-BOQXMCSP.mjs';
2
+ import { resolvePreviewChromeSurface, usePreviewPageDesignEditorState, PREVIEW_CHROME_PORTAL_CLASS_NAME, PREVIEW_CHROME_THEME_CLASS_NAME, applyPreviewChromeSurfaceToElement, setPreviewSidebarTab } from './chunk-AFPMCLS7.mjs';
3
+ import { useEntryEditorController, useEditorUiStore, useMultiAutosave, usePreviewDesignHistoryOrder, useSiteChromeCustomizeOptional, selectPreviewDesignHistoryDomain, EditorChrome, previewDesignHistoryDomainForCommand, classifyHistoryShortcut, previewAssistantEnabled, unwrapResponse, cn, Dialog, Button, Palette, DialogContent, DialogHeader, DialogTitle, DialogDescription, TriangleAlert, Pencil, Sparkles, useEditorUiStoreInstance } from './chunk-RQUZYSES.mjs';
4
+ import { usePreviewAuth } from './chunk-ZA2S7H34.mjs';
5
5
  import './chunk-R7POPVJR.mjs';
6
6
  import { useState, useMemo, useCallback, useEffect, useTransition } from 'react';
7
7
  import { createPortal } from 'react-dom';
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ export { SdkPreviewModeRuntime } from './chunk-S3YHJWEU.mjs';
3
+ import './chunk-U5YM4AWE.mjs';
4
+ import './chunk-GDT2QGIL.mjs';
5
+ import './chunk-AFPMCLS7.mjs';
6
+ import './chunk-RQUZYSES.mjs';
7
+ import './chunk-ZA2S7H34.mjs';
8
+ import './chunk-R7POPVJR.mjs';
@@ -134,6 +134,20 @@ type BaseIssue<K extends string, Extra extends object = Record<never, never>> =
134
134
  fieldId: string;
135
135
  label: string;
136
136
  }> & Readonly<Extra>;
137
+ export type ManifestContentRequiredScope = "topLevel" | "nested";
138
+ export type ManifestContentValidationIssue = Readonly<{
139
+ kind: FieldValidationIssue["kind"];
140
+ field: string;
141
+ message: string;
142
+ requiredScope: ManifestContentRequiredScope | null;
143
+ }>;
144
+ export type ManifestContentValidationResult = Readonly<{
145
+ kind: "valid";
146
+ issues: readonly [];
147
+ }> | Readonly<{
148
+ kind: "invalid";
149
+ issues: readonly ManifestContentValidationIssue[];
150
+ }>;
137
151
  type PlanBase<K extends string, ValueKind extends string, Constraints extends FieldConstraint> = Readonly<{
138
152
  kind: K;
139
153
  valueKind: ValueKind;
@@ -213,6 +227,9 @@ export declare function validateFieldValue(plan: FieldValidationPlan, value: unk
213
227
  export declare function fieldPlanToZod(plan: FieldValidationPlan, options?: FieldValidationOptions): z.ZodTypeAny;
214
228
  export declare function resolveFieldValidationDescriptor(plans: readonly FieldValidationPlan[], path: FieldPath): FieldValidationDescriptor | null;
215
229
  export declare function validateManifestValues(fields: readonly FieldDefinition[], values: Record<string, unknown>, options?: FieldValidationOptions): FieldValidationIssue[];
230
+ export declare function validateManifestContentForPush(fields: readonly FieldDefinition[], values: Record<string, unknown>, options?: FieldValidationOptions): ManifestContentValidationResult;
231
+ export declare function isTopLevelRequiredManifestContentIssue(issue: ManifestContentValidationIssue): boolean;
232
+ export declare function formatManifestContentValidationIssue(issue: ManifestContentValidationIssue): string;
216
233
  export declare function isCanonicalEmailValue(value: string): boolean;
217
234
  export declare function isCanonicalPhoneValue(value: string): boolean;
218
235
  export declare function isCanonicalUrlValue(value: string, options?: Readonly<{
@@ -9,6 +9,18 @@ export declare function asNullableString(value: unknown): string | null;
9
9
  * Return a non-empty string value, otherwise null.
10
10
  */
11
11
  export declare function asNonEmptyStringOrNull(value: unknown): string | null;
12
+ /**
13
+ * Narrow nullable values to the present value.
14
+ */
15
+ export declare function isPresent<T>(value: T | null | undefined): value is T;
16
+ /**
17
+ * Return true for string values that contain at least one character.
18
+ */
19
+ export declare function isNonEmptyString(value: unknown): value is string;
20
+ /**
21
+ * Narrow optional string values to non-empty strings.
22
+ */
23
+ export declare function hasText(value: string | null | undefined): value is string;
12
24
  /**
13
25
  * Trim a user-entered string and collapse blank values to null.
14
26
  */
@@ -39,10 +39,10 @@ export declare function extractFieldIds(fields: readonly FieldDefinition[]): Set
39
39
  */
40
40
  export declare function extractRequiredFieldIds(fields: readonly FieldDefinition[]): Set<string>;
41
41
  /**
42
- * Validate block content values against the manifest schema using Zod.
42
+ * Validate block content values against the shared manifest push policy.
43
43
  *
44
44
  * This catches type mismatches, malformed structures, and invalid values
45
- * that would cause runtime errors when rendering blocks.
45
+ * that would be rejected by SDK block writes.
46
46
  *
47
47
  * @param data - The block data to validate
48
48
  * @param manifest - The block manifest with field definitions
@@ -8,4 +8,4 @@
8
8
  * 1. This constant
9
9
  * 2. The "version" field in package.json
10
10
  */
11
- export declare const SDK_VERSION = "0.90.1";
11
+ export declare const SDK_VERSION = "0.91.0";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { assertNever2, usePreviewDesignHistoryOrder, useOptionalEditorUiStoreInstance, getPageDesignEditorState, PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE, unwrapResponse, useDebouncedLatestSave, AMBIENT_BACKGROUND_ROLES, applyPageDesignEditorAction, resolvePreviewSidebarTab, confirmAutosaveBatch, beginAutosaveBatch, enqueueTransaction, applyBackgroundOverrideContentPatch, systemCustomizeFacetDefinitionForBlock, systemCustomizeFacetRollbackContentPatch, systemCustomizeFacetApplyContentPatch, unsafeAsEditorBlockId, createHistoryState, rejectAutosaveBatch, redoHistory, undoHistory, pushHistoryEntry, idleEditorTransactionQueueState, canRedoHistory, deriveTransactionCapabilities, canUndoHistory, backgroundOverrideEquals, attachRenderableMediaAssetFields, planPageDesignLayoutLookCompatibility, unsafeAsEditorBlockValues } from './chunk-CR2VX432.mjs';
3
- import { ApiRequestError, resolveSurfaceDocumentAttributes, SURFACE_DOCUMENT_DATA_ATTRIBUTE, SURFACE_IDS } from './chunk-BOQXMCSP.mjs';
2
+ import { assertNever2, usePreviewDesignHistoryOrder, useOptionalEditorUiStoreInstance, getPageDesignEditorState, PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE, unwrapResponse, useDebouncedLatestSave, AMBIENT_BACKGROUND_ROLES, applyPageDesignEditorAction, resolvePreviewSidebarTab, confirmAutosaveBatch, beginAutosaveBatch, enqueueTransaction, applyBackgroundOverrideContentPatch, systemCustomizeFacetDefinitionForBlock, systemCustomizeFacetRollbackContentPatch, systemCustomizeFacetApplyContentPatch, unsafeAsEditorBlockId, createHistoryState, rejectAutosaveBatch, redoHistory, undoHistory, pushHistoryEntry, idleEditorTransactionQueueState, canRedoHistory, deriveTransactionCapabilities, canUndoHistory, backgroundOverrideEquals, attachRenderableMediaAssetFields, planPageDesignLayoutLookCompatibility, unsafeAsEditorBlockValues } from './chunk-RQUZYSES.mjs';
3
+ import { ApiRequestError, resolveSurfaceDocumentAttributes, SURFACE_DOCUMENT_DATA_ATTRIBUTE, SURFACE_IDS } from './chunk-ZA2S7H34.mjs';
4
4
  import { createContext, useState, useRef, useEffect, useMemo, useLayoutEffect, useContext } from 'react';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { KeyboardCode, getBlockDefinition, CSS, useSdkConfig, unwrapResponse, parseSiteIconStyleGuideVersionId, parseBlockIconValue, listBlockDescriptors, useSensor, PointerSensor, useSensors, createEditorRemoveBlockCommand, unsafeAsEditorBlockId, DndContext, closestCenter, Button, Plus, useDroppable, useDraggable, useCombinedRefs, isKeyboardEvent, createCustomBlockRegistry, Card, cn, Collapsible, CollapsibleContent, listContentTypes, mergeBlockDescriptorsWithRegistry, createEditorReorderBlocksCommand, mutateBlockContent, deleteEntrySlotBlock, deleteBlock, useDndContext, useUniqueId, useIsomorphicLayoutEffect, EmptyState, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Search, getClientRect, resolveBlockTitle, CardHeader, GripVertical, ChevronRight, CardTitle, ArrowUp, ArrowDown, DropdownMenu, DropdownMenuTrigger, EllipsisVertical, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuItem, Copy, Trash2, DialogFooter, DialogClose, CardContent, createEntrySlotBlock, createBlock, createEditorInsertBlockCommand, reorderEntrySlotBlocks, reorderBlocks, LoaderCircle, ChevronDown, getFeatureCardIconCompletion, toFeatureCardIconSuggestionInputs, getBlockIconSemanticFallbackId, suggestSemanticIconForFeatureCard, getGeneratedBlockIconStyleState, assertNever, createManifestFormAdapter, getModalConfig, createStoreBackend, validateBlockManifestIssues, isNonEmptyValue, Settings, ScrollableDialogContent, FormRenderer, Tabs, TabsList, TabsTrigger, TabsContent, RotateCcw, ImagePlus, Sparkles, Textarea, Callout, CalloutDescription, normalEditorCuratedPromotedFieldPaths, resolveVisiblePromotedFieldPathsForEditorBlock, CalloutTitle, unfinishedBlockCopy, recoveryConflictCopy, ManifestForm, unsafeAsEditorBlockValues, Box, mergeManifestWithSdkOptions, augmentManifestWithStyleGroups, suggestFeatureCardSemanticIcons, applyFeatureCardIconSuggestions, createFeatureCardIconKey, lucide_react_exports, isThemeV2NormalEditorRawStylePath, getFieldIntent, isHeaderField, isThemeV2NormalEditorRawStyleFieldName, BackgroundGradientField, BackgroundColorField, useField, FieldFrame, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, useMediaEditorOptional, useRichTextEditor, RichTextEditorSurface, ThemeScope, isObjectRecord, EMPTY_DOC, useAsyncPickerOptions, resolvePickerSelectionLabel, shouldShowPickerSearch, normalizePickerSearchThreshold, Combobox, Badge, useBlockContext, resolveMediaSlotContract, asRecord, parseAspectRatioValue, MediaEditor, PUBLIC_FILE_FIELD_KINDS, useBackendWatch, resolveIconPickerPreset, isIconPickerPreset, getIconPickerOptionsForPreset, isKnownIconName, getIconComponent, isOfferingsPreviewSourceKey, EyeOff, CommandMultiSelect, expectParsedBrandedId, parseSiteId, buildThemeRuntime, SdkConfigProvider, PaletteProvider, MediaEditorProvider, useEditorUiStoreInstance, useUISelector, getRichTextImagePositionFromTarget, insertOrReplaceRichTextImage, emitMediaCropDebug, Pencil, resolveVideoSelectionIntentForMediaField, resolveOfferingsPreviewGroupOrderEntries, normalizeOfferingsPreviewGroupOrder, inferLegacyOfferingsPreviewGroupOrder, siteOptionSources, evaluateVisibility, Root2, List, Trigger, Content, Input, Check, Label, isInternalResolvedLinkValue, resolveImageUrlWithContext, useMediaEditor, MediaPickerMini, MediaPickerDialog, toRoutableLinkPayload, classifyKnownMimeType, getDirectImageUrlForMediaAsset, isSvgMimeType } from './chunk-CR2VX432.mjs';
2
+ import { KeyboardCode, getBlockDefinition, CSS, useSdkConfig, unwrapResponse, parseSiteIconStyleGuideVersionId, parseBlockIconValue, listBlockDescriptors, useSensor, PointerSensor, useSensors, createEditorRemoveBlockCommand, unsafeAsEditorBlockId, DndContext, closestCenter, Button, Plus, useDroppable, useDraggable, useCombinedRefs, isKeyboardEvent, createCustomBlockRegistry, Card, cn, Collapsible, CollapsibleContent, listContentTypes, mergeBlockDescriptorsWithRegistry, createEditorReorderBlocksCommand, mutateBlockContent, deleteEntrySlotBlock, deleteBlock, useDndContext, useUniqueId, useIsomorphicLayoutEffect, EmptyState, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Search, getClientRect, resolveBlockTitle, CardHeader, GripVertical, ChevronRight, CardTitle, ArrowUp, ArrowDown, DropdownMenu, DropdownMenuTrigger, EllipsisVertical, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuItem, Copy, Trash2, DialogFooter, DialogClose, CardContent, createEntrySlotBlock, createBlock, createEditorInsertBlockCommand, reorderEntrySlotBlocks, reorderBlocks, LoaderCircle, ChevronDown, getFeatureCardIconCompletion, toFeatureCardIconSuggestionInputs, getBlockIconSemanticFallbackId, suggestSemanticIconForFeatureCard, getGeneratedBlockIconStyleState, assertNever, createManifestFormAdapter, getModalConfig, createStoreBackend, validateBlockManifestIssues, isNonEmptyValue, Settings, ScrollableDialogContent, FormRenderer, Tabs, TabsList, TabsTrigger, TabsContent, RotateCcw, ImagePlus, Sparkles, Textarea, Callout, CalloutDescription, normalEditorCuratedPromotedFieldPaths, resolveVisiblePromotedFieldPathsForEditorBlock, CalloutTitle, unfinishedBlockCopy, recoveryConflictCopy, ManifestForm, unsafeAsEditorBlockValues, Box, mergeManifestWithSdkOptions, augmentManifestWithStyleGroups, suggestFeatureCardSemanticIcons, applyFeatureCardIconSuggestions, createFeatureCardIconKey, lucide_react_exports, isThemeV2NormalEditorRawStylePath, getFieldIntent, isHeaderField, isThemeV2NormalEditorRawStyleFieldName, BackgroundGradientField, BackgroundColorField, useField, FieldFrame, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, useMediaEditorOptional, useRichTextEditor, RichTextEditorSurface, ThemeScope, isObjectRecord, EMPTY_DOC, useAsyncPickerOptions, resolvePickerSelectionLabel, shouldShowPickerSearch, normalizePickerSearchThreshold, Combobox, Badge, useBlockContext, resolveMediaSlotContract, asRecord, parseAspectRatioValue, MediaEditor, PUBLIC_FILE_FIELD_KINDS, useBackendWatch, resolveIconPickerPreset, isIconPickerPreset, getIconPickerOptionsForPreset, isKnownIconName, getIconComponent, isOfferingsPreviewSourceKey, EyeOff, CommandMultiSelect, expectParsedBrandedId, parseSiteId, buildThemeRuntime, SdkConfigProvider, PaletteProvider, MediaEditorProvider, useEditorUiStoreInstance, useUISelector, getRichTextImagePositionFromTarget, insertOrReplaceRichTextImage, emitMediaCropDebug, Pencil, resolveVideoSelectionIntentForMediaField, resolveOfferingsPreviewGroupOrderEntries, normalizeOfferingsPreviewGroupOrder, inferLegacyOfferingsPreviewGroupOrder, siteOptionSources, evaluateVisibility, Root2, List, Trigger, Content, Input, Check, Label, isInternalResolvedLinkValue, resolveImageUrlWithContext, useMediaEditor, MediaPickerMini, MediaPickerDialog, toRoutableLinkPayload, classifyKnownMimeType, getDirectImageUrlForMediaAsset, isSvgMimeType } from './chunk-RQUZYSES.mjs';
3
3
  import React, { createContext, memo, useMemo, useState, useRef, useEffect, forwardRef, useCallback, useImperativeHandle, useContext, useSyncExternalStore, useLayoutEffect, Fragment as Fragment$1, useReducer } from 'react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { ApiRequestError } from './chunk-BOQXMCSP.mjs';
2
+ import { ApiRequestError } from './chunk-ZA2S7H34.mjs';
3
3
  import { __commonJS, __export, __toESM } from './chunk-R7POPVJR.mjs';
4
4
  import * as React61 from 'react';
5
5
  import React61__default, { createContext, forwardRef, useContext, createElement, useRef, useMemo, useEffect, useState, useCallback, useImperativeHandle, useLayoutEffect, memo, createRef, Component as Component$1, useDebugValue, useId as useId$1, useSyncExternalStore, isValidElement, cloneElement, useReducer, startTransition } from 'react';
@@ -385,10 +385,11 @@ function omitZeroAmountFutureRows(rows) {
385
385
  if (rows.length <= 1) {
386
386
  return rows;
387
387
  }
388
- const [firstRow, ...futureRows] = rows;
389
- if (!firstRow) {
388
+ const firstRow = rows[0];
389
+ if (firstRow === void 0) {
390
390
  return [];
391
391
  }
392
+ const futureRows = rows.slice(1);
392
393
  return [
393
394
  firstRow,
394
395
  ...futureRows.filter((row) => row.amountCents > 0)
@@ -431,11 +432,11 @@ function isValidTimeZone(timeZone) {
431
432
  }
432
433
  function getSafeTimeZone(timeZone) {
433
434
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
434
- return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
435
+ return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
435
436
  }
436
437
  function parseStrictBookingTimeZone(timeZone) {
437
438
  const normalized = timeZone.trim();
438
- if (!normalized || !isValidTimeZone(normalized)) {
439
+ if (normalized.length === 0 || !isValidTimeZone(normalized)) {
439
440
  return null;
440
441
  }
441
442
  return normalized;
@@ -522,7 +523,7 @@ function parseScheduledBookingDateTime(input) {
522
523
  try {
523
524
  const startsAt = toUtcIsoDateTimeString(input.startsAt);
524
525
  const timeZone = parseStrictBookingTimeZone(input.timeZone);
525
- if (!timeZone) {
526
+ if (timeZone === null) {
526
527
  return {
527
528
  ok: false,
528
529
  field: "timeZone",
@@ -661,7 +662,7 @@ function getBookingLocalDateKey(input) {
661
662
  }
662
663
  function parseBookingLocalDate(value) {
663
664
  const match2 = LOCAL_DATE_PATTERN.exec(value.trim());
664
- if (!match2?.groups) {
665
+ if (match2 === null || match2.groups === void 0) {
665
666
  throw new Error(`Invalid booking date format: "${value}" (expected YYYY-MM-DD)`);
666
667
  }
667
668
  const year = Number(match2.groups.year);
@@ -695,10 +696,10 @@ function normalizeLocationAddressText(value) {
695
696
  return null;
696
697
  }
697
698
  const trimmed = value.trim();
698
- return trimmed ? trimmed : null;
699
+ return trimmed.length > 0 ? trimmed : null;
699
700
  }
700
701
  function hasLocationCoordinates(value) {
701
- return typeof value?.lat === "number" && typeof value?.lng === "number";
702
+ return value != null && typeof value.lat === "number" && typeof value.lng === "number";
702
703
  }
703
704
  function toLocationCoordinates(value) {
704
705
  if (!hasLocationCoordinates(value)) {
@@ -62335,7 +62336,7 @@ function formatCalendarTitle(viewDate, view, days, monthNames = MONTH_NAMES) {
62335
62336
  if (view === "week") {
62336
62337
  const weekStart = days[0];
62337
62338
  const weekEnd = days[6];
62338
- if (!weekStart || !weekEnd) {
62339
+ if (weekStart === void 0 || weekEnd === void 0) {
62339
62340
  return `${monthNames[viewDate.getMonth()] ?? ""} ${viewDate.getFullYear()}`;
62340
62341
  }
62341
62342
  const startMonth = monthNames[weekStart.getMonth()] ?? "";
@@ -62441,7 +62442,9 @@ function getLocalDateKey(isoTimestamp, timeZone) {
62441
62442
  const year = parts.find((part) => part.type === "year")?.value;
62442
62443
  const month = parts.find((part) => part.type === "month")?.value;
62443
62444
  const day = parts.find((part) => part.type === "day")?.value;
62444
- if (!year || !month || !day) return null;
62445
+ if (year === void 0 || year.length === 0) return null;
62446
+ if (month === void 0 || month.length === 0) return null;
62447
+ if (day === void 0 || day.length === 0) return null;
62445
62448
  return `${year}-${month}-${day}`;
62446
62449
  }
62447
62450
  var validTimeZoneCache = /* @__PURE__ */ new Map();
@@ -62698,7 +62701,7 @@ function enumerateDateKeys(startDateKey, endDateKey) {
62698
62701
  }
62699
62702
  function parseDateKey(dateKey) {
62700
62703
  const match2 = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateKey);
62701
- if (!match2) {
62704
+ if (match2 === null) {
62702
62705
  throw new Error(`Invalid timetable date key: ${dateKey}`);
62703
62706
  }
62704
62707
  const [, year, month, day] = match2;
@@ -62718,7 +62721,7 @@ function groupItemsByDate(items, accessors) {
62718
62721
  const dateKey = getLocalDateKey(startsAt, timeZone);
62719
62722
  if (dateKey == null) continue;
62720
62723
  const existing = grouped.get(dateKey);
62721
- if (existing) {
62724
+ if (existing !== void 0) {
62722
62725
  existing.push(item);
62723
62726
  } else {
62724
62727
  grouped.set(dateKey, [item]);
@@ -71845,11 +71848,11 @@ function extractRouteUpdatedAt(candidate) {
71845
71848
  }
71846
71849
  function resolveRouteTargetForStage(routeIdValue, routes, stageInput) {
71847
71850
  const routeId = typeof routeIdValue === "string" ? routeIdValue : null;
71848
- if (!routeId || !routes) return null;
71851
+ if (routeId === null || routeId.length === 0 || routes === void 0) return null;
71849
71852
  const routeEntry = routes[routeId];
71850
71853
  if (!isRouteVisibleInStage(routeEntry, stageInput)) return null;
71851
71854
  const href = extractRouteHref(routeEntry, stageInput);
71852
- if (!href) return null;
71855
+ if (href === null) return null;
71853
71856
  return {
71854
71857
  routeId,
71855
71858
  href,
@@ -95604,7 +95607,7 @@ function parsePath(path) {
95604
95607
  for (const raw of parts) {
95605
95608
  if (!raw) continue;
95606
95609
  const baseMatch = raw.match(/^[^\[]+/);
95607
- if (baseMatch) {
95610
+ if (baseMatch !== null) {
95608
95611
  const base2 = baseMatch[1] ?? baseMatch[0];
95609
95612
  if (/^\d+$/.test(base2)) {
95610
95613
  segments.push(Number(base2));
@@ -95623,7 +95626,7 @@ function parsePath(path) {
95623
95626
  segments.push(token);
95624
95627
  }
95625
95628
  }
95626
- if (!baseMatch && !raw.includes("[")) {
95629
+ if (baseMatch === null && !raw.includes("[")) {
95627
95630
  segments.push(raw);
95628
95631
  }
95629
95632
  }
@@ -110834,14 +110837,14 @@ CollapsibleContent.displayName = CONTENT_NAME5;
110834
110837
  var CollapsibleContentImpl = React61.forwardRef((props2, forwardedRef) => {
110835
110838
  const { __scopeCollapsible, present, children, ...contentProps } = props2;
110836
110839
  const context = useCollapsibleContext(CONTENT_NAME5, __scopeCollapsible);
110837
- const [isPresent, setIsPresent] = React61.useState(present);
110840
+ const [isPresent2, setIsPresent] = React61.useState(present);
110838
110841
  const ref = React61.useRef(null);
110839
110842
  const composedRefs = useComposedRefs(forwardedRef, ref);
110840
110843
  const heightRef = React61.useRef(0);
110841
110844
  const height = heightRef.current;
110842
110845
  const widthRef = React61.useRef(0);
110843
110846
  const width = widthRef.current;
110844
- const isOpen = context.open || isPresent;
110847
+ const isOpen = context.open || isPresent2;
110845
110848
  const isMountAnimationPreventedRef = React61.useRef(isOpen);
110846
110849
  const originalStylesRef = React61.useRef(void 0);
110847
110850
  React61.useEffect(() => {
@@ -126912,22 +126915,22 @@ function AltchaWidget({
126912
126915
  if (typeof window === "undefined") return;
126913
126916
  let widget = null;
126914
126917
  import('./altcha-EKUEQ4RP.mjs').then(() => {
126915
- if (!containerRef.current) return;
126918
+ if (containerRef.current === null) return;
126916
126919
  widget = document.createElement("altcha-widget");
126917
126920
  widget.setAttribute("challengeurl", challengeUrl);
126918
- if (auto) {
126921
+ if (auto === true) {
126919
126922
  widget.setAttribute("auto", "onload");
126920
126923
  }
126921
- if (hidelogo) {
126924
+ if (hidelogo === true) {
126922
126925
  widget.setAttribute("hidelogo", "true");
126923
126926
  }
126924
126927
  widget.setAttribute("hidefooter", "true");
126925
- if (className) {
126928
+ if (className !== void 0 && className.length > 0) {
126926
126929
  widget.className = className;
126927
126930
  }
126928
126931
  widget.addEventListener("statechange", ((event) => {
126929
126932
  const { state, payload } = event.detail;
126930
- if (state === "verified" && payload) {
126933
+ if (state === "verified" && payload !== void 0 && payload.length > 0) {
126931
126934
  onSolutionChange?.(payload);
126932
126935
  } else if (state === "error" || state === "expired") {
126933
126936
  onSolutionChange?.(null);
@@ -126938,7 +126941,7 @@ function AltchaWidget({
126938
126941
  console.error("Failed to load ALTCHA widget:", err4);
126939
126942
  });
126940
126943
  return () => {
126941
- if (widget && containerRef.current) {
126944
+ if (widget !== null && containerRef.current !== null) {
126942
126945
  containerRef.current.removeChild(widget);
126943
126946
  }
126944
126947
  };
@@ -126979,15 +126982,15 @@ new TextEncoder();
126979
126982
  // ../altcha/src/index.ts
126980
126983
  function getCmsApiUrl() {
126981
126984
  const env = process.env.RIVERBANK_ENV;
126982
- if (env) {
126985
+ if (env !== void 0 && env.length > 0) {
126983
126986
  const envKey = `RIVERBANK_${env.toUpperCase()}_DASHBOARD_URL`;
126984
126987
  const dashboardUrl2 = process.env[envKey];
126985
- if (dashboardUrl2) {
126988
+ if (dashboardUrl2 !== void 0 && dashboardUrl2.length > 0) {
126986
126989
  return `${dashboardUrl2.replace(/\/$/, "")}/api`;
126987
126990
  }
126988
126991
  }
126989
126992
  const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;
126990
- if (dashboardUrl) {
126993
+ if (dashboardUrl !== void 0 && dashboardUrl.length > 0) {
126991
126994
  return `${dashboardUrl.replace(/\/$/, "")}/api`;
126992
126995
  }
126993
126996
  throw new Error("Dashboard URL not configured. Set NEXT_PUBLIC_DASHBOARD_URL");
@@ -149507,6 +149510,15 @@ function fromArray(items) {
149507
149510
  if (first2 === void 0) return err3("empty_array");
149508
149511
  return ok$1([first2, ...rest]);
149509
149512
  }
149513
+ function isPresent(value) {
149514
+ return value !== null && value !== void 0;
149515
+ }
149516
+ function isNonEmptyString(value) {
149517
+ return typeof value === "string" && value.length > 0;
149518
+ }
149519
+ function hasText(value) {
149520
+ return isNonEmptyString(value);
149521
+ }
149510
149522
  var IMAGE_FILE_FORMATS = [
149511
149523
  "jpeg",
149512
149524
  "png",
@@ -149934,14 +149946,14 @@ function assertRelativeStoragePath(value) {
149934
149946
  }
149935
149947
  var pad = (value) => value.toString().padStart(2, "0");
149936
149948
  var extractExtension = (filename) => {
149937
- if (!filename) return "";
149949
+ if (!hasText(filename)) return "";
149938
149950
  const lastDot = filename.lastIndexOf(".");
149939
149951
  if (lastDot === -1) return "";
149940
149952
  return filename.slice(lastDot).toLowerCase();
149941
149953
  };
149942
149954
  var generateId4 = () => {
149943
149955
  const crypto2 = globalThis.crypto;
149944
- if (crypto2 && typeof crypto2.getRandomValues === "function") {
149956
+ if (isPresent(crypto2) && typeof crypto2.getRandomValues === "function") {
149945
149957
  const array = crypto2.getRandomValues(/* @__PURE__ */ new Uint32Array(4));
149946
149958
  return Array.from(array).map((value) => value.toString(16).padStart(8, "0")).join("-");
149947
149959
  }
@@ -157591,9 +157603,9 @@ var DEFAULT_MESSAGES = {
157591
157603
  function isRecord22(value) {
157592
157604
  return typeof value === "object" && value !== null;
157593
157605
  }
157594
- var normalizeLabels = (labels) => labels && labels.length ? labels.map((label) => label.trim()).filter(Boolean).join(",") : void 0;
157606
+ var normalizeLabels = (labels) => labels !== void 0 && labels.length > 0 ? labels.map((label) => label.trim()).filter((label) => label.length > 0).join(",") : void 0;
157595
157607
  var fileFilterForMediaKinds = (mediaKinds) => {
157596
- if (!mediaKinds || mediaKinds.length !== 1) return void 0;
157608
+ if (mediaKinds === void 0 || mediaKinds.length !== 1) return void 0;
157597
157609
  const [mediaKind] = mediaKinds;
157598
157610
  if (mediaKind === void 0) return void 0;
157599
157611
  switch (mediaKind) {
@@ -157750,7 +157762,7 @@ function createCachedMediaRepo(baseRepo, options) {
157750
157762
  }
157751
157763
  function readCache(key, cache) {
157752
157764
  const entry = cache.get(key);
157753
- if (!entry) return null;
157765
+ if (entry === void 0) return null;
157754
157766
  if (entry.expiresAt <= Date.now()) {
157755
157767
  cache.delete(key);
157756
157768
  return null;
@@ -157772,10 +157784,10 @@ function createCachedMediaRepo(baseRepo, options) {
157772
157784
  async getAsset(assetId) {
157773
157785
  const cacheKey = `asset:${assetId}`;
157774
157786
  const entry = globalAssetCache.get(cacheKey);
157775
- if (entry) if (entry.expiresAt > Date.now()) return entry.data;
157787
+ if (entry !== void 0) if (entry.expiresAt > Date.now()) return entry.data;
157776
157788
  else globalAssetCache.delete(cacheKey);
157777
157789
  const inflightRequest = globalAssetInflightRequests.get(assetId);
157778
- if (inflightRequest) return inflightRequest;
157790
+ if (inflightRequest !== void 0) return inflightRequest;
157779
157791
  const fetchPromise = baseRepo.getAsset(assetId).then((result) => {
157780
157792
  writeCache(cacheKey, result, globalAssetCache);
157781
157793
  globalAssetInflightRequests.delete(assetId);
@@ -157790,7 +157802,7 @@ function createCachedMediaRepo(baseRepo, options) {
157790
157802
  async listAssets(options2) {
157791
157803
  const cacheKey = buildCacheKey(options2);
157792
157804
  const cached = readCache(cacheKey, globalListCache);
157793
- if (cached) return cached;
157805
+ if (cached !== null) return cached;
157794
157806
  const result = await baseRepo.listAssets(options2);
157795
157807
  writeCache(cacheKey, result, globalListCache);
157796
157808
  return result;
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { useOptionalPreviewLayout, PreviewQueryProvider } from './chunk-UG7I7S7W.mjs';
3
- import { PreviewBlockCustomizeSelectionProvider, resolveSiteStyleAccess, resolvePreviewDashboardSetupHandoff, buildPreviewDashboardSetupUrl, resolvePreviewSetupBannerModel, usePreviewBlockCustomizeSelectionOptional, useBlockCustomizeControls, MAX_CUSTOMIZE_POPOVER_ROWS, MAX_QUICK_MANIFEST_FIELDS, OfferingsPreviewWidgetProvider, previewWidgetOverrides, sanitizeDashboardPath } from './chunk-H6TT5ZXI.mjs';
4
- import { resolvePreviewChromeSurface, getPreviewSidebarTab, onPreviewSidebarOpenRequest, getPreviewChromeSurfaceDataProps, PREVIEW_CHROME_THEME_CLASS_NAME, setPreviewSidebarTab, PreviewPageDesignEditorStateProvider, usePreviewPageDesignEditorState } from './chunk-SYYJZPKU.mjs';
5
- import { clientComponentRegistry, deriveLaunchReadiness, DEFAULT_LAUNCH_READINESS_INPUT, useEditorUiStore, PreviewThemeOverlayProvider, PreviewDesignCoordinatorProvider, SiteChromeCustomizeProvider, ResizableSplitPane, BlockApiProvider, EditorProvider, PreviewDesignHistoryOrderProvider, MediaEditorProvider, useEditorUiStoreInstance, useEditor, createRoutingHelpers, createSnapshotFromPageRecord, EntryControllerProvider, useEntryEditorController, surfaceResolutionContextFromTheme, designRuntimeRulesForTheme, unsafeAsEditorBlockId, EditableBlockProvider, asDesignBlockId, PageRenderer, usePreviewThemeOverlay, planSiteDocument, assertNever, ResponsiveScope, ThemeScope, FixedBottomSurface, Button, unsafeAsLinkedContentEntryId, sectionTransitionVariantForBoundaryOptionId, sectionTransitionFamilyForBoundaryOptionId, sectionTransitionFamilies, X, defaultSectionTransitionVariantForFamily, RotateCcw, parseBackgroundOverrideFromContent, rankBackgroundImagePoolItems, imagePoolForOverride, resolveBackgroundCapability, enabledBackgroundModes, canCycleBackgroundOverrideValue, FormRenderer, stableSerialize, prefetchBlockData, isSupportedLoaderEndpoint, PreviewRichTextEditor, RichText, PreviewTextEditor, Text, buildThemeRuntime, renderBlock, siteHeaderManifest, siteFooterManifest, SiteDocumentLayout, SITE_CHROME_CLASS_NAMES, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, buildEditorModelRuntimeFieldsByBlockId, applyCompiledRuntimeFieldsToContent, assertNever2, getBlockDefinition, systemCustomizeFacetDefinitionsForBlock, systemCustomizeFacetAppliesToLayoutVariant, systemCustomizeFacetCurrentValue, systemCustomizeFacetLabelForValue, backgroundColorTokens, ChevronLeft, ChevronRight, createMicrobatcher, unwrapResponse, normalizePublicApiLoaderParams, visibleHeaderClearancePx, LINKED_CONTENT_ENTRY_META_KEY, useMediaEditorOptional, Image, defaultBackgroundOverrideForMode, decodePublicProductCategorySelectorQuery, EDITABLE_SURFACE_FORWARDING_PROP, useSiteChromeCustomizeOptional, SITE_CHROME_VISIBLE_HEADER_SELECTOR, getLinkedContentEntryMeta, GRADIENT_PRESETS, resolveImageUrlWithContext, gradientToCss, Upload, MediaEditor, SECTION_BACKGROUND_MIN_SOURCE_WIDTH, SECTION_BACKGROUND_MIN_SOURCE_HEIGHT, parseMediaAssetId, formatSiteChromeBackgroundTokenLabel, planBackgroundOverride, planBackgroundTransition, systemCustomizeFacetNextValue } from './chunk-CR2VX432.mjs';
6
- import { API_ENDPOINTS, createBearerAPIClient, isPreviewRuntimeSessionEditable, DEFAULT_SURFACE_ID, initPreviewAuth, usePreviewAuth, usePreviewAuthFetch, markPreviewAuthExpired, usePreviewToken } from './chunk-BOQXMCSP.mjs';
2
+ import { useOptionalPreviewLayout, PreviewQueryProvider } from './chunk-U5YM4AWE.mjs';
3
+ import { PreviewBlockCustomizeSelectionProvider, resolveSiteStyleAccess, resolvePreviewDashboardSetupHandoff, buildPreviewDashboardSetupUrl, resolvePreviewSetupBannerModel, usePreviewBlockCustomizeSelectionOptional, useBlockCustomizeControls, MAX_CUSTOMIZE_POPOVER_ROWS, MAX_QUICK_MANIFEST_FIELDS, OfferingsPreviewWidgetProvider, previewWidgetOverrides, sanitizeDashboardPath } from './chunk-GDT2QGIL.mjs';
4
+ import { resolvePreviewChromeSurface, getPreviewSidebarTab, onPreviewSidebarOpenRequest, getPreviewChromeSurfaceDataProps, PREVIEW_CHROME_THEME_CLASS_NAME, setPreviewSidebarTab, PreviewPageDesignEditorStateProvider, usePreviewPageDesignEditorState } from './chunk-AFPMCLS7.mjs';
5
+ import { clientComponentRegistry, deriveLaunchReadiness, DEFAULT_LAUNCH_READINESS_INPUT, useEditorUiStore, PreviewThemeOverlayProvider, PreviewDesignCoordinatorProvider, SiteChromeCustomizeProvider, ResizableSplitPane, BlockApiProvider, EditorProvider, PreviewDesignHistoryOrderProvider, MediaEditorProvider, useEditorUiStoreInstance, useEditor, createRoutingHelpers, createSnapshotFromPageRecord, EntryControllerProvider, useEntryEditorController, surfaceResolutionContextFromTheme, designRuntimeRulesForTheme, unsafeAsEditorBlockId, EditableBlockProvider, asDesignBlockId, PageRenderer, usePreviewThemeOverlay, planSiteDocument, assertNever, ResponsiveScope, ThemeScope, FixedBottomSurface, Button, unsafeAsLinkedContentEntryId, sectionTransitionVariantForBoundaryOptionId, sectionTransitionFamilyForBoundaryOptionId, sectionTransitionFamilies, X, defaultSectionTransitionVariantForFamily, RotateCcw, parseBackgroundOverrideFromContent, rankBackgroundImagePoolItems, imagePoolForOverride, resolveBackgroundCapability, enabledBackgroundModes, canCycleBackgroundOverrideValue, FormRenderer, stableSerialize, prefetchBlockData, isSupportedLoaderEndpoint, PreviewRichTextEditor, RichText, PreviewTextEditor, Text, buildThemeRuntime, renderBlock, siteHeaderManifest, siteFooterManifest, SiteDocumentLayout, SITE_CHROME_CLASS_NAMES, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, buildEditorModelRuntimeFieldsByBlockId, applyCompiledRuntimeFieldsToContent, assertNever2, getBlockDefinition, systemCustomizeFacetDefinitionsForBlock, systemCustomizeFacetAppliesToLayoutVariant, systemCustomizeFacetCurrentValue, systemCustomizeFacetLabelForValue, backgroundColorTokens, ChevronLeft, ChevronRight, createMicrobatcher, unwrapResponse, normalizePublicApiLoaderParams, visibleHeaderClearancePx, LINKED_CONTENT_ENTRY_META_KEY, useMediaEditorOptional, Image, defaultBackgroundOverrideForMode, decodePublicProductCategorySelectorQuery, EDITABLE_SURFACE_FORWARDING_PROP, useSiteChromeCustomizeOptional, SITE_CHROME_VISIBLE_HEADER_SELECTOR, getLinkedContentEntryMeta, GRADIENT_PRESETS, resolveImageUrlWithContext, gradientToCss, Upload, MediaEditor, SECTION_BACKGROUND_MIN_SOURCE_WIDTH, SECTION_BACKGROUND_MIN_SOURCE_HEIGHT, parseMediaAssetId, formatSiteChromeBackgroundTokenLabel, planBackgroundOverride, planBackgroundTransition, systemCustomizeFacetNextValue } from './chunk-RQUZYSES.mjs';
6
+ import { API_ENDPOINTS, createBearerAPIClient, isPreviewRuntimeSessionEditable, DEFAULT_SURFACE_ID, initPreviewAuth, usePreviewAuth, usePreviewAuthFetch, markPreviewAuthExpired, usePreviewToken } from './chunk-ZA2S7H34.mjs';
7
7
  import React9, { createContext, useMemo, useState, useEffect, useRef, useCallback, useId, useReducer, Children, isValidElement, Fragment as Fragment$1, cloneElement, useContext } from 'react';
8
8
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
9
  import { createPortal } from 'react-dom';
@@ -4758,11 +4758,11 @@ function LinkedEntryEditEventBridge() {
4758
4758
  }
4759
4759
  var previewContainerResponsiveEnabled = process.env.NEXT_PUBLIC_ENABLE_PREVIEW_CONTAINER_RESPONSIVE !== "false";
4760
4760
  var PreviewEditorSidebar = React9.lazy(async () => {
4761
- const mod = await import('./PreviewEditorSidebar-FNFRVSIM.mjs');
4761
+ const mod = await import('./PreviewEditorSidebar-3TT47WCF.mjs');
4762
4762
  return { default: mod.PreviewEditorSidebar };
4763
4763
  });
4764
4764
  var PreviewEditorUI = React9.lazy(async () => {
4765
- const mod = await import('./PreviewEditorUI-3WXJFQXG.mjs');
4765
+ const mod = await import('./PreviewEditorUI-ORCLLUNZ.mjs');
4766
4766
  return { default: mod.PreviewEditorUI };
4767
4767
  });
4768
4768
  var previewPaneContainmentStyle = {
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { ApiRequestError, markPreviewAuthExpired } from './chunk-BOQXMCSP.mjs';
2
+ import { ApiRequestError, markPreviewAuthExpired } from './chunk-ZA2S7H34.mjs';
3
3
  import { createContext, useContext, useRef } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
  import { QueryClient, MutationCache, QueryCache, QueryClientProvider } from '@tanstack/react-query';
@@ -61,9 +61,9 @@ function matchSurfaceRootHost(host) {
61
61
  return matchSurfaceHost(host, SURFACE_ROOT_HOSTS);
62
62
  }
63
63
  function resolveSurfaceHostContext(value) {
64
- if (!value) return null;
64
+ if (value === null || value === void 0 || typeof value === "string" && value.length === 0) return null;
65
65
  const normalizedHost = normalizeHostLike(value instanceof URL ? value.toString() : value);
66
- if (!normalizedHost) return null;
66
+ if (normalizedHost === null) return null;
67
67
  return matchSurfaceRootHost(normalizedHost);
68
68
  }
69
69
  function rewriteOriginHost(input) {
@@ -77,7 +77,7 @@ function rewriteOriginHost(input) {
77
77
  }
78
78
  function buildSurfaceAwareDashboardOriginForSurfaceId(input) {
79
79
  const dashboardContext = resolveSurfaceHostContext(input.dashboardOrigin);
80
- if (!dashboardContext) return null;
80
+ if (dashboardContext === null) return null;
81
81
  const targetRootHost = SURFACE_ROOT_HOSTS[input.surfaceId][dashboardContext.tier];
82
82
  return rewriteOriginHost({
83
83
  origin: input.dashboardOrigin,