├── .github ├── actions │ └── setup │ │ └── action.yaml └── workflows │ └── review.yaml ├── .gitignore ├── .vscode └── settings.json ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── docs └── preview.gif ├── examples ├── csr │ ├── .vscode │ │ └── settings.json │ ├── Cargo.lock │ ├── Cargo.toml │ ├── README.md │ ├── Trunk.toml │ ├── index.html │ ├── rust-toolchain.toml │ ├── src │ │ ├── button.rs │ │ ├── circle.rs │ │ ├── main.rs │ │ └── style.css │ └── tailwind.config.js └── ssr │ ├── .vscode │ └── settings.json │ ├── Cargo.lock │ ├── Cargo.toml │ ├── README.md │ ├── public │ └── favicon.ico │ ├── rust-toolchain.toml │ ├── src │ ├── app.rs │ ├── button.rs │ ├── fallback.rs │ ├── lib.rs │ └── main.rs │ ├── style │ └── tailwind.css │ └── tailwind.config.js ├── justfile ├── rust-toolchain.toml ├── rustfmt.toml └── src ├── animated_el.rs ├── animator.rs ├── lib.rs ├── untracked_classes.rs └── utils.rs /.github/actions/setup/action.yaml: -------------------------------------------------------------------------------- 1 | name: Setup 2 | 3 | runs: 4 | using: composite 5 | steps: 6 | - uses: actions/checkout@v3 7 | 8 | - name: Cargo cache setup 9 | uses: actions/cache@v3 10 | with: 11 | path: | 12 | ~/.cargo/ 13 | ~/.rustup/toolchains/ 14 | target/ 15 | key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} 16 | restore-keys: ${{ runner.os }}-cargo- 17 | 18 | - name: Just setup 19 | uses: extractions/setup-just@v2 20 | 21 | - name: Leptosfmt setup 22 | shell: bash 23 | run: cargo install leptosfmt@0.1.30 24 | -------------------------------------------------------------------------------- /.github/workflows/review.yaml: -------------------------------------------------------------------------------- 1 | name: Review 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | pull_request: 9 | branches: "*" 10 | 11 | concurrency: 12 | group: ${{ github.workflow }}-${{ github.ref || github.run_id }} 13 | cancel-in-progress: true 14 | 15 | jobs: 16 | setup: 17 | name: Setup 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: actions/checkout@v3 21 | - uses: ./.github/actions/setup 22 | 23 | quality: 24 | name: Source code quality 25 | needs: setup 26 | runs-on: ubuntu-latest 27 | steps: 28 | - uses: actions/checkout@v3 29 | - uses: ./.github/actions/setup 30 | - run: just ci 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | target 4 | 5 | # Editor directories and files 6 | .idea 7 | .DS_Store 8 | *.suo 9 | *.ntvs* 10 | *.njsproj 11 | *.sln 12 | *.sw? 13 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "rust-analyzer.check.command": "clippy", 3 | "rust-analyzer.check.targets": [ 4 | "wasm32-unknown-unknown", 5 | "x86_64-unknown-linux-gnu" 6 | ], 7 | "rust-analyzer.cargo.target": "wasm32-unknown-unknown", 8 | "rust-analyzer.diagnostics.enable": false, 9 | "rust-analyzer.rustfmt.overrideCommand": ["leptosfmt", "--stdin", "--rustfmt"] 10 | } 11 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "anyhow" 16 | version = "1.0.86" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" 19 | 20 | [[package]] 21 | name = "async-recursion" 22 | version = "1.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 25 | dependencies = [ 26 | "proc-macro2", 27 | "quote", 28 | "syn", 29 | ] 30 | 31 | [[package]] 32 | name = "attribute-derive" 33 | version = "0.9.2" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "1f1ee502851995027b06f99f5ffbeffa1406b38d0b318a1ebfa469332c6cbafd" 36 | dependencies = [ 37 | "attribute-derive-macro", 38 | "derive-where", 39 | "manyhow", 40 | "proc-macro2", 41 | "quote", 42 | "syn", 43 | ] 44 | 45 | [[package]] 46 | name = "attribute-derive-macro" 47 | version = "0.9.2" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "3601467f634cfe36c4780ca9c75dea9a5b34529c1f2810676a337e7e0997f954" 50 | dependencies = [ 51 | "collection_literals", 52 | "interpolator", 53 | "manyhow", 54 | "proc-macro-utils", 55 | "proc-macro2", 56 | "quote", 57 | "quote-use", 58 | "syn", 59 | ] 60 | 61 | [[package]] 62 | name = "autocfg" 63 | version = "1.3.0" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 66 | 67 | [[package]] 68 | name = "base64" 69 | version = "0.22.1" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 72 | 73 | [[package]] 74 | name = "bitflags" 75 | version = "2.6.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 78 | 79 | [[package]] 80 | name = "bumpalo" 81 | version = "3.16.0" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 84 | 85 | [[package]] 86 | name = "bytes" 87 | version = "1.7.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "fca2be1d5c43812bae364ee3f30b3afcb7877cf59f4aeb94c66f313a41d2fac9" 90 | 91 | [[package]] 92 | name = "camino" 93 | version = "1.1.7" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" 96 | 97 | [[package]] 98 | name = "cfg-if" 99 | version = "1.0.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 102 | 103 | [[package]] 104 | name = "ciborium" 105 | version = "0.2.2" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 108 | dependencies = [ 109 | "ciborium-io", 110 | "ciborium-ll", 111 | "serde", 112 | ] 113 | 114 | [[package]] 115 | name = "ciborium-io" 116 | version = "0.2.2" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 119 | 120 | [[package]] 121 | name = "ciborium-ll" 122 | version = "0.2.2" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 125 | dependencies = [ 126 | "ciborium-io", 127 | "half", 128 | ] 129 | 130 | [[package]] 131 | name = "collection_literals" 132 | version = "1.0.1" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" 135 | 136 | [[package]] 137 | name = "config" 138 | version = "0.14.0" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" 141 | dependencies = [ 142 | "convert_case", 143 | "lazy_static", 144 | "nom", 145 | "pathdiff", 146 | "serde", 147 | "toml", 148 | ] 149 | 150 | [[package]] 151 | name = "const_format" 152 | version = "0.2.32" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" 155 | dependencies = [ 156 | "const_format_proc_macros", 157 | ] 158 | 159 | [[package]] 160 | name = "const_format_proc_macros" 161 | version = "0.2.32" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" 164 | dependencies = [ 165 | "proc-macro2", 166 | "quote", 167 | "unicode-xid", 168 | ] 169 | 170 | [[package]] 171 | name = "convert_case" 172 | version = "0.6.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" 175 | dependencies = [ 176 | "unicode-segmentation", 177 | ] 178 | 179 | [[package]] 180 | name = "crunchy" 181 | version = "0.2.2" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 184 | 185 | [[package]] 186 | name = "dashmap" 187 | version = "5.5.3" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" 190 | dependencies = [ 191 | "cfg-if", 192 | "hashbrown", 193 | "lock_api", 194 | "once_cell", 195 | "parking_lot_core", 196 | ] 197 | 198 | [[package]] 199 | name = "derive-where" 200 | version = "1.2.7" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" 203 | dependencies = [ 204 | "proc-macro2", 205 | "quote", 206 | "syn", 207 | ] 208 | 209 | [[package]] 210 | name = "drain_filter_polyfill" 211 | version = "0.1.3" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" 214 | 215 | [[package]] 216 | name = "either" 217 | version = "1.13.0" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 220 | 221 | [[package]] 222 | name = "equivalent" 223 | version = "1.0.1" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 226 | 227 | [[package]] 228 | name = "fnv" 229 | version = "1.0.7" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 232 | 233 | [[package]] 234 | name = "form_urlencoded" 235 | version = "1.2.1" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 238 | dependencies = [ 239 | "percent-encoding", 240 | ] 241 | 242 | [[package]] 243 | name = "futures" 244 | version = "0.3.30" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 247 | dependencies = [ 248 | "futures-channel", 249 | "futures-core", 250 | "futures-executor", 251 | "futures-io", 252 | "futures-sink", 253 | "futures-task", 254 | "futures-util", 255 | ] 256 | 257 | [[package]] 258 | name = "futures-channel" 259 | version = "0.3.30" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 262 | dependencies = [ 263 | "futures-core", 264 | "futures-sink", 265 | ] 266 | 267 | [[package]] 268 | name = "futures-core" 269 | version = "0.3.30" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 272 | 273 | [[package]] 274 | name = "futures-executor" 275 | version = "0.3.30" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 278 | dependencies = [ 279 | "futures-core", 280 | "futures-task", 281 | "futures-util", 282 | ] 283 | 284 | [[package]] 285 | name = "futures-io" 286 | version = "0.3.30" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 289 | 290 | [[package]] 291 | name = "futures-macro" 292 | version = "0.3.30" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 295 | dependencies = [ 296 | "proc-macro2", 297 | "quote", 298 | "syn", 299 | ] 300 | 301 | [[package]] 302 | name = "futures-sink" 303 | version = "0.3.30" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 306 | 307 | [[package]] 308 | name = "futures-task" 309 | version = "0.3.30" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 312 | 313 | [[package]] 314 | name = "futures-util" 315 | version = "0.3.30" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 318 | dependencies = [ 319 | "futures-channel", 320 | "futures-core", 321 | "futures-io", 322 | "futures-macro", 323 | "futures-sink", 324 | "futures-task", 325 | "memchr", 326 | "pin-project-lite", 327 | "pin-utils", 328 | "slab", 329 | ] 330 | 331 | [[package]] 332 | name = "getrandom" 333 | version = "0.2.15" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 336 | dependencies = [ 337 | "cfg-if", 338 | "js-sys", 339 | "libc", 340 | "wasi", 341 | "wasm-bindgen", 342 | ] 343 | 344 | [[package]] 345 | name = "gloo-net" 346 | version = "0.5.0" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "43aaa242d1239a8822c15c645f02166398da4f8b5c4bae795c1f5b44e9eee173" 349 | dependencies = [ 350 | "futures-channel", 351 | "futures-core", 352 | "futures-sink", 353 | "gloo-utils", 354 | "http 0.2.12", 355 | "js-sys", 356 | "pin-project", 357 | "serde", 358 | "serde_json", 359 | "thiserror", 360 | "wasm-bindgen", 361 | "wasm-bindgen-futures", 362 | "web-sys", 363 | ] 364 | 365 | [[package]] 366 | name = "gloo-utils" 367 | version = "0.2.0" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" 370 | dependencies = [ 371 | "js-sys", 372 | "serde", 373 | "serde_json", 374 | "wasm-bindgen", 375 | "web-sys", 376 | ] 377 | 378 | [[package]] 379 | name = "half" 380 | version = "2.4.1" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 383 | dependencies = [ 384 | "cfg-if", 385 | "crunchy", 386 | ] 387 | 388 | [[package]] 389 | name = "hashbrown" 390 | version = "0.14.5" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 393 | 394 | [[package]] 395 | name = "html-escape" 396 | version = "0.2.13" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" 399 | dependencies = [ 400 | "utf8-width", 401 | ] 402 | 403 | [[package]] 404 | name = "http" 405 | version = "0.2.12" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 408 | dependencies = [ 409 | "bytes", 410 | "fnv", 411 | "itoa", 412 | ] 413 | 414 | [[package]] 415 | name = "http" 416 | version = "1.1.0" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 419 | dependencies = [ 420 | "bytes", 421 | "fnv", 422 | "itoa", 423 | ] 424 | 425 | [[package]] 426 | name = "idna" 427 | version = "0.5.0" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 430 | dependencies = [ 431 | "unicode-bidi", 432 | "unicode-normalization", 433 | ] 434 | 435 | [[package]] 436 | name = "indexmap" 437 | version = "2.2.6" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 440 | dependencies = [ 441 | "equivalent", 442 | "hashbrown", 443 | ] 444 | 445 | [[package]] 446 | name = "interpolator" 447 | version = "0.5.0" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" 450 | 451 | [[package]] 452 | name = "inventory" 453 | version = "0.3.15" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" 456 | 457 | [[package]] 458 | name = "itertools" 459 | version = "0.12.1" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 462 | dependencies = [ 463 | "either", 464 | ] 465 | 466 | [[package]] 467 | name = "itoa" 468 | version = "1.0.11" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 471 | 472 | [[package]] 473 | name = "js-sys" 474 | version = "0.3.69" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 477 | dependencies = [ 478 | "wasm-bindgen", 479 | ] 480 | 481 | [[package]] 482 | name = "lazy_static" 483 | version = "1.5.0" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 486 | 487 | [[package]] 488 | name = "leptos" 489 | version = "0.6.13" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "57727cd8f6d1e78aa9721270002037d7f63b5a7a2b60a7830239f6938cbca9b7" 492 | dependencies = [ 493 | "cfg-if", 494 | "leptos_config", 495 | "leptos_dom", 496 | "leptos_macro", 497 | "leptos_reactive", 498 | "leptos_server", 499 | "server_fn", 500 | "tracing", 501 | "typed-builder", 502 | "typed-builder-macro", 503 | "web-sys", 504 | ] 505 | 506 | [[package]] 507 | name = "leptos_animated_for" 508 | version = "0.4.8" 509 | dependencies = [ 510 | "futures", 511 | "leptos", 512 | "wasm-bindgen", 513 | "web-sys", 514 | ] 515 | 516 | [[package]] 517 | name = "leptos_config" 518 | version = "0.6.13" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "6e519478cf13b84e0169f14660fda6425a419d181903cf511cec416555c9ff51" 521 | dependencies = [ 522 | "config", 523 | "regex", 524 | "serde", 525 | "thiserror", 526 | "typed-builder", 527 | ] 528 | 529 | [[package]] 530 | name = "leptos_dom" 531 | version = "0.6.13" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "46a32ccb530d95c82b522ff86827a9c14efb3d3a75c508c20605d4603beb1695" 534 | dependencies = [ 535 | "async-recursion", 536 | "cfg-if", 537 | "drain_filter_polyfill", 538 | "futures", 539 | "getrandom", 540 | "html-escape", 541 | "indexmap", 542 | "itertools", 543 | "js-sys", 544 | "leptos_reactive", 545 | "once_cell", 546 | "pad-adapter", 547 | "paste", 548 | "rustc-hash", 549 | "serde", 550 | "serde_json", 551 | "server_fn", 552 | "smallvec", 553 | "tracing", 554 | "wasm-bindgen", 555 | "wasm-bindgen-futures", 556 | "web-sys", 557 | ] 558 | 559 | [[package]] 560 | name = "leptos_hot_reload" 561 | version = "0.6.13" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "71eb2b309ff0e526d147e32afcbbbf39b43c1ed5b7264b7abfb6635c388c0e9e" 564 | dependencies = [ 565 | "anyhow", 566 | "camino", 567 | "indexmap", 568 | "parking_lot", 569 | "proc-macro2", 570 | "quote", 571 | "rstml", 572 | "serde", 573 | "syn", 574 | "walkdir", 575 | ] 576 | 577 | [[package]] 578 | name = "leptos_macro" 579 | version = "0.6.13" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "d38b41f4e38b6f0e26858ae40464e12702096d2219c48afd41b79693fd025a9d" 582 | dependencies = [ 583 | "attribute-derive", 584 | "cfg-if", 585 | "convert_case", 586 | "html-escape", 587 | "itertools", 588 | "leptos_hot_reload", 589 | "prettyplease", 590 | "proc-macro-error", 591 | "proc-macro2", 592 | "quote", 593 | "rstml", 594 | "server_fn_macro", 595 | "syn", 596 | "tracing", 597 | "uuid", 598 | ] 599 | 600 | [[package]] 601 | name = "leptos_reactive" 602 | version = "0.6.13" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "bc38db7b14f2d48cb427dd4c197ee58354f5de9407fb3417f2ee7ff85097ffd3" 605 | dependencies = [ 606 | "base64", 607 | "cfg-if", 608 | "futures", 609 | "indexmap", 610 | "oco_ref", 611 | "paste", 612 | "pin-project", 613 | "rustc-hash", 614 | "self_cell", 615 | "serde", 616 | "serde-wasm-bindgen", 617 | "serde_json", 618 | "slotmap", 619 | "thiserror", 620 | "tracing", 621 | "wasm-bindgen-futures", 622 | ] 623 | 624 | [[package]] 625 | name = "leptos_server" 626 | version = "0.6.13" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "9c0ea6eed569e70fa4eed722ee3f042ed76c40d2b0a82b7240eb660893d6a5e9" 629 | dependencies = [ 630 | "inventory", 631 | "lazy_static", 632 | "leptos_macro", 633 | "leptos_reactive", 634 | "serde", 635 | "server_fn", 636 | "thiserror", 637 | "tracing", 638 | ] 639 | 640 | [[package]] 641 | name = "libc" 642 | version = "0.2.155" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 645 | 646 | [[package]] 647 | name = "lock_api" 648 | version = "0.4.12" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 651 | dependencies = [ 652 | "autocfg", 653 | "scopeguard", 654 | ] 655 | 656 | [[package]] 657 | name = "log" 658 | version = "0.4.22" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 661 | 662 | [[package]] 663 | name = "manyhow" 664 | version = "0.10.4" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "f91ea592d76c0b6471965708ccff7e6a5d277f676b90ab31f4d3f3fc77fade64" 667 | dependencies = [ 668 | "manyhow-macros", 669 | "proc-macro2", 670 | "quote", 671 | "syn", 672 | ] 673 | 674 | [[package]] 675 | name = "manyhow-macros" 676 | version = "0.10.4" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "c64621e2c08f2576e4194ea8be11daf24ac01249a4f53cd8befcbb7077120ead" 679 | dependencies = [ 680 | "proc-macro-utils", 681 | "proc-macro2", 682 | "quote", 683 | ] 684 | 685 | [[package]] 686 | name = "memchr" 687 | version = "2.7.4" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 690 | 691 | [[package]] 692 | name = "minimal-lexical" 693 | version = "0.2.1" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 696 | 697 | [[package]] 698 | name = "nom" 699 | version = "7.1.3" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 702 | dependencies = [ 703 | "memchr", 704 | "minimal-lexical", 705 | ] 706 | 707 | [[package]] 708 | name = "oco_ref" 709 | version = "0.1.1" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "c51ebcefb2f0b9a5e0bea115532c8ae4215d1b01eff176d0f4ba4192895c2708" 712 | dependencies = [ 713 | "serde", 714 | "thiserror", 715 | ] 716 | 717 | [[package]] 718 | name = "once_cell" 719 | version = "1.19.0" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 722 | 723 | [[package]] 724 | name = "pad-adapter" 725 | version = "0.1.1" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "56d80efc4b6721e8be2a10a5df21a30fa0b470f1539e53d8b4e6e75faf938b63" 728 | 729 | [[package]] 730 | name = "parking_lot" 731 | version = "0.12.3" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 734 | dependencies = [ 735 | "lock_api", 736 | "parking_lot_core", 737 | ] 738 | 739 | [[package]] 740 | name = "parking_lot_core" 741 | version = "0.9.10" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 744 | dependencies = [ 745 | "cfg-if", 746 | "libc", 747 | "redox_syscall", 748 | "smallvec", 749 | "windows-targets", 750 | ] 751 | 752 | [[package]] 753 | name = "paste" 754 | version = "1.0.15" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 757 | 758 | [[package]] 759 | name = "pathdiff" 760 | version = "0.2.1" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 763 | 764 | [[package]] 765 | name = "percent-encoding" 766 | version = "2.3.1" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 769 | 770 | [[package]] 771 | name = "pin-project" 772 | version = "1.1.5" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 775 | dependencies = [ 776 | "pin-project-internal", 777 | ] 778 | 779 | [[package]] 780 | name = "pin-project-internal" 781 | version = "1.1.5" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 784 | dependencies = [ 785 | "proc-macro2", 786 | "quote", 787 | "syn", 788 | ] 789 | 790 | [[package]] 791 | name = "pin-project-lite" 792 | version = "0.2.14" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 795 | 796 | [[package]] 797 | name = "pin-utils" 798 | version = "0.1.0" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 801 | 802 | [[package]] 803 | name = "prettyplease" 804 | version = "0.2.20" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" 807 | dependencies = [ 808 | "proc-macro2", 809 | "syn", 810 | ] 811 | 812 | [[package]] 813 | name = "proc-macro-error" 814 | version = "1.0.4" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 817 | dependencies = [ 818 | "proc-macro-error-attr", 819 | "proc-macro2", 820 | "quote", 821 | "version_check", 822 | ] 823 | 824 | [[package]] 825 | name = "proc-macro-error-attr" 826 | version = "1.0.4" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 829 | dependencies = [ 830 | "proc-macro2", 831 | "quote", 832 | "version_check", 833 | ] 834 | 835 | [[package]] 836 | name = "proc-macro-utils" 837 | version = "0.8.0" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" 840 | dependencies = [ 841 | "proc-macro2", 842 | "quote", 843 | "smallvec", 844 | ] 845 | 846 | [[package]] 847 | name = "proc-macro2" 848 | version = "1.0.86" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 851 | dependencies = [ 852 | "unicode-ident", 853 | ] 854 | 855 | [[package]] 856 | name = "proc-macro2-diagnostics" 857 | version = "0.10.1" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" 860 | dependencies = [ 861 | "proc-macro2", 862 | "quote", 863 | "syn", 864 | "version_check", 865 | "yansi", 866 | ] 867 | 868 | [[package]] 869 | name = "quote" 870 | version = "1.0.36" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 873 | dependencies = [ 874 | "proc-macro2", 875 | ] 876 | 877 | [[package]] 878 | name = "quote-use" 879 | version = "0.8.3" 880 | source = "registry+https://github.com/rust-lang/crates.io-index" 881 | checksum = "48e96ac59974192a2fa6ee55a41211cf1385c5b2a8636a4c3068b3b3dd599ece" 882 | dependencies = [ 883 | "quote", 884 | "quote-use-macros", 885 | ] 886 | 887 | [[package]] 888 | name = "quote-use-macros" 889 | version = "0.8.3" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "b4c57308e9dde4d7be9af804f6deeaa9951e1de1d5ffce6142eb964750109f7e" 892 | dependencies = [ 893 | "derive-where", 894 | "proc-macro-utils", 895 | "proc-macro2", 896 | "quote", 897 | "syn", 898 | ] 899 | 900 | [[package]] 901 | name = "redox_syscall" 902 | version = "0.5.3" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" 905 | dependencies = [ 906 | "bitflags", 907 | ] 908 | 909 | [[package]] 910 | name = "regex" 911 | version = "1.10.5" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" 914 | dependencies = [ 915 | "aho-corasick", 916 | "memchr", 917 | "regex-automata", 918 | "regex-syntax", 919 | ] 920 | 921 | [[package]] 922 | name = "regex-automata" 923 | version = "0.4.7" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 926 | dependencies = [ 927 | "aho-corasick", 928 | "memchr", 929 | "regex-syntax", 930 | ] 931 | 932 | [[package]] 933 | name = "regex-syntax" 934 | version = "0.8.4" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 937 | 938 | [[package]] 939 | name = "rstml" 940 | version = "0.11.2" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "fe542870b8f59dd45ad11d382e5339c9a1047cde059be136a7016095bbdefa77" 943 | dependencies = [ 944 | "proc-macro2", 945 | "proc-macro2-diagnostics", 946 | "quote", 947 | "syn", 948 | "syn_derive", 949 | "thiserror", 950 | ] 951 | 952 | [[package]] 953 | name = "rustc-hash" 954 | version = "1.1.0" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 957 | 958 | [[package]] 959 | name = "ryu" 960 | version = "1.0.18" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 963 | 964 | [[package]] 965 | name = "same-file" 966 | version = "1.0.6" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 969 | dependencies = [ 970 | "winapi-util", 971 | ] 972 | 973 | [[package]] 974 | name = "scopeguard" 975 | version = "1.2.0" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 978 | 979 | [[package]] 980 | name = "self_cell" 981 | version = "1.0.4" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" 984 | 985 | [[package]] 986 | name = "send_wrapper" 987 | version = "0.6.0" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 990 | dependencies = [ 991 | "futures-core", 992 | ] 993 | 994 | [[package]] 995 | name = "serde" 996 | version = "1.0.204" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" 999 | dependencies = [ 1000 | "serde_derive", 1001 | ] 1002 | 1003 | [[package]] 1004 | name = "serde-wasm-bindgen" 1005 | version = "0.6.5" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" 1008 | dependencies = [ 1009 | "js-sys", 1010 | "serde", 1011 | "wasm-bindgen", 1012 | ] 1013 | 1014 | [[package]] 1015 | name = "serde_derive" 1016 | version = "1.0.204" 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" 1018 | checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" 1019 | dependencies = [ 1020 | "proc-macro2", 1021 | "quote", 1022 | "syn", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "serde_json" 1027 | version = "1.0.121" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" 1030 | dependencies = [ 1031 | "itoa", 1032 | "memchr", 1033 | "ryu", 1034 | "serde", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "serde_qs" 1039 | version = "0.12.0" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" 1042 | dependencies = [ 1043 | "percent-encoding", 1044 | "serde", 1045 | "thiserror", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "serde_spanned" 1050 | version = "0.6.7" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" 1053 | dependencies = [ 1054 | "serde", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "server_fn" 1059 | version = "0.6.13" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "e9aaae169927ef701a4734d680adcb08f13269c9f0af822bf175d681fe56d65c" 1062 | dependencies = [ 1063 | "bytes", 1064 | "ciborium", 1065 | "const_format", 1066 | "dashmap", 1067 | "futures", 1068 | "gloo-net", 1069 | "http 1.1.0", 1070 | "js-sys", 1071 | "once_cell", 1072 | "send_wrapper", 1073 | "serde", 1074 | "serde_json", 1075 | "serde_qs", 1076 | "server_fn_macro_default", 1077 | "thiserror", 1078 | "url", 1079 | "wasm-bindgen", 1080 | "wasm-bindgen-futures", 1081 | "wasm-streams", 1082 | "web-sys", 1083 | "xxhash-rust", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "server_fn_macro" 1088 | version = "0.6.13" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "583085903fd5d091884eb52d99550e32777015af21f0f5dbec49bedcc320ce82" 1091 | dependencies = [ 1092 | "const_format", 1093 | "convert_case", 1094 | "proc-macro2", 1095 | "quote", 1096 | "syn", 1097 | "xxhash-rust", 1098 | ] 1099 | 1100 | [[package]] 1101 | name = "server_fn_macro_default" 1102 | version = "0.6.13" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "b628649700e28cf8bc33e0df5de5c9d591a1828ba005a25b425477055f1e0e74" 1105 | dependencies = [ 1106 | "server_fn_macro", 1107 | "syn", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "slab" 1112 | version = "0.4.9" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1115 | dependencies = [ 1116 | "autocfg", 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "slotmap" 1121 | version = "1.0.7" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 1124 | dependencies = [ 1125 | "serde", 1126 | "version_check", 1127 | ] 1128 | 1129 | [[package]] 1130 | name = "smallvec" 1131 | version = "1.13.2" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1134 | 1135 | [[package]] 1136 | name = "syn" 1137 | version = "2.0.72" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" 1140 | dependencies = [ 1141 | "proc-macro2", 1142 | "quote", 1143 | "unicode-ident", 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "syn_derive" 1148 | version = "0.1.8" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" 1151 | dependencies = [ 1152 | "proc-macro-error", 1153 | "proc-macro2", 1154 | "quote", 1155 | "syn", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "thiserror" 1160 | version = "1.0.63" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" 1163 | dependencies = [ 1164 | "thiserror-impl", 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "thiserror-impl" 1169 | version = "1.0.63" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" 1172 | dependencies = [ 1173 | "proc-macro2", 1174 | "quote", 1175 | "syn", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "tinyvec" 1180 | version = "1.8.0" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 1183 | dependencies = [ 1184 | "tinyvec_macros", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "tinyvec_macros" 1189 | version = "0.1.1" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1192 | 1193 | [[package]] 1194 | name = "toml" 1195 | version = "0.8.17" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "7a44eede9b727419af8095cb2d72fab15487a541f54647ad4414b34096ee4631" 1198 | dependencies = [ 1199 | "serde", 1200 | "serde_spanned", 1201 | "toml_datetime", 1202 | "toml_edit", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "toml_datetime" 1207 | version = "0.6.8" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1210 | dependencies = [ 1211 | "serde", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "toml_edit" 1216 | version = "0.22.18" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "1490595c74d930da779e944f5ba2ecdf538af67df1a9848cbd156af43c1b7cf0" 1219 | dependencies = [ 1220 | "indexmap", 1221 | "serde", 1222 | "serde_spanned", 1223 | "toml_datetime", 1224 | "winnow", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "tracing" 1229 | version = "0.1.40" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1232 | dependencies = [ 1233 | "pin-project-lite", 1234 | "tracing-attributes", 1235 | "tracing-core", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "tracing-attributes" 1240 | version = "0.1.27" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1243 | dependencies = [ 1244 | "proc-macro2", 1245 | "quote", 1246 | "syn", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "tracing-core" 1251 | version = "0.1.32" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1254 | dependencies = [ 1255 | "once_cell", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "typed-builder" 1260 | version = "0.18.2" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "77739c880e00693faef3d65ea3aad725f196da38b22fdc7ea6ded6e1ce4d3add" 1263 | dependencies = [ 1264 | "typed-builder-macro", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "typed-builder-macro" 1269 | version = "0.18.2" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63" 1272 | dependencies = [ 1273 | "proc-macro2", 1274 | "quote", 1275 | "syn", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "unicode-bidi" 1280 | version = "0.3.15" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1283 | 1284 | [[package]] 1285 | name = "unicode-ident" 1286 | version = "1.0.12" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1289 | 1290 | [[package]] 1291 | name = "unicode-normalization" 1292 | version = "0.1.23" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1295 | dependencies = [ 1296 | "tinyvec", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "unicode-segmentation" 1301 | version = "1.11.0" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 1304 | 1305 | [[package]] 1306 | name = "unicode-xid" 1307 | version = "0.2.4" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 1310 | 1311 | [[package]] 1312 | name = "url" 1313 | version = "2.5.2" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 1316 | dependencies = [ 1317 | "form_urlencoded", 1318 | "idna", 1319 | "percent-encoding", 1320 | ] 1321 | 1322 | [[package]] 1323 | name = "utf8-width" 1324 | version = "0.1.7" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" 1327 | 1328 | [[package]] 1329 | name = "uuid" 1330 | version = "1.10.0" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" 1333 | dependencies = [ 1334 | "getrandom", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "version_check" 1339 | version = "0.9.5" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1342 | 1343 | [[package]] 1344 | name = "walkdir" 1345 | version = "2.5.0" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1348 | dependencies = [ 1349 | "same-file", 1350 | "winapi-util", 1351 | ] 1352 | 1353 | [[package]] 1354 | name = "wasi" 1355 | version = "0.11.0+wasi-snapshot-preview1" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1358 | 1359 | [[package]] 1360 | name = "wasm-bindgen" 1361 | version = "0.2.92" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 1364 | dependencies = [ 1365 | "cfg-if", 1366 | "wasm-bindgen-macro", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "wasm-bindgen-backend" 1371 | version = "0.2.92" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 1374 | dependencies = [ 1375 | "bumpalo", 1376 | "log", 1377 | "once_cell", 1378 | "proc-macro2", 1379 | "quote", 1380 | "syn", 1381 | "wasm-bindgen-shared", 1382 | ] 1383 | 1384 | [[package]] 1385 | name = "wasm-bindgen-futures" 1386 | version = "0.4.42" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 1389 | dependencies = [ 1390 | "cfg-if", 1391 | "js-sys", 1392 | "wasm-bindgen", 1393 | "web-sys", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "wasm-bindgen-macro" 1398 | version = "0.2.92" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 1401 | dependencies = [ 1402 | "quote", 1403 | "wasm-bindgen-macro-support", 1404 | ] 1405 | 1406 | [[package]] 1407 | name = "wasm-bindgen-macro-support" 1408 | version = "0.2.92" 1409 | source = "registry+https://github.com/rust-lang/crates.io-index" 1410 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 1411 | dependencies = [ 1412 | "proc-macro2", 1413 | "quote", 1414 | "syn", 1415 | "wasm-bindgen-backend", 1416 | "wasm-bindgen-shared", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "wasm-bindgen-shared" 1421 | version = "0.2.92" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 1424 | 1425 | [[package]] 1426 | name = "wasm-streams" 1427 | version = "0.4.0" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" 1430 | dependencies = [ 1431 | "futures-util", 1432 | "js-sys", 1433 | "wasm-bindgen", 1434 | "wasm-bindgen-futures", 1435 | "web-sys", 1436 | ] 1437 | 1438 | [[package]] 1439 | name = "web-sys" 1440 | version = "0.3.69" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 1443 | dependencies = [ 1444 | "js-sys", 1445 | "wasm-bindgen", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "winapi-util" 1450 | version = "0.1.8" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" 1453 | dependencies = [ 1454 | "windows-sys", 1455 | ] 1456 | 1457 | [[package]] 1458 | name = "windows-sys" 1459 | version = "0.52.0" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1462 | dependencies = [ 1463 | "windows-targets", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "windows-targets" 1468 | version = "0.52.6" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1471 | dependencies = [ 1472 | "windows_aarch64_gnullvm", 1473 | "windows_aarch64_msvc", 1474 | "windows_i686_gnu", 1475 | "windows_i686_gnullvm", 1476 | "windows_i686_msvc", 1477 | "windows_x86_64_gnu", 1478 | "windows_x86_64_gnullvm", 1479 | "windows_x86_64_msvc", 1480 | ] 1481 | 1482 | [[package]] 1483 | name = "windows_aarch64_gnullvm" 1484 | version = "0.52.6" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1487 | 1488 | [[package]] 1489 | name = "windows_aarch64_msvc" 1490 | version = "0.52.6" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1493 | 1494 | [[package]] 1495 | name = "windows_i686_gnu" 1496 | version = "0.52.6" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1499 | 1500 | [[package]] 1501 | name = "windows_i686_gnullvm" 1502 | version = "0.52.6" 1503 | source = "registry+https://github.com/rust-lang/crates.io-index" 1504 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1505 | 1506 | [[package]] 1507 | name = "windows_i686_msvc" 1508 | version = "0.52.6" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1511 | 1512 | [[package]] 1513 | name = "windows_x86_64_gnu" 1514 | version = "0.52.6" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1517 | 1518 | [[package]] 1519 | name = "windows_x86_64_gnullvm" 1520 | version = "0.52.6" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1523 | 1524 | [[package]] 1525 | name = "windows_x86_64_msvc" 1526 | version = "0.52.6" 1527 | source = "registry+https://github.com/rust-lang/crates.io-index" 1528 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1529 | 1530 | [[package]] 1531 | name = "winnow" 1532 | version = "0.6.16" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" 1535 | dependencies = [ 1536 | "memchr", 1537 | ] 1538 | 1539 | [[package]] 1540 | name = "xxhash-rust" 1541 | version = "0.8.12" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" 1544 | 1545 | [[package]] 1546 | name = "yansi" 1547 | version = "1.0.1" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 1550 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "leptos_animated_for" 3 | version = "0.4.8" 4 | edition = "2021" 5 | repository = "https://github.com/brofrain/leptos-animated-for" 6 | license = "MIT" 7 | description = " component utilizing FLIP position transitions for Leptos" 8 | keywords = ["leptos", "animations", "dom", "web", "wasm"] 9 | 10 | [dependencies] 11 | futures = "0.3.30" 12 | leptos = { version = "0.6.13" } 13 | wasm-bindgen = { version = "0.2.92" } 14 | web-sys = { version = "0.3.69", features = ["DomRect"] } 15 | 16 | [lints.rust] 17 | unsafe_code = "forbid" 18 | 19 | [lints.clippy] 20 | pedantic = { level = "warn", priority = -1 } 21 | clone_on_ref_ptr = "warn" 22 | dbg_macro = "warn" 23 | deref_by_slicing = "warn" 24 | empty_drop = "warn" 25 | fallible_impl_from = "warn" 26 | float_cmp_const = "warn" 27 | fn_to_numeric_cast_any = "warn" 28 | get_unwrap = "warn" 29 | integer_division = "warn" 30 | lossy_float_literal = "warn" 31 | map_err_ignore = "warn" 32 | missing_const_for_fn = "warn" 33 | mod_module_files = "warn" 34 | multiple_inherent_impl = "warn" 35 | mutex_atomic = "warn" 36 | partial_pub_fields = "warn" 37 | print_stderr = "warn" 38 | print_stdout = "warn" 39 | pub_without_shorthand = "warn" 40 | rc_mutex = "warn" 41 | ref_patterns = "warn" 42 | redundant_clone = "warn" 43 | redundant_type_annotations = "warn" 44 | rest_pat_in_fully_bound_structs = "warn" 45 | semicolon_inside_block = "warn" 46 | str_to_string = "warn" 47 | string_to_string = "warn" 48 | suspicious_operation_groupings = "warn" 49 | suspicious_xor_used_as_pow = "warn" 50 | todo = "warn" 51 | trailing_empty_array = "warn" 52 | trait_duplication_in_bounds = "warn" 53 | try_err = "warn" 54 | unimplemented = "warn" 55 | unnecessary_self_imports = "warn" 56 | unneeded_field_pattern = "warn" 57 | unreachable = "warn" 58 | unseparated_literal_suffix = "warn" 59 | use_debug = "warn" 60 | use_self = "warn" 61 | verbose_file_reads = "warn" 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023-PRESENT Kajetan Welc 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ⚠️ This crate is no longer maintained ⚠️ 2 | 3 | I've created [leptos-animate](https://github.com/brofrain/leptos-animate) as a successor to this crate with a more flexible API and more features.\ 4 | Consider using it instead. 5 | 6 | # `` component for [Leptos](https://leptos.dev/) 7 | 8 | [FLIP](https://aerotwist.com/blog/flip-your-animations/) animations for element and component groups inspired by Vue's [``](https://vuejs.org/guide/built-ins/transition-group.html). 9 | 10 |

