From 4769a2ebe17e0f283e290bbdac126878c936f96f Mon Sep 17 00:00:00 2001 From: rays Date: Mon, 28 Sep 2026 17:45:35 +0000 Subject: [PATCH] The logo beside the add-feed button, with the version on hover (#60) The logo sat at the top of the feed list with "iPX" written beside it, and the page showed the version nowhere. It is now in the top bar just before the feed buttons, alone, and its tooltip names the app and its version. The version is filled in by the server as it sends the page, not by build.mjs: build.rs reruns only when web/ or package-lock.json changes, so a release that bumped only Cargo.toml would have kept the page naming the one before. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 2 ++ src/web.rs | 12 +++++++++++- web/app.css | 8 ++------ web/index.html | 4 +--- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c596426..8658f2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - The logo's needle is a brighter, redder orange that stands apart from the blue bars. +- The logo is in the top bar beside the add-feed button, in place of the name at the top of the + feed list. Hovering it shows iPX's version. ### Fixed diff --git a/src/web.rs b/src/web.rs index 762f755..d97d735 100644 --- a/src/web.rs +++ b/src/web.rs @@ -610,6 +610,9 @@ fn constant_time_eq(a: &str, b: &str) -> bool { // quotes, so ADMIN_LINK and HTML_TAG are spelled the way the minifier leaves them. const INDEX: &str = include_str!(concat!(env!("OUT_DIR"), "/index.html")); const ADMIN_LINK: &str = "") @@ -1002,6 +1005,13 @@ mod tests { assert!(page.contains("id=prefs"), "and only the link: the settings button beside it stays"); } + #[test] + fn the_logo_names_the_version() { + // If the minifier drifts from VERSION_SLOT, replacen matches nothing and says nothing. + let page = page_for(false, (None, None)); + assert!(!page.contains(VERSION_SLOT) && page.contains(concat!("iPX ", env!("CARGO_PKG_VERSION")))); + } + #[test] fn the_page_arrives_in_the_theme_the_account_chose() { let page = |t: &str, m: &str| page_for(true, (Some(t.into()), Some(m.into()))); diff --git a/web/app.css b/web/app.css index e57cde6..de84093 100644 --- a/web/app.css +++ b/web/app.css @@ -493,11 +493,7 @@ a{color:var(--accent)} background:var(--panel);border-right:1px solid var(--line); display:flex;flex-direction:column;min-height:0; } -.brand{display:flex;align-items:center;gap:9px;padding:14px 14px 10px} -.brand .logo{ - width:30px;height:30px;flex:none;border-radius:7px; -} -.brand h1{font-size:16px;margin:0;font-weight:650;letter-spacing:-.01em;color:var(--fg);flex:1} +#applogo{width:28px;height:28px;flex:none;border-radius:7px} .iconbtn{ width:30px;height:30px;border-radius:8px;display:grid;place-items:center; color:var(--dim);flex:none; @@ -548,7 +544,7 @@ a{color:var(--accent)} .who button:hover{color:var(--fg)} .sidefoot button{display:inline-flex;align-items:center;justify-content:center;gap:6px} .sidefoot i{font-style:normal;opacity:.75} -.searchwrap{padding:0 12px 8px} +.searchwrap{padding:12px 12px 8px} input[type=search],input[type=text],input[type=password],input[type=number],select{ width:100%;background:var(--bg);border:1px solid var(--line);color:var(--fg); border-radius:8px;padding:7px 10px;font:inherit;font-size:13.5px; diff --git a/web/index.html b/web/index.html index 8a3c7e9..02c7e11 100644 --- a/web/index.html +++ b/web/index.html @@ -14,6 +14,7 @@ +
@@ -33,9 +34,6 @@