Agent skill

Storybook

by Khan in Khan/wonder-blocks

Storybook best practices for Wonder Blocks component stories.

MITAuto-check passedFrontend & Design

Install Storybook

skills CLI
$ npx skills add Khan/wonder-blocks --skill storybook -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Khan/wonder-blocks storybook --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Khan/wonder-blocks.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/storybook .claude/skills/storybook && rm -rf skills-src

Use ~/.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/

Facts

Skill name
storybook
GitHub stars
163
Token cost
~4.2k tokens
SKILL.md length
1,028 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

Storybook best practices for Wonder Blocks component stories.

  • Works in 12 steps: ✅ Structure: Follow consistent import… → ✅ Types: Use TypeScript types for story… → ✅ Documentation: Include comprehensive… → …
  • Editing .stories.tsx / .stories.ts files
  • SKILL.md covers TypeScript Types, Default Export Configuration, Story Patterns and JSDoc Documentation, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Storybook is an agent skill from Khan/wonder-blocks. Storybook best practices for Wonder Blocks component stories. Use when creating or editing .stories.tsx / .stories.ts files.

Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Frontend & Design, covering React components and Design systems. It works with Storybook and React. The repository describes itself as: React components for Wonder Blocks design system. The licence is MIT.

When your agent uses it

  • Editing .stories.tsx / .stories.ts files
  • Tasks that involve React components
  • Tasks that involve Design systems

Example prompts

  • “/storybook”

Workflow steps

12 steps, taken from the first numbered list in SKILL.md.

  1. ✅ Structure: Follow consistent import order and file organization
  2. ✅ Types: Use TypeScript types for story definitions
  3. ✅ Documentation: Include comprehensive JSDoc comments with usage examples
  4. ✅ Variants: Show all important component variants
  5. ✅ Accessibility: Test and document a11y considerations
  6. ✅ Visual Testing: Configure Chromatic appropriately
  7. ✅ State Management: Use proper patterns for stateful stories
  8. ✅ Naming: Use clear, descriptive names for stories
  9. ✅ Tokens: Use Wonder Blocks tokens instead of hard-coded values
  10. ✅ Testing: Separate documentation, snapshot, interaction, and playtesting stories
  11. ✅ Interaction Tests: Use play functions for browser-specific behavior that jsdom can't handle
  12. ✅ Playtesting: Create manual testing stories for behaviors difficult to automate

What it can do on your machine

Read from SKILL.md and the folder at commit 04b6068. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    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.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Storybook loads about 4.2k tokens when it runs. Until then it costs about 35 tokens; SKILL.md has 1,028 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~35
When it runs · the whole SKILL.md, loaded when a task matches
~4.2k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from Khan/wonder-blocks at commit 04b6068, republished under its MIT licence (© Khan). 1,028 words, ~4,202 tokens.

