| // public/elements/OverlayFrame.jsx | |
| // | |
| // Renders one of the agent's self-contained visualization HTML files (the | |
| // interactive layer overlay, a thickness profile, a class-distribution chart, | |
| // ...) inside an iframe. The HTML is passed whole as `props.html` and isolated | |
| // in the iframe via `srcDoc` so its inline <script> runs without touching the | |
| // Chainlit page. | |
| // | |
| // Chainlit injects component props as a global `props` object — do NOT take | |
| // them as a function argument. | |
| export default function OverlayFrame() { | |
| const html = (typeof props !== "undefined" && props && props.html) || ""; | |
| const title = (typeof props !== "undefined" && props && props.title) || "visualization"; | |
| if (!html) { | |
| return <div className="text-sm opacity-70">No visualization content.</div>; | |
| } | |
| return ( | |
| <div style={{ width: "100%", marginTop: "8px" }}> | |
| <div style={{ fontSize: "12px", opacity: 0.7, marginBottom: "4px" }}>{title}</div> | |
| <iframe | |
| title={title} | |
| srcDoc={html} | |
| sandbox="allow-scripts" | |
| style={{ | |
| width: "100%", | |
| height: "560px", | |
| border: 0, | |
| borderRadius: "8px", | |
| background: "#0d1117", | |
| }} | |
| /> | |
| </div> | |
| ); | |
| } | |