Skip to content

docs: Storybook interactive component playground #14

Description

@tomny-dev

Goal

Set up Storybook with interactive component playgrounds for all 25+ exported components. This is Phase 2 — Phase 1 (markdown docs) should be merged first but this can proceed independently.

Scope

Files to create

Storybook config (deterministic setup, no interactive wizard)

  1. .storybook/main.ts — Vite bundler, CSS modules support, @tomny-dev/uzi alias, essential addons
  2. .storybook/preview.tsx — ThemeProvider decorator (light/blue default), ToastProvider decorator for feedback stories, CSS import
  3. tsconfig.storybook.json — TypeScript config for Storybook

Story files (14 files, one per component/group)

  1. src/components/button/Button.stories.tsx — All 7 variants × 5 sizes, asChild, anchor variant
  2. src/components/avatar/Avatar.stories.tsx — 4 sizes, image+fallback composition, fallback states
  3. src/components/card/Card.stories.tsx — 3 tones × 4 padding presets, interactive, semantic elements
  4. src/components/pill/Pill.stories.tsx — 5 tones × 2 sizes, icon variant, element types
  5. src/components/modal/Modal.stories.tsx — 4 sizes, controlled open/close pattern, ModalOverlay
  6. src/components/alert/Alert.stories.tsx — 4 tones with sample content
  7. src/components/toast/Toast.stories.tsx — useToast hook with trigger buttons, action/toast types
  8. src/components/skeleton/Skeleton.stories.tsx — width/height combos, radius presets, loading card layout
  9. src/components/progress/Progress.stories.tsx — 4 tones, value range (0-100), aria-label examples
  10. src/components/input/Input.stories.tsx — Input types, Label pairing, disabled/required states, Checkbox+Label form group
  11. src/components/select/Select.stories.tsx — Options array, controlled state, placeholder, disabled
  12. src/components/multi-select/MultiSelect.stories.tsx — Checkbox menu, chip display, overflow behavior
  13. src/components/segmented-toggle/SegmentedToggle.stories.tsx — View toggle, disabled options, custom labels
  14. src/components/top-bar/TopBar.stories.tsx — Layout variants (brand left/center, sticky/static, with theme toggle)
  15. src/components/theme-toggle-button/ThemeToggleButton.stories.tsx — Icon/text variants, inside TopBar
  16. src/components/sidebar-nav/SidebarNav.stories.tsx — Flat/sectioned nav, active detection, collapsed state, icons/badges
  17. src/components/app-shell/AppShell.stories.tsx — Full dashboard layout, responsive sidebar, custom width
  18. src/components/dropdown-menu/DropdownMenu.stories.tsx — 13-component ecosystem: basic menu, checkbox items, radio group, separator, nested sub-menus, destructive variant
  19. src/components/theme/Theme.stories.tsx — Theme rendering (light/dark), 6 accent palettes, controlled vs uncontrolled, full theme switcher UI

Files to update

  1. package.json — Add pnpm storybook and pnpm build-storybook scripts

Storybook configuration

  • Renderer: Vite (via @storybook/addon-vite)
  • Essential addons: @storybook/addon-essentials, @storybook/addon-links, @storybook/addon-storysource
  • Decorator: ThemeProvider wrapping all stories (default: light theme, blue accent)
  • Decorator: ToastProvider wrapping feedback component stories
  • CSS: import "@tomny-dev/uzi/styles.css" in preview.tsx
  • Theme toggle: Via data-uzi-theme attribute on documentElement

Acceptance criteria

  • Storybook launches successfully (pnpm storybook) with no errors
  • All 14 story files created under src/components/<name>/
  • ThemeProvider decorator wraps all stories (light theme, blue accent by default)
  • ToastProvider decorator wraps feedback component stories
  • Every component's enum values covered:
    • Button: 7 variants × 5 sizes
    • Card: 3 tones × 4 padding presets
    • Alert: 4 tones
    • Progress: 4 tones + value range
    • Pill: 5 tones × 2 sizes
    • Avatar: 4 sizes
    • Modal: 4 sizes
    • Theme: 6 accent palettes
  • Stories using useToast render within ToastProvider decorator
  • Stories using useTheme render within ThemeProvider decorator
  • No third-party dependencies in examples (inline SVGs only)
  • pnpm build-storybook succeeds
  • @storybook/addon-storysource shows source code inline for each story

Notes

  • Phase 1 (markdown docs) is tracked separately. This can proceed independently.
  • @storybook/addon-storysource eliminates the need for manual "code preview" sections — source is shown automatically in the UI.
  • Radix-wrapped components (Avatar, DropdownMenu, Select, etc.) expose all underlying Radix props via React.ComponentProps in argTypes so users can see the full API surface.
  • SidebarNav.matchStrategy defaults to "prefix"; "most-specific" is an opt-in for parent+child routes (related to issue SidebarNav: opt-in for most-specific active matching (parent + child both highlight) #8).
  • CI preview builds should deploy Storybook static output (matching existing PR preview workflow from DEVELOPMENT.md).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions