Valeria Fanning — 19
-"Pensé que jamás volvería a danzar... pero MEDUSYS me devolvió mis alas."
-Pierna biónica de alta sensibilidad, sincronizada con su sistema nervioso.
-From 7642cbf19649bfb1e32932e269e772f6e1386ec3 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 02:34:11 +0000 Subject: [PATCH 1/2] I have copied the project files from `/tmp/file_attachments/MEDUSYS` to the current directory. I lowered the `z-index` of the neuron nodes and increased it for the active content section. --- app.js | 477 ++++++++++++++++++++++++++++++++++++----------------- index.html | 205 ++++++++++------------- styles.css | 383 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 765 insertions(+), 300 deletions(-) diff --git a/app.js b/app.js index c6ddd11..a753755 100644 --- a/app.js +++ b/app.js @@ -2,6 +2,12 @@ class NeuronNavigation { constructor() { this.currentSection = 'hero'; this.isZoomed = false; + this.heartRotation = 0; + this.heartScale = 1; + this.connections = []; + this.pulsePositions = new Map(); + this.connectionIntensity = 0.8; // Intensidad base muy alta + this.pulseSize = 6; // Tamaño del pulso aumentado this.init(); } @@ -13,7 +19,9 @@ class NeuronNavigation { this.setup3DModel(); this.setupStoryInteractions(); this.setupTechInteractions(); - this.setupCreditInteractions(); + this.setupScanner(); + this.setupTimeline(); + this.calculateConnections(); this.animate(); } @@ -21,7 +29,10 @@ class NeuronNavigation { this.canvas = document.getElementById('neuronCanvas'); this.ctx = this.canvas.getContext('2d'); this.resizeCanvas(); - window.addEventListener('resize', () => this.resizeCanvas()); + window.addEventListener('resize', () => { + this.resizeCanvas(); + this.calculateConnections(); + }); } resizeCanvas() { @@ -29,6 +40,39 @@ class NeuronNavigation { this.canvas.height = window.innerHeight; } + calculateConnections() { + this.connections = []; + this.pulsePositions.clear(); + + const nodes = Array.from(this.nodes); + + // Crear conexiones entre todos los nodos (red completa) + for (let i = 0; i < nodes.length; i++) { + for (let j = i + 1; j < nodes.length; j++) { + const node1 = nodes[i]; + const node2 = nodes[j]; + + const rect1 = node1.getBoundingClientRect(); + const rect2 = node2.getBoundingClientRect(); + + const x1 = rect1.left + rect1.width / 2; + const y1 = rect1.top + rect1.height / 2; + const x2 = rect2.left + rect2.width / 2; + const y2 = rect2.top + rect2.height / 2; + + const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); + + // Conectar todos los nodos sin importar la distancia + const connection = { + x1, y1, x2, y2, distance, + pulse: Math.random() * distance // Posición inicial aleatoria del pulso + }; + this.connections.push(connection); + this.pulsePositions.set(connection, connection.pulse); + } + } + } + setupNodes() { this.nodes = document.querySelectorAll('.neuron-node'); this.sections = document.querySelectorAll('.content-section'); @@ -48,12 +92,23 @@ class NeuronNavigation { this.navigateToSection(targetNode); }); }); + + // Recalcular conexiones cuando los nodos se muevan + const observer = new MutationObserver(() => { + setTimeout(() => this.calculateConnections(), 100); + }); + + this.nodes.forEach(node => { + observer.observe(node, { + attributes: true, + attributeFilter: ['style'] + }); + }); } navigateToSection(sectionId, clickedNode = null) { if (this.currentSection === sectionId && this.isZoomed) return; - // Efecto glitch especial para Contexto 2040 if (sectionId === 'contexto') { this.triggerGlitchEffect(); } @@ -85,14 +140,18 @@ class NeuronNavigation { } }); + // Recalcular conexiones después de la transición + setTimeout(() => this.calculateConnections(), 500); this.playNavigationSound(); } triggerGlitchEffect() { - this.glitchOverlay.classList.add('active'); - setTimeout(() => { - this.glitchOverlay.classList.remove('active'); - }, 500); + if (this.glitchOverlay) { + this.glitchOverlay.classList.add('active'); + setTimeout(() => { + this.glitchOverlay.classList.remove('active'); + }, 500); + } } triggerSectionAnimations(sectionId) { @@ -106,15 +165,18 @@ class NeuronNavigation { case 'historias': this.animateHistoriasSection(); break; + case 'corazon': + this.animateCorazonSection(); + break; } } animateContextoSection() { - const storyItems = document.querySelectorAll('.story-item'); - storyItems.forEach((item, index) => { + const timelineItems = document.querySelectorAll('.timeline-item'); + timelineItems.forEach((item, index) => { setTimeout(() => { item.classList.add('active'); - }, index * 500); + }, index * 600); }); } @@ -138,42 +200,55 @@ class NeuronNavigation { }); } - setupStoryInteractions() { - // Interacción con items de la línea de tiempo - const storyItems = document.querySelectorAll('.story-item'); - storyItems.forEach(item => { - item.addEventListener('mouseenter', () => { + animateCorazonSection() { + const heartParts = document.querySelectorAll('.heart-part'); + heartParts.forEach((part, index) => { + setTimeout(() => { + part.style.opacity = '1'; + part.style.transform = 'scale(1)'; + }, index * 200); + }); + } + + setupTimeline() { + const timelineItems = document.querySelectorAll('.timeline-item'); + timelineItems.forEach(item => { + item.addEventListener('click', () => { const year = item.getAttribute('data-year'); - this.highlightTimelineYear(year); + this.activateTimelineItem(year); }); }); + } + + activateTimelineItem(year) { + const timelineItems = document.querySelectorAll('.timeline-item'); + timelineItems.forEach(item => { + item.classList.remove('active'); + if (item.getAttribute('data-year') === year) { + item.classList.add('active'); + } + }); + } - // Interacción con tarjetas de historias + setupStoryInteractions() { const storyCards = document.querySelectorAll('.story-card'); storyCards.forEach(card => { card.addEventListener('mouseenter', () => { const person = card.getAttribute('data-person'); this.activatePersonEffect(person); }); - }); - } - highlightTimelineYear(year) { - const storyItems = document.querySelectorAll('.story-item'); - storyItems.forEach(item => { - item.classList.remove('active'); - if (item.getAttribute('data-year') === year) { - item.classList.add('active'); - } + card.addEventListener('mouseleave', () => { + this.deactivatePersonEffects(); + }); }); } activatePersonEffect(person) { - // Activar efectos visuales específicos para cada persona const effects = { - valeria: () => this.pulseProsthesis('leg'), - guadalupe: () => this.beatHeart(), - fermin: () => this.scanArm() + valeria: () => this.highlightConnections('historias'), + guadalupe: () => this.highlightConnections('corazon'), + fermin: () => this.highlightConnections('tecnologia') }; if (effects[person]) { @@ -181,23 +256,23 @@ class NeuronNavigation { } } - pulseProsthesis(limb) { - console.log(`Activando efecto de pulso para ${limb}`); - // El efecto visual se maneja via CSS - } - - beatHeart() { - console.log('Activando efecto de latido cardíaco'); - // El efecto visual se maneja via CSS + deactivatePersonEffects() { + // Restaurar todas las conexiones a su estado normal + this.connections.forEach(conn => { + conn.highlighted = false; + }); } - scanArm() { - console.log('Activando efecto de escaneo de brazo'); - // El efecto visual se maneja via CSS + highlightConnections(targetSection) { + // Resaltar conexiones relacionadas con la sección específica + this.connections.forEach(conn => { + // Aquí podrías implementar una lógica para resaltar conexiones específicas + // Por ahora, resaltamos todas para demostración + conn.highlighted = true; + }); } setupTechInteractions() { - // Interacción con items de tecnología const techItems = document.querySelectorAll('.tech-item'); techItems.forEach(item => { item.addEventListener('mouseenter', () => { @@ -213,7 +288,6 @@ class NeuronNavigation { activateTechEffect(type) { console.log(`Activando efecto tecnológico: ${type}`); - // Los efectos se manejan principalmente via CSS } setup3DModel() { @@ -222,41 +296,38 @@ class NeuronNavigation { this.infoPanels = document.querySelectorAll('.info-panel'); this.controls = document.querySelectorAll('.control-btn'); - let rotation = 0; - let scale = 1; - - this.controls.forEach(control => { - control.addEventListener('click', (e) => { - const action = e.target.getAttribute('data-action'); - - switch(action) { - case 'rotate': - rotation += 45; - break; - case 'zoom-in': - scale = Math.min(scale + 0.1, 2); - break; - case 'reset': - rotation = 0; - scale = 1; - break; - } - - this.heartModel.style.transform = `rotateY(${rotation}deg) scale(${scale})`; + if (this.heartModel) { + this.controls.forEach(control => { + control.addEventListener('click', (e) => { + const action = e.target.getAttribute('data-action'); + + switch(action) { + case 'rotate': + this.heartRotation += 45; + break; + case 'zoom-in': + this.heartScale = Math.min(this.heartScale + 0.1, 2); + break; + case 'reset': + this.heartRotation = 0; + this.heartScale = 1; + break; + } + + this.heartModel.style.transform = `rotateY(${this.heartRotation}deg) scale(${this.heartScale})`; + }); }); - }); - // Interacción con partes del corazón - this.heartParts.forEach(part => { - part.addEventListener('click', (e) => { - const partInfo = e.target.getAttribute('data-info'); - this.showPartInfo(partInfo); - - // Resaltar la parte clickeada - this.heartParts.forEach(p => p.classList.remove('active')); - e.target.classList.add('active'); + this.heartParts.forEach(part => { + part.addEventListener('click', (e) => { + const partInfo = e.target.getAttribute('data-info'); + this.showPartInfo(partInfo); + + this.heartParts.forEach(p => p.classList.remove('active')); + e.target.classList.add('active'); + }); }); - }); + } } showPartInfo(partInfo) { @@ -268,19 +339,59 @@ class NeuronNavigation { }); } - setupCreditInteractions() { - const creditNodes = document.querySelectorAll('.credit-node'); - creditNodes.forEach(node => { - node.addEventListener('mouseenter', () => { - const person = node.getAttribute('data-person'); - this.highlightTeamMember(person); + setupScanner() { + const startScanBtn = document.getElementById('startScan'); + const scanProgress = document.querySelector('.scan-progress'); + const scanResults = document.getElementById('scanResults'); + const organMarkers = document.querySelectorAll('.organ-marker'); + + if (startScanBtn) { + startScanBtn.addEventListener('click', () => { + startScanBtn.disabled = true; + startScanBtn.textContent = 'Escaneando...'; + if (scanProgress) scanProgress.classList.add('scanning'); + + setTimeout(() => { + startScanBtn.disabled = false; + startScanBtn.textContent = 'Iniciar Escaneo'; + if (scanProgress) scanProgress.classList.remove('scanning'); + + if (scanResults) { + scanResults.innerHTML = ` +
Perfil biológico compatible con nuestras soluciones:
+Recomendación: Contactar con nuestro equipo médico
+ `; + scanResults.classList.add('visible'); + } + }, 3000); + }); + } + + organMarkers.forEach(marker => { + marker.addEventListener('click', (e) => { + const organ = e.target.getAttribute('data-organ'); + this.highlightOrgan(organ); }); }); } - highlightTeamMember(person) { - console.log(`Destacando miembro del equipo: ${person}`); - // Podrías añadir efectos adicionales aquí + highlightOrgan(organ) { + console.log(`Órgano seleccionado: ${organ}`); + const markers = document.querySelectorAll('.organ-marker'); + markers.forEach(marker => { + marker.style.background = 'var(--primary)'; + marker.style.transform = 'scale(1)'; + if (marker.getAttribute('data-organ') === organ) { + marker.style.background = 'var(--lilac)'; + marker.style.transform = 'scale(1.5)'; + } + }); } navigateBack() { @@ -299,6 +410,7 @@ class NeuronNavigation { if (section.id === 'hero-content') { setTimeout(() => { section.classList.add('active'); + this.calculateConnections(); // Recalcular conexiones al volver }, 300); } }); @@ -306,9 +418,11 @@ class NeuronNavigation { setupBackButton() { const backBtn = document.getElementById('backButton'); - backBtn.addEventListener('click', () => { - this.navigateBack(); - }); + if (backBtn) { + backBtn.addEventListener('click', () => { + this.navigateBack(); + }); + } document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && this.isZoomed) { @@ -320,82 +434,122 @@ class NeuronNavigation { setupAudio() { this.audio = document.getElementById('ambientAudio'); this.audioToggle = document.getElementById('audioToggle'); - this.isAudioPlaying = false; - this.audioToggle.addEventListener('click', () => { - if (this.isAudioPlaying) { - this.audio.pause(); - this.audioToggle.style.background = 'var(--glass)'; - } else { - this.audio.play().catch(e => console.log('Audio play failed:', e)); - this.audioToggle.style.background = 'var(--primary)'; - } - this.isAudioPlaying = !this.isAudioPlaying; - }); + if (this.audio && this.audioToggle) { + this.isAudioPlaying = false; + + this.audioToggle.addEventListener('click', () => { + if (this.isAudioPlaying) { + this.audio.pause(); + this.audioToggle.style.background = 'var(--glass)'; + } else { + this.audio.play().catch(e => console.log('Audio play failed:', e)); + this.audioToggle.style.background = 'var(--primary)'; + } + this.isAudioPlaying = !this.isAudioPlaying; + }); - this.audio.volume = 0.3; + this.audio.volume = 0.3; + } } playNavigationSound() { - const audioContext = new (window.AudioContext || window.webkitAudioContext)(); - const oscillator = audioContext.createOscillator(); - const gainNode = audioContext.createGain(); - - oscillator.connect(gainNode); - gainNode.connect(audioContext.destination); - - oscillator.frequency.setValueAtTime(400, audioContext.currentTime); - oscillator.frequency.exponentialRampToValueAtTime(600, audioContext.currentTime + 0.1); - - gainNode.gain.setValueAtTime(0.1, audioContext.currentTime); - gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.3); - - oscillator.start(); - oscillator.stop(audioContext.currentTime + 0.3); + try { + const audioContext = new (window.AudioContext || window.webkitAudioContext)(); + const oscillator = audioContext.createOscillator(); + const gainNode = audioContext.createGain(); + + oscillator.connect(gainNode); + gainNode.connect(audioContext.destination); + + oscillator.frequency.setValueAtTime(400, audioContext.currentTime); + oscillator.frequency.exponentialRampToValueAtTime(600, audioContext.currentTime + 0.1); + + gainNode.gain.setValueAtTime(0.1, audioContext.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.3); + + oscillator.start(); + oscillator.stop(audioContext.currentTime + 0.3); + } catch (e) { + console.log('Audio context not supported:', e); + } } drawNeuronalConnections() { + // Limpiar canvas this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); - if (this.isZoomed) return; - - this.ctx.strokeStyle = 'rgba(147, 185, 224, 0.2)'; - this.ctx.lineWidth = 1; - - this.nodes.forEach((node1, i) => { - const rect1 = node1.getBoundingClientRect(); - const x1 = rect1.left + rect1.width / 2; - const y1 = rect1.top + rect1.height / 2; + // Configuración para líneas más visibles + this.ctx.lineCap = 'round'; + this.ctx.shadowBlur = 15; + + // Dibujar conexiones principales MUY VISIBLES + this.connections.forEach(connection => { + // Línea base MUY GRUESA y brillante + if (connection.highlighted) { + this.ctx.strokeStyle = 'rgba(196, 162, 252, 0.9)'; + this.ctx.lineWidth = 6; + this.ctx.shadowColor = 'rgba(196, 162, 252, 0.8)'; + } else { + this.ctx.strokeStyle = 'rgba(147, 185, 224, 0.8)'; + this.ctx.lineWidth = 4; + this.ctx.shadowColor = 'rgba(147, 185, 224, 0.6)'; + } - this.nodes.forEach((node2, j) => { - if (i < j) { - const rect2 = node2.getBoundingClientRect(); - const x2 = rect2.left + rect2.width / 2; - const y2 = rect2.top + rect2.height / 2; - - const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); - - if (distance < 400) { - this.ctx.beginPath(); - this.ctx.moveTo(x1, y1); - this.ctx.lineTo(x2, y2); - this.ctx.stroke(); - - const pulseSpeed = 0.001; - const pulse = (Date.now() * pulseSpeed) % distance; - - this.ctx.fillStyle = 'rgba(196, 162, 252, 0.8)'; - this.ctx.beginPath(); - this.ctx.arc( - x1 + (x2 - x1) * (pulse / distance), - y1 + (y2 - y1) * (pulse / distance), - 3, 0, Math.PI * 2 - ); - this.ctx.fill(); - } - } - }); + // Línea principal + this.ctx.beginPath(); + this.ctx.moveTo(connection.x1, connection.y1); + this.ctx.lineTo(connection.x2, connection.y2); + this.ctx.stroke(); + + // Pulsos MUY GRANDES y brillantes + const pulseSpeed = 0.004; + let currentPulse = this.pulsePositions.get(connection) || 0; + currentPulse = (currentPulse + pulseSpeed * connection.distance) % connection.distance; + this.pulsePositions.set(connection, currentPulse); + + const pulseX = connection.x1 + (connection.x2 - connection.x1) * (currentPulse / connection.distance); + const pulseY = connection.y1 + (connection.y2 - connection.y1) * (currentPulse / connection.distance); + + // Efecto de pulso TRIPLE para máxima visibilidad + if (connection.highlighted) { + // Capa exterior - gran resplandor + this.ctx.fillStyle = 'rgba(196, 162, 252, 0.4)'; + this.ctx.beginPath(); + this.ctx.arc(pulseX, pulseY, 12, 0, Math.PI * 2); + this.ctx.fill(); + + // Capa media + this.ctx.fillStyle = 'rgba(255, 255, 255, 0.7)'; + this.ctx.beginPath(); + this.ctx.arc(pulseX, pulseY, 8, 0, Math.PI * 2); + this.ctx.fill(); + + // Núcleo + this.ctx.fillStyle = 'rgba(255, 255, 255, 1)'; + this.ctx.beginPath(); + this.ctx.arc(pulseX, pulseY, 4, 0, Math.PI * 2); + this.ctx.fill(); + } else { + // Pulso normal pero muy visible + this.ctx.fillStyle = 'rgba(147, 185, 224, 0.5)'; + this.ctx.beginPath(); + this.ctx.arc(pulseX, pulseY, 10, 0, Math.PI * 2); + this.ctx.fill(); + + this.ctx.fillStyle = 'rgba(255, 255, 255, 0.8)'; + this.ctx.beginPath(); + this.ctx.arc(pulseX, pulseY, 6, 0, Math.PI * 2); + this.ctx.fill(); + + this.ctx.fillStyle = 'rgba(255, 255, 255, 1)'; + this.ctx.beginPath(); + this.ctx.arc(pulseX, pulseY, 3, 0, Math.PI * 2); + this.ctx.fill(); + } }); + + this.ctx.shadowBlur = 0; } animate() { @@ -404,7 +558,24 @@ class NeuronNavigation { } } -// Inicializar la aplicación +// Inicializar la aplicación cuando el DOM esté listo document.addEventListener('DOMContentLoaded', () => { new NeuronNavigation(); -}); \ No newline at end of file +}); + +// Agregar estilos CSS dinámicos para animaciones +const dynamicStyles = ` + @keyframes neuronPulse { + 0% { transform: scale(1); opacity: 0.7; } + 50% { transform: scale(1.1); opacity: 1; } + 100% { transform: scale(1); opacity: 0.7; } + } + + .neuron-node.connection-highlight .node-core { + animation: neuronPulse 1.5s ease-in-out infinite; + } +`; + +const styleSheet = document.createElement('style'); +styleSheet.textContent = dynamicStyles; +document.head.appendChild(styleSheet);s diff --git a/index.html b/index.html index 85cb3ac..a695828 100644 --- a/index.html +++ b/index.html @@ -3,17 +3,17 @@ -Órganos y prótesis inteligentes entre lo biológico y lo sintético.
+Órganos y prótesis inteligentes entre lo biológico y lo sintético.
Corporación mexicana de biotecnología dedicada a crear órganos y prótesis inteligentes. Respuesta a una realidad post-2040, donde la vida exige nuevas formas de cuidado y reconstrucción.
+Corporación mexicana de biotecnología dedicada a crear órganos y prótesis inteligentes. Respuesta a una realidad post-2040, donde la vida exige nuevas formas de cuidado y reconstrucción.
-Pérdida masiva de órganos tras la guerra biotecnológica entre Rusia y EE.UU.
- -Pérdida masiva de órganos tras la guerra biotecnológica
+Millones requieren reconstrucción orgánica inmediata
Nace la respuesta mexicana a la crisis global
Líderes en biotecnología y evolución
+ +Ecosistema de sensores, datos y alertas que se adaptan a cada usuario.
-Control de alta precisión con respuesta a impulsos neuronales.
-Diseño fluido que respira con el cuerpo y el movimiento.
"Pensé que jamás volvería a danzar... pero MEDUSYS me devolvió mis alas."
-Pierna biónica de alta sensibilidad, sincronizada con su sistema nervioso.
-"Vi morir a mis pacientes esperando un trasplante. Con MEDUSYS, eso cambió."
-Órganos que se adaptan con el mismo ADN del portador.
-"Mi brazo responde como si fuera real, pero con fuerza sobrehumana."
-Brazo inteligente, adaptable y conectado, capaz de responder a impulsos neuronales.
-Bailarina
+"Pensé que jamás volvería a danzar... pero MEDUSYS me devolvió mis alas."+
Pierna biónica de alta sensibilidad, sincronizada con su sistema nervioso.
+Cardióloga
+"Vi morir a mis pacientes esperando un trasplante. Con MEDUSYS, eso cambió."+
Órganos que se adaptan con el mismo ADN del portador.
+Trabajador de Obra
+"Perdí la posibilidad de solventar a mi familia, MEDUSYS me reconectó con la vida."+
Brazo inteligente, adaptable y conectado, capaz de responder a impulsos neuronales.
Corazón sintético con inteligencia adaptativa y biocompatibilidad total. Diseñado para integrarse perfectamente con el sistema biológico del huésped.
+Corazón sintético con inteligencia adaptativa y biocompatibilidad total
+Recreación biomimética con tejido adaptativo para bombeo asistido. Sistema de propulsión magnética que simula el pulso cardiaco natural con precisión milimétrica.
+Sistema de bombeo principal con sensores de presión integrados
Material sintético que imita la textura y función celular, garantizando la compatibilidad total con el ADN del portador. Regeneración autónoma del tejido.
+Material biocompatible que se integra perfectamente con el cuerpo
Conexión directa con el sistema nervioso para respuesta autónoma. Control de alta precisión con retroalimentación en tiempo real.
-Superficie inteligente que se integra perfectamente con los tejidos del huésped. Permite el intercambio de nutrientes y oxígeno de manera natural.
+Control inteligente del flujo sanguíneo con ajuste automático
Escanea tu perfil biológico para encontrar la solución perfecta
-Definir los límites de la vida humana.
-Establecer el nuevo estándar de la evolución humana asistida.
-Directora de Innovación
-Líder de Biotecnología
+Director Médico
+Perfil biológico compatible con nuestras soluciones:
-Recomendación: Contactar con nuestro equipo médico
- `; - scanResults.classList.add('visible'); - } - }, 3000); - }); - } - - organMarkers.forEach(marker => { - marker.addEventListener('click', (e) => { - const organ = e.target.getAttribute('data-organ'); - this.highlightOrgan(organ); + setupCreditInteractions() { + const creditNodes = document.querySelectorAll('.credit-node'); + creditNodes.forEach(node => { + node.addEventListener('mouseenter', () => { + const person = node.getAttribute('data-person'); + this.highlightTeamMember(person); }); }); } - highlightOrgan(organ) { - console.log(`Órgano seleccionado: ${organ}`); - const markers = document.querySelectorAll('.organ-marker'); - markers.forEach(marker => { - marker.style.background = 'var(--primary)'; - marker.style.transform = 'scale(1)'; - if (marker.getAttribute('data-organ') === organ) { - marker.style.background = 'var(--lilac)'; - marker.style.transform = 'scale(1.5)'; - } - }); + highlightTeamMember(person) { + console.log(`Destacando miembro del equipo: ${person}`); + // Podrías añadir efectos adicionales aquí } navigateBack() { @@ -410,7 +299,6 @@ class NeuronNavigation { if (section.id === 'hero-content') { setTimeout(() => { section.classList.add('active'); - this.calculateConnections(); // Recalcular conexiones al volver }, 300); } }); @@ -418,11 +306,9 @@ class NeuronNavigation { setupBackButton() { const backBtn = document.getElementById('backButton'); - if (backBtn) { - backBtn.addEventListener('click', () => { - this.navigateBack(); - }); - } + backBtn.addEventListener('click', () => { + this.navigateBack(); + }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && this.isZoomed) { @@ -434,122 +320,82 @@ class NeuronNavigation { setupAudio() { this.audio = document.getElementById('ambientAudio'); this.audioToggle = document.getElementById('audioToggle'); + this.isAudioPlaying = false; - if (this.audio && this.audioToggle) { - this.isAudioPlaying = false; - - this.audioToggle.addEventListener('click', () => { - if (this.isAudioPlaying) { - this.audio.pause(); - this.audioToggle.style.background = 'var(--glass)'; - } else { - this.audio.play().catch(e => console.log('Audio play failed:', e)); - this.audioToggle.style.background = 'var(--primary)'; - } - this.isAudioPlaying = !this.isAudioPlaying; - }); + this.audioToggle.addEventListener('click', () => { + if (this.isAudioPlaying) { + this.audio.pause(); + this.audioToggle.style.background = 'var(--glass)'; + } else { + this.audio.play().catch(e => console.log('Audio play failed:', e)); + this.audioToggle.style.background = 'var(--primary)'; + } + this.isAudioPlaying = !this.isAudioPlaying; + }); - this.audio.volume = 0.3; - } + this.audio.volume = 0.3; } playNavigationSound() { - try { - const audioContext = new (window.AudioContext || window.webkitAudioContext)(); - const oscillator = audioContext.createOscillator(); - const gainNode = audioContext.createGain(); + const audioContext = new (window.AudioContext || window.webkitAudioContext)(); + const oscillator = audioContext.createOscillator(); + const gainNode = audioContext.createGain(); - oscillator.connect(gainNode); - gainNode.connect(audioContext.destination); + oscillator.connect(gainNode); + gainNode.connect(audioContext.destination); - oscillator.frequency.setValueAtTime(400, audioContext.currentTime); - oscillator.frequency.exponentialRampToValueAtTime(600, audioContext.currentTime + 0.1); + oscillator.frequency.setValueAtTime(400, audioContext.currentTime); + oscillator.frequency.exponentialRampToValueAtTime(600, audioContext.currentTime + 0.1); - gainNode.gain.setValueAtTime(0.1, audioContext.currentTime); - gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.3); + gainNode.gain.setValueAtTime(0.1, audioContext.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.3); - oscillator.start(); - oscillator.stop(audioContext.currentTime + 0.3); - } catch (e) { - console.log('Audio context not supported:', e); - } + oscillator.start(); + oscillator.stop(audioContext.currentTime + 0.3); } drawNeuronalConnections() { - // Limpiar canvas this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); - // Configuración para líneas más visibles - this.ctx.lineCap = 'round'; - this.ctx.shadowBlur = 15; - - // Dibujar conexiones principales MUY VISIBLES - this.connections.forEach(connection => { - // Línea base MUY GRUESA y brillante - if (connection.highlighted) { - this.ctx.strokeStyle = 'rgba(196, 162, 252, 0.9)'; - this.ctx.lineWidth = 6; - this.ctx.shadowColor = 'rgba(196, 162, 252, 0.8)'; - } else { - this.ctx.strokeStyle = 'rgba(147, 185, 224, 0.8)'; - this.ctx.lineWidth = 4; - this.ctx.shadowColor = 'rgba(147, 185, 224, 0.6)'; - } + if (this.isZoomed) return; + + this.ctx.strokeStyle = 'rgba(147, 185, 224, 0.2)'; + this.ctx.lineWidth = 1; + + this.nodes.forEach((node1, i) => { + const rect1 = node1.getBoundingClientRect(); + const x1 = rect1.left + rect1.width / 2; + const y1 = rect1.top + rect1.height / 2; - // Línea principal - this.ctx.beginPath(); - this.ctx.moveTo(connection.x1, connection.y1); - this.ctx.lineTo(connection.x2, connection.y2); - this.ctx.stroke(); - - // Pulsos MUY GRANDES y brillantes - const pulseSpeed = 0.004; - let currentPulse = this.pulsePositions.get(connection) || 0; - currentPulse = (currentPulse + pulseSpeed * connection.distance) % connection.distance; - this.pulsePositions.set(connection, currentPulse); - - const pulseX = connection.x1 + (connection.x2 - connection.x1) * (currentPulse / connection.distance); - const pulseY = connection.y1 + (connection.y2 - connection.y1) * (currentPulse / connection.distance); - - // Efecto de pulso TRIPLE para máxima visibilidad - if (connection.highlighted) { - // Capa exterior - gran resplandor - this.ctx.fillStyle = 'rgba(196, 162, 252, 0.4)'; - this.ctx.beginPath(); - this.ctx.arc(pulseX, pulseY, 12, 0, Math.PI * 2); - this.ctx.fill(); - - // Capa media - this.ctx.fillStyle = 'rgba(255, 255, 255, 0.7)'; - this.ctx.beginPath(); - this.ctx.arc(pulseX, pulseY, 8, 0, Math.PI * 2); - this.ctx.fill(); - - // Núcleo - this.ctx.fillStyle = 'rgba(255, 255, 255, 1)'; - this.ctx.beginPath(); - this.ctx.arc(pulseX, pulseY, 4, 0, Math.PI * 2); - this.ctx.fill(); - } else { - // Pulso normal pero muy visible - this.ctx.fillStyle = 'rgba(147, 185, 224, 0.5)'; - this.ctx.beginPath(); - this.ctx.arc(pulseX, pulseY, 10, 0, Math.PI * 2); - this.ctx.fill(); - - this.ctx.fillStyle = 'rgba(255, 255, 255, 0.8)'; - this.ctx.beginPath(); - this.ctx.arc(pulseX, pulseY, 6, 0, Math.PI * 2); - this.ctx.fill(); - - this.ctx.fillStyle = 'rgba(255, 255, 255, 1)'; - this.ctx.beginPath(); - this.ctx.arc(pulseX, pulseY, 3, 0, Math.PI * 2); - this.ctx.fill(); - } + this.nodes.forEach((node2, j) => { + if (i < j) { + const rect2 = node2.getBoundingClientRect(); + const x2 = rect2.left + rect2.width / 2; + const y2 = rect2.top + rect2.height / 2; + + const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); + + if (distance < 400) { + this.ctx.beginPath(); + this.ctx.moveTo(x1, y1); + this.ctx.lineTo(x2, y2); + this.ctx.stroke(); + + const pulseSpeed = 0.001; + const pulse = (Date.now() * pulseSpeed) % distance; + + this.ctx.fillStyle = 'rgba(196, 162, 252, 0.8)'; + this.ctx.beginPath(); + this.ctx.arc( + x1 + (x2 - x1) * (pulse / distance), + y1 + (y2 - y1) * (pulse / distance), + 3, 0, Math.PI * 2 + ); + this.ctx.fill(); + } + } + }); }); - - this.ctx.shadowBlur = 0; } animate() { @@ -558,24 +404,7 @@ class NeuronNavigation { } } -// Inicializar la aplicación cuando el DOM esté listo +// Inicializar la aplicación document.addEventListener('DOMContentLoaded', () => { new NeuronNavigation(); -}); - -// Agregar estilos CSS dinámicos para animaciones -const dynamicStyles = ` - @keyframes neuronPulse { - 0% { transform: scale(1); opacity: 0.7; } - 50% { transform: scale(1.1); opacity: 1; } - 100% { transform: scale(1); opacity: 0.7; } - } - - .neuron-node.connection-highlight .node-core { - animation: neuronPulse 1.5s ease-in-out infinite; - } -`; - -const styleSheet = document.createElement('style'); -styleSheet.textContent = dynamicStyles; -document.head.appendChild(styleSheet);s +}); \ No newline at end of file diff --git a/index.html b/index.html index a695828..1a9ca4a 100644 --- a/index.html +++ b/index.html @@ -3,17 +3,17 @@ -Órganos y prótesis inteligentes entre lo biológico y lo sintético.
+Órganos y prótesis inteligentes entre lo biológico y lo sintético.
Corporación mexicana de biotecnología dedicada a crear órganos y prótesis inteligentes. Respuesta a una realidad post-2040, donde la vida exige nuevas formas de cuidado y reconstrucción.
+Corporación mexicana de biotecnología dedicada a crear órganos y prótesis inteligentes. Respuesta a una realidad post-2040, donde la vida exige nuevas formas de cuidado y reconstrucción.
-Pérdida masiva de órganos tras la guerra biotecnológica
-Pérdida masiva de órganos tras la guerra biotecnológica entre Rusia y EE.UU.
+ +Millones requieren reconstrucción orgánica inmediata
Nace la respuesta mexicana a la crisis global
Líderes en biotecnología y evolución
- -Ecosistema de sensores, datos y alertas que se adaptan a cada usuario.
+Control de alta precisión con respuesta a impulsos neuronales.
+Diseño fluido que respira con el cuerpo y el movimiento.
Bailarina
-"Pensé que jamás volvería a danzar... pero MEDUSYS me devolvió mis alas."-
Pierna biónica de alta sensibilidad, sincronizada con su sistema nervioso.
-Cardióloga
-"Vi morir a mis pacientes esperando un trasplante. Con MEDUSYS, eso cambió."-
Órganos que se adaptan con el mismo ADN del portador.
-Trabajador de Obra
-"Perdí la posibilidad de solventar a mi familia, MEDUSYS me reconectó con la vida."-
Brazo inteligente, adaptable y conectado, capaz de responder a impulsos neuronales.
+"Pensé que jamás volvería a danzar... pero MEDUSYS me devolvió mis alas."
+Pierna biónica de alta sensibilidad, sincronizada con su sistema nervioso.
+"Vi morir a mis pacientes esperando un trasplante. Con MEDUSYS, eso cambió."
+Órganos que se adaptan con el mismo ADN del portador.
+"Mi brazo responde como si fuera real, pero con fuerza sobrehumana."
+Brazo inteligente, adaptable y conectado, capaz de responder a impulsos neuronales.
+Corazón sintético con inteligencia adaptativa y biocompatibilidad total
-Corazón sintético con inteligencia adaptativa y biocompatibilidad total. Diseñado para integrarse perfectamente con el sistema biológico del huésped.
Sistema de bombeo principal con sensores de presión integrados
+Recreación biomimética con tejido adaptativo para bombeo asistido. Sistema de propulsión magnética que simula el pulso cardiaco natural con precisión milimétrica.
Material biocompatible que se integra perfectamente con el cuerpo
+Material sintético que imita la textura y función celular, garantizando la compatibilidad total con el ADN del portador. Regeneración autónoma del tejido.
Control inteligente del flujo sanguíneo con ajuste automático
+Conexión directa con el sistema nervioso para respuesta autónoma. Control de alta precisión con retroalimentación en tiempo real.
+Superficie inteligente que se integra perfectamente con los tejidos del huésped. Permite el intercambio de nutrientes y oxígeno de manera natural.
Escanea tu perfil biológico para encontrar la solución perfecta
+Definir los límites de la vida humana.
+Establecer el nuevo estándar de la evolución humana asistida.
+Directora de Innovación
+Líder de Biotecnología
Director Médico