### **TEMPLATE HTML5, CSS3, JS BASADO EN STREAMYARD.COM** Este template busca replicar la estructura modular, la estética "pixel-perfect" y las funcionalidades clave observadas. --- #### **1. HTML5 (Estructura Modular)** Este es un ejemplo de cómo podrías estructurar una página principal, incorporando componentes y secciones comunes. Las páginas específicas (como `/login`, `/signup`, artículos de blog) tendrían variaciones en la sección `
`. ```html StreamYard Clon - La manera más sencilla de grabar y transmitir en vivo

La manera más sencilla de grabar y transmitir en vivo

StreamYard es un estudio profesional para grabar y hacer transmisiones en vivo desde tu navegador...

Al continuar, aceptas nuestros Términos de Servicio del Usuario y Política de Uso del Plan.

Descripción de la característica

Transmite en vivo o graba podcasts con invitados remotos

Los invitados pueden unirse fácilmente desde su navegador o teléfono en unos pocos clics...

Saber más →

Grabaciones con calidad de estudio, independientemente de tu conexión

¿Te cansaste de que tus podcasts queden arruinados con Zoom y Skype?...

Saber más →
Descripción de la característica

"Me impresionó el increíble producto y la tecnología de StreamYard. Me permite mandar mi mensaje al mundo."

Gary Vaynerchuk Empresario

Empieza a crear.

Únete a millones de usuarios de StreamYard y empieza con tus transmisiones o tu podcast hoy mismo.

