diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-27 00:33:25 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-27 00:33:25 +0300 |
| commit | 61bec49572358259f7e98e37c2f8cdfda423ed5d (patch) | |
| tree | 0a1d42cee6c1ff26f72069df77867fda32ef5396 /website/src/pages/compare.astro | |
| parent | cfffe6599e4f82f89af4f9b36487793226f54dfe (diff) | |
feat: refactor website homepage
Diffstat (limited to 'website/src/pages/compare.astro')
| -rw-r--r-- | website/src/pages/compare.astro | 175 |
1 files changed, 171 insertions, 4 deletions
diff --git a/website/src/pages/compare.astro b/website/src/pages/compare.astro index 531c2c19..2baf7b30 100644 --- a/website/src/pages/compare.astro +++ b/website/src/pages/compare.astro @@ -8,7 +8,7 @@ name="description" content="Compare Herdr with tmux, Zellij, cmux, Warp, Solo, Conductor, Emdash, and Superset. See where terminal multiplexers, agent terminals, process dashboards, and worktree orchestrators differ." /> - <meta name="theme-color" content="#f7f3ea" /> + <meta name="theme-color" content="#f0eee9" /> <link rel="canonical" href="https://herdr.dev/compare/" /> <meta property="og:type" content="website" /> @@ -36,13 +36,22 @@ <link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon.png?v=14" /> <link rel="apple-touch-icon" href="/assets/logo.png" /> <link rel="preload" href="/assets/jbm.woff2" as="font" type="font/woff2" crossorigin /> - <link rel="stylesheet" href="/css/style.css?v=compare1" /> + <script> + (function () { + var saved = localStorage.getItem("herdr-palette"); + var system = window.matchMedia("(prefers-color-scheme: dark)").matches + ? "tokyo-night" + : "tokyo-night-day"; + document.documentElement.setAttribute("data-palette", saved || system); + })(); + </script> + <link rel="stylesheet" href="/css/style.css?v=compare2" /> </head> <body> <header class="site-header"> <nav class="nav" aria-label="Primary navigation"> <a class="brand" href="/" aria-label="Herdr home"> - <img class="brand-logo" src="/assets/logo.svg" alt="" /> + <span class="brand-logo" aria-hidden="true"></span> <span>herdr</span> </a> <div class="nav-links"> @@ -250,7 +259,7 @@ <footer class="footer"> <a class="brand" href="/" aria-label="Herdr home"> - <img class="brand-logo" src="/assets/logo.svg" alt="" /> + <span class="brand-logo" aria-hidden="true"></span> <span>herdr</span> </a> <div> @@ -262,5 +271,163 @@ <a href="mailto:hey@herdr.dev">hey@herdr.dev</a> </div> </footer> + + <div class="theme-hint" id="theme-hint" title="Press / or t to switch theme"> + <span class="theme-hint-dot"></span> + <span class="theme-hint-label" id="theme-hint-label">light</span> + <span class="theme-hint-key">[/]</span> + </div> + + <div class="theme-overlay" id="theme-overlay" hidden> + <div class="theme-overlay-panel" role="dialog" aria-label="Theme switcher" aria-modal="true"> + <div class="theme-overlay-title">settings</div> + <div class="theme-overlay-tabs"><span class="active">theme</span></div> + <div class="theme-overlay-list" id="theme-overlay-list" role="listbox" aria-label="Themes"> + <div class="theme-sep"><span>dark</span></div> + <button type="button" role="option" data-value="catppuccin">catppuccin</button> + <button type="button" role="option" data-value="terminal">terminal</button> + <button type="button" role="option" data-value="tokyo-night">tokyo night</button> + <button type="button" role="option" data-value="dracula">dracula</button> + <button type="button" role="option" data-value="nord">nord</button> + <button type="button" role="option" data-value="gruvbox">gruvbox</button> + <button type="button" role="option" data-value="one-dark">one dark</button> + <button type="button" role="option" data-value="solarized">solarized</button> + <button type="button" role="option" data-value="kanagawa">kanagawa</button> + <button type="button" role="option" data-value="rose-pine">rose pine</button> + <button type="button" role="option" data-value="vesper">vesper</button> + <div class="theme-sep"><span>light</span></div> + <button type="button" role="option" data-value="catppuccin-latte">catppuccin latte</button> + <button type="button" role="option" data-value="tokyo-night-day">tokyo day</button> + <button type="button" role="option" data-value="gruvbox-light">gruvbox light</button> + <button type="button" role="option" data-value="one-light">one light</button> + <button type="button" role="option" data-value="solarized-light">solarized light</button> + <button type="button" role="option" data-value="kanagawa-lotus">kanagawa lotus</button> + <button type="button" role="option" data-value="rose-pine-dawn">rose pine dawn</button> + </div> + <div class="theme-overlay-footer"> + <span class="theme-overlay-hints"><span class="key">↑↓</span> select</span> + <span class="theme-overlay-actions"><span class="theme-apply-btn">↵ apply</span><button class="theme-close-btn" type="button" id="theme-close-btn">esc close</button></span> + </div> + </div> + </div> + + <script> + (function () { + var overlay = document.getElementById("theme-overlay"); + var list = document.getElementById("theme-overlay-list"); + var hintLabel = document.getElementById("theme-hint-label"); + if (!overlay || !list) return; + var options = Array.prototype.slice.call(list.querySelectorAll("[role='option']")); + var media = window.matchMedia("(prefers-color-scheme: dark)"); + var saved = localStorage.getItem("herdr-palette") || ""; + var committed = saved || defaultPalette(); + + function defaultPalette() { + return media.matches ? "tokyo-night" : "tokyo-night-day"; + } + + function setPalette(value) { + document.documentElement.setAttribute("data-palette", value || defaultPalette()); + } + + function updateUI(value) { + var activeValue = value || defaultPalette(); + options.forEach(function (opt) { + opt.setAttribute("aria-selected", String(opt.dataset.value === activeValue)); + }); + var active = options.find(function (opt) { return opt.dataset.value === activeValue; }); + if (hintLabel && active) hintLabel.textContent = active.textContent.trim(); + } + + function openOverlay() { + overlay.hidden = false; + document.body.style.overflow = "hidden"; + committed = localStorage.getItem("herdr-palette") || defaultPalette(); + updateUI(committed); + var active = list.querySelector("[aria-selected='true']") || options[0]; + if (active) active.focus(); + } + + function closeOverlay() { + overlay.hidden = true; + document.body.style.overflow = ""; + } + + function toggleOverlay() { + if (overlay.hidden) openOverlay(); + else closeOverlay(); + } + + function preview(index) { + if (index < 0 || index >= options.length) return; + setPalette(options[index].dataset.value); + updateUI(options[index].dataset.value); + options[index].focus(); + } + + function commit(value) { + setPalette(value); + localStorage.setItem("herdr-palette", value); + updateUI(value); + closeOverlay(); + } + + function revert() { + setPalette(committed); + updateUI(committed); + closeOverlay(); + } + + media.addEventListener("change", function () { + if (!localStorage.getItem("herdr-palette")) { + setPalette(""); + updateUI(""); + } + }); + + options.forEach(function (opt, idx) { + opt.addEventListener("click", function () { commit(opt.dataset.value); }); + opt.addEventListener("mouseenter", function () { preview(idx); }); + }); + + document.addEventListener("keydown", function (e) { + if ((e.key === "t" || e.key === "/") && !e.ctrlKey && !e.metaKey && !e.altKey) { + var tag = document.activeElement && document.activeElement.tagName; + if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return; + e.preventDefault(); + toggleOverlay(); + return; + } + if (overlay.hidden) return; + var idx = options.indexOf(document.activeElement); + if (e.key === "ArrowDown") { + e.preventDefault(); + preview(idx >= 0 ? Math.min(options.length - 1, idx + 1) : 0); + } else if (e.key === "ArrowUp") { + e.preventDefault(); + preview(idx >= 0 ? Math.max(0, idx - 1) : options.length - 1); + } else if (e.key === "Enter" && idx >= 0) { + e.preventDefault(); + commit(options[idx].dataset.value); + } else if (e.key === "Escape") { + e.preventDefault(); + revert(); + } + }); + + var themeHint = document.getElementById("theme-hint"); + if (localStorage.getItem("herdr-theme-hint-seen") === "1") { + themeHint.classList.add("is-seen"); + } + themeHint.addEventListener("mouseenter", function () { + localStorage.setItem("herdr-theme-hint-seen", "1"); + themeHint.classList.add("is-seen"); + }, { once: true }); + themeHint.addEventListener("click", toggleOverlay); + document.getElementById("theme-close-btn").addEventListener("click", revert); + setPalette(saved); + updateUI(saved); + })(); + </script> </body> </html> |