11 | 12 |

13 | 14 | This crate exports a component similar to Leptos' built-in [``](https://docs.rs/leptos/latest/leptos/fn.For.html) with additional properties for applying specific CSS classes to nodes that: 15 | 16 | - are rendered for the first time 17 | 18 | - represent already removed items 19 | 20 | - have their positions changed due to reorder or other elements being added / removed 21 | 22 | Each node has to be uniquely keyed, since the original ``'s logic is used under the hood. Additionally, animations will break for unstable or duplicate keys. You can refer to the official [`` guide](https://leptos-rs.github.io/leptos/view/04_iteration.html#dynamic-rendering-with-the-for-component) for more detailed information. 23 | 24 | ## Usage 25 | 26 | ```rs 27 | view! { 28 | 38 | } 39 | ``` 40 | 41 | - `enter_from_class` - class applied to each new element for a single tick. Then the class is removed and `enter_class` is inserted instead. This is useful for defining the initial state of an element (e.g. full transparency) before the enter animation starts. 42 | 43 | - `enter_class` - appended to entering elements. The class is removed on a [transitionend](https://developer.mozilla.org/en-US/docs/Web/API/Element/transitionend_event) or [animationend](https://developer.mozilla.org/en-US/docs/Web/API/Element/animationend_event) event, or if move transition is triggered before this one ends. 44 | 45 | - `move_class` - active class for elements moving to their new positions. The class is removed on a `transitionend` or `animationend` event (same as `enter_class`). Reordering items again before they reach their destinations will overwrite the target positions. 46 | 47 | - `leave_class` - removed items have their "zombie" elements present in the DOM with this class applied. The nodes are finally deleted on a `transitionend` or `animationend` event. 48 | 49 | - `appear` - if true, the enter transition triggers for all children on initial `` render. 50 | 51 | Example usage with [TailwindCSS](https://tailwindcss.com/): 52 | 53 | ```rs 54 | view! { 55 | 65 | } 66 | ``` 67 | 68 | Check out `examples` directory for a complete code. 69 | 70 | ### SSR support 71 | 72 | It generally should just work. See this [example](https://github.com/brofrain/leptos-animated-for/blob/main/examples/ssr). 73 | 74 | ## Known issues 75 | 76 | - Given a child element with always present `transition` or `transition-duration` style property, move transition breaks if triggered before the previous move transition has finished.\ 77 | Unless the children are reordered frequently, this should not be a problem.\ 78 | To prevent the glitch from occurring, make sure that the transition-related properties are applied only via `enter_class`, `move_class`, or `leave_class` props. In case you need the transitions for e.g. hover animations, you can wrap the elements in additional `
` nodes, so `` can work on them instead.\ 79 | As of writing this, I'm not sure how to fix this, but I will investigate this in the future. 80 | 81 | - Elements rendered on server-side have no `enter_from_class` applied initially. In combination with `appear` prop, the nodes may be visible for a short time before the enter animation starts.\ 82 | If you care about the initial entering transition, make sure that the list is rendered only in the browser. 83 | 84 | ## TODO 85 | 86 | - [ ] Tests 87 | - [ ] Investigate the known issues 88 | - [ ] Detect duplicate keys for better developer experience 89 | - [ ] Add ability to define custom handlers when an element enters "before enter" / "enter" / "move" / "leave" state 90 | - [ ] Optional properties for explicit animation durations 91 | - [ ] Optional bool prop for enabling resize animations 92 | - [ ] Optional bool prop for assigning a static `z-index` to each child, so triggering a move transition before the previous one has finished doesn't cause overlapping elements to be chaotically moved from front to back and vice versa. 93 | 94 | ## License 95 | 96 | [MIT License](https://opensource.org/licenses/MIT) 97 | 98 | Copyright (c) 2023-PRESENT Kajetan Welc 99 | 100 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 101 | 102 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 103 | 104 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 105 | -------------------------------------------------------------------------------- /docs/preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brofrain/leptos-animated-for/8f67a527e577b9f705dc3bc25acb7939df5bb707/docs/preview.gif -------------------------------------------------------------------------------- /examples/csr/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "rust-analyzer.check.command": "clippy", 3 | "rust-analyzer.procMacro.ignored": { 4 | "leptos_macro": ["component"] 5 | }, 6 | "rust-analyzer.rustfmt.overrideCommand": ["leptosfmt", "--stdin", "--rustfmt"] 7 | } 8 | -------------------------------------------------------------------------------- /examples/csr/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "anyhow" 16 | version = "1.0.86" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" 19 | 20 | [[package]] 21 | name = "async-recursion" 22 | version = "1.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 25 | dependencies = [ 26 | "proc-macro2", 27 | "quote", 28 | "syn", 29 | ] 30 | 31 | [[package]] 32 | name = "attribute-derive" 33 | version = "0.9.1" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "8b48808b337d6b74c15ff9becfc0e139fe2b4e2b224d670a0ecdb46b0b2d3d9b" 36 | dependencies = [ 37 | "attribute-derive-macro", 38 | "derive-where", 39 | "manyhow", 40 | "proc-macro2", 41 | "quote", 42 | "syn", 43 | ] 44 | 45 | [[package]] 46 | name = "attribute-derive-macro" 47 | version = "0.9.1" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "5b19cbd63850ecff821c413e12846a67ec9f4ce7309c70959b94ecf9b2575ee2" 50 | dependencies = [ 51 | "collection_literals", 52 | "interpolator", 53 | "manyhow", 54 | "proc-macro-utils", 55 | "proc-macro2", 56 | "quote", 57 | "quote-use", 58 | "syn", 59 | ] 60 | 61 | [[package]] 62 | name = "autocfg" 63 | version = "1.3.0" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 66 | 67 | [[package]] 68 | name = "base64" 69 | version = "0.22.1" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 72 | 73 | [[package]] 74 | name = "bitflags" 75 | version = "2.5.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 78 | 79 | [[package]] 80 | name = "bumpalo" 81 | version = "3.16.0" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 84 | 85 | [[package]] 86 | name = "bytes" 87 | version = "1.6.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 90 | 91 | [[package]] 92 | name = "camino" 93 | version = "1.1.7" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" 96 | 97 | [[package]] 98 | name = "cfg-if" 99 | version = "1.0.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 102 | 103 | [[package]] 104 | name = "ciborium" 105 | version = "0.2.2" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 108 | dependencies = [ 109 | "ciborium-io", 110 | "ciborium-ll", 111 | "serde", 112 | ] 113 | 114 | [[package]] 115 | name = "ciborium-io" 116 | version = "0.2.2" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 119 | 120 | [[package]] 121 | name = "ciborium-ll" 122 | version = "0.2.2" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 125 | dependencies = [ 126 | "ciborium-io", 127 | "half", 128 | ] 129 | 130 | [[package]] 131 | name = "collection_literals" 132 | version = "1.0.1" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" 135 | 136 | [[package]] 137 | name = "config" 138 | version = "0.14.0" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" 141 | dependencies = [ 142 | "convert_case", 143 | "lazy_static", 144 | "nom", 145 | "pathdiff", 146 | "serde", 147 | "toml", 148 | ] 149 | 150 | [[package]] 151 | name = "console_error_panic_hook" 152 | version = "0.1.7" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 155 | dependencies = [ 156 | "cfg-if", 157 | "wasm-bindgen", 158 | ] 159 | 160 | [[package]] 161 | name = "console_log" 162 | version = "1.0.0" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f" 165 | dependencies = [ 166 | "log", 167 | "web-sys", 168 | ] 169 | 170 | [[package]] 171 | name = "const_format" 172 | version = "0.2.32" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" 175 | dependencies = [ 176 | "const_format_proc_macros", 177 | ] 178 | 179 | [[package]] 180 | name = "const_format_proc_macros" 181 | version = "0.2.32" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" 184 | dependencies = [ 185 | "proc-macro2", 186 | "quote", 187 | "unicode-xid", 188 | ] 189 | 190 | [[package]] 191 | name = "convert_case" 192 | version = "0.6.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" 195 | dependencies = [ 196 | "unicode-segmentation", 197 | ] 198 | 199 | [[package]] 200 | name = "crunchy" 201 | version = "0.2.2" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 204 | 205 | [[package]] 206 | name = "csr-example" 207 | version = "0.0.0" 208 | dependencies = [ 209 | "console_error_panic_hook", 210 | "console_log", 211 | "getrandom", 212 | "leptos", 213 | "leptos_animated_for", 214 | "log", 215 | "rand", 216 | ] 217 | 218 | [[package]] 219 | name = "dashmap" 220 | version = "5.5.3" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" 223 | dependencies = [ 224 | "cfg-if", 225 | "hashbrown", 226 | "lock_api", 227 | "once_cell", 228 | "parking_lot_core", 229 | ] 230 | 231 | [[package]] 232 | name = "derive-where" 233 | version = "1.2.7" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" 236 | dependencies = [ 237 | "proc-macro2", 238 | "quote", 239 | "syn", 240 | ] 241 | 242 | [[package]] 243 | name = "displaydoc" 244 | version = "0.2.4" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" 247 | dependencies = [ 248 | "proc-macro2", 249 | "quote", 250 | "syn", 251 | ] 252 | 253 | [[package]] 254 | name = "drain_filter_polyfill" 255 | version = "0.1.3" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" 258 | 259 | [[package]] 260 | name = "either" 261 | version = "1.12.0" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" 264 | 265 | [[package]] 266 | name = "equivalent" 267 | version = "1.0.1" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 270 | 271 | [[package]] 272 | name = "fnv" 273 | version = "1.0.7" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 276 | 277 | [[package]] 278 | name = "form_urlencoded" 279 | version = "1.2.1" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 282 | dependencies = [ 283 | "percent-encoding", 284 | ] 285 | 286 | [[package]] 287 | name = "futures" 288 | version = "0.3.30" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 291 | dependencies = [ 292 | "futures-channel", 293 | "futures-core", 294 | "futures-executor", 295 | "futures-io", 296 | "futures-sink", 297 | "futures-task", 298 | "futures-util", 299 | ] 300 | 301 | [[package]] 302 | name = "futures-channel" 303 | version = "0.3.30" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 306 | dependencies = [ 307 | "futures-core", 308 | "futures-sink", 309 | ] 310 | 311 | [[package]] 312 | name = "futures-core" 313 | version = "0.3.30" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 316 | 317 | [[package]] 318 | name = "futures-executor" 319 | version = "0.3.30" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 322 | dependencies = [ 323 | "futures-core", 324 | "futures-task", 325 | "futures-util", 326 | ] 327 | 328 | [[package]] 329 | name = "futures-io" 330 | version = "0.3.30" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 333 | 334 | [[package]] 335 | name = "futures-macro" 336 | version = "0.3.30" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 339 | dependencies = [ 340 | "proc-macro2", 341 | "quote", 342 | "syn", 343 | ] 344 | 345 | [[package]] 346 | name = "futures-sink" 347 | version = "0.3.30" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 350 | 351 | [[package]] 352 | name = "futures-task" 353 | version = "0.3.30" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 356 | 357 | [[package]] 358 | name = "futures-util" 359 | version = "0.3.30" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 362 | dependencies = [ 363 | "futures-channel", 364 | "futures-core", 365 | "futures-io", 366 | "futures-macro", 367 | "futures-sink", 368 | "futures-task", 369 | "memchr", 370 | "pin-project-lite", 371 | "pin-utils", 372 | "slab", 373 | ] 374 | 375 | [[package]] 376 | name = "getrandom" 377 | version = "0.2.15" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 380 | dependencies = [ 381 | "cfg-if", 382 | "js-sys", 383 | "libc", 384 | "wasi", 385 | "wasm-bindgen", 386 | ] 387 | 388 | [[package]] 389 | name = "gloo-net" 390 | version = "0.5.0" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "43aaa242d1239a8822c15c645f02166398da4f8b5c4bae795c1f5b44e9eee173" 393 | dependencies = [ 394 | "futures-channel", 395 | "futures-core", 396 | "futures-sink", 397 | "gloo-utils", 398 | "http 0.2.12", 399 | "js-sys", 400 | "pin-project", 401 | "serde", 402 | "serde_json", 403 | "thiserror", 404 | "wasm-bindgen", 405 | "wasm-bindgen-futures", 406 | "web-sys", 407 | ] 408 | 409 | [[package]] 410 | name = "gloo-utils" 411 | version = "0.2.0" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" 414 | dependencies = [ 415 | "js-sys", 416 | "serde", 417 | "serde_json", 418 | "wasm-bindgen", 419 | "web-sys", 420 | ] 421 | 422 | [[package]] 423 | name = "half" 424 | version = "2.4.1" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 427 | dependencies = [ 428 | "cfg-if", 429 | "crunchy", 430 | ] 431 | 432 | [[package]] 433 | name = "hashbrown" 434 | version = "0.14.5" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 437 | 438 | [[package]] 439 | name = "html-escape" 440 | version = "0.2.13" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" 443 | dependencies = [ 444 | "utf8-width", 445 | ] 446 | 447 | [[package]] 448 | name = "http" 449 | version = "0.2.12" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 452 | dependencies = [ 453 | "bytes", 454 | "fnv", 455 | "itoa", 456 | ] 457 | 458 | [[package]] 459 | name = "http" 460 | version = "1.1.0" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 463 | dependencies = [ 464 | "bytes", 465 | "fnv", 466 | "itoa", 467 | ] 468 | 469 | [[package]] 470 | name = "icu_collections" 471 | version = "1.5.0" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 474 | dependencies = [ 475 | "displaydoc", 476 | "yoke", 477 | "zerofrom", 478 | "zerovec", 479 | ] 480 | 481 | [[package]] 482 | name = "icu_locid" 483 | version = "1.5.0" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 486 | dependencies = [ 487 | "displaydoc", 488 | "litemap", 489 | "tinystr", 490 | "writeable", 491 | "zerovec", 492 | ] 493 | 494 | [[package]] 495 | name = "icu_locid_transform" 496 | version = "1.5.0" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 499 | dependencies = [ 500 | "displaydoc", 501 | "icu_locid", 502 | "icu_locid_transform_data", 503 | "icu_provider", 504 | "tinystr", 505 | "zerovec", 506 | ] 507 | 508 | [[package]] 509 | name = "icu_locid_transform_data" 510 | version = "1.5.0" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 513 | 514 | [[package]] 515 | name = "icu_normalizer" 516 | version = "1.5.0" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 519 | dependencies = [ 520 | "displaydoc", 521 | "icu_collections", 522 | "icu_normalizer_data", 523 | "icu_properties", 524 | "icu_provider", 525 | "smallvec", 526 | "utf16_iter", 527 | "utf8_iter", 528 | "write16", 529 | "zerovec", 530 | ] 531 | 532 | [[package]] 533 | name = "icu_normalizer_data" 534 | version = "1.5.0" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 537 | 538 | [[package]] 539 | name = "icu_properties" 540 | version = "1.5.0" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036" 543 | dependencies = [ 544 | "displaydoc", 545 | "icu_collections", 546 | "icu_locid_transform", 547 | "icu_properties_data", 548 | "icu_provider", 549 | "tinystr", 550 | "zerovec", 551 | ] 552 | 553 | [[package]] 554 | name = "icu_properties_data" 555 | version = "1.5.0" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 558 | 559 | [[package]] 560 | name = "icu_provider" 561 | version = "1.5.0" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 564 | dependencies = [ 565 | "displaydoc", 566 | "icu_locid", 567 | "icu_provider_macros", 568 | "stable_deref_trait", 569 | "tinystr", 570 | "writeable", 571 | "yoke", 572 | "zerofrom", 573 | "zerovec", 574 | ] 575 | 576 | [[package]] 577 | name = "icu_provider_macros" 578 | version = "1.5.0" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 581 | dependencies = [ 582 | "proc-macro2", 583 | "quote", 584 | "syn", 585 | ] 586 | 587 | [[package]] 588 | name = "idna" 589 | version = "1.0.0" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" 592 | dependencies = [ 593 | "icu_normalizer", 594 | "icu_properties", 595 | "smallvec", 596 | "utf8_iter", 597 | ] 598 | 599 | [[package]] 600 | name = "indexmap" 601 | version = "2.2.6" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 604 | dependencies = [ 605 | "equivalent", 606 | "hashbrown", 607 | ] 608 | 609 | [[package]] 610 | name = "interpolator" 611 | version = "0.5.0" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" 614 | 615 | [[package]] 616 | name = "inventory" 617 | version = "0.3.15" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" 620 | 621 | [[package]] 622 | name = "itertools" 623 | version = "0.12.1" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 626 | dependencies = [ 627 | "either", 628 | ] 629 | 630 | [[package]] 631 | name = "itoa" 632 | version = "1.0.11" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 635 | 636 | [[package]] 637 | name = "js-sys" 638 | version = "0.3.69" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 641 | dependencies = [ 642 | "wasm-bindgen", 643 | ] 644 | 645 | [[package]] 646 | name = "lazy_static" 647 | version = "1.4.0" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 650 | 651 | [[package]] 652 | name = "leptos" 653 | version = "0.6.13" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "57727cd8f6d1e78aa9721270002037d7f63b5a7a2b60a7830239f6938cbca9b7" 656 | dependencies = [ 657 | "cfg-if", 658 | "leptos_config", 659 | "leptos_dom", 660 | "leptos_macro", 661 | "leptos_reactive", 662 | "leptos_server", 663 | "server_fn", 664 | "tracing", 665 | "typed-builder", 666 | "typed-builder-macro", 667 | "wasm-bindgen", 668 | "web-sys", 669 | ] 670 | 671 | [[package]] 672 | name = "leptos_animated_for" 673 | version = "0.4.7" 674 | dependencies = [ 675 | "futures", 676 | "leptos", 677 | "wasm-bindgen", 678 | "web-sys", 679 | ] 680 | 681 | [[package]] 682 | name = "leptos_config" 683 | version = "0.6.13" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "6e519478cf13b84e0169f14660fda6425a419d181903cf511cec416555c9ff51" 686 | dependencies = [ 687 | "config", 688 | "regex", 689 | "serde", 690 | "thiserror", 691 | "typed-builder", 692 | ] 693 | 694 | [[package]] 695 | name = "leptos_dom" 696 | version = "0.6.13" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "46a32ccb530d95c82b522ff86827a9c14efb3d3a75c508c20605d4603beb1695" 699 | dependencies = [ 700 | "async-recursion", 701 | "cfg-if", 702 | "drain_filter_polyfill", 703 | "futures", 704 | "getrandom", 705 | "html-escape", 706 | "indexmap", 707 | "itertools", 708 | "js-sys", 709 | "leptos_reactive", 710 | "once_cell", 711 | "pad-adapter", 712 | "paste", 713 | "rustc-hash", 714 | "serde", 715 | "serde_json", 716 | "server_fn", 717 | "smallvec", 718 | "tracing", 719 | "wasm-bindgen", 720 | "wasm-bindgen-futures", 721 | "web-sys", 722 | ] 723 | 724 | [[package]] 725 | name = "leptos_hot_reload" 726 | version = "0.6.13" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "71eb2b309ff0e526d147e32afcbbbf39b43c1ed5b7264b7abfb6635c388c0e9e" 729 | dependencies = [ 730 | "anyhow", 731 | "camino", 732 | "indexmap", 733 | "parking_lot", 734 | "proc-macro2", 735 | "quote", 736 | "rstml", 737 | "serde", 738 | "syn", 739 | "walkdir", 740 | ] 741 | 742 | [[package]] 743 | name = "leptos_macro" 744 | version = "0.6.13" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "d38b41f4e38b6f0e26858ae40464e12702096d2219c48afd41b79693fd025a9d" 747 | dependencies = [ 748 | "attribute-derive", 749 | "cfg-if", 750 | "convert_case", 751 | "html-escape", 752 | "itertools", 753 | "leptos_hot_reload", 754 | "prettyplease", 755 | "proc-macro-error", 756 | "proc-macro2", 757 | "quote", 758 | "rstml", 759 | "server_fn_macro", 760 | "syn", 761 | "tracing", 762 | "uuid", 763 | ] 764 | 765 | [[package]] 766 | name = "leptos_reactive" 767 | version = "0.6.13" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "bc38db7b14f2d48cb427dd4c197ee58354f5de9407fb3417f2ee7ff85097ffd3" 770 | dependencies = [ 771 | "base64", 772 | "cfg-if", 773 | "futures", 774 | "indexmap", 775 | "js-sys", 776 | "oco_ref", 777 | "paste", 778 | "pin-project", 779 | "rustc-hash", 780 | "self_cell", 781 | "serde", 782 | "serde-wasm-bindgen", 783 | "serde_json", 784 | "slotmap", 785 | "thiserror", 786 | "tracing", 787 | "wasm-bindgen", 788 | "wasm-bindgen-futures", 789 | "web-sys", 790 | ] 791 | 792 | [[package]] 793 | name = "leptos_server" 794 | version = "0.6.13" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "9c0ea6eed569e70fa4eed722ee3f042ed76c40d2b0a82b7240eb660893d6a5e9" 797 | dependencies = [ 798 | "inventory", 799 | "lazy_static", 800 | "leptos_macro", 801 | "leptos_reactive", 802 | "serde", 803 | "server_fn", 804 | "thiserror", 805 | "tracing", 806 | ] 807 | 808 | [[package]] 809 | name = "libc" 810 | version = "0.2.155" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 813 | 814 | [[package]] 815 | name = "litemap" 816 | version = "0.7.3" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" 819 | 820 | [[package]] 821 | name = "lock_api" 822 | version = "0.4.12" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 825 | dependencies = [ 826 | "autocfg", 827 | "scopeguard", 828 | ] 829 | 830 | [[package]] 831 | name = "log" 832 | version = "0.4.21" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 835 | 836 | [[package]] 837 | name = "manyhow" 838 | version = "0.10.4" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | checksum = "f91ea592d76c0b6471965708ccff7e6a5d277f676b90ab31f4d3f3fc77fade64" 841 | dependencies = [ 842 | "manyhow-macros", 843 | "proc-macro2", 844 | "quote", 845 | "syn", 846 | ] 847 | 848 | [[package]] 849 | name = "manyhow-macros" 850 | version = "0.10.4" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "c64621e2c08f2576e4194ea8be11daf24ac01249a4f53cd8befcbb7077120ead" 853 | dependencies = [ 854 | "proc-macro-utils", 855 | "proc-macro2", 856 | "quote", 857 | ] 858 | 859 | [[package]] 860 | name = "memchr" 861 | version = "2.7.4" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 864 | 865 | [[package]] 866 | name = "minimal-lexical" 867 | version = "0.2.1" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 870 | 871 | [[package]] 872 | name = "nom" 873 | version = "7.1.3" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 876 | dependencies = [ 877 | "memchr", 878 | "minimal-lexical", 879 | ] 880 | 881 | [[package]] 882 | name = "oco_ref" 883 | version = "0.1.1" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "c51ebcefb2f0b9a5e0bea115532c8ae4215d1b01eff176d0f4ba4192895c2708" 886 | dependencies = [ 887 | "serde", 888 | "thiserror", 889 | ] 890 | 891 | [[package]] 892 | name = "once_cell" 893 | version = "1.19.0" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 896 | 897 | [[package]] 898 | name = "pad-adapter" 899 | version = "0.1.1" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "56d80efc4b6721e8be2a10a5df21a30fa0b470f1539e53d8b4e6e75faf938b63" 902 | 903 | [[package]] 904 | name = "parking_lot" 905 | version = "0.12.3" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 908 | dependencies = [ 909 | "lock_api", 910 | "parking_lot_core", 911 | ] 912 | 913 | [[package]] 914 | name = "parking_lot_core" 915 | version = "0.9.10" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 918 | dependencies = [ 919 | "cfg-if", 920 | "libc", 921 | "redox_syscall", 922 | "smallvec", 923 | "windows-targets", 924 | ] 925 | 926 | [[package]] 927 | name = "paste" 928 | version = "1.0.15" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 931 | 932 | [[package]] 933 | name = "pathdiff" 934 | version = "0.2.1" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 937 | 938 | [[package]] 939 | name = "percent-encoding" 940 | version = "2.3.1" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 943 | 944 | [[package]] 945 | name = "pin-project" 946 | version = "1.1.5" 947 | source = "registry+https://github.com/rust-lang/crates.io-index" 948 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 949 | dependencies = [ 950 | "pin-project-internal", 951 | ] 952 | 953 | [[package]] 954 | name = "pin-project-internal" 955 | version = "1.1.5" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 958 | dependencies = [ 959 | "proc-macro2", 960 | "quote", 961 | "syn", 962 | ] 963 | 964 | [[package]] 965 | name = "pin-project-lite" 966 | version = "0.2.14" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 969 | 970 | [[package]] 971 | name = "pin-utils" 972 | version = "0.1.0" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 975 | 976 | [[package]] 977 | name = "ppv-lite86" 978 | version = "0.2.17" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 981 | 982 | [[package]] 983 | name = "prettyplease" 984 | version = "0.2.20" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" 987 | dependencies = [ 988 | "proc-macro2", 989 | "syn", 990 | ] 991 | 992 | [[package]] 993 | name = "proc-macro-error" 994 | version = "1.0.4" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 997 | dependencies = [ 998 | "proc-macro-error-attr", 999 | "proc-macro2", 1000 | "quote", 1001 | "version_check", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "proc-macro-error-attr" 1006 | version = "1.0.4" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1009 | dependencies = [ 1010 | "proc-macro2", 1011 | "quote", 1012 | "version_check", 1013 | ] 1014 | 1015 | [[package]] 1016 | name = "proc-macro-utils" 1017 | version = "0.8.0" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" 1020 | dependencies = [ 1021 | "proc-macro2", 1022 | "quote", 1023 | "smallvec", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "proc-macro2" 1028 | version = "1.0.85" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" 1031 | dependencies = [ 1032 | "unicode-ident", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "proc-macro2-diagnostics" 1037 | version = "0.10.1" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" 1040 | dependencies = [ 1041 | "proc-macro2", 1042 | "quote", 1043 | "syn", 1044 | "version_check", 1045 | "yansi", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "quote" 1050 | version = "1.0.36" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1053 | dependencies = [ 1054 | "proc-macro2", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "quote-use" 1059 | version = "0.8.0" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "b393938dcaab992375d7b3df7887fa98cc91c2f3590598251e7c609e2b788139" 1062 | dependencies = [ 1063 | "quote", 1064 | "quote-use-macros", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "quote-use-macros" 1069 | version = "0.8.0" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "71d8772387900c205780e2c240cfe4dd01355ab4f96a503d99bdf34ad73180ef" 1072 | dependencies = [ 1073 | "derive-where", 1074 | "proc-macro-utils", 1075 | "proc-macro2", 1076 | "quote", 1077 | "syn", 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "rand" 1082 | version = "0.8.5" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1085 | dependencies = [ 1086 | "libc", 1087 | "rand_chacha", 1088 | "rand_core", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "rand_chacha" 1093 | version = "0.3.1" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1096 | dependencies = [ 1097 | "ppv-lite86", 1098 | "rand_core", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "rand_core" 1103 | version = "0.6.4" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1106 | dependencies = [ 1107 | "getrandom", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "redox_syscall" 1112 | version = "0.5.2" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" 1115 | dependencies = [ 1116 | "bitflags", 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "regex" 1121 | version = "1.10.5" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" 1124 | dependencies = [ 1125 | "aho-corasick", 1126 | "memchr", 1127 | "regex-automata", 1128 | "regex-syntax", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "regex-automata" 1133 | version = "0.4.7" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 1136 | dependencies = [ 1137 | "aho-corasick", 1138 | "memchr", 1139 | "regex-syntax", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "regex-syntax" 1144 | version = "0.8.4" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 1147 | 1148 | [[package]] 1149 | name = "rstml" 1150 | version = "0.11.2" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "fe542870b8f59dd45ad11d382e5339c9a1047cde059be136a7016095bbdefa77" 1153 | dependencies = [ 1154 | "proc-macro2", 1155 | "proc-macro2-diagnostics", 1156 | "quote", 1157 | "syn", 1158 | "syn_derive", 1159 | "thiserror", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "rustc-hash" 1164 | version = "1.1.0" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1167 | 1168 | [[package]] 1169 | name = "ryu" 1170 | version = "1.0.18" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1173 | 1174 | [[package]] 1175 | name = "same-file" 1176 | version = "1.0.6" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1179 | dependencies = [ 1180 | "winapi-util", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "scopeguard" 1185 | version = "1.2.0" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1188 | 1189 | [[package]] 1190 | name = "self_cell" 1191 | version = "1.0.4" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" 1194 | 1195 | [[package]] 1196 | name = "send_wrapper" 1197 | version = "0.6.0" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 1200 | dependencies = [ 1201 | "futures-core", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "serde" 1206 | version = "1.0.203" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" 1209 | dependencies = [ 1210 | "serde_derive", 1211 | ] 1212 | 1213 | [[package]] 1214 | name = "serde-wasm-bindgen" 1215 | version = "0.6.5" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" 1218 | dependencies = [ 1219 | "js-sys", 1220 | "serde", 1221 | "wasm-bindgen", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "serde_derive" 1226 | version = "1.0.203" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" 1229 | dependencies = [ 1230 | "proc-macro2", 1231 | "quote", 1232 | "syn", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "serde_json" 1237 | version = "1.0.117" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" 1240 | dependencies = [ 1241 | "itoa", 1242 | "ryu", 1243 | "serde", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "serde_qs" 1248 | version = "0.12.0" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" 1251 | dependencies = [ 1252 | "percent-encoding", 1253 | "serde", 1254 | "thiserror", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "serde_spanned" 1259 | version = "0.6.6" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" 1262 | dependencies = [ 1263 | "serde", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "server_fn" 1268 | version = "0.6.13" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "e9aaae169927ef701a4734d680adcb08f13269c9f0af822bf175d681fe56d65c" 1271 | dependencies = [ 1272 | "bytes", 1273 | "ciborium", 1274 | "const_format", 1275 | "dashmap", 1276 | "futures", 1277 | "gloo-net", 1278 | "http 1.1.0", 1279 | "js-sys", 1280 | "once_cell", 1281 | "send_wrapper", 1282 | "serde", 1283 | "serde_json", 1284 | "serde_qs", 1285 | "server_fn_macro_default", 1286 | "thiserror", 1287 | "url", 1288 | "wasm-bindgen", 1289 | "wasm-bindgen-futures", 1290 | "wasm-streams", 1291 | "web-sys", 1292 | "xxhash-rust", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "server_fn_macro" 1297 | version = "0.6.13" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "583085903fd5d091884eb52d99550e32777015af21f0f5dbec49bedcc320ce82" 1300 | dependencies = [ 1301 | "const_format", 1302 | "convert_case", 1303 | "proc-macro2", 1304 | "quote", 1305 | "syn", 1306 | "xxhash-rust", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "server_fn_macro_default" 1311 | version = "0.6.12" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "00783df297ec85ea605779f2fef9cbec98981dffe2e01e1a9845c102ee1f1ae6" 1314 | dependencies = [ 1315 | "server_fn_macro", 1316 | "syn", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "slab" 1321 | version = "0.4.9" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1324 | dependencies = [ 1325 | "autocfg", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "slotmap" 1330 | version = "1.0.7" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 1333 | dependencies = [ 1334 | "serde", 1335 | "version_check", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "smallvec" 1340 | version = "1.13.2" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1343 | 1344 | [[package]] 1345 | name = "stable_deref_trait" 1346 | version = "1.2.0" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1349 | 1350 | [[package]] 1351 | name = "syn" 1352 | version = "2.0.66" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" 1355 | dependencies = [ 1356 | "proc-macro2", 1357 | "quote", 1358 | "unicode-ident", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "syn_derive" 1363 | version = "0.1.8" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" 1366 | dependencies = [ 1367 | "proc-macro-error", 1368 | "proc-macro2", 1369 | "quote", 1370 | "syn", 1371 | ] 1372 | 1373 | [[package]] 1374 | name = "synstructure" 1375 | version = "0.13.1" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1378 | dependencies = [ 1379 | "proc-macro2", 1380 | "quote", 1381 | "syn", 1382 | ] 1383 | 1384 | [[package]] 1385 | name = "thiserror" 1386 | version = "1.0.61" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" 1389 | dependencies = [ 1390 | "thiserror-impl", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "thiserror-impl" 1395 | version = "1.0.61" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" 1398 | dependencies = [ 1399 | "proc-macro2", 1400 | "quote", 1401 | "syn", 1402 | ] 1403 | 1404 | [[package]] 1405 | name = "tinystr" 1406 | version = "0.7.6" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1409 | dependencies = [ 1410 | "displaydoc", 1411 | "zerovec", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "toml" 1416 | version = "0.8.14" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" 1419 | dependencies = [ 1420 | "serde", 1421 | "serde_spanned", 1422 | "toml_datetime", 1423 | "toml_edit", 1424 | ] 1425 | 1426 | [[package]] 1427 | name = "toml_datetime" 1428 | version = "0.6.6" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" 1431 | dependencies = [ 1432 | "serde", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "toml_edit" 1437 | version = "0.22.14" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" 1440 | dependencies = [ 1441 | "indexmap", 1442 | "serde", 1443 | "serde_spanned", 1444 | "toml_datetime", 1445 | "winnow", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "tracing" 1450 | version = "0.1.40" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1453 | dependencies = [ 1454 | "pin-project-lite", 1455 | "tracing-attributes", 1456 | "tracing-core", 1457 | ] 1458 | 1459 | [[package]] 1460 | name = "tracing-attributes" 1461 | version = "0.1.27" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1464 | dependencies = [ 1465 | "proc-macro2", 1466 | "quote", 1467 | "syn", 1468 | ] 1469 | 1470 | [[package]] 1471 | name = "tracing-core" 1472 | version = "0.1.32" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1475 | dependencies = [ 1476 | "once_cell", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "typed-builder" 1481 | version = "0.18.2" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "77739c880e00693faef3d65ea3aad725f196da38b22fdc7ea6ded6e1ce4d3add" 1484 | dependencies = [ 1485 | "typed-builder-macro", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "typed-builder-macro" 1490 | version = "0.18.2" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63" 1493 | dependencies = [ 1494 | "proc-macro2", 1495 | "quote", 1496 | "syn", 1497 | ] 1498 | 1499 | [[package]] 1500 | name = "unicode-ident" 1501 | version = "1.0.12" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1504 | 1505 | [[package]] 1506 | name = "unicode-segmentation" 1507 | version = "1.11.0" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 1510 | 1511 | [[package]] 1512 | name = "unicode-xid" 1513 | version = "0.2.4" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 1516 | 1517 | [[package]] 1518 | name = "url" 1519 | version = "2.5.1" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56" 1522 | dependencies = [ 1523 | "form_urlencoded", 1524 | "idna", 1525 | "percent-encoding", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "utf16_iter" 1530 | version = "1.0.5" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1533 | 1534 | [[package]] 1535 | name = "utf8-width" 1536 | version = "0.1.7" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" 1539 | 1540 | [[package]] 1541 | name = "utf8_iter" 1542 | version = "1.0.4" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1545 | 1546 | [[package]] 1547 | name = "uuid" 1548 | version = "1.8.0" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 1551 | dependencies = [ 1552 | "getrandom", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "version_check" 1557 | version = "0.9.4" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1560 | 1561 | [[package]] 1562 | name = "walkdir" 1563 | version = "2.5.0" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1566 | dependencies = [ 1567 | "same-file", 1568 | "winapi-util", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "wasi" 1573 | version = "0.11.0+wasi-snapshot-preview1" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1576 | 1577 | [[package]] 1578 | name = "wasm-bindgen" 1579 | version = "0.2.92" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 1582 | dependencies = [ 1583 | "cfg-if", 1584 | "wasm-bindgen-macro", 1585 | ] 1586 | 1587 | [[package]] 1588 | name = "wasm-bindgen-backend" 1589 | version = "0.2.92" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 1592 | dependencies = [ 1593 | "bumpalo", 1594 | "log", 1595 | "once_cell", 1596 | "proc-macro2", 1597 | "quote", 1598 | "syn", 1599 | "wasm-bindgen-shared", 1600 | ] 1601 | 1602 | [[package]] 1603 | name = "wasm-bindgen-futures" 1604 | version = "0.4.42" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 1607 | dependencies = [ 1608 | "cfg-if", 1609 | "js-sys", 1610 | "wasm-bindgen", 1611 | "web-sys", 1612 | ] 1613 | 1614 | [[package]] 1615 | name = "wasm-bindgen-macro" 1616 | version = "0.2.92" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 1619 | dependencies = [ 1620 | "quote", 1621 | "wasm-bindgen-macro-support", 1622 | ] 1623 | 1624 | [[package]] 1625 | name = "wasm-bindgen-macro-support" 1626 | version = "0.2.92" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 1629 | dependencies = [ 1630 | "proc-macro2", 1631 | "quote", 1632 | "syn", 1633 | "wasm-bindgen-backend", 1634 | "wasm-bindgen-shared", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "wasm-bindgen-shared" 1639 | version = "0.2.92" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 1642 | 1643 | [[package]] 1644 | name = "wasm-streams" 1645 | version = "0.4.0" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" 1648 | dependencies = [ 1649 | "futures-util", 1650 | "js-sys", 1651 | "wasm-bindgen", 1652 | "wasm-bindgen-futures", 1653 | "web-sys", 1654 | ] 1655 | 1656 | [[package]] 1657 | name = "web-sys" 1658 | version = "0.3.69" 1659 | source = "registry+https://github.com/rust-lang/crates.io-index" 1660 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 1661 | dependencies = [ 1662 | "js-sys", 1663 | "wasm-bindgen", 1664 | ] 1665 | 1666 | [[package]] 1667 | name = "winapi-util" 1668 | version = "0.1.8" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" 1671 | dependencies = [ 1672 | "windows-sys", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "windows-sys" 1677 | version = "0.52.0" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1680 | dependencies = [ 1681 | "windows-targets", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "windows-targets" 1686 | version = "0.52.5" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 1689 | dependencies = [ 1690 | "windows_aarch64_gnullvm", 1691 | "windows_aarch64_msvc", 1692 | "windows_i686_gnu", 1693 | "windows_i686_gnullvm", 1694 | "windows_i686_msvc", 1695 | "windows_x86_64_gnu", 1696 | "windows_x86_64_gnullvm", 1697 | "windows_x86_64_msvc", 1698 | ] 1699 | 1700 | [[package]] 1701 | name = "windows_aarch64_gnullvm" 1702 | version = "0.52.5" 1703 | source = "registry+https://github.com/rust-lang/crates.io-index" 1704 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 1705 | 1706 | [[package]] 1707 | name = "windows_aarch64_msvc" 1708 | version = "0.52.5" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 1711 | 1712 | [[package]] 1713 | name = "windows_i686_gnu" 1714 | version = "0.52.5" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 1717 | 1718 | [[package]] 1719 | name = "windows_i686_gnullvm" 1720 | version = "0.52.5" 1721 | source = "registry+https://github.com/rust-lang/crates.io-index" 1722 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 1723 | 1724 | [[package]] 1725 | name = "windows_i686_msvc" 1726 | version = "0.52.5" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 1729 | 1730 | [[package]] 1731 | name = "windows_x86_64_gnu" 1732 | version = "0.52.5" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 1735 | 1736 | [[package]] 1737 | name = "windows_x86_64_gnullvm" 1738 | version = "0.52.5" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 1741 | 1742 | [[package]] 1743 | name = "windows_x86_64_msvc" 1744 | version = "0.52.5" 1745 | source = "registry+https://github.com/rust-lang/crates.io-index" 1746 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 1747 | 1748 | [[package]] 1749 | name = "winnow" 1750 | version = "0.6.13" 1751 | source = "registry+https://github.com/rust-lang/crates.io-index" 1752 | checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" 1753 | dependencies = [ 1754 | "memchr", 1755 | ] 1756 | 1757 | [[package]] 1758 | name = "write16" 1759 | version = "1.0.0" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 1762 | 1763 | [[package]] 1764 | name = "writeable" 1765 | version = "0.5.5" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 1768 | 1769 | [[package]] 1770 | name = "xxhash-rust" 1771 | version = "0.8.10" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" 1774 | 1775 | [[package]] 1776 | name = "yansi" 1777 | version = "1.0.1" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 1780 | 1781 | [[package]] 1782 | name = "yoke" 1783 | version = "0.7.4" 1784 | source = "registry+https://github.com/rust-lang/crates.io-index" 1785 | checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" 1786 | dependencies = [ 1787 | "serde", 1788 | "stable_deref_trait", 1789 | "yoke-derive", 1790 | "zerofrom", 1791 | ] 1792 | 1793 | [[package]] 1794 | name = "yoke-derive" 1795 | version = "0.7.4" 1796 | source = "registry+https://github.com/rust-lang/crates.io-index" 1797 | checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" 1798 | dependencies = [ 1799 | "proc-macro2", 1800 | "quote", 1801 | "syn", 1802 | "synstructure", 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "zerofrom" 1807 | version = "0.1.4" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" 1810 | dependencies = [ 1811 | "zerofrom-derive", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "zerofrom-derive" 1816 | version = "0.1.4" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" 1819 | dependencies = [ 1820 | "proc-macro2", 1821 | "quote", 1822 | "syn", 1823 | "synstructure", 1824 | ] 1825 | 1826 | [[package]] 1827 | name = "zerovec" 1828 | version = "0.10.2" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" 1831 | dependencies = [ 1832 | "yoke", 1833 | "zerofrom", 1834 | "zerovec-derive", 1835 | ] 1836 | 1837 | [[package]] 1838 | name = "zerovec-derive" 1839 | version = "0.10.2" 1840 | source = "registry+https://github.com/rust-lang/crates.io-index" 1841 | checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" 1842 | dependencies = [ 1843 | "proc-macro2", 1844 | "quote", 1845 | "syn", 1846 | ] 1847 | -------------------------------------------------------------------------------- /examples/csr/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "csr-example" 3 | version = "0.0.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | console_error_panic_hook = "0.1.7" 8 | console_log = "1" 9 | getrandom = { version = "0.2.15", features = ["js"], optional = true } 10 | leptos = { version = "0.6.13", features = ["csr", "nightly"] } 11 | leptos_animated_for = { path = "../.." } 12 | log = "0.4.21" 13 | rand = "0.8.5" 14 | -------------------------------------------------------------------------------- /examples/csr/README.md: -------------------------------------------------------------------------------- 1 | # TailwindCSS SPA example 2 | 3 | This example presents use of `` in combination with [TailwindCSS](https://tailwindcss.com/). 4 | 5 | ## Running the application using [Trunk](https://trunkrs.dev/) 6 | 7 | ```bash 8 | trunk serve 9 | ``` 10 | -------------------------------------------------------------------------------- /examples/csr/Trunk.toml: -------------------------------------------------------------------------------- 1 | [serve] 2 | address = "127.0.0.1" 3 | port = 8080 4 | open = false 5 | no_autoreload = false 6 | 7 | [watch] 8 | watch = ["index.html", "src"] 9 | ignore = [] 10 | -------------------------------------------------------------------------------- /examples/csr/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | CSR example 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /examples/csr/rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly" 3 | components = ["rustfmt", "clippy"] 4 | targets = ["wasm32-unknown-unknown"] 5 | profile = "minimal" 6 | -------------------------------------------------------------------------------- /examples/csr/src/button.rs: -------------------------------------------------------------------------------- 1 | use leptos::{component, view, Children, IntoView}; 2 | 3 | #[component] 4 | pub fn Button(children: Children) -> impl IntoView { 5 | view! { 6 | 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /examples/csr/src/circle.rs: -------------------------------------------------------------------------------- 1 | use leptos::{component, view, Children, IntoView, MaybeProp}; 2 | 3 | #[component] 4 | pub fn Circle( 5 | children: Children, 6 | #[prop(optional, into)] class: MaybeProp, 7 | ) -> impl IntoView { 8 | let class = move || { 9 | [ 10 | "rounded-full flex items-center justify-center".to_owned(), 11 | class().unwrap_or_default(), 12 | ] 13 | .join(" ") 14 | }; 15 | 16 | view! {
{children()}
} 17 | } 18 | -------------------------------------------------------------------------------- /examples/csr/src/main.rs: -------------------------------------------------------------------------------- 1 | mod button; 2 | mod circle; 3 | 4 | use leptos::{ 5 | component, 6 | mount_to_body, 7 | update, 8 | view, 9 | Callback, 10 | IntoView, 11 | RwSignal, 12 | SignalUpdate, 13 | StoredValue, 14 | View, 15 | }; 16 | use leptos_animated_for::AnimatedFor; 17 | use rand::{seq::SliceRandom, thread_rng, Rng}; 18 | 19 | use crate::{button::Button, circle::Circle}; 20 | 21 | #[derive(Clone)] 22 | struct Item { 23 | id: usize, 24 | view: View, 25 | } 26 | 27 | const INITIAL_ITEM_COUNT: usize = 40; 28 | 29 | #[component] 30 | fn App() -> impl IntoView { 31 | let last_added_item_id = StoredValue::new(0); 32 | 33 | let rng = StoredValue::new(thread_rng()); 34 | 35 | let create_new_item = Callback::new(move |()| { 36 | let id = last_added_item_id(); 37 | last_added_item_id.set_value(id + 1); 38 | 39 | let mut circle = None; 40 | let mut bg_color_class = None; 41 | 42 | rng.update_value(|rng| { 43 | circle = Some(matches!(rng.gen_range(0..=1), 0)); 44 | 45 | bg_color_class = Some(match rng.gen_range(0..=2) { 46 | 0 => "bg-red-500/70", 47 | 1 => "bg-green-500/70", 48 | _ => "bg-blue-500/70", 49 | }); 50 | }); 51 | 52 | let view = if circle.unwrap() { 53 | view! { {id} } 54 | .into_view() 55 | } else { 56 | view! { 57 |
{id}
59 | } 60 | .into_view() 61 | }; 62 | 63 | Item { id, view } 64 | }); 65 | 66 | let items = RwSignal::new( 67 | (0..INITIAL_ITEM_COUNT) 68 | .map(|_| create_new_item(())) 69 | .collect::>(), 70 | ); 71 | 72 | let shuffle = move |_| { 73 | items.update(|items| { 74 | rng.update_value(|rng| { 75 | items.shuffle(rng); 76 | }); 77 | }); 78 | }; 79 | 80 | let add_start = move |_| { 81 | update!(|items| { 82 | items.insert(0, create_new_item(())); 83 | }); 84 | }; 85 | 86 | let add_end = move |_| { 87 | update!(|items| { 88 | items.push(create_new_item(())); 89 | }); 90 | }; 91 | 92 | let add_random = move |_| { 93 | items.update(|items| { 94 | let item = create_new_item(()); 95 | rng.update_value(|rng| { 96 | items.insert(rng.gen_range(0..=items.len()), item); 97 | }); 98 | }); 99 | }; 100 | 101 | let remove_start = move |_| { 102 | update!(|items| { 103 | if items.is_empty() { 104 | return; 105 | } 106 | 107 | items.remove(0); 108 | }); 109 | }; 110 | 111 | let remove_end = move |_| { 112 | update!(|items| { 113 | items.pop(); 114 | }); 115 | }; 116 | 117 | let remove_random = move |_| { 118 | items.update(|items| { 119 | if items.is_empty() { 120 | return; 121 | } 122 | 123 | rng.update_value(|rng| { 124 | items.remove(rng.gen_range(0..items.len())); 125 | }); 126 | }); 127 | }; 128 | 129 | view! { 130 |
131 |
132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 |
140 | 141 |
142 | 152 | 153 |
154 |
155 | } 156 | } 157 | 158 | fn main() { 159 | _ = console_log::init_with_level(log::Level::Debug); 160 | console_error_panic_hook::set_once(); 161 | mount_to_body(App); 162 | } 163 | -------------------------------------------------------------------------------- /examples/csr/src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @keyframes fade-in-bottom-left { 6 | from { 7 | opacity: 0; 8 | transform: translate3d(-150%, 150%, 0); 9 | } 10 | to { 11 | opacity: 1; 12 | transform: translate3d(0, 0, 0); 13 | } 14 | } 15 | 16 | .animate-fade-in-bottom-left { 17 | animation: fade-in-bottom-left 1s ease-out 1; 18 | } 19 | -------------------------------------------------------------------------------- /examples/csr/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type { import('tailwindcss').Config } */ 2 | 3 | module.exports = { 4 | content: { 5 | files: ["src/**/*.rs"], 6 | }, 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | }; 12 | -------------------------------------------------------------------------------- /examples/ssr/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "rust-analyzer.check.command": "clippy", 3 | "rust-analyzer.cargo.features": ["ssr"], 4 | "rust-analyzer.procMacro.ignored": { 5 | "leptos_macro": ["component"] 6 | }, 7 | "rust-analyzer.rustfmt.overrideCommand": ["leptosfmt", "--stdin", "--rustfmt"] 8 | } 9 | -------------------------------------------------------------------------------- /examples/ssr/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "app" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["cdylib", "rlib"] 8 | 9 | [dependencies] 10 | axum = { version = "0.7.5", optional = true } 11 | console_error_panic_hook = "0.1.7" 12 | console_log = "1" 13 | getrandom = { version = "0.2.15", features = ["js"], optional = true } 14 | leptos = { version = "0.6.13", features = ["nightly"] } 15 | leptos_animated_for = { path = "../.." } 16 | leptos_meta = { version = "0.6.13", features = ["nightly"] } 17 | leptos_axum = { version = "0.6.13", optional = true } 18 | leptos_router = { version = "0.6.13", features = ["nightly"] } 19 | log = "0.4.21" 20 | rand = "0.8.5" 21 | simple_logger = "4.3.3" 22 | tokio = { version = "1.37.0", optional = true, features = [ 23 | "rt-multi-thread", 24 | "macros", 25 | ] } 26 | tower = { version = "0.4.13", optional = true } 27 | tower-http = { version = "0.5.2", features = ["fs"], optional = true } 28 | wasm-bindgen = "0.2.92" 29 | thiserror = "1.0.61" 30 | tracing = { version = "0.1.40", optional = true } 31 | http = "1.1.0" 32 | 33 | [features] 34 | hydrate = [ 35 | "dep:getrandom", 36 | "leptos/hydrate", 37 | "leptos_meta/hydrate", 38 | "leptos_router/hydrate", 39 | ] 40 | ssr = [ 41 | "dep:axum", 42 | "dep:tokio", 43 | "dep:tower", 44 | "dep:tower-http", 45 | "dep:leptos_axum", 46 | "leptos/ssr", 47 | "leptos_meta/ssr", 48 | "leptos_router/ssr", 49 | "dep:tracing", 50 | ] 51 | 52 | [package.metadata.cargo-all-features] 53 | denylist = ["axum", "tokio", "tower", "tower-http", "leptos_axum"] 54 | skip_feature_sets = [["ssr", "hydrate"]] 55 | 56 | [package.metadata.leptos] 57 | # The name used by wasm-bindgen/cargo-leptos for the JS/WASM bundle. Defaults to the crate name 58 | output-name = "app" 59 | 60 | # The site root folder is where cargo-leptos generate all output. WARNING: all content of this folder will be erased on a rebuild. Use it in your server setup. 61 | site-root = "target/site" 62 | 63 | # The site-root relative folder where all compiled output (JS, WASM and CSS) is written 64 | # Defaults to pkg 65 | site-pkg-dir = "pkg" 66 | 67 | # The tailwind input file. 68 | # 69 | # Optional, Activates the tailwind build 70 | tailwind-input-file = "style/tailwind.css" 71 | 72 | # [Optional] Files in the asset-dir will be copied to the site-root directory 73 | assets-dir = "public" 74 | 75 | # The IP and port (ex: 127.0.0.1:3000) where the server serves the content. Use it in your server setup. 76 | site-addr = "127.0.0.1:3000" 77 | 78 | # The port to use for automatic reload monitoring 79 | reload-port = 3001 80 | 81 | # The browserlist query used for optimizing the CSS. 82 | browserquery = "defaults" 83 | 84 | # Set by cargo-leptos watch when building with that tool. Controls whether autoreload JS will be included in the head 85 | watch = false 86 | 87 | # The environment Leptos will run in, usually either "DEV" or "PROD" 88 | env = "DEV" 89 | 90 | # The features to use when compiling the bin target 91 | # 92 | # Optional. Can be over-ridden with the command line parameter --bin-features 93 | bin-features = ["ssr"] 94 | 95 | # If the --no-default-features flag should be used when compiling the bin target 96 | # 97 | # Optional. Defaults to false. 98 | bin-default-features = false 99 | 100 | # The features to use when compiling the lib target 101 | # 102 | # Optional. Can be over-ridden with the command line parameter --lib-features 103 | lib-features = ["hydrate"] 104 | 105 | # If the --no-default-features flag should be used when compiling the lib target 106 | # 107 | # Optional. Defaults to false. 108 | lib-default-features = false 109 | -------------------------------------------------------------------------------- /examples/ssr/README.md: -------------------------------------------------------------------------------- 1 | # TailwindCSS SSR example 2 | 3 | This is a copy-paste project from [Leptos with Axum + TailwindCSS Tempate](https://github.com/leptos-rs/leptos/tree/main/examples/tailwind_axum) with added example `` usage. The elements are rendered server-side and can be animated once the WASM bundle is loaded in the browser. 4 | 5 | ## Running the application using [cargo-leptos](https://github.com/leptos-rs/cargo-leptos) 6 | 7 | ```bash 8 | cargo leptos watch 9 | ``` 10 | -------------------------------------------------------------------------------- /examples/ssr/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brofrain/leptos-animated-for/8f67a527e577b9f705dc3bc25acb7939df5bb707/examples/ssr/public/favicon.ico -------------------------------------------------------------------------------- /examples/ssr/rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly" 3 | components = ["rustfmt", "clippy"] 4 | targets = ["wasm32-unknown-unknown"] 5 | profile = "minimal" 6 | -------------------------------------------------------------------------------- /examples/ssr/src/app.rs: -------------------------------------------------------------------------------- 1 | use leptos::{ 2 | component, 3 | update, 4 | view, 5 | Callback, 6 | IntoView, 7 | RwSignal, 8 | SignalUpdate, 9 | StoredValue, 10 | }; 11 | use leptos_animated_for::AnimatedFor; 12 | use leptos_meta::{provide_meta_context, Link, Stylesheet, Title}; 13 | use leptos_router::{Route, Router, Routes}; 14 | use rand::{seq::SliceRandom, thread_rng, Rng}; 15 | 16 | use crate::button::Button; 17 | 18 | const INITIAL_ITEM_COUNT: usize = 40; 19 | 20 | #[component] 21 | fn Home() -> impl IntoView { 22 | let next_item = StoredValue::new(INITIAL_ITEM_COUNT); 23 | 24 | let items = RwSignal::new((0..INITIAL_ITEM_COUNT).collect::>()); 25 | 26 | let create_new_item = Callback::new(move |()| { 27 | let item = next_item(); 28 | next_item.set_value(item + 1); 29 | item 30 | }); 31 | 32 | let rng = StoredValue::new(thread_rng()); 33 | 34 | let shuffle = move |_| { 35 | items.update(|items| { 36 | rng.update_value(|rng| { 37 | items.shuffle(rng); 38 | }); 39 | }); 40 | }; 41 | 42 | let add_start = move |_| { 43 | update!(|items| { 44 | items.insert(0, create_new_item(())); 45 | }); 46 | }; 47 | 48 | let add_end = move |_| { 49 | update!(|items| { 50 | items.push(create_new_item(())); 51 | }); 52 | }; 53 | 54 | let add_random = move |_| { 55 | items.update(|items| { 56 | let item = create_new_item(()); 57 | rng.update_value(|rng| { 58 | items.insert(rng.gen_range(0..items.len()), item); 59 | }); 60 | }); 61 | }; 62 | 63 | let remove_start = move |_| { 64 | update!(|items| { 65 | if items.is_empty() { 66 | return; 67 | } 68 | 69 | items.remove(0); 70 | }); 71 | }; 72 | 73 | let remove_end = move |_| { 74 | update!(|items| { 75 | items.pop(); 76 | }); 77 | }; 78 | 79 | let remove_random = move |_| { 80 | items.update(|items| { 81 | if items.is_empty() { 82 | return; 83 | } 84 | 85 | rng.update_value(|rng| { 86 | items.remove(rng.gen_range(0..items.len())); 87 | }); 88 | }); 89 | }; 90 | 91 | view! { 92 | 93 | <main class="min-h-screen py-8 bg-gray-800 font-bold text-white"> 94 | <div class="flex flex-wrap gap-2 justify-center"> 95 | <Button on:click=add_start>{"Add start"}</Button> 96 | <Button on:click=add_end>{"Add end"}</Button> 97 | <Button on:click=add_random>{"Add random"}</Button> 98 | <Button on:click=remove_start>{"Remove start"}</Button> 99 | <Button on:click=remove_end>{"Remove end"}</Button> 100 | <Button on:click=remove_random>{"Remove random"}</Button> 101 | <Button on:click=shuffle>{"Shuffle"}</Button> 102 | </div> 103 | 104 | <div class="mt-4 grid grid-cols-[repeat(5,auto)] gap-2 justify-center text-xl [&>*]:w-16 [&>*]:h-16"> 105 | <AnimatedFor 106 | each=items 107 | key=|item| *item 108 | children=|item| { 109 | view! { 110 | <div class="rounded flex items-center justify-center bg-blue-500/70"> 111 | {item} 112 | </div> 113 | } 114 | } 115 | 116 | enter_from_class="opacity-0" 117 | enter_class="duration-1000" 118 | move_class="duration-1000" 119 | leave_class="opacity-0 duration-1000" 120 | /> 121 | 122 | </div> 123 | </main> 124 | } 125 | } 126 | 127 | #[component] 128 | pub fn App() -> impl IntoView { 129 | provide_meta_context(); 130 | 131 | view! { 132 | <Stylesheet id="leptos" href="/pkg/app.css"/> 133 | <Link rel="shortcut icon" type_="image/ico" href="/favicon.ico"/> 134 | <Router> 135 | <Routes> 136 | <Route path="" view=move || view! { <Home/> }/> 137 | </Routes> 138 | </Router> 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /examples/ssr/src/button.rs: -------------------------------------------------------------------------------- 1 | use leptos::{component, view, Children, IntoView}; 2 | 3 | #[component] 4 | pub fn Button(children: Children) -> impl IntoView { 5 | view! { 6 | <button class="rounded px-4 py-1 7 | bg-purple-500 hover:bg-purple-600 transition 8 | cursor-pointer select-none">{children()}</button> 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /examples/ssr/src/fallback.rs: -------------------------------------------------------------------------------- 1 | use axum::{ 2 | body::Body, 3 | extract::State, 4 | http::{Request, Response, StatusCode, Uri}, 5 | response::{IntoResponse, Response as AxumResponse}, 6 | }; 7 | use leptos::{view, LeptosOptions}; 8 | use tower::ServiceExt; 9 | use tower_http::services::ServeDir; 10 | 11 | use crate::app::App; 12 | 13 | pub async fn file_and_error_handler( 14 | uri: Uri, 15 | State(options): State<LeptosOptions>, 16 | req: Request<Body>, 17 | ) -> AxumResponse { 18 | let root = options.site_root.clone(); 19 | let res = get_static_file(uri.clone(), &root).await.unwrap(); 20 | 21 | if res.status() == StatusCode::OK { 22 | res.into_response() 23 | } else { 24 | let handler = leptos_axum::render_app_to_stream( 25 | options.to_owned(), 26 | move || view! { <App/> }, 27 | ); 28 | handler(req).await.into_response() 29 | } 30 | } 31 | 32 | async fn get_static_file( 33 | uri: Uri, 34 | root: &str, 35 | ) -> Result<Response<Body>, (StatusCode, String)> { 36 | let req = Request::builder() 37 | .uri(uri.clone()) 38 | .body(Body::empty()) 39 | .unwrap(); 40 | // `ServeDir` implements `tower::Service` so we can call it with 41 | // `tower::ServiceExt::oneshot` This path is relative to the cargo root 42 | match ServeDir::new(root).oneshot(req).await { 43 | Ok(res) => Ok(res.into_response()), 44 | Err(err) => Err(( 45 | StatusCode::INTERNAL_SERVER_ERROR, 46 | format!("Something went wrong: {err}"), 47 | )), 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /examples/ssr/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod app; 2 | mod button; 3 | 4 | #[cfg(feature = "ssr")] 5 | pub mod fallback; 6 | 7 | #[cfg(feature = "hydrate")] 8 | #[wasm_bindgen::prelude::wasm_bindgen] 9 | pub fn hydrate() { 10 | use crate::app::App; 11 | 12 | // initializes logging using the `log` crate 13 | _ = console_log::init_with_level(log::Level::Debug); 14 | console_error_panic_hook::set_once(); 15 | 16 | leptos::mount_to_body(App); 17 | } 18 | -------------------------------------------------------------------------------- /examples/ssr/src/main.rs: -------------------------------------------------------------------------------- 1 | #[cfg(feature = "ssr")] 2 | #[tokio::main] 3 | async fn main() { 4 | use app::{app::*, fallback::file_and_error_handler}; 5 | use axum::Router; 6 | use leptos::*; 7 | use leptos_axum::{generate_route_list, LeptosRoutes}; 8 | use log::info; 9 | 10 | simple_logger::init_with_level(log::Level::Info) 11 | .expect("couldn't initialize logging"); 12 | 13 | // Setting get_configuration(None) means we'll be using cargo-leptos's env 14 | // values For deployment these variables are: 15 | // <https://github.com/leptos-rs/start-axum#executing-a-server-on-a-remote-machine-without-the-toolchain> 16 | // Alternately a file can be specified such as Some("Cargo.toml") 17 | // The file would need to be included with the executable when moved to 18 | // deployment 19 | let conf = get_configuration(None).await.unwrap(); 20 | let addr = conf.leptos_options.site_addr; 21 | let leptos_options = conf.leptos_options; 22 | // Generate the list of routes in your Leptos App 23 | let routes = generate_route_list(App); 24 | 25 | // build our application with a route 26 | let app = Router::new() 27 | .leptos_routes(&leptos_options, routes, App) 28 | .fallback(file_and_error_handler) 29 | .with_state(leptos_options); 30 | 31 | // run our app with hyper 32 | // `axum::Server` is a re-export of `hyper::Server` 33 | info!("listening on http://{}", &addr); 34 | let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); 35 | axum::serve(listener, app.into_make_service()) 36 | .await 37 | .unwrap(); 38 | } 39 | 40 | #[cfg(not(feature = "ssr"))] 41 | pub fn main() { 42 | // no client-side main function 43 | // unless we want this to work with e.g., Trunk for a purely client-side app 44 | // see lib.rs for hydration function instead 45 | } 46 | -------------------------------------------------------------------------------- /examples/ssr/style/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /examples/ssr/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type { import('tailwindcss').Config } */ 2 | module.exports = { 3 | content: ["src/**/*.rs"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | }; 9 | -------------------------------------------------------------------------------- /justfile: -------------------------------------------------------------------------------- 1 | # Formats Rust files using rustfmt 2 | _fmt-rustfmt *args: 3 | #!/usr/bin/env sh 4 | ( 5 | for f in `find src -name '*.rs'`; do 6 | rustfmt $f {{ args }} & 7 | done 8 | wait 9 | ) 10 | 11 | # Formats Leptos components using leptosfmt 12 | _fmt-leptosfmt *args: 13 | leptosfmt src/**/*.rs {{ args }} 14 | 15 | # Formats justfile 16 | _fmt-justfile: 17 | just --unstable --fmt 18 | 19 | # Formats Rust files including Leptos component syntax 20 | fmt: 21 | just _fmt-rustfmt 22 | just _fmt-leptosfmt 23 | just _fmt-justfile 24 | 25 | _fmt-check-rustfmt: 26 | just _fmt-rustfmt --check 27 | 28 | _fmt-check-leptosfmt: 29 | just _fmt-leptosfmt --check 30 | 31 | _fmt-check-justfile: 32 | just --unstable --fmt --check 33 | 34 | # Checks formatting 35 | fmt-check: 36 | just _fmt-check-rustfmt 37 | just _fmt-check-leptosfmt 38 | just _fmt-check-justfile 39 | 40 | # Checks examples formatting 41 | fmt-check-examples: 42 | #!/usr/bin/env sh 43 | (cd examples/csr && just _fmt-check-rustfmt) 44 | (cd examples/csr && just _fmt-check-leptosfmt) 45 | (cd examples/ssr && just _fmt-check-rustfmt) 46 | (cd examples/ssr && just _fmt-check-leptosfmt) 47 | 48 | # Lints source with Clippy 49 | lint: 50 | cargo clippy --lib -- -D warnings 51 | cargo clippy --lib --target wasm32-unknown-unknown -- -D warnings 52 | 53 | # Lints examples with Clippy 54 | lint-examples: 55 | #!/usr/bin/env sh 56 | (cd examples/csr && cargo clippy) 57 | (cd examples/ssr && cargo clippy --features ssr) 58 | (cd examples/ssr && cargo clippy --lib --features hydrate) 59 | 60 | ci: 61 | just fmt-check 62 | just lint 63 | just fmt-check-examples 64 | just lint-examples 65 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly-2024-07-29" 3 | components = ["rustfmt", "clippy"] 4 | targets = ["wasm32-unknown-unknown", "x86_64-unknown-linux-gnu"] 5 | profile = "minimal" 6 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | edition = "2021" 2 | condense_wildcard_suffixes = true 3 | error_on_line_overflow = false 4 | error_on_unformatted = true 5 | format_code_in_doc_comments = true 6 | format_macro_bodies = true 7 | format_macro_matchers = true 8 | format_strings = true 9 | group_imports = "StdExternalCrate" 10 | hex_literal_case = "Lower" 11 | imports_granularity = "Crate" 12 | imports_layout = "HorizontalVertical" 13 | max_width = 80 14 | newline_style = "Unix" 15 | normalize_comments = true 16 | normalize_doc_attributes = true 17 | reorder_impl_items = true 18 | unstable_features = true 19 | use_field_init_shorthand = true 20 | use_try_shorthand = true 21 | version = "Two" 22 | wrap_comments = true 23 | -------------------------------------------------------------------------------- /src/animated_el.rs: -------------------------------------------------------------------------------- 1 | use web_sys::HtmlElement; 2 | 3 | type Classes = Vec<String>; 4 | 5 | pub trait AnimatedEl { 6 | fn add_classes(&self, classes: &Classes); 7 | 8 | /// Returns the classes that were not previously present, and were added by 9 | /// the method. 10 | fn add_unique_classes(&self, classes: &Classes) -> Classes; 11 | fn remove_classes(&self, classes: &Classes); 12 | fn set_important_style_property(&self, property: &str, value: &str); 13 | fn enable_instant_transition(&self); 14 | fn disable_instant_transition(&self); 15 | fn clear_transform(&self); 16 | } 17 | 18 | impl AnimatedEl for HtmlElement { 19 | fn add_classes(&self, classes: &Classes) { 20 | for class in classes { 21 | self.class_list().add_1(class).unwrap(); 22 | } 23 | } 24 | 25 | fn add_unique_classes(&self, classes: &Classes) -> Classes { 26 | let mut added_classes = Vec::new(); 27 | 28 | for class in classes { 29 | let class_list = self.class_list(); 30 | 31 | if class_list.contains(class) { 32 | continue; 33 | } 34 | 35 | class_list.add_1(class).unwrap(); 36 | added_classes.push(class.clone()); 37 | } 38 | 39 | added_classes 40 | } 41 | 42 | fn remove_classes(&self, classes: &Classes) { 43 | for class in classes { 44 | self.class_list().remove_1(class).unwrap(); 45 | } 46 | } 47 | 48 | fn set_important_style_property(&self, property: &str, value: &str) { 49 | self.style() 50 | .set_property_with_priority(property, value, "important") 51 | .unwrap(); 52 | } 53 | 54 | fn enable_instant_transition(&self) { 55 | self.set_important_style_property("transition-duration", "0s"); 56 | } 57 | 58 | fn disable_instant_transition(&self) { 59 | self.style() 60 | .set_property("transition-duration", "") 61 | .unwrap(); 62 | } 63 | 64 | fn clear_transform(&self) { 65 | self.style().set_property("transform", "").unwrap(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/animator.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::HashMap, hash::Hash, rc::Rc}; 2 | 3 | use leptos::{MaybeProp, StoredValue}; 4 | use wasm_bindgen::{prelude::Closure, JsCast}; 5 | 6 | use super::untracked_classes::UntrackedClasses; 7 | use crate::animated_el::AnimatedEl; 8 | 9 | fn set_cb_on_transition_end( 10 | el: &web_sys::HtmlElement, 11 | cb: &Rc<impl Fn() + 'static>, 12 | ) { 13 | let closure = 14 | Closure::<dyn FnMut(&web_sys::TransitionEvent)>::wrap(Box::new({ 15 | let cb = Rc::clone(cb); 16 | move |_| cb() 17 | })); 18 | 19 | el.set_ontransitionend(Some(closure.as_ref().unchecked_ref())); 20 | el.set_onanimationend(Some(closure.as_ref().unchecked_ref())); 21 | closure.forget(); 22 | } 23 | 24 | #[derive(Clone)] 25 | pub struct Animator<Key> 26 | where 27 | Key: 'static, 28 | { 29 | classes: UntrackedClasses, 30 | transition_end_cbs: StoredValue<Vec<Rc<dyn Fn()>>>, 31 | enter_from_class_per_key: StoredValue<HashMap<Key, Vec<String>>>, 32 | } 33 | 34 | impl<Key> Copy for Animator<Key> where Key: Clone {} 35 | 36 | impl<Key> Animator<Key> 37 | where 38 | Key: Clone + Hash + Eq + PartialEq, 39 | { 40 | pub fn new( 41 | raw_enter_from: MaybeProp<String>, 42 | raw_enter: MaybeProp<String>, 43 | raw_move: MaybeProp<String>, 44 | raw_leave: MaybeProp<String>, 45 | ) -> Self { 46 | Self { 47 | classes: UntrackedClasses::new( 48 | raw_enter_from, 49 | raw_enter, 50 | raw_move, 51 | raw_leave, 52 | ), 53 | transition_end_cbs: StoredValue::new(Vec::new()), 54 | enter_from_class_per_key: StoredValue::new(HashMap::new()), 55 | } 56 | } 57 | 58 | pub fn prepare_enter(&self, key: &Key, el: &web_sys::HtmlElement) { 59 | el.enable_instant_transition(); 60 | let added_classes = self.classes.add_enter_from(el); 61 | self.enter_from_class_per_key.update_value(|v| { 62 | v.insert(key.clone(), added_classes); 63 | }); 64 | } 65 | 66 | fn push_class_cleanup_on_transition_end( 67 | &self, 68 | el: &web_sys::HtmlElement, 69 | classes_to_remove: Vec<String>, 70 | ) { 71 | let clear_classes = Rc::new({ 72 | let el = el.clone(); 73 | move || { 74 | el.remove_classes(&classes_to_remove); 75 | el.set_ontransitionend(None); 76 | el.set_onanimationend(None); 77 | } 78 | }); 79 | 80 | set_cb_on_transition_end(el, &clear_classes); 81 | 82 | self.transition_end_cbs.update_value(|v| { 83 | v.push(clear_classes); 84 | }); 85 | } 86 | 87 | pub fn start_enter(&self, key: &Key, el: &web_sys::HtmlElement) { 88 | self.enter_from_class_per_key.update_value(|v| { 89 | let classes_to_remove = v.remove(key); 90 | 91 | if let Some(classes_to_remove) = classes_to_remove { 92 | el.remove_classes(&classes_to_remove); 93 | } 94 | }); 95 | 96 | el.disable_instant_transition(); 97 | 98 | let added_classes = self.classes.add_enter(el); 99 | self.push_class_cleanup_on_transition_end(el, added_classes); 100 | } 101 | 102 | pub fn start_move(&self, el: &web_sys::HtmlElement) { 103 | el.disable_instant_transition(); 104 | el.clear_transform(); 105 | 106 | let added_classes = self.classes.add_move(el); 107 | self.push_class_cleanup_on_transition_end(el, added_classes); 108 | } 109 | 110 | pub fn start_leave(&self, el: &web_sys::HtmlElement) { 111 | self.classes.add_leave(el); 112 | el.disable_instant_transition(); 113 | 114 | let remove_el = Rc::new({ 115 | let el = el.clone(); 116 | move || el.remove() 117 | }); 118 | 119 | set_cb_on_transition_end(el, &remove_el); 120 | } 121 | 122 | pub fn clear_transitions(&self) { 123 | self.transition_end_cbs.update_value(|v| { 124 | for cb in v.drain(..) { 125 | cb(); 126 | } 127 | }); 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod animated_el; 2 | mod animator; 3 | mod untracked_classes; 4 | 5 | #[cfg(target_arch = "wasm32")] 6 | mod utils; 7 | 8 | #[cfg(target_arch = "wasm32")] 9 | mod prelude { 10 | 11 | pub use std::{ 12 | collections::{HashMap, HashSet}, 13 | hash::Hash, 14 | }; 15 | 16 | pub use leptos::{ 17 | component, 18 | leptos_dom::Each, 19 | spawn_local, 20 | update, 21 | with, 22 | IntoView, 23 | MaybeProp, 24 | StoredValue, 25 | View, 26 | }; 27 | pub use web_sys::DomRect; 28 | 29 | pub use crate::{ 30 | animator::Animator, 31 | utils::{ 32 | check_if_moved_and_lock_previous_position, 33 | extract_el_from_view, 34 | force_reflow, 35 | next_tick, 36 | prepare_leave, 37 | }, 38 | }; 39 | } 40 | 41 | #[cfg(not(target_arch = "wasm32"))] 42 | mod prelude { 43 | pub use std::hash::Hash; 44 | 45 | pub use leptos::{component, leptos_dom::Each, IntoView, MaybeProp}; 46 | } 47 | 48 | use prelude::*; 49 | 50 | #[cfg(target_arch = "wasm32")] 51 | fn use_entering_children<Item, ChildFn, Child, KeyFn, Key>( 52 | key_fn: StoredValue<KeyFn>, 53 | children_fn: ChildFn, 54 | appear: Option<bool>, 55 | move_class: MaybeProp<String>, 56 | enter_class: MaybeProp<String>, 57 | enter_from_class: MaybeProp<String>, 58 | leave_class: MaybeProp<String>, 59 | ) -> ( 60 | StoredValue<HashMap<Key, web_sys::HtmlElement>>, 61 | Animator<Key>, 62 | impl Fn(Item) -> View + 'static, 63 | ) 64 | where 65 | ChildFn: Fn(Item) -> Child + 'static, 66 | Child: IntoView + 'static, 67 | KeyFn: Fn(&Item) -> Key + 'static, 68 | Key: Eq + Hash + Clone + 'static, 69 | Item: 'static, 70 | { 71 | let appear = appear.unwrap_or_default(); 72 | 73 | let el_per_key = StoredValue::new(HashMap::new()); 74 | 75 | let animator = 76 | Animator::new(enter_from_class, enter_class, move_class, leave_class); 77 | 78 | let initial_children_mounted = StoredValue::new(false); 79 | spawn_local(async move { 80 | // using `try_set_value` over `set_value` to avoid panic if the 81 | // component is disposed before mounting 82 | initial_children_mounted.try_set_value(true); 83 | }); 84 | 85 | (el_per_key, animator, move |item| { 86 | let key = with!(|key_fn| key_fn(&item)); 87 | let child = children_fn(item); 88 | 89 | let view = child.into_view(); 90 | 91 | let el = extract_el_from_view(&view); 92 | 93 | if let Some(el) = el { 94 | update!(|el_per_key| { 95 | el_per_key.insert(key.clone(), el.clone()); 96 | }); 97 | 98 | if initial_children_mounted.get_value() || appear { 99 | animator.prepare_enter(&key, &el); 100 | 101 | spawn_local(async move { 102 | next_tick().await; 103 | 104 | // check if the component has been disposed 105 | if initial_children_mounted.try_with_value(|_| ()).is_none() 106 | { 107 | return; 108 | } 109 | 110 | animator.start_enter(&key, &el); 111 | }); 112 | } 113 | } 114 | 115 | view 116 | }) 117 | } 118 | 119 | /// List-rendering component utilizing FLIP position transitions. 120 | /// Read the full guide [here](https://github.com/brofrain/leptos-animated-for). 121 | #[allow(unused_variables)] 122 | #[allow(clippy::needless_pass_by_value)] 123 | #[component] 124 | pub fn AnimatedFor<Items, ItemIter, Item, Child, ChildFn, Key, KeyFn>( 125 | each: Items, 126 | key: KeyFn, 127 | children: ChildFn, 128 | #[prop(optional, into)] enter_from_class: MaybeProp<String>, 129 | #[prop(optional, into)] enter_class: MaybeProp<String>, 130 | #[prop(optional, into)] move_class: MaybeProp<String>, 131 | #[prop(optional, into)] leave_class: MaybeProp<String>, 132 | #[prop(optional, into)] appear: Option<bool>, 133 | ) -> impl IntoView 134 | where 135 | Items: Fn() -> ItemIter + 'static, 136 | ItemIter: IntoIterator<Item = Item> + 'static, 137 | Child: IntoView + 'static, 138 | ChildFn: Fn(Item) -> Child + 'static, 139 | Key: Eq + Hash + Clone + 'static, 140 | KeyFn: Fn(&Item) -> Key + 'static, 141 | Item: 'static, 142 | { 143 | #[cfg(target_arch = "wasm32")] 144 | { 145 | let key_fn = StoredValue::new(key); 146 | 147 | let (el_per_key, animator, children_fn) = use_entering_children( 148 | key_fn, 149 | children, 150 | appear, 151 | move_class, 152 | enter_class, 153 | enter_from_class, 154 | leave_class, 155 | ); 156 | 157 | let items_fn = move || { 158 | let items = Vec::from_iter(each()); 159 | 160 | let keys = with!(|key_fn| items 161 | .iter() 162 | .map(key_fn) 163 | .collect::<HashSet<_>>()); 164 | 165 | let mut leaving_els_parent = None; 166 | let mut leaving_els_with_rects = Vec::new(); 167 | 168 | let mut before_render_el_rect_per_key = 169 | HashMap::<Key, DomRect>::new(); 170 | 171 | update!(|el_per_key| { 172 | let mut keys_to_remove = Vec::new(); 173 | 174 | for (key, el) in el_per_key.iter() { 175 | if keys.contains(key) { 176 | let rect = el.get_bounding_client_rect(); 177 | before_render_el_rect_per_key.insert(key.clone(), rect); 178 | } else { 179 | keys_to_remove.push(key.clone()); 180 | } 181 | } 182 | 183 | for key in keys_to_remove { 184 | let el = el_per_key.remove(&key).unwrap(); 185 | 186 | if leaving_els_parent.is_none() { 187 | leaving_els_parent = Some( 188 | el.parent_element() 189 | .expect("children to have parent element"), 190 | ); 191 | } 192 | 193 | let rect = el.get_bounding_client_rect(); 194 | leaving_els_with_rects.push((el, rect)); 195 | } 196 | }); 197 | 198 | spawn_local(async move { 199 | // check if the component has been disposed in the meantime 200 | if el_per_key.try_with_value(|_| ()).is_none() { 201 | return; 202 | } 203 | 204 | animator.clear_transitions(); 205 | 206 | if let Some(parent) = leaving_els_parent { 207 | prepare_leave(&parent, &leaving_els_with_rects); 208 | } 209 | 210 | let mut moved_el_keys = Vec::new(); 211 | 212 | with!(|el_per_key| { 213 | for (key, old_pos) in &before_render_el_rect_per_key { 214 | let el = el_per_key.get(key).unwrap(); 215 | 216 | if check_if_moved_and_lock_previous_position( 217 | el, old_pos, 218 | ) { 219 | moved_el_keys.push(key.clone()); 220 | } 221 | } 222 | }); 223 | 224 | force_reflow(); 225 | 226 | if !leaving_els_with_rects.is_empty() { 227 | for (el, ..) in leaving_els_with_rects { 228 | animator.start_leave(&el); 229 | } 230 | } 231 | 232 | if moved_el_keys.is_empty() { 233 | return; 234 | } 235 | 236 | with!(|el_per_key| { 237 | for key in moved_el_keys { 238 | let el = el_per_key.get(&key).unwrap(); 239 | animator.start_move(el); 240 | } 241 | }); 242 | }); 243 | 244 | items 245 | }; 246 | 247 | Each::new( 248 | items_fn, 249 | move |item| with!(|key_fn| key_fn(item)), 250 | children_fn, 251 | ) 252 | } 253 | 254 | #[cfg(not(target_arch = "wasm32"))] 255 | { 256 | Each::new(each, key, children) 257 | } 258 | } 259 | -------------------------------------------------------------------------------- /src/untracked_classes.rs: -------------------------------------------------------------------------------- 1 | use leptos::{MaybeProp, Memo, SignalGet, SignalWithUntracked}; 2 | 3 | use crate::animated_el::AnimatedEl; 4 | 5 | type Classes = Vec<String>; 6 | 7 | #[derive(Clone, Copy)] 8 | pub struct UntrackedClasses { 9 | enter_from: Memo<Classes>, 10 | enter: Memo<Classes>, 11 | r#move: Memo<Classes>, 12 | leave: Memo<Classes>, 13 | } 14 | 15 | fn use_class_memo(class: MaybeProp<String>) -> Memo<Classes> { 16 | Memo::new(move |_| { 17 | class 18 | .get() 19 | .map(|class| { 20 | class.split_whitespace().map(ToOwned::to_owned).collect() 21 | }) 22 | .unwrap_or_default() 23 | }) 24 | } 25 | 26 | impl UntrackedClasses { 27 | pub fn new( 28 | raw_enter_from: MaybeProp<String>, 29 | raw_enter: MaybeProp<String>, 30 | raw_move: MaybeProp<String>, 31 | raw_leave: MaybeProp<String>, 32 | ) -> Self { 33 | let enter_from = use_class_memo(raw_enter_from); 34 | Self { 35 | enter_from, 36 | enter: use_class_memo(raw_enter), 37 | r#move: use_class_memo(raw_move), 38 | leave: use_class_memo(raw_leave), 39 | } 40 | } 41 | 42 | pub fn add_enter_from(&self, el: &web_sys::HtmlElement) -> Classes { 43 | self.enter_from 44 | .with_untracked(|classes| el.add_unique_classes(classes)) 45 | } 46 | 47 | pub fn add_enter(&self, el: &web_sys::HtmlElement) -> Classes { 48 | self.enter 49 | .with_untracked(|classes| el.add_unique_classes(classes)) 50 | } 51 | 52 | pub fn add_move(&self, el: &web_sys::HtmlElement) -> Classes { 53 | self.r#move 54 | .with_untracked(|classes| el.add_unique_classes(classes)) 55 | } 56 | 57 | pub fn add_leave(&self, el: &web_sys::HtmlElement) { 58 | self.leave.with_untracked(|classes| el.add_classes(classes)); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use futures::channel; 2 | use leptos::{document, request_animation_frame, window, View}; 3 | use wasm_bindgen::JsCast; 4 | use web_sys::DomRect; 5 | 6 | use crate::animated_el::AnimatedEl; 7 | 8 | pub fn force_reflow() { 9 | _ = window().document().unwrap().body().unwrap().offset_height(); 10 | } 11 | 12 | pub async fn next_tick() { 13 | let (tx, rx) = channel::oneshot::channel(); 14 | 15 | request_animation_frame(move || { 16 | tx.send(()).unwrap(); 17 | }); 18 | 19 | rx.await.unwrap(); 20 | } 21 | 22 | pub fn extract_el_from_view(view: &View) -> Option<web_sys::HtmlElement> { 23 | match view { 24 | View::Component(component) => { 25 | let node_view = component.children.first()?.clone(); 26 | 27 | let el = node_view 28 | .into_html_element() 29 | .ok()? 30 | .dyn_ref::<web_sys::HtmlElement>()? 31 | .clone(); 32 | 33 | Some(el) 34 | } 35 | view => { 36 | let el = view 37 | .clone() 38 | .into_html_element() 39 | .ok()? 40 | .dyn_ref::<web_sys::HtmlElement>()? 41 | .clone(); 42 | 43 | Some(el) 44 | } 45 | } 46 | } 47 | 48 | fn lock_fixed_position( 49 | el: &web_sys::HtmlElement, 50 | el_pos: &DomRect, 51 | document_pos: &DomRect, 52 | ) { 53 | let top = el_pos.top() - document_pos.top(); 54 | let left = el_pos.left() - document_pos.left(); 55 | let width = el_pos.width(); 56 | let height = el_pos.height(); 57 | 58 | el.set_important_style_property("position", "fixed"); 59 | el.set_important_style_property("margin", "0px"); 60 | el.set_important_style_property("top", &format!("{top}px")); 61 | el.set_important_style_property("left", &format!("{left}px")); 62 | el.set_important_style_property("width", &format!("{width}px")); 63 | el.set_important_style_property("height", &format!("{height}px")); 64 | 65 | el.enable_instant_transition(); 66 | } 67 | 68 | pub fn prepare_leave( 69 | leaving_els_parent: &web_sys::Element, 70 | leaving_els_with_rects: &Vec<(web_sys::HtmlElement, DomRect)>, 71 | ) { 72 | let document_pos = document() 73 | .document_element() 74 | .expect("document to be Element") 75 | .get_bounding_client_rect(); 76 | 77 | for (el, rect) in leaving_els_with_rects { 78 | lock_fixed_position(el, rect, &document_pos); 79 | leaving_els_parent.append_child(el).unwrap(); 80 | } 81 | } 82 | 83 | pub fn check_if_moved_and_lock_previous_position( 84 | el: &web_sys::HtmlElement, 85 | old_pos: &DomRect, 86 | ) -> bool { 87 | let new_pos = el.get_bounding_client_rect(); 88 | 89 | let dx = old_pos.left() - new_pos.left(); 90 | let dy = old_pos.top() - new_pos.top(); 91 | 92 | if dx != 0.0 || dy != 0.0 { 93 | el.set_important_style_property( 94 | "transform", 95 | &format!("translate({dx}px,{dy}px)"), 96 | ); 97 | el.enable_instant_transition(); 98 | 99 | return true; 100 | } 101 | 102 | false 103 | } 104 | --------------------------------------------------------------------------------