diff --git a/Cargo.lock b/Cargo.lock index b5d8a93..d2c43d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,9 +44,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.11.2" +version = "3.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" +checksum = "48e2faa3e7418ed780cca54829d32782a4008a077230f67457caa063415e99c2" dependencies = [ "actix-codec", "actix-rt", @@ -72,7 +72,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand", + "rand 0.10.2", "sha1", "smallvec", "tokio", @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +checksum = "14f8c75c51892f18d9c46150c5ac7beb81c95f78c8b83a634d49f4ca32551fe7" dependencies = [ "bytestring", "cfg-if", @@ -155,9 +155,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.11.0" +version = "4.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +checksum = "df09e2d9239703dd64056359c920c7f3fba6535ec61a0059e0f44e095ffe02b4" dependencies = [ "actix-codec", "actix-http", @@ -190,7 +190,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.10", + "socket2 0.6.1", "time", "tracing", "url", @@ -370,6 +370,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + [[package]] name = "brotli" version = "8.0.1" @@ -399,9 +408,9 @@ checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "bytes" -version = "1.10.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "bytestring" @@ -414,9 +423,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.10" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" [[package]] name = "cc" @@ -435,6 +444,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" version = "0.4.42" @@ -451,9 +471,9 @@ dependencies = [ [[package]] name = "codee" -version = "0.3.0" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f18d705321923b1a9358e3fc3c57c3b50171196827fc7f5f10b053242aca627" +checksum = "a9dbbdc4b4d349732bc6690de10a9de952bd39ba6a065c586e26600b6b0b91f5" dependencies = [ "serde", "serde_json", @@ -498,11 +518,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const-str" -version = "0.6.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451d0640545a0553814b4c646eb549343561618838e9b42495f466131fe3ad49" +checksum = "18f12cc9948ed9604230cdddc7c86e270f9401ccbe3c2e98a4378c5e7632212f" [[package]] name = "const_format" @@ -541,13 +567,22 @@ dependencies = [ [[package]] name = "convert_case" -version = "0.8.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" dependencies = [ "unicode-segmentation", ] +[[package]] +name = "convert_case_extras" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c70f0faf8aa9d17787557d5eae854d7755cac50f5c3d12c81d3d57661cebb" +dependencies = [ + "convert_case 0.11.0", +] + [[package]] name = "cookie" version = "0.16.2" @@ -585,6 +620,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -610,6 +654,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "darling" version = "0.20.11" @@ -645,20 +698,6 @@ dependencies = [ "syn", ] -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "default-struct-builder" version = "0.5.1" @@ -718,8 +757,19 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "crypto-common 0.1.6", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", ] [[package]] @@ -747,9 +797,9 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "either_of" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216d23e0ec69759a17f05e1c553f3a6870e5ec73420fbb07807a6f34d5d1d5a4" +checksum = "5060e0a4cbf26a87550792688ade88e6b8aec9208613631a7a363bda7bc2d4cd" dependencies = [ "paste", "pin-project-lite", @@ -815,9 +865,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "form_urlencoded" @@ -935,10 +985,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", - "js-sys", "libc", - "r-efi", + "r-efi 5.2.0", "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasm-bindgen", ] @@ -952,7 +1014,7 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http 1.3.1", + "http 1.4.2", "js-sys", "pin-project", "serde", @@ -965,9 +1027,9 @@ dependencies = [ [[package]] name = "gloo-timers" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +checksum = "482ce8a491a501da4cd806bd190275363d674f2845005c6ddbd5d3e1dd54495d" dependencies = [ "futures-channel", "futures-core", @@ -1015,15 +1077,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hermit-abi" @@ -1053,12 +1109,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -1080,15 +1135,23 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + [[package]] name = "hydration_context" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8714ae4adeaa846d838f380fbd72f049197de629948f91bf045329e0cf0a283" +checksum = "7bbbeb23ee808258cef2c5585ff0dc8e41da21a8dde943f6b290da153a042a96" dependencies = [ "futures", "js-sys", - "once_cell", "or_poisoned", "pin-project-lite", "serde", @@ -1235,18 +1298,18 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.1.9" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" +checksum = "35a84fd5aa25fae5c0f4a33d9cac2ca017fc622cbd089be2229993514990f870" [[package]] name = "indexmap" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown", ] [[package]] @@ -1285,17 +1348,18 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom", + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -1313,16 +1377,16 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leptos" -version = "0.8.12" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78b04cc52d6f6372e546afcd8ed98ee29ea1a9221b19befb8f9961e47b8307c" +checksum = "705e2951f3688e0c4f66bbb7a2702282782dcee716971dbd6209c2619d272479" dependencies = [ "any_spawner", "base64", "cfg-if", "either_of", "futures", - "getrandom", + "getrandom 0.4.3", "hydration_context", "leptos_config", "leptos_dom", @@ -1332,7 +1396,7 @@ dependencies = [ "oco_ref", "or_poisoned", "paste", - "rand", + "rand 0.9.1", "reactive_graph", "rustc-hash", "rustc_version", @@ -1355,9 +1419,9 @@ dependencies = [ [[package]] name = "leptos-use" -version = "0.16.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2162c453100c7d6bc0b6f188ef1df582e35c2458caf6cb69fcddc87619c0db" +checksum = "cc07f2657dcc366ef2d80045354143f6e0a86919763a1a5753cd3871f8f95e2d" dependencies = [ "cfg-if", "chrono", @@ -1380,15 +1444,14 @@ dependencies = [ [[package]] name = "leptos_actix" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a3b5cf3f0414192d37f9f5afa389afcec5b5e1636fade8be55d4f46cd95471" +checksum = "b96f0a4ae68aa117ec532cb7cc6da1005beb7f90f0cc8cc3938ecda0b4bec257" dependencies = [ "actix-files", "actix-http", "actix-web", "any_spawner", - "dashmap", "futures", "hydration_context", "leptos", @@ -1396,7 +1459,7 @@ dependencies = [ "leptos_macro", "leptos_meta", "leptos_router", - "parking_lot", + "or_poisoned", "send_wrapper", "serde_json", "server_fn", @@ -1406,9 +1469,9 @@ dependencies = [ [[package]] name = "leptos_config" -version = "0.8.7" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240b4cb96284256a44872563cf029f24d6fe14bc341dcf0f4164e077cb5a1471" +checksum = "0c06f751315bccc0d193fab302ac01d25bcfcd97474d4676440e7e3250dc3fc3" dependencies = [ "config", "regex", @@ -1419,9 +1482,9 @@ dependencies = [ [[package]] name = "leptos_dom" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f4330c88694c5575e0bfe4eecf81b045d14e76a4f8b00d5fd2a63f8779f895" +checksum = "35742e9ed8f8aaf9e549b454c68a7ac0992536e06856365639b111f72ab07884" dependencies = [ "js-sys", "or_poisoned", @@ -1434,14 +1497,14 @@ dependencies = [ [[package]] name = "leptos_hot_reload" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d61ec3e1ff8aaee8c5151688550c0363f85bc37845450764c31ff7584a33f38" +checksum = "9d2a0f220c8a5ef3c51199dfb9cdd702bc0eb80d52fbe70c7890adfaaae8a4b1" dependencies = [ "anyhow", "camino", "indexmap", - "parking_lot", + "or_poisoned", "proc-macro2", "quote", "rstml", @@ -1452,9 +1515,9 @@ dependencies = [ [[package]] name = "leptos_integration_utils" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b530341b8fa93a33b590efe4d235ea109a1fd08b7676b503e9aa3d35f575edfb" +checksum = "c097f89cd9aa606297672f56fa5bdda09f01609a9f4eefaccdbb5ab5afea4279" dependencies = [ "futures", "hydration_context", @@ -1467,13 +1530,14 @@ dependencies = [ [[package]] name = "leptos_macro" -version = "0.8.11" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2009e2cc8ac3aa3e417c51d2a2b951c34dfea51f25935717b564c347fb20cb3f" +checksum = "96de6e8da9d4f1a7b74b447b317d590ebabb38709f588f7ee20564b773ccbcce" dependencies = [ "attribute-derive", "cfg-if", - "convert_case 0.8.0", + "convert_case 0.11.0", + "convert_case_extras", "html-escape", "itertools", "leptos_hot_reload", @@ -1490,9 +1554,9 @@ dependencies = [ [[package]] name = "leptos_meta" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d489e38d3f541e9e43ecc2e3a815527840345a2afca629b3e23fcc1dd254578" +checksum = "6c3efe657b4c55ed2e078922786ffe20acfb71767c3dd913767b09a35c75c890" dependencies = [ "futures", "indexmap", @@ -1505,9 +1569,9 @@ dependencies = [ [[package]] name = "leptos_router" -version = "0.8.9" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21f482679fc1856ca368560fe7d827d7a34b5bbaa12c8b7c4daf1c02eaf8f09a" +checksum = "253962f9371a2fcf432eff991efc6da58de383c1cbcc332aaff7b8b22f6d778e" dependencies = [ "any_spawner", "either_of", @@ -1542,9 +1606,9 @@ dependencies = [ [[package]] name = "leptos_server" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38acbf32649a4b127c8d4ccaed8fb388e19a746430a0ea8f8160e51e28c36e2d" +checksum = "da974775c5ccbb6bd64be7f53f75e8321542e28f21563a416574dbe4d5447eae" dependencies = [ "any_spawner", "base64", @@ -1566,12 +1630,6 @@ version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" -[[package]] -name = "linear-map" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" - [[package]] name = "litemap" version = "0.8.0" @@ -1956,6 +2014,12 @@ version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.9.1" @@ -1963,7 +2027,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha", - "rand_core", + "rand_core 0.9.3", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -1973,7 +2048,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.3", ] [[package]] @@ -1982,14 +2057,20 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom", + "getrandom 0.3.3", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "reactive_graph" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77cbe7c61b939523104883fd00d431f6c681c7005fd350f01a9ff2fc96509399" +checksum = "00c5a025366836190c7030e883cc2bcd9e384ff555336e3c7954741ca411b177" dependencies = [ "any_spawner", "async-lock", @@ -1998,6 +2079,7 @@ dependencies = [ "hydration_context", "indexmap", "or_poisoned", + "paste", "pin-project-lite", "rustc-hash", "rustc_version", @@ -2010,12 +2092,12 @@ dependencies = [ [[package]] name = "reactive_stores" -version = "0.3.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b73d94139821e0a2f31fb4e0eaf6ebbcf4d15c5e2fb353dc3babd4f6d35674" +checksum = "c30fd35b7d299c591293bb69fed47a703eb2703b1cff0493e78b16ed007e5382" dependencies = [ - "dashmap", "guardian", + "indexmap", "itertools", "or_poisoned", "paste", @@ -2027,11 +2109,11 @@ dependencies = [ [[package]] name = "reactive_stores_macro" -version = "0.2.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa40919eb2975100283b2a70e68eafce1e8bcf81f0622ff168e4c2b3f8d46bb" +checksum = "68072edd607edd30b9ebf57d984ba45d8ab8809e598d0f6046278373fb76a5a0" dependencies = [ - "convert_case 0.8.0", + "convert_case 0.11.0", "proc-macro-error2", "proc-macro2", "quote", @@ -2049,9 +2131,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -2061,9 +2143,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -2078,9 +2160,9 @@ checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rstml" @@ -2106,7 +2188,7 @@ dependencies = [ "chrono", "console_error_panic_hook", "futures", - "http 1.3.1", + "http 1.4.2", "leptos", "leptos-use", "leptos_actix", @@ -2264,9 +2346,9 @@ dependencies = [ [[package]] name = "server_fn" -version = "0.8.8" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc30228718f62d80a376964baf990edbcb5e97688fdc71183a8ef3d44cb6c89" +checksum = "be8559dd05af1b5b7e363a150616589d5a88af5187273f7f331ba0dae8922812" dependencies = [ "actix-web", "actix-ws", @@ -2274,12 +2356,12 @@ dependencies = [ "bytes", "const-str", "const_format", - "dashmap", "futures", "gloo-net", - "http 1.3.1", + "http 1.4.2", "inventory", "js-sys", + "or_poisoned", "pin-project-lite", "rustc_version", "rustversion", @@ -2300,12 +2382,12 @@ dependencies = [ [[package]] name = "server_fn_macro" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950b8cfc9ff5f39ca879c5a7c5e640de2695a199e18e424c3289d0964cabe642" +checksum = "1295b54815397d30d986b63f93cfd515fa86d5e528e0bb589ce9d530502f9e0f" dependencies = [ "const_format", - "convert_case 0.8.0", + "convert_case 0.11.0", "proc-macro2", "quote", "rustc_version", @@ -2325,13 +2407,13 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -2341,8 +2423,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] [[package]] @@ -2383,9 +2465,9 @@ dependencies = [ [[package]] name = "slotmap" -version = "1.0.7" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" dependencies = [ "version_check", ] @@ -2499,9 +2581,9 @@ dependencies = [ [[package]] name = "tachys" -version = "0.2.10" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f88be37609c1891b748ed1feb9b08b0e772156a80d586b38726253f80859134d" +checksum = "a92ba81187437cc5df4281f2326a2e13cc81e8f96448292d1112388e2025ca66" dependencies = [ "any_spawner", "async-trait", @@ -2514,11 +2596,9 @@ dependencies = [ "indexmap", "itertools", "js-sys", - "linear-map", "next_tuple", "oco_ref", "or_poisoned", - "parking_lot", "paste", "reactive_graph", "reactive_stores", @@ -2645,9 +2725,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.48.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -2778,18 +2858,18 @@ dependencies = [ [[package]] name = "typed-builder" -version = "0.21.2" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef81aec2ca29576f9f6ae8755108640d0a86dd3161b2e8bca6cfa554e98f77d" +checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.21.2" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecb9ecf7799210407c14a8cfdfe0173365780968dc57973ed082211958e0b18" +checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" dependencies = [ "proc-macro2", "quote", @@ -2798,9 +2878,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unic-langid" @@ -2869,11 +2949,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.18.1" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ - "getrandom", + "getrandom 0.4.3", "js-sys", "wasm-bindgen", ] @@ -2917,9 +2997,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -2930,22 +3010,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2953,9 +3030,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", @@ -2966,18 +3043,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-streams" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" dependencies = [ "futures-util", "js-sys", @@ -2988,9 +3065,9 @@ dependencies = [ [[package]] name = "wasm_split_helpers" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a114b3073258dd5de3d812cdd048cca6842342755e828a14dbf15f843f2d1b84" +checksum = "ab578aae2fe2916edaea06843187d50f87b0965622da0ceef648edca27b385ba" dependencies = [ "async-once-cell", "wasm_split_macros", @@ -2998,9 +3075,9 @@ dependencies = [ [[package]] name = "wasm_split_macros" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56481f8ed1a9f9ae97ea7b08a5e2b12e8adf9a7818a6ba952b918e09c7be8bf0" +checksum = "3e653af7ee4a9ef0fce481a9ec6f43cb78de20d0cdb4f4f5862e1dc6e407e6c8" dependencies = [ "base16", "quote", @@ -3010,9 +3087,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 5f3e284..df52a69 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,18 +11,18 @@ actix-files = { version = "0.6.8", optional = true } actix-web = { version = "4", optional = true, features = ["macros"] } console_error_panic_hook = "0.1" http = { version = "1.3.1", optional = true } -leptos = { version = "0.8.12", features = ["nightly"] } -leptos_meta = { version = "0.8.5" } -leptos_actix = { version = "0.8.6", optional = true } -leptos_router = { version = "0.8.9", features = ["nightly"] } -wasm-bindgen = "=0.2.105" +leptos = { version = "0.8.20", features = ["nightly"] } +leptos_meta = { version = "0.8.6" } +leptos_actix = { version = "0.8.7", optional = true } +leptos_router = { version = "0.8.14", features = ["nightly"] } +wasm-bindgen = "=0.2.126" tailwind_fuse = { version = "0.3.1", features = ["variant"] } futures = "0.3.31" stylance = "0.7.1" serde = "1.0.228" serde_json = "1.0" chrono = {version = "0.4.42", features = ["serde"]} -leptos-use = "0.16.3" +leptos-use = "0.19.0" simple-bezier-easing = "0.1.1" [dependencies.web-sys] @@ -136,6 +136,3 @@ scss_prelude = ''' @use "sass:math"; @use "sass:list"; ''' - - - diff --git a/src/components/articles_section/articles/article_card.rs b/src/components/articles_section/articles/article_card.rs index 4803410..8965809 100644 --- a/src/components/articles_section/articles/article_card.rs +++ b/src/components/articles_section/articles/article_card.rs @@ -15,10 +15,10 @@ pub fn ArticleCard( #[prop(default = "")] class: &'static str, #[prop(default = 0)] index: usize, ) -> impl IntoView { - let date = RwSignal::new(None); + let (date, set_date) = signal(None); Effect::new(move || { - date.set(Some(parse_iso_js(&article.date.to_rfc3339()))); + set_date(Some(parse_iso_js(&article.date.to_rfc3339()))); }); view! { diff --git a/src/components/button/mod.rs b/src/components/button/mod.rs index d4e3d09..f8af3e8 100644 --- a/src/components/button/mod.rs +++ b/src/components/button/mod.rs @@ -15,6 +15,7 @@ use crate::{ components::button::button_backdrop::{ ButtonBackdropBuilder, ButtonBackdropCfg, ButtonBackdropInstance, }, + hooks::use_in_view::{use_in_view, ElementVisibilityData, InViewOptions}, icons::right_arrow::RightArrow, utils::render_loop::RenderLoop, }; @@ -57,8 +58,8 @@ impl ButtonColorVariants { hover: [38.0, 38.0, 38.0, 1.0], }, ButtonColorVariants::Grey => StateRgbs { - base: [62.0, 62.0, 62.0, 1.0], // TODO - Not the same as bg-grey-30. Fix - hover: [79.0, 79.0, 79.0, 1.0], + base: [79.0, 79.0, 79.0, 1.0], // TODO - Not the same as bg-grey-30. Fix + hover: [99.0, 99.0, 99.0, 1.0], }, ButtonColorVariants::White => StateRgbs { base: [244.0, 244.0, 244.0, 1.0], @@ -104,21 +105,49 @@ enum AnimationDirection { const TOTAL_ANIMATION_DURATION_MS: f64 = 500.0; -// My animaiton loop should pass in a value to my render funciton that ping pongs between 0 and 1 depending on the direction +type RenderLoopPtr = Rc>; + +/// Public handles to a running loop. These live *beside* the RenderLoop, not inside it, so +/// calling one only borrows the loop's RefCell fresh — nothing else is holding it at the time. +/// (Putting these on RenderLoop itself deadlocks: reaching the field needs a borrow, and the +/// handle then wants borrow_mut on the same cell.) +struct AnimationControls { + wake: Box, + sleep: Box, + // Tears the loop down when the component drops this (via the StoredValue). Replaces + // on_cleanup, whose Send + Sync bound an Rc/RefCell can't satisfy. + _handle: LoopHandle, +} + +/// Owns the loop and cancels + frees it on drop. +struct LoopHandle(RenderLoopPtr); + +impl Drop for LoopHandle { + fn drop(&mut self) { + let mut render_loop = self.0.borrow_mut(); + render_loop.cancel(); + // Drop the Closure so its captured Rc> clone is released — otherwise + // the RenderLoop <-> Closure cycle keeps the loop alive forever. + render_loop.closure = None; + } +} + +// Animaiton loop should pass in a value to render funciton that ping pongs between 0 and 1 depending on the direction // of the animation. Frowards goes from 0 -> 1 and backwards goes from 1 -> 0. The idea is that its basically just playing a // predefined animation but giving us a normalised time value between 0 and 1 -fn start_animaiton_loop(backdrop: ButtonBackdropInstance, direction: Rc>) { - let render_loop: Rc> = Rc::new(RefCell::new(RenderLoop::default())); - let window = web_sys::window().unwrap(); - let time = Cell::new(Date::now()); +fn create_render_loop( + backdrop: ButtonBackdropInstance, + direction: Rc>, +) -> AnimationControls { + let render_loop: RenderLoopPtr = Rc::new(RefCell::new(RenderLoop::default())); let timing = bezier(0.42, 0.0, 0.58, 1.0).unwrap(); + let time: Rc> = Rc::new(Cell::new(Date::now())); + let progression: Rc> = Rc::new(Cell::new(0.0)); + let running: Rc> = Rc::new(Cell::new(false)); - let progression = Cell::new(0.0); - - let closure: Closure = { - let window = web_sys::window().unwrap(); - let render_loop = render_loop.clone(); - Closure::wrap(Box::new(move |_| { + let render_fn: Rc = { + let (progression, time, direction) = (progression.clone(), time.clone(), direction.clone()); + Rc::new(move || { let now = Date::now(); let dt = now - time.get(); let multiplier = match direction.get() { @@ -128,16 +157,23 @@ fn start_animaiton_loop(backdrop: ButtonBackdropInstance, direction: Rc = { + let window = web_sys::window().unwrap(); + let (render_loop, render_fn) = (render_loop.clone(), render_fn.clone()); + + Closure::wrap(Box::new(move |_| { + render_fn(); let mut render_loop = render_loop.borrow_mut(); render_loop.animation_id = render_loop.closure.as_ref().map(|closure| { @@ -148,15 +184,69 @@ fn start_animaiton_loop(backdrop: ButtonBackdropInstance, direction: Rc = { + let window = web_sys::window().unwrap(); + let (render_loop, progression, time, running) = ( + render_loop.clone(), + progression.clone(), + time.clone(), + running.clone(), + ); + + Box::new(move || { + // Guard first: a redundant wake must not reset progression mid-animation or start a + // parallel rAF chain (which would run the animation at double speed). + if running.replace(true) { + return; + } + + // Fresh start from 0; reset the clock so the first frame doesn't see a stale dt. + progression.set(0.0); + time.set(Date::now()); + + let mut render_loop_borrow = render_loop.borrow_mut(); + if let Some(closure) = &render_loop_borrow.closure { + render_loop_borrow.animation_id = Some( + window + .request_animation_frame(closure.as_ref().unchecked_ref()) + .expect("cannot set animation frame"), + ); + } + }) + }; + + let sleep: Box = { + let (render_loop, progression, time, direction, running, render_fn) = ( + render_loop.clone(), + progression.clone(), + time.clone(), + direction.clone(), + running.clone(), + render_fn.clone(), + ); + + Box::new(move || { + running.set(false); + progression.set(0.0); + time.set(Date::now()); + direction.set(AnimationDirection::Backwards); + + // Paint the resting frame once so the canvas isn't left mid-animation / blank. + render_fn(); + + render_loop.borrow().cancel(); + }) + }; - render_loop.closure = Some(closure) + // No on_cleanup: teardown rides on LoopHandle's Drop, which runs when the StoredValue holding + // these controls is disposed on unmount (or replaced if this effect re-runs). + AnimationControls { + wake, + sleep, + _handle: LoopHandle(render_loop), + } } #[component] @@ -172,6 +262,10 @@ pub fn Button( let button_ref: NodeRef = NodeRef::new(); let link_ref: NodeRef = NodeRef::new(); + // StoredValue is Copy, so the effects below capture it directly — no Rc>> + // to clone around. new_local because the boxed closures aren't Send/Sync. + let controls = StoredValue::new_local(None::); + let class = ButtonVariants { size, color }.with_class(class); let icon_el = match icon { @@ -200,6 +294,16 @@ pub fn Button( let use_as_clone = use_as.clone(); + let ElementVisibilityData { + in_view: canvas_in_view, + } = use_in_view( + canvas_ref, + Some(InViewOptions { + trigger_once: Some(false), + ..Default::default() + }), + ); + // TODO - This should respond to resizing. We might also benefit from making the backdrop // struct also get it's extension from here @@ -214,27 +318,34 @@ pub fn Button( match &use_as_clone { ButtonUsecase::Button { .. } => { if let Some(el) = button_ref.get() { - request_animation_frame(move || { - set_extension_dimension(Some(el.client_height())); - }); + set_extension_dimension(Some(el.client_height())); } } ButtonUsecase::Link { .. } => { if let Some(el) = link_ref.get() { - request_animation_frame(move || { - set_extension_dimension(Some(el.client_height())); - }); + set_extension_dimension(Some(el.client_height())); } } } }); + // Build the loop once canvas + backdrop builder are ready, apply the current visibility state + // immediately (untracked, so this effect stays keyed to canvas/builder only), then store it. + // The wake guard makes the initial wake safe even if the visibility effect also fires true. Effect::new(move || { if let Some(canvas) = canvas_ref.get() { if let Some(backdrop_builder) = maybe_backdrop_builder.get() { let backdrop = backdrop_builder.create_backdrop(canvas, ButtonBackdropCfg { color }); - start_animaiton_loop(backdrop, animation_direction.clone()); + let ctrls = create_render_loop(backdrop, animation_direction.clone()); + + if canvas_in_view.get_untracked() { + (ctrls.wake)(); + } else { + (ctrls.sleep)(); + } + + controls.set_value(Some(ctrls)); } } }); @@ -247,6 +358,21 @@ pub fn Button( } }); + // Drive wake/sleep off visibility. Read the signal FIRST and unconditionally, or the effect + // registers no dependency on its early-exit run and never fires again. + Effect::new(move || { + let in_view = canvas_in_view.get(); + controls.with_value(|c| { + if let Some(c) = c { + if in_view { + (c.wake)(); + } else { + (c.sleep)(); + } + } + }); + }); + match use_as { ButtonUsecase::Button { on_click } => Either::Left(view! { + + + } diff --git a/src/utils/render_loop.rs b/src/utils/render_loop.rs index 0aef482..f97612e 100644 --- a/src/utils/render_loop.rs +++ b/src/utils/render_loop.rs @@ -7,16 +7,7 @@ pub struct RenderLoop { } impl RenderLoop { - pub fn new(animation_id: Option, closure: Option>) -> RenderLoop { - RenderLoop { - animation_id, - closure, - } - } -} - -impl Drop for RenderLoop { - fn drop(&mut self) { + pub fn cancel(&self) { if let Some(animation_id) = self.animation_id { let window = web_sys::window().expect("Failed to get window when cleaning up animation loop"); @@ -27,3 +18,9 @@ impl Drop for RenderLoop { } } } + +impl Drop for RenderLoop { + fn drop(&mut self) { + self.cancel(); + } +}