Write Stories
Endava/BEEQ
Write Storybook stories and MDX docs for BEEQ web components.
Write or update Storybook stories and docs MDX for a Radix NG primitive following project conventions.
$ npx skills add radix-ng/primitives --skill storybook-story -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install radix-ng/primitives storybook-story --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/radix-ng/primitives.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/storybook-story .claude/skills/storybook-story && 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 "storybook-story" agent skill from https://github.com/radix-ng/primitives/tree/main/.claude/skills/storybook-story into .claude/skills/storybook-story/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "storybook-story", 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/radix-ng/primitives/tree/main/.claude/skills/storybook-storyType 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 radix-ng/primitives --skill storybook-story -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install radix-ng/primitives storybook-story --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/radix-ng/primitives.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/storybook-story .agents/skills/storybook-story && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "storybook-story" agent skill from https://github.com/radix-ng/primitives/tree/main/.claude/skills/storybook-story into .agents/skills/storybook-story/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "storybook-story", 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 radix-ng/primitives --skill storybook-story -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install radix-ng/primitives storybook-story --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/radix-ng/primitives.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/storybook-story .cursor/skills/storybook-story && 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 "storybook-story" agent skill from https://github.com/radix-ng/primitives/tree/main/.claude/skills/storybook-story into .cursor/skills/storybook-story/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "storybook-story", 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/radix-ng/primitives.git --path .claude/skills/storybook-story--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 radix-ng/primitives --skill storybook-story -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install radix-ng/primitives storybook-story --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/radix-ng/primitives.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/storybook-story .gemini/skills/storybook-story && 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 "storybook-story" agent skill from https://github.com/radix-ng/primitives/tree/main/.claude/skills/storybook-story into .gemini/skills/storybook-story/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "storybook-story", 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 radix-ng/primitives storybook-storyInstalls 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 radix-ng/primitives --skill storybook-story -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/radix-ng/primitives.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/storybook-story .github/skills/storybook-story && 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 "storybook-story" agent skill from https://github.com/radix-ng/primitives/tree/main/.claude/skills/storybook-story into .github/skills/storybook-story/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "storybook-story", 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 radix-ng/primitives --skill storybook-story -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install radix-ng/primitives storybook-story --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/radix-ng/primitives.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/storybook-story .opencode/skills/storybook-story && 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 "storybook-story" agent skill from https://github.com/radix-ng/primitives/tree/main/.claude/skills/storybook-story into .opencode/skills/storybook-story/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "storybook-story", 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.
storybook-storyWrite or update Storybook stories and docs MDX for a Radix NG primitive following project conventions.
Storybook Story is an agent skill from radix-ng/primitives. Write or update Storybook stories and docs MDX for a Radix NG primitive following project conventions. Use when: writing stories, updating docs, adding a new story, updating MDX, "обнови сторис", "напиши доки для", "update stories", "add story". Enforces: one-file-per-component rule, ?raw source imports, tailwindDemoDecorator, semantic tokens, docs MDX template.
Its SKILL.md is about 3.7k 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 Markdown and Design systems. It works with Storybook. The repository describes itself as: Headless, signals-first UI primitives for Angular. Accessible. Customizable. The licence is MIT.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit eed2a31. 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.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
w3.orgFrom 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.
Storybook Story loads about 3.7k tokens when it runs. Until then it costs about 96 tokens; SKILL.md has 1,506 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 radix-ng/primitives at commit eed2a31, republished under its MIT licence (© radix-ng). 1,506 words, ~3,670 tokens.
.claude/skills/storybook-story/SKILL.md (or your agent's skills folder).Any story embedded via <Canvas of={X}> must be a standalone component — props do not survive a Canvas embed.
The exception is the primary Default story, which may be a small inline template using
props + args, provided it is surfaced in the MDX via <Primary /> / <Controls /> (never
<Canvas of={Default}>). This matches the button and checkbox references.
// ✅ Default — small inline template with props/args, shown via <Primary/> in MDX
export const Default: Story = {
args: { disabled: false },
render: (args) => ({
props: { ...args, b: demoButton },
template: html`
<button rdxButton ${argsToTemplate(args)} [class]="b.base">Button</button>
`
})
};
// ✅ Named example — standalone component, safe to embed via <Canvas of={X}>
export const Variants: Story = {
parameters: source(variantsSource),
render: () => ({
template: html`
<button-variants-example />
`
})
};
// ❌ wrong — a props-based story embedded via <Canvas of={WithScroll}> renders blank
export const WithScroll: Story = {
render: () => ({ props: { r: demoRadio }, template: `<div [class]="r.group">...` })
};In the MDX: surface Default with <Primary /> (+ <Controls />) and add of={Stories} to
<Meta>; embed every other example with <Canvas of={Stories.X} />.
One component → one file. Every standalone story component gets its own file:
stories/select-default.ts, stories/select-with-scroll.ts, etc.
Never put multiple story components in a single stories/<name>.ts.
Reason:
?rawimports the entire file, so a shared file shows all source for every story.
?raw import per story file. In <name>.stories.ts:
import defaultSource from './select-default?raw';
export const Default: Story = {
parameters: source(defaultSource),
render: () => ({
template: html`
<select-default />
`
})
};Each story export gets parameters: source(itsOwnFile?raw).
tailwindDemoDecorator() is required in decorators. No styleUrl, no inline <style>.
Semantic tokens only in templates: bg-background, text-foreground, bg-muted, bg-popover, border-border, text-muted-foreground, text-primary-foreground. No raw colors (violet, mauve, white, black).
Shared style constants from packages/primitives/storybook/styles.ts (cn, demoButton, demoMenu, etc.). Extend styles.ts when a pattern recurs — don't inline long class strings.
Story order: Default first, then state variants, then advanced examples.
Wrapper component from packages/primitives/storybook/tailwind-demo.ts. It marks the root with data-demo="tailwind".
<Meta title="Primitives/Name" of={Stories} /> {/* `of=` is required for <Primary>/<Controls> */}
# Name
#### One-line summary.
<Primary /> {/* renders the inline Default story; do NOT use <Canvas of={Default}> */}
<Controls /> {/* args table for the Default story */}
## Features (✅ bullets)
## Import (code block)
## Anatomy (HTML block showing all parts)
## Examples (### Title + one-line desc + <Canvas of={Stories.X} /> per example)
## Data attributes (optional table, if the primitive exposes data-* state separately)
## API Reference (### per part → "Renders a `<x>` element" note + <ArgTypes> + Data attributes / CSS variables tables; see "API Reference — Base UI parity")
## Accessibility (native-first lead sentence + a standards-mapping table + a ### Keyboard Interactions table; goes LAST — see rules below)Default with <Primary /> (+ <Controls />), not <Canvas of={Default}> — see checklist item 1. A simple primitive may instead use <Canvas sourceState="hidden" of={Stories.SomeStandaloneStory} /> as the hero (e.g. Button uses Variants).<Canvas> without a preceding ### Title description.### subheadings under the ## API Reference ## — never repeat ## for each directive (that makes them siblings of API Reference, not children).<ArgTypes> tables. Parts with no inputs → one-line prose note instead.Primary, Controls) → * as Stories → individual directive classes for ArgTypes.Mirror the matching Base UI component so our API Reference reads the same. Pull the per-part contract
(rendered element, props, data-*, CSS vars, change-event reasons) from the authoritative source: the
Base UI checkout's docs/src/app/(docs)/react/components/<name>/types.md (autogenerated; falls back to
its packages/react/src/<name>/**/*DataAttributes.ts / *CssVars.ts enums) — not from your own memory or
the website. The checkout's local path is in personal memory (reference-base-ui-contract); don't hardcode
it here. Each ### part subsection, in this order:
`RdxFooPanelDirective` — what the part does. End with the
host element. These are attribute-directives, not React components — they do not render an element,
the consumer supplies it. Write "Apply to a <x> element", never Base UI's "Renders a <x>". Use the
tag shown in Anatomy: a container part → "Apply to a container element (typically a <div>)"; a part
that needs native button semantics → "Apply to a native <button> element". Only say a specific tag is
required when the selector enforces it (e.g. button[rdxFoo]) — otherwise it's the recommended host.
Add behavior/a11y prose (exposed aria-*, context-only parts) on the next line.<ArgTypes of={Directive} /> — only for parts with inputs/outputs (no empty tables; context-only
parts get prose instead, see above).**Data attributes** bold label, not a heading), when the part sets any
data-*. Shape: | Attribute | Present when |, one data-* per row in backticks, descriptions end
with a period. Mirror Base UI's wording where it maps cleanly.**CSS variables** bold label), when the part sets any --* custom property.
Shape: | Variable | Description |.data-* / --* in source — never invent. Read the part's host: {} bindings (and any
style.--* / setProperty); list exactly what's there. This is the same "trace it to a real handler"
rule as Keyboard Interactions. Internal inline-style manipulation (temporary node.style.height = 'auto'
for measuring, toggling transitionDuration/animationName) is not a public CSS variable — only
list --* properties actually bound on the host.@Directive({ selector }): a tag-qualified selector (button[rdxFoo])
→ that tag is required; a plain attribute selector ([rdxFoo]) → use the tag shown in that primitive's
Anatomy block as the recommended host. Do not copy Collapsible's tags (<button>/<div>) onto another
primitive by analogy — verify per part.###) over a
single top-level ## Data attributes section. Drop the global section once a primitive uses per-part tables.#### …) matches Base UI's one-liner where one exists (e.g. Collapsible → "A collapsible
panel controlled by a button.").packages/primitives/collapsible/stories/collapsible.docs.mdx.*.docs.mdx, run pnpm skills:build to regenerate the LLM bundle (CI-verified).The ## Accessibility section has three parts, in this order: a native-first lead sentence, a
standards-mapping table, then the ### Keyboard Interactions subsection. It is the last
section on the page, after ## API Reference. The library-wide philosophy lives once on the
Overview/Accessibility page (source hierarchy Native HTML → WAI-ARIA → APG → WCAG 2.2 + the honest
"designed against / tested for" disclaimer); per-primitive sections link back to it, they don't
restate the manifesto.
| Area | Implementation | Reference |, rows in this order where they
apply: Semantics (roles, aria-modal, labelling), Keyboard (one-line summary), Focus
(initial focus, trap, restore), State (aria-controls / aria-expanded / data-*). The
Reference column links the concrete APG sub-section and the specific WCAG 2.2 success criteria
(e.g. [WCAG 4.1.2](https://www.w3.org/TR/WCAG22/#name-role-value) for name/role/value,
2.1.1 keyboard, 2.1.2 no-keyboard-trap, 2.4.3 focus-order). Ground every row in source — the
same "trace it to a real handler / real binding" rule as Keyboard Interactions and data-*. Never
list an Area you can't point to in code + a test.## Accessibility holds the ### Keyboard Interactions subsection (Title
Case, level 3). Never a standalone ## Keyboard interactions heading. If ## Accessibility already
exists, add subsections inside it — never a second Accessibility section.| Key | Description |. One key (or key combo) per row. Descriptions are concise and
end with a period. (Prettier aligns the pipes — don't hand-pad.)ArrowUp / ArrowDown / ArrowLeft /
ArrowRight (no space, not "Arrow Up"). Join alternatives with / (e.g. Enter / Space); join
chords with + (e.g. Shift + Tab). Use a Character keys row for typeahead. Function keys like
F8 also go in backticks.(keydown.*) host listener, useArrowNavigation/composite roving navigation, a native <button>
trigger (Space/Enter activation counts), or a composed layer (dismissable-layer → Escape;
focus-scope → Tab / Shift + Tab). If a primitive has no keyboard handling at all (purely
pointer-driven, e.g. Toast), omit the section rather than fabricate one.RdxDismissableLayer, RdxEscapeKeyDown, "composite group") in the table.packages/primitives/dialog/stories/dialog.docs.mdx) is
the canonical full Accessibility section — native-first lead, standards-mapping table, Keyboard
Interactions. Also: Tabs, Menu (rich nav + typeahead), Time/Date Field (segmented input),
Switch / Toggle (minimal Space/Enter).Tag the specs that verify an accessibility behavior so the test name cites the standard it backs — this makes the suite a self-documenting traceability matrix for the Accessibility-table rows.
it(...) title with [APG <Pattern>] and/or [WCAG <x.y.z>], then the normal description:
it('[APG Dialog][WCAG 4.1.2] links the trigger and popup with accessible ids and roles', …),
it('[WCAG 2.1.2] lets Tab leave a non-modal focus scope', …). One bracket per standard, APG before
WCAG, no lowercasing ([APG Dialog], not [apg]).// APG keyboard convention: Tab leaves the composite; arrows move within it.) — don't sprinkle
citations on obvious bindings. Reference: packages/primitives/dialog/__tests__/dialog.spec.ts.The docs "On this page" TOC is built by tocbot from h2, h3 in .sbdocs-content. Storybook's default
toc.ignoreSelector is .docs-story *, which keeps headings rendered inside story previews out of
the TOC. This repo sets it in apps/radix-storybook/.storybook/preview.ts as '#primary, .docs-story *'
— keep .docs-story *. Dropping it makes demos that render real heading elements (e.g. Accordion's
<h3 rdxAccordionHeader>) leak their text into the TOC. Prefer real semantic headings in demos where the
ARIA pattern calls for them; rely on the ignore selector rather than downgrading to <div>.
| File | Purpose |
|---|---|
stories/<name>-<variant>.ts | One per story component |
stories/<name>.stories.ts | CSF with imports + story exports |
stories/<name>.docs.mdx | Docs page following template above |
packages/primitives/button/ — simplest complete examplepackages/primitives/menu/stories/ — multiple standalone files + full MDXpackages/primitives/checkbox/stories/ — form variants, multiple files© radix-ng, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/storybook-story of radix-ng/primitives.
Open the folder on GitHubat commit eed2a31
Storybook Story 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 |
|---|---|---|---|---|---|---|
| Storybook Story this skillradix-ng/primitives | 274 | — | ~3.7k | Automated safety check: Pass | MIT | |
| Write StoriesEndava/BEEQ | 163 | — | ~968 | Automated safety check: Pass | Apache-2.0 | |
| Lobe Designlobehub/lobe-ui | 2.2k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Using Docs Kitlobehub/lobe-ui | 2.2k | — | ~2.8k | Automated safety check: Pass | MIT | |
| Run Umbraco UIumbraco/Umbraco.UI | 152 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Wonder BlocksKhan/wonder-blocks | 163 | — | ~3.2k | Automated safety check: Pass | MIT |
Endava/BEEQ
Write Storybook stories and MDX docs for BEEQ web components.
lobehub/lobe-ui
Build UI with the LobeHub design system — @lobehub/ui/base-ui, the controlled form at @lobehub/ui/base-ui/form, and the chat, mobile, dashboard, awesome, brand, mdx, and i18n namespaces, plus…
lobehub/lobe-ui
Set up and author a documentation site with @lobehub/docs-kit (the lobedocs CLI, React Router + Vite static docs used by ui.lobehub.com).
umbraco/Umbraco.UI
Build, run, and drive the Umbraco.UI (UUI) web-component library via its Storybook.
Khan/wonder-blocks
Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library.
DaleStudy/daleui
Use the daleui React design system with semantic Panda CSS tokens and accessible components.
radix-ng/primitives
Build correct, accessible UI with @radix-ng/primitives — the signals-first, headless Angular primitive library.
radix-ng/primitives
Index of every documented @radix-ng/primitives example. An agent skill from radix-ng/primitives.
radix-ng/primitives
A skill your agent uses when you need information about this project's architecture, tech stack, coding patterns, data model, deployment setup, git workflow, or UX guidelines.
radix-ng/primitives
Test Radix NG primitives across every layer and pick the RIGHT one for a change: Vitest unit (zoneless), jest-axe a11y, Playwright browser regression (apps/visual-regression), SSR…
radix-ng/primitives
Maintain project documentation in .claude/skills/project-knowledge/: audit, edit, check consistency, track status.
radix-ng/primitives
Angular framework reference for building this signals-first, headless directive library.
Works with
Categories
Write or update Storybook stories and docs MDX for a Radix NG primitive following project conventions. Storybook Story is an agent skill from radix-ng/primitives. Write or update Storybook stories and docs MDX for a Radix NG primitive following project conventions.
Storybook Story fits situations like: : writing stories; adding a new story; Напиши доки для.
Run `npx skills add radix-ng/primitives --skill storybook-story -a claude-code`. Or copy the skill folder (.claude/skills/storybook-story in radix-ng/primitives) into .claude/skills/storybook-story in your project. Claude Code loads it when a task matches its description.
Run `npx skills add radix-ng/primitives --skill storybook-story -a codex`. Or copy the skill folder (.claude/skills/storybook-story in radix-ng/primitives) into .agents/skills/storybook-story 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 radix-ng/primitives --skill storybook-story -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-story, .gemini/skills/storybook-story, .github/skills/storybook-story and .opencode/skills/storybook-story in your project.
Going by SKILL.md and its folder, Storybook Story needs the command-line tools its instructions call (pnpm).
SKILL.md names 1 domain. In commands or code: w3.org; the agent is likely to contact it when it follows the instructions. 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.
Storybook Story 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.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Storybook Story: Write Stories (Endava/BEEQ, 163 stars), Lobe Design (lobehub/lobe-ui, 2.2k stars), Using Docs Kit (lobehub/lobe-ui, 2.2k stars) and Run Umbraco UI (umbraco/Umbraco.UI, 152 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
radix-ng (a GitHub organization) maintains it in radix-ng/primitives, which has 274 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on September 28, 2026.
Source: radix-ng/primitives on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.