From 0052054a192cb485e7f9673fa45f33333844f7a1 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Tue, 9 Jan 2024 12:41:44 +0100 Subject: [PATCH] form wip --- Cargo.lock | 326 ++++++++++++++++++++++++++-- Cargo.toml | 15 +- README.md | 6 + assets/ibis.css | 24 ++ assets/simple.css | 494 ++++++++++++++++++++++++++++++++++++++++++ index.html | 14 +- src/backend/mod.rs | 14 +- src/frontend/app.rs | 5 +- src/frontend/login.rs | 41 ++++ src/frontend/mod.rs | 14 ++ src/frontend/nav.rs | 25 +-- src/main.rs | 19 +- style.css | 326 ---------------------------- 13 files changed, 943 insertions(+), 380 deletions(-) create mode 100644 assets/ibis.css create mode 100644 assets/simple.css create mode 100644 src/frontend/login.rs delete mode 100644 style.css diff --git a/Cargo.lock b/Cargo.lock index 7136ebb..e4314db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,6 +69,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.7" @@ -297,6 +308,18 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -322,6 +345,29 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +[[package]] +name = "bytecheck" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", + "uuid", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytecount" version = "0.6.7" @@ -360,7 +406,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c878c71c2821aa2058722038a59a67583a4240524687c6028571c9b395ded61f" dependencies = [ - "darling", + "darling 0.14.4", "proc-macro2", "quote", "syn 1.0.109", @@ -490,6 +536,26 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f" +dependencies = [ + "log", + "web-sys", +] + [[package]] name = "const_format" version = "0.2.32" @@ -510,6 +576,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "convert_case" version = "0.6.0" @@ -592,8 +664,18 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core 0.20.3", + "darling_macro 0.20.3", ] [[package]] @@ -610,17 +692,42 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.39", +] + [[package]] name = "darling_macro" version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ - "darling_core", + "darling_core 0.14.4", "quote", "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core 0.20.3", + "quote", + "syn 2.0.39", +] + [[package]] name = "deranged" version = "0.3.10" @@ -630,6 +737,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive-where" version = "1.2.7" @@ -656,7 +774,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" dependencies = [ - "darling", + "darling 0.14.4", "proc-macro2", "quote", "syn 1.0.109", @@ -672,6 +790,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + [[package]] name = "diesel" version = "2.1.4" @@ -882,6 +1013,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.29" @@ -1069,6 +1206,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.7", +] [[package]] name = "hashbrown" @@ -1082,7 +1222,7 @@ version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" dependencies = [ - "ahash", + "ahash 0.8.7", "allocator-api2", ] @@ -1308,6 +1448,8 @@ dependencies = [ "axum-macros", "bcrypt", "chrono", + "console_error_panic_hook", + "console_log", "diesel", "diesel-derive-newtype", "diesel_migrations", @@ -1319,6 +1461,7 @@ dependencies = [ "jsonwebtoken", "leptos", "leptos_axum", + "leptos_form", "leptos_meta", "leptos_router", "log", @@ -1334,6 +1477,7 @@ dependencies = [ "tracing", "url", "uuid", + "wasm-bindgen", ] [[package]] @@ -1557,6 +1701,62 @@ dependencies = [ "web-sys", ] +[[package]] +name = "leptos_form" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b900a4aa333561feaab096899077dab6a75e46072988cf5a4c45b71f2c1e52e2" +dependencies = [ + "leptos", + "leptos_form_core", + "leptos_form_proc_macros", + "leptos_router", + "rustc_version", + "wasm-bindgen", +] + +[[package]] +name = "leptos_form_core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea205a16d85564b6c7b368ae53eae1f9690c37166db3f7dee19279f32ea4784a" +dependencies = [ + "derivative", + "derive_more", + "indexmap 2.1.0", + "leptos", + "paste", + "rustc_version", + "thiserror", + "typed-builder", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_form_proc_macros" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66f51d4e76639a2bc58eccea205b06cb84c672feee38bb3145c682801daaef6e" +dependencies = [ + "leptos_form_proc_macros_core", +] + +[[package]] +name = "leptos_form_proc_macros_core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907e75aeb43fb660b0247bb55cf6129c1c5e67c881dc60f976aad78c0130bc4f" +dependencies = [ + "convert_case 0.6.0", + "darling 0.20.3", + "derive_more", + "itertools 0.12.0", + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "leptos_hot_reload" version = "0.5.4" @@ -1597,7 +1797,7 @@ checksum = "a7e96f4c450f4b5e2ccb135c2b1328890f911ca4ee89da9ed6d582df929e6cb5" dependencies = [ "attribute-derive", "cfg-if", - "convert_case", + "convert_case 0.6.0", "html-escape", "itertools 0.11.0", "leptos_hot_reload", @@ -1639,6 +1839,7 @@ dependencies = [ "js-sys", "paste", "pin-project", + "rkyv", "rustc-hash", "self_cell", "serde", @@ -2222,6 +2423,26 @@ dependencies = [ "yansi 1.0.0-rc.1", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pulldown-cmark" version = "0.9.3" @@ -2281,6 +2502,12 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -2358,6 +2585,15 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "rend" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.11.22" @@ -2428,6 +2664,35 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "rkyv" +version = "0.7.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rstml" version = "0.11.2" @@ -2512,6 +2777,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "2.9.2" @@ -2725,6 +2996,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "simple_asn1" version = "0.6.2" @@ -2882,6 +3159,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "task-local-extensions" version = "0.1.4" @@ -3305,9 +3588,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3315,9 +3598,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", @@ -3342,9 +3625,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3352,9 +3635,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", @@ -3365,9 +3648,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-streams" @@ -3517,6 +3800,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "xxhash-rust" version = "0.8.8" diff --git a/Cargo.toml b/Cargo.toml index e6a02f1..4056ff1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,8 @@ ssr = [ "leptos_axum", "activitypub_federation" ] -csr = ["leptos/csr", "leptos_meta/csr"] +csr = ["leptos/csr", "leptos_meta/csr", "leptos_router/csr"] +hydrate = ["leptos/hydrate", "leptos_meta/hydrate", "leptos_router/hydrate"] [dependencies] activitypub_federation = { version = "0.5.0-beta.6", features = [ @@ -27,9 +28,9 @@ anyhow = "1.0.75" async-trait = "0.1.74" axum = { version = "0.6.20", optional = true } axum-macros = { version = "0.3.8", optional = true } -leptos = "0.5.4" -leptos_meta = "0.5.4" -leptos_router = "0.5.4" +leptos = { version = "0.5.4", features = ["nightly"] } +leptos_meta = { version = "0.5.4", features = ["nightly"] } +leptos_router = { version = "0.5.4", features = ["nightly"] } leptos_axum = { version = "0.5.4", optional = true } bcrypt = "0.15.0" chrono = { version = "0.4.31", features = ["serde"] } @@ -58,6 +59,11 @@ reqwest = { version = "0.11.22", features = ["json"] } log = "0.4" tracing = "0.1.40" once_cell = "1.18.0" +wasm-bindgen = "0.2.89" +console_error_panic_hook = "0.1.7" +console_log = "1.0.0" +#leptos_form = { path = "../leptos_form/leptos_form" } +leptos_form = "0.1.8" [dev-dependencies] pretty_assertions = "1.4.0" @@ -70,4 +76,5 @@ lib-features = ["csr"] site-addr = "127.0.0.1:8131" [lib] +name = "ibis_lib" crate-type = ["cdylib", "rlib"] diff --git a/README.md b/README.md index 3595029..4ecc6eb 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,12 @@ A federated Wikipedia alternative. Main objects in terms of federation are the ` The Ibis is a [bird which is related to the Egyptian god of knowledge and science](https://en.wikipedia.org/wiki/African_sacred_ibis#In_myth_and_legend). +## Development + +``` +cargo run +trunk serve --no-default-features --features csr,hydrate --filehash false --proxy-backend http://[::1]:8131 +``` ## License [AGPL](LICENSE) diff --git a/assets/ibis.css b/assets/ibis.css new file mode 100644 index 0000000..bc2d51e --- /dev/null +++ b/assets/ibis.css @@ -0,0 +1,24 @@ +html { + height: 100%; + width: 100%; +} + +body { + flex-direction: row; + display: flex; + min-height: 100%; + min-width: 100%; + padding: 0; +} + +nav { + background-color: #f6f6f6; + padding: 10px; + list-style: none; +} + +main { + background-color: #ffffff; + flex-grow: 1; + padding: 20px; +} \ No newline at end of file diff --git a/assets/simple.css b/assets/simple.css new file mode 100644 index 0000000..a75843a --- /dev/null +++ b/assets/simple.css @@ -0,0 +1,494 @@ +/* + https://github.com/kevquirk/simple.css +*/ + +/* Set the global variables for everything. Change these to use your own fonts and colours. */ +:root { + /* Set sans-serif & mono fonts */ + --sans-font: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir, + "Nimbus Sans L", Roboto, Noto, "Segoe UI", Arial, Helvetica, + "Helvetica Neue", sans-serif; + --mono-font: Consolas, Menlo, Monaco, "Andale Mono", "Ubuntu Mono", monospace; + + /* Body font size. By default, effectively 18.4px, based on 16px as 'root em' */ + --base-fontsize: 1.15rem; + + /* Major third scale progression - see https://type-scale.com/ */ + --header-scale: 1.25; + + /* Line height is set to the "Golden ratio" for optimal legibility */ + --line-height: 1.618; + + /* Default (light) theme */ + --bg: #fff; + --accent-bg: #f5f7ff; + --text: #212121; + --text-light: #585858; + --border: #d8dae1; + --accent: #0d47a1; + --accent-light: #90caf9; + --code: #d81b60; + --preformatted: #444; + --marked: #ffdd33; + --disabled: #efefef; +} + +html { + /* Set the font globally */ + font-family: var(--sans-font); +} + +/* Make the body a nice central block */ +body { + color: var(--text); + background: var(--bg); + font-size: var(--base-fontsize); + line-height: var(--line-height); + display: flex; + min-height: 100vh; + flex-direction: column; + flex: 1; + margin: 0 auto; + max-width: 45rem; + padding: 0 0.5rem; + overflow-x: hidden; + word-break: break-word; + overflow-wrap: break-word; +} + +/* Make the header bg full width, but the content inline with body */ +header { + background: var(--accent-bg); + border-bottom: 1px solid var(--border); + text-align: center; + padding: 2rem 0.5rem; + width: 100vw; + position: relative; + box-sizing: border-box; + left: 50%; + right: 50%; + margin-left: -50vw; + margin-right: -50vw; +} + +/* Remove margins for header text */ +header h1, +header p { + margin: 0; +} + +/* Add a little padding to ensure spacing is correct between content and nav */ +main { + padding-top: 1.5rem; +} + +/* Fix line height when title wraps */ +h1, +h2, +h3 { + line-height: 1.1; +} + +/* Format navigation */ +nav { + font-size: 1rem; + line-height: 2; + padding: 1rem 0; +} + +nav a { + margin: 1rem 1rem 0 0; + border: 1px solid var(--border); + border-radius: 5px; + color: var(--text) !important; + display: inline-block; + padding: 0.1rem 1rem; + text-decoration: none; + transition: 0.4s; +} + +nav a:hover { + color: var(--accent) !important; + border-color: var(--accent); +} + +nav a.current:hover { + text-decoration: none; +} + +footer { + margin-top: 4rem; + padding: 2rem 1rem 1.5rem 1rem; + color: var(--text-light); + font-size: 0.9rem; + text-align: center; + border-top: 1px solid var(--border); +} + +/* Format headers */ +h1 { + font-size: calc( + var(--base-fontsize) * var(--header-scale) * var(--header-scale) * + var(--header-scale) * var(--header-scale) + ); + margin-top: calc(var(--line-height) * 1.5rem); +} + +h2 { + font-size: calc( + var(--base-fontsize) * var(--header-scale) * var(--header-scale) * + var(--header-scale) + ); + margin-top: calc(var(--line-height) * 1.5rem); +} + +h3 { + font-size: calc( + var(--base-fontsize) * var(--header-scale) * var(--header-scale) + ); + margin-top: calc(var(--line-height) * 1.5rem); +} + +h4 { + font-size: calc(var(--base-fontsize) * var(--header-scale)); + margin-top: calc(var(--line-height) * 1.5rem); +} + +h5 { + font-size: var(--base-fontsize); + margin-top: calc(var(--line-height) * 1.5rem); +} + +h6 { + font-size: calc(var(--base-fontsize) / var(--header-scale)); + margin-top: calc(var(--line-height) * 1.5rem); +} + +/* Format links & buttons */ +a, +a:visited { + color: var(--accent); +} + +a:hover { + text-decoration: none; +} + +a button, +button, +[role="button"], +input[type="submit"], +input[type="reset"], +input[type="button"] { + border: none; + border-radius: 5px; + background: var(--accent); + font-size: 1rem; + color: var(--bg); + padding: 0.7rem 0.9rem; + margin: 0.5rem 0; + transition: 0.4s; +} + +a button[disabled], +button[disabled], +[role="button"][aria-disabled="true"], +input[type="submit"][disabled], +input[type="reset"][disabled], +input[type="button"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][disabled], +select[disabled] { + cursor: default; + opacity: 0.5; + cursor: not-allowed; +} + +input:disabled, +textarea:disabled, +select:disabled { + cursor: not-allowed; + background-color: var(--disabled); +} + +input[type="range"] { + padding: 0; +} + +/* Set the cursor to '?' while hovering over an abbreviation */ +abbr { + cursor: help; +} + +button:focus, +button:enabled:hover, +[role="button"]:focus, +[role="button"]:not([aria-disabled="true"]):hover, +input[type="submit"]:focus, +input[type="submit"]:enabled:hover, +input[type="reset"]:focus, +input[type="reset"]:enabled:hover, +input[type="button"]:focus, +input[type="button"]:enabled:hover, +input[type="checkbox"]:focus, +input[type="checkbox"]:enabled:hover, +input[type="radio"]:focus, +input[type="radio"]:enabled:hover { + filter: brightness(1.4); + cursor: pointer; +} + +/* Format the expanding box */ +details { + background: var(--accent-bg); + border: 1px solid var(--border); + border-radius: 5px; + margin-bottom: 1rem; +} + +summary { + cursor: pointer; + font-weight: bold; + padding: 0.6rem 1rem; +} + +details[open] { + padding: 0.6rem 1rem 0.75rem 1rem; +} + +details[open] summary { + margin-bottom: 0.5rem; + padding: 0; +} + +details[open] > *:last-child { + margin-bottom: 0; +} + +/* Format tables */ +table { + border-collapse: collapse; + width: 100%; + margin: 1.5rem 0; +} + +td, +th { + border: 1px solid var(--border); + text-align: left; + padding: 0.5rem; +} + +th { + background: var(--accent-bg); + font-weight: bold; +} + +tr:nth-child(even) { + /* Set every other cell slightly darker. Improves readability. */ + background: var(--accent-bg); +} + +table caption { + font-weight: bold; + margin-bottom: 0.5rem; +} + +/* Lists */ +ol, +ul { + padding-left: 3rem; +} + +/* Format forms */ +textarea, +select, +input { + font-size: inherit; + font-family: inherit; + padding: 0.5rem; + margin-bottom: 0.5rem; + color: var(--text); + background: var(--bg); + border: 1px solid var(--border); + border-radius: 5px; + box-shadow: none; + box-sizing: border-box; + width: 60%; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; +} + +/* Add arrow to */ +select { + background-image: linear-gradient(45deg, transparent 49%, var(--text) 51%), + linear-gradient(135deg, var(--text) 51%, transparent 49%); + background-position: calc(100% - 20px), calc(100% - 15px); + background-size: 5px 5px, 5px 5px; + background-repeat: no-repeat; +} + +select[multiple] { + background-image: none !important; +} + +/* checkbox and radio button style */ +input[type="checkbox"], +input[type="radio"] { + vertical-align: bottom; + position: relative; +} + +input[type="radio"] { + border-radius: 100%; +} + +input[type="checkbox"]:checked, +input[type="radio"]:checked { + background: var(--accent); +} + +input[type="checkbox"]:checked::after { + /* Creates a rectangle with colored right and bottom borders which is rotated to look like a check mark */ + content: " "; + width: 0.1em; + height: 0.25em; + border-radius: 0; + position: absolute; + top: 0.05em; + left: 0.18em; + background: transparent; + border-right: solid var(--bg) 0.08em; + border-bottom: solid var(--bg) 0.08em; + font-size: 1.8em; + transform: rotate(45deg); +} +input[type="radio"]:checked::after { + /* creates a colored circle for the checked radio button */ + content: " "; + width: 0.25em; + height: 0.25em; + border-radius: 100%; + position: absolute; + top: 0.125em; + background: var(--bg); + left: 0.125em; + font-size: 32px; +} + +/* Make the textarea wider than other inputs */ +textarea { + width: 80%; +} + +/* Makes input fields wider on smaller screens */ +@media only screen and (max-width: 720px) { + textarea, + select, + input { + width: 100%; + } +} + +/* Ensures the checkbox and radio inputs do not have a set width like other input fields */ +input[type="checkbox"], +input[type="radio"] { + width: auto; +} + +/* do not show border around file selector button */ +input[type="file"] { + border: 0; +} + +/* Without this any HTML using
shows ugly borders and has additional padding/margin. (Issue #3) */ +fieldset { + border: 0; + padding: 0; + margin: 0; +} + +/* Misc body elements */ + +hr { + color: var(--border); + border-top: 1px; + margin: 1rem auto; +} + +mark { + padding: 2px 5px; + border-radius: 4px; + background: var(--marked); +} + +main img, +main video { + max-width: 100%; + height: auto; + border-radius: 5px; +} + +figure { + margin: 0; +} + +figcaption { + font-size: 0.9rem; + color: var(--text-light); + text-align: center; + margin-bottom: 1rem; +} + +blockquote { + margin: 2rem 0 2rem 2rem; + padding: 0.4rem 0.8rem; + border-left: 0.35rem solid var(--accent); + opacity: 0.8; + font-style: italic; +} + +cite { + font-size: 0.9rem; + color: var(--text-light); + font-style: normal; +} + +/* Use mono font for code like elements */ +code, +pre, +pre span, +kbd, +samp { + font-size: 1.075rem; + font-family: var(--mono-font); + color: var(--code); +} + +kbd { + color: var(--preformatted); + border: 1px solid var(--preformatted); + border-bottom: 3px solid var(--preformatted); + border-radius: 5px; + padding: 0.1rem; +} + +pre { + padding: 1rem 1.4rem; + max-width: 100%; + overflow: auto; + overflow-x: auto; + color: var(--preformatted); + background: var(--accent-bg); + border: 1px solid var(--border); + border-radius: 5px; +} + +/* Fix embedded code within pre */ +pre code { + color: var(--preformatted); + background: none; + margin: 0; + padding: 0; +} diff --git a/index.html b/index.html index 3134896..678c8dd 100644 --- a/index.html +++ b/index.html @@ -1,19 +1,7 @@ - + - \ No newline at end of file diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 59844ae..0e75718 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -20,10 +20,11 @@ use diesel_migrations::EmbeddedMigrations; use diesel_migrations::MigrationHarness; use leptos::*; use leptos_axum::{generate_route_list, LeptosRoutes}; +use log::info; use std::net::ToSocketAddrs; use std::sync::{Arc, Mutex}; use tower_http::cors::CorsLayer; -use tower_http::services::ServeFile; +use tower_http::services::{ServeDir, ServeFile}; pub mod api; pub mod database; @@ -92,12 +93,21 @@ pub async fn start(hostname: &str, database_url: &str) -> MyResult<()> { let app = Router::new() .leptos_routes(&leptos_options, routes, || view! { }) .with_state(leptos_options) - .route_service("/style.css", ServeFile::new("style.css")) + .nest_service("/assets", ServeDir::new("assets")) + .nest_service( + "/pkg/ibis.js", + ServeFile::new_with_mime("dist/ibis.js", &"application/javascript".parse()?), + ) + .nest_service( + "/pkg/ibis_bg.wasm", + ServeFile::new_with_mime("dist/ibis_bg.wasm", &"application/wasm".parse()?), + ) .nest("", federation_routes()) .nest("/api/v1", api_routes()) .layer(FederationMiddleware::new(config)) .layer(CorsLayer::permissive()); + info!("{addr}"); Server::bind(&addr).serve(app.into_make_service()).await?; Ok(()) diff --git a/src/frontend/app.rs b/src/frontend/app.rs index ecd2c64..39767d9 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -1,4 +1,5 @@ use crate::frontend::article::Article; +use crate::frontend::login::Login; use crate::frontend::nav::Nav; use leptos::{component, view, IntoView}; use leptos_meta::provide_meta_context; @@ -12,12 +13,14 @@ pub fn App() -> impl IntoView { provide_meta_context(); view! { <> - + +