storybook-stories

SKILL.md

Storybook Stories

File Structure

stories/templates/[ComponentName]/
├── basic.js               Base template, args, and parameters
├── additional.stories.js  Additional story variants
└── additional.mdx         Documentation for additional stories

File Concatenation

basic.js is automatically concatenated with additional.stories.js at load time. Do NOT import from basic.js in additional.stories.jsTemplate, args, and parameters are already in scope.

basic.js Pattern

import { html } from "lit";
import { ifDefined } from "lit/directives/if-defined.js";

export const Template = args => html`
  <sgds-component ?prop=${args.prop} attribute=${ifDefined(args.attribute)}></sgds-component>
`;

export const args = { prop: true, attribute: "value" };
export const parameters = {};

additional.stories.js Pattern

import { html } from "lit";

// Template is in scope via concatenation — no import needed

export const Dismissible = {
  render: Template.bind({}),
  name: "Dismissible",
  args: { dismissible: true, show: true },
  parameters: {},
  tags: ["!dev"]
};

For complex stories, define a local template inline:

const ShowMoreTemplate = args => html`
  <sgds-system-banner show id="banner" dismissible>
    <sgds-system-banner-item>Long content...</sgds-system-banner-item>
  </sgds-system-banner>
  <script>
    document.querySelector("#banner").addEventListener("sgds-show-more", () => modal.show());
  </script>
`;

export const ShowMore = {
  render: ShowMoreTemplate.bind({}),
  name: "Show More",
  args: {},
  parameters: {},
  tags: ["!dev"]
};

See reference/examples.md for full real-world component examples.

DRY Rules

The folder name is the namespace. Strip it from filenames and export names.

File Naming

stories/utilities/border/
  ✅ color.stories.js       ❌ border-color.stories.js
  ✅ radius.stories.js      ❌ border-radius.stories.js

stories/utilities/spacing/gap/
  ✅ static.stories.js      ❌ gap-static.stories.js
  ✅ form.stories.js        ❌ form-gap.stories.js

stories/utilities/spacing/padding/
  ✅ static.stories.js      ❌ padding.stories.js
  ✅ layout.stories.js      ❌ layout-padding.stories.js

Storybook Title

// ✅ Folder path already provides context
export default { title: "Utilities/Border/Color" };
export default { title: "Utilities/Spacing/Gap/Form" };

// ❌ Repeats the category
export default { title: "Utilities/Border/Border Color" };
export default { title: "Utilities/Spacing/Gap/Form Gap" };

Export Names

// In stories/utilities/border/color.stories.js
// title path already contains "Border"
export const Grayscales = ...   // ✅ not BorderGrayscales
export const Primary = ...      // ✅ not PrimaryBorder

Story Naming Conventions

  • Export name: PascalCase (NoClampAction)
  • Display name: Title Case ("No Clamp Action")
  • Be descriptive, not generic — avoid Story1, Story2

Commands

Command Purpose
pnpm storybook Preview stories
pnpm run build:storybook Production build
Weekly Installs
3
GitHub Stars
12
First Seen
5 days ago
Installed on
claude-code3
opencode2
gemini-cli2
github-copilot2
codex2
kimi-cli2