# Storybook Template for `@bytelyst/*` Packages > ROADMAP TODO #5 — canonical pattern for adding Storybook 8 to each > visual `@bytelyst/*` package. ## Status | Package | Has Storybook | Stories | A11y addon | | -------------------------------- | ------------- | --------------------------------------------------------------- | ---------- | | `@bytelyst/ui` | ✅ | 5 (`Button`, `Card`, `Controls`, `Input`, `OperationalPreview`) | ✅ | | `@bytelyst/auth-ui` | ❌ | — | — | | `@bytelyst/dashboard-components` | ❌ | — | — | | `@bytelyst/dashboard-shell` | ❌ | — | — | | `@bytelyst/celebrations` | ❌ | — | — | | `@bytelyst/gentle-notifications` | ❌ | — | — | | `@bytelyst/quick-actions` | ❌ | — | — | | `@bytelyst/react-auth` | ❌ | — | — | Rollout is incremental — each package added separately so failures are diagnosable. ## Canonical setup (mirrors `@bytelyst/ui`) ### 1. Add devDependencies ```sh pnpm --filter @bytelyst/ add -D \ storybook@^8.5.0 \ @storybook/react@^8.5.0 \ @storybook/react-vite@^8.5.0 \ @storybook/addon-essentials@^8.5.0 \ @storybook/addon-a11y@^8.5.0 ``` ### 2. Add scripts to `package.json` ```json { "scripts": { "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" } } ``` ### 3. Create `.storybook/main.ts` ```ts import type { StorybookConfig } from '@storybook/react-vite'; const config: StorybookConfig = { stories: ['../src/**/*.stories.@(ts|tsx)'], addons: ['@storybook/addon-essentials', '@storybook/addon-a11y'], framework: { name: '@storybook/react-vite', options: {} }, }; export default config; ``` ### 4. Create `.storybook/preview.ts` ```ts import type { Preview } from '@storybook/react'; import '@bytelyst/design-tokens/css'; const preview: Preview = { parameters: { backgrounds: { default: 'dark', values: [ { name: 'dark', value: '#06070A' }, { name: 'elevated', value: '#0E1118' }, { name: 'light', value: '#F8F9FC' }, ], }, }, }; export default preview; ``` ### 5. Add at least one `*.stories.tsx` Pattern — one story file per component, **co-located** in `src/`: ```tsx // src/components/Button.stories.tsx import type { Meta, StoryObj } from '@storybook/react'; import { Button } from './Button.js'; const meta: Meta = { title: 'Components/Button', component: Button, parameters: { layout: 'centered' }, tags: ['autodocs'], }; export default meta; type Story = StoryObj; export const Primary: Story = { args: { children: 'Click me' } }; export const Disabled: Story = { args: { children: 'Disabled', disabled: true } }; ``` ## Hosting **Decision (`docs/ROADMAP_2026_DECISIONS.md` §9):** self-hosted on Gitea Pages. A future Gitea Actions workflow at `.gitea/workflows/storybook.yml` will build each package's Storybook on push to `main` and deploy the combined output to `storybook.bytelyst.com` (or equivalent). Until that workflow lands, developers run `pnpm --filter @bytelyst/ run storybook` locally on `:6006`.