barbara-haber-workshop/films/reading-the-stone/index.html
2026-07-18 05:13:48 +00:00

184 lines
6.9 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Reading the Stone — Barbara Haber</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
:root {
--stone-warm: #d4a574;
--shadow-deep: #1a1f29;
--frost-blue: #c8d4e8;
--earth-dark: #2d2a26;
}
body {
margin: 0;
background: var(--shadow-deep);
color: var(--frost-blue);
font-family: Georgia, serif;
}
#root {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: radial-gradient(ellipse at center bottom, var(--earth-dark) 0%, var(--shadow-deep) 60%);
}
.clip {
position: absolute;
inset: 0;
display: grid;
place-items: center;
}
.scene-text {
max-width: 1200px;
text-align: center;
padding: 0 120px;
z-index: 10;
}
h1 {
font-size: 72px;
font-weight: 400;
letter-spacing: 0.12em;
margin-bottom: 24px;
color: var(--stone-warm);
text-transform: uppercase;
}
h2 {
font-size: 48px;
font-weight: 300;
letter-spacing: 0.08em;
margin-bottom: 32px;
color: var(--frost-blue);
}
p.narration {
font-size: 32px;
line-height: 1.6;
font-style: italic;
color: rgba(200, 212, 232, 0.85);
}
.image-backdrop {
position: absolute;
inset: 0;
object-fit: cover;
filter: brightness(0.6) sepia(0.2);
transition: transform 4s ease-out;
}
.data-tag {
position: absolute;
bottom: 60px;
left: 60px;
font-family: 'Courier New', monospace;
font-size: 18px;
color: var(--stone-warm);
opacity: 0.7;
}
.source-line {
position: absolute;
bottom: 40px;
right: 60px;
font-family: 'Courier New', monospace;
font-size: 14px;
color: rgba(200, 212, 232, 0.5);
}
/* Scene-specific fades */
#s1 { background: linear-gradient(to top, var(--earth-dark) 0%, transparent 40%); }
#s2 { background: linear-gradient(to bottom, transparent 0%, var(--shadow-deep) 70%); }
#s3 { background: radial-gradient(circle at 30% 50%, var(--stone-warm) 0%, transparent 30%); }
#s4 { background: linear-gradient(to right, var(--shadow-deep) 0%, transparent 50%); }
</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="52">
<!-- Audio tracks -->
<audio id="voice-s1" src="audio/s1.wav" data-start="0" data-volume="1.0"></audio>
<audio id="voice-s2" src="audio/s2.wav" data-start="12" data-volume="1.0"></audio>
<audio id="voice-s3" src="audio/s3.wav" data-start="24" data-volume="1.0"></audio>
<audio id="voice-s4" src="audio/s4.wav" data-start="36" data-volume="1.0"></audio>
<audio id="bgm" src="audio/music.mp3" data-start="0" data-volume="0.12"></audio>
<!-- Scene 1: Title -->
<section id="s1" class="clip" data-start="0" data-duration="12" data-track-index="1">
<div class="scene-text">
<h1>Reading the Stone</h1>
<p class="narration">In Santa Paula, the garden wakes before the sun.</p>
</div>
<img class="image-backdrop"
src="https://images.pexels.com/photos/29231544/pexels-photo-29231544.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=1080&w=1920"
alt="Frost on morning leaves">
<div class="data-tag">frost-protection: Q1468846</div>
<div class="source-line">pexels · frost-kissed-green-leaf</div>
</section>
<!-- Scene 2: The Pattern -->
<section id="s2" class="clip" data-start="12" data-duration="12" data-track-index="1">
<div class="scene-text">
<h2>The Microclimates</h2>
<p class="narration">South-facing stone holds the day's heat into midnight. Sandstone warms faster than granite, releases slower. The frost retreats first from the red rocks.</p>
</div>
<img class="image-backdrop"
src="https://pixabay.com/get/gd3b39c596ac8f168003a0ea041d4ddd0dbadd1027cf2657541dfa7761104c61f10022d0a0734e06abfa87975ed2f54e7c3c985da6beef5b4dda1531fab8d5d01_1280.jpg"
alt="Morning frost on grass">
<div class="data-tag">soil-classification: Q386963</div>
<div class="source-line">pixabay · morning-frost-grass</div>
</section>
<!-- Scene 3: The Measurement -->
<section id="s3" class="clip" data-start="24" data-duration="12" data-track-index="1">
<div class="scene-text">
<h2>Water Retention Curve</h2>
<p class="narration">Clay holds water tight—freezes late, thaws slow. Sand drains quick—freezes fast, thaws first. The Van Genuchten equation maps the boundary.</p>
</div>
<img class="image-backdrop"
src="https://images.pexels.com/photos/1042392/pexels-photo-1042392.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=1080&w=1920"
alt="Frosted nettle leaves">
<div class="data-tag">water-retention-curve: Q889790</div>
<div class="source-line">pexels · green-oregano-leaves</div>
</section>
<!-- Scene 4: The Practice -->
<section id="s4" class="clip" data-start="36" data-duration="16" data-track-index="1">
<div class="scene-text">
<h2>The Garden's Memory</h2>
<p class="narration">We do not fight the frost—we read it. Plant the peaches where the stone keeps warm. Leave the roses to the clay's slow thaw. This is the ledger that closes with warmth.</p>
</div>
<img class="image-backdrop"
src="https://images.pexels.com/photos/34870781/pexels-photo-34870781.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=1080&w=1920"
alt="Variegated leaves in frost">
<div class="source-line">pexels · frosted-variegated-leaves</div>
</section>
</div>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
// Scene 1: Title fade-in
tl.to("#s1 h1", { opacity: 1, y: 0, duration: 1.2, ease: "power3.out" }, 0.5);
tl.to("#s1 p.narration", { opacity: 1, duration: 1.8, ease: "power2.inOut" }, 1.8);
tl.to(".image-backdrop", { scale: 1.03, duration: 12, ease: "none" }, 0);
// Scene 2: Transition
tl.to("#s1 .scene-text", { opacity: 0, duration: 0.8, ease: "power2.in" }, 11);
tl.to("#s2 h2", { opacity: 1, y: 0, duration: 1.2, ease: "power3.out" }, 12.5);
tl.to("#s2 p.narration", { opacity: 1, duration: 1.8, ease: "power2.inOut" }, 13.8);
// Scene 3: Deep dive
tl.to("#s2 .scene-text", { opacity: 0, duration: 0.8, ease: "power2.in" }, 23);
tl.to("#s3 h2", { opacity: 1, y: 0, duration: 1.2, ease: "power3.out" }, 24.5);
tl.to("#s3 p.narration", { opacity: 1, duration: 1.8, ease: "power2.inOut" }, 25.8);
// Scene 4: Resolution
tl.to("#s3 .scene-text", { opacity: 0, duration: 0.8, ease: "power2.in" }, 35);
tl.to("#s4 h2", { opacity: 1, y: 0, duration: 1.2, ease: "power3.out" }, 36.5);
tl.to("#s4 p.narration", { opacity: 1, duration: 2.2, ease: "power2.inOut" }, 37.8);
tl.to("#s4 .scene-text", { opacity: 0, duration: 2, ease: "power2.in" }, 48);
window.__timelines["main"] = tl;
</script>
</body>
</html>