otros:contacto
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| otros:contacto [2026/05/06 10:58] – jesus | otros:contacto [2026/05/06 17:39] (actual) – jesus | ||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| < | < | ||
| < | < | ||
| - | .pcw-page-container { background:# | + | .pcw-page-container { background:# |
| | | ||
| - | /* --- HARDWARE MODEM PCWWIKI --- */ | + | /* --- HARDWARE MODEM PCWWIKI |
| .modem-chassis { | .modem-chassis { | ||
| - | background: #1a1a1a; width: 440px; margin: 0 auto 35px; border-radius: | + | background: # |
| + | width: 95%; /* Ancho flexible para móvil */ | ||
| + | max-width: 440px; | ||
| + | | ||
| border: 1.5px solid #333; border-top: 2px solid #444; | border: 1.5px solid #333; border-top: 2px solid #444; | ||
| box-shadow: 0 0 1px rgba(255, | box-shadow: 0 0 1px rgba(255, | ||
| - | display: flex; align-items: | + | display: flex; align-items: |
| + | box-sizing: border-box; /* Evita que el padding rompa el ancho */ | ||
| } | } | ||
| + | | ||
| + | .sch-brand-white { | ||
| + | color: #ffffff; font-family: | ||
| + | font-size: 13px; letter-spacing: | ||
| + | } | ||
| + | |||
| .led-bezel { | .led-bezel { | ||
| - | background: #0a0a0a; padding: | + | background: #0a0a0a; padding: |
| - | display: flex; gap: 12px; box-shadow: inset 0 2px 5px rgba(0, | + | display: flex; gap: 10px; box-shadow: inset 0 2px 5px rgba(0, |
| } | } | ||
| - | .sch-brand-white { color: #ffffff; font-family: | + | |
| - | .m-led { width: | + | .m-led { width: |
| .m-led span { position: absolute; top: 14px; left: 50%; transform: translateX(-50%); | .m-led span { position: absolute; top: 14px; left: 50%; transform: translateX(-50%); | ||
| | | ||
| Línea 23: | Línea 33: | ||
| .led-yellow { background:# | .led-yellow { background:# | ||
| - | .pwr-btn { width: | + | .pwr-btn { |
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| @keyframes pwr-blink { 50% { border-color:# | @keyframes pwr-blink { 50% { border-color:# | ||
| .active-btn { animation: | .active-btn { animation: | ||
| - | .contact-box { border: 2px solid #004400; padding: | + | |
| - | .line-in { opacity: 0; transform: translateX(-5px); | + | |
| + | | ||
| + | | ||
| + | word-wrap: break-word; /* Para que el texto no se salga en móvil */ | ||
| + | | ||
| + | .line-in { opacity: 0; transform: translateX(-5px); | ||
| .block-line { display: block; margin-bottom: | .block-line { display: block; margin-bottom: | ||
| .line-visible { opacity: 1 !important; transform: translateX(0) !important; } | .line-visible { opacity: 1 !important; transform: translateX(0) !important; } | ||
| - | .email-link { color: #fff !important; font-size: 1.6em; text-decoration: | + | |
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | /* AJUSTE PARA PANTALLAS MUY PEQUEÑAS */ | ||
| + | @media (max-width: 400px) { | ||
| + | .sch-brand-white { font-size: 11px; } | ||
| + | .led-bezel { gap: 6px; padding: 5px 8px; } | ||
| + | .m-led { width: 8px; height: 8px; } | ||
| + | .pwr-btn { width: 35px; } | ||
| + | | ||
| </ | </ | ||
| <div class=" | <div class=" | ||
| <div class=" | <div class=" | ||
| - | <div class=" | + | <div class=" |
| <div class=" | <div class=" | ||
| <div id=" | <div id=" | ||
| Línea 75: | Línea 108: | ||
| function playDTMF(digit, | function playDTMF(digit, | ||
| if(abortComm) return; | if(abortComm) return; | ||
| - | const freqs = { ' | + | const freqs = { |
| - | const f = freqs[digit] ||; | + | |
| + | | ||
| + | | ||
| + | const f = freqs[digit] || [0,0]; | ||
| f.forEach(hz => { | f.forEach(hz => { | ||
| let o = aCtx.createOscillator(); | let o = aCtx.createOscillator(); | ||
| Línea 85: | Línea 121: | ||
| } | } | ||
| - | // ÚNICO SINTETIZADOR DE DATOS CON FRECUENCIA DINÁMICA | ||
| function playModemChirp(dur, | function playModemChirp(dur, | ||
| if(abortComm || !aCtx) return; | if(abortComm || !aCtx) return; | ||
| let now = aCtx.currentTime; | let now = aCtx.currentTime; | ||
| - | let osc = aCtx.createOscillator(); | + | let osc = aCtx.createOscillator(); |
| - | | + | |
| - | + | ||
| - | // Usamos onda cuadrada para la textura metálica de los 80 | + | |
| osc.type = ' | osc.type = ' | ||
| - | | ||
| - | // La frecuencia fluctúa ligeramente para simular el ruido de fase | ||
| osc.frequency.setValueAtTime(baseFreq, | osc.frequency.setValueAtTime(baseFreq, | ||
| osc.frequency.linearRampToValueAtTime(baseFreq * 1.1, now + dur); | osc.frequency.linearRampToValueAtTime(baseFreq * 1.1, now + dur); | ||
| - | | ||
| g.gain.setValueAtTime(gainVal, | g.gain.setValueAtTime(gainVal, | ||
| g.gain.exponentialRampToValueAtTime(0.001, | g.gain.exponentialRampToValueAtTime(0.001, | ||
| - | | + | osc.connect(g); |
| - | | + | osc.start(); |
| - | | + | |
| - | osc.start(); | + | |
| - | | + | |
| } | } | ||
| Línea 111: | Línea 137: | ||
| let endTime = Date.now() + duration; | let endTime = Date.now() + duration; | ||
| while(Date.now() < endTime && !abortComm) { | while(Date.now() < endTime && !abortComm) { | ||
| - | // RECEPCIÓN (RD - Amarillo - Frecuencia 1200Hz) | ||
| document.getElementById(' | document.getElementById(' | ||
| playModemChirp(0.06, | playModemChirp(0.06, | ||
| await new Promise(r => setTimeout(r, | await new Promise(r => setTimeout(r, | ||
| document.getElementById(' | document.getElementById(' | ||
| - | | ||
| - | // TRANSMISIÓN (SD - Verde - Frecuencia 2400Hz) | ||
| if(Math.random() > 0.65) { | if(Math.random() > 0.65) { | ||
| | | ||
| Línea 129: | Línea 152: | ||
| function startConnectionSequence() { | function startConnectionSequence() { | ||
| - | initAudio(); | + | initAudio(); |
| + | | ||
| abortComm = false; | abortComm = false; | ||
| document.getElementById(' | document.getElementById(' | ||
| + | | ||
| let dt1 = aCtx.createOscillator(); | let dt1 = aCtx.createOscillator(); | ||
| dt1.frequency.value = 350; dt2.frequency.value = 440; dg.gain.setValueAtTime(0.015, | dt1.frequency.value = 350; dt2.frequency.value = 440; dg.gain.setValueAtTime(0.015, | ||
| Línea 137: | Línea 162: | ||
| dt1.connect(dg); | dt1.connect(dg); | ||
| dt1.start(now); | dt1.start(now); | ||
| + | |||
| " | " | ||
| + | |||
| let car = aCtx.createOscillator(); | let car = aCtx.createOscillator(); | ||
| car.frequency.value = 2100; cg.gain.setValueAtTime(0, | car.frequency.value = 2100; cg.gain.setValueAtTime(0, | ||
| Línea 144: | Línea 171: | ||
| car.connect(cg); | car.connect(cg); | ||
| car.start(now + 3); car.stop(now + 5.5); | car.start(now + 3); car.stop(now + 5.5); | ||
| + | |||
| setTimeout(() => { | setTimeout(() => { | ||
| if(abortComm) return; | if(abortComm) return; | ||
| Línea 178: | Línea 206: | ||
| const lineSpan = document.createElement(' | const lineSpan = document.createElement(' | ||
| lineSpan.className = ' | lineSpan.className = ' | ||
| - | | + | |
| + | if(lineData.s === " | ||
| + | else if(lineData.s === " | ||
| + | else lineSpan.innerHTML = lineData.t; | ||
| + | | ||
| out.appendChild(lineSpan); | out.appendChild(lineSpan); | ||
| - | |||
| let trafficTime = 150 + (lineData.t.length * 12); | let trafficTime = 150 + (lineData.t.length * 12); | ||
| await simulatePacket(trafficTime); | await simulatePacket(trafficTime); | ||
| - | |||
| if(!abortComm) { | if(!abortComm) { | ||
| lineSpan.classList.add(' | lineSpan.classList.add(' | ||
| Línea 197: | Línea 227: | ||
| </ | </ | ||
| </ | </ | ||
| + | |||
otros/contacto.1778065124.txt.gz · Última modificación: por jesus
