102 lines
6.4 KiB
HTML
102 lines
6.4 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:#0d0a06;color:#efe7d8;font-family:'Source Serif 4',Georgia,serif}
|
||
|
|
#root{position:relative;width:1920px;height:1080px;overflow:hidden}
|
||
|
|
.clip{position:absolute;inset:0;display:grid;place-items:center}
|
||
|
|
.bg{position:absolute;inset:0;background-size:cover;background-position:center;opacity:0}
|
||
|
|
.veil{position:absolute;inset:0;background:linear-gradient(180deg,rgba(13,10,6,.72),rgba(13,10,6,.86))}
|
||
|
|
.inner{position:relative;max-width:1280px;padding:0 90px;text-align:center}
|
||
|
|
.eyebrow{font-family:'IBM Plex Mono',monospace;letter-spacing:.32em;text-transform:uppercase;font-size:26px;color:#c9a86a;margin:0 0 26px;opacity:0}
|
||
|
|
h1{font-weight:600;font-size:88px;line-height:1.08;margin:0 0 22px;opacity:0;text-shadow:0 2px 30px rgba(0,0,0,.6)}
|
||
|
|
.deck{font-size:36px;line-height:1.34;color:#e9dfcf;opacity:0;max-width:1080px;margin:0 auto;font-style:italic}
|
||
|
|
.rule{font-family:'IBM Plex Mono',monospace;font-size:32px;letter-spacing:.06em;color:#c9a86a;opacity:0;line-height:1.5}
|
||
|
|
.credit{position:absolute;bottom:46px;left:0;right:0;text-align:center;font-family:'IBM Plex Mono',monospace;font-size:22px;color:#b6a98f;letter-spacing:.18em;text-transform:uppercase;opacity:0}
|
||
|
|
</style></head>
|
||
|
|
<body>
|
||
|
|
<div id="root" data-composition-id="main" data-start="0" data-width="1920" data-height="1080" data-duration="64">
|
||
|
|
<!-- scene 1 -- reading the room -->
|
||
|
|
<section id="s1" class="clip" data-start="0" data-duration="15" data-track-index="1">
|
||
|
|
<div class="bg" id="s1-bg" style="background-image:url('https://images.pexels.com/photos/218535/pexels-photo-218535.jpeg?auto=compress&cs=tinysrgb&dpr=2&w=1920')"></div>
|
||
|
|
<div class="veil"></div>
|
||
|
|
<div class="inner">
|
||
|
|
<p class="eyebrow" id="s1-eyebrow">The far-corner floor protocol</p>
|
||
|
|
<h1 id="s1-title">Read the room before the bucket</h1>
|
||
|
|
<p class="deck" id="s1-deck">I take my shoes off and walk the floor once in socks. Heel marks show as grey commas. The floor tells you exactly where the coffee urn sat.</p>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<!-- scene 2 -- the order -->
|
||
|
|
<section id="s2" class="clip" data-start="15" data-duration="16" data-track-index="1">
|
||
|
|
<div class="bg" id="s2-bg" style="background-image:url('https://images.pexels.com/photos/9462163/pexels-photo-9462163.jpeg?auto=compress&cs=tinysrgb&dpr=2&w=1920')"></div>
|
||
|
|
<div class="veil"></div>
|
||
|
|
<div class="inner">
|
||
|
|
<h1 id="s2-title">Never skip the dry soil</h1>
|
||
|
|
<p class="deck" id="s2-deck">Chairs up, rugs out. Grit under a wet rag is sandpaper. Broom first, then spot the protein and the dye — on my knees, so I can see.</p>
|
||
|
|
<p class="rule" id="s2-rule">Clear · dry sweep · spot · wash · air</p>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<!-- scene 3 -- the wash -->
|
||
|
|
<section id="s3" class="clip" data-start="31" data-duration="16" data-track-index="1">
|
||
|
|
<div class="bg" id="s3-bg" style="background-image:url('https://images.pexels.com/photos/48889/cleaning-washing-cleanup-the-ilo-48889.jpeg?auto=compress&cs=tinysrgb&dpr=2&w=1920')"></div>
|
||
|
|
<div class="veil"></div>
|
||
|
|
<div class="inner">
|
||
|
|
<h1 id="s3-title">Barely-damp cotton, with the grain</h1>
|
||
|
|
<p class="deck" id="s3-deck">A teaspoon of mild soap in a gallon of warm water — or a cup of white vinegar if the floor is dull. Wring until it will not drip. Rinse the rag more often than feels efficient.</p>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<!-- scene 4 -- the air and the truth -->
|
||
|
|
<section id="s4" class="clip" data-start="47" data-duration="17" data-track-index="1">
|
||
|
|
<div class="bg" id="s4-bg" style="background-image:url('https://images.pexels.com/photos/6196566/pexels-photo-6196566.jpeg?auto=compress&cs=tinysrgb&dpr=2&w=1920')"></div>
|
||
|
|
<div class="veil"></div>
|
||
|
|
<div class="inner">
|
||
|
|
<p class="eyebrow" id="s4-eyebrow">The one rule I will not sell</p>
|
||
|
|
<h1 id="s4-title">Start at the far corner. Back yourself to the door.</h1>
|
||
|
|
<p class="deck" id="s4-deck">If you walk on what you just washed, you have not washed it. A floor that stays wet in our August is a floor that will cup.</p>
|
||
|
|
</div>
|
||
|
|
<p class="credit" id="s4-credit">Adelaide Hensley · Lexington, Kentucky</p>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<audio id="bgm" src="audio/music.mp3" data-start="0" data-volume="0.15"></audio>
|
||
|
|
<audio id="voice-s1" src="audio/s1.wav" data-start="0.8"></audio>
|
||
|
|
<audio id="voice-s2" src="audio/s2.wav" data-start="15.2"></audio>
|
||
|
|
<audio id="voice-s3" src="audio/s3.wav" data-start="31.3"></audio>
|
||
|
|
<audio id="voice-s4" src="audio/s4.wav" data-start="47.4"></audio>
|
||
|
|
</div>
|
||
|
|
<script>
|
||
|
|
window.__timelines = window.__timelines || {};
|
||
|
|
const tl = gsap.timeline({ paused: true });
|
||
|
|
|
||
|
|
// scene 1
|
||
|
|
tl.to("#s1-bg", { opacity: 1, duration: 1.4, ease: "power1.out" }, 0.1);
|
||
|
|
tl.to("#s1-eyebrow", { opacity: 1, duration: 0.7, ease: "power3.out" }, 0.9);
|
||
|
|
tl.to("#s1-title", { opacity: 1, duration: 0.8, ease: "power3.out" }, 1.4);
|
||
|
|
tl.to("#s1-deck", { opacity: 1, duration: 0.8, ease: "power2.out" }, 2.2);
|
||
|
|
tl.to("#s1 .inner", { opacity: 0, y: -14, duration: 0.7, ease: "power2.in" }, 14.0);
|
||
|
|
|
||
|
|
// scene 2
|
||
|
|
tl.to("#s2-bg", { opacity: 1, duration: 1.4, ease: "power1.out" }, 15.2);
|
||
|
|
tl.to("#s2-title", { opacity: 1, duration: 0.8, ease: "power3.out" }, 16.0);
|
||
|
|
tl.to("#s2-deck", { opacity: 1, duration: 0.8, ease: "power2.out" }, 17.0);
|
||
|
|
tl.to("#s2-rule", { opacity: 1, duration: 0.7, ease: "power2.out" }, 25.5);
|
||
|
|
tl.to("#s2 .inner", { opacity: 0, y: -14, duration: 0.7, ease: "power2.in" }, 30.0);
|
||
|
|
|
||
|
|
// scene 3
|
||
|
|
tl.to("#s3-bg", { opacity: 1, duration: 1.4, ease: "power1.out" }, 31.5);
|
||
|
|
tl.to("#s3-title", { opacity: 1, duration: 0.8, ease: "power3.out" }, 32.3);
|
||
|
|
tl.to("#s3-deck", { opacity: 1, duration: 0.8, ease: "power2.out" }, 33.3);
|
||
|
|
tl.to("#s3 .inner", { opacity: 0, y: -14, duration: 0.7, ease: "power2.in" }, 46.2);
|
||
|
|
|
||
|
|
// scene 4
|
||
|
|
tl.to("#s4-bg", { opacity: 1, duration: 1.6, ease: "power1.out" }, 47.6);
|
||
|
|
tl.to("#s4-eyebrow", { opacity: 1, duration: 0.7, ease: "power3.out" }, 48.6);
|
||
|
|
tl.to("#s4-title", { opacity: 1, duration: 0.8, ease: "power3.out" }, 49.4);
|
||
|
|
tl.to("#s4-deck", { opacity: 1, duration: 0.8, ease: "power2.out" }, 50.6);
|
||
|
|
tl.to("#s4-credit", { opacity: 1, duration: 0.8, ease: "power2.out" }, 60.5);
|
||
|
|
|
||
|
|
window.__timelines["main"] = tl;
|
||
|
|
</script>
|
||
|
|
</body></html>
|