From 5947ac60d5cd0d85efc5de6a969ef7386a19e6f0 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Salinas Date: Mon, 8 Dec 2025 15:54:09 -0300 Subject: [PATCH] feat: add binomial distribution calc (#1) Also, renames the project Reviewed-on: https://oolong.ludwig.dog/LuckyMeowth/distribution-calc/pulls/1 Co-authored-by: Felipe Contreras Salinas Co-committed-by: Felipe Contreras Salinas --- Cargo.lock | 938 ++++++++++++++++++--------------- Cargo.toml | 22 +- LICENSE | 2 +- README.md | 4 +- locales/en/main.ftl | 9 +- locales/es/main.ftl | 9 +- public/styles.scss | 12 +- src/calc.rs | 420 ++++++++++++--- src/components/calculator.rs | 101 +++- src/components/common.rs | 18 + src/components/localization.rs | 33 +- src/components/mod.rs | 1 + src/lib.rs | 47 +- src/main.rs | 2 +- src/pages/binom.rs | 17 + src/pages/home.rs | 52 +- src/pages/hyper.rs | 17 + src/pages/mod.rs | 2 + 18 files changed, 1092 insertions(+), 614 deletions(-) create mode 100644 src/components/common.rs create mode 100644 src/pages/binom.rs create mode 100644 src/pages/hyper.rs diff --git a/Cargo.lock b/Cargo.lock index 53c5e2e..e5be084 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -18,32 +18,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1384d3fe1eecb464229fcf6eebb72306591c56bf27b373561489458a7c73027d" dependencies = [ "futures", - "thiserror 2.0.12", + "thiserror 2.0.17", "wasm-bindgen-futures", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ "event-listener", "event-listener-strategy", "pin-project-lite", ] +[[package]] +name = "async-once-cell" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" + [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -52,9 +58,9 @@ dependencies = [ [[package]] name = "attribute-derive" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0053e96dd3bec5b4879c23a138d6ef26f2cb936c9cdc96274ac2b9ed44b5bb54" +checksum = "05832cdddc8f2650cc2cc187cc2e952b8c133a48eb055f35211f61ee81502d77" dependencies = [ "attribute-derive-macro", "derive-where", @@ -66,9 +72,9 @@ dependencies = [ [[package]] name = "attribute-derive-macro" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463b53ad0fd5b460af4b1915fe045ff4d946d025fb6c4dc3337752eaa980f71b" +checksum = "0a7cdbbd4bd005c5d3e2e9c885e6fa575db4f4a3572335b974d8db853b6beb61" dependencies = [ "collection_literals", "interpolator", @@ -86,6 +92,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + [[package]] name = "base64" version = "0.22.1" @@ -94,15 +106,24 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[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 = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "serde", @@ -110,28 +131,35 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "camino" -version = "1.1.10" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.27" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -146,26 +174,26 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "codee" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f18d705321923b1a9358e3fc3c57c3b50171196827fc7f5f10b053242aca627" +checksum = "30b61b7a19443f478176473b0c35acf7f9f7e2752c781dea55820343826f366c" dependencies = [ "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "collection_literals" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" +checksum = "2550f75b8cfac212855f6b1885455df8eaee8fe8e246b647d69146142e016084" [[package]] name = "concurrent-queue" @@ -178,13 +206,13 @@ dependencies = [ [[package]] name = "config" -version = "0.15.11" +version = "0.15.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +checksum = "b30fa8254caad766fc03cb0ccae691e14bf3bd72bfff27f72802ce729551b3d6" dependencies = [ "convert_case 0.6.0", "pathdiff", - "serde", + "serde_core", "toml", "winnow", ] @@ -211,15 +239,15 @@ dependencies = [ [[package]] name = "const-str" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e991226a70654b49d34de5ed064885f0bef0348a8e70018b8ff1ac80aa984a2" +checksum = "451d0640545a0553814b4c646eb549343561618838e9b42495f466131fe3ad49" [[package]] name = "const_format" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", ] @@ -259,6 +287,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -284,6 +321,16 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "current_platform" version = "0.2.0" @@ -306,15 +353,25 @@ dependencies = [ [[package]] name = "derive-where" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", "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]] name = "displaydoc" version = "0.2.5" @@ -326,6 +383,23 @@ dependencies = [ "syn", ] +[[package]] +name = "distribution-calc" +version = "0.1.1" +dependencies = [ + "console_error_panic_hook", + "console_log", + "fluent-templates", + "leptos", + "leptos-fluent", + "leptos_meta", + "leptos_router", + "log", + "wasm-bindgen", + "wasm-bindgen-test", + "web-sys", +] + [[package]] name = "drain_filter_polyfill" version = "0.1.3" @@ -362,9 +436,9 @@ checksum = "a1731451909bde27714eacba19c2566362a7f35224f52b153d3f42cf60f72472" [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -381,45 +455,52 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "fluent-bundle" -version = "0.15.3" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493" +checksum = "01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4" dependencies = [ "fluent-langneg", "fluent-syntax", "intl-memoizer", "intl_pluralrules", - "rustc-hash 1.1.0", - "self_cell 0.10.3", + "rustc-hash", + "self_cell", "smallvec", "unic-langid", ] [[package]] name = "fluent-langneg" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +checksum = "7eebbe59450baee8282d71676f3bfed5689aeab00b27545e83e5f14b1195e8b0" dependencies = [ "unic-langid", ] [[package]] name = "fluent-syntax" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33d" +checksum = "54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198" dependencies = [ - "thiserror 1.0.69", + "memchr", + "thiserror 2.0.17", ] [[package]] name = "fluent-template-macros" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ed02449601d0dacdc05cb5e13db5dab8f2b98d773aff5c53b62fad43a1b19a1" +checksum = "9af64f01dd293b28c19df8be230979c32c944d4b6e737a31f2ead91f8d0d46b9" dependencies = [ "flume", "ignore", @@ -432,9 +513,9 @@ dependencies = [ [[package]] name = "fluent-templates" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69855a5fe87629495efca79aec72adfa97954f1006f928e3a2ec750cb3e85386" +checksum = "407bcb5e8c7e4625c365b1180099b43e40fb6fd6d0ba53070229297246ba6392" dependencies = [ "fluent-bundle", "fluent-langneg", @@ -444,7 +525,7 @@ dependencies = [ "ignore", "intl-memoizer", "log", - "thiserror 1.0.69", + "thiserror 2.0.17", "unic-langid", "walkdir", ] @@ -458,17 +539,11 @@ dependencies = [ "spin", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -564,35 +639,34 @@ dependencies = [ ] [[package]] -name = "getrandom" -version = "0.2.16" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", + "typenum", + "version_check", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", + "wasm-bindgen", ] [[package]] name = "globset" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", @@ -660,9 +734,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "hermit-abi" @@ -681,12 +755,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -704,28 +777,11 @@ dependencies = [ "throw_error", ] -[[package]] -name = "hypergeometric-calc" -version = "0.1.0" -dependencies = [ - "console_error_panic_hook", - "console_log", - "fluent-templates", - "leptos", - "leptos-fluent", - "leptos_meta", - "leptos_router", - "log", - "wasm-bindgen", - "wasm-bindgen-test", - "web-sys", -] - [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -736,9 +792,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -749,11 +805,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -764,42 +819,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -809,9 +860,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -830,9 +881,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.23" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", @@ -846,12 +897,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.1", ] [[package]] @@ -896,9 +947,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -906,15 +957,15 @@ dependencies = [ [[package]] name = "leptos" -version = "0.8.2" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ceaf7d86820125c57dcd380edac4b972debf480ee4c7eea6dd7cea212615978" +checksum = "87c98f6d751e524ff425ad9d63d53e120ed68311ffbc22bbd9c0b3c4005a421e" dependencies = [ "any_spawner", "cfg-if", "either_of", "futures", - "getrandom 0.2.16", + "getrandom", "hydration_context", "leptos_config", "leptos_dom", @@ -925,29 +976,33 @@ dependencies = [ "or_poisoned", "paste", "reactive_graph", - "rustc-hash 2.1.1", + "rustc-hash", "rustc_version", "send_wrapper", "serde", + "serde_json", "serde_qs", "server_fn", "slotmap", "tachys", - "thiserror 2.0.12", + "thiserror 2.0.17", "throw_error", "tracing", - "typed-builder", - "typed-builder-macro", + "typed-builder 0.22.0", + "typed-builder-macro 0.22.0", "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_split_helpers", "web-sys", ] [[package]] name = "leptos-fluent" -version = "0.2.15" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928b183ce3921ff7be494648edb0057a63798e5bbfb7de80f91f463f2135cf79" +checksum = "1520fef0af40ebdc29101ddb5d3399939005a2f8e1bc5c8cfca0fa3d37b99972" dependencies = [ + "fluent-bundle", "fluent-templates", "leptos", "leptos-fluent-macros", @@ -958,12 +1013,13 @@ dependencies = [ [[package]] name = "leptos-fluent-macros" -version = "0.2.15" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4314b7d1e4562f20cb895d5bba904482d8917b74257d845ee8e48efc75552be9" +checksum = "7ed5364e5a5a8de96641e0c7378381143058937ab845f10a45de149d2725027c" dependencies = [ "cfg-expr", "current_platform", + "fluent-bundle", "fluent-syntax", "fluent-templates", "globwalk", @@ -977,22 +1033,22 @@ dependencies = [ [[package]] name = "leptos_config" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4100ad54455f82b686c9d0500a45c909eb50ce68ccb2ed51439ff2596f54fd" +checksum = "071fc40aeb9fcab885965bad1887990477253ad51f926cd19068f45a44c59e89" dependencies = [ "config", "regex", "serde", - "thiserror 2.0.12", - "typed-builder", + "thiserror 2.0.17", + "typed-builder 0.21.2", ] [[package]] name = "leptos_dom" -version = "0.8.2" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adaca2ec1d6215a7c43dc6353d487e4e34faf325b8e4df2ca3df488964d403be" +checksum = "78f4330c88694c5575e0bfe4eecf81b045d14e76a4f8b00d5fd2a63f8779f895" dependencies = [ "js-sys", "or_poisoned", @@ -1006,9 +1062,9 @@ dependencies = [ [[package]] name = "leptos_hot_reload" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f84532609518092960ac241741963c90c216ee11f752e1b238b846f043640" +checksum = "0d61ec3e1ff8aaee8c5151688550c0363f85bc37845450764c31ff7584a33f38" dependencies = [ "anyhow", "camino", @@ -1024,9 +1080,9 @@ dependencies = [ [[package]] name = "leptos_macro" -version = "0.8.2" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2ec91579e9a1344adc1eee637cb774a01354a3d25857cbd028b0289efe131d" +checksum = "9d199fafe14b7925fd392764fdd851215909604955acfda7c0263b8722d57c23" dependencies = [ "attribute-derive", "cfg-if", @@ -1048,14 +1104,13 @@ dependencies = [ [[package]] name = "leptos_meta" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03b2d5e0a9e7060bce4862c009ced3c2ad0afe45d005eaa4defa3872d2d2aac" +checksum = "2d489e38d3f541e9e43ecc2e3a815527840345a2afca629b3e23fcc1dd254578" dependencies = [ "futures", "indexmap", "leptos", - "once_cell", "or_poisoned", "send_wrapper", "wasm-bindgen", @@ -1064,9 +1119,9 @@ dependencies = [ [[package]] name = "leptos_router" -version = "0.8.2" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1b70dbd176bd0129e5db0e2ed48b7ff076c1b17cf52bbd0e85dcc3e6b9cbc0" +checksum = "19b824cae28db1551b71f8c2a45eab7bb98d61407f5adcc368cfe7b671e4a71d" dependencies = [ "any_spawner", "either_of", @@ -1075,13 +1130,12 @@ dependencies = [ "js-sys", "leptos", "leptos_router_macro", - "once_cell", "or_poisoned", "reactive_graph", "rustc_version", "send_wrapper", "tachys", - "thiserror 2.0.12", + "thiserror 2.0.17", "url", "wasm-bindgen", "web-sys", @@ -1089,9 +1143,9 @@ dependencies = [ [[package]] name = "leptos_router_macro" -version = "0.8.2" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8403f583a69812524b98c97f2ed0258771e205cd0f715b1bc6ba5e4f70dcb94b" +checksum = "409c0bd99f986c3cfa1a4db2443c835bc602ded1a12784e22ecb28c3ed5a2ae2" dependencies = [ "proc-macro-error2", "proc-macro2", @@ -1101,9 +1155,9 @@ dependencies = [ [[package]] name = "leptos_server" -version = "0.8.2" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af59932aa8a640da4d3d20650cf07084433e25db0ee690203d893b81773db29" +checksum = "dbf1045af93050bf3388d1c138426393fc131f6d9e46a65519da884c033ed730" dependencies = [ "any_spawner", "base64", @@ -1122,9 +1176,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "linear-map" @@ -1134,25 +1194,24 @@ checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "manyhow" @@ -1179,15 +1238,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "minicov" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +checksum = "4869b6a491569605d66d3952bcdf03df789e5b536e5f0cf7758a7f08a55ae24d" dependencies = [ "cc", "walkdir", @@ -1199,6 +1258,25 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + [[package]] name = "num_cpus" version = "1.17.0" @@ -1211,12 +1289,12 @@ dependencies = [ [[package]] name = "oco_ref" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" +checksum = "ed0423ff9973dea4d6bd075934fdda86ebb8c05bdf9d6b0507067d4a1226371d" dependencies = [ "serde", - "thiserror 1.0.69", + "thiserror 2.0.17", ] [[package]] @@ -1225,6 +1303,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + [[package]] name = "or_poisoned" version = "0.1.0" @@ -1239,9 +1323,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1249,15 +1333,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] @@ -1274,9 +1358,9 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" @@ -1312,18 +1396,18 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] [[package]] name = "prettyplease" -version = "0.2.34" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn", @@ -1381,9 +1465,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -1403,9 +1487,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -1440,32 +1524,34 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "reactive_graph" -version = "0.2.2" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac68cd988635779e6f378871257cbccfd51d7eeb7bc0bf6184835842aed51cc1" +checksum = "4043190442021086719fb9183daacb050f44d4ed8d3a1c8534e366d45dd95c29" dependencies = [ "any_spawner", "async-lock", "futures", "guardian", "hydration_context", + "indexmap", "or_poisoned", + "paste", "pin-project-lite", - "rustc-hash 2.1.1", + "rustc-hash", "rustc_version", "send_wrapper", "serde", "slotmap", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", "web-sys", ] [[package]] name = "reactive_stores" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e02f30b9cc6645e330e926dd778d4bcbd0e5770bdf4ec3d422dc0fe3c52a41" +checksum = "25b73d94139821e0a2f31fb4e0eaf6ebbcf4d15c5e2fb353dc3babd4f6d35674" dependencies = [ "dashmap", "guardian", @@ -1474,15 +1560,15 @@ dependencies = [ "paste", "reactive_graph", "reactive_stores_macro", - "rustc-hash 2.1.1", + "rustc-hash", "send_wrapper", ] [[package]] name = "reactive_stores_macro" -version = "0.2.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f2bfb3b29c0b93d2d58a157b2a6783957bb592b296ab0b98a18fc3cdc574b07" +checksum = "4fa40919eb2975100283b2a70e68eafce1e8bcf81f0622ff168e4c2b3f8d46bb" dependencies = [ "convert_case 0.8.0", "proc-macro-error2", @@ -1493,18 +1579,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -1514,9 +1600,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -1525,9 +1611,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rstml" @@ -1541,15 +1627,9 @@ dependencies = [ "quote", "syn", "syn_derive", - "thiserror 2.0.12", + "thiserror 2.0.17", ] -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -1567,9 +1647,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -1594,24 +1674,15 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "self_cell" -version = "0.10.3" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" -dependencies = [ - "self_cell 1.2.0", -] - -[[package]] -name = "self_cell" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" +checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "send_wrapper" @@ -1624,18 +1695,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1644,41 +1725,42 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_qs" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b417bedc008acbdf6d6b4bc482d29859924114bbe2650b7921fb68a261d0aa6" +checksum = "f3faaf9e727533a19351a43cc5a8de957372163c7d35cc48c90b75cdda13c352" dependencies = [ "percent-encoding", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "serde_spanned" -version = "0.6.9" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "server_fn" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b0f92b9d3a62c73f238ac21f7a09f15bad335a9d1651514d9da80d2eaf8d4c" +checksum = "fdc30228718f62d80a376964baf990edbcb5e97688fdc71183a8ef3d44cb6c89" dependencies = [ "base64", "bytes", @@ -1689,7 +1771,6 @@ dependencies = [ "gloo-net", "http", "js-sys", - "once_cell", "pin-project-lite", "rustc_version", "rustversion", @@ -1698,7 +1779,7 @@ dependencies = [ "serde_json", "serde_qs", "server_fn_macro_default", - "thiserror 2.0.12", + "thiserror 2.0.17", "throw_error", "url", "wasm-bindgen", @@ -1710,9 +1791,9 @@ dependencies = [ [[package]] name = "server_fn_macro" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "341dd1087afe9f3e546c5979a4f0b6d55ac072e1201313f86e7fe364223835ac" +checksum = "950b8cfc9ff5f39ca879c5a7c5e640de2695a199e18e424c3289d0964cabe642" dependencies = [ "const_format", "convert_case 0.8.0", @@ -1725,14 +1806,25 @@ dependencies = [ [[package]] name = "server_fn_macro_default" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5ab934f581482a66da82f2b57b15390ad67c9ab85bd9a6c54bb65060fb1380" +checksum = "63eb08f80db903d3c42f64e60ebb3875e0305be502bdc064ec0a0eab42207f00" dependencies = [ "server_fn_macro", "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]] name = "shlex" version = "1.3.0" @@ -1741,15 +1833,15 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[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", ] @@ -1771,15 +1863,15 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "syn" -version = "2.0.103" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -1811,9 +1903,9 @@ dependencies = [ [[package]] name = "tachys" -version = "0.2.3" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a9a5d6436e532fd27b49bcca005a038bf510fc369687de830121a74811ccf4" +checksum = "f2b2db11e455f7e84e2cc3e76f8a3f3843f7956096265d5ecff781eabe235077" dependencies = [ "any_spawner", "async-trait", @@ -1829,13 +1921,12 @@ dependencies = [ "linear-map", "next_tuple", "oco_ref", - "once_cell", "or_poisoned", "parking_lot", "paste", "reactive_graph", "reactive_stores", - "rustc-hash 2.1.1", + "rustc-hash", "rustc_version", "send_wrapper", "slotmap", @@ -1856,11 +1947,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -1876,9 +1967,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -1887,62 +1978,60 @@ dependencies = [ [[package]] name = "throw_error" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41e42a6afdde94f3e656fae18f837cb9bbe500a5ac5de325b09f3ec05b9c28e3" +checksum = "dc0ed6038fcbc0795aca7c92963ddda636573b956679204e044492d2b13c8f64" dependencies = [ "pin-project-lite", ] [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", + "serde_core", "zerovec", ] [[package]] name = "toml" -version = "0.8.23" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "serde", + "serde_core", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_parser", + "winnow", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ - "serde", + "serde_core", ] [[package]] -name = "toml_edit" -version = "0.22.27" +name = "toml_parser" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", "winnow", ] [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -1951,9 +2040,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -1962,9 +2051,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", ] @@ -1975,29 +2064,55 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" dependencies = [ - "rustc-hash 2.1.1", + "rustc-hash", ] [[package]] name = "typed-builder" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce63bcaf7e9806c206f7d7b9c1f38e0dce8bb165a80af0898161058b19248534" +checksum = "fef81aec2ca29576f9f6ae8755108640d0a86dd3161b2e8bca6cfa554e98f77d" dependencies = [ - "typed-builder-macro", + "typed-builder-macro 0.21.2", +] + +[[package]] +name = "typed-builder" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "398a3a3c918c96de527dc11e6e846cd549d4508030b8a33e1da12789c856b81a" +dependencies = [ + "typed-builder-macro 0.22.0", +] + +[[package]] +name = "typed-builder-macro" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecb9ecf7799210407c14a8cfdfe0173365780968dc57973ed082211958e0b18" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "typed-builder-macro" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d8d828da2a3d759d3519cdf29a5bac49c77d039ad36d0782edadbf9cd5415b" +checksum = "0e48cea23f68d1f78eb7bc092881b6bb88d3d6b5b7e6234f6f9c911da1ffb221" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + [[package]] name = "unic-langid" version = "0.9.6" @@ -2043,9 +2158,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -2061,20 +2176,21 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] name = "utf8-width" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" [[package]] name = "utf8_iter" @@ -2084,11 +2200,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.3.3", + "getrandom", "js-sys", "wasm-bindgen", ] @@ -2110,51 +2226,32 @@ dependencies = [ ] [[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -2165,9 +2262,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2175,34 +2272,42 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.50" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" +checksum = "25e90e66d265d3a1efc0e72a54809ab90b9c0c515915c67cdf658689d2c22c6c" dependencies = [ + "async-trait", + "cast", "js-sys", + "libm", "minicov", + "nu-ansi-term", + "num-traits", + "oorandom", + "serde", + "serde_json", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test-macro", @@ -2210,9 +2315,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.50" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" +checksum = "7150335716dce6028bead2b848e72f47b45e7b9422f64cccdc23bedca89affc1" dependencies = [ "proc-macro2", "quote", @@ -2232,11 +2337,33 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm_split_helpers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a114b3073258dd5de3d812cdd048cca6842342755e828a14dbf15f843f2d1b84" +dependencies = [ + "async-once-cell", + "wasm_split_macros", +] + +[[package]] +name = "wasm_split_macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56481f8ed1a9f9ae97ea7b08a5e2b12e8adf9a7818a6ba952b918e09c7be8bf0" +dependencies = [ + "base16", + "quote", + "sha2", + "syn", +] + [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -2244,109 +2371,48 @@ dependencies = [ [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets", + "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "xxhash-rust" @@ -2362,11 +2428,10 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -2374,9 +2439,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", @@ -2407,9 +2472,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -2418,10 +2483,11 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -2429,9 +2495,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index b19b311..0324196 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "hypergeometric-calc" -version = "0.1.0" +name = "distribution-calc" +version = "0.1.1" edition = "2024" authors = ["Felipe Contreras Salinas "] @@ -9,18 +9,18 @@ authors = ["Felipe Contreras Salinas "] [dependencies] console_error_panic_hook = "0.1.7" console_log = "1.0.0" -fluent-templates = "0.13.0" -leptos = { version = "0.8.2", features = ["csr", "tracing"] } -leptos-fluent = "0.2.15" -leptos_meta = { version = "0.8.2" } -leptos_router = { version = "0.8.2" } -log = "0.4.26" +fluent-templates = "0.13.2" +leptos = { version = "0.8.14", features = ["csr", "tracing"] } +leptos-fluent = "0.2.20" +leptos_meta = { version = "0.8.5" } +leptos_router = { version = "0.8.10" } +log = "0.4.29" [dev-dependencies] -wasm-bindgen = "0.2.100" -wasm-bindgen-test = "0.3.50" -web-sys = { version = "0.3.77", features = ["Document", "Window"] } +wasm-bindgen = "0.2.106" +wasm-bindgen-test = "0.3.56" +web-sys = { version = "0.3.83", features = ["Document", "Window"] } [profile.release] diff --git a/LICENSE b/LICENSE index 7af03b5..9169e34 100644 --- a/LICENSE +++ b/LICENSE @@ -219,7 +219,7 @@ If you develop a new program, and you want it to be of the greatest possible use To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - hypergeometric-calc + distribution-calc Copyright (C) 2025 LuckyMeowth This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. diff --git a/README.md b/README.md index 9509754..0639029 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# hypergeometric-calc -Web calculator for Hypergeometric Distribution built using [Leptos]. +# distribution-calc +Web calculator for Probability Distributions built using [Leptos]. ## Dependencies You will need to install the Rust toolchain. We recommend to do using [Rustup]. Once diff --git a/locales/en/main.ftl b/locales/en/main.ftl index 9e3759f..684bfbc 100644 --- a/locales/en/main.ftl +++ b/locales/en/main.ftl @@ -1,6 +1,13 @@ not-found = We couldn't find that page. -title = Hypergeometric Distribution Calculator +title-home = Calculators +title-binom = Binomial Distribution Calculator +title-hyper = Hypergeometric Distribution Calculator population = Population Size successes = Successes in Population sample = Sample Size sample-successes = Successes in Sample +hyper-description = Hypergeometric distribution measures the probability of getting a given amount of a certain type of elements from a sample on a population. Think on drawing a hand of 7 cards (sample size = 7) from a 52 cards deck (population size = 52) and wanting to know the probability of getting a given number of aces (successes in sample = X, successes in population = 4). +success-probability = Success probability +trials-number = Number of trials +successes-number = Number of successes +binom-description = Binomial distribution measures the probability of getting a given amount of successes in a sequence of experiments. For example, if you flip 5 (number of trials = 5) balanced coins (success probability = 0.5), the distribution describes the probability of having a given number of heads (successes number = X). diff --git a/locales/es/main.ftl b/locales/es/main.ftl index 35663c2..67928cb 100644 --- a/locales/es/main.ftl +++ b/locales/es/main.ftl @@ -1,6 +1,13 @@ not-found = No pudimos encontrar esta página. -title = Calculadora Distribución Hipergeométrica +title-home = Calculadoras +title-binom = Calculadora Distribución Binomial +title-hyper = Calculadora Distribución Hipergeométrica population = Tamaño población successes = Éxitos en la población sample = Tamaño de la muestra sample-successes = Éxitos en la muestra +hyper-description = La distribución hipergeométrica mide la probabilidad de obtener una cierta cantidad de elementos de cierto tipo en una muestra de una población. Por ejemplo, si tomamos una mano de 7 cartas (tamaño de la muestra = 7) de un mazo de 52 cartas (tamaño población = 52) y queremos saber la probabilidad de tener cierta cantidad de ases (éxitos en la muestra = X, éxitos en la población = 4). +success-probability = Probabilidad de éxito +trials-number = Número de intentos +successes-number = Número de éxitos +binom-description = La distribución binomial mide la probabilidad de obtener un cierto número de éxitos en una secuencia de experimentos. Por ejemplo, si lanzas 5 (número de intentos = 5) monedas justas (probabilidad de éxito = 0.5), la distribución describe la probabilidad de obtener un cierto número de monedas (número de éxitos = X). diff --git a/public/styles.scss b/public/styles.scss index 46fde96..0ee4993 100644 --- a/public/styles.scss +++ b/public/styles.scss @@ -24,10 +24,11 @@ body { header { display: flex; align-items: center; - justify-content: end; + justify-content: space-between; + padding: 0.1em 1em; } -header > select { +header select { margin: 0 1em; } @@ -92,3 +93,10 @@ div.results > span.right { grid-column: 4 / 5; text-align: left; } + +div.calc-description { + max-width: 55em; + text-align: left; + hyphens: auto; + margin-top: 2em; +} diff --git a/src/calc.rs b/src/calc.rs index 9dc6038..29829ed 100644 --- a/src/calc.rs +++ b/src/calc.rs @@ -2,56 +2,179 @@ use std::{collections::HashMap, iter::repeat}; -#[derive(Default)] +#[derive(Debug)] +pub struct HyperGeometricInput { + population_size: u8, + successes: u8, + sample_size: u8, + sample_successes: u8, +} + +impl HyperGeometricInput { + pub fn new( + population_size: u8, + successes: u8, + sample_size: u8, + sample_successes: u8, + ) -> Option { + if successes > population_size + || sample_size > population_size + || sample_successes > sample_size + { + None + } else { + Some(Self { + population_size, + successes, + sample_size, + sample_successes, + }) + } + } +} + +/// Result of hypergeometric probability calculation. +#[derive(Default, Debug, PartialEq)] pub struct HyperGeometricProb { + /// Probability of getting exactly X successes in the sample. pub exactly: f64, + /// Probability of getting strictly less than X successes in the sample. pub less_than: f64, + /// Probability of getting less than or exactly X successes in the sample. pub less_or_equal: f64, + /// Probability of getting strictly more X successes in the sample. pub greater_than: f64, + /// Probability of getting more than or exactly X successes in the sample. pub greater_or_equal: f64, } -pub fn hyper_geometric( - population_size: u8, - successes: u8, - sample_size: u8, - sample_successes: u8, -) -> Option { - if successes > population_size - || sample_size > population_size - || sample_successes > sample_size +pub fn hyper_geometric(input: HyperGeometricInput) -> HyperGeometricProb { + let exactly = hyper_geometric_exactly(&input); + let (less_than, less_or_equal, greater_or_equal, greater_than) = if input.sample_successes + < input.sample_size / 2 { - None + let less_than = (0..input.sample_successes) + .map(|i| { + hyper_geometric_exactly(&HyperGeometricInput { + population_size: input.population_size, + successes: input.successes, + sample_size: input.sample_size, + sample_successes: i, + }) + }) + .sum::() + .abs(); + let less_or_equal = less_than + exactly; + let greater_or_equal = (1.0 - less_than).abs(); + let greater_than = (1.0 - less_or_equal).abs(); + (less_than, less_or_equal, greater_or_equal, greater_than) } else { - let exactly = - hyper_geometric_exactly(population_size, successes, sample_size, sample_successes); - let (less_than, less_or_equal, greater_or_equal, greater_than) = - if sample_successes < sample_size / 2 { - let less_than = (0..sample_successes) - .map(|i| hyper_geometric_exactly(population_size, successes, sample_size, i)) - .sum::() - .abs(); - let less_or_equal = less_than + exactly; - let greater_or_equal = (1.0 - less_than).abs(); - let greater_than = (1.0 - less_or_equal).abs(); - (less_than, less_or_equal, greater_or_equal, greater_than) - } else { - let greater_than = (sample_successes + 1..=sample_size) - .map(|i| hyper_geometric_exactly(population_size, successes, sample_size, i)) - .sum::() - .abs(); - let greater_or_equal = greater_than + exactly; - let less_or_equal = (1.0 - greater_than).abs(); - let less_than = (1.0 - greater_or_equal).abs(); - (less_than, less_or_equal, greater_or_equal, greater_than) - }; - Some(HyperGeometricProb { - exactly, - less_than, - less_or_equal, - greater_than, - greater_or_equal, - }) + let greater_than = (input.sample_successes + 1..=input.sample_size.min(input.successes)) + .map(|i| { + hyper_geometric_exactly(&HyperGeometricInput { + population_size: input.population_size, + successes: input.successes, + sample_size: input.sample_size, + sample_successes: i, + }) + }) + .sum::() + .abs(); + let greater_or_equal = greater_than + exactly; + let less_or_equal = (1.0 - greater_than).abs(); + let less_than = (1.0 - greater_or_equal).abs(); + (less_than, less_or_equal, greater_or_equal, greater_than) + }; + HyperGeometricProb { + exactly, + less_than, + less_or_equal, + greater_than, + greater_or_equal, + } +} + +pub struct BinomialInput { + success_probability: f64, + trials_number: u8, + successes_number: u8, +} + +impl BinomialInput { + pub fn new(success_probability: f64, trials_number: u8, successes_number: u8) -> Option { + if success_probability < 0.0 + || success_probability > 1.0 + || successes_number > trials_number + { + None + } else { + Some(Self { + success_probability, + trials_number, + successes_number, + }) + } + } +} + +#[derive(Default, Debug, PartialEq)] +pub struct BinomialProb { + pub exactly: f64, + pub less_than: f64, + pub less_or_equal: f64, + pub greater_than: f64, + pub greater_or_equal: f64, +} + +pub fn binomial(input: BinomialInput) -> BinomialProb { + let (p_powers, pc_powers) = powers(input.success_probability, input.trials_number); + let exactly = binomial_exactly(&input, &p_powers, &pc_powers); + let (less_than, less_or_equal, greater_or_equal, greater_than) = + if input.successes_number < input.trials_number / 2 { + let less_than = (0..input.successes_number) + .map(|i| { + binomial_exactly( + &BinomialInput { + success_probability: input.success_probability, + trials_number: input.trials_number, + successes_number: i, + }, + &p_powers, + &pc_powers, + ) + }) + .sum::() + .abs(); + let less_or_equal = less_than + exactly; + let greater_or_equal = (1.0 - less_than).abs(); + let greater_than = (1.0 - less_or_equal).abs(); + (less_than, less_or_equal, greater_or_equal, greater_than) + } else { + let greater_than = (input.successes_number + 1..=input.trials_number) + .map(|i| { + binomial_exactly( + &BinomialInput { + success_probability: input.success_probability, + trials_number: input.trials_number, + successes_number: i, + }, + &p_powers, + &pc_powers, + ) + }) + .sum::() + .abs(); + let greater_or_equal = greater_than + exactly; + let less_or_equal = (1.0 - greater_than).abs(); + let less_than = (1.0 - greater_or_equal).abs(); + (less_than, less_or_equal, greater_or_equal, greater_than) + }; + BinomialProb { + exactly, + less_than, + less_or_equal, + greater_than, + greater_or_equal, } } @@ -60,69 +183,129 @@ pub fn hyper_geometric( /// /// The formula is choose(successes, sample_successes) * choose(population_size - successes, /// sample_size - sample_successes) / choose(population_size, sample_size) -fn hyper_geometric_exactly( - population_size: u8, - successes: u8, - sample_size: u8, - sample_successes: u8, -) -> f64 { - if population_size == successes { - return if sample_successes == sample_size { +fn hyper_geometric_exactly(input: &HyperGeometricInput) -> f64 { + if input.population_size == input.successes { + return if input.sample_successes == input.sample_size { 1.0 } else { 0.0 }; } - if successes == 0 { - return if sample_successes == 0 { 1.0 } else { 0.0 }; + if input.successes == 0 { + return if input.sample_successes == 0 { + 1.0 + } else { + 0.0 + }; } // On top we have: successes!, (population_size - successes)!, sample_size! and // (population_size - sample_size)! - let top_factors = (1..=successes) - .chain(1..=(population_size - successes)) - .chain(1..=sample_size) - .chain(1..=(population_size - sample_size)) + let top_factors = (1..=input.successes) + .chain(1..=(input.population_size - input.successes)) + .chain(1..=input.sample_size) + .chain(1..=(input.population_size - input.sample_size)) .flat_map(|n| factorize(n)) - .fold(HashMap::::new(), |mut counts, i| { - *counts.entry(i).or_default() += 1; - counts - }); + .fold(HashMap::::new(), group_factors); // On bottom we have: sample_successes!, (successes - sample_successes)! // (sample_size - sample_successes)!, (population_size - successes - sample_size + sample_successes)! // and population_size! - let bot_factors = (1..=sample_successes) - .chain(1..=(successes - sample_successes)) - .chain(1..=(sample_size - sample_successes)) + let bot_factors = (1..=input.sample_successes) + .chain(1..=(input.successes - input.sample_successes)) + .chain(1..=(input.sample_size - input.sample_successes)) .chain( - 1..=((population_size as u16 + sample_successes as u16 - - successes as u16 - - sample_size as u16) as u8), + 1..=((input.population_size as u16 + input.sample_successes as u16 + - input.successes as u16 + - input.sample_size as u16) as u8), ) - .chain(1..=population_size) + .chain(1..=input.population_size) .flat_map(|n| factorize(n)) - .fold(HashMap::::new(), |mut counts, i| { - counts.entry(i).and_modify(|count| *count += 1).or_insert(1); - counts - }); + .fold(HashMap::::new(), group_factors); let (top_factors, bot_factors) = simplify(top_factors, bot_factors); - let top_product: f64 = top_factors - .into_iter() - .flat_map(|(f, count)| repeat(f).take(count as usize)) - .map(|f| f as f64) - .product(); + let top_product = product(top_factors); + let bot_product = product(bot_factors); - let bot_product: f64 = bot_factors + top_product / bot_product +} + +/// Computes the probability of getting exactly `successes_number` within `trials_number` given +/// that the success probability is `success_probability`. +/// +/// The formula is choose(trials_number, successes_number) * (success_probability)^successes_number +/// * (1 - success_probability)^(trials_number - successes_number) +fn binomial_exactly(input: &BinomialInput, p_powers: &[f64], pc_powers: &[f64]) -> f64 { + if input.success_probability == 0.0 { + return if input.successes_number == 0 { + 1.0 + } else { + 0.0 + }; + } + if input.success_probability == 1.0 { + return if input.successes_number == input.trials_number { + 1.0 + } else { + 0.0 + }; + } + choose(input.trials_number, input.successes_number) + * p_powers[input.successes_number as usize] + * pc_powers[(input.trials_number - input.successes_number) as usize] +} + +fn choose(n: u8, k: u8) -> f64 { + // On top we have: n! + let top_factors = (1..=n) + .flat_map(|n| factorize(n)) + .fold(HashMap::::new(), group_factors); + + // On bottom we have: k!, (n - k)! + let bot_factors = (1..=k) + .chain(1..=(n - k)) + .flat_map(|n| factorize(n)) + .fold(HashMap::::new(), group_factors); + + let (top_factors, bot_factors) = simplify(top_factors, bot_factors); + + let top_product = product(top_factors); + let bot_product = product(bot_factors); + + top_product / bot_product +} + +fn powers(p: f64, n: u8) -> (Vec, Vec) { + let mut p_powers = Vec::with_capacity((n + 1) as usize); + let mut pc_powers = Vec::with_capacity((n + 1) as usize); + + let mut p_power = 1.0; + let mut pc_power = 1.0; + for _ in 0..n + 1 { + p_powers.push(p_power); + pc_powers.push(pc_power); + p_power = p_power * p; + pc_power = pc_power * (1.0 - p) + } + (p_powers, pc_powers) +} + +fn group_factors(mut counts: HashMap, i: u8) -> HashMap { + *counts.entry(i).or_default() += 1; + counts +} + +fn product(factors: HashMap) -> f64 { + factors .into_iter() .flat_map(|(f, count)| repeat(f).take(count as usize)) .map(|f| f as f64) - .product(); - - top_product / bot_product + .product() } +/// Simplify factors for a fraction. +/// +/// This assumes factors are already prime factors. fn simplify( mut top_factors: HashMap, mut bot_factors: HashMap, @@ -158,6 +341,8 @@ fn simplify( const PRIMES: &[u8] = &[2, 3, 5, 7, 11, 13]; #[derive(Debug)] +/// Iterator for the prime factors of a number. We obtain this iterator using the `factorize` +/// function. struct FactorIter<'a> { /// remainder n: u8, @@ -189,7 +374,7 @@ impl Iterator for FactorIter<'_> { } // If we stopped at a factor, we return it. // If we exhausted the factors, we return the remainder, as it will be a prime (we - // checked primes less than sqrt(MAX). + // checked primes less than sqrt(u8::MAX). match self.f { Some(f) => Some(f), None => Some(self.n), @@ -207,7 +392,10 @@ fn factorize(n: u8) -> FactorIter<'static> { #[cfg(test)] mod test { - use crate::calc::hyper_geometric_exactly; + use crate::calc::{ + BinomialInput, BinomialProb, HyperGeometricInput, HyperGeometricProb, binomial, + binomial_exactly, hyper_geometric, hyper_geometric_exactly, powers, + }; use super::factorize; @@ -228,18 +416,80 @@ mod test { #[test] fn test_hypergeometric_exact_all_successes() { - assert_eq!(hyper_geometric_exactly(10, 10, 5, 5), 1.0); - assert_eq!(hyper_geometric_exactly(10, 10, 5, 4), 0.0); + let input = &HyperGeometricInput::new(10, 10, 5, 5).unwrap(); + assert_eq!(hyper_geometric_exactly(input), 1.0); + let input = &HyperGeometricInput::new(10, 10, 5, 4).unwrap(); + assert_eq!(hyper_geometric_exactly(input), 0.0); } #[test] fn test_hypergeometric_exact_no_successes() { - assert_eq!(hyper_geometric_exactly(10, 0, 5, 0), 1.0); - assert_eq!(hyper_geometric_exactly(10, 0, 5, 1), 0.0); + let input = &HyperGeometricInput::new(10, 0, 5, 0).unwrap(); + assert_eq!(hyper_geometric_exactly(input), 1.0); + let input = &HyperGeometricInput::new(10, 0, 5, 1).unwrap(); + assert_eq!(hyper_geometric_exactly(input), 0.0); } #[test] fn test_hypergeometric_exact() { - assert_eq!(hyper_geometric_exactly(10, 3, 5, 2), 5.0 / 12.0); + let input = &HyperGeometricInput::new(10, 3, 5, 2).unwrap(); + assert_eq!(hyper_geometric_exactly(input), 5.0 / 12.0); + } + + #[test] + fn test_hypergeometric_aces_poker() { + let input = HyperGeometricInput::new(52, 4, 5, 4).unwrap(); + let exact = 1.846892603195124e-5; + assert_eq!( + hyper_geometric(input), + HyperGeometricProb { + exactly: exact, + less_than: 1.0 - exact, + less_or_equal: 1.0, + greater_than: 0.0, + greater_or_equal: exact + } + ); + } + + #[test] + fn test_binom_exact_all_success() { + let (p_powers, pc_powers) = powers(1.0, 5); + let input = &BinomialInput::new(1.0, 5, 5).unwrap(); + assert_eq!(binomial_exactly(input, &p_powers, &pc_powers), 1.0); + let input = &BinomialInput::new(1.0, 5, 4).unwrap(); + assert_eq!(binomial_exactly(input, &p_powers, &pc_powers), 0.0); + } + + #[test] + fn test_binom_exact_no_success() { + let (p_powers, pc_powers) = powers(0.0, 5); + let input = &BinomialInput::new(0.0, 5, 0).unwrap(); + assert_eq!(binomial_exactly(input, &p_powers, &pc_powers), 1.0); + let input = &BinomialInput::new(0.0, 5, 1).unwrap(); + assert_eq!(binomial_exactly(input, &p_powers, &pc_powers), 0.0); + } + + #[test] + fn test_binomial_exact() { + let (p_powers, pc_powers) = powers(0.5, 5); + let input = &BinomialInput::new(0.5, 5, 3).unwrap(); + assert_eq!(binomial_exactly(input, &p_powers, &pc_powers), 10.0 / 32.0); + } + + #[test] + fn test_binomial() { + // 10.0 / 32.0 + let input = BinomialInput::new(0.5, 5, 3).unwrap(); + assert_eq!( + binomial(input), + BinomialProb { + exactly: 10.0 / 32.0, + less_than: 16.0 / 32.0, + less_or_equal: 26.0 / 32.0, + greater_than: 6.0 / 32.0, + greater_or_equal: 16.0 / 32.0, + } + ); } } diff --git a/src/components/calculator.rs b/src/components/calculator.rs index 7c9a4e9..db9793c 100644 --- a/src/components/calculator.rs +++ b/src/components/calculator.rs @@ -6,22 +6,22 @@ use leptos::prelude::{ use leptos::{IntoView, component, view}; use leptos_fluent::move_tr; -use crate::calc::hyper_geometric; +use crate::calc::{BinomialInput, HyperGeometricInput, binomial, hyper_geometric}; -/// A parameterized incrementing button #[component] -pub fn Calculator() -> impl IntoView { +pub fn HyperCalculator() -> impl IntoView { let (population, set_population) = signal(0u8); let (successes, set_successes) = signal(0u8); let (sample, set_sample) = signal(0u8); let (sample_successes, set_sample_successes) = signal(0u8); let result = move || { - hyper_geometric( + HyperGeometricInput::new( population.get(), successes.get(), sample.get(), sample_successes.get(), ) + .map(hyper_geometric) .unwrap_or_default() }; view! { @@ -110,6 +110,99 @@ pub fn Calculator() -> impl IntoView { {move || display_rounded(result().greater_or_equal)} +
{move_tr!("hyper-description")}
+ } +} + +#[component] +pub fn BinomCalculator() -> impl IntoView { + let (success_probability, set_success_probability) = signal(0f64); + let (trials_number, set_trials_number) = signal(0u8); + let (successes_number, set_successes_number) = signal(0u8); + let result = move || { + BinomialInput::new( + success_probability.get(), + trials_number.get(), + successes_number.get(), + ) + .map(binomial) + .unwrap_or_default() + }; + view! { +
+

