//! # Rust Info Site Frontend //! //! Rendering functions for the site using [Dioxus](https://dioxuslabs.com/). #![allow(non_snake_case)] // use utils::{prop_structs::PoemDatabase, user_prefs::UserPrefs}; // use manganis; pub mod components; pub mod utils; // Urls are relative to your Cargo.toml file const _TAILWIND_URL: &str = manganis::mg!(file("public/tailwind.css")); /// A module that handles the functions needed /// to render the site. pub mod info_app { // import the prelude to get access to the `rsx!` macro and the `Scope` and `Element` types pub use dioxus::prelude::*; // use crate::components::void_buttons::*; // use crate::components::void_content::*; // use crate::components::void_footer::*; use crate::components::basic_page::*; use crate::components::home_page::*; use crate::components::identity_button::*; use crate::components::introduction_card::*; use crate::components::page_button::*; use crate::components::project_card::*; use crate::components::title_card::*; use crate::components::werefox_card::*; use crate::utils::prop_structs::*; // use crate::components::void_poem::*; // use crate::components::void_title::*; // use crate::utils::helpers; // use crate::utils::user_prefs::*; // use crate::{components::basic_page::*, utils::prop_structs::PageProps}; use dioxus_router::prelude::*; // use dioxus_use_storage::use_local_storage; #[derive(Routable, PartialEq, Clone)] pub enum Route { #[route("/")] #[redirect("/:..segments", |segments: Vec| Route::Home {})] Home {}, #[route("/projects")] Projects {}, #[route("/testimonials")] Testimonials {}, #[route("/hrt")] Hrt {}, #[route("/faq")] Faq {}, #[route("/support")] Support {}, } pub fn DioxusApp() -> Element { rsx! { Router:: {} } } // #[cfg(target_family = "wasm")] // fn PageNotFound() -> Element { // rsx! { // p { "That page doesn't exist, sorry!" } // } // } #[component] /// Renders the app and returns the rendered Element. pub fn Home() -> Element { let identity_list = [ ( "29", ImageProps { src: "/emoji/18_plus.svg".to_string(), alt: "Over 18 emoji".to_string(), }, ), ( "Transfemme", ImageProps { src: "/emoji/female_symbol.svg".to_string(), alt: "Female symbol emoji".to_string(), }, ), ( "She/It", ImageProps { src: "/emoji/speech_bubble_left.svg".to_string(), alt: "A speech bubble emoji".to_string(), }, ), ( "Pansexual", ImageProps { src: "/emoji/pansexual_flag.svg".to_string(), alt: "Pansexual flag emoji".to_string(), }, ), ( "Lesbian", ImageProps { src: "/emoji/lesbian_flag.svg".to_string(), alt: "Lesbian flag emoji".to_string(), }, ), ( "Dragon", ImageProps { src: "/emoji/:alicehappy:.png".to_string(), alt: "Alice happy emoji".to_string(), }, ), ]; let project_list = [ ( "Stuff I Do!", Route::Projects {}, ImageProps { src: "/emoji/crt_prompt.svg".to_string(), alt: "CRT prompt emoji".to_string(), }, ), ( "See Testimonials!", Route::Testimonials {}, ImageProps { src: "/emoji/awoo.svg".to_string(), alt: "Awoo emoji".to_string(), }, ), ( "HRT Tracker!", Route::Hrt {}, ImageProps { src: "/emoji/trans_heart.png".to_string(), alt: "Transgender heart emoji".to_string(), }, ), ( "FAQ", Route::Faq {}, ImageProps { src: "/emoji/red_question_mark.svg".to_string(), alt: "Red question mark emoji".to_string(), }, ), ( "Support Me?", Route::Support {}, ImageProps { src: "/emoji/green_money.svg".to_string(), alt: "Green money emoji".to_string(), }, ), ]; rsx! { HomePage { page_title: "About a Werefox", card_title: "Hi! I'm Alice Werefox!", WerefoxCard { card_title: "Basic Info".to_string(), title_emoji: None, div { class: "grid xl:grid-rows-1 xl:grid-cols-6 sm:grid-rows-2 sm:grid-cols-3 grid-rows-9 grid-cols-1 sm:gap-2 gap-0", for e in identity_list { IdentityButton { button_text: e.0, image_props: e.1 } } } } WerefoxCard { card_title: "Welcome to my little info site!", title_emoji: None, IntroductionCard {} } WerefoxCard { card_title: "Neat Pages!", title_emoji: None, div { class: "flex flex-col space-y-4", for e in project_list { PageButton { button_text: e.0, button_route: e.1, image_props: e.2 } } } } } } } #[component] pub fn Projects() -> Element { let project_list = [ ( "Streaming", "I stream regularly! Sometimes randomizers, sometimes just a chill time with a fun game.", "https://twitch.tv/alice_werefox", ImageProps { src: "/emoji/twitch-logo.png".to_string(), alt: "Twitch logo".to_string(), }, ), ( "Poetry", "Sometimes, I write poetry. It's not always the happiest, but I am proud of it. It would mean a lot to me if you took a look!", "https://void.werefox.cafe", ImageProps { src: "/emoji/pen.svg".to_string(), alt: "Pen emoji".to_string(), }, ), ( "Programming", "Much like this site, sometimes I program things! Gotta at least try and put that Comp. Sci. degree to good use!", "https://gitea.werefox.cafe/ada", ImageProps { src: "/emoji/laptop.svg".to_string(), alt: "Laptop emoji".to_string(), }, ), ( "Valentine's Day Letter", "Here's a little treat I put together for Valentine's Day one year, and I decided to just keep it up all year. Feel free to take a look if you ever need a little pick-me-up.", "https://letter.werefox.cafe", ImageProps { src: "/emoji/red_heart.svg".to_string(), alt: "Red heart emoji".to_string(), }, ), ]; rsx! { BasicPage { page_title: "Some stuff I do!", div { class: "rounded-lg ring-2 ring-alice-werefox-grey dark:ring-alice-werefox-grey-darker bg-alice-werefox-grey-light dark:bg-alice-werefox-grey", WerefoxCard { card_title: "Personal Projects", for project in project_list { ProjectCard { project_title: project.0, project_description: project.1, project_link: project.2, image_props: project.3 } } } } } } } #[component] pub fn Testimonials() -> Element { rsx! { div {} } } #[component] pub fn Hrt() -> Element { rsx! { div {} } } #[component] pub fn Faq() -> Element { rsx! { div {} } } #[component] pub fn Support() -> Element { rsx! { div {} } } // Renders the app and returns the rendered Element. // pub fn PoemListPage(props: VoidProps) -> Element { // #[cfg(target_family = "wasm")] // let poem_database = POEM_DATABASE // .get() // .expect("Poem database is not initialized") // .clone(); // #[cfg(any(target_family = "unix", target_family = "windows"))] // let poem_database = props.poem_database.clone(); // let user_prefs = props.user_prefs.clone(); // let (user_theme, user_font) = user_prefs.get_pref_classes(ThemedComponent::Page); // rsx! { // div { class: "{user_theme} {user_font}", // PageBase { // Title { title: "A Letter to the Void".to_string(), is_html: false, user_prefs: user_prefs.clone() } // BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() } // PoemList { poem_database: poem_database.clone(), user_prefs: user_prefs.clone() } // BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() } // Footer { theme: user_prefs.clone().get_theme(), font: user_prefs.get_font() } // } // } // } // } // pub fn PoemPage(props: VoidProps) -> Element { // #[cfg(target_family = "wasm")] // let poem_database = POEM_DATABASE // .get() // .expect("Poem database is not initialized") // .clone(); // #[cfg(any(target_family = "unix", target_family = "windows"))] // let poem_database = props.poem_database.clone(); // let user_prefs = props.user_prefs.clone(); // let (user_theme, user_font) = user_prefs.get_pref_classes(ThemedComponent::Page); // // #[cfg(any(target_family = "unix", target_family = "windows"))] // let slug = props // .slug // .as_ref() // .expect("A slug was given in the props.") // .clone(); // // #[cfg(target_family = "wasm")] // // let slug = String::from( // // use_route() // // .segment("slug") // // .expect("No slug specified."), // // ); // rsx! { // div { class: "{user_theme} {user_font}", // PageBase { // BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() } // GetPoem { slug: slug.clone(), poem_database: poem_database.clone(), user_prefs: user_prefs.clone() } // ButtonGroup { // NavigationButton { title: "Oldest".to_string(), slug: poem_database.get_oldest_entry(slug.clone()), user_prefs: user_prefs.clone() } // NavigationButton { title: "Previous".to_string(), slug: poem_database.get_previous_entry(slug.clone()), user_prefs: user_prefs.clone() } // NavigationButton { title: "Random".to_string(), slug: poem_database.get_random_entry(), user_prefs: user_prefs.clone() } // NavigationButton { title: "Next".to_string(), slug: poem_database.get_next_entry(slug.clone()), user_prefs: user_prefs.clone() } // NavigationButton { title: "Latest".to_string(), slug: poem_database.get_latest_entry(slug.clone()), user_prefs: user_prefs.clone() } // } // BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() } // Footer { theme: user_prefs.clone().get_theme(), font: user_prefs.get_font() } // } // } // } // } // pub fn SettingsPage(props: UserPrefs) -> Element { // let user_prefs = props.clone(); // let (user_theme, user_font) = user_prefs.get_pref_classes(ThemedComponent::Page); // // Get rid of this and create a general card component with children. // let (user_theme_card, user_font_card) = user_prefs.get_pref_classes(ThemedComponent::Card); // rsx! { // div { class: "{user_theme} {user_font}", // PageBase { // Title { title: "Settings".to_string(), is_html: false, user_prefs: user_prefs.clone() } // BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() } // div { class: "p-4 flex flex-col space-y-4 mx-auto max-w-full justify-center", // div { class: "p-4 flex flex-col space-y-4 text-xl text-center ring-4 {user_theme_card} {user_font_card}", // p { // "Theme" // } // ButtonGroup { // NavigationButton { title: "Light".to_string(), slug: "/settings/?theme=light".to_string(), user_prefs: user_prefs.clone() } // NavigationButton { title: "Dark".to_string(), slug: "/settings/?theme=dark".to_string(), user_prefs: user_prefs.clone() } // NavigationButton { title: "Auto".to_string(), slug: "/settings/?theme=auto".to_string(), user_prefs: user_prefs.clone() } // } // } // div { class: "p-4 flex flex-col space-y-4 text-xl text-center ring-4 {user_theme_card} {user_font_card}", // p { // "Font" // } // ButtonGroup { // NavigationButton { title: "Nerd Font".to_string(), slug: "/settings/?font=nerd".to_string(), user_prefs: user_prefs.clone(), override_font: "font-nerd".to_string() } // NavigationButton { title: "Open Dyslexic".to_string(), slug: "/settings/?font=open".to_string(), user_prefs: user_prefs.clone(), override_font: "font-open".to_string() } // } // } // } // BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.get_font() } // } // } // } // } }