I. Estructura y Componentes Lógicos: La página web se puede descomponer en los siguientes 5 componentes lógicos modulares de React, envueltos por un `PageContainer` principal que gestiona el ancho máximo y el centrado: 1. **Header:** * **Descripción:** Contiene el logo de la marca, la navegación principal con enlaces y dropdowns, y un botón de "Get started". * **Jerarquía DOM Clave:** `
` que contiene un `
` para el logo y un `
); }; export default Header; ``` **`src/components/Header/Header.module.css`** ```css /* src/components/Header/Header.module.css */ .header { display: flex; justify-content: space-between; /* Espacia el logo y la navegación */ align-items: center; padding: 16px 20px; /* Padding interno */ height: 80px; /* Altura fija */ background-color: var(--bg-white); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); /* Sombra sutil */ position: sticky; /* Sticky header */ top: 0; z-index: 1000; /* Asegura que el header esté por encima de otros elementos */ } .logo img { height: 40px; /* Altura del logo */ width: auto; } .nav { display: flex; /* Por defecto, flex para escritorio */ } .navList { list-style: none; margin: 0; padding: 0; display: flex; align-items: center; gap: 30px; /* Espacio entre elementos de navegación */ } .navLink { text-decoration: none; color: var(--text-medium); font-weight: 500; font-size: 16px; padding: 8px 0; transition: color 0.3s ease; display: flex; align-items: center; gap: 4px; /* Espacio para el icono de chevron */ } .navLink:hover { color: var(--primary-blue); /* Color al pasar el ratón */ } .getStartedButton { background-color: var(--primary-blue); color: var(--bg-white); border: none; border-radius: var(--border-radius-button); padding: 12px 24px; font-size: 16px; font-weight: 600; cursor: pointer; transition: background-color 0.3s ease; } .getStartedButton:hover { background-color: #0056e6; /* Azul más oscuro al pasar el ratón */ } /* Estilos para el menú dropdown */ .navItemDropdown { position: relative; } .dropdownMenu { position: absolute; top: 100%; /* Debajo del elemento padre */ left: 0; background-color: var(--bg-white); box-shadow: var(--shadow-sm); border-radius: var(--border-radius-input); list-style: none; padding: 10px 0; margin-top: 5px; /* Pequeño espacio entre el link y el dropdown */ min-width: 160px; display: none; /* Oculto por defecto, se muestra con JS */ flex-direction: column; z-index: 1010; } .navItemDropdown:hover .dropdownMenu { display: flex; /* Mostrar en hover para desktop */ } .dropdownMenu li a { display: block; padding: 8px 15px; color: var(--text-medium); text-decoration: none; font-size: 15px; } .dropdownMenu li a:hover { background-color: var(--bg-light-grey); color: var(--primary-blue); } /* Menú de hamburguesa (visible solo en móvil) */ .menuToggle { display: none; /* Oculto por defecto */ background: none; border: none; cursor: pointer; padding: 0; } /* Responsive: Mobile styles */ @media (max-width: 1024px) { .navList { gap: 20px; /* Reduce el espacio entre elementos */ } } @media (max-width: 768px) { .header { padding: 16px; height: 60px; /* Reduce la altura del header en móvil */ } .nav { display: none; /* Oculta la navegación por defecto en móvil */ flex-direction: column; position: absolute; top: 60px; /* Debajo del header */ left: 0; width: 100%; background-color: var(--bg-white); box-shadow: var(--shadow-sm); padding: 20px 0; z-index: 999; /* Animación de deslizamiento */ transform: translateY(-100%); transition: transform 0.3s ease-out; } .nav.navOpen { display: flex; /* Muestra el menú cuando está abierto */ transform: translateY(0); } .navList { flex-direction: column; align-items: flex-start; gap: 10px; } .navList li { width: 100%; padding: 8px 20px; /* Padding para los ítems del menú móvil */ } .navLink { width: 100%; } .navItemDropdown { width: 100%; } .navItemDropdown:hover .dropdownMenu { display: none; /* Deshabilita el hover en mobile, se activa con click */ } .navItemDropdown .dropdownMenu { position: static; /* Cambia a posición estática para que fluya en el menú móvil */ box-shadow: none; border-radius: 0; padding-left: 20px; /* Indentación para sub-items */ margin-top: 0; display: none; /* Oculto por defecto en móvil */ } /* Mostrar dropdowns en móvil al hacer click */ .navItemDropdown:has(> a.navLink[aria-expanded="true"]) .dropdownMenu { display: flex; } .menuToggle { display: block; /* Muestra el botón de hamburguesa */ } .getStartedButton { width: calc(100% - 40px); /* Ajuste de ancho para botón en móvil */ margin: 10px 20px; text-align: center; } } ``` **`src/components/HeroSection/HeroSection.tsx`** ```tsx import React from 'react'; import styles from './HeroSection.module.css'; const HeroSection: React.FC = () => { return (

The easiest way to live stream and record

StreamYard is a professional live streaming and recording studio in your browser. Record your content, or stream live to Facebook, YouTube, and other platforms.

Or continue with email

Trusted by 12,000,000+ creators!
By continuing, you accept our User Terms of Service and{' '} Plan Usage Policy and acknowledge receipt of our{' '} Privacy Policy

Already using StreamYard? Log in.

StreamYard Interface Graphic
); }; export default HeroSection; ``` **`src/components/HeroSection/HeroSection.module.css`** ```css /* src/components/HeroSection/HeroSection.module.css */ .heroSection { display: flex; justify-content: center; align-items: center; padding: 100px 0; /* Espaciado vertical */ background: linear-gradient(to bottom, var(--light-blue-gradient-start), var(--bg-white)); /* Gradiente de fondo */ gap: 80px; /* Espacio entre el contenido de texto y el formulario */ flex-wrap: wrap; /* Permite que los elementos se envuelvan en pantallas más pequeñas */ } .heroContent { flex: 1; /* Ocupa el espacio disponible */ min-width: 300px; /* Ancho mínimo para el texto */ max-width: 600px; /* Ancho máximo para el texto */ } .heroContent h1 { font-size: var(--font-size-h1); font-weight: var(--font-weight-h1); line-height: var(--line-height-h1); color: var(--text-dark); } .heroContent p { font-size: var(--font-size-p); line-height: var(--line-height-p); color: var(--text-medium); max-width: 500px; /* Limita el ancho del párrafo */ } .heroFormContainer { position: relative; display: flex; flex-direction: column; align-items: flex-end; /* Alinea el formulario y el gráfico a la derecha */ min-width: 350px; } .heroForm { background-color: var(--bg-white); border-radius: var(--border-radius-card); /* Radio de borde para el formulario */ box-shadow: var(--shadow-sm); /* Sombra para el formulario */ padding: 30px; display: flex; flex-direction: column; gap: 15px; /* Espacio entre elementos del formulario */ width: 380px; /* Ancho fijo para el formulario */ z-index: 1; /* Asegura que el formulario esté sobre el gráfico */ } .googleButton { background-color: var(--bg-white); border: 1px solid var(--border-light); border-radius: var(--border-radius-button); padding: 12px 20px; font-size: 16px; font-weight: 500; color: var(--text-medium); display: flex; align-items: center; justify-content: center; gap: 10px; cursor: pointer; transition: background-color 0.3s ease; } .googleButton:hover { background-color: var(--bg-light-grey); } .googleLogo { height: 20px; width: 20px; } .separator { text-align: center; font-size: var(--font-size-sm); color: var(--text-light); position: relative; margin: 10px 0; } .separator::before, .separator::after { content: ''; position: absolute; top: 50%; width: 40%; height: 1px; background-color: var(--border-light); } .separator::before { left: 0; } .separator::after { right: 0; } .emailInput { border: 1px solid var(--border-light); border-radius: var(--border-radius-input); padding: 14px 15px; font-size: 16px; width: calc(100% - 30px); /* Ajusta el ancho por el padding */ } .emailInput:focus { outline: none; border-color: var(--primary-blue); box-shadow: 0 0 0 2px rgba(0, 102, 255, 0.2); } .getStartedButton { background-color: var(--primary-blue); color: var(--bg-white); border: none; border-radius: var(--border-radius-button); padding: 16px 20px; font-size: 18px; font-weight: 600; cursor: pointer; transition: background-color 0.3s ease; } .getStartedButton:hover { background-color: #0056e6; } .formFooterText { font-size: 13px; color: var(--text-light); text-align: center; margin-top: 10px; } .formFooterText a, .loginText a { color: var(--primary-blue); text-decoration: none; } .loginText { font-size: var(--font-size-sm); color: var(--text-medium); text-align: center; margin-top: 15px; } .heroGraphic { position: absolute; top: -80px; /* Posiciona el gráfico flotando por encima del formulario */ right: -100px; /* Ajusta la posición del gráfico */ width: 450px; /* Tamaño del gráfico */ height: auto; opacity: 0.8; /* Transparencia para que parezca de fondo */ z-index: 0; /* Detrás del formulario */ filter: blur(1px); /* Ligero desenfoque */ } /* Responsive adjustments */ @media (max-width: 1024px) { .heroSection { flex-direction: column; /* Apila el contenido y el formulario */ padding: 80px 0; gap: 50px; } .heroContent { text-align: center; max-width: 90%; margin: 0 auto; } .heroContent h1 { font-size: 52px; } .heroContent p { font-size: 17px; } .heroFormContainer { align-items: center; /* Centra el formulario */ min-width: unset; width: 100%; } .heroForm { width: 85%; /* El formulario ocupa más ancho en móviles */ max-width: 450px; /* Limita el ancho del formulario */ } .heroGraphic { position: static; /* Quita el posicionamiento absoluto en móvil */ margin-top: 30px; width: 80%; max-width: 400px; opacity: 1; filter: none; } } @media (max-width: 768px) { .heroSection { padding: 60px 0; } .heroContent h1 { font-size: 40px; } .heroForm { width: 95%; /* Aún más ancho en pantallas más pequeñas */ padding: 20px; } } @media (max-width: 480px) { .heroContent h1 { font-size: 32px; } .heroContent p { font-size: 16px; } } ``` **`src/components/FeaturesGrid/FeaturesGrid.tsx`** ```tsx import React, { useState, useRef } from 'react'; import styles from './FeaturesGrid.module.css'; // Mock data for features const features = [ { id: 1, name: 'Recording', icon: 'https://via.placeholder.com/64?text=Rec' }, { id: 2, name: 'Multistream', icon: 'https://via.placeholder.com/64?text=Multi' }, { id: 3, name: 'Guests', icon: 'https://via.placeholder.com/64?text=Guests' }, { id: 4, name: 'Branding', icon: 'https://via.placeholder.com/64?text=Brand' }, { id: 5, name: 'Podcasts', icon: 'https://via.placeholder.com/64?text=Pod' }, { id: 6, name: 'Webinars', icon: 'https://via.placeholder.com/64?text=Web' }, { id: 7, name: 'Analytics', icon: 'https://via.placeholder.com/64?text=Anal' }, ]; const FeaturesGrid: React.FC = () => { const scrollRef = useRef(null); const scroll = (direction: 'left' | 'right') => { if (scrollRef.current) { const scrollAmount = 300; // Cantidad de desplazamiento if (direction === 'left') { scrollRef.current.scrollBy({ left: -scrollAmount, behavior: 'smooth' }); } else { scrollRef.current.scrollBy({ left: scrollAmount, behavior: 'smooth' }); } } }; return (

Explore powerful features

Discover how StreamYard can elevate your live streams and recordings.

{/* Flecha de navegación izquierda */}
{features.map((feature) => (
{feature.name}

{feature.name}

))}
{/* Flecha de navegación derecha */}
); }; export default FeaturesGrid; ``` **`src/components/FeaturesGrid/FeaturesGrid.module.css`** ```css /* src/components/FeaturesGrid/FeaturesGrid.module.css */ .featuresSection { padding: 100px 0; /* Espaciado vertical */ background-color: var(--bg-light-grey); /* Fondo sutil */ text-align: center; /* Centra el texto */ } .featuresHeader { margin-bottom: 50px; } .featuresHeader h2 { margin-bottom: 10px; } .featuresHeader p { font-size: var(--font-size-p); color: var(--text-medium); } .carouselContainer { position: relative; max-width: 1200px; /* Ancho máximo para el carrusel */ margin: 0 auto; display: flex; align-items: center; } .featuresGrid { display: flex; overflow-x: auto; /* Permite el desplazamiento horizontal */ -webkit-overflow-scrolling: touch; /* Suaviza el scroll en iOS */ scroll-snap-type: x mandatory; /* Ajuste para el scroll-snap */ gap: 30px; /* Espacio entre las tarjetas */ padding: 20px; /* Padding para evitar que las tarjetas toquen los bordes */ margin: 0 -20px; /* Compensa el padding para que el contenido fluya */ scrollbar-width: none; /* Oculta la barra de desplazamiento en Firefox */ } /* Oculta la barra de desplazamiento en Chrome/Safari */ .featuresGrid::-webkit-scrollbar { display: none; } .featureCard { flex: 0 0 auto; /* No permite que las tarjetas se encojan */ width: 220px; /* Ancho fijo de la tarjeta */ height: 220px; /* Altura fija para que sean cuadradas */ background-color: var(--bg-white); border-radius: var(--border-radius-card); box-shadow: var(--shadow-sm); display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 20px; text-align: center; scroll-snap-align: start; /* Alineación para el scroll-snap */ transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; } .featureCard:hover { transform: translateY(-5px); /* Pequeño efecto de elevación */ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1); } .featureIcon { width: 64px; /* Tamaño del icono */ height: 64px; margin-bottom: 15px; } .featureCard h3 { font-size: 20px; font-weight: 600; color: var(--text-dark); margin: 0; } .navArrow { position: absolute; top: 50%; transform: translateY(-50%); background-color: var(--bg-white); border: 1px solid var(--border-light); border-radius: 50%; /* Botones circulares */ width: 50px; height: 50px; display: flex; justify-content: center; align-items: center; font-size: 24px; cursor: pointer; z-index: 10; box-shadow: var(--shadow-sm); transition: background-color 0.3s ease, transform 0.3s ease; } .navArrow:hover { background-color: var(--bg-light-grey); transform: translateY(-50%) scale(1.05); } .leftArrow { left: -25px; /* Posicionar fuera del grid */ } .rightArrow { right: -25px; /* Posicionar fuera del grid */ } /* Responsive adjustments */ @media (max-width: 1280px) { .leftArrow { left: 0px; /* Mueve las flechas dentro del padding del contenedor principal */ } .rightArrow { right: 0px; } } @media (max-width: 768px) { .featuresSection { padding: 60px 0; } .featuresGrid { gap: 20px; /* Reduce el espacio entre tarjetas */ padding: 15px; margin: 0 -15px; } .featureCard { width: 180px; /* Reduce el tamaño de las tarjetas */ height: 180px; padding: 15px; } .featureIcon { width: 50px; height: 50px; } .featureCard h3 { font-size: 18px; } .navArrow { width: 40px; height: 40px; font-size: 20px; } } @media (max-width: 480px) { .featuresHeader h2 { font-size: 32px; } .featuresHeader p { font-size: 16px; } .featuresGrid { padding: 10px; margin: 0 -10px; } .featureCard { width: 150px; /* Aún más pequeñas */ height: 150px; } .navArrow { display: none; /* Oculta las flechas si el scroll es el método principal */ } } ``` **`src/components/ContentDetailsSection/ContentDetailsSection.tsx`** ```tsx import React, { useState } from 'react'; import styles from './ContentDetailsSection.module.css'; // Mock component for Play/Pause icon const PlayIcon = () => ( ); const PauseIcon = () => ( ); const ContentDetailsSection: React.FC = () => { const [isPlayingAudio, setIsPlayingAudio] = useState(false); const [audioProgress, setAudioProgress] = useState(0); // Simula la reproducción de audio const handlePlayPauseAudio = () => { setIsPlayingAudio(!isPlayingAudio); if (!isPlayingAudio) { // Simular progreso let currentProgress = 0; const interval = setInterval(() => { currentProgress += 10; // Incrementa el progreso if (currentProgress > 100) { currentProgress = 0; setIsPlayingAudio(false); clearInterval(interval); } setAudioProgress(currentProgress); }, 500); // Actualiza cada 0.5 segundos } else { setAudioProgress(0); // Reinicia si se pausa } }; return (
{/* Sección 1: Go live or record podcasts with remote guests */}

Go live or record podcasts with remote guests

It's easy for guests to join from their browser or phone in a few clicks. No software downloads.

Learn more →
Remote Guests
{/* Sección 2: Studio quality recordings on any connection */}
Studio Quality
Click to hear the difference

Studio quality recordings on any connection

Sick of Zoom and Skype ruining your podcast? With local recordings, a separate audio and video file is recorded on each user's device. Even if someone has weak internet, the recordings won't be blurry or choppy.

Discover more →
{/* Sección 3: Multistream to all platforms at once */}

Multistream to all platforms at once

Stream to Facebook, YouTube, Instagram, LinkedIn, X (Twitter), Twitch, and more. Make your audience feel special by featuring their comments on screen.

See all integrations →
Multistream
{/* Sección 4: Move your webinars to StreamYard On-Air */}
Webinars

Move your webinars to StreamYard On-Air

StreamYard On-Air is a live webinar platform. We're redefining webinar stability, simplicity, and production quality. You can even embed it on your website for a fully white-label experience.

See why everyone is switching →
); }; export default ContentDetailsSection; ``` **`src/components/ContentDetailsSection/ContentDetailsSection.module.css`** ```css /* src/components/ContentDetailsSection/ContentDetailsSection.module.css */ .contentDetailsSection { padding: 0; /* Las secciones internas manejan su propio padding */ } .contentBlock { display: flex; align-items: center; gap: 80px; /* Espacio entre columnas */ padding: 100px 0; /* Espaciado vertical entre bloques */ margin-bottom: 0; /* Cada bloque es una sección, no necesita margen inferior extra */ flex-wrap: wrap; /* Permite envolver columnas en pantallas pequeñas */ } /* Fondos de sección */ .bgPink { background-color: var(--accent-pink); } .bgPurple { background-color: var(--accent-purple); color: var(--bg-white); /* Texto blanco para fondo oscuro */ } .bgPurple h2, .bgPurple p, .bgPurple .learnMoreLink { color: var(--bg-white); } .bgYellow { background-color: var(--accent-yellow); } .bgBlueish { background-color: #EBF7FF; /* Un azul muy claro */ } .textColumn { flex: 1; /* Ocupa el espacio disponible */ min-width: 300px; max-width: 600px; /* Limita el ancho del texto */ } .imageColumn { flex: 1; /* Ocupa el espacio disponible */ min-width: 300px; display: flex; justify-content: center; /* Centra la imagen dentro de su columna */ align-items: center; } .contentImage { max-width: 100%; /* Asegura que la imagen no se desborde */ height: auto; border-radius: var(--border-radius-card); box-shadow: var(--shadow-sm); } .reverseLayout { flex-direction: row-reverse; /* Invierte el orden de las columnas */ } .learnMoreLink { color: var(--primary-blue); text-decoration: none; font-weight: 600; transition: color 0.3s ease; display: inline-flex; align-items: center; gap: 5px; margin-top: 15px; } .bgPurple .learnMoreLink { color: var(--bg-white); } .learnMoreLink:hover { color: #0047b3; /* Azul más oscuro al pasar el ratón */ } /* Estilos para el reproductor de audio simulado */ .audioPlayer { position: relative; width: 100%; max-width: 500px; /* Ancho máximo para el reproductor */ border-radius: var(--border-radius-card); box-shadow: var(--shadow-sm); overflow: hidden; /* Asegura que la imagen y los controles respeten el borde */ } .audioPlayer .contentImage { border-radius: 0; /* La imagen no necesita borde-radius si el contenedor ya lo tiene */ display: block; /* Elimina espacios extra debajo de la imagen */ } .audioControls { position: absolute; bottom: 20px; left: 20px; right: 20px; background-color: rgba(255, 255, 255, 0.9); /* Fondo semitransparente para los controles */ border-radius: var(--border-radius-button); padding: 10px 15px; display: flex; align-items: center; gap: 15px; box-shadow: var(--shadow-sm); } .playPauseButton { background: none; border: none; color: var(--primary-blue); cursor: pointer; padding: 0; display: flex; align-items: center; } .playPauseButton svg { width: 30px; height: 30px; } .progressBarContainer { flex-grow: 1; height: 8px; background-color: var(--border-light); border-radius: 4px; overflow: hidden; } .progressBar { height: 100%; background-color: var(--primary-blue); width: 0%; /* Controlado por el estado de React */ transition: width 0.1s linear; /* Animación suave para el progreso */ } .audioLabel { font-size: var(--font-size-sm); color: var(--text-medium); white-space: nowrap; /* Evita que el texto se rompa */ } /* Responsive adjustments */ @media (max-width: 1024px) { .contentBlock { flex-direction: column; /* Apila las columnas */ text-align: center; padding: 80px 0; gap: 40px; } .reverseLayout { flex-direction: column; /* También apila en layout invertido */ } .textColumn, .imageColumn { max-width: 90%; /* Ajusta el ancho para móvil */ margin: 0 auto; /* Centra las columnas */ } .audioControls { bottom: 15px; left: 15px; right: 15px; padding: 8px 10px; gap: 10px; } .playPauseButton svg { width: 25px; height: 25px; } .audioLabel { font-size: 12px; } } @media (max-width: 768px) { .contentBlock { padding: 60px 0; gap: 30px; } .textColumn h2 { font-size: 32px; } .textColumn p { font-size: 16px; } } @media (max-width: 480px) { .textColumn h2 { font-size: 28px; } } ``` **`src/components/CallToActionSection/CallToActionSection.tsx`** ```tsx import React from 'react'; import styles from './CallToActionSection.module.css'; const CallToActionSection: React.FC = () => { return (

Get creating.

Join millions of StreamYard users and start streaming or podcasting today.

); }; export default CallToActionSection; ``` **`src/components/CallToActionSection/CallToActionSection.module.css`** ```css /* src/components/CallToActionSection/CallToActionSection.module.css */ .ctaSection { background-color: var(--primary-blue); /* Fondo azul */ /* Imagen de fondo sutil con patrón geométrico */ background-image: url('data:image/svg+xml;utf8,'); background-size: 200px 200px; /* Tamaño del patrón */ color: var(--bg-white); /* Texto blanco */ text-align: center; padding: 120px 20px; /* Espaciado interno */ margin-top: 100px; /* Espacio superior para separar de la sección anterior */ } .ctaContent { max-width: 700px; /* Ancho máximo para el contenido del CTA */ margin: 0 auto; } .ctaContent h2 { font-size: var(--font-size-h2); color: var(--bg-white); margin-bottom: 25px; } .ctaButton { background-color: var(--bg-white); /* Botón blanco sobre fondo azul */ color: var(--primary-blue); border: none; border-radius: var(--border-radius-button); padding: 18px 36px; font-size: 20px; font-weight: 700; cursor: pointer; transition: background-color 0.3s ease, transform 0.3s ease; margin-bottom: 20px; } .ctaButton:hover { background-color: #f0f0f0; /* Ligero cambio de color al pasar el ratón */ transform: translateY(-2px); /* Pequeño efecto de elevación */ } .ctaContent p { font-size: var(--font-size-p); color: rgba(255, 255, 255, 0.8); /* Texto más claro */ margin: 0; } /* Responsive adjustments */ @media (max-width: 768px) { .ctaSection { padding: 80px 16px; margin-top: 80px; } .ctaContent h2 { font-size: 36px; margin-bottom: 20px; } .ctaButton { padding: 16px 30px; font-size: 18px; } .ctaContent p { font-size: 16px; } } @media (max-width: 480px) { .ctaSection { padding: 60px 16px; margin-top: 60px; } .ctaContent h2 { font-size: 30px; } .ctaButton { padding: 14px 24px; font-size: 16px; } } ```