@riverbankcms/sdk 0.60.0 → 0.60.1

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 (86) hide show
  1. package/README.md +20 -3
  2. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +1 -3
  3. package/dist/_dts/api/src/bookingRecords.d.ts +1 -0
  4. package/dist/_dts/api/src/endpoints.d.ts +1 -1
  5. package/dist/_dts/billing/src/plans/types.d.ts +27 -0
  6. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +1 -0
  7. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +173 -2
  8. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +24 -2
  9. package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +1 -0
  10. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.client.d.ts +1 -0
  11. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/AgendaEventCard.d.ts +2 -0
  12. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/DayEventsModal.d.ts +2 -1
  13. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventDetailModal.d.ts +2 -1
  14. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModals.d.ts +2 -1
  15. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekAgendaView.d.ts +1 -0
  16. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekTimetableView.d.ts +1 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCapacity.d.ts +16 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/timetableModel.d.ts +2 -0
  19. package/dist/_dts/content-editor/src/index.d.ts +2 -2
  20. package/dist/_dts/content-editor/src/primitives/shared/activePreviewField.d.ts +9 -0
  21. package/dist/_dts/content-editor/src/primitives/shared/index.d.ts +1 -0
  22. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +10 -0
  23. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +3 -0
  24. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +4 -0
  25. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +8 -5
  26. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +7 -5
  27. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -0
  28. package/dist/_dts/editor-blocks/src/block-editor/reorderControlMode.d.ts +3 -0
  29. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +4 -0
  30. package/dist/_dts/media-react/src/hooks/useApiMediaUploader.d.ts +14 -0
  31. package/dist/_dts/media-react/src/index.d.ts +1 -1
  32. package/dist/_dts/preview-next/src/client/index.d.ts +2 -0
  33. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +11 -28
  34. package/dist/_dts/preview-next/src/client/preview/PreviewEditorUI.d.ts +1 -1
  35. package/dist/_dts/preview-next/src/client/preview/previewChromeSurface.d.ts +12 -0
  36. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +41 -0
  37. package/dist/_dts/preview-next/src/client/preview/previewCustomizeRuntimePatch.d.ts +15 -0
  38. package/dist/_dts/preview-next/src/client/preview/previewCustomizeWorkflowState.d.ts +106 -0
  39. package/dist/_dts/preview-next/src/client/preview/previewUndoDomains.d.ts +34 -0
  40. package/dist/_dts/preview-next/src/client/preview/sidebarTabPreference.d.ts +2 -1
  41. package/dist/_dts/preview-next/src/client/preview/useOnboardingConfirmationCheck.d.ts +4 -9
  42. package/dist/_dts/preview-next/src/constants.d.ts +0 -1
  43. package/dist/_dts/preview-next/src/index.d.ts +1 -0
  44. package/dist/_dts/preview-next/src/onboarding-preview-planner.d.ts +89 -0
  45. package/dist/_dts/preview-next/src/route-contract.d.ts +37 -0
  46. package/dist/_dts/sdk/src/rendering/components/Block.d.ts +7 -76
  47. package/dist/_dts/sdk/src/rendering/components/Block.server.d.ts +9 -0
  48. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +78 -0
  49. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +5 -5
  50. package/dist/_dts/sdk/src/rendering/server.d.ts +2 -2
  51. package/dist/_dts/sdk/src/version.d.ts +1 -1
  52. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  53. package/dist/_dts/theme-core/src/index.d.ts +17 -16
  54. package/dist/_dts/theme-core/src/responsiveDisplay.d.ts +23 -0
  55. package/dist/_dts/theme-core/src/responsiveMode.d.ts +21 -0
  56. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  57. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorErrors.d.ts +1 -0
  58. package/dist/_dts/ui/src/command-multi-select.d.ts +2 -2
  59. package/dist/cli/index.mjs +120 -40
  60. package/dist/client/bookings.mjs +27 -0
  61. package/dist/client/client.mjs +889 -497
  62. package/dist/client/hooks.mjs +61 -21
  63. package/dist/client/rendering/client.mjs +319 -128
  64. package/dist/client/rendering/islands.mjs +122 -44
  65. package/dist/client/rendering.mjs +959 -486
  66. package/dist/preview-next/before-render.mjs +5525 -0
  67. package/dist/preview-next/client/runtime.mjs +104162 -102561
  68. package/dist/preview-next/constants.mjs +0 -2
  69. package/dist/preview-next/index.mjs +0 -2
  70. package/dist/preview-next/middleware.mjs +5535 -1
  71. package/dist/server/components.mjs +7880 -7522
  72. package/dist/server/config-validation.mjs +61 -21
  73. package/dist/server/config.mjs +61 -21
  74. package/dist/server/data.mjs +61 -21
  75. package/dist/server/index.mjs +2 -2
  76. package/dist/server/next.mjs +783 -429
  77. package/dist/server/page-converter.mjs +60 -20
  78. package/dist/server/prebuild.mjs +1 -1
  79. package/dist/server/rendering/server.mjs +2461 -837
  80. package/dist/server/rendering.mjs +9276 -8840
  81. package/dist/server/routing.mjs +102 -39
  82. package/dist/server/server.mjs +62 -22
  83. package/dist/server/theme-bridge.mjs +639 -358
  84. package/dist/styles/index.css +343 -299
  85. package/package.json +1 -1
  86. package/dist/_dts/preview-next/src/client/blocks/runOptimisticCustomizeAction.d.ts +0 -21
@@ -5,6 +5,10 @@ import { type PageDesignEditorBlock } from '@riverbankcms/theme-core/site-styles
5
5
  import { type EditorBlockId } from '@riverbankcms/core';
6
6
  import type { ArrayKeysManager, DraftsSlice, UiStore as BlockEditorUiStore } from './block-editor/types';
