carlos-acosta-guides/films/el-calor-del-comal/index.html

338 lines
8.7 KiB
HTML
Raw Normal View History

2026-07-19 18:36:40 +02:00
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8"/>
<title>El Calor del Comal — Carlos Acosta</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
:root {
--gulf-night: #0b0f14;
--comal-rust: #8b4513;
--chile-fire: #c41e3a;
--molcajete: #2d2d2d;
--steam-white: rgba(255,255,255,0.85);
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--gulf-night);
color: var(--steam-white);
font-family: 'Inter', system-ui, -apple-system, sans-serif;
overflow: hidden;
}
#root {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: linear-gradient(180deg, #0b0f14 0%, #1a1f29 50%, #0b0f14 100%);
}
.clip {
position: absolute;
inset: 0;
display: grid;
place-items: center;
opacity: 0;
}
.clip.active {
opacity: 1;
}
/* SCENE 1: THE BURN */
#s1 .burn-mark {
position: absolute;
width: 600px;
height: 600px;
border-radius: 50%;
background: radial-gradient(circle, var(--chile-fire) 0%, transparent 70%);
filter: blur(60px);
animation: pulse-burn 4s ease-in-out infinite;
}
#s1 .smoke {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 400px;
background: linear-gradient(0deg, rgba(139,69,19,0.4) 0%, transparent 100%);
filter: blur(40px);
}
#s1 h1 {
position: relative;
z-index: 10;
font-size: 96px;
font-weight: 700;
letter-spacing: 0.02em;
text-align: center;
color: var(--chile-fire);
text-shadow: 0 0 60px rgba(196,30,58,0.6);
margin: 0;
padding: 0 120px;
}
#s1 .subtitle {
position: absolute;
bottom: 120px;
font-size: 32px;
letter-spacing: 0.1em;
color: var(--steam-white);
opacity: 0.7;
}
/* SCENE 2: THE GRIND */
#s2 .metate-bg {
position: absolute;
inset: 0;
background-image: url('https://images.pexels.com/photos/17061967/pexels-photo-17061967.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=1080&w=1920');
background-size: cover;
background-position: center;
filter: sepia(0.3) contrast(1.2) brightness(0.7);
}
#s2 .stone-texture {
position: absolute;
inset: 0;
background: repeating-linear-gradient(
45deg,
transparent,
transparent 20px,
rgba(45,45,45,0.3) 20px,
rgba(45,45,45,0.3) 40px
);
}
#s2 h1 {
position: relative;
z-index: 10;
font-size: 84px;
font-weight: 600;
letter-spacing: 0.03em;
text-align: center;
color: var(--steam-white);
text-shadow: 0 4px 30px rgba(0,0,0,0.8);
margin: 0;
}
#s2 .chile-overlay {
position: absolute;
top: 10%;
right: 5%;
width: 400px;
height: 400px;
background-image: url('https://images.pexels.com/photos/34942789/pexels-photo-34942789.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940');
background-size: cover;
border-radius: 50%;
opacity: 0;
transform: rotate(-15deg);
}
#s2 .cumin-dust {
position: absolute;
width: 800px;
height: 800px;
background: radial-gradient(circle, rgba(139,69,19,0.3) 0%, transparent 60%);
filter: blur(80px);
animation: drift-cumin 8s ease-in-out infinite alternate;
}
/* SCENE 3: THE SEAM */
#s3 .table-bg {
position: absolute;
inset: 0;
background-image: url('https://images.pexels.com/photos/29530030/pexels-photo-29530030.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=1080&w=1920');
background-size: cover;
background-position: center;
filter: contrast(1.1) saturation(1.2) brightness(0.9);
}
#s3 .mole-glow {
position: absolute;
width: 1000px;
height: 1000px;
border-radius: 50%;
background: radial-gradient(circle, rgba(139,69,19,0.5) 0%, transparent 70%);
filter: blur(100px);
animation: breathe-mole 12s ease-in-out infinite;
}
#s3 h1 {
position: relative;
z-index: 10;
font-size: 108px;
font-weight: 800;
letter-spacing: 0.01em;
text-align: center;
background: linear-gradient(180deg, var(--steam-white) 0%, var(--comal-rust) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-shadow: 0 8px 60px rgba(139,69,19,0.6);
margin: 0;
}
#s3 .family-circle {
position: absolute;
bottom: 80px;
font-size: 28px;
letter-spacing: 0.15em;
color: var(--steam-white);
opacity: 0.8;
text-transform: uppercase;
}
/* ANIMATIONS */
@keyframes pulse-burn {
0%, 100% { transform: scale(1); opacity: 0.8; }
50% { transform: scale(1.15); opacity: 1; }
}
@keyframes drift-cumin {
0% { transform: translate(-50px, -30px); }
100% { transform: translate(50px, 30px); }
}
@keyframes breathe-mole {
0%, 100% { transform: scale(1); opacity: 0.5; }
50% { transform: scale(1.2); opacity: 0.7; }
}
/* CAPTION TRACK */
.caption {
position: absolute;
bottom: 60px;
left: 50%;
transform: translateX(-50%);
font-size: 24px;
letter-spacing: 0.05em;
color: var(--steam-white);
background: rgba(0,0,0,0.6);
padding: 16px 32px;
border-radius: 8px;
max-width: 80%;
text-align: center;
line-height: 1.4;
opacity: 0;
}
.caption.visible {
opacity: 1;
}
</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="el-calor-del-comal" data-start="0" data-width="1920" data-height="1080" data-duration="60">
<!-- AUDIO ELEMENTS (REQUIRED FOR RENDER) -->
<audio id="voice-s1" src="audio/s1.wav" data-start="0"></audio>
<audio id="voice-s2" src="audio/s2.wav" data-start="20"></audio>
<audio id="voice-s3" src="audio/s3.wav" data-start="40"></audio>
<audio id="bgm" src="audio/music.mp3" data-start="0" data-volume="0.12"></audio>
<!-- SCENE 1: THE BURN (0-20s) -->
<section id="s1" class="clip" data-start="0" data-duration="20" data-track-index="1">
<div class="burn-mark"></div>
<div class="smoke"></div>
<h1 id="s1-title">EL CALOR DEL COMAL</h1>
<div class="subtitle">Mi primer intento. Mi primera quemadura.</div>
<div class="caption" id="cap-s1">Mi abuela dijo: "El fuego no perdona al que tiene prisa."</div>
</section>
<!-- SCENE 2: THE GRIND (20-40s) -->
<section id="s2" class="clip" data-start="20" data-duration="20" data-track-index="1">
<div class="metate-bg"></div>
<div class="stone-texture"></div>
<div class="chile-overlay"></div>
<div class="cumin-dust"></div>
<h1 id="s2-title">LA PACIENCIA DE LA PIEDRA</h1>
<div class="caption" id="cap-s2">Cuarenta vueltas del mano sobre la piedra. El aroma del comino tostado.</div>
</section>
<!-- SCENE 3: THE SEAM (40-60s) -->
<section id="s3" class="clip" data-start="40" data-duration="20" data-track-index="1">
<div class="table-bg"></div>
<div class="mole-glow"></div>
<h1 id="s3-title">LA COSTURA QUE NOS UNE</h1>
<div class="family-circle">Corpus Christi • 1986 • 2026</div>
<div class="caption" id="cap-s3">Esta es la salsa que conecta las manos de mi abuela con las mías.</div>
</section>
</div>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
// SCENE 1: FADE IN BURN
tl.to("#s1", { opacity: 1, duration: 2, ease: "power2.inOut" }, 0);
tl.to("#s1-title", {
opacity: 1,
y: 0,
duration: 3,
ease: "power3.out",
stagger: 0.1
}, 0.5);
tl.to(".burn-mark", {
scale: 1.3,
opacity: 0.6,
duration: 8,
ease: "sine.inOut"
}, 2);
tl.to("#cap-s1", { opacity: 1, y: 0, duration: 1.5 }, 3);
tl.to("#cap-s1", { opacity: 0, y: -20, duration: 1.5 }, 12);
tl.to("#s1", { opacity: 0, duration: 2 }, 18);
// SCENE 2: METATE REVEAL
tl.to("#s2", { opacity: 1, duration: 2.5 }, 20);
tl.to("#s2-title", {
opacity: 1,
scale: 1.05,
duration: 3,
ease: "expo.out"
}, 21);
tl.to(".chile-overlay", {
opacity: 0.9,
rotate: 0,
duration: 6,
ease: "power2.out"
}, 22);
tl.to(".cumin-dust", {
opacity: 1,
duration: 4,
ease: "power1.inOut"
}, 24);
tl.to("#cap-s2", { opacity: 1, y: 0, duration: 1.5 }, 25);
tl.to("#cap-s2", { opacity: 0, y: -20, duration: 1.5 }, 35);
tl.to("#s2", { opacity: 0, duration: 2 }, 38);
// SCENE 3: FAMILY TABLE
tl.to("#s3", { opacity: 1, duration: 3 }, 40);
tl.to("#s3-title", {
opacity: 1,
y: -30,
duration: 4,
ease: "power4.out"
}, 41);
tl.to(".mole-glow", {
scale: 1.4,
opacity: 0.8,
duration: 8,
ease: "sine.inOut"
}, 42);
tl.to("#cap-s3", { opacity: 1, y: 0, duration: 2 }, 44);
tl.to("#cap-s3", { opacity: 0, y: -20, duration: 2 }, 56);
tl.to("#s3", { opacity: 0, duration: 1 }, 59);
window.__timelines["el-calor-del-comal"] = tl;
</script>
</body>
</html>