An iframe whose `src` is driven by a wire, so picking a value elsewhere on the page re-navigates it CLIENT-SIDE — no server round trip, no paint_result, nothing else on the page repainted. A DATA atom, same spirit as sortable_list: it renders whatever src it is given and reacts to whatever is wired into it; it has no opinion on what the iframe shows. Meant to sit next to a picker (menu/select) and a StringTemplate primitive that turns the picked value into a URL — e.g. a "preview this before you commit it" panel, where committing is a SEPARATE, ordinary action. Same-origin only in practice: nothing here relaxes sandboxing. A cross-origin src is subject to the embedded page's own frame-ancestors / X-Frame-Options exactly as any other iframe.
| Surface | Note |
|---|---|
| google-apps-script-web | Renders and re-navigates the same as MCP Apps, but is subject to the GAS iframe sandbox's restrictions on nested frames the same way embed_google_slides/embed_youtube already are — a cross-origin src may not load there even though a same-origin one does. |
| web | Renders a static iframe at the initial `src`; the Python reference renderer has no wire engine, so it never re-navigates. |
| Field | Type | |
|---|---|---|
| src | string. Initial iframe URL. Empty renders the placeholder instead of an iframe. Normally left empty and driven entirely by `wire.src`. | optional |
| label | string. A small heading above the frame. | optional |
| height | number. Frame height in px. Default 320. | optional |
| emptyMessage | string. Shown in the placeholder before a src exists. Default "Nothing selected yet." | optional |
{
"type": "preview_frame"
}
{
"identifier": "urn:air:a2uicatalog.ai:atom:preview_frame",
"displayName": "Preview Frame",
"type": "application/vnd.a2ui.atom+json",
"url": "https://a2uicatalog.ai/atoms/preview_frame",
"capabilities": [
"mcp-apps"
],
"description": "An iframe whose `src` is driven by a wire, so picking a value elsewhere on the page re-navigates it CLIENT-SIDE \u2014 no server round trip, no paint_result, nothing else on the page repainted.\nA DATA atom, same spirit as sortable_list: it renders whatever src it is given and reacts to whatever is wired into it; it has no opinion on what the iframe shows. Meant to sit next to a picker (menu/select) and a StringTemplate primitive that turns the picked value into a URL \u2014 e.g. a \"preview this before you commit it\" panel, where committing is a SEPARATE, ordinary action.\nSame-origin only in practice: nothing here relaxes sandboxing. A cross-origin src is subject to the embedded page's own frame-ancestors / X-Frame-Options exactly as any other iframe.",
"representativeQueries": [
"show a iframe whose src is wired to another node's value, so picking updates it with no repaint",
"an iframe whose `src` is driven by a wire, so picking a value elsewhere on the page re-navigates it",
"render a preview frame"
]
}
The renderer is an open-source Google Apps Script web app. Deploy your own instance in 4 commands — you own the URL, no dependency on the demo endpoint.
git clone https://github.com/a2uicatalog/a2ui
cd a2ui/apps-script-surface/gas-wired-renderer
clasp push && clasp deploy
Full deploy guide →