Storybook Story
radix-ng/primitives
Write or update Storybook stories and docs MDX for a Radix NG primitive following project conventions.
A skill your agent uses when writing or generating Storybook documentation for a Baloise Design System component — creates stories.ts, doc-config.ts, and six MDX subpages (Overview, Usage, Variants…
$ npx skills add baloise/design-system --skill ds-document-component -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install baloise/design-system ds-document-component --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/baloise/design-system.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/ds-document-component .claude/skills/ds-document-component && 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 "ds-document-component" agent skill from https://github.com/baloise/design-system/tree/next/.claude/skills/ds-document-component into .claude/skills/ds-document-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ds-document-component", 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/baloise/design-system/tree/next/.claude/skills/ds-document-componentType 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 baloise/design-system --skill ds-document-component -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install baloise/design-system ds-document-component --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/baloise/design-system.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/ds-document-component .agents/skills/ds-document-component && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ds-document-component" agent skill from https://github.com/baloise/design-system/tree/next/.claude/skills/ds-document-component into .agents/skills/ds-document-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ds-document-component", 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 baloise/design-system --skill ds-document-component -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install baloise/design-system ds-document-component --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/baloise/design-system.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/ds-document-component .cursor/skills/ds-document-component && 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 "ds-document-component" agent skill from https://github.com/baloise/design-system/tree/next/.claude/skills/ds-document-component into .cursor/skills/ds-document-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ds-document-component", 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/baloise/design-system.git --path .claude/skills/ds-document-component--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 baloise/design-system --skill ds-document-component -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install baloise/design-system ds-document-component --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/baloise/design-system.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/ds-document-component .gemini/skills/ds-document-component && 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 "ds-document-component" agent skill from https://github.com/baloise/design-system/tree/next/.claude/skills/ds-document-component into .gemini/skills/ds-document-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ds-document-component", 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 baloise/design-system ds-document-componentInstalls 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 baloise/design-system --skill ds-document-component -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/baloise/design-system.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/ds-document-component .github/skills/ds-document-component && 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 "ds-document-component" agent skill from https://github.com/baloise/design-system/tree/next/.claude/skills/ds-document-component into .github/skills/ds-document-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ds-document-component", 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 baloise/design-system --skill ds-document-component -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install baloise/design-system ds-document-component --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/baloise/design-system.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/ds-document-component .opencode/skills/ds-document-component && 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 "ds-document-component" agent skill from https://github.com/baloise/design-system/tree/next/.claude/skills/ds-document-component into .opencode/skills/ds-document-component/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ds-document-component", 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.
ds-document-componentA skill your agent uses when writing or generating Storybook documentation for a Baloise Design System component — creates stories.ts, doc-config.ts, and six MDX subpages (Overview, Usage, Variants…
Ds Document Component is an agent skill from baloise/design-system. Use when writing or generating Storybook documentation for a Baloise Design System component — creates stories.ts, doc-config.ts, and six MDX subpages (Overview, Usage, Variants, Styling, Accessibility, Testing) using reusable Storybook blocks (ComponentLead, ComponentPublicMethods, ComponentParts, CanvasTabs, ComponentPageObject) for dynamic data binding to components.json
Its SKILL.md is about 6.3k 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, Accessibility and Design systems. It works with Storybook. The repository describes itself as: The Baloise Design System consists of reusable components and a clearly defined visual style, that can be assembled together to build any number of applications. The licence is Apache-2.0.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 19063c5. 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.
Ds Document Component loads about 6.3k tokens when it runs. Until then it costs about 100 tokens; SKILL.md has 1,070 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 baloise/design-system at commit 19063c5, republished under its Apache-2.0 licence (© baloise). 1,070 words, ~6,347 tokens.
.claude/skills/ds-document-component/SKILL.md (or your agent's skills folder).Generates a complete documentation set for a component in apps/storybook/src/components/<category>/<component>/ (mirroring the component's category folder in packages/core/src/components/; see apps/storybook/CONTEXT.md for the taxonomy). The canonical reference for structure and style is the tag component (apps/storybook/src/components/indicators/tag/).
Each component gets exactly six MDX files plus two TypeScript support files:
| File | Purpose |
|---|---|
1-Overview.mdx | Canvas (type-dependent) + Controls + ComponentLead + ComponentPublicMethods |
2-Usage.mdx | When to use, do's/don'ts, UsageExamples |
3-Variants.mdx | All story variants with Canvas (type-dependent) |
4-Styling.mdx | ComponentParts + ComponentCssVariables + ComponentDesignTokens |
5-Accessibility.mdx | WCAG guidelines via A11yGuidelines |
6-Testing.mdx | ComponentPageObject — PO API table + example test + install guide |
<component>.stories.ts | Stencil story exports — both 🧩 (web component) and 🌍 (HTML/CSS) pairs |
<component>.doc-config.ts | Shared section/color/tabs config |
Do NOT create api.md (auto-generated by Stencil), .parts.svg, or any other files.
Components/<Category>/<ComponentName>/..., where <Category> matches the component's folder in packages/core/src/components/<category>/ (see apps/storybook/CONTEXT.md).purple for all components.<CanvasWithCodePen of={Stories.Basic} sourceState="shown" /> — shows CodePen embed without HTML tab<CanvasTabs htmlOf={Stories.BasicHtml} of={Stories.Basic} /> — shows both web component and HTML/CSS tabs🧩 Name (web component, ds-* tags) and a 🌍 Name (HTML/CSS classes only) pair.4-Styling.mdx uses ComponentCssVariables and ComponentDesignTokens — NOT TokenOverview.title: 'Components/<Category>/<ComponentName>/Variants'| File | Meta title pattern |
|---|---|
1-Overview.mdx | "Components/<Category>/<Name>/<Name>" |
2-Usage.mdx | "Components/<Category>/<Name>/Usage" |
3-Variants.mdx | "Components/<Category>/<Name>/Variants/Overview" |
4-Styling.mdx | "Components/<Category>/<Name>/Styling" |
5-Accessibility.mdx | "Components/<Category>/<Name>/Accessibility" |
6-Testing.mdx | "Components/<Category>/<Name>/Testing" |
Why
<Name>/<Name>for Overview? Storybook uses the last path segment as the sidebar/search label. Using the component name as the last segment makes the search show "Button" (not "Documentation") as the primary result, while keeping the page correctly nested underComponents/<Category>/<Name>in the sidebar.Why a static string, not a computed title? Storybook's CSF/MDX indexer requires
titleto be a static string literal — a helper function call (e.g. deriving the category fromimport.meta.url) fails to index withCSF: unexpected dynamic title. Write the category segment out literally, matching the folder the file lives in.
tabs: [
{ label: 'Overview', storyId: 'components-<category>-<component>--<component>' },
{ label: 'Usage', storyId: 'components-<category>-<component>--usage' },
{ label: 'Variants', storyId: 'components-<category>-<component>--variants-overview' },
{ label: 'Styling', storyId: 'components-<category>-<component>--styling' },
{ label: 'Accessibility', storyId: 'components-<category>-<component>--accessibility' },
{ label: 'Testing', storyId: 'components-<category>-<component>--testing' },
]Also add an entry per MDX page to apps/storybook/.storybook/story-paths.json (used by the
"Edit on GitHub" footer link), keyed by the same storyId and pointing at
components/<category>/<component>/<N-Page>.mdx.
Read these files to understand the component:
packages/core/src/components/<category>/<component>/<component>.tsx — props, events, parts, render outputpackages/core/src/components/<category>/<component>/test/<component>.visual.html — story sectionsCheck the component type by examining the TSX file and visual.html:
<ds-*> tags).<ds-*>) and HTML/CSS class-based variants (e.g., <div class="ds-*">).Ask the user if unclear: "Is this component WC only, hybrid, or CSS-only?"
Show ALL data-testid sections from visual.html as a numbered list:
Which sections should become story variants?
1. basic
2. with-icon
3. colors
4. sizes
...
(enter numbers separated by commas, or "all")Wait for user selection before generating anything.
<component>.stories.tsStructure stories to expose component props as controls. All props go into the args object and are rendered via ${props(args)}:
import type { JSX } from '@helvetia-design/core'
import type { Meta } from '@storybook/html-vite'
import { createCssMappings, cssClasses, props, StoryFactory, withComponentControls, withRender } from '../../../utils'
type Args = JSX.Ds<Component> & { slot: string }
const tag = 'ds-<component>'
// Only include css/cssClasses if the component has an HTML/CSS equivalent
const css = createCssMappings(tag)
const meta: Meta<Args> = {
title: 'Components/<Category>/<ComponentName>/Variants',
args: {
slot: 'Default content',
},
argTypes: {
...withComponentControls({ tag: 'ds-<component>' }),
},
...withRender(({ slot, ...args }) => `<ds-<component> ${props(args)}>${slot}</ds-<component>>`),
}
export default meta
const Story = StoryFactory<Args>(meta)
export const Basic = Story({})
Basic.storyName = '🧩 Basic'
export const BasicHtml = Story({})
BasicHtml.storyName = '🌍 Basic'
export const WithVariant = Story({
args: {
variant: 'success',
},
})
WithVariant.storyName = '🧩 With Variant'
export const WithVariantHtml = Story({
args: {
variant: 'success',
},
})
WithVariantHtml.storyName = '🌍 With Variant'
// Additional stories follow the same pattern...Key patterns:
withRender — covers both WC and HTML/CSS default rendering via ${props(args)}args object — maps to component @Prop() values (e.g., { border: true, horizontal: true })${props(args)} in template — serializes args to HTML attributes on the component tagargs, not hardcoded in template strings'🧩 <Name>' for web component, '🌍 <Name>' for HTMLFor slots or complex content: If a variant needs different slot content, override withRender:
export const WithContent = Story({
args: {
variant: 'primary',
},
...withRender(
({ variant, ...args }) => `
<ds-<component> variant="${variant}" ${props(args)}>
Custom slot content here
</ds-<component>
`,
),
})<component>.doc-config.ts/**
* Shared configuration for <Component> component documentation pages.
*/
export const <COMPONENT>_DOC_CONFIG = {
section: 'Components / <ComponentName>',
color: 'purple' as const,
tabs: [
{ label: 'Overview', storyId: 'components-<component>--<component>' },
{ label: 'Usage', storyId: 'components-<component>--usage' },
{ label: 'Variants', storyId: 'components-<component>--variants-overview' },
{ label: 'Styling', storyId: 'components-<component>--styling' },
{ label: 'Accessibility', storyId: 'components-<component>--accessibility' },
{ label: 'Testing', storyId: 'components-<component>--testing' },
],
}
export const <COMPONENT>_TAB_TITLES = {
overview: 'Overview',
usage: 'Usage',
variants: 'Variants',
styling: 'Styling',
accessibility: 'Accessibility',
testing: 'Testing',
}
export const get<Component>Tabs = (activeLabel: keyof typeof <COMPONENT>_TAB_TITLES) => {
return <COMPONENT>_DOC_CONFIG.tabs.map(tab => ({
...tab,
active: tab.label === <COMPONENT>_TAB_TITLES[activeLabel],
}))
}1-Overview.mdximport { Controls, Meta } from '@storybook/addon-docs/blocks'
import {
Banner,
BannerTabs,
CanvasWithCodePen,
ComponentLead,
ComponentPublicMethods,
Footer,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/<ComponentName>" />
<Banner label={'<ComponentName>'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('overview')} />
<ComponentLead component="<component>" />
<CanvasWithCodePen of={<Component>Stories.Basic} sourceState="shown" />
<Controls of={<Component>Stories.Basic} />
<ComponentPublicMethods component="<component>" />
<Footer />import { Controls, Meta } from '@storybook/addon-docs/blocks'
import {
Banner,
BannerTabs,
CanvasTabs,
ComponentLead,
ComponentPublicMethods,
Footer,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/<ComponentName>" />
<Banner label={'<ComponentName>'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('overview')} />
<ComponentLead component="<component>" />
<CanvasTabs htmlOf={<Component>Stories.BasicHtml} of={<Component>Stories.Basic} />
<Controls of={<Component>Stories.Basic} />
<ComponentPublicMethods component="<component>" />
<Footer />2-Usage.mdximport { Meta } from '@storybook/addon-docs/blocks'
import {
Banner,
BannerTabs,
Code,
Footer,
UsageExamples,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/Usage" />
<Banner label={'Usage'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('usage')} />
## When to Use
- [bullet list of valid use cases]
## When NOT to Use
- [bullet list of anti-patterns]
## Do's and Don'ts
### [Guideline Title]
<UsageExamples
items={[
{
type: 'correct',
title: 'Correct: [Short Label]',
content: (
<ds-<component>>Correct example</ds-<component>>
),
description: '[Why this is correct]',
},
{
type: 'incorrect',
title: 'Incorrect: [Short Label]',
content: (
<ds-<component>>Incorrect example</ds-<component>>
),
description: '[Why this is wrong]',
},
]}
/>
<Footer />3-Variants.mdximport { Meta } from '@storybook/addon-docs/blocks'
import {
Banner,
BannerTabs,
CanvasWithCodePen,
Footer,
StoryHeading,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/Variants/Overview" />
<StoryHeading of={<Component>Stories.Basic} hidden></StoryHeading>
<Banner label={'Variants'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('variants')} />
{/* STORIES */}
{/* ------------------------------------------------------ */}
<StoryHeading of={<Component>Stories.<StoryName>}></StoryHeading>
[One or two sentence description of this variant.]
<CanvasWithCodePen of={<Component>Stories.<StoryName>} sourceState="shown" />
{/* ------------------------------------------------------ */}
<StoryHeading of={<Component>Stories.<NextStoryName>}></StoryHeading>
[Description.]
<CanvasWithCodePen of={<Component>Stories.<NextStoryName>} sourceState="shown" />
<Footer />import { Meta } from '@storybook/addon-docs/blocks'
import {
Banner,
BannerTabs,
CanvasTabs,
Footer,
StoryHeading,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/Variants/Overview" />
<StoryHeading of={<Component>Stories.Basic} hidden></StoryHeading>
<Banner label={'Variants'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('variants')} />
{/* STORIES */}
{/* ------------------------------------------------------ */}
<StoryHeading of={<Component>Stories.<StoryName>}></StoryHeading>
[One or two sentence description of this variant.]
<CanvasTabs htmlOf={<Component>Stories.<StoryName>Html} of={<Component>Stories.<StoryName>} />
{/* ------------------------------------------------------ */}
<StoryHeading of={<Component>Stories.<NextStoryName>}></StoryHeading>
[Description.]
<CanvasTabs htmlOf={<Component>Stories.<NextStoryName>Html} of={<Component>Stories.<NextStoryName>} />
<Footer />Notes:
<StoryHeading hidden> above the Banner is required by Storybook routing — it registers the Basic story as the "variants" landing page.<StoryName> with <StoryName>Html.CanvasWithCodePen without HTML tabs.4-Styling.mdximport { Meta } from '@storybook/addon-docs/blocks'
import {
Banner,
BannerTabs,
ComponentCssVariables,
ComponentDesignTokens,
ComponentParts,
Footer,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/Styling" />
<Banner label={'Styling'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('styling')} />
<ComponentParts component="<component>" />
<ComponentCssVariables component="<component>" />
<ComponentDesignTokens component="<component>" />
<Footer />Notes:
ComponentCssVariables and ComponentDesignTokens — NOT the old TokenOverview.ComponentParts renders Shadow DOM parts from JSDoc @part tags automatically.5-Accessibility.mdximport { Canvas, Markdown, Meta } from '@storybook/addon-docs/blocks'
import {
A11yGuidelines,
Banner,
BannerTabs,
CanvasTabs,
Footer,
InfoQuote,
Lead,
StoryHeading,
TokenOverview,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/Accessibility" />
<Banner label={'Accessibility'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('accessibility')} />
## Guidelines
<A11yGuidelines
items={[
{
type: 'do',
title: '[Guideline Title — actionable requirement]',
content: (
<p style={{ margin: '0.5rem 0 0 0' }}>
[Clear instruction for component consumers. Reference HTML attributes like <code>aria-label</code>,{' '}
<code>aria-describedby</code>, or semantic elements where relevant.]
</p>
),
},
{
type: 'do',
title: '[Second do example]',
content: <p style={{ margin: '0.5rem 0 0 0' }}>[Another important practice for this component.]</p>,
},
{
type: 'dont',
title: '[Anti-pattern Title — what to avoid]',
content: (
<p style={{ margin: '0.5rem 0 0 0' }}>
[What not to do and why it fails accessibility. Explain the consequence for users.]
</p>
),
},
{
type: 'dont',
title: '[Second dont example]',
content: <p style={{ margin: '0.5rem 0 0 0' }}>[Another common mistake that breaks accessibility.]</p>,
},
]}
/>
## References
- [MDN Reference 1](https://example.com) - [Brief description of what users will learn]
- [MDN Reference 2](https://example.com) - [How it relates to this component]
- [WCAG 2.2 Guideline](https://www.w3.org/WAI/WCAG22/) - [Which success criterion applies]
<Footer />Accessibility content principle:
aria-describedby for error messages, required indication.| Block | Import | Props | Purpose |
|---|---|---|---|
Banner | ../../../.storybook/blocks | label, section, color | Page header with title and accent color |
BannerTabs | ../../../.storybook/blocks | of, tabs | Navigation between Overview/Usage/etc |
CanvasTabs | ../../../.storybook/blocks | of, htmlOf? | Canvas with web component + HTML/CSS tabs (hybrid/CSS-only) |
CanvasWithCodePen | ../../../.storybook/blocks | of, sourceState? | Canvas with CodePen embed for web components (WC only) |
ComponentLead | ../../../.storybook/blocks | component | Auto-pulls description from components.json |
ComponentPublicMethods | ../../../.storybook/blocks | component, subComponents?, title? | Auto-pulls methods from components.json |
ComponentParts | ../../../.storybook/blocks | component | Auto-pulls Shadow DOM parts from components.json |
ComponentCssVariables | ../../../.storybook/blocks | component | CSS custom properties table |
ComponentDesignTokens | ../../../.storybook/blocks | component | Design tokens table |
A11yGuidelines | ../../../.storybook/blocks | items: { type, title, content }[] | Do/Don't accessibility checklist |
UsageExamples | ../../../.storybook/blocks | items: { type, title, content, description }[] | Correct/Incorrect code pattern comparison |
StoryHeading | ../../../.storybook/blocks | of, hidden? | Section title before canvas component |
Footer | ../../../.storybook/blocks | none | End-of-page footer |
ComponentPageObject | ../../../.storybook/blocks | component | PO API table + example test + install guide |
Code | ../../../.storybook/blocks | code, noPreview? | Inline code snippet in UsageExamples |
Storybook's static indexer cannot evaluate expressions:
{/* ✓ correct */}
<Meta title="Components/Indicators/Tag/Usage" />
{/* ✗ wrong — causes indexing error */}
<Meta title={`${TAG_DOC_CONFIG.section}/Usage`} />Each MDX page imports only the blocks it actually renders.
3-Variants.mdxUse {/* ------------------------------------------------------ */} before every StoryHeading.
createCssMappings(tag) — maps component props to CSS class names for HTML variantscssClasses(mappings, args, baseClass) — applies mapped CSS classes to an elementprops(args) — serialises Stencil props to HTML attribute stringwithRender(fn) — render function overridewithComponentControls({ tag }) — argTypes from component JSDocStoryFactory<Args>(meta) — returns the Story() helper6-Testing.mdximport { Meta } from '@storybook/addon-docs/blocks'
import {
Banner,
BannerTabs,
ComponentPageObject,
Footer,
} from '../../../../.storybook/blocks'
import * as <Component>Stories from './<component>.stories'
import { <COMPONENT>_DOC_CONFIG, get<Component>Tabs } from './<component>.doc-config'
<Meta title="Components/<Category>/<ComponentName>/Testing" />
<Banner label={'Testing'} section={<COMPONENT>_DOC_CONFIG.section} color={<COMPONENT>_DOC_CONFIG.color} />
<BannerTabs of={<Component>Stories} tabs={get<Component>Tabs('testing')} />
<ComponentPageObject component="<component>" />
<Footer />Notes:
ComponentPageObject reads pageObject from components.json (populated during pnpm build)..po.ts in packages/playwright, the block shows "No page object available" + the install guide.The tag is the canonical example for the current pattern:
apps/storybook/src/components/indicators/tag/
tag.stories.ts ← title: 'Components/Indicators/Tag/Variants', paired 🧩/🌍 stories
tag.doc-config.ts ← TAG_DOC_CONFIG (color: 'purple'), getTagTabs()
1-Overview.mdx ← CanvasTabs + Controls + ComponentLead + ComponentPublicMethods
2-Usage.mdx ← UsageExamples block
3-Variants.mdx ← Meta title ends in /Variants/Overview, StoryHeading + CanvasTabs pairs
4-Styling.mdx ← ComponentParts + ComponentCssVariables + ComponentDesignTokens
5-Accessibility.mdx ← A11yGuidelines + WCAG compliance list
api.md ← AUTO-GENERATED — never edit© baloise, Apache-2.0. 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/ds-document-component of baloise/design-system.
Open the folder on GitHubat commit 19063c5
Ds Document Component 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 |
|---|---|---|---|---|---|---|
| Ds Document Component this skillbaloise/design-system | 114 | — | ~6.3k | Automated safety check: Pass | Apache-2.0 | |
| Storybook Storyradix-ng/primitives | 274 | — | ~3.7k | Automated safety check: Pass | MIT | |
| Review ComponentEndava/BEEQ | 163 | — | ~1.7k | Automated safety check: Pass | Apache-2.0 | |
| React Component Documentationgetsentry/sentry | 45k | — | ~3.6k | Automated safety check: Pass | Custom licence | |
| Write StoriesEndava/BEEQ | 163 | — | ~968 | Automated safety check: Pass | Apache-2.0 | |
| Design Systemalirezarezvani/claude-skills | 28k | — | ~2.8k | Automated safety check: Pass | MIT |
radix-ng/primitives
Write or update Storybook stories and docs MDX for a Radix NG primitive following project conventions.
Endava/BEEQ
Review a BEEQ StencilJS component against design system guidelines and project standards.
getsentry/sentry
Create or update component documentation in Sentry's MDX stories format.
Endava/BEEQ
Write Storybook stories and MDX docs for BEEQ web components.
alirezarezvani/claude-skills
Captures the user's brand identity once via a 10-question onboarding wizard (primary/accent HEX + heading + body Google Fonts + design style editorial/technical/minimal/playful + default output…
revfactory/harness-100
Full pipeline for systematically building a UI design system.
baloise/design-system
Migrate a consuming app from the Baloise Design System (bal-) to the Helvetia Design System (ds-).
baloise/design-system
Create a changeset entry for pending changes using the repo's create-changeset.mjs CLI.
baloise/design-system
Create new web components in the Helvetia Design System. An agent skill from baloise/design-system.
baloise/design-system
Lint and fix Helvetia Design System components for style guide compliance.
baloise/design-system
Auto-generate all test files for DS components including visual, a11y, component, page object, and unit tests.
baloise/design-system
Check a component's design tokens in Base.tokens.json against the canonical naming convention (packages/tokens/CONTEXT.md "Token Naming Anatomy"), report violations as a markdown table, and apply…
Works with
Categories
A skill your agent uses when writing or generating Storybook documentation for a Baloise Design System component — creates stories.ts, doc-config.ts, and six MDX subpages (Overview, Usage, Variants…. Ds Document Component is an agent skill from baloise/design-system.
Ds Document Component fits situations like: generating Storybook documentation for a Baloise Design System component — creates stories.ts; six MDX subpages (Overview; testing) using reusable Storybook blocks (ComponentLead; componentPublicMethods.
Run `npx skills add baloise/design-system --skill ds-document-component -a claude-code`. Or copy the skill folder (.claude/skills/ds-document-component in baloise/design-system) into .claude/skills/ds-document-component in your project. Claude Code loads it when a task matches its description.
Run `npx skills add baloise/design-system --skill ds-document-component -a codex`. Or copy the skill folder (.claude/skills/ds-document-component in baloise/design-system) into .agents/skills/ds-document-component 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 baloise/design-system --skill ds-document-component -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ds-document-component, .gemini/skills/ds-document-component, .github/skills/ds-document-component and .opencode/skills/ds-document-component in your project.
Going by SKILL.md and its folder, Ds Document Component 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.
Ds Document Component is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k 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 Ds Document Component: Storybook Story (radix-ng/primitives, 274 stars), Review Component (Endava/BEEQ, 163 stars), React Component Documentation (getsentry/sentry, 45k stars) and Write Stories (Endava/BEEQ, 163 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
baloise (a GitHub organization) maintains it in baloise/design-system, which has 114 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 6, 2026.
Source: baloise/design-system on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.