export const LiveReferenceProject = ({ src, poster }) => {
const playerRef = useRef(null);
const playerHostRef = useRef(null);
const [mounted, setMounted] = useState(false);
const [playerReady, setPlayerReady] = useState(false);
const [compositionSrc, setCompositionSrc] = useState(null);
const [previewVisible, setPreviewVisible] = useState(true);
const [loadFailed, setLoadFailed] = useState(false);
const [title, setTitle] = useState("Example Domain");
const [supportingLine, setSupportingLine] = useState(
"For use in documentation examples without needing permission.",
);
const [accent, setAccent] = useState("#334488");
useEffect(() => {
if (!mounted || typeof window === "undefined") return undefined;
let cancelled = false;
const markReady = () => {
if (!cancelled) setPlayerReady(true);
};
if (window.customElements?.get("hyperframes-player")) {
markReady();
return () => {
cancelled = true;
};
}
let script = document.querySelector("script[data-hf-docs-player]");
if (!script) {
script = document.createElement("script");
script.type = "module";
script.src = "https://cdn.jsdelivr.net/npm/@hyperframes/player@0.7.90";
script.dataset.hfDocsPlayer = "true";
script.addEventListener("error", () => !cancelled && setLoadFailed(true), { once: true });
document.head.appendChild(script);
}
window.customElements
?.whenDefined("hyperframes-player")
.then(markReady)
.catch(() => !cancelled && setLoadFailed(true));
return () => {
cancelled = true;
};
}, [mounted]);
useEffect(() => {
if (!playerReady || typeof window === "undefined") return undefined;
const controller = new AbortController();
let objectUrl;
fetch(src, { signal: controller.signal })
.then((response) => {
if (!response.ok) throw new Error(`Composition request failed: ${response.status}`);
return response.text();
})
.then((html) => {
const assetBase = new URL("../", src).toString();
const preparedHtml = html.includes('