import { ComponentChildren, HTMLAttributes, JSX, RefObject, render } from "preact";
import { useEffect, useState } from "preact/hooks";
import { useSyncedRef } from "./hooks";
interface ShadowDomProps extends Omit, "ref"> {
children: ComponentChildren;
containerRef?: RefObject;
}
export default function ShadowDom({ children, containerRef: externalContainerRef, ...containerProps }: ShadowDomProps) {
const containerRef = useSyncedRef(externalContainerRef, null);
const [ shadowRoot, setShadowRoot ] = useState(null);
// Create the shadow root.
useEffect(() => {
if (!containerRef.current) return;
const shadow = containerRef.current.attachShadow({ mode: "open" });
setShadowRoot(shadow);
}, []);
// Render the child elements.
useEffect(() => {
if (!shadowRoot) return;
render(<>{children}>, shadowRoot);
}, [ shadowRoot, children ]);
return
}