From 0617663b249f9ca488e5de652108b17d67fbaf45 Mon Sep 17 00:00:00 2001 From: Vika Date: Sat, 29 Jul 2023 21:59:56 +0300 Subject: Moved the entire Kittybox tree into the root --- templates/src/templates.rs | 168 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 templates/src/templates.rs (limited to 'templates/src/templates.rs') diff --git a/templates/src/templates.rs b/templates/src/templates.rs new file mode 100644 index 0000000..63c67c5 --- /dev/null +++ b/templates/src/templates.rs @@ -0,0 +1,168 @@ +use http::StatusCode; +use kittybox_util::MicropubChannel; + +use crate::{Feed, VCard}; + +markup::define! { + Template<'a>(title: &'a str, blog_name: &'a str, feeds: Vec, user: Option, content: String) { + @markup::doctype() + html { + head { + title { @title } + link[rel="preconnect", href="https://fonts.gstatic.com"]; + link[rel="stylesheet", href="/.kittybox/static/style.css"]; + meta[name="viewport", content="initial-scale=1, width=device-width"]; + + link[rel="micropub", href="/.kittybox/micropub"]; + link[rel="micropub_media", href="/.kittybox/media"]; + link[rel="indieauth_metadata", href="/.kittybox/indieauth/metadata"]; + link[rel="webmention", href="/.kittybox/webmention"]; + // legacy links for some dumb clients + link[rel="authorization_endpoint", href="/.kittybox/indieauth/auth"]; + link[rel="token_endpoint", href="/.kittybox/indieauth/token"]; + // LibreJS-compliant JS licensing info (because TypeScript is a bitch) + link[rel="jslicense", href="/.kittybox/static/jslicense.html"]; + /*@if let Some(endpoints) = endpoints { + @if let Some(webmention) = &endpoints.webmention { + link[rel="webmention", href=&webmention]; + } + @if let Some(microsub) = &endpoints.microsub { + link[rel="microsub", href=µsub]; + } + }*/ + } + body { + a[href="#main_content", id="skip-to-content"] { "Skip to content" } + // TODO Somehow compress headerbar into a menu when the screen space is tight + nav #headerbar { + ul { + li { a #homepage[href="/"] { @blog_name } } + @for feed in feeds.iter() { + li { a[href=&feed.uid] { @feed.name } } + } + li.shiftright { + @if user.is_none() { + a #login[href="/login"] { "Sign in" } + } else { + span { + @user.as_ref().unwrap() " - " a #logout[href="/logout"] { "Sign out" } + } + } + } + } + } + main #main_content { + @markup::raw(content) + } + footer { + p { + "Powered by " a[href="https://sr.ht/~vikanezrimaya/kittybox"] { + "Kittybox" + } + } + } + } + } + } + MainPage<'a>(feed: &'a serde_json::Value, card: &'a serde_json::Value, cursor: Option<&'a str>, webring: bool) { + .sidebyside { + @VCard { card } + #dynamicstuff { + div { + p { "This section will provide interesting statistics or tidbits about my life in this exact moment (with maybe a small delay)." } + p { "It will probably require JavaScript to self-update, but I promise to keep this widget lightweight and open-source!" } + p { small { + "JavaScript isn't a menace, stop fearing it or I will switch to WebAssembly " + "and knock your nico-nico-kneecaps so fast with its speed you won't even notice that... " + small { "omae ha mou shindeiru" } + @markup::raw("") + } } + } + @if *webring { + #webring { + a[href="https://xn--sr8hvo.ws/previous"] { "←" } + " An " + a[href="https://xn--sr8hvo.ws"] { + "IndieWeb Webring" + } + " πŸ•ΈπŸ’ " + a[href="https://xn--sr8hvo.ws/next"] { "β†’" } + } + } + } + } + @Feed { feed, cursor: *cursor } + } + ErrorPage(code: StatusCode, msg: Option) { + h1 { @format!("HTTP {code}") } + @match *code { + StatusCode::UNAUTHORIZED => { + p { "Looks like you need to authenticate yourself before seeing this page. Try logging in with IndieAuth using the Login button above!" } + } + StatusCode::FORBIDDEN => { + p { "Looks like you're forbidden from viewing this page." } + p { + "This might've been caused by being banned from viewing my website" + "or simply by trying to see what you're not supposed to see, " + "like a private post that's not intended for you. It's ok, it happens." + } + } + StatusCode::GONE => { + p { "Looks like the page you're trying to find is gone and is never coming back." } + } + StatusCode::UNAVAILABLE_FOR_LEGAL_REASONS => { + p { "The page is there, but I can't legally provide it to you because the censorship said so." } + } + StatusCode::NOT_FOUND => { + p { "Looks like there's no such page. Maybe you or someone else mistyped a URL or my database experienced data loss." } + } + StatusCode::IM_A_TEAPOT => { + p { "Wait, do you seriously expect my website to brew you coffee? It's not a coffee machine!" } + + p { + small { + "I could brew you some coffee tho if we meet one day... " + small { + i { + "i-it's nothing personal, I just like brewing coffee, b-baka!!!~ >. { + @match msg { + None => { + p { + "There was an undescribed error in your request. " + "Please try again later or with a different request." + } + } + Some(msg) => { + p { + "There was a following error in your request:" + } + blockquote { pre { @msg } } + } + } + } + StatusCode::INTERNAL_SERVER_ERROR => { + @match msg { + None => { + p { "It seems like you have found an error. Not to worry, it has already been logged." } + } + Some(msg) => { + p { "The server encountered an error while processing your request:" } + blockquote { @msg } + p { "Don't worry, it has already been logged." } + } + } + } + _ => { + p { "It seems like you have found an error. Not to worry, it has already been logged." } + } + } + P { "For now, may I suggest to visit " a[href="/"] {"the main page"} " of this website?" } + + } +} -- cgit 1.4.1