diff options
Diffstat (limited to 'apps/web/src/app')
| -rw-r--r-- | apps/web/src/app/editor/page.tsx | 43 |
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 /> |
