301 lines
6.5 KiB
Markdown
301 lines
6.5 KiB
Markdown
# Avanza UI - Sistema de Componentes
|
|
|
|
## 📦 Biblioteca de Componentes UI Propia
|
|
|
|
**Avanza UI** es un sistema de componentes independiente basado en CSS Modules y Variables CSS, inspirado en Tailwind CSS y Vristo, pero sin dependencias externas de frameworks CSS.
|
|
|
|
## 🎯 Filosofía
|
|
|
|
La biblioteca está diseñada para:
|
|
- ✅ **Independencia**: Sin dependencia de Tailwind, Bootstrap u otros frameworks CSS
|
|
- ✅ **CSS Modules**: Estilos encapsulados que previenen conflictos
|
|
- ✅ **Variables CSS**: Sistema de diseño basado en CSS Variables para fácil personalización
|
|
- ✅ **TypeScript**: Tipado completo para mejor experiencia de desarrollo
|
|
|
|
## 📁 Estructura del Proyecto
|
|
|
|
```
|
|
packages/ui-components/
|
|
├── src/
|
|
│ ├── styles/
|
|
│ │ └── globals.css # Variables CSS y estilos globales
|
|
│ ├── components/
|
|
│ │ ├── Button.tsx # Componente Button
|
|
│ │ ├── Button.module.css # Estilos del Button
|
|
│ │ ├── Card.tsx
|
|
│ │ ├── Card.module.css
|
|
│ │ └── ...
|
|
│ ├── utils/
|
|
│ │ └── helpers.ts # Utilidades (cn, debounce, etc.)
|
|
│ ├── types/
|
|
│ │ ├── index.ts # Tipos TypeScript
|
|
│ │ └── css-modules.d.ts # Declaraciones para CSS Modules
|
|
│ └── index.ts # Punto de entrada
|
|
├── package.json
|
|
├── tsconfig.json
|
|
├── rollup.config.js
|
|
└── README.md
|
|
```
|
|
|
|
## 🎨 Sistema de Diseño (Design Tokens)
|
|
|
|
### Variables CSS Globales
|
|
|
|
El sistema utiliza variables CSS con el prefijo `--au-` (avanza-ui):
|
|
|
|
```css
|
|
:root {
|
|
/* Colores Primarios */
|
|
--au-primary-600: #4f46e5;
|
|
--au-primary-hover: #4338ca;
|
|
|
|
/* Grises */
|
|
--au-gray-50: #f8fafc;
|
|
--au-gray-900: #0f172a;
|
|
|
|
/* Espaciado */
|
|
--au-spacing-4: 1rem; /* 16px */
|
|
--au-spacing-6: 1.5rem; /* 24px */
|
|
|
|
/* Bordes */
|
|
--au-radius-md: 0.5rem;
|
|
--au-radius-lg: 0.75rem;
|
|
|
|
/* Sombras */
|
|
--au-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
|
}
|
|
```
|
|
|
|
### Soporte de Temas (Light/Dark)
|
|
|
|
```css
|
|
/* Tema Light (default) */
|
|
:root,
|
|
[data-theme="light"] {
|
|
--au-bg-primary: var(--au-gray-50);
|
|
--au-text-primary: var(--au-gray-900);
|
|
}
|
|
|
|
/* Tema Dark */
|
|
[data-theme="dark"] {
|
|
--au-bg-primary: var(--au-gray-950);
|
|
--au-text-primary: var(--au-gray-50);
|
|
}
|
|
```
|
|
|
|
## 🛠️ Desarrollo
|
|
|
|
### Cómo usar este sistema en tus proyectos
|
|
|
|
#### Opción 1: Link local (Desarrollo)
|
|
|
|
```bash
|
|
# En ui-components
|
|
cd packages/ui-components
|
|
npm link
|
|
|
|
# En tu proyecto (ej: studio-panel)
|
|
cd packages/studio-panel
|
|
npm link avanza-ui
|
|
```
|
|
|
|
#### Opción 2: Dependencia local en package.json
|
|
|
|
```json
|
|
{
|
|
"dependencies": {
|
|
"avanza-ui": "file:../ui-components"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Opción 3: Publicar a npm (Producción)
|
|
|
|
```bash
|
|
cd packages/ui-components
|
|
npm publish
|
|
```
|
|
|
|
### Uso en tu proyecto
|
|
|
|
```tsx
|
|
// Importar estilos globales
|
|
import 'avanza-ui/dist/index.css';
|
|
|
|
// Importar componentes
|
|
import { Button, Card, Input } from 'avanza-ui';
|
|
|
|
function App() {
|
|
return (
|
|
<Card>
|
|
<Input label="Nombre" placeholder="Tu nombre" />
|
|
<Button variant="primary">Guardar</Button>
|
|
</Card>
|
|
);
|
|
}
|
|
```
|
|
|
|
## 📝 Cómo crear nuevos componentes
|
|
|
|
### 1. Crear el archivo de estilos (CSS Module)
|
|
|
|
```css
|
|
/* src/components/MiComponente.module.css */
|
|
.miComponente {
|
|
background-color: var(--au-surface);
|
|
padding: var(--au-spacing-4);
|
|
border-radius: var(--au-radius-md);
|
|
border: 1px solid var(--au-border-light);
|
|
}
|
|
|
|
.miComponente:hover {
|
|
background-color: var(--au-surface-hover);
|
|
}
|
|
```
|
|
|
|
### 2. Crear el componente TypeScript
|
|
|
|
```tsx
|
|
/* src/components/MiComponente.tsx */
|
|
import React from 'react';
|
|
import { cn } from '../utils/helpers';
|
|
import type { ComponentBaseProps } from '../types';
|
|
import styles from './MiComponente.module.css';
|
|
|
|
export interface MiComponenteProps extends ComponentBaseProps {
|
|
variant?: 'default' | 'primary';
|
|
children?: React.ReactNode;
|
|
}
|
|
|
|
export const MiComponente = React.forwardRef<HTMLDivElement, MiComponenteProps>(
|
|
({ variant = 'default', children, className, style, id }, ref) => {
|
|
return (
|
|
<div
|
|
ref={ref}
|
|
className={cn(styles.miComponente, styles[variant], className)}
|
|
style={style}
|
|
id={id}
|
|
>
|
|
{children}
|
|
</div>
|
|
);
|
|
}
|
|
);
|
|
|
|
MiComponente.displayName = 'MiComponente';
|
|
```
|
|
|
|
### 3. Exportar en index.ts
|
|
|
|
```typescript
|
|
export { MiComponente } from './components/MiComponente';
|
|
export type { MiComponenteProps } from './components/MiComponente';
|
|
```
|
|
|
|
### 4. Compilar
|
|
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
## 🚀 Ejemplo Real: broadcast-panel
|
|
|
|
El paquete `broadcast-panel` ya utiliza este sistema exitosamente. Puedes revisar su código como referencia:
|
|
|
|
```
|
|
packages/broadcast-panel/src/
|
|
├── styles.css # Importa las variables globales
|
|
├── components/
|
|
│ ├── Header.tsx
|
|
│ ├── Header.module.css
|
|
│ ├── Sidebar.tsx
|
|
│ ├── Sidebar.module.css
|
|
│ └── ...
|
|
```
|
|
|
|
## 📚 Componentes Disponibles
|
|
|
|
### Button
|
|
```tsx
|
|
<Button variant="primary" size="md" loading={false}>
|
|
Click me
|
|
</Button>
|
|
```
|
|
|
|
### Card
|
|
```tsx
|
|
<Card padding="md" hoverable>
|
|
<CardHeader>Título</CardHeader>
|
|
<CardBody>Contenido</CardBody>
|
|
<CardFooter>Pie</CardFooter>
|
|
</Card>
|
|
```
|
|
|
|
### Input
|
|
```tsx
|
|
<Input
|
|
label="Email"
|
|
type="email"
|
|
error={hasError}
|
|
errorMessage="Email inválido"
|
|
/>
|
|
```
|
|
|
|
### Dropdown
|
|
```tsx
|
|
<Dropdown trigger={<Button>Opciones</Button>}>
|
|
<DropdownItem icon={<Icon />}>Opción 1</DropdownItem>
|
|
<DropdownDivider />
|
|
<DropdownItem danger>Eliminar</DropdownItem>
|
|
</Dropdown>
|
|
```
|
|
|
|
### Modal
|
|
```tsx
|
|
<Modal isOpen={isOpen} onClose={() => setIsOpen(false)}>
|
|
<ModalHeader title="Título" onClose={() => setIsOpen(false)} />
|
|
<ModalBody>Contenido del modal</ModalBody>
|
|
<ModalFooter>
|
|
<Button onClick={() => setIsOpen(false)}>Cerrar</Button>
|
|
</ModalFooter>
|
|
</Modal>
|
|
```
|
|
|
|
## 🔧 Scripts NPM
|
|
|
|
```bash
|
|
npm run build # Compilar la biblioteca
|
|
npm run dev # Modo desarrollo con watch
|
|
npm run test # Ejecutar tests
|
|
```
|
|
|
|
## 📦 Para usar en studio-panel
|
|
|
|
1. Vincula la biblioteca:
|
|
```bash
|
|
cd packages/ui-components
|
|
npm run build
|
|
cd ../studio-panel
|
|
npm install ../ui-components
|
|
```
|
|
|
|
2. Importa en tu código:
|
|
```tsx
|
|
import { Button, Card } from 'avanza-ui';
|
|
import 'avanza-ui/dist/index.css';
|
|
```
|
|
|
|
3. ¡Listo! Ya puedes usar los componentes.
|
|
|
|
## 🎯 Próximos Pasos
|
|
|
|
1. Terminar de implementar todos los componentes
|
|
2. Agregar tests unitarios
|
|
3. Crear Storybook para documentación visual
|
|
4. Publicar en npm registry privado o público
|
|
|
|
---
|
|
|
|
**Avanza UI** - Sistema de componentes moderno y sin dependencias para AvanzaCast
|
|
|