100 lines
4.8 KiB
HTML
100 lines
4.8 KiB
HTML
<!doctype html>
|
|
<html><head><meta charset="UTF-8"/>
|
|
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
<style>
|
|
body{margin:0;background:#000;color:#fff;font-family:'JetBrains Mono',monospace}
|
|
#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}
|
|
.bg-matrix{position:absolute;inset:0;background:radial-gradient(circle at 50% 50%, #1a1a24 0%, #0a0a0f 100%)}
|
|
.wave{position:absolute;bottom:0;left:0;width:100%;height:0;background:linear-gradient(to top, #00f0ff, transparent);opacity:0}
|
|
.timer{font-size:8rem;font-weight:700;color:#00f0ff;margin:2rem 0}
|
|
.val{font-size:3rem;color:#ffb700;margin-top:1rem}
|
|
.label{font-size:1.5rem;color:#888;margin-bottom:0.5rem;text-transform:uppercase}
|
|
.title-card{background:#0a0a0f;border:2px solid #ffb700;padding:4rem;border-radius:1rem}
|
|
h1{font-size:4rem;margin:0;line-height:1.1;color:#fff}
|
|
p{font-size:1.5rem;color:#888;margin:1rem 0 0 0}
|
|
.credit{position:absolute;bottom:2rem;right:2rem;font-size:0.8rem;color:#444}
|
|
</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">
|
|
|
|
<!-- SCENE 01: THE SUBSTRATE (0-10s) -->
|
|
<section id="s1" class="clip" data-start="0" data-duration="10" data-track-index="1">
|
|
<div class="bg-matrix"></div>
|
|
<div class="label">Substrate Composition</div>
|
|
<h1 id="s1-title" style="opacity:0;transform:translateY(20px)">LINOLEUM MATRIX</h1>
|
|
<p id="s1-sub" style="opacity:0;transform:translateY(20px);color:#00f0ff">Q108728 • Oxidized Linseed • Breathable</p>
|
|
</section>
|
|
|
|
<!-- SCENE 02: THE SOLVENT (10-25s) -->
|
|
<section id="s2" class="clip" data-start="10" data-duration="15" data-track-index="1">
|
|
<div class="bg-matrix"></div>
|
|
<div class="wave" id="s2-wave"></div>
|
|
<div class="label">Solvent Chemistry</div>
|
|
<div class="timer" id="s2-timer">0</div>
|
|
<p style="color:#888">Target: pH 11.5</p>
|
|
</section>
|
|
|
|
<!-- SCENE 03: THE RESULT (25-40s) -->
|
|
<section id="s3" class="clip" data-start="25" data-duration="15" data-track-index="1">
|
|
<div class="bg-matrix"></div>
|
|
<div class="label">Kinetic Outcome</div>
|
|
<div class="val" id="s3-val" style="opacity:0;scale:0.8">µ = 0.35</div>
|
|
<p style="color:#00f0ff;margin-top:1rem">SAFE FOR FOOT TRAFFIC</p>
|
|
</section>
|
|
|
|
<!-- SCENE 04: TITLE CARD (40-45s) -->
|
|
<section id="s4" class="clip" data-start="40" data-duration="5" data-track-index="1">
|
|
<div class="title-card" id="s4-card" style="opacity:0;transform:scale(0.95)">
|
|
<h1>THE CONTACT WINDOW</h1>
|
|
<p>PROTOCOL 03</p>
|
|
</div>
|
|
</section>
|
|
|
|
<div class="credit">@asma_rudisill // Gaithersburg Facility Maintenance</div>
|
|
|
|
<!-- AUDIO ELEMENTS (REQUIRED for voice/captions) -->
|
|
<audio id="voice-s1" src="audio/s1.wav" data-start="0"></audio>
|
|
<audio id="voice-s2" src="audio/s2.wav" data-start="10"></audio>
|
|
<audio id="voice-s3" src="audio/s3.wav" data-start="25"></audio>
|
|
<audio id="voice-s4" src="audio/s4.wav" data-start="40"></audio>
|
|
<!-- Music placeholder (will be filled by hyperframe.json) -->
|
|
<audio id="bgm" src="audio/music.mp3" data-start="0" data-volume="0.12"></audio>
|
|
|
|
<script>
|
|
window.__timelines = window.__timelines || {};
|
|
const tl = gsap.timeline({ paused: true });
|
|
|
|
// Scene 1: Reveal
|
|
tl.to("#s1-title", { opacity: 1, y: 0, duration: 1.2, ease: "power3.out" }, 1.0);
|
|
tl.to("#s1-sub", { opacity: 1, y: 0, duration: 1.0, ease: "power3.out" }, 2.5);
|
|
|
|
// Scene 2: Wave Rise + Timer Count
|
|
tl.to("#s2-wave", { height: "100%", opacity: 1, duration: 14, ease: "none" }, 10.5);
|
|
// Counter animation handled separately for precision
|
|
|
|
// Scene 3: Value Pop
|
|
tl.to("#s3-val", { opacity: 1, scale: 1, duration: 2, ease: "back.out(1.7)" }, 26.0);
|
|
|
|
// Scene 4: Title Card
|
|
tl.to("#s4-card", { opacity: 1, scale: 1, duration: 1.5, ease: "power2.out" }, 40.5);
|
|
|
|
// Timer Logic (synced to Scene 2)
|
|
const timerEl = document.getElementById("s2-timer");
|
|
function animateTimer() {
|
|
const now = performance.now();
|
|
const elapsed = Math.floor((now - 10000) / 1000); // Start counting at t=10s
|
|
if (elapsed >= 127) {
|
|
timerEl.textContent = "127";
|
|
return;
|
|
}
|
|
timerEl.textContent = elapsed.toString().padStart(3, "0");
|
|
requestAnimationFrame(animateTimer);
|
|
}
|
|
setTimeout(animateTimer, 10000);
|
|
|
|
window.__timelines["main"] = tl;
|
|
</script>
|
|
</body></html>
|