+ + +

+

+ + +

+

+ + +

+
+
+ + "P(X = " + {successes_number} + "): " + + {move || display_rounded(result().exactly)} + + "P(X < " + {successes_number} + "): " + + {move || display_rounded(result().less_than)} + + "P(X ≤ " + {successes_number} + "): " + + {move || display_rounded(result().less_or_equal)} + + "P(X > " + {successes_number} + "): " + + {move || display_rounded(result().greater_than)} + + "P(X ≥ " + {successes_number} + "): " + + {move || display_rounded(result().greater_or_equal)} +
+
{move_tr!("binom-description")}
} } diff --git a/src/components/common.rs b/src/components/common.rs new file mode 100644 index 0000000..0feac4e --- /dev/null +++ b/src/components/common.rs @@ -0,0 +1,18 @@ +use leptos::html::ElementChild; +use leptos::{IntoView, component, view}; +use leptos_router::nested_router::Outlet; + +use crate::components::localization::{I18n, LanguageSelector}; + +#[component] +pub fn Common() -> impl IntoView { + view! { + +
+ "🏡" + +
+ +
+ } +} diff --git a/src/components/localization.rs b/src/components/localization.rs index 6d1b163..c7c1bdc 100644 --- a/src/components/localization.rs +++ b/src/components/localization.rs @@ -3,10 +3,10 @@ use fluent_templates::static_loader; use leptos::html::ElementChild; use leptos::prelude::{ - AddAnyAttr, Children, Get, GlobalAttributes, IntoAttribute, OnAttribute, PropAttribute, Set, + AddAnyAttr, Children, Get, GlobalAttributes, OnAttribute, PropAttribute, Set, expect_context, }; use leptos::{IntoView, component, view}; -use leptos_fluent::{Language, expect_i18n, leptos_fluent}; +use leptos_fluent::{Language, leptos_fluent}; static_loader! { pub static TRANSLATIONS = { @@ -23,36 +23,39 @@ pub fn I18n(children: Children) -> impl IntoView { translations: [TRANSLATIONS], locales: "./locales", check_translations: "./src/**/*.rs", - initial_language_from_localstorage: true, - initial_language_from_navigator_to_localstorage: true, - set_language_to_localstorage: true, + initial_language_from_local_storage: true, + initial_language_from_navigator_to_local_storage: true, + set_language_to_local_storage: true, sync_html_tag_lang: true, } } + +/// Selector for languages #[component] pub fn LanguageSelector() -> impl IntoView { - // Use `expect_i18n()` to get the current i18n context: - let i18n = expect_i18n(); + let i18n = expect_context::(); view! { - - + + + + } } fn render_language(lang: &'static Language) -> impl IntoView { // Passed as atrribute, `Language` is converted to their code, // so `(); view! {