Connect Component To Figma
dequelabs/cauldron
Add a Figma Code Connect (.figma.tsx) file for a Cauldron React component.
Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library.
$ npx skills add Khan/wonder-blocks --skill wonder-blocks -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Khan/wonder-blocks wonder-blocks --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Khan/wonder-blocks.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/wonder-blocks .claude/skills/wonder-blocks && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "wonder-blocks" agent skill from https://github.com/Khan/wonder-blocks/tree/main/.agents/skills/wonder-blocks into .claude/skills/wonder-blocks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wonder-blocks", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Khan/wonder-blocks/tree/main/.agents/skills/wonder-blocksType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Khan/wonder-blocks --skill wonder-blocks -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Khan/wonder-blocks wonder-blocks --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Khan/wonder-blocks.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/wonder-blocks .agents/skills/wonder-blocks && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "wonder-blocks" agent skill from https://github.com/Khan/wonder-blocks/tree/main/.agents/skills/wonder-blocks into .agents/skills/wonder-blocks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wonder-blocks", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Khan/wonder-blocks --skill wonder-blocks -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Khan/wonder-blocks wonder-blocks --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Khan/wonder-blocks.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/wonder-blocks .cursor/skills/wonder-blocks && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "wonder-blocks" agent skill from https://github.com/Khan/wonder-blocks/tree/main/.agents/skills/wonder-blocks into .cursor/skills/wonder-blocks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wonder-blocks", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Khan/wonder-blocks.git --path .agents/skills/wonder-blocks--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Khan/wonder-blocks --skill wonder-blocks -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Khan/wonder-blocks wonder-blocks --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Khan/wonder-blocks.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/wonder-blocks .gemini/skills/wonder-blocks && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "wonder-blocks" agent skill from https://github.com/Khan/wonder-blocks/tree/main/.agents/skills/wonder-blocks into .gemini/skills/wonder-blocks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wonder-blocks", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Khan/wonder-blocks wonder-blocksInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Khan/wonder-blocks --skill wonder-blocks -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Khan/wonder-blocks.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/wonder-blocks .github/skills/wonder-blocks && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "wonder-blocks" agent skill from https://github.com/Khan/wonder-blocks/tree/main/.agents/skills/wonder-blocks into .github/skills/wonder-blocks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wonder-blocks", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Khan/wonder-blocks --skill wonder-blocks -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Khan/wonder-blocks wonder-blocks --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Khan/wonder-blocks.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/wonder-blocks .opencode/skills/wonder-blocks && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "wonder-blocks" agent skill from https://github.com/Khan/wonder-blocks/tree/main/.agents/skills/wonder-blocks into .opencode/skills/wonder-blocks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wonder-blocks", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
wonder-blocksImplements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library.
Wonder Blocks is an agent skill from Khan/wonder-blocks. Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library. Use this skill whenever the user asks you to build, modify, or review UI components; wants to use or map WB tokens for colors/spacing/typography (including translating Figma designs to WB components and tokens); or asks how to do something "the Wonder Blocks way". If the user is building any kind of form, layout, modal, button, dropdown, or typography treatment in a WB-enabled codebase, this skill…
Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/forms.md`).
It sits in Frontend & Design, covering Design systems, Typography and React components. It works with Figma, TypeScript, React and Model Context Protocol. The repository describes itself as: React components for Wonder Blocks design system. The licence is MIT.
Read from SKILL.md and the folder at commit 04b6068. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Wonder Blocks loads about 3.2k tokens when it runs, and up to ~6.5k if it reads all its reference files. Until then it costs about 173 tokens; SKILL.md has 1,069 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Khan/wonder-blocks at commit 04b6068, republished under its MIT licence (© Khan). 1,069 words, ~3,230 tokens.
.claude/skills/wonder-blocks/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Wonder Blocks is Khan Academy's React component library (@khanacademy/wonder-blocks-*).
All components are TypeScript-friendly, use aphrodite for styling, and follow WAI-ARIA
accessibility patterns.
If the Figma MCP or WB Storybook MCP is used, use each for its purpose:
If the WB Storybook MCP is not available, refer to the type definitions for WB components to learn more about the API.
IMPORTANT: This skill is required even when similar patterns already exist in the codebase. Do not skip it because you found a nearby file to copy from.
| Package | Key exports |
|---|---|
wonder-blocks-core | View,addStyle |
wonder-blocks-tokens | semanticColor, sizing, border, boxShadow, font, breakpoint |
wonder-blocks-typography | BodyText, Heading |
wonder-blocks-button | Button, ActivityButton |
wonder-blocks-link | Link |
wonder-blocks-clickable | Clickable, ClickableBehavior |
wonder-blocks-icon-button | IconButton, ActivityIconButton, ConversationIconButton |
wonder-blocks-icon | Icon, PhosphorIcon |
wonder-blocks-form | TextField, TextArea, Checkbox, CheckboxGroup, Choice, RadioGroup |
wonder-blocks-labeled-field | LabeledField |
wonder-blocks-dropdown | SingleSelect, MultiSelect, ActionMenu, Combobox, OptionItem, ActionItem, SeparatorItem |
wonder-blocks-modal | ModalLauncher, OnePaneDialog, FlexibleDialog, DrawerLauncher, DrawerDialog |
wonder-blocks-accordion | Accordion, AccordionSection |
wonder-blocks-badge | Badge, StatusBadge, GemBadge, StreakBadge, DueBadge, NeutralBadge |
wonder-blocks-banner | Banner |
wonder-blocks-breadcrumbs | Breadcrumbs, BreadcrumbsItem |
wonder-blocks-card | Card |
wonder-blocks-cell | CompactCell, DetailCell |
wonder-blocks-popover | Popover, PopoverContent, PopoverContentCore |
wonder-blocks-progress-spinner | CircularSpinner |
wonder-blocks-search-field | SearchField |
wonder-blocks-switch | Switch |
wonder-blocks-tabs | ResponsiveTabs, ResponsiveNavigationTabs |
wonder-blocks-toolbar | Toolbar |
wonder-blocks-tooltip | Tooltip, TooltipContent |
wonder-blocks-theming | Theme providers |
wonder-blocks-styles | Global style helpers like focusStyles |
WB uses aphrodite for scoped CSS. Never use inline style objects for complex styles —
define them with StyleSheet.create so they're type-safe and mergeable.
import {StyleSheet} from "aphrodite";
import {View} from "@khanacademy/wonder-blocks-core";
import {sizing, semanticColor} from "@khanacademy/wonder-blocks-tokens";
const MyComponent = () => (
<View style={styles.container}>
...
</View>
);
const styles = StyleSheet.create({
container: {
padding: sizing.size_160,
backgroundColor: semanticColor.core.background.base.default,
},
});Apply multiple styles with an array: style={[styles.base, isActive && styles.active]}.
Avoid applying too many custom styles to a Wonder Blocks component. Layout related properties
are okay like margin, but prefer using props for choosing supported variants.
If custom styling is necessary for a Wonder Blocks component, use the style or
styles prop depending on the component. Prompt the user to reach out to the Wonder
Blocks team if many styles need to be overridden. This may mean there is a limitation
with the component.
import { StyleSheet } from "aphrodite";
import { sizing } from "@khanacademy/wonder-blocks-tokens";
import { BodyText } from "@khanacademy/wonder-blocks-typography";
const styles = StyleSheet.create({
text: {
margin: sizing.size_160,
},
});
const Example = () => (
<BodyText style={styles.text}>Hello world</BodyText>
);Always reach for tokens rather than hardcoded values. The two main namespaces:
semanticColor — the right choice for most UI work. Tokens like
semanticColor.core.background.base.default, semanticColor.core.foreground.neutral.strong,
semanticColor.core.border.neutral.default, semanticColor.feedback.success.background.
These automatically adapt to themes. Use these values with the appropriate CSS properties.
sizing — Use sizing tokens for spacing. These values use rem values so
they scale with the font size. 1rem = 10px
border — Always use border tokens instead of hardcoded pixel values.
border.radius.radius_040, border.radius.radius_full, etc.border.width.thin, border.width.medium, border.width.thick// ✅ correct
border: `${border.width.thin} solid ${semanticColor.core.border.neutral.default}`,
borderRadius: border.radius.radius_040,
// ❌ avoid
border: `1px solid ${semanticColor.core.border.neutral.default}`,
borderRadius: 4,boxShadow — boxShadow.low, boxShadow.mid, boxShadow.high.
font — Always use font tokens instead of hardcoded values for weight, size, and line-height.
font.body.weight.regular, font.body.weight.boldfont.body.size.medium, font.heading.size.large, etc.font.body.lineHeight.medium, etc.// ✅ correct
fontWeight: font.body.weight.bold,
// ❌ avoid
fontWeight: "700",
fontWeight: 700,breakpoint — media query breakpoints for responsive layouts.
import {breakpoint} from "@khanacademy/wonder-blocks-tokens";
const styles = StyleSheet.create({
[breakpoint.mediaQuery.sm]: {
flexDirection: "column",
},
});Use Heading and BodyText components from @khanacademy/wonder-blocks-typography. Use the tag prop to make sure it is using the correct semantics. Heading defaults to h2 and BodyText defaults to p.
Use heading sizes to establish visual hierarchy — a page title should be visually larger than a section heading, which should be larger than a subsection heading. Match the size prop to the heading's place in the hierarchy, not just its semantic level. The tag prop can create an accessible heading hierarchy in order regardless of style.
import {Heading, BodyText} from "@khanacademy/wonder-blocks-typography";
// Page title — largest
<Heading size="large" tag="h1">Settings</Heading>
// Section heading — smaller than page title
<Heading size="medium" tag="h2">Account</Heading>
// Subsection — smaller still
<Heading size="small" tag="h3">Profile</Heading>
<BodyText>Description text</BodyText>
<BodyText size="small" tag="span">Inline note</BodyText>WB uses Phosphor icons. Import icon assets from @phosphor-icons/core and use
with the WB PhosphorIcon from @khanacademy/wonder-blocks-icon.
import {PhosphorIcon} from "@khanacademy/wonder-blocks-icon";
// Import specific icon assets from @phosphor-icons/core
import magnifyingGlassIcon from "@phosphor-icons/core/regular/magnifying-glass.svg";
<PhosphorIcon icon={magnifyingGlassIcon} size="medium" />
For custom svg icons or specific icon components from the @khanacademy/wonder-blocks-icon
package like GemIcon or StreakIcon, use the Icon component.
import {Icon, GemIcon} from "@khanacademy/wonder-blocks-icon";
import ExampleIcon from "icon.svg";
<Icon size="medium"><GemIcon /></Icon>
<Icon size="medium"><ExampleIcon /></Icon>Use View from @khanacademy/wonder-blocks-core instead of plain div for flex containers.
View renders display: flex; flex-direction: column by default.tag prop for semantic HTML: <View tag="main">, <View tag="section">, <View tag="nav">, <View tag="ul">, etc.import {View} from "@khanacademy/wonder-blocks-core";
<View style={styles.container}>
<View tag="header" style={styles.header}>...</View>
<View tag="main">...</View>
</View>For bordered content sections (summaries, form panels, info boxes), use Card from wonder-blocks-card instead of recreating the pattern with a custom View + border + padding styles.
import {Card} from "@khanacademy/wonder-blocks-card";
<Card>...</Card>margin, padding or gap are acceptable.aria-label to IconButton and any Clickable with non-text content.htmlFor/id and aria-describedby automatically.ModalLauncher and DrawerLauncher handles focus trapping and restoration automatically.tag prop when needed to ensure correct semantics. Check the default and allowed tags for a component first.focusStyles.focus styles from @khanacademy/wonder-blocks-styles for :focus-visible styles.animated
prop so consumers can pass in the user's reduced motion preference.sizing tokens (rem-based) for spacing that should scale correctly with browser zoom.maxInlineSize, percentages, or flex-based sizing so content reflows at smaller screen widths.breakpoint.mediaQuery tokens to adapt layouts at smaller screen sizes (e.g., switching from row to column). Tables are an exception and may scroll horizontally when their content requires it.Always use logical CSS properties in StyleSheet.create to support RTL languages. This is enforced by ESLint — using physical properties will cause lint errors.
| Physical (avoid) | Logical (use) |
|---|---|
marginLeft / marginRight | marginInlineStart / marginInlineEnd |
paddingLeft / paddingRight | paddingInlineStart / paddingInlineEnd |
marginTop / marginBottom | marginBlockStart / marginBlockEnd |
paddingTop / paddingBottom | paddingBlockStart / paddingBlockEnd |
borderTop / borderBottom | borderBlockStart / borderBlockEnd |
borderLeft / borderRight | borderInlineStart / borderInlineEnd |
maxWidth / minWidth | maxInlineSize / minInlineSize |
maxHeight / minHeight | maxBlockSize / minBlockSize |
width / height (when directional) | inlineSize / blockSize |
Components with built-in labels should accept a labels prop so consumers
can pass in translated strings.
./references/forms.md© Khan, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/wonder-blocks of Khan/wonder-blocks.
Open the folder on GitHubat commit 04b6068
Wonder Blocks next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Wonder Blocks this skillKhan/wonder-blocks | 163 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Connect Component To Figmadequelabs/cauldron | 129 | — | ~2k | Automated safety check: Pass | MPL-2.0 | |
| DaleuiDaleStudy/daleui | 119 | — | ~675 | Automated safety check: Pass | MIT | |
| Animated React Component LibrariesHainrixz/editor-pro-max | 264 | 1 repos | ~5.7k | Automated safety check: Pass | Custom licence | |
| Fast Typescript Checkinternet-development/www-sacred | 1.6k | — | ~4.3k | Automated safety check: Pass | MIT | |
| React Render Types CompositionHorusGoul/eslint-plugin-react-render-types | 111 | — | ~1.1k | Automated safety check: Pass | MIT |
dequelabs/cauldron
Add a Figma Code Connect (.figma.tsx) file for a Cauldron React component.
DaleStudy/daleui
Use the daleui React design system with semantic Panda CSS tokens and accessible components.
Hainrixz/editor-pro-max
Helps choose and drop in animated React components from Magic UI and React Bits for landing pages, marketing sites and dashboards, instead of hand-coding animations.
internet-development/www-sacred
Keep www-sacred's TypeScript fast to type-check and fast to run.
HorusGoul/eslint-plugin-react-render-types
Composition patterns for building React components with @renders type annotations from eslint-plugin-react-render-types.
awdr74100/figwright
Build a Figma design from code or a description — the reverse of figma-codegen.
Khan/wonder-blocks
Storybook best practices for Wonder Blocks component stories.
Khan/wonder-blocks
Jest + React Testing Library best practices for Wonder Blocks unit tests.
Categories
Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library. Wonder Blocks is an agent skill from Khan/wonder-blocks. Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library.
Wonder Blocks fits situations like: the user asks you to build; review UI components; map WB tokens for colors/spacing/typography (including translating Figma designs to WB components and tokens); asks how to do something the Wonder Blocks way.
Run `npx skills add Khan/wonder-blocks --skill wonder-blocks -a claude-code`. Or copy the skill folder (.agents/skills/wonder-blocks in Khan/wonder-blocks) into .claude/skills/wonder-blocks in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Khan/wonder-blocks --skill wonder-blocks -a codex`. Or copy the skill folder (.agents/skills/wonder-blocks in Khan/wonder-blocks) into .agents/skills/wonder-blocks in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Khan/wonder-blocks --skill wonder-blocks -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/wonder-blocks, .gemini/skills/wonder-blocks, .github/skills/wonder-blocks and .opencode/skills/wonder-blocks in your project.
SKILL.md names no scripts, command-line tools or credentials: Wonder Blocks is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Wonder Blocks is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Wonder Blocks: Connect Component To Figma (dequelabs/cauldron, 129 stars), Daleui (DaleStudy/daleui, 119 stars), Animated React Component Libraries (Hainrixz/editor-pro-max, 264 stars) and Fast Typescript Check (internet-development/www-sacred, 1.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Khan (a GitHub organization) maintains it in Khan/wonder-blocks, which has 163 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 8, 2026.
Source: Khan/wonder-blocks on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.