diff --git a/CHANGELOG.md b/CHANGELOG.md index 24db833..d9afc83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ so you can always tell what a deployment is actually serving. ## [Unreleased] +## [0.5.2] - 2026-09-03 + +### Changed +- Champion banner and the Final badge are deep gold instead of beige. +- Round-1 bye slots in the bracket read "bye" instead of "TBD"; no stray dot before the + phase badge when a tournament has no date. + ## [0.5.1] - 2026-09-03 ### Changed diff --git a/package.json b/package.json index 39bcf72..1ebc922 100644 --- a/package.json +++ b/package.json @@ -1 +1 @@ -{"name":"courtside","type":"module","version":"0.5.1","scripts":{"test":"node --test test/*.test.js","sim":"node simulate.js","start":"node --disable-warning=ExperimentalWarning server/index.js","dev":"node --disable-warning=ExperimentalWarning --watch server/index.js","demo":"node --disable-warning=ExperimentalWarning scripts/seed-demo.js","smoke":"bash test/smoke.sh"},"description":"Self-hosted volleyball tournament desk: one QR code from check-in to live scores","main":"server/index.js","directories":{"test":"test"},"keywords":[],"author":"","license":"MIT","dependencies":{"qrcode":"^1.5.4","ws":"^8.21.3"},"engines":{"node":">=22.13"},"repository":{"type":"git","url":"https://gitea.cloudfreeiot.com/bkvargyas/courtside.git"}} \ No newline at end of file +{"name":"courtside","type":"module","version":"0.5.2","scripts":{"test":"node --test test/*.test.js","sim":"node simulate.js","start":"node --disable-warning=ExperimentalWarning server/index.js","dev":"node --disable-warning=ExperimentalWarning --watch server/index.js","demo":"node --disable-warning=ExperimentalWarning scripts/seed-demo.js","smoke":"bash test/smoke.sh"},"description":"Self-hosted volleyball tournament desk: one QR code from check-in to live scores","main":"server/index.js","directories":{"test":"test"},"keywords":[],"author":"","license":"MIT","dependencies":{"qrcode":"^1.5.4","ws":"^8.21.3"},"engines":{"node":">=22.13"},"repository":{"type":"git","url":"https://gitea.cloudfreeiot.com/bkvargyas/courtside.git"}} \ No newline at end of file diff --git a/server/public/app.css b/server/public/app.css index ca65354..eef2203 100644 --- a/server/public/app.css +++ b/server/public/app.css @@ -2,6 +2,7 @@ --bg:#F7F8F6;--surface:#fff;--ink:#17202A;--muted:#5B6875;--line:#DCE1DE; --accent:#1D6FB5;--accent-ink:#fff;--accent-soft:#E4EFF9;--sand:#B98F3F;--sand-soft:#F6EBD2; --good:#2E8B57;--warn:#C97B1C;--crit:#C0392B;--court:#1A6FB5;--court-ink:#fff; + --gold:#B8860B;--gold-light:#D4A422;--gold-deep:#8A6508; } @media (prefers-color-scheme:dark){:root{--bg:#12181F;--surface:#1A222B;--ink:#E8ECEF;--muted:#9AA6B1;--line:#2B3640;--accent:#5AA3E6;--accent-ink:#0E1A26;--accent-soft:#1B3040;--sand:#D9B26E;--sand-soft:#3A3120;--good:#5FCB8A;--warn:#E39A3B;--crit:#E5655A;--court:#1D5F99}} *{box-sizing:border-box} @@ -20,13 +21,13 @@ main{max-width:960px;margin:0 auto;padding:16px 16px 64px} .eyebrow{font-family:"Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.12em;font-size:13px;font-weight:600;color:var(--muted)} .hero{padding:18px 0 8px}.hero.compact{padding:8px 0}.lede{color:var(--muted);margin:6px 0 0}.notes{white-space:pre-line} .pill{display:inline-block;font-family:"Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.08em;font-size:12px;font-weight:600;padding:2px 8px;border-radius:3px;line-height:1.5;vertical-align:middle;background:var(--accent-soft);color:var(--accent)} -.pill.live{background:var(--good);color:#fff}.pill.final{background:var(--sand-soft);color:var(--sand)}.pill.checkin{background:var(--accent);color:var(--accent-ink)} +.pill.live{background:var(--good);color:#fff}.pill.final{background:var(--gold);color:#fff}.pill.checkin{background:var(--accent);color:var(--accent-ink)} .card{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:16px;margin:14px 0} .card h2{margin-bottom:8px} .list .row{display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;padding:12px 14px;margin:8px 0;background:var(--surface);border:1px solid var(--line);border-radius:8px;color:var(--ink);text-decoration:none} .flash{padding:10px 14px;border-radius:6px;margin:12px 0;background:var(--accent-soft)}.flash.error{background:var(--sand-soft);color:var(--crit);border-left:3px solid var(--crit)} .banner{background:var(--sand-soft);border-left:3px solid var(--sand);padding:10px 14px;border-radius:0 6px 6px 0;margin:12px 0;font-weight:600} -.champion{text-align:center;padding:20px;margin:14px 0;border:2px solid var(--sand);border-radius:8px;background:var(--sand-soft)}.champion h2{font-size:40px} +.champion{text-align:center;padding:22px 20px;margin:14px 0;border:2px solid var(--gold-deep);border-radius:8px;background:linear-gradient(160deg,var(--gold-light),var(--gold) 55%,var(--gold-deep));color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.25)}.champion .eyebrow{color:#FFF3C4}.champion h2{font-size:40px} /* forms */ .form label{display:block;margin:12px 0;font-weight:600} .form input,.form textarea,.form select{display:block;width:100%;margin-top:4px;padding:10px 12px;font:inherit;font-weight:400;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--ink)} diff --git a/server/public/board.js b/server/public/board.js index 9e8cdb7..3cca3e8 100644 --- a/server/public/board.js +++ b/server/public/board.js @@ -34,7 +34,7 @@ const s = state; const mine = myTeam ? [...s.teams, ...s.withdrawn].find(t => t.id === myTeam) : null; const parts = []; - if (!display) parts.push(`
${esc(s.date ?? '')} · ${phaseLabel[s.phase]}

${esc(s.name)}

${rulesLine(s.rules)}${s.avgMatchMin ? ` · matches running ~${s.avgMatchMin} min` : ''}

`); + if (!display) parts.push(`
${s.date ? `${esc(s.date)} · ` : ''}${phaseLabel[s.phase]}

${esc(s.name)}

${rulesLine(s.rules)}${s.avgMatchMin ? ` · matches running ~${s.avgMatchMin} min` : ''}

`); else parts.push(`

${esc(s.name)}

${phaseLabel[s.phase]}
`); if (s.banner) parts.push(``); if (s.champion) parts.push(`
Champion

${esc(s.champion)}

`); @@ -172,6 +172,7 @@ } function feedLabel(m, side) { + if (m.status === 'bye') return 'bye'; // what fills this slot later: winner/loser of which match const wantSide = side === 0 ? 'A' : 'B'; const w = state.bracket.find(f => f.feeds === m.id && f.feedsSide === wantSide);