7
7
  type UiStoreState = {
8
+ setActivePreviewField: (field: {
9
+ blockId: EditorBlockId;
10
+ fieldPath: string;
11
+ } | null) => void;
8
12
  blockValidation: {
9
13
  markPathEdited: (blockId: EditorBlockId, path: string) => void;
10
14
  isPathEdited: (blockId: EditorBlockId, path: string) => boolean;
@@ -1,13 +1,15 @@
1
+ import type { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities';
1
2
  import { type EditorBlockId } from '@riverbankcms/core';
2
3
  import type { PageDesignEditorBlock } from '@riverbankcms/theme-core/site-styles';
3
4
  import type { SystemBlockDefinition } from '@riverbankcms/blocks';
4
- import type { Theme } from '@riverbankcms/blocks';
5
5
  import type { BlockDraftSaveability } from '@riverbankcms/block-form/client';
6
+ import type { FieldWidgetComponent } from '@riverbankcms/block-form/client';
7
+ import type { Theme } from '@riverbankcms/blocks';
8
+ import { type ReorderControlMode } from './reorderControlMode';
6
9
  import type { ArrayKeysManager, BlockFocusRequest, BlockItem, UiStore, DraftsSlice, UiSlice } from './types';
7
10
  /** Drag listener props from dnd-kit */
8
- type DragListeners = Record<string, Function> | undefined;
9
- import type { FieldWidgetComponent } from '@riverbankcms/block-form/client';
10
- type BlockCardStore = UiStore<Pick<UiSlice, 'activeBlockId' | 'setActiveBlockId'> & {
11
+ type DragListeners = SyntheticListenerMap | undefined;
12
+ type BlockCardStore = UiStore<Pick<UiSlice, 'activeBlockId' | 'setActiveBlockId' | 'setActivePreviewField'> & {
11
13
  blockValidation: {
12
14
  markPathEdited: (blockId: EditorBlockId, path: string) => void;
13
15
  isPathEdited: (blockId: EditorBlockId, path: string) => boolean;
@@ -17,7 +19,7 @@ type BlockCardStore = UiStore<Pick<UiSlice, 'activeBlockId' | 'setActiveBlockId'
17
19
  drafts: Pick<DraftsSlice, 'getBlockSnapshot' | 'getCurrentValues' | 'getAtPath' | 'setAtPath' | 'edit' | 'initNewBlock' | 'updateBlockBaseline' | 'clearError'>;
18
20
  arrayKeys: ArrayKeysManager;
19
21
  }>;
20
- export declare function BlockCard({ siteId, block, manifest, isFirst, isLast, isMoving, onMove, onDuplicate, onDelete, dragListeners, canReorder, collapsed, onCollapsedChange, highlighted, hasRecoveryConflict, focusSignal, onFocusHandled, onBlockSave, theme, widgetOverrides, uiStore, hideThemeV2RawStyleFields, pageDesignBlock, }: {
22
+ export declare function BlockCard({ siteId, block, manifest, isFirst, isLast, isMoving, onMove, onDuplicate, onDelete, dragListeners, canReorder, collapsed, onCollapsedChange, highlighted, hasRecoveryConflict, focusSignal, onFocusHandled, onBlockSave, theme, widgetOverrides, uiStore, hideThemeV2RawStyleFields, pageDesignBlock, reorderControlMode, }: {
21
23
  siteId: string;
22
24
  block: BlockItem;
23
25
  manifest: SystemBlockDefinition['manifest'];
@@ -41,5 +43,6 @@ export declare function BlockCard({ siteId, block, manifest, isFirst, isLast, is
41
43
  uiStore: BlockCardStore;
42
44
  hideThemeV2RawStyleFields?: boolean;
43
45
  pageDesignBlock?: PageDesignEditorBlock | null;
46
+ reorderControlMode?: ReorderControlMode;
44
47
  }): import("react/jsx-runtime").JSX.Element;
45
48
  export {};
@@ -1,14 +1,15 @@
1
- import type { Theme } from '@riverbankcms/blocks';
2
- /** Drag listener props from dnd-kit */
3
- type DragListeners = Record<string, Function> | undefined;
4
- import type { SystemBlockDefinition } from '@riverbankcms/blocks';
1
+ import type { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities';
5
2
  import type { FieldWidgetComponent } from '@riverbankcms/block-form/client';
3
+ import { type SystemBlockDefinition, type Theme } from '@riverbankcms/blocks';
4
+ import type { ReorderControlMode } from './reorderControlMode';
6
5
  import type { BlockItem, UiStore, DraftsSlice, ArrayKeysManager } from './types';
6
+ /** Drag listener props from dnd-kit */
7
+ type DragListeners = SyntheticListenerMap | undefined;
7
8
  type BlockCardHeaderStore = UiStore<{
8
9
  drafts: Pick<DraftsSlice, 'getBlockSnapshot' | 'getCurrentValues' | 'initNewBlock' | 'updateBlockBaseline' | 'clearError' | 'setAtPath' | 'getAtPath'>;
9
10
  arrayKeys: ArrayKeysManager;
10
11
  }>;
11
- export declare function BlockCardHeader({ block, manifest, isFirst, isLast, isMoving, onMove, onDuplicate, onDelete, dragListeners, canReorder, collapsed, onToggleCollapsed, contentId, uiStore, widgetOverrides, theme, hideThemeV2RawStyleFields, }: {
12
+ export declare function BlockCardHeader({ block, manifest, isFirst, isLast, isMoving, onMove, onDuplicate, onDelete, dragListeners, canReorder, collapsed, onToggleCollapsed, contentId, uiStore, widgetOverrides, theme, hideThemeV2RawStyleFields, reorderControlMode, }: {
12
13
  block: BlockItem;
13
14
  manifest: SystemBlockDefinition['manifest'];
14
15
  isFirst: boolean;
@@ -27,5 +28,6 @@ export declare function BlockCardHeader({ block, manifest, isFirst, isLast, isMo
27
28
  widgetOverrides?: Record<string, FieldWidgetComponent>;
28
29
  theme?: Theme | null;
29
30
  hideThemeV2RawStyleFields?: boolean;
31
+ reorderControlMode?: ReorderControlMode;
30
32
  }): import("react/jsx-runtime").JSX.Element;
31
33
  export {};
@@ -5,6 +5,7 @@ import type { BlockFocusRequest, BlockItem } from './types';
5
5
  import { type SdkConfigForBlockPicker } from './sdkBlockMerger';
6
6
  import { BlockCard } from './BlockCard';
7
7
  import type { FieldWidgetComponent } from '@riverbankcms/block-form/client';
8
+ import { type ReorderControlMode } from './reorderControlMode';
8
9
  export declare const SortableBlockItem: import("react").NamedExoticComponent<{
9
10
  siteId: string;
10
11
  block: BlockItem;
@@ -28,4 +29,5 @@ export declare const SortableBlockItem: import("react").NamedExoticComponent<{
28
29
  sdkConfig?: SdkConfigForBlockPicker | null;
29
30
  hideThemeV2RawStyleFields?: boolean;
30
31
  pageDesignBlock?: PageDesignEditorBlock | null;
32
+ reorderControlMode?: ReorderControlMode;
31
33
  }>;
@@ -0,0 +1,3 @@
1
+ export type ReorderControlMode = 'full' | 'drag-handle-only';
2
+ export declare const DEFAULT_REORDER_CONTROL_MODE: ReorderControlMode;
3
+ export declare function shouldShowMoveButtons(mode: ReorderControlMode): boolean;
@@ -43,6 +43,10 @@ export type UiSlice = {
43
43
  itemIndex?: number | null;
44
44
  }) => void;
45
45
  clearFocus: () => void;
46
+ setActivePreviewField: (field: {
47
+ blockId: EditorBlockId;
48
+ fieldPath: string;
49
+ } | null) => void;
46
50
  };
47
51
  export type ArrayKeysManager = {
48
52
  get: (scope: string, path: string) => string[] | undefined;
@@ -1,3 +1,4 @@
1
+ import type { ApiErrorCode, FieldError } from '@riverbankcms/api/common';
1
2
  import { type ApiClient } from '@riverbankcms/api/request';
2
3
  import type { UploadIntentContract } from '@riverbankcms/api';
3
4
  import type { VideoPrepIntent } from '@riverbankcms/media-core';
@@ -6,6 +7,19 @@ import type { UploadProgressHandler } from './useUploads';
6
7
  import { type ClassificationHook, type LoggerLike } from './internal/classification';
7
8
  export type UploadIntentResolver = UploadIntentContract | ((file: File) => UploadIntentContract | undefined);
8
9
  export type VideoPrepIntentResolver = VideoPrepIntent | ((file: File) => VideoPrepIntent | undefined);
10
+ export declare class MediaUploaderError extends Error {
11
+ readonly code?: ApiErrorCode;
12
+ readonly status?: number;
13
+ readonly fieldErrors?: readonly FieldError[];
14
+ readonly cause?: unknown;
15
+ constructor(message: string, options?: {
16
+ readonly code?: ApiErrorCode;
17
+ readonly status?: number;
18
+ readonly fieldErrors?: readonly FieldError[];
19
+ readonly cause?: unknown;
20
+ });
21
+ }
22
+ export declare function getMediaUploaderErrorCode(error: Error | undefined): ApiErrorCode | undefined;
9
23
  export type UseApiMediaUploaderOptions = {
10
24
  siteId: string;
11
25
  apiClient: ApiClient;
@@ -6,7 +6,7 @@ export { useUploads } from './hooks/useUploads';
6
6
  export type { UseUploadsOptions, UseUploadsResult, UploadItem, UploadStatus, UploadProgressStage, UploadProgressHandler } from './hooks/useUploads';
7
7
  export { useSupabaseMediaUploader } from './hooks/useSupabaseMediaUploader';
8
8
  export type { UseSupabaseMediaUploaderOptions } from './hooks/useSupabaseMediaUploader';
9
- export { useApiMediaUploader } from './hooks/useApiMediaUploader';
9
+ export { getMediaUploaderErrorCode, MediaUploaderError, useApiMediaUploader, } from './hooks/useApiMediaUploader';
10
10
  export type { UploadIntentResolver, UseApiMediaUploaderOptions, VideoPrepIntentResolver } from './hooks/useApiMediaUploader';
11
11
  export { useAuthenticatedImageSrc } from './hooks/useAuthenticatedImageSrc';
12
12
  export { extractVideoPosterFrame } from './videoFrameExtraction';
@@ -2,6 +2,8 @@ export type { PreviewAuthFailureSource, PreviewAuthFetch, PreviewAuthState, } fr
2
2
  export { initPreviewAuth, markPreviewAuthExpired, usePreviewAuth, usePreviewAuthFetch, usePreviewToken, } from "./previewAuthStore";
3
3
  export type { OnboardingPreviewRedirectAuthPlan, PreviewAuthMode, PreviewExchangeTokenKind, PreviewRuntimeSession, PreviewSessionAuthMode, PreviewSessionTokens, } from "../auth-contract";
4
4
  export { getPreviewRuntimeSessionAuthMode, isPreviewRuntimeSessionEditable, resolveOnboardingPreviewRedirectAuthPlan, resolvePreviewAuthMode, resolvePreviewExchangeTokenKind, resolvePreviewRuntimeSession, resolvePreviewSessionCanEdit, } from "../auth-contract";
5
+ export type { OnboardingPreviewEndpointUrlInput, OnboardingPreviewStage, PreviewAuthEntryUrlInput, PreviewAuthExchangeUrlInput, PreviewBrowserEntryRouteKey, PreviewDashboardApiEndpointKey, } from "../route-contract";
6
+ export { buildOnboardingPreviewStatusUrl, buildOnboardingResendConfirmationUrl, buildPreviewAuthEntryUrl, buildPreviewAuthExchangeUrl, previewAuthEntryPathname, previewBrowserEntries, previewDashboardApiEndpoints, } from "../route-contract";
5
7
  export { PreviewShellSmoke } from "./PreviewShellSmoke";
6
8
  export { PreviewLayoutProvider, usePreviewLayout, } from "./layout/PreviewLayoutContext";
7
9
  export { useOptionalPreviewLayout } from "./layout/PreviewLayoutContext";
@@ -1,37 +1,22 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { APIEndpoints } from '@riverbankcms/api';
3
2
  import { type ApiClient } from '@riverbankcms/api/request';
4
3
  import type { PreviewCustomizeAction } from '../blocks/previewCustomizeActions';
5
- type ApiPageDesignEditorStateResponse = NonNullable<APIEndpoints['getPageDesignEditorState']['response']>;
6
- type ApplyPageDesignEditorActionResponse = NonNullable<APIEndpoints['applyPageDesignEditorAction']['response']>;
7
- export type PreviewPageDesignEditorApplyOutcome = Readonly<{
8
- kind: 'saved';
9
- response: ApplyPageDesignEditorActionResponse;
10
- }> | Readonly<{
11
- kind: 'skipped';
12
- }> | Readonly<{
13
- kind: 'stale';
14
- message: string;
15
- }> | Readonly<{
16
- kind: 'invalid';
17
- message: string;
18
- }> | Readonly<{
19
- kind: 'failed';
20
- message: string;
21
- }>;
22
- export type PreviewPageDesignEditorState = Readonly<{
23
- kind: 'unsupported';
24
- }> | Readonly<{
25
- kind: 'loading';
26
- }> | Readonly<{
27
- kind: 'failed';
28
- message: string;
29
- }> | ApiPageDesignEditorStateResponse;
4
+ import { type PreviewPageDesignEditorApplyOutcome, type PreviewPageDesignEditorState } from './previewCustomizeWorkflowState';
5
+ export type { PreviewPageDesignEditorApplyOutcome, PreviewPageDesignEditorState, } from './previewCustomizeWorkflowState';
30
6
  type PageDesignEditorStateContextValue = Readonly<{
31
7
  state: PreviewPageDesignEditorState;
32
8
  reload: () => void;
33
9
  applyAction: (action: PreviewCustomizeAction) => Promise<PreviewPageDesignEditorApplyOutcome>;
10
+ undo: () => Promise<PreviewPageDesignEditorApplyOutcome>;
11
+ redo: () => Promise<PreviewPageDesignEditorApplyOutcome>;
12
+ canUndo: boolean;
13
+ canRedo: boolean;
14
+ isHistoryPending: boolean;
15
+ isHistoryStale: boolean;
16
+ historyFailure: string | null;
34
17
  }>;
18
+ export declare const PREVIEW_CUSTOMIZE_STALE_MESSAGE = "This page changed since that design choice. Refresh the preview, then try again.";
19
+ export { applyPreviewCustomizeActionToState } from './previewCustomizeWorkflowState';
35
20
  export declare function PreviewPageDesignEditorStateProvider({ apiClient, siteId, pageId, enabled, children, }: Readonly<{
36
21
  apiClient: ApiClient;
37
22
  siteId: string;
@@ -40,5 +25,3 @@ export declare function PreviewPageDesignEditorStateProvider({ apiClient, siteId
40
25
  children: ReactNode;
41
26
  }>): import("react/jsx-runtime").JSX.Element;
42
27
  export declare function usePreviewPageDesignEditorState(): PageDesignEditorStateContextValue;
43
- export declare function applyPreviewCustomizeActionToState(state: PreviewPageDesignEditorState, action: PreviewCustomizeAction): PreviewPageDesignEditorState;
44
- export {};
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { ApiClient } from '@riverbankcms/api/request';
3
- import type { SurfaceId } from '@riverbankcms/surfaces';
3
+ import { type SurfaceId } from '@riverbankcms/surfaces';
4
4
  type PreviewEditorUIProps = {
5
5
  inMaintenanceMode?: boolean;
6
6
  siteId?: string;
@@ -0,0 +1,12 @@
1
+ import { type SurfaceId } from "@riverbankcms/surfaces";
2
+ export declare const PREVIEW_CHROME_THEME_CLASS_NAME = "builder-dashboard-chrome-theme";
3
+ export declare const PREVIEW_CHROME_PORTAL_CLASS_NAME = "builder-editor-chrome";
4
+ export type PreviewChromeSurface = Readonly<{
5
+ surfaceClassName: string | null;
6
+ dataSurface: string | null;
7
+ }>;
8
+ export declare function resolvePreviewChromeSurface(surfaceId?: SurfaceId | null): PreviewChromeSurface;
9
+ export declare function getPreviewChromeSurfaceDataProps(surface: PreviewChromeSurface): Readonly<Record<string, string>>;
10
+ export declare function applyPreviewChromeSurfaceToElement(element: HTMLElement, surface: PreviewChromeSurface, options?: Readonly<{
11
+ includePortalClass?: boolean;
12
+ }>): void;
@@ -0,0 +1,41 @@
1
+ import { type AppearancePresetId, type BoundaryOptionId, type DesignBlockId, type DesignBoundaryId, type LayoutVariantKey, type PageDesignEditorReadModel } from '@riverbankcms/theme-core/site-styles';
2
+ import { type HistoryState } from '@riverbankcms/content-editor';
3
+ import type { PreviewCustomizeAction } from '../blocks/previewCustomizeActions';
4
+ type PreviewLoadedEditorModel = PageDesignEditorReadModel;
5
+ export type PreviewCustomizeHistoryEntry = Readonly<{
6
+ kind: 'layout';
7
+ blockId: PreviewCustomizeActionBlockId;
8
+ baseContentId: string | null;
9
+ fromLayoutVariantKey: LayoutVariantKey;
10
+ toLayoutVariantKey: LayoutVariantKey;
11
+ }> | Readonly<{
12
+ kind: 'look';
13
+ blockId: PreviewCustomizeActionBlockId;
14
+ fromAppearancePresetId: AppearancePresetId | null;
15
+ toAppearancePresetId: AppearancePresetId | null;
16
+ }> | Readonly<{
17
+ kind: 'boundary';
18
+ boundaryId: DesignBoundaryId;
19
+ previousBlockId: PreviewCustomizeActionBlockId;
20
+ nextBlockId: PreviewCustomizeActionBlockId;
21
+ fromBoundaryOptionId: BoundaryOptionId | null;
22
+ toBoundaryOptionId: BoundaryOptionId | null;
23
+ }>;
24
+ type PreviewCustomizeActionBlockId = DesignBlockId;
25
+ export type PreviewCustomizeHistoryPresent = Readonly<{
26
+ editorModel: PreviewLoadedEditorModel;
27
+ entry: PreviewCustomizeHistoryEntry | null;
28
+ }>;
29
+ export type PreviewCustomizeHistoryState = HistoryState<PreviewCustomizeHistoryPresent>;
30
+ export declare function createPreviewCustomizeHistoryState(editorModel: PreviewLoadedEditorModel): PreviewCustomizeHistoryState;
31
+ export declare function canUndoPreviewCustomizeHistory(state: PreviewCustomizeHistoryState): boolean;
32
+ export declare function canRedoPreviewCustomizeHistory(state: PreviewCustomizeHistoryState): boolean;
33
+ export declare function pushPreviewCustomizeHistoryEntry(state: PreviewCustomizeHistoryState, entry: PreviewCustomizeHistoryEntry, editorModel: PreviewLoadedEditorModel): PreviewCustomizeHistoryState;
34
+ export declare function replacePreviewCustomizeHistoryModel(state: PreviewCustomizeHistoryState, editorModel: PreviewLoadedEditorModel): PreviewCustomizeHistoryState;
35
+ export declare function undoPreviewCustomizeHistory(state: PreviewCustomizeHistoryState): PreviewCustomizeHistoryState;
36
+ export declare function redoPreviewCustomizeHistory(state: PreviewCustomizeHistoryState): PreviewCustomizeHistoryState;
37
+ export declare function previewCustomizeHistoryEntryFromAction(editorModel: PreviewLoadedEditorModel, action: PreviewCustomizeAction): PreviewCustomizeHistoryEntry | null;
38
+ export declare function previewCustomizeUndoActionForEntry(entry: PreviewCustomizeHistoryEntry): PreviewCustomizeAction;
39
+ export declare function previewCustomizeRedoActionForEntry(entry: PreviewCustomizeHistoryEntry): PreviewCustomizeAction;
40
+ export declare function previewCustomizeHistoryPresentEquals(left: PreviewCustomizeHistoryPresent, right: PreviewCustomizeHistoryPresent): boolean;
41
+ export {};
@@ -0,0 +1,15 @@
1
+ import { type PageDesignEditorReadModel } from '@riverbankcms/theme-core/site-styles/previewCompiler';
2
+ import type { DesignBlockId } from '@riverbankcms/theme-core/site-styles';
3
+ import type { PreviewCustomizeAction } from '../blocks/previewCustomizeActions';
4
+ export type PreviewEditorRuntimeContent = Record<string, unknown>;
5
+ export type PreviewCustomizeRuntimePatch = Readonly<{
6
+ blockId: DesignBlockId;
7
+ previousContent: PreviewEditorRuntimeContent;
8
+ nextContent: PreviewEditorRuntimeContent;
9
+ rollback: (currentContent: PreviewEditorRuntimeContent) => PreviewEditorRuntimeContent;
10
+ }>;
11
+ export declare function derivePreviewCustomizeRuntimePatch(input: Readonly<{
12
+ action: PreviewCustomizeAction;
13
+ editorModel: PageDesignEditorReadModel;
14
+ currentContent: PreviewEditorRuntimeContent | null;
15
+ }>): PreviewCustomizeRuntimePatch | null;
@@ -0,0 +1,106 @@
1
+ import type { APIEndpoints } from '@riverbankcms/api';
2
+ import type { PreviewCustomizeAction } from '../blocks/previewCustomizeActions';
3
+ import { type PreviewCustomizeHistoryEntry, type PreviewCustomizeHistoryState } from './previewCustomizeHistory';
4
+ type ApiPageDesignEditorStateResponse = NonNullable<APIEndpoints['getPageDesignEditorState']['response']>;
5
+ type LoadedPageDesignEditorState = Extract<ApiPageDesignEditorStateResponse, Readonly<{
6
+ kind: 'loaded';
7
+ }>>;
8
+ type NonLoadedPageDesignEditorState = Exclude<ApiPageDesignEditorStateResponse, Readonly<{
9
+ kind: 'loaded';
10
+ }>>;
11
+ type ApplyPageDesignEditorActionResponse = NonNullable<APIEndpoints['applyPageDesignEditorAction']['response']>;
12
+ export type PreviewPageDesignEditorState = Readonly<{
13
+ kind: 'unsupported';
14
+ }> | Readonly<{
15
+ kind: 'loading';
16
+ }> | Readonly<{
17
+ kind: 'failed';
18
+ message: string;
19
+ }> | ApiPageDesignEditorStateResponse;
20
+ export type PreviewPageDesignEditorApplyOutcome = Readonly<{
21
+ kind: 'saved';
22
+ response: ApplyPageDesignEditorActionResponse;
23
+ }> | Readonly<{
24
+ kind: 'skipped';
25
+ reason: PreviewCustomizeSkipReason;
26
+ message: string;
27
+ }> | Readonly<{
28
+ kind: 'stale';
29
+ message: string;
30
+ }> | Readonly<{
31
+ kind: 'invalid';
32
+ message: string;
33
+ }> | Readonly<{
34
+ kind: 'failed';
35
+ message: string;
36
+ }>;
37
+ export type PreviewCustomizeSkipReason = 'disabled' | 'missing-page' | 'not-loaded' | 'mutation-pending' | 'stale' | 'no-history-entry' | 'cannot-undo' | 'cannot-redo';
38
+ export type PreviewCustomizeMutationState = Readonly<{
39
+ kind: 'idle';
40
+ }> | Readonly<{
41
+ kind: 'applying';
42
+ action: PreviewCustomizeAction;
43
+ historyEntry: PreviewCustomizeHistoryEntry | null;
44
+ }> | Readonly<{
45
+ kind: 'undoing';
46
+ action: PreviewCustomizeAction;
47
+ entry: PreviewCustomizeHistoryEntry;
48
+ }> | Readonly<{
49
+ kind: 'redoing';
50
+ action: PreviewCustomizeAction;
51
+ entry: PreviewCustomizeHistoryEntry;
52
+ }> | Readonly<{
53
+ kind: 'stale';
54
+ message: string;
55
+ }> | Readonly<{
56
+ kind: 'failed';
57
+ message: string;
58
+ }>;
59
+ export type PreviewCustomizeWorkflowState = Readonly<{
60
+ kind: 'unsupported';
61
+ }> | Readonly<{
62
+ kind: 'loading';
63
+ }> | Readonly<{
64
+ kind: 'failed';
65
+ message: string;
66
+ }> | Readonly<{
67
+ kind: 'ready';
68
+ pageState: NonLoadedPageDesignEditorState;
69
+ }> | Readonly<{
70
+ kind: 'loaded';
71
+ pageState: LoadedPageDesignEditorState;
72
+ history: PreviewCustomizeHistoryState;
73
+ mutation: PreviewCustomizeMutationState;
74
+ }>;
75
+ export type PreviewCustomizeBeginResult = Readonly<{
76
+ kind: 'started';
77
+ state: PreviewCustomizeWorkflowState;
78
+ action: PreviewCustomizeAction;
79
+ }> | Readonly<{
80
+ kind: 'skipped';
81
+ reason: PreviewCustomizeSkipReason;
82
+ message: string;
83
+ }>;
84
+ export declare function unsupportedPreviewCustomizeWorkflowState(): PreviewCustomizeWorkflowState;
85
+ export declare function loadingPreviewCustomizeWorkflowState(): PreviewCustomizeWorkflowState;
86
+ export declare function failedPreviewCustomizeWorkflowState(message: string): PreviewCustomizeWorkflowState;
87
+ export declare function previewCustomizeLoadSucceeded(pageState: ApiPageDesignEditorStateResponse): PreviewCustomizeWorkflowState;
88
+ export declare function previewCustomizeWorkflowPageState(workflow: PreviewCustomizeWorkflowState): PreviewPageDesignEditorState;
89
+ export declare function beginPreviewCustomizeApply(workflow: PreviewCustomizeWorkflowState, action: PreviewCustomizeAction): PreviewCustomizeBeginResult;
90
+ export declare function beginPreviewCustomizeUndo(workflow: PreviewCustomizeWorkflowState): PreviewCustomizeBeginResult;
91
+ export declare function beginPreviewCustomizeRedo(workflow: PreviewCustomizeWorkflowState): PreviewCustomizeBeginResult;
92
+ export declare function confirmPreviewCustomizeMutation(workflow: PreviewCustomizeWorkflowState, response: ApplyPageDesignEditorActionResponse): PreviewCustomizeWorkflowState;
93
+ export declare function rejectPreviewCustomizeMutation(previousWorkflow: PreviewCustomizeWorkflowState, outcome: Exclude<PreviewPageDesignEditorApplyOutcome, {
94
+ kind: 'saved' | 'skipped';
95
+ }>): PreviewCustomizeWorkflowState;
96
+ export declare function previewCustomizeCanUndo(workflow: PreviewCustomizeWorkflowState): boolean;
97
+ export declare function previewCustomizeCanRedo(workflow: PreviewCustomizeWorkflowState): boolean;
98
+ export declare function previewCustomizeCanApply(workflow: PreviewCustomizeWorkflowState): boolean;
99
+ export declare function previewCustomizeIsMutationPending(workflow: PreviewCustomizeWorkflowState): boolean;
100
+ export declare function previewCustomizeIsStale(workflow: PreviewCustomizeWorkflowState): boolean;
101
+ export declare function previewCustomizeFailureMessage(workflow: PreviewCustomizeWorkflowState): string | null;
102
+ export declare function applyPreviewCustomizeActionToState(state: PreviewPageDesignEditorState, action: PreviewCustomizeAction): PreviewPageDesignEditorState;
103
+ export declare function skippedPreviewCustomizeOutcome(reason: PreviewCustomizeSkipReason): Extract<PreviewPageDesignEditorApplyOutcome, {
104
+ kind: 'skipped';
105
+ }>;
106
+ export {};
@@ -0,0 +1,34 @@
1
+ export type PreviewUndoDomainId = 'content' | 'theme-customize';
2
+ export type PreviewUndoDomainStatus = 'idle' | 'pending' | 'stale' | 'failed';
3
+ export type PreviewUndoFocusOwner = 'preview-customize' | 'content' | 'native';
4
+ export type PreviewUndoDomainOwnership = Readonly<{
5
+ kind: 'focused';
6
+ owner: PreviewUndoFocusOwner;
7
+ }> | Readonly<{
8
+ kind: 'available';
9
+ }> | Readonly<{
10
+ kind: 'fallback';
11
+ }>;
12
+ export type PreviewUndoSelectionContext = Readonly<{
13
+ kind: 'chrome';
14
+ }> | Readonly<{
15
+ kind: 'shortcut';
16
+ owner: PreviewUndoFocusOwner;
17
+ }>;
18
+ export type PreviewUndoDomainHandle = Readonly<{
19
+ id: PreviewUndoDomainId;
20
+ ownership: PreviewUndoDomainOwnership;
21
+ canUndo: boolean;
22
+ canRedo: boolean;
23
+ status?: PreviewUndoDomainStatus;
24
+ undo: () => void;
25
+ redo: () => void;
26
+ }>;
27
+ export type PreviewUndoCommand = 'undo' | 'redo';
28
+ export declare function selectPreviewUndoDomain(domains: readonly PreviewUndoDomainHandle[], command: PreviewUndoCommand, context: PreviewUndoSelectionContext): PreviewUndoDomainHandle | null;
29
+ export declare function previewUndoControlsForDomains(domains: readonly PreviewUndoDomainHandle[], context: PreviewUndoSelectionContext): Readonly<{
30
+ canUndo: boolean;
31
+ canRedo: boolean;
32
+ onUndo: () => void;
33
+ onRedo: () => void;
34
+ }>;
@@ -1,4 +1,5 @@
1
- export type PreviewSidebarTab = 'editor' | 'assistant';
1
+ import type { PreviewSidebarTab } from '@riverbankcms/content-editor';
2
+ export type { PreviewSidebarTab };
2
3
  export declare function getPreviewSidebarTab(): PreviewSidebarTab;
3
4
  export declare function setPreviewSidebarTab(tab: PreviewSidebarTab): void;
4
5
  export declare function requestPreviewSidebarOpen(tab: PreviewSidebarTab): void;
@@ -1,11 +1,7 @@
1
1
  import type { LaunchReadiness } from "@riverbankcms/api/launch-readiness";
2
- import type { PreviewConfirmationDialogState } from "./PreviewConfirmationDialog";
3
- type ResendFeedback = Readonly<{
4
- kind: "success" | "error";
5
- message: string;
6
- }> | null;
2
+ import type { PreviewSessionAuthMode } from "../../auth-contract";
7
3
  export declare function useOnboardingConfirmationCheck(input: Readonly<{
8
- authMode: "onboardingGrant" | null;
4
+ authMode: PreviewSessionAuthMode;
9
5
  dashboardBaseUrl: string | null;
10
6
  previewToken: string | null;
11
7
  siteId: string | null;
@@ -16,13 +12,12 @@ export declare function useOnboardingConfirmationCheck(input: Readonly<{
16
12
  readonly closeDialog: () => void;
17
13
  readonly dashboardContinueUrl: string | null;
18
14
  readonly dashboardUnlocked: boolean;
19
- readonly dialogState: PreviewConfirmationDialogState;
15
+ readonly dialogState: import("../../onboarding-preview-planner").OnboardingConfirmationDialogState;
20
16
  readonly hasLoadedStatus: boolean;
21
17
  readonly isCheckingConfirmation: boolean;
22
18
  readonly isResendingConfirmation: boolean;
23
19
  readonly launchReadiness: LaunchReadiness;
24
20
  readonly resendConfirmation: () => Promise<void>;
25
- readonly resendFeedback: ResendFeedback;
21
+ readonly resendFeedback: import("../../onboarding-preview-planner").OnboardingResendFeedback;
26
22
  readonly statusLoadFailed: boolean;
27
23
  };
28
- export {};
@@ -2,6 +2,5 @@ export declare const PREVIEW_COOKIE_NAME = "preview_token";
2
2
  export declare const PREVIEW_REFRESH_COOKIE_NAME = "preview_refresh_token";
3
3
  export declare const PREVIEW_COOKIE_MAX_AGE: number;
4
4
  export declare const PREVIEW_CODE_PARAM = "preview_code";
5
- export declare const PREVIEW_AUTH_ENTRY_PATH = "/preview/auth";
6
5
  export declare const PREVIEW_SURFACE_PARAM = "preview_surface";
7
6
  export declare const PREVIEW_THEME_COOKIE_NAME = "preview_theme_id";
@@ -2,3 +2,4 @@ export * from "./constants";
2
2
  export * from "./cookies";
3
3
  export * from "./redirects";
4
4
  export * from "./auth-contract";
5
+ export * from "./route-contract";
@@ -0,0 +1,89 @@
1
+ import type { LaunchReadiness, OnboardingPreviewStatusResponse, ResendOnboardingPreviewConfirmationResponse } from '@riverbankcms/api/launch-readiness';
2
+ import type { PreviewAuthEntryUrlInput } from './route-contract';
3
+ export declare const DEFAULT_CHECK_ERROR_MESSAGE = "Unable to check your confirmation status right now.";
4
+ export declare const DEFAULT_RESEND_ERROR_MESSAGE = "Unable to resend your confirmation email right now.";
5
+ export declare const RESEND_SUCCESS_MESSAGE = "We sent a fresh confirmation email. Check your inbox and spam folder.";
6
+ export declare const ALREADY_CONFIRMED_MESSAGE = "Your email is already confirmed. You can complete setup in the dashboard.";
7
+ export type OnboardingPreviewPlannerAuthMode = 'onboardingGrant' | 'userSession' | null;
8
+ export type OnboardingConfirmationDialogState = Readonly<{
9
+ kind: 'ready';
10
+ }> | Readonly<{
11
+ kind: 'pending';
12
+ }> | Readonly<{
13
+ kind: 'error';
14
+ message: string;
15
+ }> | null;
16
+ export type OnboardingResendFeedback = Readonly<{
17
+ kind: 'success' | 'error';
18
+ message: string;
19
+ }> | null;
20
+ export type OnboardingConfirmationState = Readonly<{
21
+ dashboardUnlocked: boolean;
22
+ dialogState: OnboardingConfirmationDialogState;
23
+ hasLoadedStatus: boolean;
24
+ launchReadiness: LaunchReadiness;
25
+ resendFeedback: OnboardingResendFeedback;
26
+ statusLoadFailed: boolean;
27
+ }>;
28
+ export type OnboardingConfirmationStateUpdate = Readonly<{
29
+ kind: 'setDashboardUnlocked';
30
+ dashboardUnlocked: boolean;
31
+ }> | Readonly<{
32
+ kind: 'setDialogState';
33
+ dialogState: OnboardingConfirmationDialogState;
34
+ }> | Readonly<{
35
+ kind: 'setHasLoadedStatus';
36
+ hasLoadedStatus: boolean;
37
+ }> | Readonly<{
38
+ kind: 'setLaunchReadiness';
39
+ launchReadiness: LaunchReadiness;
40
+ }> | Readonly<{
41
+ kind: 'setResendFeedback';
42
+ resendFeedback: OnboardingResendFeedback;
43
+ }> | Readonly<{
44
+ kind: 'setStatusLoadFailed';
45
+ statusLoadFailed: boolean;
46
+ }>;
47
+ export type OnboardingConfirmationEffect = Readonly<{
48
+ kind: 'none';
49
+ }> | Readonly<{
50
+ kind: 'startPreviewUpgrade';
51
+ input: PreviewAuthEntryUrlInput;
52
+ }>;
53
+ export type OnboardingConfirmationPlan = Readonly<{
54
+ updates: readonly OnboardingConfirmationStateUpdate[];
55
+ effect: OnboardingConfirmationEffect;
56
+ }>;
57
+ export declare function applyOnboardingConfirmationUpdate(state: OnboardingConfirmationState, update: OnboardingConfirmationStateUpdate): OnboardingConfirmationState;
58
+ export declare function applyOnboardingConfirmationUpdates(state: OnboardingConfirmationState, updates: readonly OnboardingConfirmationStateUpdate[]): OnboardingConfirmationState;
59
+ export declare function planStatusApplied(input: Readonly<{
60
+ allowUserSessionUnlock: boolean;
61
+ authMode: OnboardingPreviewPlannerAuthMode;
62
+ currentUrl: string | null;
63
+ dashboardBaseUrl: string | null;
64
+ siteSlug: string | null;
65
+ status: OnboardingPreviewStatusResponse;
66
+ upgradeAlreadyStarted: boolean;
67
+ }>): OnboardingConfirmationPlan;
68
+ export declare function planAlreadyUnlockedManualCheck(): OnboardingConfirmationPlan;
69
+ export declare function planMissingConfirmationStatusConfig(message?: string): OnboardingConfirmationPlan;
70
+ export declare function planConfirmationStatusFailure(message?: string): OnboardingConfirmationPlan;
71
+ export declare function planManualConfirmationStatusSuccess(input: Readonly<{
72
+ authMode: OnboardingPreviewPlannerAuthMode;
73
+ currentUrl: string | null;
74
+ dashboardBaseUrl: string | null;
75
+ siteSlug: string | null;
76
+ status: OnboardingPreviewStatusResponse;
77
+ upgradeAlreadyStarted: boolean;
78
+ }>): OnboardingConfirmationPlan;
79
+ export declare function planInitialStatusLoadFailure(): OnboardingConfirmationPlan;
80
+ export declare function planMissingResendConfirmationConfig(message?: string): OnboardingConfirmationPlan;
81
+ export declare function planResendConfirmationFailure(message?: string): OnboardingConfirmationPlan;
82
+ export declare function planResendConfirmationSuccess(input: Readonly<{
83
+ authMode: OnboardingPreviewPlannerAuthMode;
84
+ currentUrl: string | null;
85
+ dashboardBaseUrl: string | null;
86
+ response: ResendOnboardingPreviewConfirmationResponse;
87
+ siteSlug: string | null;
88
+ upgradeAlreadyStarted: boolean;
89
+ }>): OnboardingConfirmationPlan;
@@ -0,0 +1,37 @@
1
+ export declare const previewBrowserEntries: {
2
+ readonly previewAuthEntry: {
3
+ readonly pathname: "/preview/auth";
4
+ };
5
+ };
6
+ export declare const previewDashboardApiEndpoints: {
7
+ readonly previewAuthExchange: {
8
+ readonly path: "/api/preview/auth/exchange";
9
+ };
10
+ readonly onboardingPreviewStatus: {
11
+ readonly path: "/api/public/sites/{siteId}/onboarding/preview-status";
12
+ };
13
+ readonly onboardingResendConfirmation: {
14
+ readonly path: "/api/public/sites/{siteId}/onboarding/resend-confirmation";
15
+ };
16
+ };
17
+ export type PreviewBrowserEntryRouteKey = keyof typeof previewBrowserEntries;
18
+ export type PreviewDashboardApiEndpointKey = keyof typeof previewDashboardApiEndpoints;
19
+ export type OnboardingPreviewStage = 'preview';
20
+ export type PreviewAuthEntryUrlInput = Readonly<{
21
+ dashboardBaseUrl: string;
22
+ returnUrl: string;
23
+ fallbackUrl: string;
24
+ siteSlug?: string | null;
25
+ }>;
26
+ export type PreviewAuthExchangeUrlInput = Readonly<{
27
+ dashboardBaseUrl: string;
28
+ }>;
29
+ export type OnboardingPreviewEndpointUrlInput = Readonly<{
30
+ dashboardBaseUrl: string;
31
+ siteId: string;
32
+ }>;
33
+ export declare const previewAuthEntryPathname: "/preview/auth";
34
+ export declare function buildPreviewAuthEntryUrl(input: PreviewAuthEntryUrlInput): string;
35
+ export declare function buildPreviewAuthExchangeUrl(input: PreviewAuthExchangeUrlInput): string;
36
+ export declare function buildOnboardingPreviewStatusUrl(input: OnboardingPreviewEndpointUrlInput): string;
37
+ export declare function buildOnboardingResendConfirmationUrl(input: OnboardingPreviewEndpointUrlInput): string;