Download SKILL.mdSave it as .claude/skills/storybook/SKILL.md (or your agent's skills folder).
name
storybook
description
Storybook best practices for Wonder Blocks component stories. Use when creating or editing `.stories.tsx` / `.stories.ts` files.

Storybook Best Practices

This guide covers conventions and best practices for creating Storybook stories (.stories.tsx or .stories.ts) in the Wonder Blocks design system.

TypeScript Types

✅ Define story types consistently (avoid any):

tsx
type StoryComponentType = StoryObj<typeof Component>;

export const Default: StoryComponentType = {
    args: {
        // props here
    },
};

Default Export Configuration

Meta Configuration

✅ Include all relevant meta properties:

tsx
export default {
    title: "Packages / ComponentName / SubComponent",
    component: ComponentName,
    subcomponents: {SubComponent1, SubComponent2}, // If applicable
    parameters: {
        componentSubtitle: (
            <ComponentInfo
                name={packageConfig.name}
                version={packageConfig.version}
            />
        ),
        chromatic: {
            disableSnapshot: false, // or true with reason
        },
    },
    argTypes: ComponentArgTypes,
    args: {
        // Default args for all stories
    },
    decorators: [
        // Optional decorators
    ],
} as Meta<typeof ComponentName>;

Key properties:

  • title: Hierarchical path in Storybook sidebar
  • component: The main component being documented
  • subcomponents: Related components shown in docs
  • parameters: Meta-level configuration (Chromatic, a11y, etc.)
  • argTypes: Control definitions (usually imported from separate file)
  • args: Default values applied to all stories
  • decorators: Layout wrappers applied to all stories
Title Naming Convention

✅ Follow the hierarchy (avoid flat titles like "Button Stories"):

tsx
title: "Packages / Button / Button"
title: "Packages / Dropdown / SingleSelect"
title: "Packages / Button / Testing / Snapshots / ActivityButton"

Story Patterns

General Tips for Stories

✅ Follow these best practices when writing stories:

  • The Default story should be interactive and work with the Storybook controls. Users should be able to modify props using the controls panel.
  • Write stories for all possible prop combinations/states. This is very helpful for identifying that all states are styled correctly and any changes can be confirmed in visual regression tests.
  • Disable Chromatic for stories that don't need visual regression tests (we have a limited number of Chromatic snapshots monthly). For example:
    • Stories already covered by another story
    • Stories for testing purposes only
    • Stories that don't have any visual differences from other stories
  • Avoid including specific background colors in Stories so that we can dynamically change the background in Storybook using the Storybook background control in the toolbar. Let users control the background through Storybook's built-in controls.
Basic Story Structure

✅ Export stories with descriptive JSDoc comments:

tsx
/**
 * This is the default state of the button showing standard usage.
 * It demonstrates the basic props and expected behavior.
 */
export const Default: StoryComponentType = {
    args: {
        children: "Click me",
        onClick: () => {},
    },
};
Interactive Stories with State

✅ Use render functions for stateful stories:

tsx
export const WithState: StoryComponentType = {
    render: function Render(args) {
        const [value, setValue] = React.useState(args.value || "");

        return (
            <Component
                {...args}
                value={value}
                onChange={setValue}
            />
        );
    },
    args: {
        // initial args
    },
};

⚠️ Important: Use function declarations, not arrow functions:

tsx
// ✅ Good - Named function for better debugging
render: function Render(args) {
    // ...
}

// ❌ Avoid - Arrow functions don't have clear names
render: (args) => {
    // ...
}
Variant Stories

✅ Show different variants in a single story:

tsx
/**
 * Buttons have three kinds: `primary` (default), `secondary`, and `tertiary`.
 */
export const Kinds: StoryComponentType = {
    render: () => (
        <View style={{gap: spacing.medium_16}}>
            <Button onClick={() => {}}>Primary</Button>
            <Button kind="secondary" onClick={() => {}}>Secondary</Button>
            <Button kind="tertiary" onClick={() => {}}>Tertiary</Button>
        </View>
    ),
};

JSDoc Documentation

Story Comments

✅ Include comprehensive JSDoc comments:

tsx
/**
 * This example demonstrates how SingleSelect behaves with an initial value.
 * The screen reader will not announce the initial value on mount, but will
 * announce when the value changes through user interaction.
 */
export const WithInitialValue: StoryComponentType = {
    // story configuration
};
Prop Documentation
  • The props table on the autodocs page for Storybook should be extracted from the JSDoc comments on the props for a component.
  • If the auto-generated type for a prop is not helpful (e.g., something generic like "union"), the type can be overridden in an argTypes.ts file.
  • Props in the table can be grouped into categories like Visual style, Events, Accessibility. Use the table.category property in argTypes to group props.
ArgTypes Files

When to use: Override auto-generated prop types when they're not helpful or need customization.

✅ Create an argTypes file for your component:

tsx
// __docs__/wonder-blocks-button/button.argtypes.ts
import type {ArgTypes} from "@storybook/react-vite";

export default {
    // Override type display for union types
    kind: {
        control: {type: "select"},
        options: ["primary", "secondary", "tertiary"],
        table: {
            category: "Visual style",
            type: {summary: `"primary" | "secondary" | "tertiary"`},
            defaultValue: {summary: `"primary"`},
        },
    },
    // Group related props
    size: {
        control: {type: "select"},
        table: {
            category: "Layout",
            type: {summary: `"medium" | "small" | "large"`},
        },
    },
    // Improve descriptions for complex props
    style: {
        table: {
            category: "Layout",
            type: {summary: "StyleType"},
        },
    },
} satisfies ArgTypes;

✅ Use argTypes in your story's meta:

tsx
import ComponentArgTypes from "./component.argtypes";

export default {
    title: "Packages / Component",
    component: Component,
    argTypes: ComponentArgTypes,
} as Meta<typeof Component>;

Common argTypes configurations:

PropertyPurpose
control.typeControl widget ("select", "boolean", "text", etc.)
optionsAvailable options for select controls
table.categoryGroup props in the docs table
table.type.summaryOverride the displayed type
table.defaultValue.summaryShow default value in docs
mappingMap control values to actual prop values
Examples in Stories
  • The stories should showcase the different ways a component can be used.
  • The comment block before a story declaration can be used to document more about a specific prop or behavior highlighted in the example.
Accessibility Guidelines Documentation
  • Document accessibility guidelines and what's been implemented in the component.
  • Create separate pages in Storybook to describe the accessibility for a component.
  • Examples of accessibility documentation pages:
    • Accordion Accessibility
    • Combobox Accessibility
    • TextArea Accessibility

Parameters Configuration

Chromatic Configuration

✅ Disable snapshots with clear reasoning:

tsx
export const Interactive: StoryComponentType = {
    render: () => {/* ... */},
    parameters: {
        chromatic: {
            // Disabling because this is for manual testing purposes
            disableSnapshot: true,
        },
    },
};

✅ Configure snapshot timing when needed:

tsx
export const ControlledOpened: StoryComponentType = {
    render: (args) => <Component {...args} />,
    parameters: {
        // Added to ensure that the dropdown menu is rendered using PopperJS.
        chromatic: {delay: 500},
    },
};

✅ Enable snapshots for important visual states:

tsx
export const WithIcon: StoryComponentType = {
    render: () => <IconExample />,
    parameters: {
        chromatic: {
            modes: allThemeModes, // Test in multiple themes
        },
    },
};
Theme Modes Configuration

Theme modes allow Chromatic to capture snapshots of components in multiple themes (e.g., default and Khanmigo/ThunderBlocks themes).

✅ Import and use allThemeModes for visual regression testing:

tsx
import {allThemeModes} from "../../.storybook/modes";

export default {
    title: "Packages / Component / Testing / Snapshots",
    parameters: {
        chromatic: {
            modes: allThemeModes, // Captures snapshots in all themes
        },
    },
    tags: ["!autodocs"],
} as Meta<typeof Component>;

⚠️ Use theme modes sparingly - Each mode multiplies the number of Chromatic snapshots. Only add theme modes to snapshot stories that specifically test theming or visual appearance.

Testing-Specific Stories

⚠️ Important: StateSheet and Scenarios stories are specifically designed for Chromatic visual regression testing. These stories systematically capture different states and edge cases to ensure visual consistency across code changes.

Show full SKILL.md (420 more words)Show less
Snapshot Stories

✅ Create dedicated snapshot stories:

tsx
/**
 * The following stories are used to generate the pseudo states for the
 * ActivityButton component. This is only used for visual testing in Chromatic.
 */
export default {
    title: "Packages / Button / Testing / Snapshots / ActivityButton",
    tags: ["!autodocs"], // Exclude from auto-generated docs
    parameters: {
        chromatic: {
            modes: allThemeModes,
        },
    },
} as Meta;

✅ Use StateSheet for pseudo-state testing (Chromatic visual regression):

tsx
const kinds = [
    {name: "Primary", props: {kind: "primary"}},
    {name: "Secondary", props: {kind: "secondary"}},
    {name: "Tertiary", props: {kind: "tertiary"}},
];

const actionTypes = [
    {name: "Progressive", props: {actionType: "progressive"}},
    {name: "Neutral", props: {actionType: "neutral"}},
    {name: "Disabled", props: {disabled: true}},
];

export const StateSheetStory: Story = {
    name: "StateSheet",
    render: (args) => (
        <StateSheet rows={kinds} columns={actionTypes} title="Kind / Action Type">
            {({props, className}) => (
                <Component {...args} {...props} className={className} />
            )}
        </StateSheet>
    ),
    parameters: {
        pseudo: defaultPseudoStates, // Includes focus, hover, active states
    },
};

⚠️ StateSheet stories should cover: focus (:focus-visible), hover, active, disabled states, and relevant prop combinations (kind, actionType, size, etc.)

Scenario Stories

✅ Test edge cases with ScenariosLayout (Chromatic visual regression):

tsx
export const Scenarios: Story = {
    render() {
        const scenarios = [
            {name: "Long label", props: {children: <Component>{longText}</Component>}},
            {name: "RTL", decorator: <div dir="rtl" />, props: {children: <Component>یہ اردو میں لکھا ہے۔</Component>}},
        ];
        return (
            <ScenariosLayout scenarios={scenarios}>
                {(props) => props.children}
            </ScenariosLayout>
        );
    },
};

⚠️ Scenario stories should include: RTL layouts (use decorator: <div dir="rtl" />), custom style overrides, and edge cases (long text, long text with no word break, overflow, truncation, empty states).

Playtesting Stories

✅ Create playtesting stories for testing of specific behaviors:

tsx
export default {
    title: "Packages / Component / Testing / Component - Playtesting",
    parameters: {
        chromatic: {disableSnapshot: true}, // For testing purposes only, snapshots are not needed
    },
} as Meta<typeof Component>;

/**
 * Describe the scenario and what to test manually.
 * Example: "When selecting a tab with Space/Enter, the page should not scroll."
 */
export const ScrollBehavior: Story = {
    render: (args) => (
        // Set up the scenario for manual testing
    ),
};

Good candidates for playtesting stories:

  • Scroll behavior that's difficult to assert programmatically
  • Complex keyboard interactions across multiple components
  • Browser-specific edge cases
  • Scenarios requiring visual confirmation by a human

⚠️ Playtesting stories should: disable Chromatic snapshots, include clear JSDoc comments explaining what to test, and use the Testing / Component - Playtesting title pattern.

Story Naming Conventions

✅ Use clear, descriptive names:

tsx
// ✅ Good - Clear and descriptive
export const Default: StoryComponentType = {/* ... */};
export const WithIcon: StoryComponentType = {/* ... */};
export const Disabled: StoryComponentType = {/* ... */};
export const LongOptionLabels: StoryComponentType = {/* ... */};
export const ErrorFromValidation: StoryComponentType = {/* ... */};

✅ Override story names when needed:

tsx
export const WithRouter: StoryComponentType = {
    name: "Navigation with React Router", // Overrides story name in UI
    render: () => {/* ... */},
};

✅ Do not duplicate the existing story name

Named exports should not use the name annotation if it is redundant to the name that would be generated by the export name.

Actions and Event Handlers

✅ Use storybook actions for event logging:

tsx
import {action} from "storybook/actions";

export const Default: StoryComponentType = {
    args: {
        onClick: action("clicked"),
        onChange: action("changed"),
    },
};

For stateful stories, combine actions with state updates: action("onChange")(newValue); setValue(newValue);

Interaction Tests for Browser-Specific Behavior

⚠️ Use Storybook interaction tests for behaviors that rely on real browser APIs not available in jsdom (scroll, layout/geometry, clipboard, complex focus management).

⚠️ Don't test styling in interaction tests - visual appearance is covered by Chromatic snapshot tests.

✅ Use the play function:

tsx
import {expect, within} from "storybook/test";

export const BrowserBehaviorTest: StoryComponentType = {
    render: (args) => (
        // Set up the DOM structure needed to test the behavior
    ),
    play: async ({canvasElement}) => {
        const canvas = within(canvasElement);

        // Interact with the component (if needed)

        // Assert things based on browser-specific behavior
        // (e.g., ResizeObserver, getBoundingClientRect, scrollIntoView)
    },
    parameters: {
        /** These stories are used for testing purposes only so we disable snapshots */
        chromatic: {disableSnapshot: true},
    },
};

⚠️ It's okay to have both: Unit tests with proper mocking work for browser behavior, but interaction tests provide additional confidence in a real browser. See .agents/skills/unit-tests/SKILL.md for mocking guidance.

Common Pitfalls to Avoid

  • ❌ Don't mix testing snapshots with documentation stories - Use title: "Packages / Button / Testing / Snapshots" with tags: ["!autodocs"] for snapshot stories
  • ❌ Don't forget to disable snapshots - Add chromatic: {disableSnapshot: true} for interaction tests and playtesting stories
  • ❌ Don't use React.FC - Use (props: Props) => instead

Best Practices Summary

  1. ✅ Structure: Follow consistent import order and file organization
  2. ✅ Types: Use TypeScript types for story definitions
  3. ✅ Documentation: Include comprehensive JSDoc comments with usage examples
  4. ✅ Variants: Show all important component variants
  5. ✅ Accessibility: Test and document a11y considerations
  6. ✅ Visual Testing: Configure Chromatic appropriately
  7. ✅ State Management: Use proper patterns for stateful stories
  8. ✅ Naming: Use clear, descriptive names for stories
  9. ✅ Tokens: Use Wonder Blocks tokens instead of hard-coded values
  10. ✅ Testing: Separate documentation, snapshot, interaction, and playtesting stories
  11. ✅ Interaction Tests: Use play functions for browser-specific behavior that jsdom can't handle
  12. ✅ Playtesting: Create manual testing stories for behaviors difficult to automate

© Khan, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/storybook of Khan/wonder-blocks.

Open the folder on GitHubat commit 04b6068

Compare with similar skills

Storybook 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.

Storybook compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Storybook this skillKhan/wonder-blocks163—~4.2kAutomated safety check: PassMIT
DaleuiDaleStudy/daleui119—~675Automated safety check: PassMIT
Creative Tim UI Blockscreativetimofficial/ui12k—~2.1kAutomated safety check: NotesMIT
Skillshare UI Website Stylerunkids/skillshare2.8k—~4.5kAutomated safety check: PassMIT
Animated React Component LibrariesHainrixz/editor-pro-max2641 repos~5.7kAutomated safety check: PassCustom licence
Fast Typescript Checkinternet-development/www-sacred1.6k—~4.3kAutomated safety check: PassMIT

Similar skills

  • Daleui

    DaleStudy/daleui

    Use the daleui React design system with semantic Panda CSS tokens and accessible components.

    119 GitHub stars~675 tokensUpdated 3 days ago
    Frontend & DesignAuto-check passed
  • Creative Tim UI Blocks

    creativetimofficial/ui

    Helps install, generate and review Creative Tim UI blocks: shadcn/ui-based React and Tailwind sections that follow a restrained, production-minded design philosophy.

    12k GitHub stars~2.1k tokensUpdated 7 mo ago
    Frontend & DesignAuto-check: notes
  • Skillshare UI Website Style

    runkids/skillshare

    Skillshare frontend design system for the React dashboard (ui/) and Docusaurus website (website/).

    2.8k GitHub stars~4.5k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Animated React Component Libraries

    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.

    264 GitHub starsUsed in 1 repo~5.7k tokens
    Frontend & DesignAuto-check passed
  • Fast Typescript Check

    internet-development/www-sacred

    Keep www-sacred's TypeScript fast to type-check and fast to run.

    1.6k GitHub stars~4.3k tokensUpdated 3 days ago
    Frontend & DesignAuto-check passed
  • React To Solid

    carere/zaidan

    React-to-SolidJS transformation patterns for porting shadcn-style React components, examples, docs snippets, and blocks into Zaidan.

    147 GitHub starsUsed in 1 repo~1.6k tokens
    Frontend & DesignAuto-check passed

More from Khan/wonder-blocks

  • Wonder Blocks

    Khan/wonder-blocks

    Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library.

    163 GitHub stars~3.2k tokensUpdated yesterday
    Auto-check passed
  • Unit Tests

    Khan/wonder-blocks

    Jest + React Testing Library best practices for Wonder Blocks unit tests.

    163 GitHub stars~4.2k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Storybook

What does Storybook do?

Storybook best practices for Wonder Blocks component stories. Storybook is an agent skill from Khan/wonder-blocks. Storybook best practices for Wonder Blocks component stories.

When should I use Storybook?

Storybook fits situations like: editing .stories.tsx / .stories.ts files; tasks that involve React components; tasks that involve Design systems.

How do I install Storybook in Claude Code?

Run `npx skills add Khan/wonder-blocks --skill storybook -a claude-code`. Or copy the skill folder (.agents/skills/storybook in Khan/wonder-blocks) into .claude/skills/storybook in your project. Claude Code loads it when a task matches its description.

How do I install Storybook in Codex?

Run `npx skills add Khan/wonder-blocks --skill storybook -a codex`. Or copy the skill folder (.agents/skills/storybook in Khan/wonder-blocks) into .agents/skills/storybook in your project. Codex loads it when a task matches its description.

Can I use Storybook in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Khan/wonder-blocks --skill storybook -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/storybook, .gemini/skills/storybook, .github/skills/storybook and .opencode/skills/storybook in your project.

What does Storybook need to run?

SKILL.md names no scripts, command-line tools or credentials: Storybook is instructions for the agent only.

Does Storybook access the network?

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.

Is Storybook safe to install?

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.

What licence does Storybook use?

Storybook is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Storybook use?

About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Storybook?

Skills that share tags, products or a category with Storybook: Daleui (DaleStudy/daleui, 119 stars), Creative Tim UI Blocks (creativetimofficial/ui, 12k stars), Skillshare UI Website Style (runkids/skillshare, 2.8k stars) and Animated React Component Libraries (Hainrixz/editor-pro-max, 264 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Storybook?

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 9, 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.