``` --- #### **2. CSS3 (Estilos Globales y de Componentes)** `css/styles.css` ```css /* Variables CSS para consistencia de colores y fuentes */ :root { --primary-blue: #1877F2; /* Un azul típico de CTA/enlaces */ --secondary-blue: #007bff; /* Otro tono de azul */ --light-blue-bg: #EAF0F6; /* Fondo azul claro, como el de las secciones */ --dark-blue-bg: #0C1322; /* Fondo azul oscuro */ --white: rgb(255, 255, 255); --black: rgb(0, 0, 0); --text-color-dark: rgb(27, 31, 41); /* Para texto principal */ --text-color-medium: rgb(80, 88, 104); /* Para párrafos generales */ --text-color-light: rgb(105, 110, 124); /* Texto más claro */ --font-family-base: "AvertaStd-Regular", Arial, "Noto Sans JP", Prompt, sans-serif; --spacing-unit: 1rem; /* 16px */ } /* Base Global Styles (Métricas Pixel-Perfect Consistentes) */ html { scroll-behavior: smooth; } body { margin: 0; font-family: var(--font-family-base); color: var(--text-color-medium); background-color: var(--white); line-height: 1.6; } .container { max-width: 1200px; margin: 0 auto; padding: 0 var(--spacing-unit); } h1, h2, h3, h4, h5, h6 { font-family: var(--font-family-base); /* Consistente con el body */ color: var(--text-color-dark); margin-top: 0; line-height: 1.2; } h1 { font-size: 3rem; color: var(--black); } /* Puede variar, como en el blog */ h2 { font-size: 2.5rem; } h3 { font-size: 2rem; } p { margin-bottom: 1rem; } a { color: var(--primary-blue); text-decoration: none; } a:hover { text-decoration: underline; } .btn { display: inline-block; padding: 0.8rem 1.5rem; border-radius: 5px; font-weight: bold; text-align: center; cursor: pointer; transition: background-color 0.3s ease; border: none; } .btn-primary { background-color: var(--primary-blue); color: var(--white); } .btn-primary:hover { background-color: darken(var(--primary-blue), 10%); /* Usar una función darken si se usa preprocesador, o un color fijo */ text-decoration: none; } .btn-secondary { background-color: var(--secondary-blue); /* O un color de contraste, como el azul más oscuro en el CTA */ color: var(--white); } .btn-secondary:hover { background-color: darken(var(--secondary-blue), 10%); text-decoration: none; } .text-link { color: var(--primary-blue); text-decoration: none; font-weight: bold; } .text-link:hover { text-decoration: underline; } /* Header Section */ .header-section { background-color: var(--white); padding: var(--spacing-unit) 0; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); position: sticky; /* Navegación pegajosa */ top: 0; z-index: 1000; } .header-content { display: flex; justify-content: space-between; align-items: center; } .logo img { height: 40px; /* Tamaño del logo */ } /* Navigation */ .main-navigation ul { list-style: none; margin: 0; padding: 0; display: flex; align-items: center; } .main-navigation ul li { position: relative; margin-left: 20px; } .main-navigation ul li a { color: var(--text-color-dark); font-weight: 500; padding: 10px 0; display: block; } .main-navigation ul li a:hover { color: var(--primary-blue); text-decoration: none; } /* Dropdown */ .main-navigation .dropdown { display: none; position: absolute; background-color: var(--white); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); min-width: 180px; z-index: 1; padding: 10px 0; border-radius: 5px; } .main-navigation ul li:hover > .dropdown { display: block; } .main-navigation .dropdown li { margin: 0; } .main-navigation .dropdown a { padding: 8px 20px; white-space: nowrap; } .nav-toggle { display: none; /* Oculto en desktop */ background: none; border: none; font-size: 2rem; cursor: pointer; color: var(--text-color-dark); } /* Hero Section */ .hero-section { padding: 4rem 0; text-align: center; background-color: var(--light-blue-bg); /* O blanco puro, dependiendo de la página */ } .hero-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; align-items: center; text-align: left; } .hero-content h1 { color: var(--black); margin-bottom: 1rem; } .hero-content p { font-size: 1.1rem; margin-bottom: 2rem; } .cta-form { display: flex; flex-direction: column; /* Cambiar a row en desktop */ gap: 1rem; margin-bottom: 1rem; } .cta-form input[type="email"] { padding: 0.8rem 1rem; border: 1px solid #ccc; border-radius: 5px; font-size: 1rem; } .terms-text { font-size: 0.85rem; color: var(--text-color-light); } /* Feature Sections */ .feature-section { padding: 6rem 0; background-color: var(--white); } .feature-section.light-bg { background-color: var(--light-blue-bg); } .feature-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4rem; align-items: center; } .feature-grid.reverse-grid { grid-template-areas: "content image"; } .feature-grid.reverse-grid .feature-image { grid-area: image; } .feature-grid.reverse-grid .feature-content { grid-area: content; } .feature-image img { max-width: 100%; height: auto; display: block; } .feature-content h2 { font-size: 2.2rem; margin-bottom: 1.5rem; } /* Blog Section */ .blog-section { padding: 6rem 0; background-color: var(--dark-blue-bg); color: var(--white); text-align: center; } .blog-section h2 { color: var(--white); margin-bottom: 3rem; } .blog-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2rem; margin-bottom: 3rem; } .blog-post-card { background-color: var(--white); border-radius: 8px; overflow: hidden; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); text-align: left; } .blog-post-card img { width: 100%; height: 200px; object-fit: cover; } .blog-post-card h3 { font-size: 1.3rem; padding: 1.5rem 1rem 0.5rem; color: var(--text-color-dark); } .blog-post-card h3 a { color: var(--text-color-dark); } .blog-post-card h3 a:hover { color: var(--primary-blue); text-decoration: none; } .blog-post-card .read-more { display: inline-block; padding: 0 1rem 1.5rem; color: var(--primary-blue); font-weight: bold; } /* Testimonial Section */ .testimonial-section { padding: 6rem 0; text-align: center; background-color: var(--white); /* Puede ser light-bg también */ } .testimonial-slider { max-width: 800px; /* Para centrar y limitar el ancho del testimonio */ margin: 0 auto; } .testimonial-card { padding: 2rem; background-color: #f9f9f9; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); } .testimonial-card p { font-size: 1.4rem; font-style: italic; color: var(--text-color-dark); margin-bottom: 1.5rem; } .testimonial-card .author { display: block; font-weight: bold; color: var(--primary-blue); margin-bottom: 0.3rem; } .testimonial-card .role { font-size: 0.9rem; color: var(--text-color-medium); } /* Call to Action Banner */ .cta-banner { padding: 5rem 0; background-color: var(--primary-blue); /* o un azul más oscuro */ color: var(--white); text-align: center; } .cta-banner h2 { color: var(--white); font-size: 2.5rem; margin-bottom: 1.5rem; } .cta-banner .btn { margin-bottom: 1rem; } .cta-banner p { font-size: 1.1rem; opacity: 0.9; } /* Footer Section */ .footer-section { background-color: var(--dark-blue-bg); color: var(--white); padding: 4rem 0 2rem; } .footer-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 2rem; margin-bottom: 3rem; } .footer-col .footer-logo img { height: 30px; margin-bottom: 1rem; } .footer-col h4 { color: var(--white); font-size: 1.1rem; margin-bottom: 1rem; } .footer-col ul { list-style: none; padding: 0; margin: 0; } .footer-col ul li { margin-bottom: 0.7rem; } .footer-col ul li a { color: var(--white); opacity: 0.8; transition: opacity 0.3s ease; } .footer-col ul li a:hover { opacity: 1; text-decoration: underline; } .footer-bottom { border-top: 1px solid rgba(255, 255, 255, 0.1); padding-top: 2rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 1rem; font-size: 0.9rem; } .footer-bottom p { margin: 0; opacity: 0.7; } .footer-bottom .legal-links { display: flex; gap: 1.5rem; list-style: none; padding: 0; margin: 0; } .footer-bottom .legal-links a { color: var(--white); opacity: 0.7; } .footer-bottom .legal-links a:hover { opacity: 1; text-decoration: underline; } /* Cookie Consent Modal */ .cookie-modal { position: fixed; bottom: 0; left: 0; width: 100%; background-color: rgba(0, 0, 0, 0.8); color: var(--white); padding: 1.5rem; text-align: center; z-index: 2000; transform: translateY(100%); transition: transform 0.3s ease-in-out; } .cookie-modal.show { transform: translateY(0); } .cookie-modal.hidden { display: none; /* Asegura que no ocupe espacio cuando está oculto */ } .cookie-content { max-width: 900px; margin: 0 auto; display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 1rem; } .cookie-content p { margin: 0; flex-grow: 1; font-size: 0.95rem; } .cookie-content a { color: var(--primary-blue); text-decoration: underline; } .cookie-content .btn { flex-shrink: 0; } /* Responsive Design */ @media (max-width: 992px) { .hero-grid, .feature-grid { grid-template-columns: 1fr; text-align: center; } .hero-grid .hero-image, .feature-grid .feature-image { order: -1; /* Mueve la imagen arriba en móvil */ } .feature-grid.reverse-grid { grid-template-areas: none; /* Reset para móviles */ } .feature-grid.reverse-grid .feature-image, .feature-grid.reverse-grid .feature-content { grid-area: unset; } .cta-form { flex-direction: column; } .main-navigation .nav-links { display: none; flex-direction: column; width: 100%; position: absolute; top: 100%; left: 0; background-color: var(--white); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); padding-bottom: 1rem; } .main-navigation .nav-links.active { display: flex; } .main-navigation ul li { margin: 0; width: 100%; text-align: center; } .main-navigation ul li a { padding: 15px 0; border-bottom: 1px solid #eee; } .main-navigation ul li:last-child a { border-bottom: none; } .main-navigation .nav-toggle { display: block; } .main-navigation .dropdown { position: static; box-shadow: none; padding: 0; border-radius: 0; width: 100%; background-color: #f8f8f8; } .main-navigation .dropdown a { padding-left: 40px; /* Indent dropdown items */ } .footer-bottom { flex-direction: column; } .footer-bottom .legal-links { flex-direction: column; gap: 0.5rem; text-align: center; } } @media (max-width: 768px) { h1 { font-size: 2.5rem; } h2 { font-size: 2rem; } .hero-section { padding: 3rem 0; } .feature-section { padding: 4rem 0; } .blog-section { padding: 4rem 0; } .cta-banner { padding: 4rem 0; } .footer-section { padding: 3rem 0; } } ``` --- #### **3. JavaScript (Funcionalidades Clave)** `js/main.js` ```javascript document.addEventListener('DOMContentLoaded', () => { // 1. Navegación Pegajosa (Sticky Header) const header = document.getElementById('main-header'); if (header) { let lastScrollY = window.scrollY; window.addEventListener('scroll', () => { if (window.scrollY > header.offsetHeight && window.scrollY > lastScrollY) { // Scrolling down, hide header (o hacerla más compacta) header.classList.add('header-scrolled'); } else { // Scrolling up, show header header.classList.remove('header-scrolled'); } lastScrollY = window.scrollY; }); } // 2. Navegación Móvil (Menú Hamburguesa) const navToggle = document.querySelector('.nav-toggle'); const navLinks = document.querySelector('.nav-links'); if (navToggle && navLinks) { navToggle.addEventListener('click', () => { navLinks.classList.toggle('active'); navToggle.setAttribute('aria-expanded', navLinks.classList.contains('active')); }); // Cerrar menú si se hace clic fuera (opcional) document.addEventListener('click', (event) => { if (!navLinks.contains(event.target) && !navToggle.contains(event.target) && navLinks.classList.contains('active')) { navLinks.classList.remove('active'); navToggle.setAttribute('aria-expanded', 'false'); } }); } // 3. Modal de Consentimiento de Cookies const cookieModal = document.getElementById('cookie-consent-modal'); const acceptCookiesBtn = document.getElementById('accept-cookies'); const cookieName = 'streamyard_cookie_consent'; // Función para mostrar el modal de cookies function showCookieModal() { if (cookieModal && !localStorage.getItem(cookieName)) { cookieModal.classList.add('show'); cookieModal.classList.remove('hidden'); // Asegura que se muestre } else if (cookieModal) { cookieModal.classList.add('hidden'); // Ocultar si ya aceptó cookieModal.classList.remove('show'); } } // Función para ocultar y guardar preferencia function hideCookieModal() { if (cookieModal) { cookieModal.classList.remove('show'); cookieModal.classList.add('hidden'); localStorage.setItem(cookieName, 'accepted'); } } if (acceptCookiesBtn) { acceptCookiesBtn.addEventListener('click', hideCookieModal); } showCookieModal(); // Mostrar el modal al cargar la página si no ha aceptado // 4. Placeholder para Validación de Formularios (Ej. en Login/Signup) const ctaForm = document.querySelector('.cta-form'); if (ctaForm) { const emailInput = ctaForm.querySelector('input[type="email"]'); const submitButton = ctaForm.querySelector('.btn-secondary'); if (submitButton && emailInput) { submitButton.addEventListener('click', (event) => { // event.preventDefault(); // Descomentar para prevenir envío automático y hacer validación JS if (!emailInput.value || !emailInput.value.includes('@')) { alert('Por favor, ingresa un correo electrónico válido.'); // emailInput.focus(); return false; } // Si la validación pasa, el formulario se enviaría (o se realizaría una llamada AJAX) // console.log('Formulario válido, enviando...'); }); } } // 5. Placeholder para Carrusel/Slider (si aplica en testimonial-slider) // Esto sería una implementación más compleja con librerías como Swiper.js, Slick Carousel, etc. // Ejemplo de un carrusel muy básico (sin funcionalidad de desplazamiento real, solo estructura) const testimonialSlider = document.querySelector('.testimonial-slider'); if (testimonialSlider) { // Podrías inicializar una librería de carrusel aquí // console.log('Inicializando carrusel de testimonios...'); // Por ejemplo, con Swiper: /* new Swiper(testimonialSlider, { slidesPerView: 1, spaceBetween: 30, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, pagination: { el: '.swiper-pagination', clickable: true, }, }); */ } // 6. Carga Diferida (Lazy Loading) para imágenes (Concepto) // Para imágenes que están más abajo en la página. // `...` const lazyImages = document.querySelectorAll('img[data-src]'); if ('IntersectionObserver' in window) { let lazyImageObserver = new IntersectionObserver((entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { let lazyImage = entry.target; lazyImage.src = lazyImage.dataset.src; lazyImage.removeAttribute('data-src'); lazyImageObserver.unobserve(lazyImage); } }); }); lazyImages.forEach((lazyImage) => { lazyImageObserver.observe(lazyImage); }); } else { // Fallback para navegadores antiguos lazyImages.forEach((lazyImage) => { lazyImage.src = lazyImage.dataset.src; lazyImage.removeAttribute('data-src'); }); } }); // Puedes añadir más scripts específicos aquí si los necesitas para otras páginas, // o cargarlos condicionalmente. ``` --- #### **Consideraciones Adicionales para el Desarrollo:** * **Fuentes Personalizadas:** La fuente `AvertaStd-Regular` se asume como una fuente que necesitarías cargar (ya sea a través de Google Fonts si hay una alternativa similar, o mediante `@font-face` si es un archivo de fuente personalizado). Para el template, he puesto un `link` a `Google Fonts` como ejemplo, pero si no existe, deberías gestionarlo con un `@font-face` en tu CSS. * **Imágenes:** Las rutas `img/` son placeholders. Deberías reemplazarlas con tus propias imágenes. * **Modularidad Avanzada:** Para un proyecto grande, considera usar un framework o librería de componentes (React, Vue, Angular) o un generador de sitios estáticos (Next.js, Gatsby) para gestionar la complejidad y la reutilización de componentes de forma más eficiente. * **Preprocesadores CSS:** Para la función `darken()` en el CSS, necesitarías un preprocesador como Sass o Less. Si no, usa valores de color hexadecimal/RGB predefinidos. * **Scripts Dinámicos del Servidor:** Funcionalidades como "Iniciar sesión" o "Registrarse" implican un backend. El JavaScript proporcionado es solo para la lógica del lado del cliente. * **Accesibilidad (A11y):** He incluido `aria-label` para el botón de navegación, pero un sitio web completo requeriría una auditoría y mejoras de accesibilidad más profundas. * **Optimización:** Considera la optimización de imágenes, la minificación de CSS/JS y el uso de CDNs para mejorar el rendimiento en producción. Este template te proporciona una base sólida que refleja la estructura y el diseño de StreamYard.com, permitiéndote construir un sitio con una estética y funcionalidad consistentes.