═══════════════════════════════════════════════════════════════════════ TODO #6 — size-limit budgets in CI ═══════════════════════════════════════════════════════════════════════ Adds .size-limit.cjs with budgets for 6 pilot @bytelyst/* packages, plus a Gitea Actions workflow (.gitea/workflows/size-limit.yml) that fails the build on any regression. Current measurements vs budget (all comfortably under): @bytelyst/api-client 793 B / 8 KB @bytelyst/auth-client 1.97 KB / 8 KB @bytelyst/celebrations 236 B / 6 KB @bytelyst/quick-actions 122 B / 6 KB @bytelyst/react-auth 2.71 KB / 10 KB @bytelyst/dashboard-shell 3.96 KB / 30 KB Scripts: pnpm size — measure + assert against budgets pnpm size:why — explain top contributors Deps: size-limit@^12.1.0, @size-limit/preset-small-lib@^12.1.0. Pilot scope (this commit): 6 packages. Full @bytelyst/* rollout is incremental — each entry added separately. ═══════════════════════════════════════════════════════════════════════ TODO #5 — Storybook canonical pattern ═══════════════════════════════════════════════════════════════════════ Discovery: @bytelyst/ui already has Storybook 8 with the @bytelyst/ addon-a11y addon configured and 5 .stories.tsx files. This commit: - Documents that setup as the canonical template (docs/STORYBOOK_TEMPLATE.md) including the .storybook/main.ts, preview.ts, package.json scripts, and an example story. - Catalogs which of the 8 visual @bytelyst/* packages need Storybook added (1/8 done — @bytelyst/ui). - Per docs/ROADMAP_2026_DECISIONS.md §9, hosting target is self-hosted Gitea Pages (no Chromatic). Full rollout to the other 7 packages stays open as incremental work. ═══════════════════════════════════════════════════════════════════════ TODO #4 — DTCG v3 token migration RFC ═══════════════════════════════════════════════════════════════════════ This is too large to land in a single commit. Drafted RFC instead: docs/rfc/0001-dtcg-v3-token-migration.md The RFC proposes a 4-PR sequence: PR 1 — Add converter + dual-emit (byte-identical assertion) PR 2 — Flip source of truth to DTCG JSON PR 3 — Introduce the component tier PR 4 — Multi-theme via DTCG token sets Estimate: 2 person-weeks total. Backward compatibility: --ml-* and --bl-* names preserved through all 4 PRs. Status: Draft, awaiting reviewers. Refs: learning_ai_uxui_web/docs/ROADMAP_2026.md §10 TODOs #4, #5, #6
116 lines
3.7 KiB
Markdown
116 lines
3.7 KiB
Markdown
# 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/<pkg> 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<typeof Button> = {
|
|
title: 'Components/Button',
|
|
component: Button,
|
|
parameters: { layout: 'centered' },
|
|
tags: ['autodocs'],
|
|
};
|
|
export default meta;
|
|
|
|
type Story = StoryObj<typeof Button>;
|
|
|
|
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/<pkg>
|
|
run storybook` locally on `:6006`.
|