diff --git a/web/app.js b/web/app.js index 630f853..78ca59d 100644 --- a/web/app.js +++ b/web/app.js @@ -122,8 +122,47 @@ document.addEventListener("DOMContentLoaded", () => { loadInitialData().then(openGuideFromHash); window.addEventListener("hashchange", openGuideFromHash); setInterval(watchTitles, 5000); + document.querySelectorAll("[data-donate]").forEach((b) => b.addEventListener("click", openDonate)); }); +const DONATE_URL = "https://paypal.me/oliverkoester"; + +// Donation dialog. On the TV a link is no use, so it shows a QR code for +// the phone (hidden on phones, where the button opens PayPal directly). +function openDonate() { + const back = document.activeElement; + const matrix = qrEncode(DONATE_URL); + const wrap = document.createElement("div"); + wrap.className = "guide-backdrop"; + wrap.innerHTML = ` + `; + const close = () => { + document.removeEventListener("keydown", onKey); + wrap.remove(); + if (back && document.contains(back)) back.focus(); + }; + const onKey = (e) => { if (e.key === "Escape") close(); }; + wrap.querySelector(".guide-close").addEventListener("click", close); + wrap.addEventListener("click", (e) => { if (e.target === wrap) close(); }); + document.addEventListener("keydown", onKey); + document.body.appendChild(wrap); + wrap.querySelector(".guide-close").focus(); +} + // The server rescans on its own when games are added or removed and bumps // titles_gen whenever the list or an update check changes; reload quietly then. let watchBusy = false; diff --git a/web/index.html b/web/index.html index 54b9335..456f43f 100644 --- a/web/index.html +++ b/web/index.html @@ -58,6 +58,7 @@
FW -- -- free +
@@ -239,6 +240,11 @@ Downloads on console
+ + diff --git a/web/styles.css b/web/styles.css index 64b8bcd..8e24d0e 100644 --- a/web/styles.css +++ b/web/styles.css @@ -116,6 +116,23 @@ svg { font-size: 12px; } .rail-foot span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.rail-foot .rail-donate { justify-self: start; margin-top: 4px; } + +.donate-row { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-top: 16px; + padding: 12px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--surface-2); + color: var(--muted); +} +.donate-row .row-button { width: auto; padding: 0 16px; } +.donate-open { display: inline-flex; align-items: center; justify-content: center; text-decoration: none; justify-self: start; padding: 0 18px; } /* ---------------- views + topbar ---------------- */