AvanzaCast/docs/streamyard_interface (3).html

1187 lines
35 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Transmisión - StreamYard Clone</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: #f5f5f5;
overflow: hidden;
height: 100vh;
}
/* Header */
.header {
background: white;
height: 60px;
border-bottom: 1px solid #e0e0e0;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
position: relative;
z-index: 100;
}
.logo {
display: flex;
align-items: center;
gap: 12px;
font-size: 15px;
color: #333;
}
.logo-icon {
width: 36px;
height: 36px;
background: linear-gradient(135deg, #1e88e5 0%, #0d47a1 100%);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
}
.header-actions {
display: flex;
gap: 12px;
align-items: center;
}
.add-destination-btn {
padding: 8px 16px;
background: #e3f2fd;
color: #1976d2;
border: 1px solid #90caf9;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
display: flex;
align-items: center;
gap: 8px;
transition: all 0.2s;
}
.add-destination-btn:hover {
background: #bbdefb;
}
.record-btn {
padding: 10px 24px;
background: #1976d2;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
font-weight: 600;
transition: all 0.2s;
}
.record-btn:hover {
background: #1565c0;
transform: translateY(-1px);
}
/* Main Layout */
.main-container {
display: flex;
height: calc(100vh - 60px);
position: relative;
}
/* Left Sidebar */
.left-sidebar {
width: 200px;
background: white;
border-right: 1px solid #e0e0e0;
display: flex;
flex-direction: column;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
z-index: 50;
flex-shrink: 0;
}
.left-sidebar.collapsed {
width: 0;
margin-left: 0;
border-right: none;
overflow: hidden;
}
.sidebar-header {
padding: 16px;
border-bottom: 1px solid #e0e0e0;
display: flex;
align-items: center;
justify-content: space-between;
}
.sidebar-title {
font-size: 14px;
font-weight: 600;
display: flex;
align-items: center;
gap: 8px;
}
.beta-badge {
background: #7b61ff;
color: white;
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
font-weight: 600;
}
.scene-list {
flex: 1;
overflow-y: auto;
padding: 8px;
}
.scene-item {
padding: 12px;
margin-bottom: 4px;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
position: relative;
background: #f5f5f5;
}
.scene-item:hover {
background: #e8e8e8;
}
.scene-item.active {
background: #1976d2;
color: white;
}
.scene-preview {
width: 100%;
height: 80px;
background: #424242;
border-radius: 4px;
margin-bottom: 8px;
display: flex;
align-items: center;
justify-content: center;
}
.scene-name {
font-size: 13px;
font-weight: 500;
}
.add-scene-btn {
padding: 12px;
background: transparent;
border: 2px dashed #bdbdbd;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: #666;
transition: all 0.2s;
}
.add-scene-btn:hover {
border-color: #1976d2;
color: #1976d2;
}
/* Center Stage - 4 Rows Structure */
.center-stage {
flex: 1;
display: flex;
flex-direction: column;
background: #e0e0e0;
position: relative;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* ROW 1: Video Display */
.video-row {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
position: relative;
min-height: 0;
}
.video-stage {
width: 100%;
max-width: 100%;
height: 100%;
background: #000;
border-radius: 8px;
position: relative;
overflow: hidden;
box-shadow: 0 8px 32px rgba(0,0,0,0.3);
}
.quality-badge {
position: absolute;
top: 16px;
left: 16px;
background: rgba(0,0,0,0.7);
color: white;
padding: 6px 12px;
border-radius: 4px;
font-size: 12px;
font-weight: 600;
}
.streamyard-badge {
position: absolute;
top: 16px;
right: 16px;
color: rgba(255,255,255,0.7);
font-size: 11px;
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 2px;
}
.hide-panel-btn {
position: absolute;
bottom: 50%;
right: -12px;
transform: translateY(50%);
background: white;
border: 1px solid #e0e0e0;
border-radius: 4px;
padding: 8px 4px;
cursor: pointer;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
transition: all 0.2s;
z-index: 10;
}
.hide-panel-btn:hover {
background: #f5f5f5;
}
/* ROW 2: Layout Controls */
.layout-row {
background: white;
padding: 16px 20px;
border-top: 1px solid #e0e0e0;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
flex-shrink: 0;
}
.layout-btn {
width: 48px;
height: 48px;
background: #e0e0e0;
border: 2px solid transparent;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
position: relative;
font-size: 20px;
}
.layout-btn:hover {
background: #d0d0d0;
transform: translateY(-2px);
}
.layout-btn.active {
background: #1976d2;
border-color: #1976d2;
}
/* ROW 3: Participants/Guests Management */
.participants-row {
background: white;
padding: 16px 20px;
border-top: 1px solid #e0e0e0;
display: flex;
gap: 16px;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow-x: auto;
}
.participant-card {
background: #f5f5f5;
border-radius: 8px;
padding: 16px;
min-width: 180px;
position: relative;
transition: all 0.2s;
}
.participant-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.participant-avatar {
width: 100%;
height: 100px;
background: #9e9e9e;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 32px;
margin-bottom: 12px;
}
.participant-name {
font-size: 13px;
color: #333;
display: flex;
align-items: center;
gap: 6px;
}
.participant-controls {
position: absolute;
top: 12px;
right: 12px;
display: flex;
gap: 4px;
}
.mini-control-btn {
width: 32px;
height: 32px;
background: rgba(255,255,255,0.9);
border: none;
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
}
.mini-control-btn:hover {
background: white;
transform: scale(1.1);
}
.invite-card {
background: white;
border: 2px dashed #bdbdbd;
border-radius: 8px;
padding: 16px;
min-width: 180px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
cursor: pointer;
transition: all 0.2s;
height: 160px;
}
.invite-card:hover {
border-color: #1976d2;
background: #f5f9ff;
transform: translateY(-2px);
}
/* ROW 4: Video Conference Controls Footer */
.controls-footer {
background: white;
border-top: 1px solid #e0e0e0;
padding: 12px 20px;
display: flex;
align-items: center;
justify-content: space-between;
flex-shrink: 0;
gap: 16px;
}
.controls-left,
.controls-center,
.controls-right {
display: flex;
gap: 8px;
align-items: center;
}
.controls-center {
flex: 1;
justify-content: center;
}
.control-btn {
width: 48px;
height: 48px;
background: #f5f5f5;
border: none;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
position: relative;
font-size: 20px;
}
.control-btn:hover {
background: #e0e0e0;
transform: scale(1.05);
}
.control-btn.active {
background: #1976d2;
color: white;
}
.control-btn.danger {
background: #ef5350;
color: white;
}
.control-btn.danger:hover {
background: #e53935;
transform: scale(1.05);
}
.control-btn-with-menu {
display: flex;
align-items: center;
gap: 4px;
padding: 0 12px;
border-radius: 24px;
width: auto;
}
.invite-btn {
background: #1976d2;
color: white;
padding: 12px 20px;
border: none;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
font-weight: 500;
transition: all 0.2s;
}
.invite-btn:hover {
background: #1565c0;
transform: translateY(-1px);
}
.help-btn {
width: 48px;
height: 48px;
background: transparent;
border: 2px solid #1976d2;
color: #1976d2;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
transition: all 0.2s;
}
.help-btn:hover {
background: #e3f2fd;
transform: scale(1.05);
}
/* Right Sidebar */
.right-sidebar {
width: 360px;
background: white;
border-left: 1px solid #e0e0e0;
display: flex;
flex-direction: column;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
z-index: 50;
flex-shrink: 0;
}
.right-sidebar.collapsed {
width: 0;
margin-right: 0;
border-left: none;
overflow: hidden;
}
.right-sidebar-tabs {
display: flex;
flex-direction: column;
gap: 12px;
padding: 12px 8px;
background: #fafafa;
border-left: 1px solid #e0e0e0;
position: absolute;
right: 100%;
top: 0;
height: 100%;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.right-sidebar.collapsed .right-sidebar-tabs {
right: 0;
border-left: none;
border-right: 1px solid #e0e0e0;
}
.tab-btn {
width: 56px;
height: 56px;
background: white;
border: 1px solid #e0e0e0;
border-radius: 8px;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
transition: all 0.2s;
font-size: 10px;
color: #666;
}
.tab-btn:hover {
background: #f5f5f5;
border-color: #1976d2;
transform: translateX(-4px);
}
.tab-btn.active {
background: #e3f2fd;
border-color: #1976d2;
color: #1976d2;
}
.right-sidebar-content {
flex: 1;
overflow-y: auto;
padding: 20px;
}
.brand-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
.brand-title {
display: flex;
align-items: center;
gap: 8px;
font-size: 16px;
font-weight: 600;
}
.new-badge {
background: #7b61ff;
color: white;
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
font-weight: 600;
}
.section-title {
font-size: 14px;
font-weight: 600;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 8px;
}
/* Toggle Buttons */
.toggle-left {
position: absolute;
left: 200px;
top: 50%;
transform: translateY(-50%);
width: 24px;
height: 80px;
background: white;
border: 1px solid #e0e0e0;
border-left: none;
border-radius: 0 8px 8px 0;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 60;
}
.toggle-left:hover {
background: #f5f5f5;
width: 28px;
}
.toggle-left.hidden {
left: 0;
}
.left-sidebar.collapsed ~ .center-stage .toggle-left {
left: 0;
}
/* Modal */
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 1000;
align-items: center;
justify-content: center;
}
.modal.active {
display: flex;
}
.modal-content {
background: white;
border-radius: 12px;
padding: 32px;
max-width: 500px;
width: 90%;
position: relative;
animation: modalSlideIn 0.3s ease-out;
}
@keyframes modalSlideIn {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.modal-close {
position: absolute;
top: 16px;
right: 16px;
width: 32px;
height: 32px;
background: none;
border: none;
cursor: pointer;
font-size: 24px;
color: #666;
}
.modal-title {
font-size: 24px;
font-weight: 600;
margin-bottom: 16px;
}
.modal-description {
color: #666;
line-height: 1.6;
margin-bottom: 20px;
}
.invite-link-container {
display: flex;
gap: 12px;
margin-bottom: 20px;
}
.invite-link-input {
flex: 1;
padding: 12px;
border: 1px solid #e0e0e0;
border-radius: 6px;
font-size: 14px;
}
.copy-btn {
padding: 12px 24px;
background: #1976d2;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-weight: 600;
transition: all 0.2s;
}
.copy-btn:hover {
background: #1565c0;
}
.share-options {
display: flex;
gap: 12px;
padding-top: 20px;
border-top: 1px solid #e0e0e0;
}
.share-btn {
flex: 1;
padding: 12px;
background: #f5f5f5;
border: 1px solid #e0e0e0;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
transition: all 0.2s;
}
.share-btn:hover {
background: #e0e0e0;
}
/* Animations */
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-in {
animation: slideIn 0.3s ease-out;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #f5f5f5;
}
::-webkit-scrollbar-thumb {
background: #bdbdbd;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #9e9e9e;
}
</style>
</head>
<body>
<!-- Header -->
<div class="header">
<div class="logo">
<div class="logo-icon">🎥</div>
<span>Transmisión</span>
</div>
<div class="header-actions">
<button class="add-destination-btn">
Agregar destino 📺🔴
</button>
<button class="record-btn">Grabar</button>
</div>
</div>
<!-- Main Container -->
<div class="main-container">
<!-- Left Sidebar -->
<div class="left-sidebar" id="leftSidebar">
<div class="sidebar-header">
<div class="sidebar-title">
← Mis Escenas
</div>
<button style="background: none; border: none; cursor: pointer; font-size: 20px;"></button>
</div>
<div class="scene-list">
<div class="scene-item">
<div class="scene-preview">👤 👥</div>
<div class="scene-name">Demo scene 1</div>
</div>
<div class="scene-item active">
<div class="scene-preview"></div>
<div class="scene-name">Demo scene 2</div>
</div>
<div class="scene-item">
<div class="scene-preview">👤 👥</div>
<div class="scene-name">Demo scene 3</div>
</div>
</div>
<div style="padding: 8px;">
<button class="add-scene-btn">
<span style="font-size: 18px;">+</span>
Nueva escena
</button>
</div>
</div>
<!-- Center Stage -->
<div class="center-stage">
<!-- Toggle Left -->
<div class="toggle-left" id="toggleLeft" onclick="toggleLeftSidebar()">
<span id="toggleLeftIcon"></span>
</div>
<!-- ROW 1: Video Display -->
<div class="video-row">
<div class="video-stage">
<div class="quality-badge">720p</div>
<div class="streamyard-badge">
<span style="font-size: 9px;">Producido con</span>
<strong>StreamYard</strong>
</div>
</div>
<div class="hide-panel-btn" onclick="toggleRightSidebar()">
<span id="hideIcon"></span>
</div>
</div>
<!-- ROW 2: Layout Controls -->
<div class="layout-row">
<button class="layout-btn" title="Vista individual">👤</button>
<button class="layout-btn" title="Vista dual">👥</button>
<button class="layout-btn" title="Vista triple">👤👥</button>
<button class="layout-btn" title="Vista cuádruple">👥👥</button>
<button class="layout-btn active" title="Layouts guardados"></button>
<button class="layout-btn" title="Editar layout">✏️</button>
<button class="layout-btn" title="Agregar elemento"></button>
<button class="layout-btn" title="Configuración">⚙️</button>
</div>
<!-- ROW 3: Participants/Guests Management -->
<div class="participants-row">
<div class="participant-card">
<div class="participant-controls">
<button class="mini-control-btn" title="Configuración">🎤</button>
<button class="mini-control-btn" title="Más opciones"></button>
</div>
<div class="participant-avatar">👤</div>
<div class="participant-name">
🎤 Cesar Mendivil
</div>
</div>
<div class="invite-card" onclick="openInviteModal()">
<span style="font-size: 32px;"></span>
<span style="font-size: 14px; color: #666; font-weight: 500;">Presentar o invitar</span>
</div>
</div>
<!-- ROW 4: Video Conference Controls Footer -->
<div class="controls-footer">
<div class="controls-left">
<button class="invite-btn" onclick="openInviteModal()">
Invitar
</button>
</div>
<div class="controls-center">
<button class="control-btn active" title="Micrófono">🎤</button>
<button class="control-btn-with-menu control-btn" title="Opciones de audio">
<span></span>
</button>
<button class="control-btn active" title="Cámara">📹</button>
<button class="control-btn-with-menu control-btn" title="Opciones de video">
<span></span>
</button>
<button class="control-btn" title="Compartir pantalla">🖥️</button>
<button class="control-btn" title="Participantes">👥</button>
<button class="control-btn" title="Configuración">⚙️</button>
<button class="control-btn danger" title="Salir del estudio">🚪</button>
</div>
<div class="controls-right">
<button class="help-btn" title="¿Necesitas ayuda?"></button>
</div>
</div>
</div>
<!-- Right Sidebar -->
<div class="right-sidebar" id="rightSidebar">
<div class="right-sidebar-tabs">
<button class="tab-btn" onclick="switchTab('comments')">
<span style="font-size: 20px;">💬</span>
<span>Comentarios</span>
</button>
<button class="tab-btn" onclick="switchTab('banners')">
<span style="font-size: 20px;">🖼️</span>
<span>Banners</span>
</button>
<button class="tab-btn" onclick="switchTab('multimedia')">
<span style="font-size: 20px;">🎬</span>
<span>Activos</span>
</button>
<button class="tab-btn active" onclick="switchTab('style')">
<span style="font-size: 20px;">🎨</span>
<span>Estilo</span>
</button>
<button class="tab-btn" onclick="switchTab('notes')">
<span style="font-size: 20px;">📝</span>
<span>Notas</span>
</button>
<button class="tab-btn" onclick="switchTab('people')">
<span style="font-size: 20px;">👥</span>
<span>Personas</span>
</button>
</div>
<div class="right-sidebar-content animate-in">
<div class="brand-header">
<div class="brand-title">
🎨 Marca 1 ▼
</div>
<button style="background: none; border: none; cursor: pointer; font-size: 20px;"></button>
</div>
<div class="section-title">Panel de Estilo</div>
<p style="color: #666; font-size: 14px; line-height: 1.6;">
Personaliza la apariencia de tu transmisión con temas, colores y overlays.
</p>
</div>
</div>
</div>
<!-- Invite Modal -->
<div class="modal" id="inviteModal">
<div class="modal-content">
<button class="modal-close" onclick="closeInviteModal()">×</button>
<h2 class="modal-title">Agrega invitados al estudio</h2>
<p class="modal-description">
Envía este enlace a tus invitados. Es posible que también quieras
compartir nuestras <a href="#" style="color: #1976d2;">instrucciones para invitados</a>.
</p>
<p class="modal-description">
Puedes tener hasta 6 personas en pantalla a la vez. <a href="#" style="color: #1976d2;">Mejora tu plan</a> si necesitas más.
</p>
<div class="invite-link-container">
<input type="text" class="invite-link-input" value="https://streamyard.com/h8mjwdwf8h" readonly>
<button class="copy-btn" onclick="copyInviteLink()">Copiar</button>
</div>
<div class="share-options">
<button class="share-btn">
📧 Gmail
</button>
<button class="share-btn">
✉️ Correo electrónico
</button>
<button class="share-btn">
💬 Messenger
</button>
</div>
</div>
</div>
<script>
// Toggle Left Sidebar
function toggleLeftSidebar() {
const sidebar = document.getElementById('leftSidebar');
const icon = document.getElementById('toggleLeftIcon');
sidebar.classList.toggle('collapsed');
icon.textContent = sidebar.classList.contains('collapsed') ? '▶' : '◀';
}
// Toggle Right Sidebar
function toggleRightSidebar() {
const sidebar = document.getElementById('rightSidebar');
const icon = document.getElementById('hideIcon');
sidebar.classList.toggle('collapsed');
icon.textContent = sidebar.classList.contains('collapsed') ? '◀' : '▶';
// Remover estado activo de todas las tabs cuando se colapsa
if (sidebar.classList.contains('collapsed')) {
document.querySelectorAll('.tab-btn').forEach(t => t.classList.remove('active'));
}
}
// Switch Tab
function switchTab(tab) {
const tabs = document.querySelectorAll('.tab-btn');
const clickedTab = event.target.closest('.tab-btn');
const sidebar = document.getElementById('rightSidebar');
// Si la tab ya estaba activa, colapsar el panel
if (clickedTab.classList.contains('active') && !sidebar.classList.contains('collapsed')) {
sidebar.classList.remove('collapsed');
clickedTab.classList.remove('active');
toggleRightSidebar();
return;
}
// Activar la tab clickeada
tabs.forEach(t => t.classList.remove('active'));
clickedTab.classList.add('active');
// Abrir el sidebar si estaba cerrado
if (sidebar.classList.contains('collapsed')) {
sidebar.classList.remove('collapsed');
document.getElementById('hideIcon').textContent = '▶';
}
// Añadir animación al contenido
const content = document.querySelector('.right-sidebar-content');
content.classList.remove('animate-in');
setTimeout(() => content.classList.add('animate-in'), 10);
// Actualizar contenido según la tab
updateTabContent(tab);
}
// Update Tab Content
function updateTabContent(tab) {
const content = document.querySelector('.right-sidebar-content');
const contentMap = {
'comments': {
title: '💬 Comentarios',
description: 'Los comentarios de los espectadores en vivo se muestran en StreamYard. Esto es un ejemplo. Haz clic en un comentario para mostrarlo en la pantalla.'
},
'banners': {
title: '🖼️ Banners',
description: 'Añade banners y overlays a tu transmisión para mostrar información importante.'
},
'multimedia': {
title: '🎬 Activos multimedia',
description: 'Gestiona tus videos, imágenes y otros recursos multimedia para tu transmisión.'
},
'style': {
title: '🎨 Marca 1',
description: 'Personaliza la apariencia de tu transmisión con temas, colores y overlays.'
},
'notes': {
title: '📝 Notas',
description: 'Escribe notas y guiones para tu transmisión que solo tú puedes ver.'
},
'people': {
title: '👥 Personas',
description: 'Gestiona los participantes e invitados de tu transmisión en vivo.'
}
};
const tabData = contentMap[tab] || contentMap['style'];
content.innerHTML = `
<div class="brand-header">
<div class="brand-title">${tabData.title} ${tab === 'style' ? '▼' : ''}</div>
<button style="background: none; border: none; cursor: pointer; font-size: 20px;">⋮</button>
</div>
<div class="section-title">Panel de ${tab.charAt(0).toUpperCase() + tab.slice(1)}</div>
<p style="color: #666; font-size: 14px; line-height: 1.6;">${tabData.description}</p>
`;
}
// Open Invite Modal
function openInviteModal() {
document.getElementById('inviteModal').classList.add('active');
}
// Close Invite Modal
function closeInviteModal() {
document.getElementById('inviteModal').classList.remove('active');
}
// Copy Invite Link
function copyInviteLink() {
const input = document.querySelector('.invite-link-input');
input.select();
document.execCommand('copy');
const btn = event.target;
const originalText = btn.textContent;
btn.textContent = '✓ Copiado';
btn.style.background = '#4caf50';
setTimeout(() => {
btn.textContent = originalText;
btn.style.background = '#1976d2';
}, 2000);
}
// Close modal when clicking outside
document.getElementById('inviteModal').addEventListener('click', function(e) {
if (e.target === this) {
closeInviteModal();
}
});
// Animación de hover para botones
document.querySelectorAll('.control-btn, .layout-btn, .tab-btn').forEach(btn => {
btn.addEventListener('mouseenter', function() {
if (!this.classList.contains('danger')) {
this.style.transform = 'scale(1.05)';
}
});
btn.addEventListener('mouseleave', function() {
this.style.transform = 'scale(1)';
});
});
// Keyboard shortcuts
document.addEventListener('keydown', function(e) {
// Alt + L para toggle left sidebar
if (e.altKey && e.key === 'l') {
e.preventDefault();
toggleLeftSidebar();
}
// Alt + R para toggle right sidebar
if (e.altKey && e.key === 'r') {
e.preventDefault();
toggleRightSidebar();
}
// Escape para cerrar modal
if (e.key === 'Escape') {
closeInviteModal();
}
});
</script>
</body>
</html>