<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VivaLuna – Un día cualquiera</title>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;600&family=Inter:wght@300;400;500&display=swap" rel="stylesheet">
<style>
:root {
--green: #2f6f6b;
--sand: #f5e6c8;
--orange: #e56b4a;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: var(--green);
color: var(--sand);
font-family: 'Inter', sans-serif;
overflow-x: hidden;
}
/* FILM GRAIN */
body::after {
content: "";
position: fixed;
width: 200%;
height: 200%;
background-image: url("https://grainy-gradients.vercel.app/noise.svg");
opacity: 0.08;
animation: grain 8s steps(10) infinite;
pointer-events: none;
}
@keyframes grain {
0%,100% { transform: translate(0,0); }
10% { transform: translate(-5%, -10%); }
30% { transform: translate(3%, -15%); }
50% { transform: translate(-10%, 5%); }
70% { transform: translate(5%, 10%); }
90% { transform: translate(-3%, -5%); }
}
/* PARALLAX BG */
.parallax {
position: fixed;
width: 100%;
height: 120vh;
background: url("cover.jpg") center/cover no-repeat;
transform: scale(1.2);
z-index: -1;
opacity: 0.2;
}
/* HERO */
.hero {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
flex-direction: column;
}
h1 {
font-family: 'Playfair Display', serif;
font-size: 6rem;
letter-spacing: 3px;
animation: fadeUp 1.5s ease;
}
h2 {
color: var(--orange);
letter-spacing: 8px;
margin-top: 10px;
animation: fadeUp 2s ease;
}
/* BUTTONS */
.buttons {
margin-top: 40px;
animation: fadeUp 2.5s ease;
}
.buttons a {
margin: 10px;
padding: 12px 26px;
border: 1px solid var(--orange);
color: var(--orange);
text-decoration: none;
transition: all 0.4s ease;
}
.buttons a:hover {
background: var(--orange);
color: white;
}
/* SECTIONS */
.section {
max-width: 800px;
margin: 200px auto;
padding: 0 20px;
opacity: 0;
transform: translateY(80px);
transition: all 1.5s ease;
}
.section.visible {
opacity: 1;
transform: translateY(0);
}
.section h3 {
font-family: 'Playfair Display', serif;
font-size: 2.5rem;
margin-bottom: 20px;
color: var(--orange);
}
.section p {
line-height: 1.9;
font-size: 1.15rem;
opacity: 0.9;
}
/* SPOTIFY */
iframe {
margin-top: 30px;
border-radius: 12px;
width: 100%;
height: 380px;
}
/* TRACKLIST */
.tracklist {
margin-top: 30px;
columns: 2;
}
.tracklist li {
margin-bottom: 12px;
}
/* ANIMATIONS */
@keyframes fadeUp {
from {
opacity: 0;
transform: translateY(60px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* RESPONSIVE */
@media (max-width: 768px) {
h1 { font-size: 3rem; }
.tracklist { columns: 1; }
}
</style>
</head>
<body>
<div class="parallax"></div>
<section class="hero">
<h1>VivaLuna</h1>
<h2>UN DÍA CUALQUIERA</h2>
<div class="buttons">
<a href="https://music.apple.com/us/album/un-d%C3%ADa-cualquiera/1871743550" target="_blank">Apple Music</a>
<a href="https://open.spotify.com/intl-es/album/5kAKDxZZ2fSQxWQ2B7T6mX" target="_blank">Spotify</a>
<a href="https://elasticstage.com/vivaluna/releases/un-dia-cualquiera-album" target="_blank">Vinilo / CD</a>
</div>
</section>
<section class="section">
<h3>Un día cualquiera</h3>
<p>
Hay discos que no intentan explicar nada. Solo estar.
</p>
<p>
VivaLuna nace del cruce de caminos, acentos y sensibilidades.
Canciones que hablan de lo cotidiano, del amor, del cansancio,
de lo que fuimos y de lo que no llegamos a ser.
</p>
</section>
<section class="section">
<h3>Escuchar</h3>
<iframe src="https://open.spotify.com/embed/album/5kAKDxZZ2fSQxWQ2B7T6mX"></iframe>
</section>
<section class="section">
<h3>Tracklist</h3>
<ul class="tracklist">
<li>Sueños</li>
<li>Es como es</li>
<li>Huracán Vampiro</li>
<li>Miedo</li>
<li>Es decir, te quiero</li>
<li>Francisco Franco</li>
<li>Todo lo que no viví contigo</li>
<li>Te llevaré a bailar</li>
<li>Oasis</li>
<li>Ven</li>
</ul>
</section>
<script>
// SCROLL REVEAL
const sections = document.querySelectorAll('.section');
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if(entry.isIntersecting){
entry.target.classList.add('visible');
}
});
}, { threshold: 0.15 });
sections.forEach(section => observer.observe(section));
// PARALLAX
window.addEventListener('scroll', () => {
const scroll = window.scrollY;
document.querySelector('.parallax').style.transform =
`translateY(${scroll * 0.3}px) scale(1.2)`;
});
</script>
</body>
</html>