From d2702ae39fc604458caacd91273beb3cebec155b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tanguy=20G=C3=A9r=C3=B4me?= Date: Thu, 29 May 2025 01:59:42 +0300 Subject: [PATCH] Add resume, update leptos to 0.7, and use Directus instead of Contentful --- .dockerignore | 3 + Cargo.lock | 2019 +++++++++------------- Cargo.toml | 62 +- Dockerfile | 86 + locales/en.yaml | 2 + locales/fi.yaml | 2 + locales/fr.yaml | 2 + src/components/mod.rs => locales/uk.yaml | 0 src/app.rs | 186 +- src/blog.rs | 103 -- src/error_template.rs | 72 - src/fileserv.rs | 60 - src/gallery.rs | 134 ++ src/lib.rs | 12 +- src/main.rs | 29 +- src/routes/gallery.rs | 142 -- src/routes/mod.rs | 2 - src/services/contentful.rs | 51 - src/services/directus.rs | 84 + src/services/mod.rs | 4 +- src/services/rich_text.rs | 193 --- style/main.scss | 148 +- 22 files changed, 1420 insertions(+), 1976 deletions(-) create mode 100755 .dockerignore create mode 100755 Dockerfile rename src/components/mod.rs => locales/uk.yaml (100%) mode change 100644 => 100755 delete mode 100644 src/blog.rs delete mode 100644 src/error_template.rs delete mode 100644 src/fileserv.rs create mode 100644 src/gallery.rs delete mode 100644 src/routes/gallery.rs delete mode 100644 src/routes/mod.rs delete mode 100644 src/services/contentful.rs create mode 100644 src/services/directus.rs delete mode 100644 src/services/rich_text.rs diff --git a/.dockerignore b/.dockerignore new file mode 100755 index 0000000..06dbac4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.env +target +.git diff --git a/Cargo.lock b/Cargo.lock index 106fe4b..de0f381 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -17,18 +17,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -38,12 +26,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "android-tzdata" version = "0.1.1" @@ -59,6 +41,18 @@ dependencies = [ "libc", ] +[[package]] +name = "any_spawner" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41058deaa38c9d9dd933d6d238d825227cffa668e2839b52879f6619c63eee3b" +dependencies = [ + "futures", + "thiserror 2.0.12", + "tokio", + "wasm-bindgen-futures", +] + [[package]] name = "anyhow" version = "1.0.95" @@ -66,14 +60,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] -name = "async-recursion" -version = "1.1.1" +name = "async-lock" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", + "event-listener", + "event-listener-strategy", + "pin-project-lite", ] [[package]] @@ -84,7 +78,7 @@ checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -95,32 +89,32 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "attribute-derive" -version = "0.9.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1ee502851995027b06f99f5ffbeffa1406b38d0b318a1ebfa469332c6cbafd" +checksum = "0053e96dd3bec5b4879c23a138d6ef26f2cb936c9cdc96274ac2b9ed44b5bb54" dependencies = [ "attribute-derive-macro", "derive-where", "manyhow", "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] name = "attribute-derive-macro" -version = "0.9.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3601467f634cfe36c4780ca9c75dea9a5b34529c1f2810676a337e7e0997f954" +checksum = "463b53ad0fd5b460af4b1915fe045ff4d946d025fb6c4dc3337752eaa980f71b" dependencies = [ "collection_literals", "interpolator", "manyhow", - "proc-macro-utils 0.8.0", + "proc-macro-utils", "proc-macro2", "quote", "quote-use", - "syn 2.0.96", + "syn", ] [[package]] @@ -139,10 +133,10 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.5.2", + "hyper", "hyper-util", "itoa", "matchit", @@ -156,9 +150,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", "tracing", @@ -173,13 +167,13 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.2", + "sync_wrapper", "tower-layer", "tower-service", "tracing", @@ -200,30 +194,27 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -236,48 +227,6 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" -[[package]] -name = "cached" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90eb5776f28a149524d1d8623035760b4454ec881e8cf3838fa8d7e1b11254b3" -dependencies = [ - "cached_proc_macro", - "cached_proc_macro_types", - "hashbrown 0.13.2", - "instant", - "once_cell", - "thiserror", -] - -[[package]] -name = "cached_proc_macro" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c878c71c2821aa2058722038a59a67583a4240524687c6028571c9b395ded61f" -dependencies = [ - "darling 0.14.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "cached_proc_macro_types" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" - -[[package]] -name = "calendrical_calculations" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ca2b6e2f7d75f43e001ded6f25e79b80bded5abbe764cbdf78c25a3051f4b" -dependencies = [ - "core_maths", - "displaydoc", -] - [[package]] name = "camino" version = "1.1.9" @@ -309,45 +258,19 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", - "serde", "wasm-bindgen", "windows-targets 0.52.6", ] -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - [[package]] name = "codee" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3ad3122b0001c7f140cf4d605ef9a9e2c24d96ab0b4fb4347b76de2425f445" +checksum = "0f18d705321923b1a9358e3fc3c57c3b50171196827fc7f5f10b053242aca627" dependencies = [ - "thiserror", + "serde", + "serde_json", + "thiserror 2.0.12", ] [[package]] @@ -357,16 +280,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" [[package]] -name = "config" -version = "0.14.1" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "convert_case", - "nom", + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +dependencies = [ + "convert_case 0.6.0", "pathdiff", "serde", "toml", + "winnow 0.7.7", ] [[package]] @@ -400,17 +332,10 @@ dependencies = [ ] [[package]] -name = "contentful" -version = "0.8.0" +name = "const_str_slice_concat" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "018e4ff43b3f2b29233a927971adb0be725ea44f3d81cec4542eedbe11b8aa96" -dependencies = [ - "chrono", - "log", - "reqwest 0.11.27", - "serde", - "serde_json", -] +checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" [[package]] name = "convert_case" @@ -421,6 +346,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.18.1" @@ -449,28 +383,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "core_maths" -version = "0.1.0" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "libm", + "libc", ] [[package]] -name = "crunchy" -version = "0.2.3" +name = "crossbeam-utils" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] -name = "darling" -version = "0.14.4" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", + "generic-array", + "typenum", ] [[package]] @@ -479,22 +413,8 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", -] - -[[package]] -name = "darling_core" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] @@ -507,19 +427,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.96", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", + "strsim", + "syn", ] [[package]] @@ -528,18 +437,19 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.10", + "darling_core", "quote", - "syn 2.0.96", + "syn", ] [[package]] name = "dashmap" -version = "5.5.3" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", + "crossbeam-utils", "hashbrown 0.14.5", "lock_api", "once_cell", @@ -552,10 +462,10 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0df63c21a4383f94bd5388564829423f35c316aed85dc4f8427aded372c7c0d" dependencies = [ - "darling 0.20.10", + "darling", "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -575,7 +485,17 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", ] [[package]] @@ -586,7 +506,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -601,12 +521,28 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "either_of" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216d23e0ec69759a17f05e1c553f3a6870e5ec73420fbb07807a6f34d5d1d5a4" +dependencies = [ + "paste", + "pin-project-lite", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -624,14 +560,35 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", ] +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -720,6 +677,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -736,7 +694,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -769,6 +727,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -776,10 +744,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", - "wasi", - "wasm-bindgen", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -798,12 +776,12 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http 1.2.0", + "http", "js-sys", "pin-project", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -823,36 +801,23 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.26" +name = "guardian" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] +checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" [[package]] name = "h2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.2.0", + "http", "indexmap", "slab", "tokio", @@ -860,31 +825,11 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] [[package]] name = "hashbrown" @@ -892,6 +837,12 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "html-escape" version = "0.2.13" @@ -901,17 +852,6 @@ dependencies = [ "utf8-width", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.2.0" @@ -923,17 +863,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -941,7 +870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http", ] [[package]] @@ -952,8 +881,8 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -976,27 +905,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "hyper" -version = "0.14.32" +name = "hydration_context" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +checksum = "ef13071fe13b55c85fe2b70246d2e3b49d2c6a764fd3e0edaf262cc385ff1854" dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", + "futures", + "js-sys", + "once_cell", + "or_poisoned", "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", + "serde", + "throw_error", + "wasm-bindgen", ] [[package]] @@ -1008,9 +929,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -1027,8 +948,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.2.0", - "hyper 1.5.2", + "http", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -1037,19 +958,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.32", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -1058,7 +966,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.2", + "hyper", "hyper-util", "native-tls", "tokio", @@ -1075,9 +983,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", - "http-body 1.0.1", - "hyper 1.5.2", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -1108,100 +1016,6 @@ dependencies = [ "cc", ] -[[package]] -name = "icu" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff5e3018d703f168b00dcefa540a65f1bbc50754ae32f3f5f0e43fe5ee51502" -dependencies = [ - "icu_calendar", - "icu_casemap", - "icu_collator", - "icu_collections", - "icu_datetime", - "icu_decimal", - "icu_experimental", - "icu_list", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_plurals", - "icu_properties", - "icu_provider", - "icu_segmenter", - "icu_timezone", -] - -[[package]] -name = "icu_calendar" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7265b2137f9a36f7634a308d91f984574bbdba8cfd95ceffe1c345552275a8ff" -dependencies = [ - "calendrical_calculations", - "displaydoc", - "icu_calendar_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_calendar_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e009b7f0151ee6fb28c40b1283594397e0b7183820793e9ace3dcd13db126d0" - -[[package]] -name = "icu_casemap" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ff0c8ae9f8d31b12e27fc385ff9ab1f3cd9b17417c665c49e4ec958c37da75f" -dependencies = [ - "displaydoc", - "icu_casemap_data", - "icu_collections", - "icu_locid", - "icu_properties", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_casemap_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d57966d5ab748f74513be4046867f9a20e801e2775d41f91d04a0f560b61f08" - -[[package]] -name = "icu_collator" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d370371887d31d56f361c3eaa15743e54f13bc677059c9191c77e099ed6966b2" -dependencies = [ - "displaydoc", - "icu_collator_data", - "icu_collections", - "icu_locid_transform", - "icu_normalizer", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_collator_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee3f88741364b7d6269cce6827a3e6a8a2cf408a78f766c9224ab479d5e4ae5" - [[package]] name = "icu_collections" version = "1.5.0" @@ -1214,111 +1028,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_datetime" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d115efb85e08df3fd77e77f52e7e087545a783fffba8be80bfa2102f306b1780" -dependencies = [ - "displaydoc", - "either", - "fixed_decimal", - "icu_calendar", - "icu_datetime_data", - "icu_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_timezone", - "smallvec", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_datetime_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ba7e7f7a01269b9afb0a39eff4f8676f693b55f509b3120e43a0350a9f88bea" - -[[package]] -name = "icu_decimal" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8fd98f86ec0448d85e1edf8884e4e318bb2e121bd733ec929a05c0a5e8b0eb" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal_data", - "icu_locid_transform", - "icu_provider", - "writeable", -] - -[[package]] -name = "icu_decimal_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d424c994071c6f5644f999925fc868c85fec82295326e75ad5017bc94b41523" - -[[package]] -name = "icu_experimental" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "844ad7b682a165c758065d694bc4d74ac67f176da1c499a04d85d492c0f193b7" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_collections", - "icu_decimal", - "icu_experimental_data", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_pattern", - "icu_plurals", - "icu_properties", - "icu_provider", - "litemap", - "num-bigint", - "num-rational", - "num-traits", - "smallvec", - "tinystr", - "writeable", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_experimental_data" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c178b9a34083fca5bd70d61f647575335e9c197d0f30c38e8ccd187babc69d0" - -[[package]] -name = "icu_list" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfeda1d7775b6548edd4e8b7562304a559a91ed56ab56e18961a053f367c365" -dependencies = [ - "displaydoc", - "icu_list_data", - "icu_locid_transform", - "icu_provider", - "regex-automata 0.2.0", - "writeable", -] - -[[package]] -name = "icu_list_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1825170d2c6679cb20dbd96a589d034e49f698aed9a2ef4fafc9a0101ed298f" - [[package]] name = "icu_locid" version = "1.5.0" @@ -1376,19 +1085,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" -[[package]] -name = "icu_pattern" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f36aafd098d6717de34e668a8120822275c1fba22b936e757b7de8a2fd7e4" -dependencies = [ - "displaydoc", - "either", - "writeable", - "yoke", - "zerofrom", -] - [[package]] name = "icu_plurals" version = "1.5.0" @@ -1455,52 +1151,9 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] -[[package]] -name = "icu_segmenter" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a717725612346ffc2d7b42c94b820db6908048f39434504cb130e8b46256b0de" -dependencies = [ - "core_maths", - "displaydoc", - "icu_collections", - "icu_locid", - "icu_provider", - "icu_segmenter_data", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_segmenter_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f739ee737260d955e330bc83fdeaaf1631f7fb7ed218761d3c04bb13bb7d79df" - -[[package]] -name = "icu_timezone" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa91ba6a585939a020c787235daa8aee856d9bceebd6355e283c0c310bc6de96" -dependencies = [ - "displaydoc", - "icu_calendar", - "icu_provider", - "icu_timezone_data", - "tinystr", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_timezone_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c588878c508a3e2ace333b3c50296053e6483c6a7541251b546cc59dcd6ced8e" - [[package]] name = "ident_case" version = "1.0.1" @@ -1538,15 +1191,6 @@ dependencies = [ "hashbrown 0.15.2", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "interpolator" version = "0.5.0" @@ -1570,9 +1214,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "itertools" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -1585,13 +1229,25 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1600,42 +1256,60 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leptos" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cbb3237c274dadf00dcc27db96c52601b40375117178fb24a991cda073624f0" +checksum = "26b8731cb00f3f0894058155410b95c8955b17273181d2bc72600ab84edd24f1" dependencies = [ + "any_spawner", + "base64", "cfg-if", + "either_of", + "futures", + "hydration_context", "leptos_config", "leptos_dom", + "leptos_hot_reload", "leptos_macro", - "leptos_reactive", "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "rand", + "reactive_graph", + "rustc-hash", + "send_wrapper", + "serde", + "serde_qs", "server_fn", - "tracing", - "typed-builder 0.18.2", - "typed-builder-macro 0.18.2", + "slotmap", + "tachys", + "thiserror 2.0.12", + "throw_error", + "typed-builder", + "typed-builder-macro", "wasm-bindgen", "web-sys", ] [[package]] name = "leptos-use" -version = "0.13.13" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "789bf9f4337e6ebd8f1b407e3f762fdc538d48dc145f9d1dce2338014b38f4dd" +checksum = "e612389629007497d1e90deecf5bddd790e59e32358546fa7beaf88a68d2067b" dependencies = [ "cfg-if", "chrono", "codee", "cookie", "default-struct-builder", - "http 1.2.0", + "http", "js-sys", "lazy_static", "leptos", "leptos_axum", "paste", - "thiserror", + "send_wrapper", + "thiserror 2.0.12", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1643,14 +1317,15 @@ dependencies = [ [[package]] name = "leptos_axum" -version = "0.6.15" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910681b920c48a43508b2bd0261bdb67c4ef9456a0b3613f956a0d30e832e9de" +checksum = "7b0d388392939f629c45b8c7bcc83997cb6c6026813b57f50953651ad5be63d8" dependencies = [ + "any_spawner", "axum", - "cfg-if", + "dashmap", "futures", - "http-body-util", + "hydration_context", "leptos", "leptos_integration_utils", "leptos_macro", @@ -1658,61 +1333,45 @@ dependencies = [ "leptos_router", "once_cell", "parking_lot", - "serde_json", "server_fn", "tokio", - "tokio-util", - "tracing", + "tower", + "tower-http", ] [[package]] name = "leptos_config" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ed778611380ddea47568ac6ad6ec5158d39b5bd59e6c4dcd24efc15dc3dc0d" +checksum = "5bae3e0ead5a7a814c8340eef7cb8b6cba364125bd8174b15dc9fe1b3cab7e03" dependencies = [ "config", "regex", "serde", - "thiserror", - "typed-builder 0.18.2", + "thiserror 2.0.12", + "typed-builder", ] [[package]] name = "leptos_dom" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8401c46c86c1f4c16dcb7881ed319fcdca9cda9b9e78a6088955cb423afcf119" +checksum = "f89d4eb263bd5a9e7c49f780f17063f15aca56fd638c90b9dfd5f4739152e87d" dependencies = [ - "async-recursion", - "cfg-if", - "drain_filter_polyfill", - "futures", - "getrandom", - "html-escape", - "indexmap", - "itertools", "js-sys", - "leptos_reactive", - "once_cell", - "pad-adapter", - "paste", - "rustc-hash", - "serde", - "serde_json", - "server_fn", - "smallvec", - "tracing", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", "wasm-bindgen", - "wasm-bindgen-futures", "web-sys", ] [[package]] name = "leptos_hot_reload" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb53d4794240b684a2f4be224b84bee9e62d2abc498cf2bcd643cd565e01d96" +checksum = "e80219388501d99b246f43b6e7d08a28f327cdd34ba630a35654d917f3e1788e" dependencies = [ "anyhow", "camino", @@ -1722,70 +1381,106 @@ dependencies = [ "quote", "rstml", "serde", - "syn 2.0.96", + "syn", "walkdir", ] [[package]] name = "leptos_i18n" -version = "0.4.2" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae340ebc4f67110eda8ad934f5173f54c274481857f66730d1e9a4cfaa3ec4f" +checksum = "d368a184611a7f6bd1d23568887da4cea80e457b7932ff7c8c00b39032f4dd66" dependencies = [ "codee", - "fixed_decimal", - "icu", + "default-struct-builder", + "icu_locid", + "js-sys", "leptos", "leptos-use", "leptos_i18n_macro", "leptos_meta", - "leptos_router", "serde", - "typed-builder 0.19.1", + "serde-wasm-bindgen", + "typed-builder", "wasm-bindgen", "writeable", ] [[package]] name = "leptos_i18n_macro" -version = "0.4.2" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720af3b1921be2339f5413a70b5db79b6b9cb90b695bc9ad3f971520bb363c69" +checksum = "5f56a479ebc4416dae57732d3524a0a67f6e84af8f51501f5e2df7c26392d601" dependencies = [ "fixed_decimal", - "icu", + "icu_locid", + "icu_locid_transform", + "leptos_i18n_parser", "proc-macro2", "quote", "serde", "serde_json", "serde_yaml", - "syn 2.0.96", + "syn", + "tinystr", "toml", ] [[package]] -name = "leptos_integration_utils" -version = "0.6.15" +name = "leptos_i18n_parser" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a96976631c2225ec116a7bf9c0ed5bf6999a19fed33f5e3cbcf37af44c384dc" +checksum = "c7c389bd7767d52dc3e3676d8a71584ee490e801ac0eb7e02c04beeb611a7c4f" +dependencies = [ + "fixed_decimal", + "icu_locid", + "icu_plurals", + "json5", + "proc-macro2", + "quote", + "serde", + "serde_json", + "serde_yaml", + "syn", + "tinystr", + "toml", +] + +[[package]] +name = "leptos_i18n_router" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f851a96efb14c5beb3ea060d18b8a304dc908385c2b49902e577be6a1f9cc1ee" +dependencies = [ + "leptos", + "leptos_i18n", + "leptos_router", +] + +[[package]] +name = "leptos_integration_utils" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d293a2f64a558d4ca10ef01125d055134f3582f27c407102c4259bb54ca8b55b" dependencies = [ "futures", + "hydration_context", "leptos", "leptos_config", - "leptos_hot_reload", "leptos_meta", - "tracing", + "leptos_router", + "reactive_graph", ] [[package]] name = "leptos_macro" -version = "0.6.15" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b13bc3db70715cd8218c4535a5af3ae3c0e5fea6f018531fc339377b36bc0e0" +checksum = "e621f8f5342b9bdc93bb263b839cee7405027a74560425a2dabea9de7952b1fd" dependencies = [ "attribute-derive", "cfg-if", - "convert_case", + "convert_case 0.7.1", "html-escape", "itertools", "leptos_hot_reload", @@ -1795,99 +1490,81 @@ dependencies = [ "quote", "rstml", "server_fn_macro", - "syn 2.0.96", - "tracing", + "syn", "uuid", ] [[package]] name = "leptos_meta" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25acc2f63cf91932013e400a95bf6e35e5d3dbb44a7b7e25a8e3057d12005b3b" +checksum = "448a6387e9e2cccbb756f474a54e36a39557127a3b8e46744b6ef6372b50f575" dependencies = [ - "cfg-if", - "indexmap", - "leptos", - "tracing", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "leptos_reactive" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4161acbf80f59219d8d14182371f57302bc7ff81ee41aba8ba1ff7295727f23" -dependencies = [ - "base64 0.22.1", - "cfg-if", "futures", "indexmap", - "js-sys", - "oco_ref", - "paste", - "pin-project", - "rustc-hash", - "self_cell", - "serde", - "serde-wasm-bindgen", - "serde_json", - "slotmap", - "thiserror", - "tokio", - "tracing", + "leptos", + "once_cell", + "or_poisoned", + "send_wrapper", "wasm-bindgen", - "wasm-bindgen-futures", "web-sys", ] [[package]] name = "leptos_router" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d71dea7d42c0d29c40842750232d3425ed1cf10e313a1f898076d20871dad32" +checksum = "4168ead6a9715daba953aa842795cb2ad81b6e011a15745bd3d1baf86f76de95" dependencies = [ - "cached", - "cfg-if", + "any_spawner", + "either_of", + "futures", "gloo-net", - "itertools", "js-sys", - "lazy_static", "leptos", - "leptos_integration_utils", - "leptos_meta", - "linear-map", - "lru", + "leptos_router_macro", "once_cell", + "or_poisoned", "percent-encoding", - "regex", + "reactive_graph", "send_wrapper", - "serde", - "serde_json", - "serde_qs 0.13.0", - "thiserror", - "tracing", + "tachys", + "thiserror 2.0.12", "url", "wasm-bindgen", - "wasm-bindgen-futures", "web-sys", ] [[package]] -name = "leptos_server" -version = "0.6.15" +name = "leptos_router_macro" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a97eb90a13f71500b831c7119ddd3bdd0d7ae0a6b0487cade4fddeed3b8c03f" +checksum = "e31197af38d209ffc5d9f89715381c415a1570176f8d23455fbe00d148e79640" dependencies = [ - "inventory", - "lazy_static", - "leptos_macro", - "leptos_reactive", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "leptos_server" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66985242812ec95e224fb48effe651ba02728beca92c461a9464c811a71aab11" +dependencies = [ + "any_spawner", + "base64", + "codee", + "futures", + "hydration_context", + "or_poisoned", + "reactive_graph", + "send_wrapper", "serde", + "serde_json", "server_fn", - "thiserror", - "tracing", + "tachys", ] [[package]] @@ -1896,27 +1573,17 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - [[package]] name = "linear-map" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" -dependencies = [ - "serde", - "serde_test", -] [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -1940,38 +1607,38 @@ version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" -[[package]] -name = "lru" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" -dependencies = [ - "hashbrown 0.14.5", -] - [[package]] name = "manyhow" -version = "0.10.4" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91ea592d76c0b6471965708ccff7e6a5d277f676b90ab31f4d3f3fc77fade64" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" dependencies = [ "manyhow-macros", "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] name = "manyhow-macros" -version = "0.10.4" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64621e2c08f2576e4194ea8be11daf24ac01249a4f53cd8befcbb7077120ead" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" dependencies = [ - "proc-macro-utils 0.8.0", + "proc-macro-utils", "proc-macro2", "quote", ] +[[package]] +name = "markdown" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5cab8f2cadc416a82d2e783a1946388b31654d391d1c7d92cc1f03e295b1deb" +dependencies = [ + "unicode-id", +] + [[package]] name = "matchit" version = "0.7.3" @@ -2000,12 +1667,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.8.3" @@ -2022,7 +1683,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -2035,7 +1696,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.2.0", + "http", "httparse", "memchr", "mime", @@ -2045,9 +1706,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -2061,24 +1722,10 @@ dependencies = [ ] [[package]] -name = "nom" -version = "7.1.3" +name = "next_tuple" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] +checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" [[package]] name = "num-conv" @@ -2086,26 +1733,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -2115,6 +1742,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.36.7" @@ -2126,12 +1763,12 @@ dependencies = [ [[package]] name = "oco_ref" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51ebcefb2f0b9a5e0bea115532c8ae4215d1b01eff176d0f4ba4192895c2708" +checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" dependencies = [ "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2142,11 +1779,11 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.69" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.8.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -2163,7 +1800,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -2174,9 +1811,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -2185,10 +1822,16 @@ dependencies = [ ] [[package]] -name = "pad-adapter" -version = "0.1.1" +name = "or_poisoned" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d80efc4b6721e8be2a10a5df21a30fa0b470f1539e53d8b4e6e75faf938b63" +checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2231,6 +1874,51 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "pin-project" version = "1.1.8" @@ -2248,7 +1936,7 @@ checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -2265,9 +1953,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "powerfmt" @@ -2275,6 +1963,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "prettyplease" version = "0.2.29" @@ -2282,30 +1979,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.96", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", + "syn", ] [[package]] @@ -2327,17 +2001,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", -] - -[[package]] -name = "proc-macro-utils" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" -dependencies = [ - "proc-macro2", - "quote", - "smallvec", + "syn", ] [[package]] @@ -2368,7 +2032,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", "version_check", "yansi", ] @@ -2398,10 +2062,95 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" dependencies = [ - "proc-macro-utils 0.10.0", + "proc-macro-utils", "proc-macro2", "quote", - "syn 2.0.96", + "syn", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "reactive_graph" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a0ccddbc11a648bd09761801dac9e3f246ef7641130987d6120fced22515e6" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "or_poisoned", + "pin-project-lite", + "rustc-hash", + "send_wrapper", + "serde", + "slotmap", + "thiserror 2.0.12", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aadc7c19e3a360bf19cd595d2dc8b58ce67b9240b95a103fbc1317a8ff194237" +dependencies = [ + "guardian", + "itertools", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221095cb028dc51fbc2833743ea8b1a585da1a2af19b440b3528027495bf1f2d" +dependencies = [ + "convert_case 0.7.1", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2410,7 +2159,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.8.0", + "bitflags", ] [[package]] @@ -2421,19 +2170,10 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", + "regex-automata", "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9368763f5a9b804326f3af749e16f9abf378d227bcdee7634b13d8f17793782" -dependencies = [ - "memchr", -] - [[package]] name = "regex-automata" version = "0.4.9" @@ -2453,62 +2193,22 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.5.2", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -2518,15 +2218,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", - "system-configuration 0.6.1", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", - "tower 0.5.2", + "tower", "tower-service", "url", "wasm-bindgen", @@ -2537,31 +2237,31 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rstml" -version = "0.11.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe542870b8f59dd45ad11d382e5339c9a1047cde059be136a7016095bbdefa77" +checksum = "61cf4616de7499fc5164570d40ca4e1b24d231c6833a88bff0fe00725080fd56" dependencies = [ + "derive-where", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.96", + "syn", "syn_derive", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -2572,17 +2272,17 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustix" -version = "0.38.44" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.8.0", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -2591,9 +2291,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.21" +version = "0.23.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" dependencies = [ "once_cell", "rustls-pki-types", @@ -2602,15 +2302,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -2622,15 +2313,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "ring", "rustls-pki-types", @@ -2679,7 +2370,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.8.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -2696,12 +2387,6 @@ dependencies = [ "libc", ] -[[package]] -name = "self_cell" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" - [[package]] name = "send_wrapper" version = "0.6.0" @@ -2739,7 +2424,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -2764,17 +2449,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_qs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - [[package]] name = "serde_qs" version = "0.13.0" @@ -2783,7 +2457,7 @@ checksum = "cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6" dependencies = [ "percent-encoding", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2795,15 +2469,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_test" -version = "1.0.177" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f901ee573cab6b3060453d2d5f0bae4e6d628c23c0a962ff9b5f1d7c8d4f1ed" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2831,30 +2496,31 @@ dependencies = [ [[package]] name = "server_fn" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fae7a3038a32e5a34ba32c6c45eb4852f8affaf8b794ebfcd4b1099e2d62ebe" +checksum = "8d05a9e3fd8d7404985418db38c6617cc793a1a27f398d4fbc9dfe8e41b804e6" dependencies = [ "axum", "bytes", - "ciborium", "const_format", "dashmap", "futures", "gloo-net", - "http 1.2.0", + "http", "http-body-util", - "hyper 1.5.2", + "hyper", "inventory", "js-sys", "once_cell", + "pin-project-lite", "send_wrapper", "serde", "serde_json", - "serde_qs 0.12.0", + "serde_qs", "server_fn_macro_default", - "thiserror", - "tower 0.4.13", + "thiserror 2.0.12", + "throw_error", + "tower", "tower-layer", "url", "wasm-bindgen", @@ -2866,26 +2532,37 @@ dependencies = [ [[package]] name = "server_fn_macro" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaaf648c6967aef78177c0610478abb5a3455811f401f3c62d10ae9bd3901a1" +checksum = "504b35e883267b3206317b46d02952ed7b8bf0e11b2e209e2eb453b609a5e052" dependencies = [ "const_format", - "convert_case", + "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn", "xxhash-rust", ] [[package]] name = "server_fn_macro_default" -version = "0.6.15" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2aa8119b558a17992e0ac1fd07f080099564f24532858811ce04f742542440" +checksum = "eb8b274f568c94226a8045668554aace8142a59b8bca5414ac5a79627c825568" dependencies = [ "server_fn_macro", - "syn 2.0.96", + "syn", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", ] [[package]] @@ -2909,7 +2586,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" dependencies = [ - "serde", "version_check", ] @@ -2941,12 +2617,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -2959,17 +2629,6 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.96" @@ -2983,22 +2642,16 @@ dependencies = [ [[package]] name = "syn_derive" -version = "0.1.8" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "cdb066a04799e45f5d582e8fc6ec8e6d6896040d00898eb4e6a835196815b219" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -3016,18 +2669,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys 0.5.0", + "syn", ] [[package]] @@ -3036,19 +2678,9 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.8.0", + "bitflags", "core-foundation", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "system-configuration-sys", ] [[package]] @@ -3061,41 +2693,69 @@ dependencies = [ "libc", ] +[[package]] +name = "tachys" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d42b7c1545705f77d871228eb52cbb1376b35dc0a237be9fb11e2d9e4e20818" +dependencies = [ + "any_spawner", + "async-trait", + "const_str_slice_concat", + "drain_filter_polyfill", + "dyn-clone", + "either_of", + "futures", + "html-escape", + "indexmap", + "itertools", + "js-sys", + "linear-map", + "next_tuple", + "oco_ref", + "once_cell", + "or_poisoned", + "parking_lot", + "paste", + "reactive_graph", + "reactive_stores", + "rustc-hash", + "send_wrapper", + "slotmap", + "throw_error", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "tanguy-gerome-fi" version = "0.1.0" dependencies = [ "axum", "console_error_panic_hook", - "contentful", "dotenvy", - "http 1.2.0", "leptos", "leptos_axum", "leptos_i18n", + "leptos_i18n_router", "leptos_meta", "leptos_router", - "reqwest 0.12.12", + "markdown", + "reqwest", "serde", "serde_json", - "serde_path_to_error", - "thiserror", "tokio", - "tower 0.4.13", - "tower-http", - "tracing", "wasm-bindgen", ] [[package]] name = "tempfile" -version = "3.15.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", - "getrandom", + "getrandom 0.3.2", "once_cell", "rustix", "windows-sys 0.59.0", @@ -3107,7 +2767,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -3118,7 +2787,27 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "throw_error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ef8bf264c6ae02a065a4a16553283f0656bd6266fc1fcb09fd2e6b5e91427b" +dependencies = [ + "pin-project-lite", ] [[package]] @@ -3164,9 +2853,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -3186,7 +2875,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -3201,9 +2890,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", "tokio", @@ -3218,8 +2907,6 @@ dependencies = [ "bytes", "futures-core", "futures-sink", - "futures-util", - "hashbrown 0.14.5", "pin-project-lite", "tokio", ] @@ -3255,22 +2942,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", + "winnow 0.6.24", ] [[package]] @@ -3282,7 +2954,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -3291,15 +2963,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ - "bitflags 2.8.0", + "bitflags", "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "http-range-header", "httpdate", @@ -3334,21 +3006,9 @@ checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", - "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "tracing-core" version = "0.1.33" @@ -3366,43 +3026,35 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typed-builder" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77739c880e00693faef3d65ea3aad725f196da38b22fdc7ea6ded6e1ce4d3add" +checksum = "cd9d30e3a08026c78f246b173243cf07b3696d274debd26680773b6773c2afc7" dependencies = [ - "typed-builder-macro 0.18.2", -] - -[[package]] -name = "typed-builder" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06fbd5b8de54c5f7c91f6fe4cebb949be2125d7758e630bb58b1d831dbce600" -dependencies = [ - "typed-builder-macro 0.19.1", + "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63" +checksum = "3c36781cc0e46a83726d9879608e4cf6c2505237e263a8eb8c24502989cfdb28" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] -name = "typed-builder-macro" -version = "0.19.1" +name = "typenum" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9534daa9fd3ed0bd911d462a37f172228077e7abf18c18a5f67199d959205f8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicase" @@ -3410,6 +3062,12 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +[[package]] +name = "unicode-id" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10103c57044730945224467c09f71a4db0071c123a0648cc3e818913bde6b561" + [[package]] name = "unicode-ident" version = "1.0.15" @@ -3475,7 +3133,7 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -3515,6 +3173,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -3537,18 +3204,19 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.96", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] @@ -3571,7 +3239,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3600,9 +3268,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -3627,42 +3295,38 @@ dependencies = [ ] [[package]] -name = "windows-registry" -version = "0.2.0" +name = "windows-link" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", "windows-strings", - "windows-targets 0.52.6", + "windows-targets 0.53.0", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-link", ] [[package]] @@ -3683,21 +3347,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -3707,7 +3356,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", @@ -3715,10 +3364,20 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" +name = "windows-targets" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] [[package]] name = "windows_aarch64_gnullvm" @@ -3727,10 +3386,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +name = "windows_aarch64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" @@ -3739,10 +3398,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] -name = "windows_i686_gnu" -version = "0.48.5" +name = "windows_aarch64_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" @@ -3750,6 +3409,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" @@ -3757,10 +3422,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] -name = "windows_i686_msvc" -version = "0.48.5" +name = "windows_i686_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" @@ -3769,10 +3434,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +name = "windows_i686_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" @@ -3781,10 +3446,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +name = "windows_x86_64_gnu" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" @@ -3793,10 +3458,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +name = "windows_x86_64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" @@ -3804,6 +3469,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.6.24" @@ -3814,13 +3485,21 @@ dependencies = [ ] [[package]] -name = "winreg" -version = "0.50.0" +name = "winnow" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" dependencies = [ - "cfg-if", - "windows-sys 0.48.0", + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", ] [[package]] @@ -3834,9 +3513,6 @@ name = "writeable" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" -dependencies = [ - "either", -] [[package]] name = "xxhash-rust" @@ -3870,28 +3546,28 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] [[package]] @@ -3911,7 +3587,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", "synstructure", ] @@ -3921,17 +3597,6 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -[[package]] -name = "zerotrie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb594dd55d87335c5f60177cee24f19457a5ec10a065e0a3014722ad252d0a1f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - [[package]] name = "zerovec" version = "0.10.4" @@ -3951,5 +3616,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn", ] diff --git a/Cargo.toml b/Cargo.toml index 2a23467..9d9629f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,47 +7,67 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -axum = { version = "0.7", optional = true } -console_error_panic_hook = "0.1" -leptos = { version = "0.6", features = ["nightly"] } -leptos_axum = { version = "0.6", optional = true } -leptos_meta = { version = "0.6", features = ["nightly"] } -leptos_router = { version = "0.6", features = ["nightly"] } +leptos = { version = "0.7.0", features = ["nightly"] } +leptos_router = { version = "0.7.0", features = ["nightly"] } +axum = { version = "0.7.0", optional = true } +console_error_panic_hook = { version = "0.1", optional = true} +leptos_axum = { version = "0.7.0", optional = true } +leptos_meta = { version = "0.7.0" } tokio = { version = "1", features = ["rt-multi-thread"], optional = true } -tower = { version = "0.4", features = ["util"], optional = true } -tower-http = { version = "0.5", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.100" -thiserror = "1" -tracing = { version = "0.1", optional = true } -http = "1" -leptos_i18n = { version = "0.4.1", default-features = false, features = ["yaml_files"] } -serde = "1.0.213" +wasm-bindgen = { version = "=0.2.100", optional = true } +# tower = { version = "0.4", features = ["util"], optional = true } +# tower-http = { version = "0.5", features = ["fs"], optional = true } +# thiserror = "1" +# tracing = { version = "0.1", optional = true } +# http = "1" +leptos_i18n = { version = "0.5.11", default-features = false, features = ["yaml_files", "track_locale_files"] } +leptos_i18n_router = { version = "0.5.11" } dotenvy = "0.15.7" +serde = "1.0.213" serde_json = "1.0.132" -serde_path_to_error = "0.1.16" +# serde_path_to_error = "0.1.16" reqwest = { version = "0.12.9", features = ["json"]} -contentful = "0.8.0" +markdown = "1.0.0" +# contentful = "0.8.0" [features] hydrate = [ "leptos/hydrate", - "leptos_meta/hydrate", - "leptos_router/hydrate", + "dep:console_error_panic_hook", + "dep:wasm-bindgen", "leptos_i18n/hydrate", ] ssr = [ "dep:axum", "dep:tokio", - "dep:tower", - "dep:tower-http", "dep:leptos_axum", "leptos/ssr", "leptos_meta/ssr", "leptos_router/ssr", - "dep:tracing", + "leptos_i18n/ssr", "leptos_i18n/axum", ] +# [features] +# hydrate = [ +# "leptos/hydrate", +# "leptos_meta/hydrate", +# "leptos_router/hydrate", +# "leptos_i18n/hydrate", +# ] +# ssr = [ +# "dep:axum", +# "dep:tokio", +# "dep:tower", +# "dep:tower-http", +# "dep:leptos_axum", +# "leptos/ssr", +# "leptos_meta/ssr", +# "leptos_router/ssr", +# "dep:tracing", +# "leptos_i18n/axum", +# ] + [package.metadata.leptos-i18n] default = "en" # locales = ["en", "fr", "fi", "sv", "eo", "uk", "et", "jbo"] diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..af6abc4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,86 @@ +# Get started with a build env with Rust nightly +FROM rustlang/rust:nightly-alpine as builder + +RUN apk update && \ + apk add --no-cache bash curl npm libc-dev binaryen openssl openssl-dev ca-certificates + +RUN npm install -g sass + +RUN curl --proto '=https' --tlsv1.3 -LsSf https://github.com/leptos-rs/cargo-leptos/releases/latest/download/cargo-leptos-installer.sh | sh + +# Add the WASM target +RUN rustup target add wasm32-unknown-unknown + +WORKDIR /work +COPY . . + + +ENV RUSTUP_PERMIT_COPY_RENAME=true +RUN RUSTFLAGS="-Ctarget-feature=-crt-static" cargo leptos build --release -vv + +FROM rustlang/rust:nightly-alpine as runner + +WORKDIR /app + +COPY --from=builder /work/target/release/tanguy-gerome-fi /app/ +COPY --from=builder /work/target/site /app/site +COPY --from=builder /work/Cargo.toml /app/ + +# # Get started with a build env with Rust nightly +# FROM rustlang/rust:nightly-bullseye AS builder + +# # If you’re using stable, use this instead +# # FROM rust:1.74-bullseye as builder + +# # Install cargo-binstall, which makes it easier to install other +# # cargo extensions like cargo-leptos +# RUN wget https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz +# RUN tar -xvf cargo-binstall-x86_64-unknown-linux-musl.tgz +# RUN cp cargo-binstall /usr/local/cargo/bin + +# # Install required tools +# RUN apt-get update -y \ +# && apt-get install -y --no-install-recommends clang + +# # Install cargo-leptos +# RUN cargo binstall cargo-leptos -y + +# # Add the WASM target +# RUN rustup target add wasm32-unknown-unknown + +# # Make an /app dir, which everything will eventually live in +# RUN mkdir -p /app +# WORKDIR /app +# COPY . . + +# # Build the app +# RUN cargo leptos build --release -vv + +# FROM debian:bullseye-slim AS runtime +# WORKDIR /app +# RUN apt-get update -y \ +# && apt-get install -y --no-install-recommends openssl libssl-dev ca-certificates \ +# && apt-get autoremove -y \ +# && apt-get clean -y \ +# && rm -rf /var/lib/apt/lists/* + +# # -- NB: update binary name from "leptos_start" to match your app name in Cargo.toml -- +# # Copy the server binary to the /app directory +# COPY --from=builder /app/target/release/tanguy-gerome-fi /app/ + +# # /target/site contains our JS/WASM/CSS, etc. +# COPY --from=builder /app/target/site /app/site + +# # Copy Cargo.toml if it’s needed at runtime +# COPY --from=builder /app/Cargo.toml /app/ + +# Set any required env variables and +ENV RUST_LOG="info" +ENV LEPTOS_SITE_ADDR="0.0.0.0:8080" +ENV LEPTOS_SITE_ROOT="site" +EXPOSE 8080 + +# -- NB: update binary name from "leptos_start" to match your app name in Cargo.toml -- +# Run the server +CMD ["/app/tanguy-gerome-fi"] + diff --git a/locales/en.yaml b/locales/en.yaml index 0a576b9..d49f87d 100644 --- a/locales/en.yaml +++ b/locales/en.yaml @@ -2,6 +2,8 @@ home: Home available_in: "Available in:" partial_translations: (partial translations) +resume: Resume + blog: Blog welcome_blog: Welcome to my blog! diff --git a/locales/fi.yaml b/locales/fi.yaml index bf5bdbe..9424e93 100644 --- a/locales/fi.yaml +++ b/locales/fi.yaml @@ -2,6 +2,8 @@ home: Koti available_in: "Saatavilla kielillä:" partial_translations: (keskeneräisiä käännöksiä) +resume: Ansioluettelo + blog: Blogi welcome_blog: Tervetuloa blogiini! diff --git a/locales/fr.yaml b/locales/fr.yaml index 322b871..7bff598 100644 --- a/locales/fr.yaml +++ b/locales/fr.yaml @@ -2,6 +2,8 @@ home: Accueil available_in: "Disponible en:" partial_translations: (traductions partielles) +resume: CV + blog: Blog welcome_blog: Bienvenue sur mon blog! diff --git a/src/components/mod.rs b/locales/uk.yaml old mode 100644 new mode 100755 similarity index 100% rename from src/components/mod.rs rename to locales/uk.yaml diff --git a/src/app.rs b/src/app.rs index 14f98bf..44c554a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,13 +1,33 @@ -use leptos::*; -use leptos_meta::*; -use leptos_router::*; +use leptos::prelude::*; +use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; +use leptos_router::{ + components::{Outlet, ParentRoute, Route, Router, Routes, A}, path +}; +use leptos_i18n_router::I18nRoute; +use serde::{Deserialize, Serialize}; use crate::i18n::*; -use crate::error_template::{AppError, ErrorTemplate}; -// use crate::services::contentful::get_rich_text_page; -// use crate::services::rich_text; -use crate::routes::gallery; +pub fn shell(options: LeptosOptions) -> impl IntoView { + view! { + + + + + + + + + + + + + + + + + } +} #[component] pub fn App() -> impl IntoView { @@ -16,8 +36,6 @@ pub fn App() -> impl IntoView { view! { - - // id=leptos means cargo-leptos will hot-reload this stylesheet @@ -25,25 +43,18 @@ pub fn App() -> impl IntoView { - <Router fallback=|| { - let mut outside_errors = Errors::default(); - outside_errors.insert_with_default_key(AppError::NotFound); - view! { - <ErrorTemplate outside_errors/> - } - .into_view() - }> + // content for this welcome page + <Router> <Header/> - <Routes> - <I18nRoute view=|| view! { <Outlet/> }> - <Route path="" view=HomePage/> - // <Route path="/blog" view=BlogList/> - // <Route path="/blog/:slug" view=BlogPost/> - <Route path="/gallery" view=gallery::Gallery> - <Route path=":slug" view=gallery::GalleryEntry/> - <Route path="" view=|| view! {}/> - </Route> - </I18nRoute> + <Routes fallback=|| "Page not found.".into_view()> + <I18nRoute<Locale, _, _> view=Outlet> + <Route path=path!("/") view=HomePage/> + <Route path=path!("/resume") view=Resume/> + <ParentRoute path=path!("/gallery") view=crate::gallery::Gallery> + <Route path=path!(":slug") view=crate::gallery::GalleryEntry/> + <Route path=path!("") view=|| view! {}/> + </ParentRoute> + </I18nRoute<Locale, _, _>> </Routes> <Footer/> </Router> @@ -81,17 +92,19 @@ pub fn Header() -> impl IntoView { <h1><span>tanguy</span><span>.gerome</span><span>.fi</span></h1> <div class="links"> <A href="/">{t!(i18n, home)}</A> + <A href="/resume">{t!(i18n, resume)}</A> // <A href="/blog">{t!(i18n, blog)}</A> <A href="/gallery">{t!(i18n, gallery)}</A> + // <A href="/resume">{t!(i18n, resume)}</A> </div> </div> <picture> <img class="image" - src="https://images.ctfassets.net/e3magj9g6dp1/14q5L7K0BCol1gx0aCSCck/d1f69bfa404efed6a2dcc71401bbc16d/P5310039-1-2.jpg?w=1600&q=50&fm=avif" + src="https://directus.gerome.fi/assets/efdc0b69-7a48-4434-bf07-d406e42a971e?width=1600&fit=inside&format=auto&quality=50&withoutEnlargement=true" alt="Banner" /> - <source srcset="https://images.ctfassets.net/e3magj9g6dp1/14q5L7K0BCol1gx0aCSCck/d1f69bfa404efed6a2dcc71401bbc16d/P5310039-1-2.jpg?w=1600&q=50&fm=jpg"/> + <source srcset="https://directus.gerome.fi/assets/efdc0b69-7a48-4434-bf07-d406e42a971e?width=1600&fit=inside&format=jpg&quality=50&withoutEnlargement=true"/> </picture> </div> @@ -110,7 +123,7 @@ pub fn Footer() -> impl IntoView { <span class="name">{t!(i18n, tanguy_gerome)}</span> <div class="links"> <a href="https://www.instagram.com/kapno.cc/" target="_blank" rel="noopener noreferrer">instagram @kapno.cc</a> - <a href="https://github.com/kapnoc" target="_blank" rel="noopener noreferrer">github @kapnoc</a> + <a href="https://forgejo.juustodiilerit.fi/tanguy" target="_blank" rel="noopener noreferrer">git (forgejo.juustodiilerit.fi)</a> <a href="mailto:tanguy@gerome.fi" target="_blank" rel="noopener noreferrer">email tanguy@gerome.fi</a> </div> </div> @@ -118,44 +131,89 @@ pub fn Footer() -> impl IntoView { } } +#[derive(Deserialize, Serialize, Clone, Debug, Default)] +pub struct HomePageTranslations { + content: String +} + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct HomePageSingleton { + translations: Option<HomePageTranslations> +} + +#[server(GetHomepage, "/api", "GetJson")] +pub async fn get_homepage(locale: String) -> Result<HomePageSingleton, ServerFnError> { + crate::services::directus::get_client() + .get_item::<HomePageSingleton>(&locale, "homepage", "homepage").await + .map_err(|e| ServerFnError::ServerError(e.to_string())) +} + #[component] pub fn HomePage() -> impl IntoView { + let i18n = use_i18n(); + + let homepage = Resource::new(move || i18n.get_locale(), move |locale| get_homepage(locale.to_string())); view! { <main class="main-width"> - <h1>Welcome!</h1> - - <p>I am <b>Tanguy Gérôme</b>, a 26 year old software developer, amateur photographer, and over all nerd living in Helsinki, Finland, originally from Cornimont, France.</p> - - <p> - On here you can find my personal photography portfolio, and (coming) a blog where I scribble about whatever comes to mind in relation to my hobbies and interests, including: - - <ul> - <li>Linux</li> - <li>video games</li> - <li>knitting</li> - <li>hiking</li> - <li>scouting</li> - <li>language learning</li> - <li>photography (digital and film)</li> - </ul> - </p> - - <p>I am also using this website as a way to practice in my language learning journey, so expect unfinished and low quality translations for anything other than English and French :D</p> - - <p>This website is still under construction, more content to come (hopefully) soon.</p> - - // <Await future=move || get_rich_text_page("home-page".to_string()) let:page> - // {match page { - // Ok(page) => { - // view! { - // <div> - // {rich_text::document_handler(&page.english.rich_text_content)} - // </div> - // } - // }, - // Err(error) => view! { <div><p>"Error: "{error.to_string()}</p></div> } - // }} - // </Await> + <Suspense + fallback=move || view! { <div>"Loading..."</div> } + > + {move || homepage.get() + .and_then(|homepage| homepage.ok()) + .and_then(|homepage| { + let html = markdown::to_html(&homepage.translations.unwrap_or_default().content); + view! { + <div class="markdown" inner_html=html/> + }.into() + }) + } + </Suspense> + </main> + } +} + +#[derive(Deserialize, Serialize, Clone, Debug, Default)] +pub struct ResumeTranslations { + content: String +} + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct ResumeSingleton { + translations: Option<ResumeTranslations> +} + +#[server(GetResume, "/api", "GetJson")] +pub async fn get_resume(locale: String) -> Result<ResumeSingleton, ServerFnError> { + crate::services::directus::get_client() + .get_item::<ResumeSingleton>(&locale, "resume", "resume").await + .map_err(|e| ServerFnError::ServerError(e.to_string())) +} + +#[component] +pub fn Resume() -> impl IntoView { + let i18n = use_i18n(); + + let resume = Resource::new(move || i18n.get_locale(), move |locale| get_resume(locale.to_string())); + view! { + <main class="main-width"> + <img + class="resume-image" + src="https://directus.gerome.fi/assets/0c33f439-4e1b-4a1f-a1ab-df1cc9b60f23?width=600&height=600&fit=cover&format=auto&quality=90&withoutEnlargement=true" + alt="Tanguy Gérôme - portait" + /> + <Suspense + fallback=move || view! { <div>"Loading..."</div> } + > + {move || resume.get() + .and_then(|resume| resume.ok()) + .and_then(|resume| { + let html = markdown::to_html(&resume.translations.unwrap_or_default().content); + view! { + <div class="markdown" inner_html=html/> + }.into() + }) + } + </Suspense> </main> } } diff --git a/src/blog.rs b/src/blog.rs deleted file mode 100644 index 4199373..0000000 --- a/src/blog.rs +++ /dev/null @@ -1,103 +0,0 @@ -use leptos::*; -use leptos_router::*; -use serde::{Deserialize, Serialize}; - -use crate::i18n::*; -// use crate::services::contentful::get_markdown_page; -// use crate::services::rich_text; - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct BlogPostMetadata { - title: String, - page_slug: String, -} - -#[derive(Params, PartialEq)] -struct BlogPostParams { - slug: String -} - -// #[server(GetBlogPostList, "/api", "GetJson")] -// pub async fn get_blog_post_list() -> Result<Vec<BlogPostMetadata>, ServerFnError> { -// use crate::services::contentful; -// let contentful_client = contentful::get_contentful_client(); -// let pages = contentful_client.get_entries_by_type::<contentful::RichTextPageLanguagesWrapper>("richTextPageLanguagesWrapper", None).await; -// match pages { -// Ok(found_pages) => { -// Ok(found_pages.into_iter().map(|page| BlogPostMetadata { title: page.english.title, page_slug: page.english.page_slug }).collect()) -// }, -// Err(e) => Err(ServerFnError::ServerError(e.to_string())), -// } -// } - -#[component] -pub fn BlogList() -> impl IntoView { - let i18n = use_i18n(); - // let blog_pages_local = create_local_resource(|| (), |_| async move { get_blog_post_list().await }); - // let blog_pages = create_resource(|| (), |_| async move { get_blog_post_list().await }); - - view! { - <main class="main-width"> - <h1>{t!(i18n, welcome_blog)}</h1> - // <Await future=|| get_blog_post_list() let:pages> - // <p>"Loaded " {pages.as_ref().unwrap().len()} " pages"</p> - // </Await> - // <Suspense fallback=move || view! { <p>"Loading..."</p> }> - // {move || blog_pages_local.get() - // .map(|pages| view! { <p>"Loaded " {pages.unwrap().len()} " pages"</p> }) - // } - // </Suspense> - - - // <Suspense fallback=move || view! { <p>"Loading..."</p> }> - // {match blog_pages.get().unwrap_or(Ok(Vec::new())) { - // Ok(pages) => { - // view! { - // <ul> - // {pages.into_iter() - // .map(|page| { - // let blog_post_url = format!("/blog/{}", page.page_slug); - // view! { <li><A href=blog_post_url>{page.title}</A></li> } - // }) - // .collect::<Vec<_>>()} - // </ul> - // } - // }, - // Err(error) => view! { <ul>"Error: "{error.to_string()}</ul> } - // }} - // {move || blog_pages.get() - // .map(|pages| view! { <p>"Found " {pages.unwrap().len()} " pages"</p> }) - // } - // </Suspense> - </main> - } -} - -#[component] -pub fn BlogPost() -> impl IntoView { - // let params = use_params::<BlogPostParams>(); - // let slug= move || { - // params.with(|params| params.as_ref() - // .map(|params| params.slug.clone()) - // .unwrap()) - // }; - // let blog_page = create_resource(|| (), move |_| async move { get_rich_text_page(slug()).await }); - - view! { - <main class="main-width"> - // <Suspense fallback=move || view! { <div>"Loading..."</div> }> - // {match blog_page.get().unwrap_or(Err(ServerFnError::ServerError("Loading...".to_string()))) { - // Ok(page) => { - // view! { - // <div> - // <h1>{page.english.title}</h1> - // {rich_text::document_handler(&page.english.rich_text_content)} - // </div> - // } - // }, - // Err(error) => view! { <div>"Error: "{error.to_string()}</div> } - // }} - // </Suspense> - </main> - } -} diff --git a/src/error_template.rs b/src/error_template.rs deleted file mode 100644 index 1e0508d..0000000 --- a/src/error_template.rs +++ /dev/null @@ -1,72 +0,0 @@ -use http::status::StatusCode; -use leptos::*; -use thiserror::Error; - -#[derive(Clone, Debug, Error)] -pub enum AppError { - #[error("Not Found")] - NotFound, -} - -impl AppError { - pub fn status_code(&self) -> StatusCode { - match self { - AppError::NotFound => StatusCode::NOT_FOUND, - } - } -} - -// A basic function to display errors served by the error boundaries. -// Feel free to do more complicated things here than just displaying the error. -#[component] -pub fn ErrorTemplate( - #[prop(optional)] outside_errors: Option<Errors>, - #[prop(optional)] errors: Option<RwSignal<Errors>>, -) -> impl IntoView { - let errors = match outside_errors { - Some(e) => create_rw_signal(e), - None => match errors { - Some(e) => e, - None => panic!("No Errors found and we expected errors!"), - }, - }; - // Get Errors from Signal - let errors = errors.get_untracked(); - - // Downcast lets us take a type that implements `std::error::Error` - let errors: Vec<AppError> = errors - .into_iter() - .filter_map(|(_k, v)| v.downcast_ref::<AppError>().cloned()) - .collect(); - println!("Errors: {errors:#?}"); - - // Only the response code for the first error is actually sent from the server - // this may be customized by the specific application - #[cfg(feature = "ssr")] - { - use leptos_axum::ResponseOptions; - let response = use_context::<ResponseOptions>(); - if let Some(response) = response { - response.set_status(errors[0].status_code()); - } - } - - view! { - <h1>{if errors.len() > 1 {"Errors"} else {"Error"}}</h1> - <For - // a function that returns the items we're iterating over; a signal is fine - each= move || {errors.clone().into_iter().enumerate()} - // a unique key for each item as a reference - key=|(index, _error)| *index - // renders each item to a view - children=move |error| { - let error_string = error.1.to_string(); - let error_code= error.1.status_code(); - view! { - <h2>{error_code.to_string()}</h2> - <p>"Error: " {error_string}</p> - } - } - /> - } -} diff --git a/src/fileserv.rs b/src/fileserv.rs deleted file mode 100644 index a499201..0000000 --- a/src/fileserv.rs +++ /dev/null @@ -1,60 +0,0 @@ -use crate::app::App; -use axum::response::Response as AxumResponse; -use axum::{ - body::Body, - extract::State, - http::{Request, Response, StatusCode}, - response::IntoResponse, -}; -use leptos::*; -use tower::ServiceExt; -use tower_http::services::ServeDir; - -pub async fn file_and_error_handler( - State(options): State<LeptosOptions>, - req: Request<Body>, -) -> AxumResponse { - let root = options.site_root.clone(); - let (parts, body) = req.into_parts(); - - let mut static_parts = parts.clone(); - static_parts.headers.clear(); - if let Some(encodings) = parts.headers.get("accept-encoding") { - static_parts - .headers - .insert("accept-encoding", encodings.clone()); - } - - let res = get_static_file(Request::from_parts(static_parts, Body::empty()), &root) - .await - .unwrap(); - - if res.status() == StatusCode::OK { - res.into_response() - } else { - let handler = leptos_axum::render_app_to_stream(options.to_owned(), App); - handler(Request::from_parts(parts, body)) - .await - .into_response() - } -} - -async fn get_static_file( - request: Request<Body>, - root: &str, -) -> Result<Response<Body>, (StatusCode, String)> { - // `ServeDir` implements `tower::Service` so we can call it with `tower::ServiceExt::oneshot` - // This path is relative to the cargo root - match ServeDir::new(root) - .precompressed_gzip() - .precompressed_br() - .oneshot(request) - .await - { - Ok(res) => Ok(res.into_response()), - Err(err) => Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Error serving files: {err}"), - )), - } -} diff --git a/src/gallery.rs b/src/gallery.rs new file mode 100644 index 0000000..ad77de7 --- /dev/null +++ b/src/gallery.rs @@ -0,0 +1,134 @@ +use leptos::{ + Params, + prelude::* +}; +use serde::{Deserialize, Serialize}; +use leptos_router::{ + components::Outlet, hooks::use_params, params::Params +}; + +use crate::{i18n::*, services::directus::Asset}; + +#[derive(Clone, Debug, Serialize, Deserialize, Default)] +pub struct ImageTranslations { + subtitle: Option<String>, + description: String +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Image { + slug: String, + title: String, + translations: Option<ImageTranslations>, + watermarked: Asset, + original: Asset, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Gallery { + images: Vec<Image> +} + +#[server(GetGallery, "/api", "GetJson")] +pub async fn get_gallery(locale: String) -> Result<Gallery, ServerFnError> { + let all_images = crate::services::directus::get_client().get_all_items_in_collection::<Image>(&locale, "image").await.unwrap_or(vec![]); + crate::services::directus::get_client().get_item_json("gallery", "gallery").await + .map_err(|e| ServerFnError::ServerError(e.to_string())) + .and_then(|gallery_json| { + let images_vec_json = gallery_json["data"]["images"].as_array().unwrap(); + let images = images_vec_json.into_iter().map(|image_json| { + all_images.iter().find(|image| image.slug == image_json["item"]) + .map(|found_image| found_image.clone()) + }); + let collected_images: Option<Vec<_>> = images.collect(); + match collected_images { + Some(images) => Ok(Gallery{ images }), + _ => Err(ServerFnError::ServerError("aaa".to_string())) + } + }) +} + +#[component] +pub fn Gallery() -> impl IntoView { + let i18n = use_i18n(); + + let gallery = Resource::new(move || i18n.get_locale(), move |locale| get_gallery(locale.to_string())); + + view! { + <main class="main-width gallery-wrapper"> + <h2>{t!(i18n, gallery)}</h2> + <Outlet/> + <Suspense fallback=move || view! { <div>"Loading..."</div> }> + {move || gallery.get() + .and_then(|gallery| gallery.ok()) + .and_then(|gallery| { + view! { + <div class="gallery-entries"> + { + gallery.images.into_iter().map(|image| { + view! { + <a class="gallery-thumbnail" href={format!("/gallery/{}", image.slug)}> + <img src=format!("https://directus.gerome.fi/assets/{}?width=400&height=400&fit=inside&format=auto&quality=80&withoutEnlargement=true", image.original.id)/> + <p>{image.title}</p> + </a> + } + }).collect::<Vec<_>>() + } + </div> + }.into() + }) + } + </Suspense> + </main> + } +} + +#[derive(Params, PartialEq)] +struct GalleryEntryParams { + slug: Option<String>, +} + +#[component] +pub fn GalleryEntry() -> impl IntoView { + let i18n = use_i18n(); + let params = use_params::<GalleryEntryParams>(); + let slug = move || { + params .read() + .as_ref() + .ok() + .and_then(|params| params.slug.clone()) + .unwrap_or_default() + }; + + let gallery = Resource::new(move || i18n.get_locale(), move |locale| get_gallery(locale.to_string())); + + view! { + <main class="main-width gallery-wrapper"> + <Suspense fallback=move || view! { <div>"Loading..."</div> }> + {move || gallery.get() + .and_then(|gallery| gallery.ok()) + .and_then(|gallery| gallery.images.iter() + .find(|image| image.slug == slug()) + .map(|image| image.clone())) + .and_then(|image| { + let translations = image.translations.unwrap_or_default(); + let subtitle = translations.subtitle.unwrap_or_default(); + view! { + <div class="gallery-open-entry"> + <img src=format!("https://directus.gerome.fi/assets/{}?width=1600&height=1600&fit=inside&format=auto&quality=90&withoutEnlargement=true", image.watermarked.id)/> + <h3>{image.title}</h3> + {if subtitle.len() > 0 { + Some(view!{<div><h4>{subtitle}</h4></div>}) + } else { + None + }} + <p>{translations.description}</p> + </div> + }.into() + }) + } + </Suspense> + </main> + } +} diff --git a/src/lib.rs b/src/lib.rs index 0ac15cb..6758df1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,19 +1,15 @@ leptos_i18n::load_locales!(); -pub mod app; -pub mod blog; -pub mod error_template; -pub mod components; -pub mod routes; +pub mod app; + pub mod services; -#[cfg(feature = "ssr")] -pub mod fileserv; +pub mod gallery; #[cfg(feature = "hydrate")] #[wasm_bindgen::prelude::wasm_bindgen] pub fn hydrate() { use crate::app::*; console_error_panic_hook::set_once(); - leptos::mount_to_body(App); + leptos::mount::hydrate_body(App); } diff --git a/src/main.rs b/src/main.rs index 1d4050d..04aa135 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ + #[cfg(feature = "ssr")] #[tokio::main] async fn main() { @@ -5,29 +6,29 @@ async fn main() { let _ = dotenvy::dotenv(); } use axum::Router; - use leptos::*; + use leptos::logging::log; + use leptos::prelude::*; use leptos_axum::{generate_route_list, LeptosRoutes}; use tanguy_gerome_fi::app::*; - use tanguy_gerome_fi::fileserv::file_and_error_handler; - // Setting get_configuration(None) means we'll be using cargo-leptos's env values - // For deployment these variables are: - // <https://github.com/leptos-rs/start-axum#executing-a-server-on-a-remote-machine-without-the-toolchain> - // Alternately a file can be specified such as Some("Cargo.toml") - // The file would need to be included with the executable when moved to deployment - let conf = get_configuration(None).await.unwrap(); + let conf = get_configuration(None).unwrap(); + let addr = conf.leptos_options.site_addr; let leptos_options = conf.leptos_options; - let addr = leptos_options.site_addr; + // Generate the list of routes in your Leptos App let routes = generate_route_list(App); - // build our application with a route let app = Router::new() - .leptos_routes(&leptos_options, routes, App) - .fallback(file_and_error_handler) + .leptos_routes(&leptos_options, routes, { + let leptos_options = leptos_options.clone(); + move || shell(leptos_options.clone()) + }) + .fallback(leptos_axum::file_and_error_handler(shell)) .with_state(leptos_options); + // run our app with hyper + // `axum::Server` is a re-export of `hyper::Server` + log!("listening on http://{}", &addr); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); - logging::log!("listening on http://{}", &addr); axum::serve(listener, app.into_make_service()) .await .unwrap(); @@ -36,6 +37,6 @@ async fn main() { #[cfg(not(feature = "ssr"))] pub fn main() { // no client-side main function - // unless we want this to work with e.g., Trunk for a purely client-side app + // unless we want this to work with e.g., Trunk for pure client-side testing // see lib.rs for hydration function instead } diff --git a/src/routes/gallery.rs b/src/routes/gallery.rs deleted file mode 100644 index 20d6a2d..0000000 --- a/src/routes/gallery.rs +++ /dev/null @@ -1,142 +0,0 @@ -use leptos::*; -use leptos_router::*; -use serde::{Deserialize, Serialize}; - -// use crate::i18n::*; - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct WatermarkedImage { - title: String, - slug: String, - #[serde(default)] - description: String, - image_without_watermark: contentful::models::Asset, - image_with_watermark: contentful::models::Asset -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Gallery { - title: String, - slug: String, - #[serde(default)] - description: String, - images: Vec<WatermarkedImage> -} - -#[server(GetGallery, "/api", "GetJson")] -pub async fn get_gallery() -> Result<Gallery, ServerFnError> { - use crate::services::contentful; - let contentful_client = contentful::get_contentful_client(); - let slug = "photography-portfolio"; - let query_string = format!("?content_type=imageGallery&include=10&fields.slug={}", slug); - let galleries = contentful_client.get_entries_by_query_string::<Gallery>(&query_string).await; - match galleries { - Ok(found_galleries) => { - if found_galleries.len() != 1 { - return Err(ServerFnError::ServerError("Found none or more than one".to_string())); - } - Ok(found_galleries[0].clone()) - }, - Err(e) => Err(ServerFnError::ServerError(e.to_string())), - } -} - -#[derive(Params, PartialEq)] -struct GalleryEntryParams { - slug: String -} - -#[component] -pub fn GalleryEntry() -> impl IntoView { - let params = use_params::<GalleryEntryParams>(); - let slug= move || { - params.with(|params| params.as_ref() - .map(|params| params.slug.clone()) - .unwrap_or_default()) - }; - let gallery = create_resource(|| (), |_| async move { get_gallery().await }); - - view! { - <Suspense fallback=move || view! { <p>"Loading..."</p> }> - {move || { - gallery.get().map(|gallery_loaded| - match gallery_loaded { - Ok(gallery) => { - let image = move || gallery.images.into_iter() - .find(move |image| image.slug == slug()); - match image() { - None => view! { <div/> }, - Some(image) => { - let display_url = format!("https:{}?w=2400&h=2400&q=80&fm=avif", &image.image_with_watermark.file.url); - let jpg_display_url = format!("https:{}?w=2400&h=2400&q=80&fm=jpg", &image.image_with_watermark.file.url); - view! { - <div class="open-entry"> - <picture> - <img src=display_url alt=image.title.clone()/> - <source srcset=jpg_display_url/> - </picture> - <h3>{image.title.clone()}</h3> - <p>{image.description}</p> - </div> - } - } - } - }, - Err(error) => view! { <div>"Error: "{error.to_string()}</div> } - } - ) - - }} - </Suspense> - } - -} - -#[component] -pub fn Gallery() -> impl IntoView { - let gallery = create_resource(|| (), |_| async move { get_gallery().await }); - - view! { - <main class="main-width gallery-wrapper"> - <Outlet/> - <Suspense fallback=move || view! { <p>"Loading..."</p> }> - {move || { - gallery.get().map(|gallery_loaded| - match gallery_loaded { - Ok(gallery) => { - view! { - <div class="gallery"> - <h3>{gallery.title}</h3> - <p>{gallery.description}</p> - <ul> - {gallery.images.into_iter() - .map(|image| { - let thumbnail_url = format!("https:{}?w=800&h=800&q=80&fm=avif", &image.image_without_watermark.file.url); - let jpg_thumbnail_url = format!("https:{}?w=800&h=800&q=80&fm=jpg", &image.image_without_watermark.file.url); - let link_url = format!("/gallery/{}", &image.slug); - view! { - <li> - <A href=link_url> - <picture> - <img src=thumbnail_url alt=image.title/> - <source srcset=jpg_thumbnail_url/> - </picture> - </A> - </li> - } - }).collect::<Vec<_>>() - } - </ul> - </div> - } - }, - Err(error) => view! { <div>"Error: "{error.to_string()}</div> } - } - ) - - }} - </Suspense> - </main> - } -} diff --git a/src/routes/mod.rs b/src/routes/mod.rs deleted file mode 100644 index 31dedbe..0000000 --- a/src/routes/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ - -pub mod gallery; diff --git a/src/services/contentful.rs b/src/services/contentful.rs deleted file mode 100644 index 185e098..0000000 --- a/src/services/contentful.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::env; -use leptos::*; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct MarkdownPage { - pub title: String, - pub slug: String, - pub content: String, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct MarkdownPageLanguagesWrapper { - pub internal_title: String, - pub slug: String, - pub english: MarkdownPage, -} - -#[server(GetRichTextPage, "/api", "GetJson")] -pub async fn get_markdown_page(slug: String) -> Result<MarkdownPageLanguagesWrapper, ServerFnError> { - let contentful_client = get_contentful_client(); - let builder = contentful::QueryBuilder::new() - .content_type_is("markdownPageLanguagesWrapper") - .include(10) - .field_equals("fields.slug", &slug); - // let query_string = format!("?content_type=markdownPageLanguagesWrapper&include=10&fields.slug={}", slug); - // let pages = contentful_client.get_entries_by_query_string::<RichTextPageLanguagesWrapper>(&query_string).await; - let pages = contentful_client.get_entries::<MarkdownPageLanguagesWrapper>(Some(builder)).await; - match pages { - Ok(found_pages) => { - if found_pages.len() != 1 { - return Err(ServerFnError::ServerError("Found none or more than one".to_string())); - } - let english_content = found_pages[0].english.content.clone(); - dbg!(english_content); - Ok(found_pages[0].clone()) - }, - Err(e) => Err(ServerFnError::ServerError(e.to_string())), - } -} - -pub fn get_contentful_client() -> contentful::ContentfulClient { - let access_token = env::var("CONTENTFUL_ACCESS_TOKEN").unwrap(); - const SPACE_ID: &str = "e3magj9g6dp1"; - // let base_url = "https://cdn.contentful.com/spaces"; - // const ENVIRONMENT_ID: &str = "master"; - // return Client::new(&access_token, SPACE_ID, base_url, ENVIRONMENT_ID); - return contentful::ContentfulClient::new(&access_token, SPACE_ID); -} diff --git a/src/services/directus.rs b/src/services/directus.rs new file mode 100644 index 0000000..30ba30d --- /dev/null +++ b/src/services/directus.rs @@ -0,0 +1,84 @@ +use std::collections::HashMap; +use std::env; +use leptos::prelude::*; +use serde::{Deserialize, Serialize}; + +pub struct DirectusClient { + access_token: String, + base_url: String, + reqwest_client: reqwest::Client +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Asset { + pub id: String +} + +impl DirectusClient { + pub fn new(access_token: &str, base_url: &str) -> DirectusClient { + let reqwest_client = reqwest::Client::new(); + DirectusClient { + access_token: access_token.to_string(), + base_url: base_url.to_string(), + reqwest_client + } + } + + pub async fn list_items_in_collection(&self, collection: &str, primary_key: &str) -> Result<Vec<String>> { + let response = self.reqwest_client.get(format!("{}/items/{}?fields={}", self.base_url, collection, primary_key)) + .header("Authorization", format!("Bearer {}", self.access_token)) + .send().await?; + let items_json = response.json::<Vec<HashMap<String, String>>>().await?; + let ids = items_json.iter().map(|item| item[&primary_key.to_string()].clone()).collect(); + Ok(ids) + } + + pub async fn get_item_json(&self, collection: &str, id: &str) -> Result<serde_json::Value> { + let response = self.reqwest_client.get(format!("{}/items/{}/{}?fields=*,*.*,translations.*", self.base_url, collection, id)) + .header("Authorization", format!("Bearer {}", self.access_token)) + .send().await?; + let json = &response.json::<serde_json::Value>().await?; + Ok(json.clone()) + } + + pub async fn get_item<T: for<'a> Deserialize<'a>>(&self, locale: &str, collection: &str, id: &str) -> Result<T> { + let response = self.reqwest_client.get(format!("{}/items/{}/{}?fields=*,*.*,translations.*", self.base_url, collection, id)) + .header("Authorization", format!("Bearer {}", self.access_token)) + .send().await?; + let json = &response.json::<serde_json::Value>().await?; + let translations_json = json["data"]["translations"].clone(); + let found_translation = match translations_json.as_array() { + Some(translations) => translations.iter().find(|translation| translation["languages_code"] == locale), + _ => None + }; + let mut new_json = json["data"].clone(); + new_json["translations"] = found_translation.unwrap_or(&serde_json::Value::Null).clone(); + let item = serde_json::from_value::<T>(new_json)?; + Ok(item) + } + + pub async fn get_all_items_in_collection<T: for<'a> Deserialize<'a>>(&self, locale: &str, collection: &str) -> Result<Vec<T>> { + let response = self.reqwest_client.get(format!("{}/items/{}?fields=*,*.*,translations.*", self.base_url, collection)) + .header("Authorization", format!("Bearer {}", self.access_token)) + .send().await?; + let json = &response.json::<serde_json::Value>().await?; + let items_json = json["data"].as_array().unwrap_or(&vec!()).clone(); + let items = items_json.iter().map(|item_json| { + let translations_json = item_json["translations"].clone(); + let found_translation = match translations_json.as_array() { + Some(translations) => translations.iter().find(|translation| translation["languages_code"] == locale), + _ => None + }; + let mut new_json = item_json.clone(); + new_json["translations"] = found_translation.unwrap_or(&serde_json::Value::Null).clone(); + let item = serde_json::from_value::<T>(new_json); + item.unwrap() + }).collect(); + Ok(items) + } +} + +pub fn get_client() -> DirectusClient { + let access_token = env::var("DIRECTUS_ACCESS_TOKEN").unwrap(); + DirectusClient::new(&access_token, "https://directus.gerome.fi") +} diff --git a/src/services/mod.rs b/src/services/mod.rs index 1fd78e4..a1f0401 100644 --- a/src/services/mod.rs +++ b/src/services/mod.rs @@ -1,2 +1,2 @@ -pub mod contentful; -pub mod rich_text; + +pub mod directus; diff --git a/src/services/rich_text.rs b/src/services/rich_text.rs deleted file mode 100644 index 49f4673..0000000 --- a/src/services/rich_text.rs +++ /dev/null @@ -1,193 +0,0 @@ -use leptos::*; -use serde::{Deserialize, Serialize}; -use serde_json::Value; - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase", untagged)] -pub enum RichTextNode { - Block { - node_type: String, - // data: Option<serde_json::Value>, - content: Vec<RichTextNode>, - }, - Text { - node_type: String, - // data: Option<serde_json::Value>, - value: String, - // marks: Vec<Mark>, - }, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct TextBlock { - node_type: String, - // data: Option<serde_json::Value>, - value: String, - // marks: Vec<Mark>, -} - - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Mark { - #[serde(rename = "type")] - pub mark_type: String -} - -#[derive(Debug, Clone)] -struct NodeHandler { - node_type: &'static str, - function: fn (node: &Value) -> HtmlElement<html::AnyElement>, -} - -const NODE_HANDLERS: [NodeHandler; 12] = [ - NodeHandler { node_type: "document", function: document_handler }, - NodeHandler { node_type: "paragraph", function: paragraph_handler }, - NodeHandler { node_type: "text", function: text_handler }, - NodeHandler { node_type: "heading-1", function: heading_1_handler }, - NodeHandler { node_type: "heading-2", function: heading_2_handler }, - NodeHandler { node_type: "heading-3", function: heading_3_handler }, - NodeHandler { node_type: "heading-4", function: heading_4_handler }, - NodeHandler { node_type: "heading-5", function: heading_5_handler }, - NodeHandler { node_type: "heading-6", function: heading_6_handler }, - NodeHandler { node_type: "hr", function: hr_handler }, - NodeHandler { node_type: "blockquote", function: quote_handler }, - NodeHandler { node_type: "embedded-asset-block", function: asset_handler }, -]; - -pub fn document_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { - <div class="rich-text-document"> - {render_children(&children)} - </div> - }.into() -} - -fn paragraph_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { - <p> - {render_children(&children)} - </p> - }.into() -} - -fn text_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let block: TextBlock = serde_json::from_value(node.clone()).unwrap(); - let text = block.value.replace("\n", "<br/>"); - view! { <span inner_html=text>{}</span> }.into() -} - -fn heading_1_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { <h1> {render_children(&children)} </h1> }.into() -} - -fn heading_2_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { <h2> {render_children(&children)} </h2> }.into() -} - -fn heading_3_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { <h3> {render_children(&children)} </h3> }.into() -} - -fn heading_4_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { <h4> {render_children(&children)} </h4> }.into() -} - -fn heading_5_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { <h5> {render_children(&children)} </h5> }.into() -} - -fn heading_6_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { <h6> {render_children(&children)} </h6> }.into() -} - -fn hr_handler(_node: &Value) -> HtmlElement<html::AnyElement> { - view! { <hr/> }.into() -} - -fn quote_handler(node: &Value) -> HtmlElement<html::AnyElement> { - let children: Vec<Value> = serde_json::from_value(node["content"].clone()).unwrap(); - view! { <blockquote> {render_children(&children)} </blockquote> }.into() -} - - -fn asset_handler(_node: &Value) -> HtmlElement<html::AnyElement> { - // let data = node["data"]; - // let img_url = format!( - // "https://images.ctfassets.net/e3magj9g6dp1/14q5L7K0BCol1gx0aCSCck/d1f69bfa404efed6a2dcc71401bbc16d/P5310039-1-2.jpg?w=1600&q=50&fm=avif" - // ); - view! { <img> </img> }.into() -} - -fn empty_handler() -> HtmlElement<html::AnyElement> { - view! { <div/> }.into() -} - -fn node_dispatcher(node: &Value) -> HtmlElement<html::AnyElement> { - for handler in NODE_HANDLERS.iter() { - let node_type = node["nodeType"].clone(); - if handler.node_type == node_type { - return (handler.function)(node) - } - } - - empty_handler() -} - -fn render_children(children: &Vec<Value>) -> Vec<HtmlElement<html::AnyElement>> { - children.iter().map(|child| node_dispatcher(child)).collect() -} - -// pub fn render_rich_text(rich_text: Value) -> HtmlElement<html::AnyElement> { -// node_dispatcher(&rich_text) -// } - -// fn _document_handler(node: &RichTextNode) -> HtmlElement<html::AnyElement> { -// let empty_vec: Vec<RichTextNode> = Vec::new(); -// let children = match node { -// RichTextNode::Block{node_type: _, content} => content, -// // RichTextNode::Block{node_type: _, data: _, content} => content, -// _ => &empty_vec, -// }; -// view! { -// <div class="rich-text-document"> -// {_render_children(children)} -// </div> -// }.into() -// } - -// fn _text_handler(node: &RichTextNode) -> HtmlElement<html::AnyElement> { -// match node { -// RichTextNode::Text{node_type: _, value} => view! { <span>{value}</span> }.into(), -// // RichTextNode::Text{node_type: _, data: _, value, marks} => view! { <span>{value}</span> }.into(), -// _ => view! { <span>Error</span> }.into(), -// } -// } - -// fn _node_dispatcher(node: &RichTextNode) -> HtmlElement<html::AnyElement> { -// for handler in NODE_HANDLERS.iter() { -// let node_type = match node.clone() { -// // RichTextNode::Block{node_type, data: _, content: _} => node_type, -// // RichTextNode::Text{node_type, data: _, value: _, marks: _} => node_type, -// RichTextNode::Block{node_type, content: _} => node_type, -// RichTextNode::Text{node_type, value: _} => node_type, -// }; -// if handler.node_type == node_type { -// // return (handler.function)(node) -// } -// } - -// empty_handler() -// } - -// fn _render_children(children: &Vec<RichTextNode>) -> Vec<HtmlElement<html::AnyElement>> { -// children.iter().map(|child| _node_dispatcher(child)).collect() -// } diff --git a/style/main.scss b/style/main.scss index d346fdc..2d51a3b 100644 --- a/style/main.scss +++ b/style/main.scss @@ -53,10 +53,10 @@ body { font-weight: 300; line-height: 1.3; } - h1 { font-size: 42px; } - h2 { font-size: 32px; } - h3 { font-size: 22px; } - h4 { font-size: 18px; } + h1 { font-size: 42px; margin: 32px 0 16px 0; } + h2 { font-size: 32px; margin: 64px 0 16px 0; } + h3 { font-size: 22px; margin: 32px 0 16px 0; } + h4 { font-size: 18px; margin: 32px 0 16px 0; } header { width: 100%; @@ -87,7 +87,7 @@ body { .text { @include top-level-padding; flex-basis: auto; - flex-shrink: 1; + flex-shrink: 0; flex-grow: 1; display: flex; @@ -119,7 +119,11 @@ body { } picture { - display: contents; + max-width: 800px; + width: 100%; + max-height: 300px; + height: 100%; + // display: contents; .image { max-width: 800px; @@ -155,6 +159,16 @@ body { margin-bottom: 32px; } + .markdown { + b, strong { + font-weight: 500; + } + + img { + max-width: 100%; + } + } + footer { background: $mainGrey; color: white; @@ -204,67 +218,67 @@ body { } } -.gallery-wrapper { - max-width: 1232px + 32px!important; +.resume-image { + float: right; + max-width: 300px; + width: 100%; + margin: 16px; - .open-entry { - display: flex; - flex-direction: column; - align-items: flex-start; - margin-top: 32px; - - picture { - display: contents; - - img { - object-fit: contain; - width: 100%; - max-height: 90vh; - max-width: 1232px; - align-self: center; - } - } - - h3 { - margin-bottom: 8px; - } - - p { - margin-bottom: 64px; - } - } - - .gallery { - h3 { - width: fit-content; - } - - ul { - width: fit-content; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: center; - padding: 0; - list-style: none; - gap: 16px; - - li { - - picture { - display: contents; - img { - height: 400px; - width: 400px; - object-fit: contain; - - @media all and (max-width: 1000px) { - height: 300px; - width: 300px; - } - } - } - } - } + @media all and (max-width: 550px) { + float: unset; + display: block; + margin: auto; + margin-top: 16px; + margin-bottom: 16px; + } +} + +.gallery-entries { + width: fit-content; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + padding: 0; + gap: 16px; +} + +.gallery-thumbnail { + img { + height: 400px; + width: 400px; + object-fit: contain; + + @media all and (max-width: 1000px) { + height: 300px; + width: 300px; + } + } + + p { + text-align: center; + } +} + +.gallery-open-entry { + display: flex; + flex-direction: column; + align-items: flex-start; + margin-top: 32px; + + img { + object-fit: contain; + width: 100%; + max-height: 90vh; + max-width: 1232px; + align-self: center; + } + + h3 { + margin-bottom: 8px; + } + + p { + margin-bottom: 64px; } }