Files
Genarrative/packages/image-canvas-react/src/CanvasPortal.tsx
T
menghao 03a4410272
Project CI / Repository checks (push) Successful in 1m5s
Project CI / Frontend tests (push) Successful in 3m20s
Project CI / Backend tests (push) Successful in 4m1s
Project CI / Native shell tests (push) Failing after 11m56s
game agent无限画布开发 (#136)
主要工作是共享同一套“画布内核与通用 UI 源码”,网站和 Tauri 只分别实现宿主适配层。

---------

Co-authored-by: 段舒康 <kdletters@qq.com>
Co-authored-by: kdletters <kdletters@qq.com>
Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/136
Co-authored-by: menghao <mh18530625731@163.com>
Co-committed-by: menghao <mh18530625731@163.com>
2026-08-12 10:54:16 +08:00

42 lines
974 B
TypeScript

import { createContext, type ReactNode, useContext } from 'react';
import { createPortal } from 'react-dom';
const CanvasPortalRootContext = createContext<HTMLElement | null>(null);
export function CanvasPortalProvider({
children,
root,
}: {
children: ReactNode;
root: HTMLElement | null;
}) {
return (
<CanvasPortalRootContext.Provider value={root}>
{children}
</CanvasPortalRootContext.Provider>
);
}
export function CanvasPortal({
children,
className = '',
container,
}: {
children: ReactNode;
className?: string;
container?: HTMLElement | null;
}) {
const contextualRoot = useContext(CanvasPortalRootContext);
const portalRoot =
container ??
contextualRoot ??
(typeof document === 'undefined' ? null : document.body);
if (!portalRoot) return <>{children}</>;
return createPortal(
<div className={`genarrative-image-canvas__portal ${className}`.trim()}>
{children}
</div>,
portalRoot,
);
}