<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Your Artist Name — Official</title>
<meta name="description" content="Official site of Your Artist Name — singer-songwriter. Music, shows, press, and booking." />
<link rel="icon" href="assets/favicon.svg" />
<style>
:root{
--bg:#0f0f10;
--card:#121214;
--muted:#9aa0a6;
--accent:#f36b6b;
--glass: rgba(255,255,255,0.03);
--maxw:1100px;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
color: #eee;
}
*{box-sizing:border-box}
html,body{height:100%}
body{
margin:0;
background:linear-gradient(180deg,#071017 0%, #0f1113 60%);
color:var(--muted);
-webkit-font-smoothing:antialiased;
-moz-osx-font-smoothing:grayscale;
line-height:1.45;
}
.container{max-width:var(--maxw);margin:0 auto;padding:28px;}
header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:8px 0}
.logo{display:flex;align-items:center;gap:10px}
.logo img{width:44px;height:44px;border-radius:6px;object-fit:cover}
.site-title{font-weight:700;color:#fff}
nav{display:flex;gap:12px;align-items:center}
a.nav-link{color:var(--muted);text-decoration:none;padding:8px;border-radius:6px}
a.nav-link:hover{color:#fff;background:var(--glass)}
.hero{display:grid;grid-template-columns: 1fr 360px;gap:28px;align-items:center;padding:36px 0}
@media (max-width:900px){ .hero{grid-template-columns:1fr;}}
.hero-left h1{font-size:40px;margin:0 0 10px;color:#fff}
.hero-left p{margin:0 0 18px;color:var(--muted)}
.cta-row{display:flex;gap:12px;flex-wrap:wrap}
.btn{background:var(--accent);color:#fff;padding:10px 14px;border-radius:8px;text-decoration:none;font-weight:600}
.btn.ghost{background:transparent;border:1px solid rgba(255,255,255,0.06);color:var(--muted)}
.cover{width:100%;max-width:360px;border-radius:12px;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,0.6)}
.cover img{display:block;width:100%;height:100%;object-fit:cover}
.player{background:linear-gradient(180deg,rgba(255,255,255,0.02),transparent);padding:12px;border-radius:10px;margin-top:12px}
.track{display:flex;gap:12px;align-items:center}
.track .meta{flex:1}
.controls{display:flex;gap:8px;align-items:center}
.icon-btn{background:transparent;border:0;color:var(--muted);font-size:18px;padding:8px;border-radius:8px}
.section{margin-top:40px}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
@media (max-width:900px){ .grid-3{grid-template-columns:repeat(1,1fr)}}
.card{background:var(--card);padding:14px;border-radius:10px}
h2{color:#fff;margin:0 0 12px}
.muted{color:var(--muted)}
.socials{display:flex;gap:10px}
.socials a{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:8px;background:transparent;border:1px solid rgba(255,255,255,0.03);color:var(--muted);text-decoration:none}
footer{margin:50px 0 30px;padding-top:24px;border-top:1px solid rgba(255,255,255,0.03);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px}
.tour-list{list-style:none;padding:0;margin:0}
.tour-item{display:flex;justify-content:space-between;padding:10px 0;border-bottom:1px dashed rgba(255,255,255,0.02)}
.meta small{display:block;color:var(--muted)}
form input, form textarea{width:100%;padding:10px;border-radius:8px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:#fff;margin-top:8px}
.badge{display:inline-block;padding:6px 10px;border-radius:999px;background:rgba(255,255,255,0.04);color:var(--muted);font-size:13px}
/* audio timeline */
.timeline{height:6px;background:rgba(255,255,255,0.04);border-radius:6px;position:relative;cursor:pointer;margin-top:10px}
.timeline .progress{height:100%;width:0;background:linear-gradient(90deg,var(--accent),#ff9d9d);border-radius:6px}
small.time{color:var(--muted);font-size:13px;margin-left:6px}
/* simple responsive spacing */
.spacer{height:8px}
</style>
</head>
<body>
<div class="container">
<header>
<div class="logo">
<img src="assets/cover.jpg" alt="Artist cover (replace)" />
<div>
<div class="site-title">YOUR ARTIST NAME</div>
<div class="muted">Singer • Songwriter</div>
</div>
</div>
<nav>
<a class="nav-link" href="#music">Music</a>
<a class="nav-link" href="#shows">Shows</a>
<a class="nav-link" href="#about">About</a>
<a class="nav-link" href="#contact">Contact</a>
</nav>
</header>
<main>
<section class="hero" id="top">
<div class="hero-left">
<h1>New single: "Title of Your Song"</h1>
<p class="muted">Released: <span id="release-date">Jan 1, 2025</span> — Short teaser or one-line bio that hooks the listener.</p>
<div class="cta-row">
<a class="btn" href="#music">Listen</a>
<a class="btn ghost" id="buy-link" href="#" target="_blank" rel="noopener">Buy / Stream</a>
<a class="nav-link" href="assets/press-kit.pdf" download>Press Kit</a>
</div>
<div class="player" style="max-width:640px;">
<div class="track">
<img id="mini-cover" src="assets/cover.jpg" alt="cover" style="width:64px;height:64px;border-radius:8px;object-fit:cover" />
<div class="meta">
<div style="color:#fff;font-weight:700" id="track-title">Title of Your Song</div>
<div class="muted" id="track-artist">Your Artist Name</div>
<div class="timeline" id="timeline" title="Seek">
<div class="progress" id="progress"></div>
</div>
<div style="margin-top:8px;display:flex;align-items:center;gap:10px">
<div class="controls">
<button class="icon-btn" id="playpause" title="Play">►</button>
<button class="icon-btn" id="prev" title="Previous">«</button>
<button class="icon-btn" id="next" title="Next">»</button>
</div>
<small class="time" id="time">0:00 / 0:00</small>
</div>
</div>
</div>
<!-- Hidden native audio element; playlist loaded by JS -->
<audio id="audio" preload="metadata"></audio>
</div>
</div>
<div>
<div class="cover">
<img src="assets/cover.jpg" alt="Cover art — replace with your single/album art" />
</div>
<div style="margin-top:12px;display:flex;gap:8px">
<a class="socials" aria-hidden="true" style="gap:8px">
<a class="socials" href="#" title="Spotify (replace)"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" style="color:var(--muted)"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-opacity="0.25"/></svg></a>
</a>
</div>
</div>
</section>
<section class="section" id="music">
<h2>Music</h2>
<div class="grid-3">
<!-- Example track card (repeat for each release) -->
<div class="card">
<div style="display:flex;gap:12px;align-items:center">
<img src="assets/cover.jpg" alt="" style="width:72px;height:72px;border-radius:8px;object-fit:cover" />
<div>
<div style="font-weight:700;color:#fff">Title of Your Song</div>
<div class="muted">Single • 2025</div>
<div style="margin-top:8px;display:flex;gap:8px">
<button class="btn" onclick="playTrack(0)">Play</button>
<a class="nav-link" href="#" onclick="openLink('https://open.spotify.com')" target="_blank" rel="noopener">Spotify</a>
<a class="nav-link" href="#" onclick="openLink('https://music.apple.com')" target="_blank" rel="noopener">Apple</a>
</div>
</div>
</div>
</div>
<div class="card">
<div style="display:flex;gap:12px;align-items:center">
<img src="assets/cover2.jpg" alt="" style="width:72px;height:72px;border-radius:8px;object-fit:cover" />
<div>
<div style="font-weight:700;color:#fff">Another Track</div>
<div class="muted">EP • 2024</div>
<div style="margin-top:8px;display:flex;gap:8px">
<button class="btn" onclick="playTrack(1)">Play</button>
<a class="nav-link" href="#" onclick="openLink('https://bandcamp.com')" target="_blank">Bandcamp</a>
</div>
</div>
</div>
</div>
<div class="card">
<div style="display:flex;gap:12px;align-items:center">
<img src="assets/cover3.jpg" alt="" style="width:72px;height:72px;border-radius:8px;object-fit:cover" />
<div>
<div style="font-weight:700;color:#fff">Live Session</div>
<div class="muted">Live • 2023</div>
<div style="margin-top:8px;display:flex;gap:8px">
<button class="btn" onclick="playTrack(2)">Play</button>
<a class="nav-link" href="#" onclick="openLink('https://soundcloud.com')" target="_blank">SoundCloud</a>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="section" id="shows">
<h2>Shows</h2>
<div class="card">
<ul class="tour-list" id="tour-list">
<li class="tour-item"><div><strong>Dec 20, 2025 — The Blue Room</strong><small>City, ST</small></div><div class="muted">Tickets</div></li>
<li class="tour-item"><div><strong>Jan 10, 2026 — The Green Stage</strong><small>City, ST</small></div><div class="muted">Tickets</div></li>
</ul>
<p class="muted" style="margin-top:8px">To add a show: edit this HTML or manage via a light CMS.</p>
</div>
</section>
<section class="section" id="about">
<h2>About</h2>
<div class="card">
<p style="color:var(--muted)">Brief bio: Write a short paragraph about your musical background, influences, and achievements — keep it personal and specific. Replace this placeholder with 2–3 sentences about you and your music.</p>
<div style="display:flex;gap:10px;margin-top:12px;flex-wrap:wrap">
<a class="nav-link" href="assets/press-kit.pdf" download>Download Press Kit (PDF)</a>
<a class="nav-link" href="mailto:booking@yourdomain.com">Booking: booking@yourdomain.com</a>
</div>
</div>
</section>
<section class="section" id="contact">
<h2>Contact</h2>
<div class="grid-3">
<div class="card">
<form id="contact-form" action="https://formspree.io/f/your-form-id" method="POST" target="_blank">
<label class="badge">Contact / Booking</label>
<input type="text" name="name" placeholder="Your name" required />
<input type="email" name="email" placeholder="Email" required />
<textarea name="message" rows="5" placeholder="Message" required></textarea>
<div style="margin-top:8px">
<button class="btn" type="submit">Send</button>
</div>
<p class="muted" style="margin-top:8px;font-size:13px">This form uses Formspree (replace with your endpoint).</p>
</form>
</div>
<div class="card">
<label class="badge">Mailing List</label>
<p class="muted">Join the mailing list for new releases and tour announcements.</p>
<form action="https://formspree.io/f/your-mailinglist-id" method="POST" target="_blank">
<input type="email" name="email" placeholder="Your email" required />
<div style="margin-top:8px"><button class="btn" type="submit">Subscribe</button></div>
</form>
</div>
<div class="card">
<label class="badge">Social</label>
<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap">
<a class="socials" href="#" target="_blank">Spotify</a>
<a class="socials" href="#" target="_blank">Apple</a>
<a class="socials" href="#" target="_blank">Instagram</a>
<a class="socials" href="#" target="_blank">YouTube</a>
</div>
<div style="margin-top:12px" class="muted">Pro tip: link to artist profiles (not personal accounts).</div>
</div>
</div>
</section>
<footer>
<div class="muted">© <span id="year"></span> Your Artist Name — All rights reserved.</div>
<div style="display:flex;gap:8px;align-items:center">
<a class="nav-link" href="mailto:press@yourdomain.com">Press</a>
<a class="nav-link" href="#">Privacy</a>
</div>
</footer>
</main>
</div>
<script>
// ====== Replace these with your hosted file URLs or streaming links ======
const TRACKS = [
{ title: "Title of Your Song", artist: "Your Artist Name", src: "assets/track1.mp3", cover: "assets/cover.jpg" },
{ title: "Another Track", artist: "Your Artist Name", src: "assets/track2.mp3", cover: "assets/cover2.jpg" },
{ title: "Live Session", artist: "Your Artist Name", src: "assets/track3.mp3", cover: "assets/cover3.jpg" }
];
// =======================================================================
const audio = document.getElementById('audio');
const playBtn = document.getElementById('playpause');
const prevBtn = document.getElementById('prev');
const nextBtn = document.getElementById('next');
const progressEl = document.getElementById('progress');
const timeline = document.getElementById('timeline');
const timeEl = document.getElementById('time');
const trackTitle = document.getElementById('track-title');
const trackArtist = document.getElementById('track-artist');
const miniCover = document.getElementById('mini-cover');
let current = 0;
let isPlaying = false;
function loadTrack(i){
const t = TRACKS[i];
audio.src = t.src;
trackTitle.textContent = t.title;
trackArtist.textContent = t.artist;
miniCover.src = t.cover || 'assets/cover.jpg';
document.querySelector('.cover img').src = t.cover || 'assets/cover.jpg';
}
function playTrack(i){
if (typeof i === 'number') current = i;
loadTrack(current);
audio.play().then(()=> {
isPlaying = true;
playBtn.textContent = "❚❚";
}).catch(err => {
// Autoplay might be blocked; change UI
isPlaying = false;
playBtn.textContent = "►";
console.warn('Playback failed (user gesture needed?):', err);
});
}
function togglePlay(){
if(!audio.src) loadTrack(current);
if(audio.paused){
audio.play(); isPlaying = true; playBtn.textContent="❚❚";
} else {
audio.pause(); isPlaying = false; playBtn.textContent="►";
}
}
function prev(){ current = (current - 1 + TRACKS.length) % TRACKS.length; playTrack(); }
function next(){ current = (current + 1) % TRACKS.length; playTrack(); }
playBtn.addEventListener('click', togglePlay);
prevBtn.addEventListener('click', prev);
nextBtn.addEventListener('click', next);
audio.addEventListener('timeupdate', () => {
if(audio.duration){
const pct = (audio.currentTime / audio.duration) * 100;
progressEl.style.width = pct + '%';
timeEl.textContent = formatTime(audio.currentTime) + ' / ' + formatTime(audio.duration);
}
});
audio.addEventListener('ended', () => {
// auto next
next();
});
timeline.addEventListener('click', (e) => {
const rect = timeline.getBoundingClientRect();
const pct = (e.clientX - rect.left) / rect.width;
if(audio.duration) audio.currentTime = pct * audio.duration;
});
function formatTime(s){ s = Math.floor(s||0); const m = Math.floor(s/60); const sec = s%60; return m+':'+String(sec).padStart(2,'0'); }
// small helpers
function openLink(url){ window.open(url,'_blank','noopener'); }
// init
document.getElementById('year').textContent = new Date().getFullYear();
// pre-load first track silently (no autoplay)
loadTrack(0);
// Optional: lightweight keyboard controls
document.addEventListener('keydown', (e) => {
if(e.code === 'Space') { e.preventDefault(); togglePlay(); }
if(e.code === 'ArrowRight') next();
if(e.code === 'ArrowLeft') prev();
});
// Example: dynamically populate tour list (if you want to update via JS)
const tour = [
{ date: 'Dec 20, 2025', venue: 'The Blue Room', city: 'Austin, TX', link: '#' },
{ date: 'Jan 10, 2026', venue: 'Green Stage', city: 'Nashville, TN', link: '#' }
];
const tourList = document.getElementById('tour-list');
tourList.innerHTML = tour.map(t => `<li class="tour-item"><div><strong>${t.date} — ${t.venue}</strong><small>${t.city}</small></div><div><a class="nav-link" href="${t.link}">Tickets</a></div></li>`).join('');
</script>
</body>
</html>