From 8bb0471a7106889839e106a6525fe64b69ce079c Mon Sep 17 00:00:00 2001 From: Simon Bernier St-Pierre Date: Sat, 8 Aug 2026 14:11:39 -0400 Subject: [PATCH] create & use logo --- src/assets.rs | 4 + src/http.rs | 7 +- src/views.rs | 5 +- static/apple-touch-icon.png | Bin 0 -> 18981 bytes static/favicon-32x32.png | Bin 0 -> 2271 bytes static/favicon.ico | Bin 0 -> 832 bytes static/logo.svg | 143 ++++++++++++++++++++++++++++++++++++ static/style.css | 2 +- 8 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 static/apple-touch-icon.png create mode 100644 static/favicon-32x32.png create mode 100644 static/favicon.ico create mode 100644 static/logo.svg diff --git a/src/assets.rs b/src/assets.rs index 16cd83b..360e7c1 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -67,6 +67,10 @@ pub static STORE: LazyLock = LazyLock::new(|| { "password-toggle.js" => "../static/password-toggle.js", "htmx.min.js" => "../static/htmx.min.js", "htmx-ws.min.js" => "../static/htmx-ws.min.js", + "favicon.ico" => "../static/favicon.ico", + "favicon-32x32.png" => "../static/favicon-32x32.png", + "apple-touch-icon.png" => "../static/apple-touch-icon.png", + "logo.svg" => "../static/logo.svg", } }); diff --git a/src/http.rs b/src/http.rs index 5173a20..35e20a8 100644 --- a/src/http.rs +++ b/src/http.rs @@ -342,8 +342,11 @@ async fn static_asset(Path(path): Path) -> Response { let Some(asset) = assets::STORE.get(&path) else { return StatusCode::NOT_FOUND.into_response(); }; - let mime = match path.as_str() { - "style.css" => "text/css", + let mime = match path.rsplit('.').next() { + Some("css") => "text/css", + Some("ico") => "image/x-icon", + Some("png") => "image/png", + Some("svg") => "image/svg+xml", _ => "application/javascript", }; let mut response = ([(header::CONTENT_TYPE, mime)], asset.data).into_response(); diff --git a/src/views.rs b/src/views.rs index a504f49..24c0256 100644 --- a/src/views.rs +++ b/src/views.rs @@ -1308,13 +1308,16 @@ fn page(title: &str, user: Option<&User>, content: Markup) -> Markup { meta charset="utf-8"; meta name="viewport" content="width=device-width, initial-scale=1"; title { (title) " ยท Sustenance" } + link rel="icon" href=(crate::assets::url("favicon.ico")) sizes="any"; + link rel="icon" type="image/png" href=(crate::assets::url("favicon-32x32.png")) sizes="32x32"; + link rel="apple-touch-icon" href=(crate::assets::url("apple-touch-icon.png")); link rel="stylesheet" href=(crate::assets::url("style.css")); script src=(crate::assets::url("htmx.min.js")) {} script src=(crate::assets::url("htmx-ws.min.js")) {} } body hx-boost="true" { header class="site-header" { - a class="brand" href="/lists" { span class="brand-mark" { "S" } "Sustenance" } + a class="brand" href="/lists" { img class="brand-mark" src=(crate::assets::url("logo.svg")) alt="Sustenance logo"; "Sustenance" } @if let Some(user) = user { nav class="site-nav" { a href="/lists" { "Lists" } diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e0c76d6a2900be13d1483901a80786eac8d02e GIT binary patch literal 18981 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 literal 0 HcmV?d00001 diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c11a75e3b314c1ba07cf1605099583b9c104842e GIT binary patch literal 832 zcmV-G1Hb$L0096201yxW0000W04f6j02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|5C8xG z5C{eU001BJ|6u?C0`W;iK~#90J(5jpTvZsyf6qDh&b@aslTOnlCZ;ihO&Y1CQRzaI zv{FgIZ(u1DU#L4$5 z5Ac7NrE3?`%%)$8HCIC8+o1_YtN|Y|Eep#35F-FVk(>~27rwj^WhVK;Ch>J&H>mTN zqQY2%SD@AAKL#;EojcSAlXR1gN#g5SsT!&9k*{1pLS|tlbB4iAMdT{c${8Rs07hV3 zE9bMCI~NV#U5aTpB`f`c(?yN#!OMlG|8PtzGrV(o4y%En5FNS{f^Qhro?o^NnF4?U>f1DWxK3n^ArFDKR!{QE(kw}2S)4t_d*@H_!>cc`aJ<90g=w&cw4HL} z^6P9q*`;s|nFtZ8sK8%aeMV)?%KQ|wlWp?a@$Tv(&IkI#G3_KiEDU(u-$z9d0iz00 zYf-OA{0q0uxEhUS6UCAQ)98X~k?l8}P>R0&7dp;rwAi zs>)GR>c$g-(uyMvN_X^6#ROH-mgQl8#EiZjC+cfz&)HT)^fn?RxnUskuGB2+iC zN(5`JG(NNe6I(+vks{p;RV8mccLyV~UPdpr!7DjceY*(N&3^&c%yC1hD_{En0000< KMNUMnLSTZW-f+bL literal 0 HcmV?d00001 diff --git a/static/logo.svg b/static/logo.svg new file mode 100644 index 0000000..6dfc4d3 --- /dev/null +++ b/static/logo.svg @@ -0,0 +1,143 @@ + + Sustenance grocery bag with produce + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/style.css b/static/style.css index 04aa1ef..bf68d6c 100644 --- a/static/style.css +++ b/static/style.css @@ -38,7 +38,7 @@ a { color: inherit; } } .brand { display: inline-flex; align-items: center; gap: 10px; text-decoration: none; font-weight: 800; letter-spacing: -.03em; } -.brand-mark { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 11px 11px 11px 3px; background: var(--deep-sage); color: white; transform: rotate(-6deg); } +.brand-mark { display: block; width: 34px; height: 34px; border-radius: 9px; object-fit: cover; } .site-nav { display: flex; align-items: center; gap: 6px; } .site-nav a { padding: 8px 14px;