From b6ae017457fa74d4b5dafc1ae5fee443138d3480 Mon Sep 17 00:00:00 2001 From: Peter Li Date: Sat, 7 Feb 2026 18:11:31 -0800 Subject: [PATCH] saving --- src/handlers.rs | 7 +++++++ src/main.rs | 1 + templates/favicon.ico | Bin 0 -> 15406 bytes templates/signup.html | 1 - 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 templates/favicon.ico diff --git a/src/handlers.rs b/src/handlers.rs index 17999c0..a1ecbb7 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -47,6 +47,13 @@ pub async fn show_calendar( render_calendar_for_month(&state, &auth, today, today).await } +pub async fn favicon() -> impl IntoResponse { + ( + [(header::CONTENT_TYPE, "image/x-icon")], + include_bytes!("../templates/favicon.ico").as_slice(), + ) +} + pub async fn show_calendar_for_month( State(state): State, headers: HeaderMap, diff --git a/src/main.rs b/src/main.rs index 1f40bf9..7a8a535 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,6 +34,7 @@ async fn main() -> Result<(), Box> { // Route wiring stays here so `main` is the single startup overview. let app = Router::new() .route("/", get(handlers::show_calendar)) + .route("/favicon.ico", get(handlers::favicon)) .route("/login", get(handlers::show_login)) .route("/login", post(handlers::login)) .route("/signup", get(handlers::show_signup)) diff --git a/templates/favicon.ico b/templates/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f844f5d2d854f2d11256f7da9e147a39090884a2 GIT binary patch literal 15406 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 L|674~t-${S3rmXJ literal 0 HcmV?d00001 diff --git a/templates/signup.html b/templates/signup.html index 8f5d796..e328f06 100644 --- a/templates/signup.html +++ b/templates/signup.html @@ -5,7 +5,6 @@ {% block content %}

Create Account

-

First account created becomes admin.

{% if !page.allow_signup %}

Sign-up is disabled by server config.

{% endif %}