| <!DOCTYPE html> |
| <html lang="en-GB"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> |
| <meta name="robots" content="noindex,nofollow" /> |
| <meta name="theme-color" content="#1e3a5f" /> |
| <meta name="description" content="careTalk updates admin" /> |
| <link rel="icon" type="image/png" href="./icons/favicon.png" /> |
| <title>careTalk — updates</title> |
| <script> |
| (function () { |
| try { |
| var t = localStorage.getItem("don.ui.theme"); |
| if (t !== "light" && t !== "dark") { |
| t = matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; |
| } |
| document.documentElement.setAttribute("data-theme", t); |
| } catch (e) {} |
| })(); |
| </script> |
| <link rel="preconnect" href="https://fonts.googleapis.com" /> |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> |
| <link |
| href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,550;9..144,700&family=Source+Sans+3:wght@400;600;700&display=swap" |
| rel="stylesheet" |
| /> |
| <script type="module" crossorigin src="./assets/admin-COcnhFD_.js"></script> |
| <link rel="modulepreload" crossorigin href="./assets/theme-CuaEyjDL.js"> |
| <link rel="modulepreload" crossorigin href="./assets/subscribers-CLCOf4GQ.js"> |
| <link rel="stylesheet" crossorigin href="./assets/subscribers-BHyrZ7wW.css"> |
| <link rel="manifest" href="./manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head> |
| <body class="admin-page"> |
| <header class="site-header"> |
| <a class="brand-lockup" href="./"> |
| <span class="avatar" aria-hidden="true">C</span> |
| <span class="brand-name">careTalk</span> |
| </a> |
| <nav class="nav-links" aria-label="Primary"> |
| <button |
| type="button" |
| class="theme-toggle" |
| data-theme-toggle |
| aria-label="Switch to dark theme" |
| title="Dark theme" |
| > |
| <svg class="theme-icon theme-icon-sun" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> |
| <circle cx="12" cy="12" r="4" /> |
| <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41" /> |
| </svg> |
| <svg class="theme-icon theme-icon-moon" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> |
| <path d="M21 14.5A8.5 8.5 0 1 1 9.5 3a7 7 0 0 0 11.5 11.5z" /> |
| </svg> |
| </button> |
| <a class="btn btn-ghost" href="./">Back to site</a> |
| </nav> |
| </header> |
|
|
| <main class="section band"> |
| <div class="section-inner admin-wrap"> |
| <p class="version-pill">Version <span data-app-version>1.1.31</span></p> |
|
|
| <section id="adminLogin" class="admin-card" aria-labelledby="admin-login-title"> |
| <h1 id="admin-login-title">Updates access</h1> |
| <p class="lede">Sign in to review emails collected for careTalk update notes on this device.</p> |
| <form id="adminLoginForm" class="feedback-form" autocomplete="on"> |
| <label> |
| Username |
| <input name="username" type="text" autocomplete="username" required placeholder="Username" /> |
| </label> |
| <label> |
| Password |
| <input name="password" type="password" autocomplete="current-password" required /> |
| </label> |
| <div class="feedback-actions"> |
| <button type="submit" class="btn btn-primary">Sign in</button> |
| <p id="adminLoginStatus" class="feedback-status" hidden></p> |
| </div> |
| </form> |
| <p class="admin-privacy">Credentials are not published on the public site.</p> |
| </section> |
|
|
| <section id="adminPanel" class="admin-card" hidden aria-labelledby="admin-panel-title"> |
| <div class="admin-panel-head"> |
| <div> |
| <h1 id="admin-panel-title">Subscribers</h1> |
| <p class="lede"> |
| <strong id="subscriberCount">0</strong> email(s) on this browser |
| · careTalk <span data-app-version>1.1.31</span> |
| </p> |
| </div> |
| <div class="admin-actions"> |
| <button type="button" class="btn btn-ghost" id="exportSubscribers">Export CSV</button> |
| <button type="button" class="btn btn-ghost" id="clearSubscribers">Clear all</button> |
| <button type="button" class="btn btn-primary" id="adminSignOut">Sign out</button> |
| </div> |
| </div> |
|
|
| <p id="subscriberEmpty" class="feedback-wall-empty">No subscribers yet on this device.</p> |
|
|
| <div class="subscriber-table-wrap"> |
| <table class="subscriber-table"> |
| <thead> |
| <tr> |
| <th scope="col">Email</th> |
| <th scope="col">Name</th> |
| <th scope="col">Subscribed</th> |
| <th scope="col">Version</th> |
| <th scope="col"><span class="sr-only">Actions</span></th> |
| </tr> |
| </thead> |
| <tbody id="subscriberRows"></tbody> |
| </table> |
| </div> |
|
|
| <p class="admin-privacy"> |
| Static demo storage: lists are kept in this browser’s local storage (same origin). |
| Export CSV if you need a portable copy. |
| </p> |
| </section> |
| </div> |
| </main> |
|
|
| <footer class="site-footer"> |
| <div class="section-inner"> |
| <p>careTalk ops · v<span data-app-version>1.1.31</span></p> |
| </div> |
| </footer> |
|
|
| <style> |
| .sr-only { |
| position: absolute; |
| width: 1px; |
| height: 1px; |
| padding: 0; |
| margin: -1px; |
| overflow: hidden; |
| clip: rect(0, 0, 0, 0); |
| white-space: nowrap; |
| border: 0; |
| } |
| </style> |
| </body> |
| </html> |
|
|