Storybook stories for the ODS (OpenFrame Design System) theme system, demonstrating light/dark theme switching, design token visualization, and component behavior across themes.
## Key Components
| Export | Type | Description |
|--------|------|-------------|
| `Showcase` | Story | Full-page demo with theme toggle, color token grid, and all UI components |
| `ToggleOnly` | Story | Minimal copy-paste reference showing `ThemeProvider` + `useThemeToggle()` integration |
| `SideBySide` | Story | Forced side-by-side light/dark panels using `.theme-light`/`.theme-dark` class escapes |
| `ThemeToggleButton` | Helper | Toggle button built on `useThemeToggle()` with Sun/Moon icons |
| `ThemeStatusBar` | Helper | Status bar showing current theme with explicit `setTheme('light' | 'dark')` controls |
| `TokenGrid` | Helper | Visual swatches for all `--ods-*` surface, text, accent, status, and border tokens |
| `ComponentsShowcase` | Helper | Renders Buttons, Inputs, Badges, Cards, and Alerts against the active theme |
| `Swatch` | Helper | Single color swatch rendering a Tailwind token class with its label |
## Usage Example
```typescript
// Wrap once with ThemeProvider; consume useThemeToggle() anywhere inside
import { ThemeProvider, useThemeToggle } from '../components/providers/theme-provider'
function MyToggle() {
const { isDark, toggle, mounted } = useThemeToggle()
return (
)
}
export default function App() {
return (
)
}
```
> **How it works:** `ThemeProvider` (wrapping `next-themes`) sets `data-theme="light|dark"` on ``. The `src/styles/ods-colors.css` file swaps all `--ods-*` primitive values accordingly — components only read tokens and are theme-unaware.