Embed
Embed elements drop external content directly into a slide. Three flavors, picked from the inspector.
Three kinds
- iframe — any embeddable URL (YouTube, Vimeo, Calendly, Loom, Figma, your own custom widget). The most flexible.
- code — render a syntax-highlighted code block at canvas position. Useful for technical demos.
- form — link a form (defined elsewhere — e.g., Tally, Typeform, your own backend) so a Button with
action.kind: submit_formcan submit it.
Click Embed in the top toolbar; pick the kind in the inspector.
iframe
| Name | Type | Description |
|---|---|---|
| embedKind* | "iframe" | Discriminator |
| iframeUrl* | string (URL) | Any URL the parent allows iframing. Must be HTTPS. |
json
{
"type": "embed",
"embedKind": "iframe",
"iframeUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ",
"position": { "x": 80, "y": 200, "w": 1100, "h": 619 }
}
Common embeds:
| What | URL pattern |
|---|---|
| YouTube | https://www.youtube.com/embed/<videoId> |
| Vimeo | https://player.vimeo.com/video/<videoId> |
| Loom | https://www.loom.com/embed/<videoId> |
| Calendly | https://calendly.com/<user>?embed=true |
| Figma | https://www.figma.com/embed?embed_host=share&url=... |
Some sites block being iframed (X-Frame-Options / Content-Security-Policy). If your embed shows a blank box, check the source's docs for an embed-specific URL — it usually exists.
code
| Name | Type | Description |
|---|---|---|
| embedKind* | "code" | Discriminator |
| code* | { language: string; source: string } | Language and source. Highlighting is plain today (no syntax tokens) but the schema is ready for future support. |
json
{
"type": "embed",
"embedKind": "code",
"code": {
"language": "tsx",
"source": "<AvatarWidget agentId=\"agt_abc123\" />"
}
}
The current renderer uses a monospace font on a dark surface. Syntax highlighting is on the roadmap — the schema's already ready for it.
form
| Name | Type | Description |
|---|---|---|
| embedKind* | "form" | Discriminator |
| formId* | string | ID of an external form integration (Tally, Typeform, custom). Configure the integration in Settings → Integrations first. |
json
{
"type": "embed",
"embedKind": "form",
"formId": "tally_xyz123"
}
Pair with a Button that has action.kind: submit_form and formElementId pointing at this embed's element ID. Without the button, the form submits when the visitor presses Enter inside it.
Schema reference
Embed element:
| Name | Type | Description |
|---|---|---|
| type* | "embed" | Discriminator |
| embedKind* | "iframe" | "code" | "form" | Which embed flavor |
| iframeUrl | string | iframe only |
| code | { language: string; source: string } | code only |
| formId | string | form only |
Read next
- Button → submit_form — pair a button with a form embed
- Video — for direct MP4/WebM (not iframe sources)