Stack-and-Flow es un design system educativo, accesible y publicable como paquete npm, construido con React, TypeScript, Tailwind CSS v4, Radix UI primitives, CVA, Storybook y Vite.
El objetivo es aprender y practicar cómo se construye una librería de componentes real: tokens, arquitectura, documentación viva, tests, accesibilidad, revisión visual y flujo de contribución con GitHub Projects.
git clone https://github.com/Stack-and-Flow/design-system.git
cd design-system
nvm use
pnpm install
pnpm run storybookStorybook queda disponible en http://localhost:6006.
Demo pública: sf-design-system.netlify.app
Cada componente vive en src/components/{atoms|molecules|organisms}/{kebab-name}/ y usa el patrón obligatorio de 6 archivos:
src/components/atoms/button/
├── types.ts # Props, tipos públicos y variantes CVA
├── useButton.ts # Lógica, estado, handlers, aria y className computado
├── Button.tsx # JSX presentacional; consume el hook
├── Button.test.tsx # Tests de hook y comportamiento del componente
├── Button.stories.tsx # Storybook autodocs, args, variants y estados
└── index.ts # Named export del componente + type exports
Reglas base:
type, nuncainterface.- Sin
anyexplícito. - CVA vive en
types.ts. - El componente
.tsxno contiene lógica ni llamadas CVA. - Exports/imports públicos son nombrados, por ejemplo
import { Button } from '@stack-and-flow/design-system'. - Storybook usa JSDoc encima de
const metay encima de cadaexport const StoryName. - No usamos
parameters.docs.description.component.
Este proyecto usa GitHub Issues + GitHub Projects como flujo de trabajo.
Ruta corta:
- Elegí una issue del Project Board.
- Antes de implementar, verificá que la spec esté definida y que la issue tenga el label
status:approved. - Recién después ejecutá START WORK:
- asignar la issue al contributor;
- mover el Project item a
In progress; - registrar branch y worktree.
- Usá branch issue-based:
feat/{issue-number}-{slug}fix/{issue-number}-{slug}docs/{issue-number}-{slug}
- Si necesitás worktree, crealo como sibling del repo:
../design-system-{type}-{issue-number}-{slug}- no en
/tmp, salvo pedido explícito.
- Implementá con el patrón de 6 archivos.
- Corré tests/build/revisión visual según corresponda.
- Antes de commit/review, limpiá artefactos MCP:
rm -rf .playwright-mcp page-*.png page-*.jpeg *.md.playwright-output- Al cerrar, usá END WORK sólo si hay PR merged o aprobación explícita del maintainer/usuario, con evidencia de validación.
Documentación recomendada:
- Sólo usamos Radix UI primitives como base sin estilos.
- No usamos shadcn como fuente de componentes ni configuración.
- Usá tokens desde
src/styles/theme.css; no hardcodees colores, fuentes o spacing. - Si falta un token, proponé agregarlo centralmente antes de usar valores raw.
- Accesibilidad obligatoria: nombre accesible, teclado, focus visible, contraste, reduced motion.
- Código, comentarios, Storybook y nombres públicos en inglés.
pnpm run storybook # Storybook local
pnpm run test # Vitest
pnpm run test:coverage # Cobertura
pnpm run build # Build de librería + tiposPlaywright MCP es infraestructura opcional para agentes AI. Puede generar artefactos como .playwright-mcp/, page-*.png, page-*.jpeg o *.md.playwright-output.
Estos archivos no se commitean. Antes de commit o review:
rm -rf .playwright-mcp page-*.png page-*.jpeg *.md.playwright-output- Storybook live: sf-design-system.netlify.app
- Project Board: GitHub Projects
- Wiki Deepwiki: deepwiki.com/Stack-and-Flow/design-system
Este repositorio está abierto a colaboración. Es ideal si querés aprender design systems, React, TypeScript, arquitectura de componentes, accesibilidad, Storybook y publicación de librerías.
⭐ Si este proyecto te resulta útil, considera darle una estrella en GitHub ⭐