summaryrefslogtreecommitdiff
path: root/apps/web/src/app
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/app')
-rw-r--r--apps/web/src/app/editor/page.tsx43
1 files changed, 37 insertions, 6 deletions
diff --git a/apps/web/src/app/editor/page.tsx b/apps/web/src/app/editor/page.tsx
index 8229774a..5719be94 100644
--- a/apps/web/src/app/editor/page.tsx
+++ b/apps/web/src/app/editor/page.tsx
@@ -17,7 +17,8 @@ import { MigrationDialog } from "@/project/components/migration-dialog";
import { usePanelStore } from "@/editor/panel-store";
import { usePasteMedia } from "@/media/use-paste-media";
import { MobileGate } from "@/components/editor/mobile-gate";
-import { Suspense, useMemo, useState } from "react";
+import { Suspense, useEffect, useMemo, useState } from "react";
+import { createPortal } from "react-dom";
import { useEditor } from "@/editor/use-editor";
import { Cancel01Icon } from "@hugeicons/core-free-icons";
import { HugeiconsIcon } from "@hugeicons/react";
@@ -29,6 +30,7 @@ import {
mergePreviewOverlaySources,
} from "@/preview/overlays";
import { usePreviewStore } from "@/preview/preview-store";
+import { usePreviewPopoutStore } from "@/preview/popout-store";
import { getGuidePreviewOverlaySource } from "@/guides";
import {
bookmarkNotesPreviewOverlay,
@@ -98,6 +100,14 @@ function EditorLayout() {
const setOverlayVisibility = usePreviewStore(
(state) => state.setOverlayVisibility,
);
+ const popoutContainer = usePreviewPopoutStore((state) => state.container);
+ const dockPopout = usePreviewPopoutStore((state) => state.dockPopout);
+
+ useEffect(() => {
+ return () => {
+ usePreviewPopoutStore.getState().dockPopout();
+ };
+ }, []);
const showBookmarkNotes = isPreviewOverlayVisible({
overlay: bookmarkNotesPreviewOverlay,
overlays,
@@ -182,11 +192,32 @@ function EditorLayout() {
minSize={30}
className="min-h-0 min-w-0 flex-1"
>
- <PreviewPanel
- overlayControls={overlayControls}
- overlayInstances={overlaySource.instances}
- onOverlayVisibilityChange={setOverlayVisibility}
- />
+ {popoutContainer ? (
+ <>
+ {createPortal(
+ <PreviewPanel
+ overlayControls={overlayControls}
+ overlayInstances={overlaySource.instances}
+ onOverlayVisibilityChange={setOverlayVisibility}
+ />,
+ popoutContainer,
+ )}
+ <div className="flex size-full flex-col items-center justify-center gap-3">
+ <span className="text-muted-foreground text-sm">
+ Preview is popped out
+ </span>
+ <Button variant="secondary" onClick={dockPopout}>
+ Dock preview
+ </Button>
+ </div>
+ </>
+ ) : (
+ <PreviewPanel
+ overlayControls={overlayControls}
+ overlayInstances={overlaySource.instances}
+ onOverlayVisibilityChange={setOverlayVisibility}
+ />
+ )}
</ResizablePanel>
<ResizableHandle withHandle />