/wp-content/themes/your-theme/page-radio.php Your Radio :root{ –bg:#fff; –fg:#111; –muted:#666; –line:#e7e7e7; –pad:18px; –max:1200px; –radius:14px; } *{box-sizing:border-box} body{ margin:0; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, “Helvetica Neue”, sans-serif; background:var(–bg); color:var(–fg); padding-bottom:86px; /* space for player bar */ } a{color:inherit; text-decoration:none} .wrap{max-width:var(–max); margin:0 auto; padding:0 var(–pad)} .topbar{ position:sticky; top:0; z-index:10; background:rgba(255,255,255,.9); backdrop-filter:saturate(180%) blur(10px); border-bottom:1px solid var(–line); } .topbar-inner{ display:flex; align-items:center; justify-content:space-between; height:64px; } .brand{ display:flex; gap:10px; align-items:center; font-weight:700; letter-spacing:.2px; } .logo{ width:34px; height:34px; border:2px solid var(–fg); border-radius:50%; display:grid; place-items:center; font-size:12px; } .nav{ display:flex; gap:14px; align-items:center; font-size:14px; } .nav a{padding:8px 10px; border-radius:999px} .nav a:hover{background:#f4f4f4} .btn{ border:1px solid var(–fg); background:var(–fg); color:var(–bg); padding:10px 14px; border-radius:999px; cursor:pointer; font-weight:600; font-size:14px; } .btn.secondary{ background:transparent; color:var(–fg); } .hero{ padding:22px 0 8px; border-bottom:1px solid var(–line); } .kicker{color:var(–muted); font-size:12px; text-transform:uppercase; letter-spacing:.12em} .h1{ margin:8px 0 10px; font-size: clamp(28px, 3vw, 44px); line-height:1.08; letter-spacing:-.02em; font-weight:800; } .sub{ margin:0; color:var(–muted); max-width:70ch; line-height:1.5; } .section{padding:26px 0} .section h2{ margin:0 0 14px; font-size:18px; letter-spacing:-.01em; } .nextup{ display:flex; flex-wrap:wrap; gap:16px; border:1px solid var(–line); border-radius:var(–radius); padding:16px; align-items:center; } .pill{ display:inline-flex; align-items:center; gap:8px; padding:8px 12px; border:1px solid var(–line); border-radius:999px; font-size:13px; color:var(–muted); } .dot{ width:8px; height:8px; border-radius:50%; background:var(–fg); } .nextup-title{font-weight:700} .nextup-meta{color:var(–muted); font-size:13px} .grid{ display:grid; grid-template-columns: repeat(12, 1fr); gap:16px; } .card{ grid-column: span 4; border:1px solid var(–line); border-radius:var(–radius); overflow:hidden; background:#fff; min-height:320px; display:flex; flex-direction:column; } .thumb{ aspect-ratio: 16 / 10; background:#f2f2f2; display:block; width:100%; object-fit:cover; } .card-body{ padding:14px; display:flex; flex-direction:column; gap:8px; flex:1; } .title{font-weight:800; line-height:1.15} .meta{color:var(–muted); font-size:13px} .tags{ margin-top:auto; display:flex; flex-wrap:wrap; gap:8px; } .tag{ font-size:12px; padding:6px 10px; border-radius:999px; border:1px solid var(–line); color:#333; background:#fafafa; } .newslist{ display:grid; gap:10px; border-top:1px solid var(–line); padding-top:14px; } .newsitem{ display:flex; gap:10px; align-items:baseline; padding:10px 0; border-bottom:1px solid var(–line); } .date{min-width:110px; color:var(–muted); font-size:13px} .headline{font-weight:700} .snippet{color:var(–muted); font-size:13px} .playerbar{ position:fixed; left:0; right:0; bottom:0; z-index:20; background:rgba(255,255,255,.96); border-top:1px solid var(–line); backdrop-filter:saturate(180%) blur(10px); } .player-inner{ max-width:var(–max); margin:0 auto; padding:12px var(–pad); display:flex; align-items:center; justify-content:space-between; gap:12px; } .now{ display:flex; flex-direction:column; gap:2px; min-width:220px; } .now strong{font-size:14px} .now span{font-size:13px; color:var(–muted)} .controls{ display:flex; align-items:center; gap:10px; } .bigplay{ width:46px; height:46px; border-radius:999px; border:1px solid var(–fg); background:var(–fg); color:var(–bg); cursor:pointer; font-weight:800; } .vol{ width:140px; } /* simple mobile */ @media (max-width: 900px){ .nav a{display:none} .card{grid-column: span 6} } @media (max-width: 600px){ .card{grid-column: span 12} .date{min-width:92px} .vol{display:none} .now{min-width:auto} }
Live from your city
Independent radio for music, voices, and community.

A minimal, editorial homepage with shows, news, and a persistent player button, inspired by community radio platforms.

Next Up

On Air soon
Sunday Live Session
13:00–16:00 • Talk, Music, Community
All Shows

Featured Shows

News

About

Put your short mission text here. Keep it direct, like Refuge Worldwide does with a simple intro and a link to read more. :contentReference[oaicite:1]{index=1}

Offline Press play to start stream
Shows
// Replace with your real stream URL (Icecast, Shoutcast, HLS, etc.) const STREAM_URL = “https://example.com/stream.mp3”; const audio = new Audio(); audio.src = STREAM_URL; audio.preload = “none”; audio.crossOrigin = “anonymous”; const playBtn = document.getElementById(“playBtn”); const nowTitle = document.getElementById(“nowTitle”); const nowMeta = document.getElementById(“nowMeta”); const vol = document.getElementById(“vol”); vol.addEventListener(“input”, () => audio.volume = parseFloat(vol.value)); audio.volume = parseFloat(vol.value); function playPause(){ if (audio.paused){ audio.play().then(() => { playBtn.textContent = “❚❚”; nowTitle.textContent = “Live Stream”; nowMeta.textContent = “Now playing”; }).catch(() => { nowTitle.textContent = “Cannot play”; nowMeta.textContent = “Check stream URL or browser autoplay settings”; }); } else { audio.pause(); playBtn.textContent = “▶”; nowTitle.textContent = “Paused”; nowMeta.textContent = “Press play to continue”; } } function toggleMenu(){ alert(“Menu placeholder. In WordPress, this can open an overlay with links.”); }

categories

subscribe to my blog