172 lines
5.9 KiB
Markdown
172 lines
5.9 KiB
Markdown
# Broadcast Panel - AvanzaCast
|
|
|
|
Panel de control para gestión de transmisiones en vivo, inspirado en el diseño limpio y moderno de StreamYard.
|
|
|
|
## 🎨 Diseño y Estilos
|
|
|
|
Este proyecto utiliza **CSS Modules** para un diseño modular y mantenible, siguiendo las mejores prácticas de arquitectura de componentes React.
|
|
|
|
### Paleta de Colores
|
|
|
|
```css
|
|
--primary-blue: #1a73e8 /* Azul principal (acciones, enlaces activos) */
|
|
--primary-blue-hover: #1557b0 /* Azul hover */
|
|
--background-color: #f7f8fa /* Fondo de página */
|
|
--surface-color: #ffffff /* Fondo de componentes/tarjetas */
|
|
--text-primary: #212121 /* Texto principal */
|
|
--text-secondary: #5f6368 /* Texto secundario */
|
|
--border-light: #e8eaed /* Bordes sutiles */
|
|
--active-bg-light: #e8f0fe /* Fondo de elementos activos */
|
|
```
|
|
|
|
### Tipografía
|
|
|
|
- **Familia:** Inter, sistema UI sans-serif
|
|
- **Títulos (H2):** 22px, font-weight 600
|
|
- **Subtítulos:** 16px, font-weight 500
|
|
- **Texto principal:** 14px, font-weight 400
|
|
- **Texto pequeño:** 12px
|
|
|
|
## 📁 Assets Utilizados
|
|
|
|
### Imágenes del Dashboard Techwind
|
|
|
|
Los siguientes assets fueron copiados desde `/home/xesar/Descargas/techwind_v2.2.0/HTML/Dashboard/src/assets/images/`:
|
|
|
|
```
|
|
public/assets/
|
|
├── logo-dark.png # Logo oscuro para header
|
|
├── logo-light.png # Logo claro para sidebar
|
|
├── logo-icon.png # Icono del logo (64x64)
|
|
├── logo-icon-32.png # Icono pequeño (32x32)
|
|
└── logo-icon-64.png # Icono mediano (64x64)
|
|
|
|
public/
|
|
└── favicon.ico # Favicon del sitio
|
|
```
|
|
|
|
### Licencia de Assets
|
|
|
|
Los assets provienen de la plantilla **Techwind v2.2.0** (Dashboard template).
|
|
**Uso:** Estos assets están incluidos para propósitos de desarrollo y demostración.
|
|
**Nota:** Reemplazar con assets propios antes de producción si se requiere licencia comercial.
|
|
|
|
## 🏗️ Estructura de Componentes
|
|
|
|
```
|
|
src/components/
|
|
├── PageContainer.tsx # Contenedor principal con layout
|
|
├── PageContainer.module.css # Estilos del contenedor
|
|
├── Sidebar.tsx # Barra lateral de navegación
|
|
├── Sidebar.module.css # Estilos del sidebar
|
|
├── Header.tsx # Barra superior
|
|
├── Header.module.css # Estilos del header
|
|
├── TransmissionsTable.tsx # Tabla de transmisiones
|
|
├── TransmissionsTable.module.css
|
|
└── NewTransmissionModal (migrado a `shared/components/NewTransmissionModal.tsx`)
|
|
```
|
|
|
|
## 🚀 Desarrollo
|
|
|
|
### Iniciar el servidor de desarrollo
|
|
|
|
Desde la raíz del monorepo:
|
|
|
|
```bash
|
|
npm run dev:broadcast-panel
|
|
```
|
|
|
|
O directamente en el paquete:
|
|
|
|
```bash
|
|
cd packages/broadcast-panel
|
|
npm run dev
|
|
```
|
|
|
|
El servidor estará disponible en: **http://localhost:5173/**
|
|
|
|
### Build de producción
|
|
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
## 📱 Responsive Design
|
|
|
|
El diseño es completamente responsivo con breakpoints:
|
|
|
|
- **Desktop:** > 1024px (sidebar fijo, header completo)
|
|
- **Tablet:** 768px - 1024px (sidebar colapsable)
|
|
- **Mobile:** < 768px (sidebar con toggle, header compacto)
|
|
|
|
## ✨ Características UI
|
|
|
|
### Sidebar
|
|
- Navegación con indicadores visuales de página activa
|
|
- Sección de almacenamiento con barra de progreso
|
|
- Diseño fijo con scroll interno
|
|
- Iconos emoji temporales (reemplazar con SVG icons)
|
|
|
|
### Header
|
|
- Toggle de tema claro/oscuro
|
|
- Notificaciones con badge
|
|
- Menú de usuario
|
|
- Botón de "Mejora tu plan"
|
|
|
|
### Transmissions Table
|
|
- Tabs para filtrar (Próximamente / Anteriores)
|
|
- Estados hover en filas
|
|
- Botones de acción (Entrar al estudio, Más opciones)
|
|
- Estado vacío con mensaje descriptivo
|
|
|
|
### Modal
|
|
- Overlay con backdrop blur
|
|
- Animaciones de entrada (fadeIn + slideUp)
|
|
- Formulario con validación
|
|
- Cierre con Escape o clic fuera
|
|
|
|
## 🔧 Próximas Mejoras
|
|
|
|
- [ ] Reemplazar emojis con iconos SVG (React Icons)
|
|
- [ ] Implementar tema oscuro completo
|
|
- [ ] Añadir animaciones de transición entre páginas
|
|
- [ ] Implementar filtrado real de tabs (Próximamente/Anteriores)
|
|
- [ ] Añadir estados de carga (loading skeletons)
|
|
- [ ] Implementar dropdown del menú de usuario
|
|
- [ ] Añadir tooltips informativos
|
|
|
|
## 📝 Notas de Implementación
|
|
|
|
Este panel sigue el patrón de diseño de **StreamYard**, caracterizado por:
|
|
|
|
1. **Simplicidad:** UI limpia sin elementos innecesarios
|
|
2. **Claridad:** Jerarquía visual clara con espaciado generoso
|
|
3. **Consistencia:** Uso uniforme de colores, tipografía y espaciado
|
|
4. **Accesibilidad:** Contraste adecuado, tamaños de fuente legibles
|
|
5. **Responsividad:** Adaptación fluida a diferentes dispositivos
|
|
|
|
## Entrar al estudio (token flow)
|
|
|
|
El botón "Entrar al estudio" ahora solicita un token al servidor de tokens (configurable mediante la variable de entorno `VITE_TOKEN_SERVER_URL`) y abre el `studio-panel` enviando el token vía `postMessage` (o redirige como fallback si el popup está bloqueado).
|
|
|
|
Variables importantes:
|
|
- VITE_TOKEN_SERVER_URL - URL base del servidor que responde en `/api/token?room=...&username=...` y devuelve JSON con `{ token, url }`.
|
|
- VITE_STUDIO_URL - URL base del `studio-panel` (ej. `https://avanzacast-studio.bfzqqk.easypanel.host`) que se usa como origin para postMessage.
|
|
|
|
Cómo probar localmente:
|
|
1. Levanta `backend-api` con tus credenciales LiveKit (LIVEKIT_API_KEY y LIVEKIT_API_SECRET en .env):
|
|
```bash
|
|
cd packages/backend-api
|
|
npm run dev
|
|
```
|
|
2. Arranca `broadcast-panel` (por defecto corre en http://localhost:5175):
|
|
```bash
|
|
cd packages/broadcast-panel
|
|
npm run dev
|
|
```
|
|
3. Abre la lista de transmisiones y pulsa "Entrar al estudio" en una fila; el panel abrirá el `studio-panel` en una ventana popup y enviará el token por postMessage.
|
|
|
|
Notas de debug:
|
|
- Si no recibes confirmación (ACK) del `studio-panel`, revisa la consola del navegador para ver posibles errores de `postMessage` (origin mismatch) o bloqueos de popup.
|
|
- Para pruebas locales puedes usar `packages/studio-panel/public/simulate_postmessage.html` (simulador) para verificar el flujo sin LiveKit.
|