245 lines
5.4 KiB
Markdown
245 lines
5.4 KiB
Markdown
# Avanza UI
|
|
|
|
Sistema de componentes UI independiente para AvanzaCast - Sin dependencias de Tailwind CSS
|
|
|
|
## 🎯 Componentes Disponibles
|
|
|
|
### Componentes Básicos
|
|
- ✅ **Button** - Botones con múltiples variantes y tamaños
|
|
- ✅ **Card** - Tarjetas con header, body y footer
|
|
- ✅ **Input** - Campos de entrada con validación
|
|
- ✅ **Badge** - Insignias y etiquetas
|
|
- ✅ **Avatar** - Avatares con soporte de imágenes e iniciales
|
|
- ✅ **Spinner** - Indicadores de carga
|
|
|
|
### Componentes de Feedback
|
|
- ✅ **Alert** - Mensajes de alerta (success, warning, danger, info)
|
|
- ✅ **Tooltip** - Tooltips posicionables
|
|
- ✅ **Modal** - Modales con header, body y footer
|
|
|
|
### Componentes de Navegación
|
|
- ✅ **Dropdown** - Menús desplegables con items y dividers
|
|
|
|
## 📦 Instalación
|
|
|
|
```bash
|
|
# Desde el workspace (monorepo)
|
|
npm install avanza-ui@file:../ui-components
|
|
|
|
# O crear link simbólico
|
|
cd packages/ui-components
|
|
npm link
|
|
cd ../tu-proyecto
|
|
npm link avanza-ui
|
|
```
|
|
|
|
## 🚀 Uso Rápido
|
|
|
|
```tsx
|
|
import {
|
|
Button,
|
|
Card,
|
|
CardHeader,
|
|
CardBody,
|
|
Input,
|
|
Alert,
|
|
Avatar,
|
|
Badge,
|
|
Spinner,
|
|
Modal,
|
|
ModalHeader,
|
|
ModalBody,
|
|
ModalFooter,
|
|
Dropdown,
|
|
DropdownItem,
|
|
Tooltip
|
|
} from 'avanza-ui';
|
|
|
|
// Importar estilos globales
|
|
import 'avanza-ui/dist/index.css';
|
|
|
|
function App() {
|
|
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
|
|
return (
|
|
<div>
|
|
{/* Alert */}
|
|
<Alert variant="success" title="¡Éxito!" message="Operación completada" closable />
|
|
|
|
{/* Card con componentes */}
|
|
<Card>
|
|
<CardHeader>
|
|
<div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>
|
|
<Avatar src="/avatar.jpg" size="md" status="online" />
|
|
<div>
|
|
<h3>Usuario</h3>
|
|
<Badge variant="primary">Premium</Badge>
|
|
</div>
|
|
</div>
|
|
</CardHeader>
|
|
<CardBody>
|
|
<Input
|
|
label="Email"
|
|
type="email"
|
|
placeholder="tu@email.com"
|
|
helperText="Ingresa tu correo electrónico"
|
|
/>
|
|
|
|
<Tooltip content="Haz clic para enviar" position="top">
|
|
<Button variant="primary" fullWidth>
|
|
Enviar
|
|
</Button>
|
|
</Tooltip>
|
|
</CardBody>
|
|
</Card>
|
|
|
|
{/* Dropdown */}
|
|
<Dropdown trigger={<Button variant="secondary">Opciones</Button>}>
|
|
<DropdownItem icon={<span>👤</span>}>Mi Perfil</DropdownItem>
|
|
<DropdownItem icon={<span>⚙️</span>}>Configuración</DropdownItem>
|
|
<DropdownDivider />
|
|
<DropdownItem danger icon={<span>🚪</span>}>Cerrar Sesión</DropdownItem>
|
|
</Dropdown>
|
|
|
|
{/* Modal */}
|
|
<Button onClick={() => setIsModalOpen(true)}>Abrir Modal</Button>
|
|
<Modal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} size="md">
|
|
<ModalHeader title="Título del Modal" onClose={() => setIsModalOpen(false)} />
|
|
<ModalBody>
|
|
<p>Contenido del modal</p>
|
|
</ModalBody>
|
|
<ModalFooter>
|
|
<Button variant="secondary" onClick={() => setIsModalOpen(false)}>
|
|
Cancelar
|
|
</Button>
|
|
<Button variant="primary">Aceptar</Button>
|
|
</ModalFooter>
|
|
</Modal>
|
|
|
|
{/* Spinner */}
|
|
{loading && <Spinner size="lg" variant="primary" />}
|
|
</div>
|
|
);
|
|
}
|
|
```
|
|
|
|
## 🎨 Personalización de Temas
|
|
|
|
```tsx
|
|
// Cambiar tema programáticamente
|
|
document.documentElement.setAttribute('data-theme', 'dark'); // o 'light'
|
|
|
|
// Personalizar variables CSS
|
|
const customStyles = `
|
|
:root {
|
|
--au-primary-600: #your-color;
|
|
--au-spacing-4: 1.5rem;
|
|
}
|
|
`;
|
|
```
|
|
|
|
## 📖 API de Componentes
|
|
|
|
### Button
|
|
|
|
```tsx
|
|
<Button
|
|
variant="primary" // 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'ghost' | 'link'
|
|
size="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
|
|
fullWidth={false}
|
|
loading={false}
|
|
disabled={false}
|
|
leftIcon={<Icon />}
|
|
rightIcon={<Icon />}
|
|
onClick={() => {}}
|
|
>
|
|
Texto del Botón
|
|
</Button>
|
|
```
|
|
|
|
### Avatar
|
|
|
|
```tsx
|
|
<Avatar
|
|
src="/avatar.jpg"
|
|
alt="Usuario"
|
|
size="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
|
|
initials="AB"
|
|
status="online" // 'online' | 'offline' | 'busy' | 'away'
|
|
/>
|
|
```
|
|
|
|
### Badge
|
|
|
|
```tsx
|
|
<Badge
|
|
variant="primary" // 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info'
|
|
size="md" // 'sm' | 'md' | 'lg'
|
|
dot={false}
|
|
>
|
|
Texto
|
|
</Badge>
|
|
```
|
|
|
|
### Alert
|
|
|
|
```tsx
|
|
<Alert
|
|
variant="success" // 'success' | 'warning' | 'danger' | 'info'
|
|
title="Título"
|
|
message="Mensaje"
|
|
closable={true}
|
|
onClose={() => {}}
|
|
/>
|
|
```
|
|
|
|
## 🎯 Variables CSS Disponibles
|
|
|
|
### Colores
|
|
- `--au-primary-*` (50-950)
|
|
- `--au-gray-*` (50-950)
|
|
- `--au-success-*`
|
|
- `--au-warning-*`
|
|
- `--au-danger-*`
|
|
- `--au-info-*`
|
|
|
|
### Espaciado
|
|
- `--au-spacing-0` a `--au-spacing-24`
|
|
|
|
### Tipografía
|
|
- `--au-text-xs` a `--au-text-4xl`
|
|
- `--au-font-normal`, `--au-font-medium`, `--au-font-semibold`, `--au-font-bold`
|
|
|
|
### Bordes
|
|
- `--au-radius-none` a `--au-radius-full`
|
|
|
|
### Sombras
|
|
- `--au-shadow-sm` a `--au-shadow-xl`
|
|
|
|
## 🛠️ Utilidades
|
|
|
|
```tsx
|
|
import { cn, debounce, throttle, generateId } from 'avanza-ui';
|
|
|
|
// Combinar clases
|
|
const className = cn('base-class', condition && 'conditional-class');
|
|
|
|
// Debounce
|
|
const debouncedFn = debounce((value) => console.log(value), 300);
|
|
|
|
// Throttle
|
|
const throttledFn = throttle(() => console.log('scroll'), 100);
|
|
|
|
// Generar ID único
|
|
const id = generateId('component'); // 'component-a1b2c3d4'
|
|
```
|
|
|
|
## 📄 Licencia
|
|
|
|
MIT
|
|
|
|
---
|
|
|
|
**Avanza UI** v1.0.0 - Sistema de componentes para AvanzaCast
|
|
|