makearmy-app/components/utilities/SVGNestPanel.tsx

91 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client";
import { useEffect, useRef, useState } from "react";
/**
* SVGNest panel same-origin iframe wrapper (clean, frameless).
* Hides the legacy pages heading/tagline and the "Back to Main" link.
*/
export default function SVGNestPanel() {
const iframeRef = useRef<HTMLIFrameElement | null>(null);
const [ready, setReady] = useState(false);
const [err, setErr] = useState<string | null>(null);
useEffect(() => {
const el = iframeRef.current;
if (!el) return;
const onLoad = () => {
setReady(true);
// Tidy up the embedded vendor page (no edits to files on disk)
try {
const doc = el.contentDocument;
if (!doc) return;
// 1) Hide the first H1 (their big title)
const h1 = doc.querySelector("h1");
if (h1) (h1 as HTMLElement).style.display = "none";
// 2) Hide the tagline "automatically nests parts and exports svg"
const all = Array.from(doc.querySelectorAll<HTMLElement>("body *"));
for (const n of all) {
const t = (n.textContent || "").trim().toLowerCase();
if (t.includes("automatically nests parts") && t.includes("exports svg")) {
n.style.display = "none";
}
}
// 3) Hide "Back to Main" link(s)
const anchors = Array.from(doc.querySelectorAll<HTMLAnchorElement>("a"));
for (const a of anchors) {
const text = (a.textContent || "").trim().toLowerCase();
const href = a.getAttribute("href") || "";
const isBackText = text === "back to main" || text === "← back to main";
const isRootHref =
href === "/" ||
/^https?:\/\/[^/]+\/?$/.test(href); // absolute site root
if (isBackText || isRootHref) {
(a as HTMLElement).style.display = "none";
}
}
// 4) Tighten top spacing a touch
(doc.body as HTMLElement).style.marginTop = "4px";
} catch {
// same-origin, so this *should* succeed; ignore if not
}
};
const onError = () => setErr("Failed to load /svgnest/index.html");
el.addEventListener("load", onLoad);
el.addEventListener("error", onError);
return () => {
el.removeEventListener("load", onLoad);
el.removeEventListener("error", onError);
};
}, []);
return (
<div className="w-full">
{!ready && !err && (
<div className="mb-2 text-sm text-zinc-400">Loading SVGnest</div>
)}
{err && (
<div className="mb-2 rounded border border-rose-600/40 bg-rose-600/10 p-3 text-sm">
Couldnt load SVGnest: {err}
</div>
)}
{/* Frameless iframe (no border, no wrapper frame) */}
<iframe
ref={iframeRef}
src="/svgnest/index.html"
title="SVGNest"
className="w-full"
style={{ height: "72vh", background: "transparent", border: "none" }}
/>
</div>
);
}