[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openai-figma-use-slides":3,"mdc-v7v1gj-key":39,"related-repo-openai-figma-use-slides":3195,"related-org-openai-figma-use-slides":3317},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":28,"repoUrl":29,"updatedAt":30,"license":31,"forks":32,"topics":33,"repo":34,"sourceUrl":37,"mdContent":38},"figma-use-slides","use Figma tools in Slides context","This skill helps agents use Figma's use_figma MCP tool in the Slides context. Can be used alongside figma-use which has foundational context for using the use_figma tool.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"openai","OpenAI","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenai.png",[12,16,19,22,25],{"name":13,"slug":14,"type":15},"Presentations","presentations","tag",{"name":17,"slug":18,"type":15},"Collaboration","collaboration",{"name":20,"slug":21,"type":15},"MCP","mcp",{"name":23,"slug":24,"type":15},"Figma","figma",{"name":26,"slug":27,"type":15},"Design","design",3992,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins","2026-05-16T06:07:58.063234",null,465,[],{"repoUrl":29,"stars":28,"forks":32,"topics":35,"description":36},[],"OpenAI Plugins","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins\u002Ftree\u002FHEAD\u002Fplugins\u002Ffigma\u002Fskills\u002Ffigma-use-slides","---\nname: figma-use-slides\ndescription: \"This skill helps agents use Figma's use_figma MCP tool in the Slides context. Can be used alongside figma-use which has foundational context for using the use_figma tool.\"\ndisable-model-invocation: false\n---\n\n# use_figma — Figma Plugin API Skill for Slides\n\nThis skill contains Slides-specific context for the `use_figma` MCP tool. The [figma-use](..\u002Ffigma-use\u002FSKILL.md) skill provides foundational context for plugin API execution via MCP as well as the full Figma plugin API for more advanced use-cases that are not described here.\n\n**Always include `figma-use-slides` in the comma-separated `skillNames` parameter when calling `use_figma` for Slides operations. If this skill was loaded via an MCP resource, you MUST prefix the name with `resource:` (e.g. `resource:figma-use-slides`).** This is a logging parameter used to track skill usage — it does not affect execution.\n\n## Choosing How to Build a Slides Deck\n\nIf your environment also provides a `generate_deck` tool, choose **one** approach per deck request — do not call both for the same deck.\n\n### When to use which\n\n**`use_figma` + this skill (default):** Handles any Slides task — new decks, edits to existing decks, brand-matched designs, reference-file styling, iterative refinement, speaker notes, and full creative control over layout, color, and typography. Use this for most requests.\n\n**`generate_deck`:** Generates a complete deck in a single call using prebuilt, curated templates. Useful for quick, straightforward decks where the user doesn't need custom design, brand matching, or reference-file styling. It cannot use custom templates, cannot reference other Figma files for design direction, and does not support iterative editing or follow-up modifications through the conversation.\n\nWhen in doubt, default to `use_figma` + this skill — it covers everything `generate_deck` can do and more.\n\n### Pick one and commit\n\nOnce you choose an approach for a deck, complete the entire request with that approach. Do not generate a deck with `generate_deck` and then also create or populate a file with `use_figma` — the user ends up with duplicate, conflicting artifacts and a confusing experience.\n\n## Critical Rules (Slides-specific)\n\n1. **Newly created Slides files have a default light theme.** When a Slides file is created via `create_new_file`, a default light theme is automatically initialized. This theme is structural scaffolding — you should overwrite the theme's color variables and text styles with your own design direction for the deck you're building. Do not rely on or be influenced by the default light theme tokens.\n2. **MUST `appendChild` BEFORE setting `x`\u002F`y` — for every node, at every level of nesting.** Newly created nodes are silently auto-parented to a slide context at absolute `(240, 240)` (the slide grid's `GRID_PADDING`). Writing `x`\u002F`y` before `appendChild` causes the value to be stored against that hidden origin; the node then lands at `(intended − 240, intended − 240)` once you attach the real parent. The bug is **intermittent** — some frames in the same script escape it, so a working test is not proof you're safe. **Signature to recognize:** if any node ends up `(−240, −240)` from where you set it, your code set `x`\u002F`y` before the final `appendChild`. Do NOT try to compensate by adding 240 back — that produces worse output on retry. Fix the order instead. See [slide-gotchas.md](references\u002Fslide-gotchas.md#position-after-appendchild-critical) for the helper pattern that makes the order impossible to get wrong.\n3. **SLIDE_GRID and SLIDE_ROW are opaque nodes** — do not access `.fills`, `.effects`, or layout properties on them. Only `SLIDE` nodes (type `'SLIDE'`) extend `BaseFrameMixin`. **Exception:** `SLIDE_ROW.name` IS settable — that's how plugins rename slide sections (e.g. `slideRow.name = \"Intro\"`). See [slide-lifecycle.md](references\u002Fslide-lifecycle.md).\n4. **`get_metadata` does NOT work on Slides files.** Use `use_figma` read-only scripts for validation. Return created node positions in `closePlugin()` output and verify no overlapping bounding boxes.\n5. **Do NOT call `figma.createPage()` in Slides.** It throws `TypeError: figma.createPage no such property 'createPage' on the figma global object` — `createPage()` is a Design-file API only (`figma.com\u002Fdesign\u002F...`); the Slides URL is `figma.com\u002Fslides\u002F...`. Use the slide grid (`SLIDE_GRID` \u002F `SLIDE_ROW` \u002F `SLIDE`) to organize deck structure instead — see [slide-lifecycle.md](references\u002Fslide-lifecycle.md) and [slide-grid.md](references\u002Fslide-grid.md).\n6. **Never delete existing slides to rebuild them.** When asked to improve, redesign, or restyle a deck, modify the existing slides in place. Only delete slides when the user explicitly asks to \"start over\" or \"redo from scratch.\"\n\n## Design Thinking\n\nNot every task needs the same depth of design thinking. Before doing anything, identify which gear you're in:\n\n- **Content\u002Fproperty edits** — changing text, swapping a color, updating a number, fixing alignment, resizing an element. Skip design thinking. Just make the change and match what's already there.\n- **Structural additions** — adding slides, reworking a section's layout, changing the deck's color palette, introducing a new visual element. This includes requests to \"improve,\" \"redesign,\" or \"restyle\" a deck — those are in-place edits to what's already there, not a new deck. Design thinking applies, but in *inherit* mode: the existing deck is your design language. Inspect it, match its palette, type, spatial habits, and motifs. Extend the deck's existing character rather than reinventing it.\n- **New deck creation** — building a deck from scratch or from a blank file. Full design thinking applies as described below.\n\nFor structural additions to existing decks: run the inspection scripts (below) and take screenshots before making changes. The answers to \"what color story?\" and \"what type treatment?\" are already in the file — your job is to read them and stay consistent. The design principles in [slide-design.md](references\u002Fslide-design.md) describe what you're *matching*, not what you're *choosing*.\n\n### New deck design process\n\nBefore writing any Plugin API code for a new deck, decide what it should *feel* like. Figma users have high visual expectations — a deck that looks like it came out of a generic template generator will stand out for the wrong reasons.\n\n1. **Read the brief.** What is the deck communicating, and to whom? An investor pitch, a team retrospective, a product launch, and a technical deep-dive all demand different visual treatments. The design should be inseparable from the content.\n2. **Check for a design language.** Before inventing anything, look at what the user already gave you. Brand guidelines in the prompt — color palettes, typography specs, logo rules, tone descriptors — are design decisions that have already been made. A link to a reference Figma file is a design language you should study, not glance at. The more specific the user's inputs, the less you should invent on your own. When the user provides a reference, your job shifts from *designer* to *interpreter*: extract the design language and apply it faithfully to new content.\n3. **Take a position — on what's left.** If the user supplied a full brand system, your creative latitude is in layout, pacing, and composition — not in color or type. If they gave you a single reference slide for inspiration, you have more room but should still echo its character. If they gave you nothing, then you own every decision — choose a color story, a type treatment, a way of organizing space, and follow through on it across every slide. A deck with a clear perspective (even a quiet one) always reads better than one that plays it safe on every decision. The scope of \"take a position\" scales inversely with what the user provided.\n4. **Give it a signature.** Every good deck has at least one element you'd recognize if you saw it out of context: a distinctive palette, an unexpected layout cadence, a recurring shape language. When working from brand guidelines, the signature should *come from* that brand language — amplify something that's already there rather than adding something foreign. When designing from scratch, decide what the signature is before you start building.\n\n### Reading a reference file\n\nWhen the user provides a link to a Figma file as a reference, study it before designing anything. What you extract depends on what the file is:\n\n- **A Slides file**: `get_metadata` does not work on Slides files. Use `get_screenshot` to capture individual slides for visual reference, and `use_figma` with the reference file's `fileKey` to run read-only scripts that extract theme variables, color palettes, font choices, and layout patterns.\n- **A Design file**: `get_design_context` gives you comprehensive design data — colors, typography, layout structure. `get_screenshot` gives you visual reference. Use both.\n\nWhat to look for in a reference file: the color palette (which hue leads, what the accent is, how dark\u002Flight backgrounds are used), the type choices (families, weights, how hierarchy is handled), the spatial habits (where content anchors, how much whitespace, whether things bleed off edges), and any recurring motifs (shapes, line treatments, decorative elements). These are the decisions you inherit — everything else is yours.\n\nHow closely to follow the reference depends on what the user asked for. \"Make it look like this\" means replicate the design language with new content. \"Use this for inspiration\" means echo the character but make it your own. \"Here's our brand deck\" means extract the brand system and apply it consistently. When in doubt, stay closer to the reference — it's easier for a user to ask you to diverge than to ask you to undo invented choices that conflict with their brand.\n\nLoad [slide-design.md](references\u002Fslide-design.md) for specific guidance on color, type, layout patterns, composition, and what to avoid. When you have a reference file or brand guidelines, treat slide-design.md's principles as defaults for the decisions the user *didn't* make — not as overrides for the ones they did.\n\n## Deck-Building Workflow\n\nWhen building a new deck of 5 or more slides, use this two-phase workflow. It replaces the general incremental workflow from [figma-use](..\u002Ffigma-use\u002FSKILL.md) Section 6 for deck-building specifically — the principles still apply, but the cadence changes.\n\n### Phase 1 — Design & Plan\n\nComplete the design thinking process above (read the brief, check for a design language, take a position, give it a signature), then **before writing any `use_figma` code**, produce a slide plan covering the entire deck:\n\n1. **Slide-by-slide plan.** For every slide: its purpose\u002Fcontent, layout approach described spatially (e.g. \"title anchored upper-left, spec card filling the right third, decorative circle bleeding off top-right edge\"), and background treatment (dark\u002Flight\u002Fgradient). Do NOT compute pixel coordinates during planning — describe layouts in spatial terms. Coordinate math happens during code generation.\n2. **Shared constants.** Declare the font families and styles you'll use, the color palette as named roles (primary, accent, bgDark, surface, textPrimary, textMuted, etc.), and the recurring motif or signature element.\n3. **Layout variety check.** Read through the slide plans in sequence. If the layout descriptions feel repetitive — \"two-column, two-column, grid, two-column\" — rearrange before building. This is the cheapest moment to diversify. See [slide-design.md](references\u002Fslide-design.md) for anti-patterns.\n4. **Code preamble.** Write out the reusable preamble you'll paste at the top of every build script: a `const C = { ... }` color palette object, a `Promise.all([...])` font-loading block, and the `addFrame`\u002F`addText`\u002F`addRect` helpers from [slide-gotchas.md](references\u002Fslide-gotchas.md#position-after-appendchild-critical).\n\n### Phase 2 — Build\n\nExecute the plan in large batches. The goal is to minimize the number of think-then-build cycles — not to minimize elements per script.\n\n- **3–5 slides per `use_figma` call.** Structurally similar slides (e.g. a series of product feature slides) can go in the same batch. Each slide is an isolated subtree — cross-slide dependencies don't exist, so large batches are safe.\n- **Do NOT re-plan between batches.** The design was decided in Phase 1. If a batch succeeds and passes validation, move to the next batch immediately. Only re-plan if a batch fails or produces a visual problem that requires changing the approach.\n- **Paste the code preamble** (colors, fonts, helpers) at the top of every build script. Copy it from Phase 1 verbatim — do not re-derive it.\n- **Validate every batch** with the deterministic batch validation script from [slide-gotchas.md](references\u002Fslide-gotchas.md#batch-validation-script). This checks for overlapping elements, text clipping, and out-of-bounds nodes in ~3 seconds. If the check passes, proceed without a screenshot. If it fails, screenshot the affected slides and fix before continuing.\n- **Screenshot at checkpoints only** — after the first batch (validates the visual system: colors, typography, design direction), and after the final batch (overall quality). Take a screenshot of 1–2 representative slides per checkpoint using inline `await slide.screenshot()`, not separate `get_screenshot` calls.\n- **Return all created node IDs** from every build script, as always.\n\n## Sections\n\nA section is a horizontal row in the slide grid — every row is a section. Names show up in the editor (next to the row) and in Presenter View (so speakers can jump between groups). They're an organizational aid for whoever is editing the deck — the user owns where the breaks fall, not you.\n\n### When asked to organize a deck\n\n\"Organize this deck\" is ambiguous — grouping, reordering, deduping, or restructuring. Read the deck before reaching for `AskUserQuestion`.\n\n**Default: propose, don't ask.** Most decks have cues — title bookend, numbered use cases, repeated *Before \u002F After* pairs, transition slides (\"Then X enters the chat\"), a *Thank you*. When cues exist, pick a sectioning and surface it in one confirmation message. Bounded calls inside the proposal (one *Use Cases* row vs. three, where a transition slide lives) are reversible — pick one and move on.\n\n**Fallback: ask when cues are absent.** If slides are in arbitrary order or there's no spine, ask which ranges go together and what to call them. Don't slice by thirds as a substitute for reading.\n\n### Naming + scoping\n\nNames should be short (1–3 words), concrete (*Demo* beats *Show & tell*), and consistent within a deck. Two to five sections is typical; more only for long or repeating decks. Names aren't slide titles — they help find a group, not describe its content.\n\n### Renaming a section\n\n`getSlideGrid()` returns `SlideNode[][]` — the inner arrays are plain JS arrays of slides, NOT `SLIDE_ROW` nodes. Setting `.name` on those arrays silently no-ops. To rename a section, traverse the node tree and set `.name` on the actual `SLIDE_ROW`:\n\n```js\nconst slideGrid = figma.currentPage.children.find(c => c.type === \"SLIDE_GRID\");\nslideGrid.children[0].name = \"Intro\";\n```\n\n## Speaker Notes\n\nSpeaker notes are the presenter's private companion to each slide. They appear in Presenter View (visible only to the speaker, not the audience) and serve as a script, cue sheet, or talking-points reference during a live presentation.\n\n### When to write speaker notes\n\n- **When asked**: If the user asks for speaker notes, presenter notes, talking points, or a script for a deck, write notes for every slide that has substantive content (skip section dividers or purely decorative slides unless there's something to say).\n- **Presenter-ready decks**: If the user explicitly asks for a deck that is ready to present live, speaker notes are useful. Add them when they help the presenter understand pacing, transitions, or context that is not visible on the slide.\n- **Sparse or visual slides**: If a slide is built around a chart, image, metaphor, or provocative question, notes can help explain what the presenter should say. Use screenshots or `node.screenshot()` for image-heavy, chart-heavy, or visually sparse slides when visual context matters, but don't screenshot every slide by default — images spend context budget.\n- **Don't add notes unprompted**: For normal slide edits, layout work, or updates to existing decks, do not populate speaker notes unless the user asks. Adding notes changes the presentation flow and can surprise the deck owner.\n\n### What good speaker notes look like\n\nSpeaker notes are for the *presenter*, not the audience. They should feel like a trusted colleague leaning over and whispering \"here's what to say.\" Good notes:\n\n- **Complement the slide, not repeat it.** If the slide says \"Revenue grew 40%\", the notes shouldn't say \"Revenue grew 40%.\" They should say *why* it grew, what the audience should take away, or what question this usually prompts.\n- **Are concise and scannable.** A presenter glancing down mid-sentence needs to find their place instantly. Use short bullet points, not dense paragraphs. Each point should be one idea.\n- **Include transitions.** The best notes tell the presenter how to *move* between slides: \"After the applause dies down...\" or \"This builds on the previous point — call back to the 40% figure.\"\n- **Carry context the slide can't.** Data sources (\"Source: Q4 FY25 internal metrics, not yet public\"), caveats (\"Skip this slide if the CFO is in the room\"), timing cues (\"This is the halfway point — you should be at ~10 minutes\"), and anticipated questions (\"They'll ask about margins — see appendix slide 14\").\n- **Match the presentation's register.** Notes for an investor pitch are precise and rehearsed. Notes for a team retro are casual and flexible. Notes for a keynote might include stage directions. Match the tone to the context.\n\n### What to avoid in speaker notes\n\n- **Full scripts**: Wall-of-text notes encourage reading verbatim, which makes for a terrible presentation. If the user explicitly asks for a script, write one, but default to bullet points.\n- **Formatting for the audience**: Notes aren't visible to the audience. Don't optimize them for readability by non-presenters.\n- **Redundancy with the slide**: If the slide is self-explanatory (\"Thank You\" with contact info), notes aren't needed. It's fine to leave a slide's notes empty.\n\n### Formatting\n\n`slide.speakerNotes` accepts a markdown string. Prefer bullet lists as the primary structure; bold is useful for emphasis on key phrases the presenter shouldn't skip. See [slide-properties.md](references\u002Fslide-properties.md#supported-formatting) for the full list of supported (lists, bold, italic, strikethrough) and unsupported (headings, code blocks, inline code, links) markdown.\n\n## Inspecting Slides Files\n\nThere is no dedicated read tool for Slides files yet. Use `use_figma` with read-only scripts for inspection, and `get_screenshot` \u002F `await node.screenshot()` for visual context.\n\n- **Inspect before creating.** Before creating anything, run a read-only `use_figma` to discover what already exists — slides, text, components, naming conventions. The [figma-use](..\u002Ffigma-use\u002FSKILL.md) Section 6 \"Inspect first\" pattern applies here.\n- **`get_metadata` does NOT work on Slides files** — it only supports `figma` (Design) editor type.\n- **`console.log()` output is NOT returned** — only the `return` value comes back. Always `return` the data you need.\n- **Use `get_screenshot` for visual context** — pass a valid `nodeId` to get a screenshot. You can also use `await node.screenshot()` inline within `use_figma` scripts.\n\n### Quick inspection scripts\n\n**List all slides in the deck:**\n```js\nconst grid = figma.getSlideGrid();\nreturn grid.map((row, rowIdx) =>\n  row.map((slide, colIdx) => ({\n    id: slide.id,\n    name: slide.name,\n    row: rowIdx,\n    col: colIdx,\n    isSkipped: slide.isSkippedSlide,\n    speakerNotes: slide.speakerNotes,\n  }))\n);\n```\n\n**Get text content from a specific slide:**\n```js\nconst slide = figma.getNodeById(\"TARGET_SLIDE_ID\");\n\u002F\u002F findAllWithCriteria uses an indexed type lookup — much faster than\n\u002F\u002F findAll(n => n.type === 'TEXT') on slides with many shapes\u002Fimages.\nconst textNodes = slide.findAllWithCriteria({ types: [\"TEXT\"] });\nconst fontsToLoad = new Set();\nfor (const t of textNodes) {\n  if (t.fontName !== figma.mixed) {\n    fontsToLoad.add(JSON.stringify(t.fontName));\n  } else {\n    const segments = t.getStyledTextSegments([\"fontName\"]);\n    for (const seg of segments) fontsToLoad.add(JSON.stringify(seg.fontName));\n  }\n}\nfor (const f of fontsToLoad) {\n  await figma.loadFontAsync(JSON.parse(f));\n}\nreturn textNodes.map(t => ({\n  id: t.id,\n  name: t.name,\n  characters: t.characters,\n  x: t.x,\n  y: t.y,\n  width: t.width,\n  height: t.height,\n}));\n```\n\n## Reference Docs\n\nLoad only the references your task needs:\n\n- [slide-gotchas](references\u002Fslide-gotchas.md) — Pitfalls specific to Slides (coordinate offsets, opaque node types, validation workarounds)\n- [slide-lifecycle](references\u002Fslide-lifecycle.md) — Create, clone, delete, and reorder slides and slide rows\n- [slide-grid](references\u002Fslide-grid.md) — Work with the slide grid layout (`getSlideGrid`, `setSlideGrid`)\n- [slide-content](references\u002Fslide-content.md) — Build content within slides (text, shapes, auto-layout — SlideNode extends BaseFrameMixin)\n- [slide-properties](references\u002Fslide-properties.md) — Slide-specific properties (`speakerNotes`, `isSkippedSlide`, `focusedSlide`, `focusedNode`, `slideThemeId`, `InteractiveSlideElementNode`)\n- [slide-design](references\u002Fslide-design.md) — Design principles for visually interesting, varied decks (color strategy, typography, layout variety, spatial composition, anti-patterns)\n",{"data":40,"body":42},{"name":4,"description":6,"disable-model-invocation":41},false,{"type":43,"children":44},"root",[45,54,78,127,134,154,161,176,191,210,216,235,241,599,605,610,652,678,684,696,760,766,771,838,843,848,866,872,883,889,908,1000,1006,1011,1103,1109,1114,1120,1132,1163,1173,1179,1198,1204,1251,1438,1444,1449,1455,1506,1512,1524,1591,1597,1630,1636,1655,1661,1687,1805,1811,1819,2166,2174,3059,3065,3070,3189],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"use_figma-figma-plugin-api-skill-for-slides",[51],{"type":52,"value":53},"text","use_figma — Figma Plugin API Skill for Slides",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58,60,67,69,76],{"type":52,"value":59},"This skill contains Slides-specific context for the ",{"type":46,"tag":61,"props":62,"children":64},"code",{"className":63},[],[65],{"type":52,"value":66},"use_figma",{"type":52,"value":68}," MCP tool. The ",{"type":46,"tag":70,"props":71,"children":73},"a",{"href":72},"..\u002Ffigma-use\u002FSKILL.md",[74],{"type":52,"value":75},"figma-use",{"type":52,"value":77}," skill provides foundational context for plugin API execution via MCP as well as the full Figma plugin API for more advanced use-cases that are not described here.",{"type":46,"tag":55,"props":79,"children":80},{},[81,125],{"type":46,"tag":82,"props":83,"children":84},"strong",{},[85,87,92,94,100,102,107,109,115,117,123],{"type":52,"value":86},"Always include ",{"type":46,"tag":61,"props":88,"children":90},{"className":89},[],[91],{"type":52,"value":4},{"type":52,"value":93}," in the comma-separated ",{"type":46,"tag":61,"props":95,"children":97},{"className":96},[],[98],{"type":52,"value":99},"skillNames",{"type":52,"value":101}," parameter when calling ",{"type":46,"tag":61,"props":103,"children":105},{"className":104},[],[106],{"type":52,"value":66},{"type":52,"value":108}," for Slides operations. If this skill was loaded via an MCP resource, you MUST prefix the name with ",{"type":46,"tag":61,"props":110,"children":112},{"className":111},[],[113],{"type":52,"value":114},"resource:",{"type":52,"value":116}," (e.g. ",{"type":46,"tag":61,"props":118,"children":120},{"className":119},[],[121],{"type":52,"value":122},"resource:figma-use-slides",{"type":52,"value":124},").",{"type":52,"value":126}," This is a logging parameter used to track skill usage — it does not affect execution.",{"type":46,"tag":128,"props":129,"children":131},"h2",{"id":130},"choosing-how-to-build-a-slides-deck",[132],{"type":52,"value":133},"Choosing How to Build a Slides Deck",{"type":46,"tag":55,"props":135,"children":136},{},[137,139,145,147,152],{"type":52,"value":138},"If your environment also provides a ",{"type":46,"tag":61,"props":140,"children":142},{"className":141},[],[143],{"type":52,"value":144},"generate_deck",{"type":52,"value":146}," tool, choose ",{"type":46,"tag":82,"props":148,"children":149},{},[150],{"type":52,"value":151},"one",{"type":52,"value":153}," approach per deck request — do not call both for the same deck.",{"type":46,"tag":155,"props":156,"children":158},"h3",{"id":157},"when-to-use-which",[159],{"type":52,"value":160},"When to use which",{"type":46,"tag":55,"props":162,"children":163},{},[164,174],{"type":46,"tag":82,"props":165,"children":166},{},[167,172],{"type":46,"tag":61,"props":168,"children":170},{"className":169},[],[171],{"type":52,"value":66},{"type":52,"value":173}," + this skill (default):",{"type":52,"value":175}," Handles any Slides task — new decks, edits to existing decks, brand-matched designs, reference-file styling, iterative refinement, speaker notes, and full creative control over layout, color, and typography. Use this for most requests.",{"type":46,"tag":55,"props":177,"children":178},{},[179,189],{"type":46,"tag":82,"props":180,"children":181},{},[182,187],{"type":46,"tag":61,"props":183,"children":185},{"className":184},[],[186],{"type":52,"value":144},{"type":52,"value":188},":",{"type":52,"value":190}," Generates a complete deck in a single call using prebuilt, curated templates. Useful for quick, straightforward decks where the user doesn't need custom design, brand matching, or reference-file styling. It cannot use custom templates, cannot reference other Figma files for design direction, and does not support iterative editing or follow-up modifications through the conversation.",{"type":46,"tag":55,"props":192,"children":193},{},[194,196,201,203,208],{"type":52,"value":195},"When in doubt, default to ",{"type":46,"tag":61,"props":197,"children":199},{"className":198},[],[200],{"type":52,"value":66},{"type":52,"value":202}," + this skill — it covers everything ",{"type":46,"tag":61,"props":204,"children":206},{"className":205},[],[207],{"type":52,"value":144},{"type":52,"value":209}," can do and more.",{"type":46,"tag":155,"props":211,"children":213},{"id":212},"pick-one-and-commit",[214],{"type":52,"value":215},"Pick one and commit",{"type":46,"tag":55,"props":217,"children":218},{},[219,221,226,228,233],{"type":52,"value":220},"Once you choose an approach for a deck, complete the entire request with that approach. Do not generate a deck with ",{"type":46,"tag":61,"props":222,"children":224},{"className":223},[],[225],{"type":52,"value":144},{"type":52,"value":227}," and then also create or populate a file with ",{"type":46,"tag":61,"props":229,"children":231},{"className":230},[],[232],{"type":52,"value":66},{"type":52,"value":234}," — the user ends up with duplicate, conflicting artifacts and a confusing experience.",{"type":46,"tag":128,"props":236,"children":238},{"id":237},"critical-rules-slides-specific",[239],{"type":52,"value":240},"Critical Rules (Slides-specific)",{"type":46,"tag":242,"props":243,"children":244},"ol",{},[245,264,392,473,504,589],{"type":46,"tag":246,"props":247,"children":248},"li",{},[249,254,256,262],{"type":46,"tag":82,"props":250,"children":251},{},[252],{"type":52,"value":253},"Newly created Slides files have a default light theme.",{"type":52,"value":255}," When a Slides file is created via ",{"type":46,"tag":61,"props":257,"children":259},{"className":258},[],[260],{"type":52,"value":261},"create_new_file",{"type":52,"value":263},", a default light theme is automatically initialized. This theme is structural scaffolding — you should overwrite the theme's color variables and text styles with your own design direction for the deck you're building. Do not rely on or be influenced by the default light theme tokens.",{"type":46,"tag":246,"props":265,"children":266},{},[267,296,298,304,306,312,314,319,320,325,327,332,334,340,342,347,349,354,356,362,364,369,370,375,377,382,384,390],{"type":46,"tag":82,"props":268,"children":269},{},[270,272,278,280,286,288,294],{"type":52,"value":271},"MUST ",{"type":46,"tag":61,"props":273,"children":275},{"className":274},[],[276],{"type":52,"value":277},"appendChild",{"type":52,"value":279}," BEFORE setting ",{"type":46,"tag":61,"props":281,"children":283},{"className":282},[],[284],{"type":52,"value":285},"x",{"type":52,"value":287},"\u002F",{"type":46,"tag":61,"props":289,"children":291},{"className":290},[],[292],{"type":52,"value":293},"y",{"type":52,"value":295}," — for every node, at every level of nesting.",{"type":52,"value":297}," Newly created nodes are silently auto-parented to a slide context at absolute ",{"type":46,"tag":61,"props":299,"children":301},{"className":300},[],[302],{"type":52,"value":303},"(240, 240)",{"type":52,"value":305}," (the slide grid's ",{"type":46,"tag":61,"props":307,"children":309},{"className":308},[],[310],{"type":52,"value":311},"GRID_PADDING",{"type":52,"value":313},"). Writing ",{"type":46,"tag":61,"props":315,"children":317},{"className":316},[],[318],{"type":52,"value":285},{"type":52,"value":287},{"type":46,"tag":61,"props":321,"children":323},{"className":322},[],[324],{"type":52,"value":293},{"type":52,"value":326}," before ",{"type":46,"tag":61,"props":328,"children":330},{"className":329},[],[331],{"type":52,"value":277},{"type":52,"value":333}," causes the value to be stored against that hidden origin; the node then lands at ",{"type":46,"tag":61,"props":335,"children":337},{"className":336},[],[338],{"type":52,"value":339},"(intended − 240, intended − 240)",{"type":52,"value":341}," once you attach the real parent. The bug is ",{"type":46,"tag":82,"props":343,"children":344},{},[345],{"type":52,"value":346},"intermittent",{"type":52,"value":348}," — some frames in the same script escape it, so a working test is not proof you're safe. ",{"type":46,"tag":82,"props":350,"children":351},{},[352],{"type":52,"value":353},"Signature to recognize:",{"type":52,"value":355}," if any node ends up ",{"type":46,"tag":61,"props":357,"children":359},{"className":358},[],[360],{"type":52,"value":361},"(−240, −240)",{"type":52,"value":363}," from where you set it, your code set ",{"type":46,"tag":61,"props":365,"children":367},{"className":366},[],[368],{"type":52,"value":285},{"type":52,"value":287},{"type":46,"tag":61,"props":371,"children":373},{"className":372},[],[374],{"type":52,"value":293},{"type":52,"value":376}," before the final ",{"type":46,"tag":61,"props":378,"children":380},{"className":379},[],[381],{"type":52,"value":277},{"type":52,"value":383},". Do NOT try to compensate by adding 240 back — that produces worse output on retry. Fix the order instead. See ",{"type":46,"tag":70,"props":385,"children":387},{"href":386},"references\u002Fslide-gotchas.md#position-after-appendchild-critical",[388],{"type":52,"value":389},"slide-gotchas.md",{"type":52,"value":391}," for the helper pattern that makes the order impossible to get wrong.",{"type":46,"tag":246,"props":393,"children":394},{},[395,400,402,408,410,416,418,424,426,432,434,440,442,447,449,455,457,463,465,471],{"type":46,"tag":82,"props":396,"children":397},{},[398],{"type":52,"value":399},"SLIDE_GRID and SLIDE_ROW are opaque nodes",{"type":52,"value":401}," — do not access ",{"type":46,"tag":61,"props":403,"children":405},{"className":404},[],[406],{"type":52,"value":407},".fills",{"type":52,"value":409},", ",{"type":46,"tag":61,"props":411,"children":413},{"className":412},[],[414],{"type":52,"value":415},".effects",{"type":52,"value":417},", or layout properties on them. Only ",{"type":46,"tag":61,"props":419,"children":421},{"className":420},[],[422],{"type":52,"value":423},"SLIDE",{"type":52,"value":425}," nodes (type ",{"type":46,"tag":61,"props":427,"children":429},{"className":428},[],[430],{"type":52,"value":431},"'SLIDE'",{"type":52,"value":433},") extend ",{"type":46,"tag":61,"props":435,"children":437},{"className":436},[],[438],{"type":52,"value":439},"BaseFrameMixin",{"type":52,"value":441},". ",{"type":46,"tag":82,"props":443,"children":444},{},[445],{"type":52,"value":446},"Exception:",{"type":52,"value":448}," ",{"type":46,"tag":61,"props":450,"children":452},{"className":451},[],[453],{"type":52,"value":454},"SLIDE_ROW.name",{"type":52,"value":456}," IS settable — that's how plugins rename slide sections (e.g. ",{"type":46,"tag":61,"props":458,"children":460},{"className":459},[],[461],{"type":52,"value":462},"slideRow.name = \"Intro\"",{"type":52,"value":464},"). See ",{"type":46,"tag":70,"props":466,"children":468},{"href":467},"references\u002Fslide-lifecycle.md",[469],{"type":52,"value":470},"slide-lifecycle.md",{"type":52,"value":472},".",{"type":46,"tag":246,"props":474,"children":475},{},[476,487,489,494,496,502],{"type":46,"tag":82,"props":477,"children":478},{},[479,485],{"type":46,"tag":61,"props":480,"children":482},{"className":481},[],[483],{"type":52,"value":484},"get_metadata",{"type":52,"value":486}," does NOT work on Slides files.",{"type":52,"value":488}," Use ",{"type":46,"tag":61,"props":490,"children":492},{"className":491},[],[493],{"type":52,"value":66},{"type":52,"value":495}," read-only scripts for validation. Return created node positions in ",{"type":46,"tag":61,"props":497,"children":499},{"className":498},[],[500],{"type":52,"value":501},"closePlugin()",{"type":52,"value":503}," output and verify no overlapping bounding boxes.",{"type":46,"tag":246,"props":505,"children":506},{},[507,520,522,528,530,536,538,544,546,552,554,560,562,568,569,574,576,580,582,588],{"type":46,"tag":82,"props":508,"children":509},{},[510,512,518],{"type":52,"value":511},"Do NOT call ",{"type":46,"tag":61,"props":513,"children":515},{"className":514},[],[516],{"type":52,"value":517},"figma.createPage()",{"type":52,"value":519}," in Slides.",{"type":52,"value":521}," It throws ",{"type":46,"tag":61,"props":523,"children":525},{"className":524},[],[526],{"type":52,"value":527},"TypeError: figma.createPage no such property 'createPage' on the figma global object",{"type":52,"value":529}," — ",{"type":46,"tag":61,"props":531,"children":533},{"className":532},[],[534],{"type":52,"value":535},"createPage()",{"type":52,"value":537}," is a Design-file API only (",{"type":46,"tag":61,"props":539,"children":541},{"className":540},[],[542],{"type":52,"value":543},"figma.com\u002Fdesign\u002F...",{"type":52,"value":545},"); the Slides URL is ",{"type":46,"tag":61,"props":547,"children":549},{"className":548},[],[550],{"type":52,"value":551},"figma.com\u002Fslides\u002F...",{"type":52,"value":553},". Use the slide grid (",{"type":46,"tag":61,"props":555,"children":557},{"className":556},[],[558],{"type":52,"value":559},"SLIDE_GRID",{"type":52,"value":561}," \u002F ",{"type":46,"tag":61,"props":563,"children":565},{"className":564},[],[566],{"type":52,"value":567},"SLIDE_ROW",{"type":52,"value":561},{"type":46,"tag":61,"props":570,"children":572},{"className":571},[],[573],{"type":52,"value":423},{"type":52,"value":575},") to organize deck structure instead — see ",{"type":46,"tag":70,"props":577,"children":578},{"href":467},[579],{"type":52,"value":470},{"type":52,"value":581}," and ",{"type":46,"tag":70,"props":583,"children":585},{"href":584},"references\u002Fslide-grid.md",[586],{"type":52,"value":587},"slide-grid.md",{"type":52,"value":472},{"type":46,"tag":246,"props":590,"children":591},{},[592,597],{"type":46,"tag":82,"props":593,"children":594},{},[595],{"type":52,"value":596},"Never delete existing slides to rebuild them.",{"type":52,"value":598}," When asked to improve, redesign, or restyle a deck, modify the existing slides in place. Only delete slides when the user explicitly asks to \"start over\" or \"redo from scratch.\"",{"type":46,"tag":128,"props":600,"children":602},{"id":601},"design-thinking",[603],{"type":52,"value":604},"Design Thinking",{"type":46,"tag":55,"props":606,"children":607},{},[608],{"type":52,"value":609},"Not every task needs the same depth of design thinking. Before doing anything, identify which gear you're in:",{"type":46,"tag":611,"props":612,"children":613},"ul",{},[614,624,642],{"type":46,"tag":246,"props":615,"children":616},{},[617,622],{"type":46,"tag":82,"props":618,"children":619},{},[620],{"type":52,"value":621},"Content\u002Fproperty edits",{"type":52,"value":623}," — changing text, swapping a color, updating a number, fixing alignment, resizing an element. Skip design thinking. Just make the change and match what's already there.",{"type":46,"tag":246,"props":625,"children":626},{},[627,632,634,640],{"type":46,"tag":82,"props":628,"children":629},{},[630],{"type":52,"value":631},"Structural additions",{"type":52,"value":633}," — adding slides, reworking a section's layout, changing the deck's color palette, introducing a new visual element. This includes requests to \"improve,\" \"redesign,\" or \"restyle\" a deck — those are in-place edits to what's already there, not a new deck. Design thinking applies, but in ",{"type":46,"tag":635,"props":636,"children":637},"em",{},[638],{"type":52,"value":639},"inherit",{"type":52,"value":641}," mode: the existing deck is your design language. Inspect it, match its palette, type, spatial habits, and motifs. Extend the deck's existing character rather than reinventing it.",{"type":46,"tag":246,"props":643,"children":644},{},[645,650],{"type":46,"tag":82,"props":646,"children":647},{},[648],{"type":52,"value":649},"New deck creation",{"type":52,"value":651}," — building a deck from scratch or from a blank file. Full design thinking applies as described below.",{"type":46,"tag":55,"props":653,"children":654},{},[655,657,663,665,670,672,677],{"type":52,"value":656},"For structural additions to existing decks: run the inspection scripts (below) and take screenshots before making changes. The answers to \"what color story?\" and \"what type treatment?\" are already in the file — your job is to read them and stay consistent. The design principles in ",{"type":46,"tag":70,"props":658,"children":660},{"href":659},"references\u002Fslide-design.md",[661],{"type":52,"value":662},"slide-design.md",{"type":52,"value":664}," describe what you're ",{"type":46,"tag":635,"props":666,"children":667},{},[668],{"type":52,"value":669},"matching",{"type":52,"value":671},", not what you're ",{"type":46,"tag":635,"props":673,"children":674},{},[675],{"type":52,"value":676},"choosing",{"type":52,"value":472},{"type":46,"tag":155,"props":679,"children":681},{"id":680},"new-deck-design-process",[682],{"type":52,"value":683},"New deck design process",{"type":46,"tag":55,"props":685,"children":686},{},[687,689,694],{"type":52,"value":688},"Before writing any Plugin API code for a new deck, decide what it should ",{"type":46,"tag":635,"props":690,"children":691},{},[692],{"type":52,"value":693},"feel",{"type":52,"value":695}," like. Figma users have high visual expectations — a deck that looks like it came out of a generic template generator will stand out for the wrong reasons.",{"type":46,"tag":242,"props":697,"children":698},{},[699,709,733,743],{"type":46,"tag":246,"props":700,"children":701},{},[702,707],{"type":46,"tag":82,"props":703,"children":704},{},[705],{"type":52,"value":706},"Read the brief.",{"type":52,"value":708}," What is the deck communicating, and to whom? An investor pitch, a team retrospective, a product launch, and a technical deep-dive all demand different visual treatments. The design should be inseparable from the content.",{"type":46,"tag":246,"props":710,"children":711},{},[712,717,719,724,726,731],{"type":46,"tag":82,"props":713,"children":714},{},[715],{"type":52,"value":716},"Check for a design language.",{"type":52,"value":718}," Before inventing anything, look at what the user already gave you. Brand guidelines in the prompt — color palettes, typography specs, logo rules, tone descriptors — are design decisions that have already been made. A link to a reference Figma file is a design language you should study, not glance at. The more specific the user's inputs, the less you should invent on your own. When the user provides a reference, your job shifts from ",{"type":46,"tag":635,"props":720,"children":721},{},[722],{"type":52,"value":723},"designer",{"type":52,"value":725}," to ",{"type":46,"tag":635,"props":727,"children":728},{},[729],{"type":52,"value":730},"interpreter",{"type":52,"value":732},": extract the design language and apply it faithfully to new content.",{"type":46,"tag":246,"props":734,"children":735},{},[736,741],{"type":46,"tag":82,"props":737,"children":738},{},[739],{"type":52,"value":740},"Take a position — on what's left.",{"type":52,"value":742}," If the user supplied a full brand system, your creative latitude is in layout, pacing, and composition — not in color or type. If they gave you a single reference slide for inspiration, you have more room but should still echo its character. If they gave you nothing, then you own every decision — choose a color story, a type treatment, a way of organizing space, and follow through on it across every slide. A deck with a clear perspective (even a quiet one) always reads better than one that plays it safe on every decision. The scope of \"take a position\" scales inversely with what the user provided.",{"type":46,"tag":246,"props":744,"children":745},{},[746,751,753,758],{"type":46,"tag":82,"props":747,"children":748},{},[749],{"type":52,"value":750},"Give it a signature.",{"type":52,"value":752}," Every good deck has at least one element you'd recognize if you saw it out of context: a distinctive palette, an unexpected layout cadence, a recurring shape language. When working from brand guidelines, the signature should ",{"type":46,"tag":635,"props":754,"children":755},{},[756],{"type":52,"value":757},"come from",{"type":52,"value":759}," that brand language — amplify something that's already there rather than adding something foreign. When designing from scratch, decide what the signature is before you start building.",{"type":46,"tag":155,"props":761,"children":763},{"id":762},"reading-a-reference-file",[764],{"type":52,"value":765},"Reading a reference file",{"type":46,"tag":55,"props":767,"children":768},{},[769],{"type":52,"value":770},"When the user provides a link to a Figma file as a reference, study it before designing anything. What you extract depends on what the file is:",{"type":46,"tag":611,"props":772,"children":773},{},[774,814],{"type":46,"tag":246,"props":775,"children":776},{},[777,782,784,789,791,797,799,804,806,812],{"type":46,"tag":82,"props":778,"children":779},{},[780],{"type":52,"value":781},"A Slides file",{"type":52,"value":783},": ",{"type":46,"tag":61,"props":785,"children":787},{"className":786},[],[788],{"type":52,"value":484},{"type":52,"value":790}," does not work on Slides files. Use ",{"type":46,"tag":61,"props":792,"children":794},{"className":793},[],[795],{"type":52,"value":796},"get_screenshot",{"type":52,"value":798}," to capture individual slides for visual reference, and ",{"type":46,"tag":61,"props":800,"children":802},{"className":801},[],[803],{"type":52,"value":66},{"type":52,"value":805}," with the reference file's ",{"type":46,"tag":61,"props":807,"children":809},{"className":808},[],[810],{"type":52,"value":811},"fileKey",{"type":52,"value":813}," to run read-only scripts that extract theme variables, color palettes, font choices, and layout patterns.",{"type":46,"tag":246,"props":815,"children":816},{},[817,822,823,829,831,836],{"type":46,"tag":82,"props":818,"children":819},{},[820],{"type":52,"value":821},"A Design file",{"type":52,"value":783},{"type":46,"tag":61,"props":824,"children":826},{"className":825},[],[827],{"type":52,"value":828},"get_design_context",{"type":52,"value":830}," gives you comprehensive design data — colors, typography, layout structure. ",{"type":46,"tag":61,"props":832,"children":834},{"className":833},[],[835],{"type":52,"value":796},{"type":52,"value":837}," gives you visual reference. Use both.",{"type":46,"tag":55,"props":839,"children":840},{},[841],{"type":52,"value":842},"What to look for in a reference file: the color palette (which hue leads, what the accent is, how dark\u002Flight backgrounds are used), the type choices (families, weights, how hierarchy is handled), the spatial habits (where content anchors, how much whitespace, whether things bleed off edges), and any recurring motifs (shapes, line treatments, decorative elements). These are the decisions you inherit — everything else is yours.",{"type":46,"tag":55,"props":844,"children":845},{},[846],{"type":52,"value":847},"How closely to follow the reference depends on what the user asked for. \"Make it look like this\" means replicate the design language with new content. \"Use this for inspiration\" means echo the character but make it your own. \"Here's our brand deck\" means extract the brand system and apply it consistently. When in doubt, stay closer to the reference — it's easier for a user to ask you to diverge than to ask you to undo invented choices that conflict with their brand.",{"type":46,"tag":55,"props":849,"children":850},{},[851,853,857,859,864],{"type":52,"value":852},"Load ",{"type":46,"tag":70,"props":854,"children":855},{"href":659},[856],{"type":52,"value":662},{"type":52,"value":858}," for specific guidance on color, type, layout patterns, composition, and what to avoid. When you have a reference file or brand guidelines, treat slide-design.md's principles as defaults for the decisions the user ",{"type":46,"tag":635,"props":860,"children":861},{},[862],{"type":52,"value":863},"didn't",{"type":52,"value":865}," make — not as overrides for the ones they did.",{"type":46,"tag":128,"props":867,"children":869},{"id":868},"deck-building-workflow",[870],{"type":52,"value":871},"Deck-Building Workflow",{"type":46,"tag":55,"props":873,"children":874},{},[875,877,881],{"type":52,"value":876},"When building a new deck of 5 or more slides, use this two-phase workflow. It replaces the general incremental workflow from ",{"type":46,"tag":70,"props":878,"children":879},{"href":72},[880],{"type":52,"value":75},{"type":52,"value":882}," Section 6 for deck-building specifically — the principles still apply, but the cadence changes.",{"type":46,"tag":155,"props":884,"children":886},{"id":885},"phase-1-design-plan",[887],{"type":52,"value":888},"Phase 1 — Design & Plan",{"type":46,"tag":55,"props":890,"children":891},{},[892,894,906],{"type":52,"value":893},"Complete the design thinking process above (read the brief, check for a design language, take a position, give it a signature), then ",{"type":46,"tag":82,"props":895,"children":896},{},[897,899,904],{"type":52,"value":898},"before writing any ",{"type":46,"tag":61,"props":900,"children":902},{"className":901},[],[903],{"type":52,"value":66},{"type":52,"value":905}," code",{"type":52,"value":907},", produce a slide plan covering the entire deck:",{"type":46,"tag":242,"props":909,"children":910},{},[911,921,931,947],{"type":46,"tag":246,"props":912,"children":913},{},[914,919],{"type":46,"tag":82,"props":915,"children":916},{},[917],{"type":52,"value":918},"Slide-by-slide plan.",{"type":52,"value":920}," For every slide: its purpose\u002Fcontent, layout approach described spatially (e.g. \"title anchored upper-left, spec card filling the right third, decorative circle bleeding off top-right edge\"), and background treatment (dark\u002Flight\u002Fgradient). Do NOT compute pixel coordinates during planning — describe layouts in spatial terms. Coordinate math happens during code generation.",{"type":46,"tag":246,"props":922,"children":923},{},[924,929],{"type":46,"tag":82,"props":925,"children":926},{},[927],{"type":52,"value":928},"Shared constants.",{"type":52,"value":930}," Declare the font families and styles you'll use, the color palette as named roles (primary, accent, bgDark, surface, textPrimary, textMuted, etc.), and the recurring motif or signature element.",{"type":46,"tag":246,"props":932,"children":933},{},[934,939,941,945],{"type":46,"tag":82,"props":935,"children":936},{},[937],{"type":52,"value":938},"Layout variety check.",{"type":52,"value":940}," Read through the slide plans in sequence. If the layout descriptions feel repetitive — \"two-column, two-column, grid, two-column\" — rearrange before building. This is the cheapest moment to diversify. See ",{"type":46,"tag":70,"props":942,"children":943},{"href":659},[944],{"type":52,"value":662},{"type":52,"value":946}," for anti-patterns.",{"type":46,"tag":246,"props":948,"children":949},{},[950,955,957,963,965,971,973,979,980,986,987,993,995,999],{"type":46,"tag":82,"props":951,"children":952},{},[953],{"type":52,"value":954},"Code preamble.",{"type":52,"value":956}," Write out the reusable preamble you'll paste at the top of every build script: a ",{"type":46,"tag":61,"props":958,"children":960},{"className":959},[],[961],{"type":52,"value":962},"const C = { ... }",{"type":52,"value":964}," color palette object, a ",{"type":46,"tag":61,"props":966,"children":968},{"className":967},[],[969],{"type":52,"value":970},"Promise.all([...])",{"type":52,"value":972}," font-loading block, and the ",{"type":46,"tag":61,"props":974,"children":976},{"className":975},[],[977],{"type":52,"value":978},"addFrame",{"type":52,"value":287},{"type":46,"tag":61,"props":981,"children":983},{"className":982},[],[984],{"type":52,"value":985},"addText",{"type":52,"value":287},{"type":46,"tag":61,"props":988,"children":990},{"className":989},[],[991],{"type":52,"value":992},"addRect",{"type":52,"value":994}," helpers from ",{"type":46,"tag":70,"props":996,"children":997},{"href":386},[998],{"type":52,"value":389},{"type":52,"value":472},{"type":46,"tag":155,"props":1001,"children":1003},{"id":1002},"phase-2-build",[1004],{"type":52,"value":1005},"Phase 2 — Build",{"type":46,"tag":55,"props":1007,"children":1008},{},[1009],{"type":52,"value":1010},"Execute the plan in large batches. The goal is to minimize the number of think-then-build cycles — not to minimize elements per script.",{"type":46,"tag":611,"props":1012,"children":1013},{},[1014,1031,1041,1051,1068,1093],{"type":46,"tag":246,"props":1015,"children":1016},{},[1017,1029],{"type":46,"tag":82,"props":1018,"children":1019},{},[1020,1022,1027],{"type":52,"value":1021},"3–5 slides per ",{"type":46,"tag":61,"props":1023,"children":1025},{"className":1024},[],[1026],{"type":52,"value":66},{"type":52,"value":1028}," call.",{"type":52,"value":1030}," Structurally similar slides (e.g. a series of product feature slides) can go in the same batch. Each slide is an isolated subtree — cross-slide dependencies don't exist, so large batches are safe.",{"type":46,"tag":246,"props":1032,"children":1033},{},[1034,1039],{"type":46,"tag":82,"props":1035,"children":1036},{},[1037],{"type":52,"value":1038},"Do NOT re-plan between batches.",{"type":52,"value":1040}," The design was decided in Phase 1. If a batch succeeds and passes validation, move to the next batch immediately. Only re-plan if a batch fails or produces a visual problem that requires changing the approach.",{"type":46,"tag":246,"props":1042,"children":1043},{},[1044,1049],{"type":46,"tag":82,"props":1045,"children":1046},{},[1047],{"type":52,"value":1048},"Paste the code preamble",{"type":52,"value":1050}," (colors, fonts, helpers) at the top of every build script. Copy it from Phase 1 verbatim — do not re-derive it.",{"type":46,"tag":246,"props":1052,"children":1053},{},[1054,1059,1061,1066],{"type":46,"tag":82,"props":1055,"children":1056},{},[1057],{"type":52,"value":1058},"Validate every batch",{"type":52,"value":1060}," with the deterministic batch validation script from ",{"type":46,"tag":70,"props":1062,"children":1064},{"href":1063},"references\u002Fslide-gotchas.md#batch-validation-script",[1065],{"type":52,"value":389},{"type":52,"value":1067},". This checks for overlapping elements, text clipping, and out-of-bounds nodes in ~3 seconds. If the check passes, proceed without a screenshot. If it fails, screenshot the affected slides and fix before continuing.",{"type":46,"tag":246,"props":1069,"children":1070},{},[1071,1076,1078,1084,1086,1091],{"type":46,"tag":82,"props":1072,"children":1073},{},[1074],{"type":52,"value":1075},"Screenshot at checkpoints only",{"type":52,"value":1077}," — after the first batch (validates the visual system: colors, typography, design direction), and after the final batch (overall quality). Take a screenshot of 1–2 representative slides per checkpoint using inline ",{"type":46,"tag":61,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":52,"value":1083},"await slide.screenshot()",{"type":52,"value":1085},", not separate ",{"type":46,"tag":61,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":52,"value":796},{"type":52,"value":1092}," calls.",{"type":46,"tag":246,"props":1094,"children":1095},{},[1096,1101],{"type":46,"tag":82,"props":1097,"children":1098},{},[1099],{"type":52,"value":1100},"Return all created node IDs",{"type":52,"value":1102}," from every build script, as always.",{"type":46,"tag":128,"props":1104,"children":1106},{"id":1105},"sections",[1107],{"type":52,"value":1108},"Sections",{"type":46,"tag":55,"props":1110,"children":1111},{},[1112],{"type":52,"value":1113},"A section is a horizontal row in the slide grid — every row is a section. Names show up in the editor (next to the row) and in Presenter View (so speakers can jump between groups). They're an organizational aid for whoever is editing the deck — the user owns where the breaks fall, not you.",{"type":46,"tag":155,"props":1115,"children":1117},{"id":1116},"when-asked-to-organize-a-deck",[1118],{"type":52,"value":1119},"When asked to organize a deck",{"type":46,"tag":55,"props":1121,"children":1122},{},[1123,1125,1131],{"type":52,"value":1124},"\"Organize this deck\" is ambiguous — grouping, reordering, deduping, or restructuring. Read the deck before reaching for ",{"type":46,"tag":61,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":52,"value":1130},"AskUserQuestion",{"type":52,"value":472},{"type":46,"tag":55,"props":1133,"children":1134},{},[1135,1140,1142,1147,1149,1154,1156,1161],{"type":46,"tag":82,"props":1136,"children":1137},{},[1138],{"type":52,"value":1139},"Default: propose, don't ask.",{"type":52,"value":1141}," Most decks have cues — title bookend, numbered use cases, repeated ",{"type":46,"tag":635,"props":1143,"children":1144},{},[1145],{"type":52,"value":1146},"Before \u002F After",{"type":52,"value":1148}," pairs, transition slides (\"Then X enters the chat\"), a ",{"type":46,"tag":635,"props":1150,"children":1151},{},[1152],{"type":52,"value":1153},"Thank you",{"type":52,"value":1155},". When cues exist, pick a sectioning and surface it in one confirmation message. Bounded calls inside the proposal (one ",{"type":46,"tag":635,"props":1157,"children":1158},{},[1159],{"type":52,"value":1160},"Use Cases",{"type":52,"value":1162}," row vs. three, where a transition slide lives) are reversible — pick one and move on.",{"type":46,"tag":55,"props":1164,"children":1165},{},[1166,1171],{"type":46,"tag":82,"props":1167,"children":1168},{},[1169],{"type":52,"value":1170},"Fallback: ask when cues are absent.",{"type":52,"value":1172}," If slides are in arbitrary order or there's no spine, ask which ranges go together and what to call them. Don't slice by thirds as a substitute for reading.",{"type":46,"tag":155,"props":1174,"children":1176},{"id":1175},"naming-scoping",[1177],{"type":52,"value":1178},"Naming + scoping",{"type":46,"tag":55,"props":1180,"children":1181},{},[1182,1184,1189,1191,1196],{"type":52,"value":1183},"Names should be short (1–3 words), concrete (",{"type":46,"tag":635,"props":1185,"children":1186},{},[1187],{"type":52,"value":1188},"Demo",{"type":52,"value":1190}," beats ",{"type":46,"tag":635,"props":1192,"children":1193},{},[1194],{"type":52,"value":1195},"Show & tell",{"type":52,"value":1197},"), and consistent within a deck. Two to five sections is typical; more only for long or repeating decks. Names aren't slide titles — they help find a group, not describe its content.",{"type":46,"tag":155,"props":1199,"children":1201},{"id":1200},"renaming-a-section",[1202],{"type":52,"value":1203},"Renaming a section",{"type":46,"tag":55,"props":1205,"children":1206},{},[1207,1213,1215,1221,1223,1228,1230,1236,1238,1243,1245,1250],{"type":46,"tag":61,"props":1208,"children":1210},{"className":1209},[],[1211],{"type":52,"value":1212},"getSlideGrid()",{"type":52,"value":1214}," returns ",{"type":46,"tag":61,"props":1216,"children":1218},{"className":1217},[],[1219],{"type":52,"value":1220},"SlideNode[][]",{"type":52,"value":1222}," — the inner arrays are plain JS arrays of slides, NOT ",{"type":46,"tag":61,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":52,"value":567},{"type":52,"value":1229}," nodes. Setting ",{"type":46,"tag":61,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":52,"value":1235},".name",{"type":52,"value":1237}," on those arrays silently no-ops. To rename a section, traverse the node tree and set ",{"type":46,"tag":61,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":52,"value":1235},{"type":52,"value":1244}," on the actual ",{"type":46,"tag":61,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":52,"value":567},{"type":52,"value":188},{"type":46,"tag":1252,"props":1253,"children":1258},"pre",{"className":1254,"code":1255,"language":1256,"meta":1257,"style":1257},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const slideGrid = figma.currentPage.children.find(c => c.type === \"SLIDE_GRID\");\nslideGrid.children[0].name = \"Intro\";\n","js","",[1259],{"type":46,"tag":61,"props":1260,"children":1261},{"__ignoreMap":1257},[1262,1379],{"type":46,"tag":1263,"props":1264,"children":1267},"span",{"class":1265,"line":1266},"line",1,[1268,1274,1280,1286,1291,1295,1300,1304,1309,1313,1319,1324,1330,1335,1340,1344,1349,1354,1359,1364,1369,1374],{"type":46,"tag":1263,"props":1269,"children":1271},{"style":1270},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1272],{"type":52,"value":1273},"const",{"type":46,"tag":1263,"props":1275,"children":1277},{"style":1276},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1278],{"type":52,"value":1279}," slideGrid ",{"type":46,"tag":1263,"props":1281,"children":1283},{"style":1282},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1284],{"type":52,"value":1285},"=",{"type":46,"tag":1263,"props":1287,"children":1288},{"style":1276},[1289],{"type":52,"value":1290}," figma",{"type":46,"tag":1263,"props":1292,"children":1293},{"style":1282},[1294],{"type":52,"value":472},{"type":46,"tag":1263,"props":1296,"children":1297},{"style":1276},[1298],{"type":52,"value":1299},"currentPage",{"type":46,"tag":1263,"props":1301,"children":1302},{"style":1282},[1303],{"type":52,"value":472},{"type":46,"tag":1263,"props":1305,"children":1306},{"style":1276},[1307],{"type":52,"value":1308},"children",{"type":46,"tag":1263,"props":1310,"children":1311},{"style":1282},[1312],{"type":52,"value":472},{"type":46,"tag":1263,"props":1314,"children":1316},{"style":1315},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1317],{"type":52,"value":1318},"find",{"type":46,"tag":1263,"props":1320,"children":1321},{"style":1276},[1322],{"type":52,"value":1323},"(",{"type":46,"tag":1263,"props":1325,"children":1327},{"style":1326},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[1328],{"type":52,"value":1329},"c",{"type":46,"tag":1263,"props":1331,"children":1332},{"style":1270},[1333],{"type":52,"value":1334}," =>",{"type":46,"tag":1263,"props":1336,"children":1337},{"style":1276},[1338],{"type":52,"value":1339}," c",{"type":46,"tag":1263,"props":1341,"children":1342},{"style":1282},[1343],{"type":52,"value":472},{"type":46,"tag":1263,"props":1345,"children":1346},{"style":1276},[1347],{"type":52,"value":1348},"type ",{"type":46,"tag":1263,"props":1350,"children":1351},{"style":1282},[1352],{"type":52,"value":1353},"===",{"type":46,"tag":1263,"props":1355,"children":1356},{"style":1282},[1357],{"type":52,"value":1358}," \"",{"type":46,"tag":1263,"props":1360,"children":1362},{"style":1361},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1363],{"type":52,"value":559},{"type":46,"tag":1263,"props":1365,"children":1366},{"style":1282},[1367],{"type":52,"value":1368},"\"",{"type":46,"tag":1263,"props":1370,"children":1371},{"style":1276},[1372],{"type":52,"value":1373},")",{"type":46,"tag":1263,"props":1375,"children":1376},{"style":1282},[1377],{"type":52,"value":1378},";\n",{"type":46,"tag":1263,"props":1380,"children":1382},{"class":1265,"line":1381},2,[1383,1388,1392,1397,1403,1408,1412,1417,1421,1425,1430,1434],{"type":46,"tag":1263,"props":1384,"children":1385},{"style":1276},[1386],{"type":52,"value":1387},"slideGrid",{"type":46,"tag":1263,"props":1389,"children":1390},{"style":1282},[1391],{"type":52,"value":472},{"type":46,"tag":1263,"props":1393,"children":1394},{"style":1276},[1395],{"type":52,"value":1396},"children[",{"type":46,"tag":1263,"props":1398,"children":1400},{"style":1399},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1401],{"type":52,"value":1402},"0",{"type":46,"tag":1263,"props":1404,"children":1405},{"style":1276},[1406],{"type":52,"value":1407},"]",{"type":46,"tag":1263,"props":1409,"children":1410},{"style":1282},[1411],{"type":52,"value":472},{"type":46,"tag":1263,"props":1413,"children":1414},{"style":1276},[1415],{"type":52,"value":1416},"name ",{"type":46,"tag":1263,"props":1418,"children":1419},{"style":1282},[1420],{"type":52,"value":1285},{"type":46,"tag":1263,"props":1422,"children":1423},{"style":1282},[1424],{"type":52,"value":1358},{"type":46,"tag":1263,"props":1426,"children":1427},{"style":1361},[1428],{"type":52,"value":1429},"Intro",{"type":46,"tag":1263,"props":1431,"children":1432},{"style":1282},[1433],{"type":52,"value":1368},{"type":46,"tag":1263,"props":1435,"children":1436},{"style":1282},[1437],{"type":52,"value":1378},{"type":46,"tag":128,"props":1439,"children":1441},{"id":1440},"speaker-notes",[1442],{"type":52,"value":1443},"Speaker Notes",{"type":46,"tag":55,"props":1445,"children":1446},{},[1447],{"type":52,"value":1448},"Speaker notes are the presenter's private companion to each slide. They appear in Presenter View (visible only to the speaker, not the audience) and serve as a script, cue sheet, or talking-points reference during a live presentation.",{"type":46,"tag":155,"props":1450,"children":1452},{"id":1451},"when-to-write-speaker-notes",[1453],{"type":52,"value":1454},"When to write speaker notes",{"type":46,"tag":611,"props":1456,"children":1457},{},[1458,1468,1478,1496],{"type":46,"tag":246,"props":1459,"children":1460},{},[1461,1466],{"type":46,"tag":82,"props":1462,"children":1463},{},[1464],{"type":52,"value":1465},"When asked",{"type":52,"value":1467},": If the user asks for speaker notes, presenter notes, talking points, or a script for a deck, write notes for every slide that has substantive content (skip section dividers or purely decorative slides unless there's something to say).",{"type":46,"tag":246,"props":1469,"children":1470},{},[1471,1476],{"type":46,"tag":82,"props":1472,"children":1473},{},[1474],{"type":52,"value":1475},"Presenter-ready decks",{"type":52,"value":1477},": If the user explicitly asks for a deck that is ready to present live, speaker notes are useful. Add them when they help the presenter understand pacing, transitions, or context that is not visible on the slide.",{"type":46,"tag":246,"props":1479,"children":1480},{},[1481,1486,1488,1494],{"type":46,"tag":82,"props":1482,"children":1483},{},[1484],{"type":52,"value":1485},"Sparse or visual slides",{"type":52,"value":1487},": If a slide is built around a chart, image, metaphor, or provocative question, notes can help explain what the presenter should say. Use screenshots or ",{"type":46,"tag":61,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":52,"value":1493},"node.screenshot()",{"type":52,"value":1495}," for image-heavy, chart-heavy, or visually sparse slides when visual context matters, but don't screenshot every slide by default — images spend context budget.",{"type":46,"tag":246,"props":1497,"children":1498},{},[1499,1504],{"type":46,"tag":82,"props":1500,"children":1501},{},[1502],{"type":52,"value":1503},"Don't add notes unprompted",{"type":52,"value":1505},": For normal slide edits, layout work, or updates to existing decks, do not populate speaker notes unless the user asks. Adding notes changes the presentation flow and can surprise the deck owner.",{"type":46,"tag":155,"props":1507,"children":1509},{"id":1508},"what-good-speaker-notes-look-like",[1510],{"type":52,"value":1511},"What good speaker notes look like",{"type":46,"tag":55,"props":1513,"children":1514},{},[1515,1517,1522],{"type":52,"value":1516},"Speaker notes are for the ",{"type":46,"tag":635,"props":1518,"children":1519},{},[1520],{"type":52,"value":1521},"presenter",{"type":52,"value":1523},", not the audience. They should feel like a trusted colleague leaning over and whispering \"here's what to say.\" Good notes:",{"type":46,"tag":611,"props":1525,"children":1526},{},[1527,1544,1554,1571,1581],{"type":46,"tag":246,"props":1528,"children":1529},{},[1530,1535,1537,1542],{"type":46,"tag":82,"props":1531,"children":1532},{},[1533],{"type":52,"value":1534},"Complement the slide, not repeat it.",{"type":52,"value":1536}," If the slide says \"Revenue grew 40%\", the notes shouldn't say \"Revenue grew 40%.\" They should say ",{"type":46,"tag":635,"props":1538,"children":1539},{},[1540],{"type":52,"value":1541},"why",{"type":52,"value":1543}," it grew, what the audience should take away, or what question this usually prompts.",{"type":46,"tag":246,"props":1545,"children":1546},{},[1547,1552],{"type":46,"tag":82,"props":1548,"children":1549},{},[1550],{"type":52,"value":1551},"Are concise and scannable.",{"type":52,"value":1553}," A presenter glancing down mid-sentence needs to find their place instantly. Use short bullet points, not dense paragraphs. Each point should be one idea.",{"type":46,"tag":246,"props":1555,"children":1556},{},[1557,1562,1564,1569],{"type":46,"tag":82,"props":1558,"children":1559},{},[1560],{"type":52,"value":1561},"Include transitions.",{"type":52,"value":1563}," The best notes tell the presenter how to ",{"type":46,"tag":635,"props":1565,"children":1566},{},[1567],{"type":52,"value":1568},"move",{"type":52,"value":1570}," between slides: \"After the applause dies down...\" or \"This builds on the previous point — call back to the 40% figure.\"",{"type":46,"tag":246,"props":1572,"children":1573},{},[1574,1579],{"type":46,"tag":82,"props":1575,"children":1576},{},[1577],{"type":52,"value":1578},"Carry context the slide can't.",{"type":52,"value":1580}," Data sources (\"Source: Q4 FY25 internal metrics, not yet public\"), caveats (\"Skip this slide if the CFO is in the room\"), timing cues (\"This is the halfway point — you should be at ~10 minutes\"), and anticipated questions (\"They'll ask about margins — see appendix slide 14\").",{"type":46,"tag":246,"props":1582,"children":1583},{},[1584,1589],{"type":46,"tag":82,"props":1585,"children":1586},{},[1587],{"type":52,"value":1588},"Match the presentation's register.",{"type":52,"value":1590}," Notes for an investor pitch are precise and rehearsed. Notes for a team retro are casual and flexible. Notes for a keynote might include stage directions. Match the tone to the context.",{"type":46,"tag":155,"props":1592,"children":1594},{"id":1593},"what-to-avoid-in-speaker-notes",[1595],{"type":52,"value":1596},"What to avoid in speaker notes",{"type":46,"tag":611,"props":1598,"children":1599},{},[1600,1610,1620],{"type":46,"tag":246,"props":1601,"children":1602},{},[1603,1608],{"type":46,"tag":82,"props":1604,"children":1605},{},[1606],{"type":52,"value":1607},"Full scripts",{"type":52,"value":1609},": Wall-of-text notes encourage reading verbatim, which makes for a terrible presentation. If the user explicitly asks for a script, write one, but default to bullet points.",{"type":46,"tag":246,"props":1611,"children":1612},{},[1613,1618],{"type":46,"tag":82,"props":1614,"children":1615},{},[1616],{"type":52,"value":1617},"Formatting for the audience",{"type":52,"value":1619},": Notes aren't visible to the audience. Don't optimize them for readability by non-presenters.",{"type":46,"tag":246,"props":1621,"children":1622},{},[1623,1628],{"type":46,"tag":82,"props":1624,"children":1625},{},[1626],{"type":52,"value":1627},"Redundancy with the slide",{"type":52,"value":1629},": If the slide is self-explanatory (\"Thank You\" with contact info), notes aren't needed. It's fine to leave a slide's notes empty.",{"type":46,"tag":155,"props":1631,"children":1633},{"id":1632},"formatting",[1634],{"type":52,"value":1635},"Formatting",{"type":46,"tag":55,"props":1637,"children":1638},{},[1639,1645,1647,1653],{"type":46,"tag":61,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":52,"value":1644},"slide.speakerNotes",{"type":52,"value":1646}," accepts a markdown string. Prefer bullet lists as the primary structure; bold is useful for emphasis on key phrases the presenter shouldn't skip. See ",{"type":46,"tag":70,"props":1648,"children":1650},{"href":1649},"references\u002Fslide-properties.md#supported-formatting",[1651],{"type":52,"value":1652},"slide-properties.md",{"type":52,"value":1654}," for the full list of supported (lists, bold, italic, strikethrough) and unsupported (headings, code blocks, inline code, links) markdown.",{"type":46,"tag":128,"props":1656,"children":1658},{"id":1657},"inspecting-slides-files",[1659],{"type":52,"value":1660},"Inspecting Slides Files",{"type":46,"tag":55,"props":1662,"children":1663},{},[1664,1666,1671,1673,1678,1679,1685],{"type":52,"value":1665},"There is no dedicated read tool for Slides files yet. Use ",{"type":46,"tag":61,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":52,"value":66},{"type":52,"value":1672}," with read-only scripts for inspection, and ",{"type":46,"tag":61,"props":1674,"children":1676},{"className":1675},[],[1677],{"type":52,"value":796},{"type":52,"value":561},{"type":46,"tag":61,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":52,"value":1684},"await node.screenshot()",{"type":52,"value":1686}," for visual context.",{"type":46,"tag":611,"props":1688,"children":1689},{},[1690,1713,1735,1766],{"type":46,"tag":246,"props":1691,"children":1692},{},[1693,1698,1700,1705,1707,1711],{"type":46,"tag":82,"props":1694,"children":1695},{},[1696],{"type":52,"value":1697},"Inspect before creating.",{"type":52,"value":1699}," Before creating anything, run a read-only ",{"type":46,"tag":61,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":52,"value":66},{"type":52,"value":1706}," to discover what already exists — slides, text, components, naming conventions. The ",{"type":46,"tag":70,"props":1708,"children":1709},{"href":72},[1710],{"type":52,"value":75},{"type":52,"value":1712}," Section 6 \"Inspect first\" pattern applies here.",{"type":46,"tag":246,"props":1714,"children":1715},{},[1716,1726,1728,1733],{"type":46,"tag":82,"props":1717,"children":1718},{},[1719,1724],{"type":46,"tag":61,"props":1720,"children":1722},{"className":1721},[],[1723],{"type":52,"value":484},{"type":52,"value":1725}," does NOT work on Slides files",{"type":52,"value":1727}," — it only supports ",{"type":46,"tag":61,"props":1729,"children":1731},{"className":1730},[],[1732],{"type":52,"value":24},{"type":52,"value":1734}," (Design) editor type.",{"type":46,"tag":246,"props":1736,"children":1737},{},[1738,1749,1751,1757,1759,1764],{"type":46,"tag":82,"props":1739,"children":1740},{},[1741,1747],{"type":46,"tag":61,"props":1742,"children":1744},{"className":1743},[],[1745],{"type":52,"value":1746},"console.log()",{"type":52,"value":1748}," output is NOT returned",{"type":52,"value":1750}," — only the ",{"type":46,"tag":61,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":52,"value":1756},"return",{"type":52,"value":1758}," value comes back. Always ",{"type":46,"tag":61,"props":1760,"children":1762},{"className":1761},[],[1763],{"type":52,"value":1756},{"type":52,"value":1765}," the data you need.",{"type":46,"tag":246,"props":1767,"children":1768},{},[1769,1781,1783,1789,1791,1796,1798,1803],{"type":46,"tag":82,"props":1770,"children":1771},{},[1772,1774,1779],{"type":52,"value":1773},"Use ",{"type":46,"tag":61,"props":1775,"children":1777},{"className":1776},[],[1778],{"type":52,"value":796},{"type":52,"value":1780}," for visual context",{"type":52,"value":1782}," — pass a valid ",{"type":46,"tag":61,"props":1784,"children":1786},{"className":1785},[],[1787],{"type":52,"value":1788},"nodeId",{"type":52,"value":1790}," to get a screenshot. You can also use ",{"type":46,"tag":61,"props":1792,"children":1794},{"className":1793},[],[1795],{"type":52,"value":1684},{"type":52,"value":1797}," inline within ",{"type":46,"tag":61,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":52,"value":66},{"type":52,"value":1804}," scripts.",{"type":46,"tag":155,"props":1806,"children":1808},{"id":1807},"quick-inspection-scripts",[1809],{"type":52,"value":1810},"Quick inspection scripts",{"type":46,"tag":55,"props":1812,"children":1813},{},[1814],{"type":46,"tag":82,"props":1815,"children":1816},{},[1817],{"type":52,"value":1818},"List all slides in the deck:",{"type":46,"tag":1252,"props":1820,"children":1822},{"className":1254,"code":1821,"language":1256,"meta":1257,"style":1257},"const grid = figma.getSlideGrid();\nreturn grid.map((row, rowIdx) =>\n  row.map((slide, colIdx) => ({\n    id: slide.id,\n    name: slide.name,\n    row: rowIdx,\n    col: colIdx,\n    isSkipped: slide.isSkippedSlide,\n    speakerNotes: slide.speakerNotes,\n  }))\n);\n",[1823],{"type":46,"tag":61,"props":1824,"children":1825},{"__ignoreMap":1257},[1826,1864,1918,1975,2008,2038,2059,2080,2110,2140,2154],{"type":46,"tag":1263,"props":1827,"children":1828},{"class":1265,"line":1266},[1829,1833,1838,1842,1846,1850,1855,1860],{"type":46,"tag":1263,"props":1830,"children":1831},{"style":1270},[1832],{"type":52,"value":1273},{"type":46,"tag":1263,"props":1834,"children":1835},{"style":1276},[1836],{"type":52,"value":1837}," grid ",{"type":46,"tag":1263,"props":1839,"children":1840},{"style":1282},[1841],{"type":52,"value":1285},{"type":46,"tag":1263,"props":1843,"children":1844},{"style":1276},[1845],{"type":52,"value":1290},{"type":46,"tag":1263,"props":1847,"children":1848},{"style":1282},[1849],{"type":52,"value":472},{"type":46,"tag":1263,"props":1851,"children":1852},{"style":1315},[1853],{"type":52,"value":1854},"getSlideGrid",{"type":46,"tag":1263,"props":1856,"children":1857},{"style":1276},[1858],{"type":52,"value":1859},"()",{"type":46,"tag":1263,"props":1861,"children":1862},{"style":1282},[1863],{"type":52,"value":1378},{"type":46,"tag":1263,"props":1865,"children":1866},{"class":1265,"line":1381},[1867,1872,1877,1881,1886,1890,1894,1899,1904,1909,1913],{"type":46,"tag":1263,"props":1868,"children":1870},{"style":1869},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1871],{"type":52,"value":1756},{"type":46,"tag":1263,"props":1873,"children":1874},{"style":1276},[1875],{"type":52,"value":1876}," grid",{"type":46,"tag":1263,"props":1878,"children":1879},{"style":1282},[1880],{"type":52,"value":472},{"type":46,"tag":1263,"props":1882,"children":1883},{"style":1315},[1884],{"type":52,"value":1885},"map",{"type":46,"tag":1263,"props":1887,"children":1888},{"style":1276},[1889],{"type":52,"value":1323},{"type":46,"tag":1263,"props":1891,"children":1892},{"style":1282},[1893],{"type":52,"value":1323},{"type":46,"tag":1263,"props":1895,"children":1896},{"style":1326},[1897],{"type":52,"value":1898},"row",{"type":46,"tag":1263,"props":1900,"children":1901},{"style":1282},[1902],{"type":52,"value":1903},",",{"type":46,"tag":1263,"props":1905,"children":1906},{"style":1326},[1907],{"type":52,"value":1908}," rowIdx",{"type":46,"tag":1263,"props":1910,"children":1911},{"style":1282},[1912],{"type":52,"value":1373},{"type":46,"tag":1263,"props":1914,"children":1915},{"style":1270},[1916],{"type":52,"value":1917}," =>\n",{"type":46,"tag":1263,"props":1919,"children":1921},{"class":1265,"line":1920},3,[1922,1927,1931,1935,1939,1943,1948,1952,1957,1961,1965,1970],{"type":46,"tag":1263,"props":1923,"children":1924},{"style":1276},[1925],{"type":52,"value":1926},"  row",{"type":46,"tag":1263,"props":1928,"children":1929},{"style":1282},[1930],{"type":52,"value":472},{"type":46,"tag":1263,"props":1932,"children":1933},{"style":1315},[1934],{"type":52,"value":1885},{"type":46,"tag":1263,"props":1936,"children":1937},{"style":1276},[1938],{"type":52,"value":1323},{"type":46,"tag":1263,"props":1940,"children":1941},{"style":1282},[1942],{"type":52,"value":1323},{"type":46,"tag":1263,"props":1944,"children":1945},{"style":1326},[1946],{"type":52,"value":1947},"slide",{"type":46,"tag":1263,"props":1949,"children":1950},{"style":1282},[1951],{"type":52,"value":1903},{"type":46,"tag":1263,"props":1953,"children":1954},{"style":1326},[1955],{"type":52,"value":1956}," colIdx",{"type":46,"tag":1263,"props":1958,"children":1959},{"style":1282},[1960],{"type":52,"value":1373},{"type":46,"tag":1263,"props":1962,"children":1963},{"style":1270},[1964],{"type":52,"value":1334},{"type":46,"tag":1263,"props":1966,"children":1967},{"style":1276},[1968],{"type":52,"value":1969}," (",{"type":46,"tag":1263,"props":1971,"children":1972},{"style":1282},[1973],{"type":52,"value":1974},"{\n",{"type":46,"tag":1263,"props":1976,"children":1978},{"class":1265,"line":1977},4,[1979,1985,1989,1994,1998,2003],{"type":46,"tag":1263,"props":1980,"children":1982},{"style":1981},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1983],{"type":52,"value":1984},"    id",{"type":46,"tag":1263,"props":1986,"children":1987},{"style":1282},[1988],{"type":52,"value":188},{"type":46,"tag":1263,"props":1990,"children":1991},{"style":1276},[1992],{"type":52,"value":1993}," slide",{"type":46,"tag":1263,"props":1995,"children":1996},{"style":1282},[1997],{"type":52,"value":472},{"type":46,"tag":1263,"props":1999,"children":2000},{"style":1276},[2001],{"type":52,"value":2002},"id",{"type":46,"tag":1263,"props":2004,"children":2005},{"style":1282},[2006],{"type":52,"value":2007},",\n",{"type":46,"tag":1263,"props":2009,"children":2011},{"class":1265,"line":2010},5,[2012,2017,2021,2025,2029,2034],{"type":46,"tag":1263,"props":2013,"children":2014},{"style":1981},[2015],{"type":52,"value":2016},"    name",{"type":46,"tag":1263,"props":2018,"children":2019},{"style":1282},[2020],{"type":52,"value":188},{"type":46,"tag":1263,"props":2022,"children":2023},{"style":1276},[2024],{"type":52,"value":1993},{"type":46,"tag":1263,"props":2026,"children":2027},{"style":1282},[2028],{"type":52,"value":472},{"type":46,"tag":1263,"props":2030,"children":2031},{"style":1276},[2032],{"type":52,"value":2033},"name",{"type":46,"tag":1263,"props":2035,"children":2036},{"style":1282},[2037],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2039,"children":2041},{"class":1265,"line":2040},6,[2042,2047,2051,2055],{"type":46,"tag":1263,"props":2043,"children":2044},{"style":1981},[2045],{"type":52,"value":2046},"    row",{"type":46,"tag":1263,"props":2048,"children":2049},{"style":1282},[2050],{"type":52,"value":188},{"type":46,"tag":1263,"props":2052,"children":2053},{"style":1276},[2054],{"type":52,"value":1908},{"type":46,"tag":1263,"props":2056,"children":2057},{"style":1282},[2058],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2060,"children":2062},{"class":1265,"line":2061},7,[2063,2068,2072,2076],{"type":46,"tag":1263,"props":2064,"children":2065},{"style":1981},[2066],{"type":52,"value":2067},"    col",{"type":46,"tag":1263,"props":2069,"children":2070},{"style":1282},[2071],{"type":52,"value":188},{"type":46,"tag":1263,"props":2073,"children":2074},{"style":1276},[2075],{"type":52,"value":1956},{"type":46,"tag":1263,"props":2077,"children":2078},{"style":1282},[2079],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2081,"children":2083},{"class":1265,"line":2082},8,[2084,2089,2093,2097,2101,2106],{"type":46,"tag":1263,"props":2085,"children":2086},{"style":1981},[2087],{"type":52,"value":2088},"    isSkipped",{"type":46,"tag":1263,"props":2090,"children":2091},{"style":1282},[2092],{"type":52,"value":188},{"type":46,"tag":1263,"props":2094,"children":2095},{"style":1276},[2096],{"type":52,"value":1993},{"type":46,"tag":1263,"props":2098,"children":2099},{"style":1282},[2100],{"type":52,"value":472},{"type":46,"tag":1263,"props":2102,"children":2103},{"style":1276},[2104],{"type":52,"value":2105},"isSkippedSlide",{"type":46,"tag":1263,"props":2107,"children":2108},{"style":1282},[2109],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2111,"children":2113},{"class":1265,"line":2112},9,[2114,2119,2123,2127,2131,2136],{"type":46,"tag":1263,"props":2115,"children":2116},{"style":1981},[2117],{"type":52,"value":2118},"    speakerNotes",{"type":46,"tag":1263,"props":2120,"children":2121},{"style":1282},[2122],{"type":52,"value":188},{"type":46,"tag":1263,"props":2124,"children":2125},{"style":1276},[2126],{"type":52,"value":1993},{"type":46,"tag":1263,"props":2128,"children":2129},{"style":1282},[2130],{"type":52,"value":472},{"type":46,"tag":1263,"props":2132,"children":2133},{"style":1276},[2134],{"type":52,"value":2135},"speakerNotes",{"type":46,"tag":1263,"props":2137,"children":2138},{"style":1282},[2139],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2141,"children":2143},{"class":1265,"line":2142},10,[2144,2149],{"type":46,"tag":1263,"props":2145,"children":2146},{"style":1282},[2147],{"type":52,"value":2148},"  }",{"type":46,"tag":1263,"props":2150,"children":2151},{"style":1276},[2152],{"type":52,"value":2153},"))\n",{"type":46,"tag":1263,"props":2155,"children":2157},{"class":1265,"line":2156},11,[2158,2162],{"type":46,"tag":1263,"props":2159,"children":2160},{"style":1276},[2161],{"type":52,"value":1373},{"type":46,"tag":1263,"props":2163,"children":2164},{"style":1282},[2165],{"type":52,"value":1378},{"type":46,"tag":55,"props":2167,"children":2168},{},[2169],{"type":46,"tag":82,"props":2170,"children":2171},{},[2172],{"type":52,"value":2173},"Get text content from a specific slide:",{"type":46,"tag":1252,"props":2175,"children":2177},{"className":1254,"code":2176,"language":1256,"meta":1257,"style":1257},"const slide = figma.getNodeById(\"TARGET_SLIDE_ID\");\n\u002F\u002F findAllWithCriteria uses an indexed type lookup — much faster than\n\u002F\u002F findAll(n => n.type === 'TEXT') on slides with many shapes\u002Fimages.\nconst textNodes = slide.findAllWithCriteria({ types: [\"TEXT\"] });\nconst fontsToLoad = new Set();\nfor (const t of textNodes) {\n  if (t.fontName !== figma.mixed) {\n    fontsToLoad.add(JSON.stringify(t.fontName));\n  } else {\n    const segments = t.getStyledTextSegments([\"fontName\"]);\n    for (const seg of segments) fontsToLoad.add(JSON.stringify(seg.fontName));\n  }\n}\nfor (const f of fontsToLoad) {\n  await figma.loadFontAsync(JSON.parse(f));\n}\nreturn textNodes.map(t => ({\n  id: t.id,\n  name: t.name,\n  characters: t.characters,\n  x: t.x,\n  y: t.y,\n  width: t.width,\n  height: t.height,\n}));\n",[2178],{"type":46,"tag":61,"props":2179,"children":2180},{"__ignoreMap":1257},[2181,2235,2244,2252,2335,2369,2404,2457,2517,2534,2592,2680,2689,2698,2732,2788,2796,2837,2866,2895,2925,2954,2983,3013,3043],{"type":46,"tag":1263,"props":2182,"children":2183},{"class":1265,"line":1266},[2184,2188,2193,2197,2201,2205,2210,2214,2218,2223,2227,2231],{"type":46,"tag":1263,"props":2185,"children":2186},{"style":1270},[2187],{"type":52,"value":1273},{"type":46,"tag":1263,"props":2189,"children":2190},{"style":1276},[2191],{"type":52,"value":2192}," slide ",{"type":46,"tag":1263,"props":2194,"children":2195},{"style":1282},[2196],{"type":52,"value":1285},{"type":46,"tag":1263,"props":2198,"children":2199},{"style":1276},[2200],{"type":52,"value":1290},{"type":46,"tag":1263,"props":2202,"children":2203},{"style":1282},[2204],{"type":52,"value":472},{"type":46,"tag":1263,"props":2206,"children":2207},{"style":1315},[2208],{"type":52,"value":2209},"getNodeById",{"type":46,"tag":1263,"props":2211,"children":2212},{"style":1276},[2213],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2215,"children":2216},{"style":1282},[2217],{"type":52,"value":1368},{"type":46,"tag":1263,"props":2219,"children":2220},{"style":1361},[2221],{"type":52,"value":2222},"TARGET_SLIDE_ID",{"type":46,"tag":1263,"props":2224,"children":2225},{"style":1282},[2226],{"type":52,"value":1368},{"type":46,"tag":1263,"props":2228,"children":2229},{"style":1276},[2230],{"type":52,"value":1373},{"type":46,"tag":1263,"props":2232,"children":2233},{"style":1282},[2234],{"type":52,"value":1378},{"type":46,"tag":1263,"props":2236,"children":2237},{"class":1265,"line":1381},[2238],{"type":46,"tag":1263,"props":2239,"children":2241},{"style":2240},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[2242],{"type":52,"value":2243},"\u002F\u002F findAllWithCriteria uses an indexed type lookup — much faster than\n",{"type":46,"tag":1263,"props":2245,"children":2246},{"class":1265,"line":1920},[2247],{"type":46,"tag":1263,"props":2248,"children":2249},{"style":2240},[2250],{"type":52,"value":2251},"\u002F\u002F findAll(n => n.type === 'TEXT') on slides with many shapes\u002Fimages.\n",{"type":46,"tag":1263,"props":2253,"children":2254},{"class":1265,"line":1977},[2255,2259,2264,2268,2272,2276,2281,2285,2290,2295,2299,2304,2308,2313,2317,2322,2327,2331],{"type":46,"tag":1263,"props":2256,"children":2257},{"style":1270},[2258],{"type":52,"value":1273},{"type":46,"tag":1263,"props":2260,"children":2261},{"style":1276},[2262],{"type":52,"value":2263}," textNodes ",{"type":46,"tag":1263,"props":2265,"children":2266},{"style":1282},[2267],{"type":52,"value":1285},{"type":46,"tag":1263,"props":2269,"children":2270},{"style":1276},[2271],{"type":52,"value":1993},{"type":46,"tag":1263,"props":2273,"children":2274},{"style":1282},[2275],{"type":52,"value":472},{"type":46,"tag":1263,"props":2277,"children":2278},{"style":1315},[2279],{"type":52,"value":2280},"findAllWithCriteria",{"type":46,"tag":1263,"props":2282,"children":2283},{"style":1276},[2284],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2286,"children":2287},{"style":1282},[2288],{"type":52,"value":2289},"{",{"type":46,"tag":1263,"props":2291,"children":2292},{"style":1981},[2293],{"type":52,"value":2294}," types",{"type":46,"tag":1263,"props":2296,"children":2297},{"style":1282},[2298],{"type":52,"value":188},{"type":46,"tag":1263,"props":2300,"children":2301},{"style":1276},[2302],{"type":52,"value":2303}," [",{"type":46,"tag":1263,"props":2305,"children":2306},{"style":1282},[2307],{"type":52,"value":1368},{"type":46,"tag":1263,"props":2309,"children":2310},{"style":1361},[2311],{"type":52,"value":2312},"TEXT",{"type":46,"tag":1263,"props":2314,"children":2315},{"style":1282},[2316],{"type":52,"value":1368},{"type":46,"tag":1263,"props":2318,"children":2319},{"style":1276},[2320],{"type":52,"value":2321},"] ",{"type":46,"tag":1263,"props":2323,"children":2324},{"style":1282},[2325],{"type":52,"value":2326},"}",{"type":46,"tag":1263,"props":2328,"children":2329},{"style":1276},[2330],{"type":52,"value":1373},{"type":46,"tag":1263,"props":2332,"children":2333},{"style":1282},[2334],{"type":52,"value":1378},{"type":46,"tag":1263,"props":2336,"children":2337},{"class":1265,"line":2010},[2338,2342,2347,2351,2356,2361,2365],{"type":46,"tag":1263,"props":2339,"children":2340},{"style":1270},[2341],{"type":52,"value":1273},{"type":46,"tag":1263,"props":2343,"children":2344},{"style":1276},[2345],{"type":52,"value":2346}," fontsToLoad ",{"type":46,"tag":1263,"props":2348,"children":2349},{"style":1282},[2350],{"type":52,"value":1285},{"type":46,"tag":1263,"props":2352,"children":2353},{"style":1282},[2354],{"type":52,"value":2355}," new",{"type":46,"tag":1263,"props":2357,"children":2358},{"style":1315},[2359],{"type":52,"value":2360}," Set",{"type":46,"tag":1263,"props":2362,"children":2363},{"style":1276},[2364],{"type":52,"value":1859},{"type":46,"tag":1263,"props":2366,"children":2367},{"style":1282},[2368],{"type":52,"value":1378},{"type":46,"tag":1263,"props":2370,"children":2371},{"class":1265,"line":2040},[2372,2377,2381,2385,2390,2395,2400],{"type":46,"tag":1263,"props":2373,"children":2374},{"style":1869},[2375],{"type":52,"value":2376},"for",{"type":46,"tag":1263,"props":2378,"children":2379},{"style":1276},[2380],{"type":52,"value":1969},{"type":46,"tag":1263,"props":2382,"children":2383},{"style":1270},[2384],{"type":52,"value":1273},{"type":46,"tag":1263,"props":2386,"children":2387},{"style":1276},[2388],{"type":52,"value":2389}," t ",{"type":46,"tag":1263,"props":2391,"children":2392},{"style":1282},[2393],{"type":52,"value":2394},"of",{"type":46,"tag":1263,"props":2396,"children":2397},{"style":1276},[2398],{"type":52,"value":2399}," textNodes) ",{"type":46,"tag":1263,"props":2401,"children":2402},{"style":1282},[2403],{"type":52,"value":1974},{"type":46,"tag":1263,"props":2405,"children":2406},{"class":1265,"line":2061},[2407,2412,2416,2421,2425,2430,2435,2439,2443,2448,2453],{"type":46,"tag":1263,"props":2408,"children":2409},{"style":1869},[2410],{"type":52,"value":2411},"  if",{"type":46,"tag":1263,"props":2413,"children":2414},{"style":1981},[2415],{"type":52,"value":1969},{"type":46,"tag":1263,"props":2417,"children":2418},{"style":1276},[2419],{"type":52,"value":2420},"t",{"type":46,"tag":1263,"props":2422,"children":2423},{"style":1282},[2424],{"type":52,"value":472},{"type":46,"tag":1263,"props":2426,"children":2427},{"style":1276},[2428],{"type":52,"value":2429},"fontName",{"type":46,"tag":1263,"props":2431,"children":2432},{"style":1282},[2433],{"type":52,"value":2434}," !==",{"type":46,"tag":1263,"props":2436,"children":2437},{"style":1276},[2438],{"type":52,"value":1290},{"type":46,"tag":1263,"props":2440,"children":2441},{"style":1282},[2442],{"type":52,"value":472},{"type":46,"tag":1263,"props":2444,"children":2445},{"style":1276},[2446],{"type":52,"value":2447},"mixed",{"type":46,"tag":1263,"props":2449,"children":2450},{"style":1981},[2451],{"type":52,"value":2452},") ",{"type":46,"tag":1263,"props":2454,"children":2455},{"style":1282},[2456],{"type":52,"value":1974},{"type":46,"tag":1263,"props":2458,"children":2459},{"class":1265,"line":2082},[2460,2465,2469,2474,2478,2483,2487,2492,2496,2500,2504,2508,2513],{"type":46,"tag":1263,"props":2461,"children":2462},{"style":1276},[2463],{"type":52,"value":2464},"    fontsToLoad",{"type":46,"tag":1263,"props":2466,"children":2467},{"style":1282},[2468],{"type":52,"value":472},{"type":46,"tag":1263,"props":2470,"children":2471},{"style":1315},[2472],{"type":52,"value":2473},"add",{"type":46,"tag":1263,"props":2475,"children":2476},{"style":1981},[2477],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2479,"children":2480},{"style":1276},[2481],{"type":52,"value":2482},"JSON",{"type":46,"tag":1263,"props":2484,"children":2485},{"style":1282},[2486],{"type":52,"value":472},{"type":46,"tag":1263,"props":2488,"children":2489},{"style":1315},[2490],{"type":52,"value":2491},"stringify",{"type":46,"tag":1263,"props":2493,"children":2494},{"style":1981},[2495],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2497,"children":2498},{"style":1276},[2499],{"type":52,"value":2420},{"type":46,"tag":1263,"props":2501,"children":2502},{"style":1282},[2503],{"type":52,"value":472},{"type":46,"tag":1263,"props":2505,"children":2506},{"style":1276},[2507],{"type":52,"value":2429},{"type":46,"tag":1263,"props":2509,"children":2510},{"style":1981},[2511],{"type":52,"value":2512},"))",{"type":46,"tag":1263,"props":2514,"children":2515},{"style":1282},[2516],{"type":52,"value":1378},{"type":46,"tag":1263,"props":2518,"children":2519},{"class":1265,"line":2112},[2520,2524,2529],{"type":46,"tag":1263,"props":2521,"children":2522},{"style":1282},[2523],{"type":52,"value":2148},{"type":46,"tag":1263,"props":2525,"children":2526},{"style":1869},[2527],{"type":52,"value":2528}," else",{"type":46,"tag":1263,"props":2530,"children":2531},{"style":1282},[2532],{"type":52,"value":2533}," {\n",{"type":46,"tag":1263,"props":2535,"children":2536},{"class":1265,"line":2142},[2537,2542,2547,2552,2557,2561,2566,2571,2575,2579,2583,2588],{"type":46,"tag":1263,"props":2538,"children":2539},{"style":1270},[2540],{"type":52,"value":2541},"    const",{"type":46,"tag":1263,"props":2543,"children":2544},{"style":1276},[2545],{"type":52,"value":2546}," segments",{"type":46,"tag":1263,"props":2548,"children":2549},{"style":1282},[2550],{"type":52,"value":2551}," =",{"type":46,"tag":1263,"props":2553,"children":2554},{"style":1276},[2555],{"type":52,"value":2556}," t",{"type":46,"tag":1263,"props":2558,"children":2559},{"style":1282},[2560],{"type":52,"value":472},{"type":46,"tag":1263,"props":2562,"children":2563},{"style":1315},[2564],{"type":52,"value":2565},"getStyledTextSegments",{"type":46,"tag":1263,"props":2567,"children":2568},{"style":1981},[2569],{"type":52,"value":2570},"([",{"type":46,"tag":1263,"props":2572,"children":2573},{"style":1282},[2574],{"type":52,"value":1368},{"type":46,"tag":1263,"props":2576,"children":2577},{"style":1361},[2578],{"type":52,"value":2429},{"type":46,"tag":1263,"props":2580,"children":2581},{"style":1282},[2582],{"type":52,"value":1368},{"type":46,"tag":1263,"props":2584,"children":2585},{"style":1981},[2586],{"type":52,"value":2587},"])",{"type":46,"tag":1263,"props":2589,"children":2590},{"style":1282},[2591],{"type":52,"value":1378},{"type":46,"tag":1263,"props":2593,"children":2594},{"class":1265,"line":2156},[2595,2600,2604,2608,2613,2618,2622,2626,2631,2635,2639,2643,2647,2651,2655,2659,2664,2668,2672,2676],{"type":46,"tag":1263,"props":2596,"children":2597},{"style":1869},[2598],{"type":52,"value":2599},"    for",{"type":46,"tag":1263,"props":2601,"children":2602},{"style":1981},[2603],{"type":52,"value":1969},{"type":46,"tag":1263,"props":2605,"children":2606},{"style":1270},[2607],{"type":52,"value":1273},{"type":46,"tag":1263,"props":2609,"children":2610},{"style":1276},[2611],{"type":52,"value":2612}," seg",{"type":46,"tag":1263,"props":2614,"children":2615},{"style":1282},[2616],{"type":52,"value":2617}," of",{"type":46,"tag":1263,"props":2619,"children":2620},{"style":1276},[2621],{"type":52,"value":2546},{"type":46,"tag":1263,"props":2623,"children":2624},{"style":1981},[2625],{"type":52,"value":2452},{"type":46,"tag":1263,"props":2627,"children":2628},{"style":1276},[2629],{"type":52,"value":2630},"fontsToLoad",{"type":46,"tag":1263,"props":2632,"children":2633},{"style":1282},[2634],{"type":52,"value":472},{"type":46,"tag":1263,"props":2636,"children":2637},{"style":1315},[2638],{"type":52,"value":2473},{"type":46,"tag":1263,"props":2640,"children":2641},{"style":1981},[2642],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2644,"children":2645},{"style":1276},[2646],{"type":52,"value":2482},{"type":46,"tag":1263,"props":2648,"children":2649},{"style":1282},[2650],{"type":52,"value":472},{"type":46,"tag":1263,"props":2652,"children":2653},{"style":1315},[2654],{"type":52,"value":2491},{"type":46,"tag":1263,"props":2656,"children":2657},{"style":1981},[2658],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2660,"children":2661},{"style":1276},[2662],{"type":52,"value":2663},"seg",{"type":46,"tag":1263,"props":2665,"children":2666},{"style":1282},[2667],{"type":52,"value":472},{"type":46,"tag":1263,"props":2669,"children":2670},{"style":1276},[2671],{"type":52,"value":2429},{"type":46,"tag":1263,"props":2673,"children":2674},{"style":1981},[2675],{"type":52,"value":2512},{"type":46,"tag":1263,"props":2677,"children":2678},{"style":1282},[2679],{"type":52,"value":1378},{"type":46,"tag":1263,"props":2681,"children":2683},{"class":1265,"line":2682},12,[2684],{"type":46,"tag":1263,"props":2685,"children":2686},{"style":1282},[2687],{"type":52,"value":2688},"  }\n",{"type":46,"tag":1263,"props":2690,"children":2692},{"class":1265,"line":2691},13,[2693],{"type":46,"tag":1263,"props":2694,"children":2695},{"style":1282},[2696],{"type":52,"value":2697},"}\n",{"type":46,"tag":1263,"props":2699,"children":2701},{"class":1265,"line":2700},14,[2702,2706,2710,2714,2719,2723,2728],{"type":46,"tag":1263,"props":2703,"children":2704},{"style":1869},[2705],{"type":52,"value":2376},{"type":46,"tag":1263,"props":2707,"children":2708},{"style":1276},[2709],{"type":52,"value":1969},{"type":46,"tag":1263,"props":2711,"children":2712},{"style":1270},[2713],{"type":52,"value":1273},{"type":46,"tag":1263,"props":2715,"children":2716},{"style":1276},[2717],{"type":52,"value":2718}," f ",{"type":46,"tag":1263,"props":2720,"children":2721},{"style":1282},[2722],{"type":52,"value":2394},{"type":46,"tag":1263,"props":2724,"children":2725},{"style":1276},[2726],{"type":52,"value":2727}," fontsToLoad) ",{"type":46,"tag":1263,"props":2729,"children":2730},{"style":1282},[2731],{"type":52,"value":1974},{"type":46,"tag":1263,"props":2733,"children":2735},{"class":1265,"line":2734},15,[2736,2741,2745,2749,2754,2758,2762,2766,2771,2775,2780,2784],{"type":46,"tag":1263,"props":2737,"children":2738},{"style":1869},[2739],{"type":52,"value":2740},"  await",{"type":46,"tag":1263,"props":2742,"children":2743},{"style":1276},[2744],{"type":52,"value":1290},{"type":46,"tag":1263,"props":2746,"children":2747},{"style":1282},[2748],{"type":52,"value":472},{"type":46,"tag":1263,"props":2750,"children":2751},{"style":1315},[2752],{"type":52,"value":2753},"loadFontAsync",{"type":46,"tag":1263,"props":2755,"children":2756},{"style":1981},[2757],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2759,"children":2760},{"style":1276},[2761],{"type":52,"value":2482},{"type":46,"tag":1263,"props":2763,"children":2764},{"style":1282},[2765],{"type":52,"value":472},{"type":46,"tag":1263,"props":2767,"children":2768},{"style":1315},[2769],{"type":52,"value":2770},"parse",{"type":46,"tag":1263,"props":2772,"children":2773},{"style":1981},[2774],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2776,"children":2777},{"style":1276},[2778],{"type":52,"value":2779},"f",{"type":46,"tag":1263,"props":2781,"children":2782},{"style":1981},[2783],{"type":52,"value":2512},{"type":46,"tag":1263,"props":2785,"children":2786},{"style":1282},[2787],{"type":52,"value":1378},{"type":46,"tag":1263,"props":2789,"children":2791},{"class":1265,"line":2790},16,[2792],{"type":46,"tag":1263,"props":2793,"children":2794},{"style":1282},[2795],{"type":52,"value":2697},{"type":46,"tag":1263,"props":2797,"children":2799},{"class":1265,"line":2798},17,[2800,2804,2809,2813,2817,2821,2825,2829,2833],{"type":46,"tag":1263,"props":2801,"children":2802},{"style":1869},[2803],{"type":52,"value":1756},{"type":46,"tag":1263,"props":2805,"children":2806},{"style":1276},[2807],{"type":52,"value":2808}," textNodes",{"type":46,"tag":1263,"props":2810,"children":2811},{"style":1282},[2812],{"type":52,"value":472},{"type":46,"tag":1263,"props":2814,"children":2815},{"style":1315},[2816],{"type":52,"value":1885},{"type":46,"tag":1263,"props":2818,"children":2819},{"style":1276},[2820],{"type":52,"value":1323},{"type":46,"tag":1263,"props":2822,"children":2823},{"style":1326},[2824],{"type":52,"value":2420},{"type":46,"tag":1263,"props":2826,"children":2827},{"style":1270},[2828],{"type":52,"value":1334},{"type":46,"tag":1263,"props":2830,"children":2831},{"style":1276},[2832],{"type":52,"value":1969},{"type":46,"tag":1263,"props":2834,"children":2835},{"style":1282},[2836],{"type":52,"value":1974},{"type":46,"tag":1263,"props":2838,"children":2840},{"class":1265,"line":2839},18,[2841,2846,2850,2854,2858,2862],{"type":46,"tag":1263,"props":2842,"children":2843},{"style":1981},[2844],{"type":52,"value":2845},"  id",{"type":46,"tag":1263,"props":2847,"children":2848},{"style":1282},[2849],{"type":52,"value":188},{"type":46,"tag":1263,"props":2851,"children":2852},{"style":1276},[2853],{"type":52,"value":2556},{"type":46,"tag":1263,"props":2855,"children":2856},{"style":1282},[2857],{"type":52,"value":472},{"type":46,"tag":1263,"props":2859,"children":2860},{"style":1276},[2861],{"type":52,"value":2002},{"type":46,"tag":1263,"props":2863,"children":2864},{"style":1282},[2865],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2867,"children":2869},{"class":1265,"line":2868},19,[2870,2875,2879,2883,2887,2891],{"type":46,"tag":1263,"props":2871,"children":2872},{"style":1981},[2873],{"type":52,"value":2874},"  name",{"type":46,"tag":1263,"props":2876,"children":2877},{"style":1282},[2878],{"type":52,"value":188},{"type":46,"tag":1263,"props":2880,"children":2881},{"style":1276},[2882],{"type":52,"value":2556},{"type":46,"tag":1263,"props":2884,"children":2885},{"style":1282},[2886],{"type":52,"value":472},{"type":46,"tag":1263,"props":2888,"children":2889},{"style":1276},[2890],{"type":52,"value":2033},{"type":46,"tag":1263,"props":2892,"children":2893},{"style":1282},[2894],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2896,"children":2898},{"class":1265,"line":2897},20,[2899,2904,2908,2912,2916,2921],{"type":46,"tag":1263,"props":2900,"children":2901},{"style":1981},[2902],{"type":52,"value":2903},"  characters",{"type":46,"tag":1263,"props":2905,"children":2906},{"style":1282},[2907],{"type":52,"value":188},{"type":46,"tag":1263,"props":2909,"children":2910},{"style":1276},[2911],{"type":52,"value":2556},{"type":46,"tag":1263,"props":2913,"children":2914},{"style":1282},[2915],{"type":52,"value":472},{"type":46,"tag":1263,"props":2917,"children":2918},{"style":1276},[2919],{"type":52,"value":2920},"characters",{"type":46,"tag":1263,"props":2922,"children":2923},{"style":1282},[2924],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2926,"children":2928},{"class":1265,"line":2927},21,[2929,2934,2938,2942,2946,2950],{"type":46,"tag":1263,"props":2930,"children":2931},{"style":1981},[2932],{"type":52,"value":2933},"  x",{"type":46,"tag":1263,"props":2935,"children":2936},{"style":1282},[2937],{"type":52,"value":188},{"type":46,"tag":1263,"props":2939,"children":2940},{"style":1276},[2941],{"type":52,"value":2556},{"type":46,"tag":1263,"props":2943,"children":2944},{"style":1282},[2945],{"type":52,"value":472},{"type":46,"tag":1263,"props":2947,"children":2948},{"style":1276},[2949],{"type":52,"value":285},{"type":46,"tag":1263,"props":2951,"children":2952},{"style":1282},[2953],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2955,"children":2957},{"class":1265,"line":2956},22,[2958,2963,2967,2971,2975,2979],{"type":46,"tag":1263,"props":2959,"children":2960},{"style":1981},[2961],{"type":52,"value":2962},"  y",{"type":46,"tag":1263,"props":2964,"children":2965},{"style":1282},[2966],{"type":52,"value":188},{"type":46,"tag":1263,"props":2968,"children":2969},{"style":1276},[2970],{"type":52,"value":2556},{"type":46,"tag":1263,"props":2972,"children":2973},{"style":1282},[2974],{"type":52,"value":472},{"type":46,"tag":1263,"props":2976,"children":2977},{"style":1276},[2978],{"type":52,"value":293},{"type":46,"tag":1263,"props":2980,"children":2981},{"style":1282},[2982],{"type":52,"value":2007},{"type":46,"tag":1263,"props":2984,"children":2986},{"class":1265,"line":2985},23,[2987,2992,2996,3000,3004,3009],{"type":46,"tag":1263,"props":2988,"children":2989},{"style":1981},[2990],{"type":52,"value":2991},"  width",{"type":46,"tag":1263,"props":2993,"children":2994},{"style":1282},[2995],{"type":52,"value":188},{"type":46,"tag":1263,"props":2997,"children":2998},{"style":1276},[2999],{"type":52,"value":2556},{"type":46,"tag":1263,"props":3001,"children":3002},{"style":1282},[3003],{"type":52,"value":472},{"type":46,"tag":1263,"props":3005,"children":3006},{"style":1276},[3007],{"type":52,"value":3008},"width",{"type":46,"tag":1263,"props":3010,"children":3011},{"style":1282},[3012],{"type":52,"value":2007},{"type":46,"tag":1263,"props":3014,"children":3016},{"class":1265,"line":3015},24,[3017,3022,3026,3030,3034,3039],{"type":46,"tag":1263,"props":3018,"children":3019},{"style":1981},[3020],{"type":52,"value":3021},"  height",{"type":46,"tag":1263,"props":3023,"children":3024},{"style":1282},[3025],{"type":52,"value":188},{"type":46,"tag":1263,"props":3027,"children":3028},{"style":1276},[3029],{"type":52,"value":2556},{"type":46,"tag":1263,"props":3031,"children":3032},{"style":1282},[3033],{"type":52,"value":472},{"type":46,"tag":1263,"props":3035,"children":3036},{"style":1276},[3037],{"type":52,"value":3038},"height",{"type":46,"tag":1263,"props":3040,"children":3041},{"style":1282},[3042],{"type":52,"value":2007},{"type":46,"tag":1263,"props":3044,"children":3046},{"class":1265,"line":3045},25,[3047,3051,3055],{"type":46,"tag":1263,"props":3048,"children":3049},{"style":1282},[3050],{"type":52,"value":2326},{"type":46,"tag":1263,"props":3052,"children":3053},{"style":1276},[3054],{"type":52,"value":2512},{"type":46,"tag":1263,"props":3056,"children":3057},{"style":1282},[3058],{"type":52,"value":1378},{"type":46,"tag":128,"props":3060,"children":3062},{"id":3061},"reference-docs",[3063],{"type":52,"value":3064},"Reference Docs",{"type":46,"tag":55,"props":3066,"children":3067},{},[3068],{"type":52,"value":3069},"Load only the references your task needs:",{"type":46,"tag":611,"props":3071,"children":3072},{},[3073,3084,3094,3117,3128,3179],{"type":46,"tag":246,"props":3074,"children":3075},{},[3076,3082],{"type":46,"tag":70,"props":3077,"children":3079},{"href":3078},"references\u002Fslide-gotchas.md",[3080],{"type":52,"value":3081},"slide-gotchas",{"type":52,"value":3083}," — Pitfalls specific to Slides (coordinate offsets, opaque node types, validation workarounds)",{"type":46,"tag":246,"props":3085,"children":3086},{},[3087,3092],{"type":46,"tag":70,"props":3088,"children":3089},{"href":467},[3090],{"type":52,"value":3091},"slide-lifecycle",{"type":52,"value":3093}," — Create, clone, delete, and reorder slides and slide rows",{"type":46,"tag":246,"props":3095,"children":3096},{},[3097,3102,3104,3109,3110,3116],{"type":46,"tag":70,"props":3098,"children":3099},{"href":584},[3100],{"type":52,"value":3101},"slide-grid",{"type":52,"value":3103}," — Work with the slide grid layout (",{"type":46,"tag":61,"props":3105,"children":3107},{"className":3106},[],[3108],{"type":52,"value":1854},{"type":52,"value":409},{"type":46,"tag":61,"props":3111,"children":3113},{"className":3112},[],[3114],{"type":52,"value":3115},"setSlideGrid",{"type":52,"value":1373},{"type":46,"tag":246,"props":3118,"children":3119},{},[3120,3126],{"type":46,"tag":70,"props":3121,"children":3123},{"href":3122},"references\u002Fslide-content.md",[3124],{"type":52,"value":3125},"slide-content",{"type":52,"value":3127}," — Build content within slides (text, shapes, auto-layout — SlideNode extends BaseFrameMixin)",{"type":46,"tag":246,"props":3129,"children":3130},{},[3131,3137,3139,3144,3145,3150,3151,3157,3158,3164,3165,3171,3172,3178],{"type":46,"tag":70,"props":3132,"children":3134},{"href":3133},"references\u002Fslide-properties.md",[3135],{"type":52,"value":3136},"slide-properties",{"type":52,"value":3138}," — Slide-specific properties (",{"type":46,"tag":61,"props":3140,"children":3142},{"className":3141},[],[3143],{"type":52,"value":2135},{"type":52,"value":409},{"type":46,"tag":61,"props":3146,"children":3148},{"className":3147},[],[3149],{"type":52,"value":2105},{"type":52,"value":409},{"type":46,"tag":61,"props":3152,"children":3154},{"className":3153},[],[3155],{"type":52,"value":3156},"focusedSlide",{"type":52,"value":409},{"type":46,"tag":61,"props":3159,"children":3161},{"className":3160},[],[3162],{"type":52,"value":3163},"focusedNode",{"type":52,"value":409},{"type":46,"tag":61,"props":3166,"children":3168},{"className":3167},[],[3169],{"type":52,"value":3170},"slideThemeId",{"type":52,"value":409},{"type":46,"tag":61,"props":3173,"children":3175},{"className":3174},[],[3176],{"type":52,"value":3177},"InteractiveSlideElementNode",{"type":52,"value":1373},{"type":46,"tag":246,"props":3180,"children":3181},{},[3182,3187],{"type":46,"tag":70,"props":3183,"children":3184},{"href":659},[3185],{"type":52,"value":3186},"slide-design",{"type":52,"value":3188}," — Design principles for visually interesting, varied decks (color strategy, typography, layout variety, spatial composition, anti-patterns)",{"type":46,"tag":3190,"props":3191,"children":3192},"style",{},[3193],{"type":52,"value":3194},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3196,"total":3316},[3197,3214,3230,3242,3262,3284,3304],{"slug":3198,"name":3198,"fn":3199,"description":3200,"org":3201,"tags":3202,"stars":28,"repoUrl":29,"updatedAt":3213},"accessibility-and-inclusive-visualization","make data visualizations accessible","Make data visualizations accessible and inclusive. Use when the user needs chart or diagram accessibility guidance, text alternatives for complex visuals, color and contrast review, keyboard support, reduced-motion behavior for animation or parallax, or an accessibility QA workflow for exported figures, UML-like diagrams, and dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3203,3206,3209,3212],{"name":3204,"slug":3205,"type":15},"Accessibility","accessibility",{"name":3207,"slug":3208,"type":15},"Charts","charts",{"name":3210,"slug":3211,"type":15},"Data Visualization","data-visualization",{"name":26,"slug":27,"type":15},"2026-06-30T19:00:57.102",{"slug":3215,"name":3215,"fn":3216,"description":3217,"org":3218,"tags":3219,"stars":28,"repoUrl":29,"updatedAt":3229},"agent-browser","automate browser interactions for agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, verify dev server output, test web apps, navigate pages, fill forms, click buttons, take screenshots, extract data, or automate any browser task. Also triggers when a dev server starts so you can verify it visually.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3220,3223,3226],{"name":3221,"slug":3222,"type":15},"Agents","agents",{"name":3224,"slug":3225,"type":15},"Browser Automation","browser-automation",{"name":3227,"slug":3228,"type":15},"Testing","testing","2026-04-06T18:41:03.44016",{"slug":3231,"name":3231,"fn":3232,"description":3233,"org":3234,"tags":3235,"stars":28,"repoUrl":29,"updatedAt":3241},"agent-browser-verify","verify dev server output with automated browser","Automated browser verification for dev servers. Triggers when a dev server starts to run a visual gut-check with agent-browser — verifies the page loads, checks for console errors, validates key UI elements, and reports pass\u002Ffail before continuing.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3236,3237,3240],{"name":3224,"slug":3225,"type":15},{"name":3238,"slug":3239,"type":15},"Local Development","local-development",{"name":3227,"slug":3228,"type":15},"2026-04-06T18:41:17.526867",{"slug":3243,"name":3243,"fn":3244,"description":3245,"org":3246,"tags":3247,"stars":28,"repoUrl":29,"updatedAt":3261},"agents-sdk","build AI agents on Cloudflare Workers","Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, or chat applications. Covers Agent class, state management, callable RPC, Workflows integration, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3248,3249,3252,3255,3258],{"name":3221,"slug":3222,"type":15},{"name":3250,"slug":3251,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":3253,"slug":3254,"type":15},"SDK","sdk",{"name":3256,"slug":3257,"type":15},"Serverless","serverless",{"name":3259,"slug":3260,"type":15},"WebSockets","websockets","2026-04-06T18:39:51.717063",{"slug":3263,"name":3263,"fn":3264,"description":3265,"org":3266,"tags":3267,"stars":28,"repoUrl":29,"updatedAt":3283},"ai-elements","build chat UIs with AI Elements","AI Elements component library guidance — pre-built React components for AI interfaces built on shadcn\u002Fui. Use when building chat UIs, message displays, tool call rendering, streaming responses, reasoning panels, or any AI-native interface with the AI SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3268,3271,3274,3277,3280],{"name":3269,"slug":3270,"type":15},"Frontend","frontend",{"name":3272,"slug":3273,"type":15},"React","react",{"name":3275,"slug":3276,"type":15},"shadcn\u002Fui","shadcn-ui",{"name":3278,"slug":3279,"type":15},"UI Components","ui-components",{"name":3281,"slug":3282,"type":15},"Vercel","vercel","2026-04-06T18:40:59.619419",{"slug":3285,"name":3285,"fn":3286,"description":3287,"org":3288,"tags":3289,"stars":28,"repoUrl":29,"updatedAt":3303},"ai-gateway","configure Vercel AI Gateway","Vercel AI Gateway expert guidance. Use when configuring model routing, provider failover, cost tracking, or managing multiple AI providers through a unified API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3290,3293,3296,3299,3302],{"name":3291,"slug":3292,"type":15},"AI Infrastructure","ai-infrastructure",{"name":3294,"slug":3295,"type":15},"Cost Optimization","cost-optimization",{"name":3297,"slug":3298,"type":15},"LLM","llm",{"name":3300,"slug":3301,"type":15},"Performance","performance",{"name":3281,"slug":3282,"type":15},"2026-04-06T18:40:44.377464",{"slug":3305,"name":3305,"fn":3306,"description":3307,"org":3308,"tags":3309,"stars":28,"repoUrl":29,"updatedAt":3315},"ai-generation-persistence","implement persistence patterns for AI generations","AI generation persistence patterns — unique IDs, addressable URLs, database storage, and cost tracking for every LLM generation",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3310,3311,3314],{"name":3294,"slug":3295,"type":15},{"name":3312,"slug":3313,"type":15},"Database","database",{"name":3297,"slug":3298,"type":15},"2026-04-06T18:41:08.513425",600,{"items":3318,"total":3511},[3319,3340,3363,3378,3394,3411,3430,3440,3454,3468,3480,3495],{"slug":3320,"name":3320,"fn":3321,"description":3322,"org":3323,"tags":3324,"stars":3337,"repoUrl":3338,"updatedAt":3339},"prior-auth-packet-builder","build healthcare prior authorization packets","Build a concise prior authorization packet from local case files and payer policy docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3325,3328,3331,3334],{"name":3326,"slug":3327,"type":15},"Documents","documents",{"name":3329,"slug":3330,"type":15},"Healthcare","healthcare",{"name":3332,"slug":3333,"type":15},"Insurance","insurance",{"name":3335,"slug":3336,"type":15},"Regulatory Compliance","regulatory-compliance",28169,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python","2026-04-16T05:11:39.180399",{"slug":3341,"name":3341,"fn":3342,"description":3343,"org":3344,"tags":3345,"stars":3360,"repoUrl":3361,"updatedAt":3362},"aspnet-core","build ASP.NET Core web applications","Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3346,3349,3351,3354,3357],{"name":3347,"slug":3348,"type":15},".NET","dotnet",{"name":3350,"slug":3341,"type":15},"ASP.NET Core",{"name":3352,"slug":3353,"type":15},"Blazor","blazor",{"name":3355,"slug":3356,"type":15},"C#","csharp",{"name":3358,"slug":3359,"type":15},"Web Development","web-development",23787,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills","2026-04-12T05:07:02.819491",{"slug":3364,"name":3364,"fn":3365,"description":3366,"org":3367,"tags":3368,"stars":3360,"repoUrl":3361,"updatedAt":3377},"chatgpt-apps","build ChatGPT Apps SDK applications","Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI. Use when Codex needs to design tools, register UI resources, wire the MCP Apps bridge or ChatGPT compatibility APIs, apply Apps SDK metadata or CSP or domain settings, or produce a docs-aligned project scaffold. Prefer a docs-first workflow by invoking the openai-docs skill or OpenAI developer docs MCP tools before generating code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3369,3372,3375,3376],{"name":3370,"slug":3371,"type":15},"Apps SDK","apps-sdk",{"name":3373,"slug":3374,"type":15},"ChatGPT","chatgpt",{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},"2026-04-12T05:07:05.468097",{"slug":3379,"name":3379,"fn":3380,"description":3381,"org":3382,"tags":3383,"stars":3360,"repoUrl":3361,"updatedAt":3393},"cli-creator","build CLIs from API docs","Build a composable CLI for Codex from API docs, an OpenAPI spec, existing curl examples, an SDK, a web app, an admin tool, or a local script. Use when the user wants Codex to create a command-line tool that can run from any repo, expose composable read\u002Fwrite commands, return stable JSON, manage auth, and pair with a companion skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3384,3387,3390],{"name":3385,"slug":3386,"type":15},"API Development","api-development",{"name":3388,"slug":3389,"type":15},"CLI","cli",{"name":3391,"slug":3392,"type":15},"Codex","codex","2026-04-12T05:07:04.132762",{"slug":3395,"name":3395,"fn":3396,"description":3397,"org":3398,"tags":3399,"stars":3360,"repoUrl":3361,"updatedAt":3410},"cloudflare-deploy","deploy projects to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3400,3403,3406,3407],{"name":3401,"slug":3402,"type":15},"Cloudflare","cloudflare",{"name":3404,"slug":3405,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":3250,"slug":3251,"type":15},{"name":3408,"slug":3409,"type":15},"Deployment","deployment","2026-04-12T05:07:14.275118",{"slug":3412,"name":3412,"fn":3413,"description":3414,"org":3415,"tags":3416,"stars":3360,"repoUrl":3361,"updatedAt":3429},"define-goal","define and set measurable project goals","Help the user define a concrete, measurable goal before starting work, especially when they ask to use the goal tool, create a goal, set an objective, clarify success criteria, or turn a fuzzy intention into a quantitative outcome. Use this skill for goal creation and goal refinement only; it does not manage durable snapshots, decision logs, or long-running execution artifacts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3417,3420,3423,3426],{"name":3418,"slug":3419,"type":15},"Productivity","productivity",{"name":3421,"slug":3422,"type":15},"Project Management","project-management",{"name":3424,"slug":3425,"type":15},"Strategy","strategy",{"name":3427,"slug":3428,"type":15},"Task Management","task-management","2026-05-23T06:17:16.870838",{"slug":24,"name":24,"fn":3431,"description":3432,"org":3433,"tags":3434,"stars":3360,"repoUrl":3361,"updatedAt":3439},"translate Figma designs into code","Use the Figma MCP server to fetch design context, screenshots, variables, and assets from Figma, and to translate Figma nodes into production code. Trigger when a task involves Figma URLs, node IDs, design-to-code implementation, or Figma MCP setup and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3435,3436,3437,3438],{"name":26,"slug":27,"type":15},{"name":23,"slug":24,"type":15},{"name":3269,"slug":3270,"type":15},{"name":20,"slug":21,"type":15},"2026-04-12T05:06:47.939943",{"slug":3441,"name":3441,"fn":3442,"description":3443,"org":3444,"tags":3445,"stars":3360,"repoUrl":3361,"updatedAt":3453},"figma-code-connect-components","connect Figma designs to code components","Connects Figma design components to code components using Code Connect mapping tools. Use when user says \"code connect\", \"connect this component to code\", \"map this component\", \"link component to code\", \"create code connect mapping\", or wants to establish mappings between Figma designs and code implementations. For canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3446,3447,3450,3451,3452],{"name":26,"slug":27,"type":15},{"name":3448,"slug":3449,"type":15},"Design System","design-system",{"name":23,"slug":24,"type":15},{"name":3269,"slug":3270,"type":15},{"name":3278,"slug":3279,"type":15},"2026-05-10T05:59:52.971881",{"slug":3455,"name":3455,"fn":3456,"description":3457,"org":3458,"tags":3459,"stars":3360,"repoUrl":3361,"updatedAt":3467},"figma-create-design-system-rules","generate design system rules from Figma","Generates custom design system rules for the user's codebase. Use when user says \"create design system rules\", \"generate rules for my project\", \"set up design rules\", \"customize design system guidelines\", or wants to establish project-specific conventions for Figma-to-code workflows. Requires Figma MCP server connection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3460,3461,3462,3465,3466],{"name":26,"slug":27,"type":15},{"name":3448,"slug":3449,"type":15},{"name":3463,"slug":3464,"type":15},"Documentation","documentation",{"name":23,"slug":24,"type":15},{"name":3269,"slug":3270,"type":15},"2026-05-16T06:07:47.821474",{"slug":3469,"name":3469,"fn":3470,"description":3471,"org":3472,"tags":3473,"stars":3360,"repoUrl":3361,"updatedAt":3479},"figma-implement-design","translate Figma designs into application code","Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions \"implement design\", \"generate code\", \"implement component\", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3474,3475,3476,3477,3478],{"name":26,"slug":27,"type":15},{"name":23,"slug":24,"type":15},{"name":3269,"slug":3270,"type":15},{"name":3278,"slug":3279,"type":15},{"name":3358,"slug":3359,"type":15},"2026-05-16T06:07:40.583615",{"slug":3481,"name":3481,"fn":3482,"description":3483,"org":3484,"tags":3485,"stars":3360,"repoUrl":3361,"updatedAt":3494},"hatch-pet","create animated pets for Codex","Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3486,3489,3490,3493],{"name":3487,"slug":3488,"type":15},"Animation","animation",{"name":3391,"slug":3392,"type":15},{"name":3491,"slug":3492,"type":15},"Creative","creative",{"name":26,"slug":27,"type":15},"2026-05-02T05:31:48.48485",{"slug":3496,"name":3496,"fn":3497,"description":3498,"org":3499,"tags":3500,"stars":3360,"repoUrl":3361,"updatedAt":3510},"imagegen","generate and edit raster images","Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG\u002Fvector\u002Fcode-native assets, extending an established icon or logo system, or building the visual directly in HTML\u002FCSS\u002Fcanvas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3501,3502,3503,3506,3509],{"name":3491,"slug":3492,"type":15},{"name":26,"slug":27,"type":15},{"name":3504,"slug":3505,"type":15},"Image Generation","image-generation",{"name":3507,"slug":3508,"type":15},"Images","images",{"name":9,"slug":8,"type":15},"2026-05-15T06:23:24.312127",675]