110 lines
5.0 KiB
HTML
110 lines
5.0 KiB
HTML
|
|
<!doctype html>
|
||
|
|
<html lang="en"><head><meta charset="UTF-8"/><title>Error Vector: The Recovery Protocol</title>
|
||
|
|
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
||
|
|
<style>
|
||
|
|
:root{--neon-green:#00ff41;--alert-red:#ff3333;--deep-space:#05080a;}
|
||
|
|
body{margin:0;background:var(--deep-space);color:#fff;font-family:'JetBrains Mono',monospace;line-height:1.2}
|
||
|
|
#root{position:relative;width:1920px;height:1080px;overflow:hidden}
|
||
|
|
.clip{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;padding:120px}
|
||
|
|
|
||
|
|
/* SCENE 1 VISUAL */
|
||
|
|
.rack-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:20px;margin-bottom:60px;opacity:0}
|
||
|
|
.bay{width:80px;height:160px;border:2px solid #333;background:linear-gradient(180deg,#111 0%,#000 100%);transition:border-color 0.2s}
|
||
|
|
.bay.active{border-color:var(--neon-green)}
|
||
|
|
.bay.drift{border-color:var(--alert-red);animation:flicker 0.1s infinite}
|
||
|
|
|
||
|
|
/* SCENE 2 VISUAL */
|
||
|
|
.log-stream{font-size:24px;color:#aaa;writing-mode:vertical-rl;text-orientation:mixed;letter-spacing:4px;opacity:0;max-height:600px;overflow:hidden}
|
||
|
|
.log-line{display:block;margin:4px 0}
|
||
|
|
|
||
|
|
/* SCENE 3 VISUAL */
|
||
|
|
.pulse-ring{width:400px;height:400px;border-radius:50%;border:4px solid var(--neon-green);opacity:0;transform:scale(0.8)}
|
||
|
|
.core-stat{font-size:96px;font-weight:bold;margin-top:40px;opacity:0}
|
||
|
|
|
||
|
|
h1{font-size:64px;text-transform:uppercase;letter-spacing:8px;margin-bottom:20px;opacity:0}
|
||
|
|
.sub{font-size:28px;color:#888;opacity:0}
|
||
|
|
|
||
|
|
@keyframes flicker{0%{opacity:1}50%{opacity:0.3}100%{opacity:1}}
|
||
|
|
@keyframes scrollUp{from{transform:translateY(0)}to{transform:translateY(-50%)}}
|
||
|
|
@keyframes pulse{0%{transform:scale(0.8);opacity:0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}
|
||
|
|
</style> <script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||
|
|
</head>
|
||
|
|
<body>
|
||
|
|
<div id="root" data-composition-id="main" data-start="0" data-width="1920" data-height="1080" data-duration="45">
|
||
|
|
|
||
|
|
<!-- AUDIO TRACKS -->
|
||
|
|
<audio id="voice-s1" src="audio/s1.wav" data-start="0"></audio>
|
||
|
|
<audio id="voice-s2" src="audio/s2.wav" data-start="15"></audio>
|
||
|
|
<audio id="voice-s3" src="audio/s3.wav" data-start="30"></audio>
|
||
|
|
<audio id="bgm" src="audio/music.mp3" data-start="0" data-volume="0.12"></audio>
|
||
|
|
|
||
|
|
<!-- SCENE 1: THE SLIP -->
|
||
|
|
<section id="s1" class="clip" data-start="0" data-duration="15" data-track-index="1">
|
||
|
|
<div class="rack-grid" id="rack1"></div>
|
||
|
|
<h1 id="s1-title">SCENE 1: THE SLIP</h1>
|
||
|
|
<div class="sub" id="s1-sub">Calibration Drift Detected</div>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<!-- SCENE 2: THE LOG -->
|
||
|
|
<section id="s2" class="clip" data-start="15" data-duration="15" data-track-index="1">
|
||
|
|
<div class="log-stream" id="logStream"></div>
|
||
|
|
<h1 id="s2-title">SCENE 2: THE LOG</h1>
|
||
|
|
<div class="sub" id="s2-sub">Capture. Do Not Deny.</div>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<!-- SCENE 3: THE CORRECT -->
|
||
|
|
<section id="s3" class="clip" data-start="30" data-duration="15" data-track-index="1">
|
||
|
|
<div class="pulse-ring" id="pulseRing"></div>
|
||
|
|
<h1 id="s3-title">SCENE 3: THE CORRECT</h1>
|
||
|
|
<div class="core-stat" id="statDisplay">T⁻¹ RESTORED</div>
|
||
|
|
</section>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
// Populate Rack Grid
|
||
|
|
const rack = document.getElementById('rack1');
|
||
|
|
for(let i=0;i<36;i++) {
|
||
|
|
let b = document.createElement('div');
|
||
|
|
b.className='bay';
|
||
|
|
if(i===17) b.classList.add('drift'); // The fault node
|
||
|
|
rack.appendChild(b);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Populate Log Stream
|
||
|
|
const log = document.getElementById('logStream');
|
||
|
|
const errors = ["ΔT > 0.04ms", "NODE_17_DRIFT", "ERROR_VECTOR_CAPTURED", "ROOT_CAUSE_LOGGED", "RECOVERY_PROTOCOL_INITIATED"];
|
||
|
|
errors.forEach(e => {
|
||
|
|
let l = document.createElement('span');
|
||
|
|
l.className='log-line';
|
||
|
|
l.textContent=e;
|
||
|
|
log.appendChild(l);
|
||
|
|
});
|
||
|
|
|
||
|
|
window.__timelines = window.__timelines || {};
|
||
|
|
const tl = gsap.timeline({ paused: true });
|
||
|
|
|
||
|
|
// SCENE 1 ANIMATIONS
|
||
|
|
tl.to('.rack-grid', { opacity: 1, duration: 1 }, 0);
|
||
|
|
tl.to('#s1-title', { opacity: 1, y: 0, duration: 0.8, ease: 'power3.out' }, 1.5);
|
||
|
|
tl.to('#s1-sub', { opacity: 1, duration: 0.6 }, 2.2);
|
||
|
|
tl.to('.bay.drift', { borderColor: '#ff3333', duration: 0.1, yoyo: true, repeat: 10 }, 3); // Flicker fault
|
||
|
|
tl.to('.rack-grid', { opacity: 0, duration: 0.5 }, 14);
|
||
|
|
|
||
|
|
// SCENE 2 ANIMATIONS
|
||
|
|
tl.to('.log-stream', { opacity: 1, duration: 0.5 }, 15);
|
||
|
|
tl.to('#s2-title', { opacity: 1, y: 0, duration: 0.8 }, 15.5);
|
||
|
|
tl.to('#s2-sub', { opacity: 1, duration: 0.6 }, 16.2);
|
||
|
|
tl.to('.log-stream', { y: '-30%', duration: 10, ease: 'none' }, 16.5); // Scroll effect
|
||
|
|
tl.to('.log-stream', { opacity: 0, duration: 0.5 }, 29);
|
||
|
|
|
||
|
|
// SCENE 3 ANIMATIONS
|
||
|
|
tl.to('#pulseRing', { opacity: 1, duration: 0.5 }, 30);
|
||
|
|
tl.to('#s3-title', { opacity: 1, y: 0, duration: 0.8 }, 30.5);
|
||
|
|
tl.to('#pulseRing', { scale: 1.2, opacity: 0, duration: 10, repeat: 1 }, 31); // Pulse loop
|
||
|
|
tl.to('.core-stat', { opacity: 1, scale: 1.2, color: '#00ff41', duration: 2, ease: 'back.out(1.7)' }, 33);
|
||
|
|
tl.to('.core-stat', { opacity: 0, duration: 0.5 }, 44);
|
||
|
|
|
||
|
|
window.__timelines["main"] = tl;
|
||
|
|
</script>
|
||
|
|
</body></html>
|